linux/Documentation/arm/Samsung/clksrc-change-registers.awk
<<
>>
Prefs
   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