clk.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __MACH_IMX_CLK_H
  3. #define __MACH_IMX_CLK_H
  4. #include <linux/bits.h>
  5. #include <linux/spinlock.h>
  6. #include <linux/clk-provider.h>
  7. extern spinlock_t imx_ccm_lock;
  8. extern bool mcore_booted;
  9. void imx_check_clocks(struct clk *clks[], unsigned int count);
  10. void imx_check_clk_hws(struct clk_hw *clks[], unsigned int count);
  11. #ifndef MODULE
  12. void imx_register_uart_clocks(void);
  13. #else
  14. static inline void imx_register_uart_clocks(void)
  15. {
  16. }
  17. #endif
  18. void imx_mmdc_mask_handshake(void __iomem *ccm_base, unsigned int chn);
  19. void imx_unregister_hw_clocks(struct clk_hw *hws[], unsigned int count);
  20. extern void imx_cscmr1_fixup(u32 *val);
  21. enum imx_pllv1_type {
  22. IMX_PLLV1_IMX1,
  23. IMX_PLLV1_IMX21,
  24. IMX_PLLV1_IMX25,
  25. IMX_PLLV1_IMX27,
  26. IMX_PLLV1_IMX31,
  27. IMX_PLLV1_IMX35,
  28. };
  29. enum imx_sscg_pll_type {
  30. SCCG_PLL1,
  31. SCCG_PLL2,
  32. };
  33. enum imx_pll14xx_type {
  34. PLL_1416X,
  35. PLL_1443X,
  36. };
  37. enum imx_pllv4_type {
  38. IMX_PLLV4_IMX7ULP,
  39. IMX_PLLV4_IMX8ULP,
  40. IMX_PLLV4_IMX8ULP_1GHZ,
  41. };
  42. enum imx_pfdv2_type {
  43. IMX_PFDV2_IMX7ULP,
  44. IMX_PFDV2_IMX8ULP,
  45. };
  46. /* NOTE: Rate table should be kept sorted in descending order. */
  47. struct imx_pll14xx_rate_table {
  48. unsigned int rate;
  49. unsigned int pdiv;
  50. unsigned int mdiv;
  51. unsigned int sdiv;
  52. unsigned int kdiv;
  53. };
  54. struct imx_pll14xx_clk {
  55. enum imx_pll14xx_type type;
  56. const struct imx_pll14xx_rate_table *rate_table;
  57. int rate_count;
  58. int flags;
  59. };
  60. extern struct imx_pll14xx_clk imx_1416x_pll;
  61. extern struct imx_pll14xx_clk imx_1443x_pll;
  62. extern struct imx_pll14xx_clk imx_1443x_dram_pll;
  63. #define CLK_FRACN_GPPLL_INTEGER BIT(0)
  64. #define CLK_FRACN_GPPLL_FRACN BIT(1)
  65. /* NOTE: Rate table should be kept sorted in descending order. */
  66. struct imx_fracn_gppll_rate_table {
  67. unsigned int rate;
  68. unsigned int mfi;
  69. unsigned int mfn;
  70. unsigned int mfd;
  71. unsigned int rdiv;
  72. unsigned int odiv;
  73. };
  74. struct imx_fracn_gppll_clk {
  75. const struct imx_fracn_gppll_rate_table *rate_table;
  76. int rate_count;
  77. int flags;
  78. };
  79. struct clk_hw *imx_clk_fracn_gppll(const char *name, const char *parent_name, void __iomem *base,
  80. const struct imx_fracn_gppll_clk *pll_clk);
  81. struct clk_hw *imx_clk_fracn_gppll_integer(const char *name, const char *parent_name,
  82. void __iomem *base,
  83. const struct imx_fracn_gppll_clk *pll_clk);
  84. extern struct imx_fracn_gppll_clk imx_fracn_gppll;
  85. extern struct imx_fracn_gppll_clk imx_fracn_gppll_integer;
  86. #define imx_clk_cpu(name, parent_name, div, mux, pll, step) \
  87. to_clk(imx_clk_hw_cpu(name, parent_name, div, mux, pll, step))
  88. #define clk_register_gate2(dev, name, parent_name, flags, reg, bit_idx, \
  89. cgr_val, cgr_mask, clk_gate_flags, lock, share_count) \
  90. to_clk(clk_hw_register_gate2(dev, name, parent_name, flags, reg, bit_idx, \
  91. cgr_val, cgr_mask, clk_gate_flags, lock, share_count))
  92. #define imx_clk_pllv3(type, name, parent_name, base, div_mask) \
  93. to_clk(imx_clk_hw_pllv3(type, name, parent_name, base, div_mask))
  94. #define imx_clk_pfd(name, parent_name, reg, idx) \
  95. to_clk(imx_clk_hw_pfd(name, parent_name, reg, idx))
  96. #define imx_clk_gate_exclusive(name, parent, reg, shift, exclusive_mask) \
  97. to_clk(imx_clk_hw_gate_exclusive(name, parent, reg, shift, exclusive_mask))
  98. #define imx_clk_fixed(name, rate) \
  99. to_clk(imx_clk_hw_fixed(name, rate))
  100. #define imx_clk_fixed_factor(name, parent, mult, div) \
  101. to_clk(imx_clk_hw_fixed_factor(name, parent, mult, div))
  102. #define imx_clk_divider(name, parent, reg, shift, width) \
  103. to_clk(imx_clk_hw_divider(name, parent, reg, shift, width))
  104. #define imx_clk_divider_flags(name, parent, reg, shift, width, flags) \
  105. to_clk(imx_clk_hw_divider_flags(name, parent, reg, shift, width, flags))
  106. #define imx_clk_gate(name, parent, reg, shift) \
  107. to_clk(imx_clk_hw_gate(name, parent, reg, shift))
  108. #define imx_clk_gate_dis(name, parent, reg, shift) \
  109. to_clk(imx_clk_hw_gate_dis(name, parent, reg, shift))
  110. #define imx_clk_gate2(name, parent, reg, shift) \
  111. to_clk(imx_clk_hw_gate2(name, parent, reg, shift))
  112. #define imx_clk_gate2_cgr(name, parent, reg, shift, cgr_val) \
  113. to_clk(__imx_clk_hw_gate2(name, parent, reg, shift, cgr_val, 0, NULL))
  114. #define imx_clk_gate2_flags(name, parent, reg, shift, flags) \
  115. to_clk(imx_clk_hw_gate2_flags(name, parent, reg, shift, flags))
  116. #define imx_clk_mux(name, reg, shift, width, parents, num_parents) \
  117. to_clk(imx_clk_hw_mux(name, reg, shift, width, parents, num_parents))
  118. #define imx_clk_mux_flags(name, reg, shift, width, parents, num_parents, flags) \
  119. to_clk(imx_clk_hw_mux_flags(name, reg, shift, width, parents, num_parents, flags))
  120. #define imx_clk_mux2_flags(name, reg, shift, width, parents, num_parents, flags) \
  121. to_clk(imx_clk_hw_mux2_flags(name, reg, shift, width, parents, num_parents, flags))
  122. #define imx_clk_pllv1(type, name, parent, base) \
  123. to_clk(imx_clk_hw_pllv1(type, name, parent, base))
  124. #define imx_clk_pllv2(name, parent, base) \
  125. to_clk(imx_clk_hw_pllv2(name, parent, base))
  126. #define imx_clk_hw_gate(name, parent, reg, shift) \
  127. imx_clk_hw_gate_flags(name, parent, reg, shift, 0)
  128. #define imx_clk_hw_gate2(name, parent, reg, shift) \
  129. imx_clk_hw_gate2_flags(name, parent, reg, shift, 0)
  130. #define imx_clk_hw_gate_dis(name, parent, reg, shift) \
  131. imx_clk_hw_gate_dis_flags(name, parent, reg, shift, 0)
  132. #define imx_clk_hw_gate_dis_flags(name, parent, reg, shift, flags) \
  133. __imx_clk_hw_gate(name, parent, reg, shift, flags, CLK_GATE_SET_TO_DISABLE)
  134. #define imx_clk_hw_gate_flags(name, parent, reg, shift, flags) \
  135. __imx_clk_hw_gate(name, parent, reg, shift, flags, 0)
  136. #define imx_clk_hw_gate2_flags(name, parent, reg, shift, flags) \
  137. __imx_clk_hw_gate2(name, parent, reg, shift, 0x3, flags, NULL)
  138. #define imx_clk_hw_gate2_shared(name, parent, reg, shift, shared_count) \
  139. __imx_clk_hw_gate2(name, parent, reg, shift, 0x3, 0, shared_count)
  140. #define imx_clk_hw_gate2_shared2(name, parent, reg, shift, shared_count) \
  141. __imx_clk_hw_gate2(name, parent, reg, shift, 0x3, CLK_OPS_PARENT_ENABLE, shared_count)
  142. #define imx_clk_hw_gate3(name, parent, reg, shift) \
  143. imx_clk_hw_gate3_flags(name, parent, reg, shift, 0)
  144. #define imx_clk_hw_gate3_flags(name, parent, reg, shift, flags) \
  145. __imx_clk_hw_gate(name, parent, reg, shift, flags | CLK_OPS_PARENT_ENABLE, 0)
  146. #define imx_clk_hw_gate4(name, parent, reg, shift) \
  147. imx_clk_hw_gate4_flags(name, parent, reg, shift, 0)
  148. #define imx_clk_hw_gate4_flags(name, parent, reg, shift, flags) \
  149. imx_clk_hw_gate2_flags(name, parent, reg, shift, flags | CLK_OPS_PARENT_ENABLE)
  150. #define imx_clk_hw_mux2(name, reg, shift, width, parents, num_parents) \
  151. imx_clk_hw_mux2_flags(name, reg, shift, width, parents, num_parents, 0)
  152. #define imx_clk_hw_mux(name, reg, shift, width, parents, num_parents) \
  153. __imx_clk_hw_mux(name, reg, shift, width, parents, num_parents, 0, 0)
  154. #define imx_clk_hw_mux_flags(name, reg, shift, width, parents, num_parents, flags) \
  155. __imx_clk_hw_mux(name, reg, shift, width, parents, num_parents, flags, 0)
  156. #define imx_clk_hw_mux_ldb(name, reg, shift, width, parents, num_parents) \
  157. __imx_clk_hw_mux(name, reg, shift, width, parents, num_parents, CLK_SET_RATE_PARENT, CLK_MUX_READ_ONLY)
  158. #define imx_clk_hw_mux2_flags(name, reg, shift, width, parents, num_parents, flags) \
  159. __imx_clk_hw_mux(name, reg, shift, width, parents, num_parents, flags | CLK_OPS_PARENT_ENABLE, 0)
  160. #define imx_clk_hw_divider(name, parent, reg, shift, width) \
  161. __imx_clk_hw_divider(name, parent, reg, shift, width, CLK_SET_RATE_PARENT)
  162. #define imx_clk_hw_divider2(name, parent, reg, shift, width) \
  163. __imx_clk_hw_divider(name, parent, reg, shift, width, \
  164. CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE)
  165. #define imx_clk_hw_divider_flags(name, parent, reg, shift, width, flags) \
  166. __imx_clk_hw_divider(name, parent, reg, shift, width, flags)
  167. #define imx_clk_hw_pll14xx(name, parent_name, base, pll_clk) \
  168. imx_dev_clk_hw_pll14xx(NULL, name, parent_name, base, pll_clk)
  169. struct clk_hw *imx_dev_clk_hw_pll14xx(struct device *dev, const char *name,
  170. const char *parent_name, void __iomem *base,
  171. const struct imx_pll14xx_clk *pll_clk);
  172. struct clk_hw *imx_clk_hw_pllv1(enum imx_pllv1_type type, const char *name,
  173. const char *parent, void __iomem *base);
  174. struct clk_hw *imx_clk_hw_pllv2(const char *name, const char *parent,
  175. void __iomem *base);
  176. struct clk_hw *imx_clk_hw_frac_pll(const char *name, const char *parent_name,
  177. void __iomem *base);
  178. struct clk_hw *imx_clk_hw_sscg_pll(const char *name,
  179. const char * const *parent_names,
  180. u8 num_parents,
  181. u8 parent, u8 bypass1, u8 bypass2,
  182. void __iomem *base,
  183. unsigned long flags);
  184. enum imx_pllv3_type {
  185. IMX_PLLV3_GENERIC,
  186. IMX_PLLV3_SYS,
  187. IMX_PLLV3_USB,
  188. IMX_PLLV3_USB_VF610,
  189. IMX_PLLV3_AV,
  190. IMX_PLLV3_ENET,
  191. IMX_PLLV3_ENET_IMX7,
  192. IMX_PLLV3_SYS_VF610,
  193. IMX_PLLV3_DDR_IMX7,
  194. IMX_PLLV3_AV_IMX7,
  195. };
  196. struct clk_hw *imx_clk_hw_pllv3(enum imx_pllv3_type type, const char *name,
  197. const char *parent_name, void __iomem *base, u32 div_mask);
  198. #define PLL_1416X_RATE(_rate, _m, _p, _s) \
  199. { \
  200. .rate = (_rate), \
  201. .mdiv = (_m), \
  202. .pdiv = (_p), \
  203. .sdiv = (_s), \
  204. }
  205. #define PLL_1443X_RATE(_rate, _m, _p, _s, _k) \
  206. { \
  207. .rate = (_rate), \
  208. .mdiv = (_m), \
  209. .pdiv = (_p), \
  210. .sdiv = (_s), \
  211. .kdiv = (_k), \
  212. }
  213. struct clk_hw *imx_clk_hw_pllv4(enum imx_pllv4_type type, const char *name,
  214. const char *parent_name, void __iomem *base);
  215. struct clk_hw *clk_hw_register_gate2(struct device *dev, const char *name,
  216. const char *parent_name, unsigned long flags,
  217. void __iomem *reg, u8 bit_idx, u8 cgr_val, u8 cgr_mask,
  218. u8 clk_gate_flags, spinlock_t *lock,
  219. unsigned int *share_count);
  220. struct clk * imx_obtain_fixed_clock(
  221. const char *name, unsigned long rate);
  222. struct clk_hw *imx_obtain_fixed_clock_hw(
  223. const char *name, unsigned long rate);
  224. struct clk_hw *imx_obtain_fixed_of_clock(struct device_node *np,
  225. const char *name, unsigned long rate);
  226. struct clk_hw *imx_get_clk_hw_by_name(struct device_node *np, const char *name);
  227. struct clk_hw *imx_clk_hw_gate_exclusive(const char *name, const char *parent,
  228. void __iomem *reg, u8 shift, u32 exclusive_mask);
  229. struct clk_hw *imx_clk_hw_pfd(const char *name, const char *parent_name,
  230. void __iomem *reg, u8 idx);
  231. struct clk_hw *imx_clk_hw_pfdv2(enum imx_pfdv2_type type, const char *name,
  232. const char *parent_name, void __iomem *reg, u8 idx);
  233. struct clk_hw *imx_clk_hw_busy_divider(const char *name, const char *parent_name,
  234. void __iomem *reg, u8 shift, u8 width,
  235. void __iomem *busy_reg, u8 busy_shift);
  236. struct clk_hw *imx_clk_hw_busy_mux(const char *name, void __iomem *reg, u8 shift,
  237. u8 width, void __iomem *busy_reg, u8 busy_shift,
  238. const char * const *parent_names, int num_parents);
  239. struct clk_hw *imx7ulp_clk_hw_composite(const char *name,
  240. const char * const *parent_names,
  241. int num_parents, bool mux_present,
  242. bool rate_present, bool gate_present,
  243. void __iomem *reg);
  244. struct clk_hw *imx8ulp_clk_hw_composite(const char *name,
  245. const char * const *parent_names,
  246. int num_parents, bool mux_present,
  247. bool rate_present, bool gate_present,
  248. void __iomem *reg, bool has_swrst);
  249. struct clk_hw *imx_clk_hw_fixup_divider(const char *name, const char *parent,
  250. void __iomem *reg, u8 shift, u8 width,
  251. void (*fixup)(u32 *val));
  252. struct clk_hw *imx_clk_hw_fixup_mux(const char *name, void __iomem *reg,
  253. u8 shift, u8 width, const char * const *parents,
  254. int num_parents, void (*fixup)(u32 *val));
  255. static inline struct clk *to_clk(struct clk_hw *hw)
  256. {
  257. if (IS_ERR_OR_NULL(hw))
  258. return ERR_CAST(hw);
  259. return hw->clk;
  260. }
  261. static inline struct clk_hw *imx_clk_hw_fixed(const char *name, int rate)
  262. {
  263. return clk_hw_register_fixed_rate(NULL, name, NULL, 0, rate);
  264. }
  265. static inline struct clk_hw *imx_clk_hw_fixed_factor(const char *name,
  266. const char *parent, unsigned int mult, unsigned int div)
  267. {
  268. return clk_hw_register_fixed_factor(NULL, name, parent,
  269. CLK_SET_RATE_PARENT, mult, div);
  270. }
  271. static inline struct clk_hw *imx_clk_hw_divider_closest(const char *name,
  272. const char *parent,
  273. void __iomem *reg, u8 shift,
  274. u8 width)
  275. {
  276. return clk_hw_register_divider(NULL, name, parent, 0,
  277. reg, shift, width, CLK_DIVIDER_ROUND_CLOSEST, &imx_ccm_lock);
  278. }
  279. static inline struct clk_hw *__imx_clk_hw_divider(const char *name,
  280. const char *parent,
  281. void __iomem *reg, u8 shift,
  282. u8 width, unsigned long flags)
  283. {
  284. return clk_hw_register_divider(NULL, name, parent, flags,
  285. reg, shift, width, 0, &imx_ccm_lock);
  286. }
  287. static inline struct clk_hw *__imx_clk_hw_gate(const char *name, const char *parent,
  288. void __iomem *reg, u8 shift,
  289. unsigned long flags,
  290. unsigned long clk_gate_flags)
  291. {
  292. return clk_hw_register_gate(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
  293. shift, clk_gate_flags, &imx_ccm_lock);
  294. }
  295. static inline struct clk_hw *__imx_clk_hw_gate2(const char *name, const char *parent,
  296. void __iomem *reg, u8 shift, u8 cgr_val,
  297. unsigned long flags,
  298. unsigned int *share_count)
  299. {
  300. return clk_hw_register_gate2(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
  301. shift, cgr_val, 0x3, 0, &imx_ccm_lock, share_count);
  302. }
  303. static inline struct clk_hw *__imx_clk_hw_mux(const char *name, void __iomem *reg,
  304. u8 shift, u8 width, const char * const *parents,
  305. int num_parents, unsigned long flags, unsigned long clk_mux_flags)
  306. {
  307. return clk_hw_register_mux(NULL, name, parents, num_parents,
  308. flags | CLK_SET_RATE_NO_REPARENT, reg, shift,
  309. width, clk_mux_flags, &imx_ccm_lock);
  310. }
  311. struct clk_hw *imx_clk_hw_cpu(const char *name, const char *parent_name,
  312. struct clk *div, struct clk *mux, struct clk *pll,
  313. struct clk *step);
  314. #define IMX_COMPOSITE_CORE BIT(0)
  315. #define IMX_COMPOSITE_BUS BIT(1)
  316. #define IMX_COMPOSITE_FW_MANAGED BIT(2)
  317. #define IMX_COMPOSITE_CLK_FLAGS_DEFAULT \
  318. (CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
  319. #define IMX_COMPOSITE_CLK_FLAGS_CRITICAL \
  320. (IMX_COMPOSITE_CLK_FLAGS_DEFAULT | CLK_IS_CRITICAL)
  321. #define IMX_COMPOSITE_CLK_FLAGS_GET_RATE_NO_CACHE \
  322. (IMX_COMPOSITE_CLK_FLAGS_DEFAULT | CLK_GET_RATE_NOCACHE)
  323. #define IMX_COMPOSITE_CLK_FLAGS_CRITICAL_GET_RATE_NO_CACHE \
  324. (IMX_COMPOSITE_CLK_FLAGS_GET_RATE_NO_CACHE | CLK_IS_CRITICAL)
  325. struct clk_hw *__imx8m_clk_hw_composite(const char *name,
  326. const char * const *parent_names,
  327. int num_parents,
  328. void __iomem *reg,
  329. u32 composite_flags,
  330. unsigned long flags);
  331. #define _imx8m_clk_hw_composite(name, parent_names, reg, composite_flags, flags) \
  332. __imx8m_clk_hw_composite(name, parent_names, \
  333. ARRAY_SIZE(parent_names), reg, composite_flags, flags)
  334. #define imx8m_clk_hw_composite(name, parent_names, reg) \
  335. _imx8m_clk_hw_composite(name, parent_names, reg, \
  336. 0, IMX_COMPOSITE_CLK_FLAGS_DEFAULT)
  337. #define imx8m_clk_hw_composite_flags(name, parent_names, reg, flags) \
  338. _imx8m_clk_hw_composite(name, parent_names, reg, \
  339. 0, IMX_COMPOSITE_CLK_FLAGS_DEFAULT | flags)
  340. #define imx8m_clk_hw_composite_critical(name, parent_names, reg) \
  341. _imx8m_clk_hw_composite(name, parent_names, reg, \
  342. 0, IMX_COMPOSITE_CLK_FLAGS_CRITICAL)
  343. #define imx8m_clk_hw_composite_bus(name, parent_names, reg) \
  344. _imx8m_clk_hw_composite(name, parent_names, reg, \
  345. IMX_COMPOSITE_BUS, IMX_COMPOSITE_CLK_FLAGS_DEFAULT)
  346. #define imx8m_clk_hw_composite_bus_flags(name, parent_names, reg, flags) \
  347. _imx8m_clk_hw_composite(name, parent_names, reg, \
  348. IMX_COMPOSITE_BUS, IMX_COMPOSITE_CLK_FLAGS_DEFAULT | flags)
  349. #define imx8m_clk_hw_composite_bus_critical(name, parent_names, reg) \
  350. _imx8m_clk_hw_composite(name, parent_names, reg, \
  351. IMX_COMPOSITE_BUS, IMX_COMPOSITE_CLK_FLAGS_CRITICAL)
  352. #define imx8m_clk_hw_composite_core(name, parent_names, reg) \
  353. _imx8m_clk_hw_composite(name, parent_names, reg, \
  354. IMX_COMPOSITE_CORE, IMX_COMPOSITE_CLK_FLAGS_DEFAULT)
  355. #define imx8m_clk_hw_fw_managed_composite(name, parent_names, reg) \
  356. _imx8m_clk_hw_composite(name, parent_names, reg, \
  357. IMX_COMPOSITE_FW_MANAGED, \
  358. IMX_COMPOSITE_CLK_FLAGS_GET_RATE_NO_CACHE)
  359. #define imx8m_clk_hw_fw_managed_composite_critical(name, parent_names, reg) \
  360. _imx8m_clk_hw_composite(name, parent_names, reg, \
  361. IMX_COMPOSITE_FW_MANAGED, \
  362. IMX_COMPOSITE_CLK_FLAGS_CRITICAL_GET_RATE_NO_CACHE)
  363. struct clk_hw *imx93_clk_composite_flags(const char *name,
  364. const char * const *parent_names,
  365. int num_parents,
  366. void __iomem *reg,
  367. u32 domain_id,
  368. unsigned long flags);
  369. #define imx93_clk_composite(name, parent_names, num_parents, reg, domain_id) \
  370. imx93_clk_composite_flags(name, parent_names, num_parents, reg, domain_id \
  371. CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
  372. struct clk_hw *imx93_clk_gate(struct device *dev, const char *name, const char *parent_name,
  373. unsigned long flags, void __iomem *reg, u32 bit_idx, u32 val,
  374. u32 mask, u32 domain_id, unsigned int *share_count);
  375. struct clk_hw *imx_clk_hw_divider_gate(const char *name, const char *parent_name,
  376. unsigned long flags, void __iomem *reg, u8 shift, u8 width,
  377. u8 clk_divider_flags, const struct clk_div_table *table,
  378. spinlock_t *lock);
  379. struct clk_hw *imx_clk_gpr_mux(const char *name, const char *compatible,
  380. u32 reg, const char **parent_names,
  381. u8 num_parents, const u32 *mux_table, u32 mask);
  382. #endif