• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/Documentation/arm/Samsung/
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
44    printf "unknown legnth " f "\n" > "/dev/stderr"
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/ &&
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 }
168