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