Merge tag 'char-misc-4.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[linux-2.6-block.git] / Documentation / arm / Samsung / clksrc-change-registers.awk
CommitLineData
37872bb9
BD
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
510e64fb 44 printf "unknown length " f "\n" > "/dev/stderr"
37872bb9
BD
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/ &&
37872bb9
BD
71 !(line ~ /USB_SIG_MASK/)) {
72 splitdefine(line, fields)
73 name = fields[0]
74 if (0)
75 printf "MASK " line "\n" > "/dev/stderr"
76 dmask[name,0] = find_length(fields[1])
77 dmask[name,1] = find_shift(fields[1])
78 if (0)
79 printf "=> '" name "' LENGTH=" dmask[name,0] " SHIFT=" dmask[name,1] "\n" > "/dev/stderr"
80 } else {
81 }
82 }
83
84 delete ARGV[1]
85}
86
87/clksrc_clk.*=.*{/ {
88 shift=""
89 mask=""
90 divshift=""
91 reg_div=""
92 reg_src=""
93 indent=1
94
95 print $0
96
97 for(; indent >= 1;) {
98 if ((getline line) <= 0) {
99 printf "unexpected end of file" > "/dev/stderr"
100 exit 1;
101 }
102
103 if (line ~ /\.shift/) {
104 shift = extract_value(line)
105 } else if (line ~ /\.mask/) {
106 mask = extract_value(line)
107 } else if (line ~ /\.reg_divider/) {
108 reg_div = extract_value(line)
109 } else if (line ~ /\.reg_source/) {
110 reg_src = extract_value(line)
111 } else if (line ~ /\.divider_shift/) {
112 divshift = extract_value(line)
113 } else if (line ~ /{/) {
114 indent++
115 print line
116 } else if (line ~ /}/) {
117 indent--
118
119 if (indent == 0) {
120 if (0) {
121 printf "shift '" shift "' ='" dmask[shift,0] "'\n" > "/dev/stderr"
122 printf "mask '" mask "'\n" > "/dev/stderr"
123 printf "dshft '" divshift "'\n" > "/dev/stderr"
124 printf "rdiv '" reg_div "'\n" > "/dev/stderr"
125 printf "rsrc '" reg_src "'\n" > "/dev/stderr"
126 }
127
128 generated = mask
129 sub(reg_src, reg_div, generated)
130
131 if (0) {
132 printf "/* rsrc " reg_src " */\n"
133 printf "/* rdiv " reg_div " */\n"
134 printf "/* shift " shift " */\n"
135 printf "/* mask " mask " */\n"
136 printf "/* generated " generated " */\n"
137 }
138
139 if (reg_div != "") {
140 printf "\t.reg_div = { "
141 printf ".reg = " reg_div ", "
142 printf ".shift = " dmask[generated,1] ", "
143 printf ".size = " dmask[generated,0] ", "
144 printf "},\n"
145 }
146
147 printf "\t.reg_src = { "
148 printf ".reg = " reg_src ", "
149 printf ".shift = " dmask[mask,1] ", "
150 printf ".size = " dmask[mask,0] ", "
151
152 printf "},\n"
153
154 }
155
156 print line
157 } else {
158 print line
159 }
160
161 if (0)
162 printf indent ":" line "\n" > "/dev/stderr"
163 }
164}
165
166// && ! /clksrc_clk.*=.*{/ { print $0 }