Check-in of baseline 2.6.34 tree
[linux-2.6.34-lpc32xx.git] / Documentation / arm / Samsung / clksrc-change-registers.awk
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
10 function extract_value(s)
11 {
12     eqat = index(s, "=")
13     comat = index(s, ",")
14     return substr(s, eqat+2, (comat-eqat)-2)
15 }
16
17 function remove_brackets(b)
18 {
19     return substr(b, 2, length(b)-2)
20 }
21
22 function splitdefine(l, p)
23 {
24     r = split(l, tp)
25
26     p[0] = tp[2]
27     p[1] = remove_brackets(tp[3])
28 }
29
30 function 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
48 function 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
60 BEGIN {
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 }