About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / arm / Samsung / clksrc-change-registers.awk




Custom Search

Based on kernel version 3.15.4. Page generated on 2014-07-07 08:59 EST.

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 }
Hide Line Numbers
About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.