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