clksrc-change-registers.awk 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #!/usr/bin/awk -f
  2. #
  3. # Copyright 2010 Ben Dooks <ben-linux@fluff.org>
  4. #
  5. # Released under GPLv2
  6. # example usage
  7. # ./clksrc-change-registers.awk arch/arm/plat-s5pc1xx/include/plat/regs-clock.h < src > dst
  8. function extract_value(s)
  9. {
  10. eqat = index(s, "=")
  11. comat = index(s, ",")
  12. return substr(s, eqat+2, (comat-eqat)-2)
  13. }
  14. function remove_brackets(b)
  15. {
  16. return substr(b, 2, length(b)-2)
  17. }
  18. function splitdefine(l, p)
  19. {
  20. r = split(l, tp)
  21. p[0] = tp[2]
  22. p[1] = remove_brackets(tp[3])
  23. }
  24. function find_length(f)
  25. {
  26. if (0)
  27. printf "find_length " f "\n" > "/dev/stderr"
  28. if (f ~ /0x1/)
  29. return 1
  30. else if (f ~ /0x3/)
  31. return 2
  32. else if (f ~ /0x7/)
  33. return 3
  34. else if (f ~ /0xf/)
  35. return 4
  36. printf "unknown legnth " f "\n" > "/dev/stderr"
  37. exit
  38. }
  39. function find_shift(s)
  40. {
  41. id = index(s, "<")
  42. if (id <= 0) {
  43. printf "cannot find shift " s "\n" > "/dev/stderr"
  44. exit
  45. }
  46. return substr(s, id+2)
  47. }
  48. BEGIN {
  49. if (ARGC < 2) {
  50. print "too few arguments" > "/dev/stderr"
  51. exit
  52. }
  53. # read the header file and find the mask values that we will need
  54. # to replace and create an associative array of values
  55. while (getline line < ARGV[1] > 0) {
  56. if (line ~ /\#define.*_MASK/ &&
  57. !(line ~ /S5PC100_EPLL_MASK/) &&
  58. !(line ~ /USB_SIG_MASK/)) {
  59. splitdefine(line, fields)
  60. name = fields[0]
  61. if (0)
  62. printf "MASK " line "\n" > "/dev/stderr"
  63. dmask[name,0] = find_length(fields[1])
  64. dmask[name,1] = find_shift(fields[1])
  65. if (0)
  66. printf "=> '" name "' LENGTH=" dmask[name,0] " SHIFT=" dmask[name,1] "\n" > "/dev/stderr"
  67. } else {
  68. }
  69. }
  70. delete ARGV[1]
  71. }
  72. /clksrc_clk.*=.*{/ {
  73. shift=""
  74. mask=""
  75. divshift=""
  76. reg_div=""
  77. reg_src=""
  78. indent=1
  79. print $0
  80. for(; indent >= 1;) {
  81. if ((getline line) <= 0) {
  82. printf "unexpected end of file" > "/dev/stderr"
  83. exit 1;
  84. }
  85. if (line ~ /\.shift/) {
  86. shift = extract_value(line)
  87. } else if (line ~ /\.mask/) {
  88. mask = extract_value(line)
  89. } else if (line ~ /\.reg_divider/) {
  90. reg_div = extract_value(line)
  91. } else if (line ~ /\.reg_source/) {
  92. reg_src = extract_value(line)
  93. } else if (line ~ /\.divider_shift/) {
  94. divshift = extract_value(line)
  95. } else if (line ~ /{/) {
  96. indent++
  97. print line
  98. } else if (line ~ /}/) {
  99. indent--
  100. if (indent == 0) {
  101. if (0) {
  102. printf "shift '" shift "' ='" dmask[shift,0] "'\n" > "/dev/stderr"
  103. printf "mask '" mask "'\n" > "/dev/stderr"
  104. printf "dshft '" divshift "'\n" > "/dev/stderr"
  105. printf "rdiv '" reg_div "'\n" > "/dev/stderr"
  106. printf "rsrc '" reg_src "'\n" > "/dev/stderr"
  107. }
  108. generated = mask
  109. sub(reg_src, reg_div, generated)
  110. if (0) {
  111. printf "/* rsrc " reg_src " */\n"
  112. printf "/* rdiv " reg_div " */\n"
  113. printf "/* shift " shift " */\n"
  114. printf "/* mask " mask " */\n"
  115. printf "/* generated " generated " */\n"
  116. }
  117. if (reg_div != "") {
  118. printf "\t.reg_div = { "
  119. printf ".reg = " reg_div ", "
  120. printf ".shift = " dmask[generated,1] ", "
  121. printf ".size = " dmask[generated,0] ", "
  122. printf "},\n"
  123. }
  124. printf "\t.reg_src = { "
  125. printf ".reg = " reg_src ", "
  126. printf ".shift = " dmask[mask,1] ", "
  127. printf ".size = " dmask[mask,0] ", "
  128. printf "},\n"
  129. }
  130. print line
  131. } else {
  132. print line
  133. }
  134. if (0)
  135. printf indent ":" line "\n" > "/dev/stderr"
  136. }
  137. }
  138. // && ! /clksrc_clk.*=.*{/ { print $0 }