clk-rcg.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /* Copyright (c) 2013, 2016-2018, 2020 The Linux Foundation. All rights reserved. */
  3. /* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. */
  4. #ifndef __QCOM_CLK_RCG_H__
  5. #define __QCOM_CLK_RCG_H__
  6. #include <linux/clk-provider.h>
  7. #include "clk-regmap.h"
  8. #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
  9. struct freq_tbl {
  10. unsigned long freq;
  11. u8 src;
  12. u8 pre_div;
  13. u16 m;
  14. u16 n;
  15. unsigned long src_freq;
  16. #define FIXED_FREQ_SRC 0
  17. };
  18. /**
  19. * struct mn - M/N:D counter
  20. * @mnctr_en_bit: bit to enable mn counter
  21. * @mnctr_reset_bit: bit to assert mn counter reset
  22. * @mnctr_mode_shift: lowest bit of mn counter mode field
  23. * @n_val_shift: lowest bit of n value field
  24. * @m_val_shift: lowest bit of m value field
  25. * @width: number of bits in m/n/d values
  26. * @reset_in_cc: true if the mnctr_reset_bit is in the CC register
  27. */
  28. struct mn {
  29. u8 mnctr_en_bit;
  30. u8 mnctr_reset_bit;
  31. u8 mnctr_mode_shift;
  32. #define MNCTR_MODE_DUAL 0x2
  33. #define MNCTR_MODE_MASK 0x3
  34. u8 n_val_shift;
  35. u8 m_val_shift;
  36. u8 width;
  37. bool reset_in_cc;
  38. };
  39. /**
  40. * struct pre_div - pre-divider
  41. * @pre_div_shift: lowest bit of pre divider field
  42. * @pre_div_width: number of bits in predivider
  43. */
  44. struct pre_div {
  45. u8 pre_div_shift;
  46. u8 pre_div_width;
  47. };
  48. /**
  49. * struct src_sel - source selector
  50. * @src_sel_shift: lowest bit of source selection field
  51. * @parent_map: map from software's parent index to hardware's src_sel field
  52. */
  53. struct src_sel {
  54. u8 src_sel_shift;
  55. #define SRC_SEL_MASK 0x7
  56. const struct parent_map *parent_map;
  57. };
  58. /**
  59. * struct clk_rcg - root clock generator
  60. *
  61. * @ns_reg: NS register
  62. * @md_reg: MD register
  63. * @mn: mn counter
  64. * @p: pre divider
  65. * @s: source selector
  66. * @freq_tbl: frequency table
  67. * @clkr: regmap clock handle
  68. * @lock: register lock
  69. */
  70. struct clk_rcg {
  71. u32 ns_reg;
  72. u32 md_reg;
  73. struct mn mn;
  74. struct pre_div p;
  75. struct src_sel s;
  76. const struct freq_tbl *freq_tbl;
  77. struct clk_regmap clkr;
  78. };
  79. extern const struct clk_ops clk_rcg_ops;
  80. extern const struct clk_ops clk_rcg_floor_ops;
  81. extern const struct clk_ops clk_rcg_bypass_ops;
  82. extern const struct clk_ops clk_rcg_bypass2_ops;
  83. extern const struct clk_ops clk_rcg_pixel_ops;
  84. extern const struct clk_ops clk_rcg_esc_ops;
  85. extern const struct clk_ops clk_rcg_lcc_ops;
  86. #define to_clk_rcg(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg, clkr)
  87. /**
  88. * struct clk_dyn_rcg - root clock generator with glitch free mux
  89. *
  90. * @mux_sel_bit: bit to switch glitch free mux
  91. * @ns_reg: NS0 and NS1 register
  92. * @md_reg: MD0 and MD1 register
  93. * @bank_reg: register to XOR @mux_sel_bit into to switch glitch free mux
  94. * @mn: mn counter (banked)
  95. * @s: source selector (banked)
  96. * @freq_tbl: frequency table
  97. * @clkr: regmap clock handle
  98. * @lock: register lock
  99. */
  100. struct clk_dyn_rcg {
  101. u32 ns_reg[2];
  102. u32 md_reg[2];
  103. u32 bank_reg;
  104. u8 mux_sel_bit;
  105. struct mn mn[2];
  106. struct pre_div p[2];
  107. struct src_sel s[2];
  108. const struct freq_tbl *freq_tbl;
  109. struct clk_regmap clkr;
  110. };
  111. extern const struct clk_ops clk_dyn_rcg_ops;
  112. #define to_clk_dyn_rcg(_hw) \
  113. container_of(to_clk_regmap(_hw), struct clk_dyn_rcg, clkr)
  114. /**
  115. * struct clk_rcg2 - root clock generator
  116. *
  117. * @cmd_rcgr: corresponds to *_CMD_RCGR
  118. * @mnd_width: number of bits in m/n/d values
  119. * @hid_width: number of bits in half integer divider
  120. * @safe_src_index: safe src index value
  121. * @parent_map: map from software's parent index to hardware's src_sel field
  122. * @freq_tbl: frequency table
  123. * @current_freq: last cached frequency when using branches with shared RCGs
  124. * @enable_safe_config: When set, the RCG is parked at CXO when it's disabled
  125. * @clkr: regmap clock handle
  126. * @cfg_off: defines the cfg register offset from the CMD_RCGR + CFG_REG
  127. * @flags: additional flag parameters for the RCG
  128. * @parked_cfg: cached value of the CFG register for parked RCGs
  129. */
  130. struct clk_rcg2 {
  131. u32 cmd_rcgr;
  132. u8 mnd_width;
  133. u8 hid_width;
  134. u8 safe_src_index;
  135. const struct parent_map *parent_map;
  136. const struct freq_tbl *freq_tbl;
  137. unsigned long configured_freq;
  138. unsigned long current_freq;
  139. bool enable_safe_config;
  140. struct clk_regmap clkr;
  141. u8 cfg_off;
  142. u8 flags;
  143. #define FORCE_ENABLE_RCG BIT(0)
  144. #define HW_CLK_CTRL_MODE BIT(1)
  145. #define DFS_SUPPORT BIT(2)
  146. u32 parked_cfg;
  147. bool freq_populated;
  148. };
  149. #define to_clk_rcg2(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr)
  150. struct clk_rcg2_gfx3d {
  151. u8 div;
  152. struct clk_rcg2 rcg;
  153. struct clk_hw **hws;
  154. };
  155. #define to_clk_rcg2_gfx3d(_hw) \
  156. container_of(to_clk_rcg2(_hw), struct clk_rcg2_gfx3d, rcg)
  157. extern const struct clk_ops clk_rcg2_ops;
  158. extern const struct clk_ops clk_rcg2_floor_ops;
  159. extern const struct clk_ops clk_rcg2_mux_closest_ops;
  160. extern const struct clk_ops clk_edp_pixel_ops;
  161. extern const struct clk_ops clk_byte_ops;
  162. extern const struct clk_ops clk_byte2_ops;
  163. extern const struct clk_ops clk_pixel_ops;
  164. extern const struct clk_ops clk_gfx3d_ops;
  165. extern const struct clk_ops clk_rcg2_shared_ops;
  166. extern const struct clk_ops clk_dp_ops;
  167. extern const struct clk_ops clk_rcg2_crmc_ops;
  168. extern const struct clk_ops clk_rcg2_crmb_ops;
  169. struct clk_rcg_dfs_data {
  170. struct clk_rcg2 *rcg;
  171. struct clk_init_data *init;
  172. };
  173. #define DEFINE_RCG_DFS(r) \
  174. { .rcg = &r, .init = &r##_init }
  175. extern int qcom_cc_register_rcg_dfs(struct regmap *regmap,
  176. const struct clk_rcg_dfs_data *rcgs,
  177. size_t len);
  178. #endif