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