File Index
Files and directories
Sign in
FILE

clksrc-change-registers.awk

File preview with syntax highlighting.

linux-6.19.14/Documentation/arch/arm/samsung/clksrc-change-registers.awk 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
 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 length " 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 ~ /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 }
~/ Read-only file preview.