^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/usr/bin/awk -f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) # Copyright 2010 Ben Dooks <ben-linux@fluff.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) # Released under GPLv2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) # example usage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) # ./clksrc-change-registers.awk arch/arm/plat-s5pc1xx/include/plat/regs-clock.h < src > dst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) function extract_value(s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) eqat = index(s, "=")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) comat = index(s, ",")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) return substr(s, eqat+2, (comat-eqat)-2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) function remove_brackets(b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) return substr(b, 2, length(b)-2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) function splitdefine(l, p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) r = split(l, tp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) p[0] = tp[2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) p[1] = remove_brackets(tp[3])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) function find_length(f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) if (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) printf "find_length " f "\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) if (f ~ /0x1/)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) else if (f ~ /0x3/)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) return 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) else if (f ~ /0x7/)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) return 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) else if (f ~ /0xf/)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) printf "unknown length " f "\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) function find_shift(s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) id = index(s, "<")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if (id <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) printf "cannot find shift " s "\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) return substr(s, id+2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) BEGIN {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if (ARGC < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) print "too few arguments" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) # read the header file and find the mask values that we will need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) # to replace and create an associative array of values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) while (getline line < ARGV[1] > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if (line ~ /\#define.*_MASK/ &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) !(line ~ /USB_SIG_MASK/)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) splitdefine(line, fields)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) name = fields[0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) printf "MASK " line "\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) dmask[name,0] = find_length(fields[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) dmask[name,1] = find_shift(fields[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) printf "=> '" name "' LENGTH=" dmask[name,0] " SHIFT=" dmask[name,1] "\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) delete ARGV[1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /clksrc_clk.*=.*{/ {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) shift=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) mask=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) divshift=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) reg_div=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) reg_src=""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) indent=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) print $0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) for(; indent >= 1;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if ((getline line) <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) printf "unexpected end of file" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) exit 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) if (line ~ /\.shift/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) shift = extract_value(line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) } else if (line ~ /\.mask/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) mask = extract_value(line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) } else if (line ~ /\.reg_divider/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) reg_div = extract_value(line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) } else if (line ~ /\.reg_source/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) reg_src = extract_value(line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) } else if (line ~ /\.divider_shift/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) divshift = extract_value(line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) } else if (line ~ /{/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) indent++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) print line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) } else if (line ~ /}/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) indent--
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) if (indent == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) if (0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) printf "shift '" shift "' ='" dmask[shift,0] "'\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) printf "mask '" mask "'\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) printf "dshft '" divshift "'\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) printf "rdiv '" reg_div "'\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) printf "rsrc '" reg_src "'\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) generated = mask
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) sub(reg_src, reg_div, generated)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) if (0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) printf "/* rsrc " reg_src " */\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) printf "/* rdiv " reg_div " */\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) printf "/* shift " shift " */\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) printf "/* mask " mask " */\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) printf "/* generated " generated " */\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if (reg_div != "") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) printf "\t.reg_div = { "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) printf ".reg = " reg_div ", "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) printf ".shift = " dmask[generated,1] ", "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) printf ".size = " dmask[generated,0] ", "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) printf "},\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) printf "\t.reg_src = { "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) printf ".reg = " reg_src ", "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) printf ".shift = " dmask[mask,1] ", "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) printf ".size = " dmask[mask,0] ", "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) printf "},\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) print line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) print line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) if (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) printf indent ":" line "\n" > "/dev/stderr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) // && ! /clksrc_clk.*=.*{/ { print $0 }