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