clk-rk-composite.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-3-08 GuEe-GUI the first version
  9. */
  10. #ifndef __CLK_RK_COMPOSITE_H__
  11. #define __CLK_RK_COMPOSITE_H__
  12. #include "clk-rk.h"
  13. struct rockchip_composite_clk_cell
  14. {
  15. struct rockchip_clk_cell rk_cell;
  16. struct rt_clk_ops ops;
  17. };
  18. #define COMPOSITE(_id, cname, pnames, f, mo, ms, mw, mf, ds, dw, df, go, gs, gf) \
  19. (void *)&(struct rockchip_composite_clk_cell) \
  20. { \
  21. .rk_cell.cell.name = cname, \
  22. .rk_cell.cell.parent_names = pnames, \
  23. .rk_cell.cell.parents_nr = RT_ARRAY_SIZE(pnames), \
  24. .rk_cell.cell.flags = f, \
  25. .rk_cell.id = _id, \
  26. .rk_cell.muxdiv_offset = mo, \
  27. .rk_cell.mux_shift = ms, \
  28. .rk_cell.mux_width = mw, \
  29. .rk_cell.mux_flags = mf, \
  30. .rk_cell.div_shift = ds, \
  31. .rk_cell.div_width = dw, \
  32. .rk_cell.div_flags = df, \
  33. .rk_cell.gate_offset = go, \
  34. .rk_cell.gate_shift = gs, \
  35. .rk_cell.gate_flags = gf, \
  36. .rk_cell.init = rockchip_composite_clk_cell_init, \
  37. }
  38. #define COMPOSITE_MUXTBL(_id, cname, pnames, f, mo, ms, mw, mf, mt, ds, dw, df, go, gs, gf) \
  39. (void *)&(struct rockchip_composite_clk_cell) \
  40. { \
  41. .rk_cell.cell.name = cname, \
  42. .rk_cell.cell.parent_names = pnames, \
  43. .rk_cell.cell.parents_nr = RT_ARRAY_SIZE(pnames), \
  44. .rk_cell.cell.flags = f, \
  45. .rk_cell.id = _id, \
  46. .rk_cell.muxdiv_offset = mo, \
  47. .rk_cell.mux_shift = ms, \
  48. .rk_cell.mux_width = mw, \
  49. .rk_cell.mux_flags = mf, \
  50. .rk_cell.mux_table = mt, \
  51. .rk_cell.div_shift = ds, \
  52. .rk_cell.div_width = dw, \
  53. .rk_cell.div_flags = df, \
  54. .rk_cell.gate_offset = go, \
  55. .rk_cell.gate_shift = gs, \
  56. .rk_cell.gate_flags = gf, \
  57. .rk_cell.init = rockchip_composite_clk_cell_init, \
  58. }
  59. #define COMPOSITE_DIV_OFFSET(_id, cname, pnames, f, mo, ms, mw, mf, do, ds, dw, df, go, gs, gf) \
  60. (void *)&(struct rockchip_composite_clk_cell) \
  61. { \
  62. .rk_cell.cell.name = cname, \
  63. .rk_cell.cell.parent_names = pnames, \
  64. .rk_cell.cell.parents_nr = RT_ARRAY_SIZE(pnames), \
  65. .rk_cell.cell.flags = f, \
  66. .rk_cell.id = _id, \
  67. .rk_cell.muxdiv_offset = mo, \
  68. .rk_cell.mux_shift = ms, \
  69. .rk_cell.mux_width = mw, \
  70. .rk_cell.mux_flags = mf, \
  71. .rk_cell.div_offset = do, \
  72. .rk_cell.div_shift = ds, \
  73. .rk_cell.div_width = dw, \
  74. .rk_cell.div_flags = df, \
  75. .rk_cell.gate_offset = go, \
  76. .rk_cell.gate_shift = gs, \
  77. .rk_cell.gate_flags = gf, \
  78. .rk_cell.init = rockchip_composite_clk_cell_init, \
  79. }
  80. #define COMPOSITE_NOMUX(_id, cname, pname, f, mo, ds, dw, df, go, gs, gf) \
  81. (void *)&(struct rockchip_composite_clk_cell) \
  82. { \
  83. .rk_cell.cell.name = cname, \
  84. .rk_cell.cell.parent_name = pname, \
  85. .rk_cell.cell.parents_nr = 1, \
  86. .rk_cell.cell.flags = f, \
  87. .rk_cell.id = _id, \
  88. .rk_cell.muxdiv_offset = mo, \
  89. .rk_cell.div_shift = ds, \
  90. .rk_cell.div_width = dw, \
  91. .rk_cell.div_flags = df, \
  92. .rk_cell.gate_offset = go, \
  93. .rk_cell.gate_shift = gs, \
  94. .rk_cell.gate_flags = gf, \
  95. .rk_cell.init = rockchip_composite_clk_cell_init, \
  96. }
  97. #define COMPOSITE_NOMUX_DIVTBL(_id, cname, pname, f, mo, ds, dw, df, dt, go, gs, gf) \
  98. (void *)&(struct rockchip_composite_clk_cell) \
  99. { \
  100. .rk_cell.cell.name = cname, \
  101. .rk_cell.cell.parent_name = pname, \
  102. .rk_cell.cell.parents_nr = 1, \
  103. .rk_cell.cell.flags = f, \
  104. .rk_cell.id = _id, \
  105. .rk_cell.muxdiv_offset = mo, \
  106. .rk_cell.div_shift = ds, \
  107. .rk_cell.div_width = dw, \
  108. .rk_cell.div_flags = df, \
  109. .rk_cell.div_table = dt, \
  110. .rk_cell.gate_offset = go, \
  111. .rk_cell.gate_shift = gs, \
  112. .rk_cell.gate_flags = gf, \
  113. .rk_cell.init = rockchip_composite_clk_cell_init, \
  114. }
  115. #define COMPOSITE_NODIV(_id, cname, pnames, f, mo, ms, mw, mf, go, gs, gf) \
  116. (void *)&(struct rockchip_composite_clk_cell) \
  117. { \
  118. .rk_cell.cell.name = cname, \
  119. .rk_cell.cell.parent_names = pnames, \
  120. .rk_cell.cell.parents_nr = RT_ARRAY_SIZE(pnames), \
  121. .rk_cell.cell.flags = f, \
  122. .rk_cell.id = _id, \
  123. .rk_cell.muxdiv_offset = mo, \
  124. .rk_cell.mux_shift = ms, \
  125. .rk_cell.mux_width = mw, \
  126. .rk_cell.mux_flags = mf, \
  127. .rk_cell.gate_offset = go, \
  128. .rk_cell.gate_shift = gs, \
  129. .rk_cell.gate_flags = gf, \
  130. .rk_cell.init = rockchip_composite_clk_cell_init, \
  131. }
  132. #define COMPOSITE_NOGATE(_id, cname, pnames, f, mo, ms, mw, mf, ds, dw, df) \
  133. (void *)&(struct rockchip_composite_clk_cell) \
  134. { \
  135. .rk_cell.cell.name = cname, \
  136. .rk_cell.cell.parent_names = pnames, \
  137. .rk_cell.cell.parents_nr = RT_ARRAY_SIZE(pnames), \
  138. .rk_cell.cell.flags = f, \
  139. .rk_cell.id = _id, \
  140. .rk_cell.muxdiv_offset = mo, \
  141. .rk_cell.mux_shift = ms, \
  142. .rk_cell.mux_width = mw, \
  143. .rk_cell.mux_flags = mf, \
  144. .rk_cell.div_shift = ds, \
  145. .rk_cell.div_width = dw, \
  146. .rk_cell.div_flags = df, \
  147. .rk_cell.gate_offset = -1, \
  148. .rk_cell.init = rockchip_composite_clk_cell_init, \
  149. }
  150. #define COMPOSITE_NOGATE_DIVTBL(_id, cname, pnames, f, mo, ms, mw, mf, ds, dw, df, dt) \
  151. (void *)&(struct rockchip_composite_clk_cell) \
  152. { \
  153. .rk_cell.cell.name = cname, \
  154. .rk_cell.cell.parent_names = pnames, \
  155. .rk_cell.cell.parents_nr = RT_ARRAY_SIZE(pnames), \
  156. .rk_cell.cell.flags = f, \
  157. .rk_cell.id = _id, \
  158. .rk_cell.muxdiv_offset = mo, \
  159. .rk_cell.mux_shift = ms, \
  160. .rk_cell.mux_width = mw, \
  161. .rk_cell.mux_flags = mf, \
  162. .rk_cell.div_shift = ds, \
  163. .rk_cell.div_width = dw, \
  164. .rk_cell.div_flags = df, \
  165. .rk_cell.div_table = dt, \
  166. .rk_cell.gate_offset = -1, \
  167. .rk_cell.init = rockchip_composite_clk_cell_init, \
  168. }
  169. rt_inline struct rockchip_composite_clk_cell *cell_to_rockchip_composite_cell(struct rt_clk_cell *cell)
  170. {
  171. struct rockchip_clk_cell *rk_cell = cell_to_rockchip_clk_cell(cell);
  172. return rt_container_of(rk_cell, struct rockchip_composite_clk_cell, rk_cell);
  173. }
  174. void rockchip_composite_clk_cell_init(struct rockchip_clk_cell *rk_cell);
  175. #endif /* __CLK_RK_COMPOSITE_H__ */