Back to home page

OSCL-LXR

 
 

    


0001 #!/usr/bin/awk -f
0002 #
0003 # Copyright 2010 Ben Dooks <ben-linux@fluff.org>
0004 #
0005 # Released under GPLv2
0006 
0007 # example usage
0008 # ./clksrc-change-registers.awk arch/arm/plat-s5pc1xx/include/plat/regs-clock.h < src > dst
0009 
0010 function extract_value(s)
0011 {
0012     eqat = index(s, "=")
0013     comat = index(s, ",")
0014     return substr(s, eqat+2, (comat-eqat)-2)
0015 }
0016 
0017 function remove_brackets(b)
0018 {
0019     return substr(b, 2, length(b)-2)
0020 }
0021 
0022 function splitdefine(l, p)
0023 {
0024     r = split(l, tp)
0025 
0026     p[0] = tp[2]
0027     p[1] = remove_brackets(tp[3])
0028 }
0029 
0030 function find_length(f)
0031 {
0032     if (0)
0033   printf "find_length " f "\n" > "/dev/stderr"
0034 
0035     if (f ~ /0x1/)
0036   return 1
0037     else if (f ~ /0x3/)
0038   return 2
0039     else if (f ~ /0x7/)
0040   return 3
0041     else if (f ~ /0xf/)
0042   return 4
0043 
0044     printf "unknown length " f "\n" > "/dev/stderr"
0045     exit
0046 }
0047 
0048 function find_shift(s)
0049 {
0050     id = index(s, "<")
0051     if (id <= 0) {
0052   printf "cannot find shift " s "\n" > "/dev/stderr"
0053   exit
0054     }
0055 
0056     return substr(s, id+2)
0057 }
0058 
0059 
0060 BEGIN {
0061     if (ARGC < 2) {
0062   print "too few arguments" > "/dev/stderr"
0063   exit
0064     }
0065 
0066 # read the header file and find the mask values that we will need
0067 # to replace and create an associative array of values
0068 
0069     while (getline line < ARGV[1] > 0) {
0070   if (line ~ /\#define.*_MASK/ &&
0071       !(line ~ /USB_SIG_MASK/)) {
0072       splitdefine(line, fields)
0073       name = fields[0]
0074       if (0)
0075     printf "MASK " line "\n" > "/dev/stderr"
0076       dmask[name,0] = find_length(fields[1])
0077       dmask[name,1] = find_shift(fields[1])
0078       if (0)
0079     printf "=> '" name "' LENGTH=" dmask[name,0] " SHIFT=" dmask[name,1] "\n" > "/dev/stderr"
0080   } else {
0081   }
0082     }
0083 
0084     delete ARGV[1]
0085 }
0086 
0087 /clksrc_clk.*=.*{/ {
0088     shift=""
0089     mask=""
0090     divshift=""
0091     reg_div=""
0092     reg_src=""
0093     indent=1
0094 
0095     print $0
0096 
0097     for(; indent >= 1;) {
0098   if ((getline line) <= 0) {
0099       printf "unexpected end of file" > "/dev/stderr"
0100       exit 1;
0101   }
0102 
0103   if (line ~ /\.shift/) {
0104       shift = extract_value(line)
0105   } else if (line ~ /\.mask/) {
0106       mask = extract_value(line)
0107   } else if (line ~ /\.reg_divider/) {
0108       reg_div = extract_value(line)
0109   } else if (line ~ /\.reg_source/) {
0110       reg_src = extract_value(line)
0111   } else if (line ~ /\.divider_shift/) {
0112       divshift = extract_value(line)
0113   } else if (line ~ /{/) {
0114     indent++
0115     print line
0116       } else if (line ~ /}/) {
0117       indent--
0118 
0119       if (indent == 0) {
0120     if (0) {
0121         printf "shift '" shift   "' ='" dmask[shift,0] "'\n" > "/dev/stderr"
0122         printf "mask  '" mask    "'\n" > "/dev/stderr"
0123         printf "dshft '" divshift "'\n" > "/dev/stderr"
0124         printf "rdiv  '" reg_div "'\n" > "/dev/stderr"
0125         printf "rsrc  '" reg_src "'\n" > "/dev/stderr"
0126     }
0127 
0128     generated = mask
0129     sub(reg_src, reg_div, generated)
0130 
0131     if (0) {
0132         printf "/* rsrc " reg_src " */\n"
0133         printf "/* rdiv " reg_div " */\n"
0134         printf "/* shift " shift " */\n"
0135         printf "/* mask " mask " */\n"
0136         printf "/* generated " generated " */\n"
0137     }
0138 
0139     if (reg_div != "") {
0140         printf "\t.reg_div = { "
0141         printf ".reg = " reg_div ", "
0142         printf ".shift = " dmask[generated,1] ", "
0143         printf ".size = " dmask[generated,0] ", "
0144         printf "},\n"
0145     }
0146 
0147     printf "\t.reg_src = { "
0148     printf ".reg = " reg_src ", "
0149     printf ".shift = " dmask[mask,1] ", "
0150     printf ".size = " dmask[mask,0] ", "
0151 
0152     printf "},\n"
0153 
0154       }
0155 
0156       print line
0157   } else {
0158       print line
0159   }
0160 
0161   if (0)
0162       printf indent ":" line "\n" > "/dev/stderr"
0163     }
0164 }
0165 
0166 // && ! /clksrc_clk.*=.*{/ { print $0 }