brintos

brintos / linux-shallow public Read only

0
0
Text · 3.3 KiB · 7be1b8a Raw
167 lines · plain
1#!/usr/bin/awk -f2#3# Copyright 2010 Ben Dooks <ben-linux@fluff.org>4#5# Released under GPLv26 7# example usage8# ./clksrc-change-registers.awk arch/arm/plat-s5pc1xx/include/plat/regs-clock.h < src > dst9 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 137    else if (f ~ /0x3/)38	return 239    else if (f ~ /0x7/)40	return 341    else if (f ~ /0xf/)42	return 443 44    printf "unknown length " f "\n" > "/dev/stderr"45    exit46}47 48function find_shift(s)49{50    id = index(s, "<")51    if (id <= 0) {52	printf "cannot find shift " s "\n" > "/dev/stderr"53	exit54    }55 56    return substr(s, id+2)57}58 59 60BEGIN {61    if (ARGC < 2) {62	print "too few arguments" > "/dev/stderr"63	exit64    }65 66# read the header file and find the mask values that we will need67# to replace and create an associative array of values68 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=194 95    print $096 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 line116	    } 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 = mask129		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 line157	} else {158	    print line159	}160 161	if (0)162	    printf indent ":" line "\n" > "/dev/stderr"163    }164}165 166// && ! /clksrc_clk.*=.*{/ { print $0 }167