clk-vco-pll.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2012 ST Microelectronics
  4. * Viresh Kumar <[email protected]>
  5. *
  6. * VCO-PLL clock implementation
  7. */
  8. #define pr_fmt(fmt) "clk-vco-pll: " fmt
  9. #include <linux/clk-provider.h>
  10. #include <linux/slab.h>
  11. #include <linux/io.h>
  12. #include <linux/err.h>
  13. #include "clk.h"
  14. /*
  15. * DOC: VCO-PLL clock
  16. *
  17. * VCO and PLL rate are derived from following equations:
  18. *
  19. * In normal mode
  20. * vco = (2 * M[15:8] * Fin)/N
  21. *
  22. * In Dithered mode
  23. * vco = (2 * M[15:0] * Fin)/(256 * N)
  24. *
  25. * pll_rate = pll/2^p
  26. *
  27. * vco and pll are very closely bound to each other, "vco needs to program:
  28. * mode, m & n" and "pll needs to program p", both share common enable/disable
  29. * logic.
  30. *
  31. * clk_register_vco_pll() registers instances of both vco & pll.
  32. * CLK_SET_RATE_PARENT flag is forced for pll, as it will always pass its
  33. * set_rate to vco. A single rate table exists for both the clocks, which
  34. * configures m, n and p.
  35. */
  36. /* PLL_CTR register masks */
  37. #define PLL_MODE_NORMAL 0
  38. #define PLL_MODE_FRACTION 1
  39. #define PLL_MODE_DITH_DSM 2
  40. #define PLL_MODE_DITH_SSM 3
  41. #define PLL_MODE_MASK 3
  42. #define PLL_MODE_SHIFT 3
  43. #define PLL_ENABLE 2
  44. #define PLL_LOCK_SHIFT 0
  45. #define PLL_LOCK_MASK 1
  46. /* PLL FRQ register masks */
  47. #define PLL_NORM_FDBK_M_MASK 0xFF
  48. #define PLL_NORM_FDBK_M_SHIFT 24
  49. #define PLL_DITH_FDBK_M_MASK 0xFFFF
  50. #define PLL_DITH_FDBK_M_SHIFT 16
  51. #define PLL_DIV_P_MASK 0x7
  52. #define PLL_DIV_P_SHIFT 8
  53. #define PLL_DIV_N_MASK 0xFF
  54. #define PLL_DIV_N_SHIFT 0
  55. #define to_clk_vco(_hw) container_of(_hw, struct clk_vco, hw)
  56. #define to_clk_pll(_hw) container_of(_hw, struct clk_pll, hw)
  57. /* Calculates pll clk rate for specific value of mode, m, n and p */
  58. static unsigned long pll_calc_rate(struct pll_rate_tbl *rtbl,
  59. unsigned long prate, int index, unsigned long *pll_rate)
  60. {
  61. unsigned long rate = prate;
  62. unsigned int mode;
  63. mode = rtbl[index].mode ? 256 : 1;
  64. rate = (((2 * rate / 10000) * rtbl[index].m) / (mode * rtbl[index].n));
  65. if (pll_rate)
  66. *pll_rate = (rate / (1 << rtbl[index].p)) * 10000;
  67. return rate * 10000;
  68. }
  69. static long clk_pll_round_rate_index(struct clk_hw *hw, unsigned long drate,
  70. unsigned long *prate, int *index)
  71. {
  72. struct clk_pll *pll = to_clk_pll(hw);
  73. unsigned long prev_rate, vco_prev_rate, rate = 0;
  74. unsigned long vco_parent_rate =
  75. clk_hw_get_rate(clk_hw_get_parent(clk_hw_get_parent(hw)));
  76. if (!prate) {
  77. pr_err("%s: prate is must for pll clk\n", __func__);
  78. return -EINVAL;
  79. }
  80. for (*index = 0; *index < pll->vco->rtbl_cnt; (*index)++) {
  81. prev_rate = rate;
  82. vco_prev_rate = *prate;
  83. *prate = pll_calc_rate(pll->vco->rtbl, vco_parent_rate, *index,
  84. &rate);
  85. if (drate < rate) {
  86. /* previous clock was best */
  87. if (*index) {
  88. rate = prev_rate;
  89. *prate = vco_prev_rate;
  90. (*index)--;
  91. }
  92. break;
  93. }
  94. }
  95. return rate;
  96. }
  97. static long clk_pll_round_rate(struct clk_hw *hw, unsigned long drate,
  98. unsigned long *prate)
  99. {
  100. int unused;
  101. return clk_pll_round_rate_index(hw, drate, prate, &unused);
  102. }
  103. static unsigned long clk_pll_recalc_rate(struct clk_hw *hw, unsigned long
  104. parent_rate)
  105. {
  106. struct clk_pll *pll = to_clk_pll(hw);
  107. unsigned long flags = 0;
  108. unsigned int p;
  109. if (pll->vco->lock)
  110. spin_lock_irqsave(pll->vco->lock, flags);
  111. p = readl_relaxed(pll->vco->cfg_reg);
  112. if (pll->vco->lock)
  113. spin_unlock_irqrestore(pll->vco->lock, flags);
  114. p = (p >> PLL_DIV_P_SHIFT) & PLL_DIV_P_MASK;
  115. return parent_rate / (1 << p);
  116. }
  117. static int clk_pll_set_rate(struct clk_hw *hw, unsigned long drate,
  118. unsigned long prate)
  119. {
  120. struct clk_pll *pll = to_clk_pll(hw);
  121. struct pll_rate_tbl *rtbl = pll->vco->rtbl;
  122. unsigned long flags = 0, val;
  123. int i = 0;
  124. clk_pll_round_rate_index(hw, drate, NULL, &i);
  125. if (pll->vco->lock)
  126. spin_lock_irqsave(pll->vco->lock, flags);
  127. val = readl_relaxed(pll->vco->cfg_reg);
  128. val &= ~(PLL_DIV_P_MASK << PLL_DIV_P_SHIFT);
  129. val |= (rtbl[i].p & PLL_DIV_P_MASK) << PLL_DIV_P_SHIFT;
  130. writel_relaxed(val, pll->vco->cfg_reg);
  131. if (pll->vco->lock)
  132. spin_unlock_irqrestore(pll->vco->lock, flags);
  133. return 0;
  134. }
  135. static const struct clk_ops clk_pll_ops = {
  136. .recalc_rate = clk_pll_recalc_rate,
  137. .round_rate = clk_pll_round_rate,
  138. .set_rate = clk_pll_set_rate,
  139. };
  140. static inline unsigned long vco_calc_rate(struct clk_hw *hw,
  141. unsigned long prate, int index)
  142. {
  143. struct clk_vco *vco = to_clk_vco(hw);
  144. return pll_calc_rate(vco->rtbl, prate, index, NULL);
  145. }
  146. static long clk_vco_round_rate(struct clk_hw *hw, unsigned long drate,
  147. unsigned long *prate)
  148. {
  149. struct clk_vco *vco = to_clk_vco(hw);
  150. int unused;
  151. return clk_round_rate_index(hw, drate, *prate, vco_calc_rate,
  152. vco->rtbl_cnt, &unused);
  153. }
  154. static unsigned long clk_vco_recalc_rate(struct clk_hw *hw,
  155. unsigned long parent_rate)
  156. {
  157. struct clk_vco *vco = to_clk_vco(hw);
  158. unsigned long flags = 0;
  159. unsigned int num = 2, den = 0, val, mode = 0;
  160. if (vco->lock)
  161. spin_lock_irqsave(vco->lock, flags);
  162. mode = (readl_relaxed(vco->mode_reg) >> PLL_MODE_SHIFT) & PLL_MODE_MASK;
  163. val = readl_relaxed(vco->cfg_reg);
  164. if (vco->lock)
  165. spin_unlock_irqrestore(vco->lock, flags);
  166. den = (val >> PLL_DIV_N_SHIFT) & PLL_DIV_N_MASK;
  167. /* calculate numerator & denominator */
  168. if (!mode) {
  169. /* Normal mode */
  170. num *= (val >> PLL_NORM_FDBK_M_SHIFT) & PLL_NORM_FDBK_M_MASK;
  171. } else {
  172. /* Dithered mode */
  173. num *= (val >> PLL_DITH_FDBK_M_SHIFT) & PLL_DITH_FDBK_M_MASK;
  174. den *= 256;
  175. }
  176. if (!den) {
  177. WARN(1, "%s: denominator can't be zero\n", __func__);
  178. return 0;
  179. }
  180. return (((parent_rate / 10000) * num) / den) * 10000;
  181. }
  182. /* Configures new clock rate of vco */
  183. static int clk_vco_set_rate(struct clk_hw *hw, unsigned long drate,
  184. unsigned long prate)
  185. {
  186. struct clk_vco *vco = to_clk_vco(hw);
  187. struct pll_rate_tbl *rtbl = vco->rtbl;
  188. unsigned long flags = 0, val;
  189. int i;
  190. clk_round_rate_index(hw, drate, prate, vco_calc_rate, vco->rtbl_cnt,
  191. &i);
  192. if (vco->lock)
  193. spin_lock_irqsave(vco->lock, flags);
  194. val = readl_relaxed(vco->mode_reg);
  195. val &= ~(PLL_MODE_MASK << PLL_MODE_SHIFT);
  196. val |= (rtbl[i].mode & PLL_MODE_MASK) << PLL_MODE_SHIFT;
  197. writel_relaxed(val, vco->mode_reg);
  198. val = readl_relaxed(vco->cfg_reg);
  199. val &= ~(PLL_DIV_N_MASK << PLL_DIV_N_SHIFT);
  200. val |= (rtbl[i].n & PLL_DIV_N_MASK) << PLL_DIV_N_SHIFT;
  201. val &= ~(PLL_DITH_FDBK_M_MASK << PLL_DITH_FDBK_M_SHIFT);
  202. if (rtbl[i].mode)
  203. val |= (rtbl[i].m & PLL_DITH_FDBK_M_MASK) <<
  204. PLL_DITH_FDBK_M_SHIFT;
  205. else
  206. val |= (rtbl[i].m & PLL_NORM_FDBK_M_MASK) <<
  207. PLL_NORM_FDBK_M_SHIFT;
  208. writel_relaxed(val, vco->cfg_reg);
  209. if (vco->lock)
  210. spin_unlock_irqrestore(vco->lock, flags);
  211. return 0;
  212. }
  213. static const struct clk_ops clk_vco_ops = {
  214. .recalc_rate = clk_vco_recalc_rate,
  215. .round_rate = clk_vco_round_rate,
  216. .set_rate = clk_vco_set_rate,
  217. };
  218. struct clk *clk_register_vco_pll(const char *vco_name, const char *pll_name,
  219. const char *vco_gate_name, const char *parent_name,
  220. unsigned long flags, void __iomem *mode_reg, void __iomem
  221. *cfg_reg, struct pll_rate_tbl *rtbl, u8 rtbl_cnt,
  222. spinlock_t *lock, struct clk **pll_clk,
  223. struct clk **vco_gate_clk)
  224. {
  225. struct clk_vco *vco;
  226. struct clk_pll *pll;
  227. struct clk *vco_clk, *tpll_clk, *tvco_gate_clk;
  228. struct clk_init_data vco_init, pll_init;
  229. const char **vco_parent_name;
  230. if (!vco_name || !pll_name || !parent_name || !mode_reg || !cfg_reg ||
  231. !rtbl || !rtbl_cnt) {
  232. pr_err("Invalid arguments passed");
  233. return ERR_PTR(-EINVAL);
  234. }
  235. vco = kzalloc(sizeof(*vco), GFP_KERNEL);
  236. if (!vco)
  237. return ERR_PTR(-ENOMEM);
  238. pll = kzalloc(sizeof(*pll), GFP_KERNEL);
  239. if (!pll)
  240. goto free_vco;
  241. /* struct clk_vco assignments */
  242. vco->mode_reg = mode_reg;
  243. vco->cfg_reg = cfg_reg;
  244. vco->rtbl = rtbl;
  245. vco->rtbl_cnt = rtbl_cnt;
  246. vco->lock = lock;
  247. vco->hw.init = &vco_init;
  248. pll->vco = vco;
  249. pll->hw.init = &pll_init;
  250. if (vco_gate_name) {
  251. tvco_gate_clk = clk_register_gate(NULL, vco_gate_name,
  252. parent_name, 0, mode_reg, PLL_ENABLE, 0, lock);
  253. if (IS_ERR_OR_NULL(tvco_gate_clk))
  254. goto free_pll;
  255. if (vco_gate_clk)
  256. *vco_gate_clk = tvco_gate_clk;
  257. vco_parent_name = &vco_gate_name;
  258. } else {
  259. vco_parent_name = &parent_name;
  260. }
  261. vco_init.name = vco_name;
  262. vco_init.ops = &clk_vco_ops;
  263. vco_init.flags = flags;
  264. vco_init.parent_names = vco_parent_name;
  265. vco_init.num_parents = 1;
  266. pll_init.name = pll_name;
  267. pll_init.ops = &clk_pll_ops;
  268. pll_init.flags = CLK_SET_RATE_PARENT;
  269. pll_init.parent_names = &vco_name;
  270. pll_init.num_parents = 1;
  271. vco_clk = clk_register(NULL, &vco->hw);
  272. if (IS_ERR_OR_NULL(vco_clk))
  273. goto free_pll;
  274. tpll_clk = clk_register(NULL, &pll->hw);
  275. if (IS_ERR_OR_NULL(tpll_clk))
  276. goto free_pll;
  277. if (pll_clk)
  278. *pll_clk = tpll_clk;
  279. return vco_clk;
  280. free_pll:
  281. kfree(pll);
  282. free_vco:
  283. kfree(vco);
  284. pr_err("Failed to register vco pll clock\n");
  285. return ERR_PTR(-ENOMEM);
  286. }