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