clk-vco-pll.c 8.8 KB

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