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 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 }
 167