clk-pll.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2014 MediaTek Inc.
  4. * Author: James Liao <jamesjj.liao@mediatek.com>
  5. */
  6. #include <linux/clk-provider.h>
  7. #include <linux/container_of.h>
  8. #include <linux/delay.h>
  9. #include <linux/err.h>
  10. #include <linux/io.h>
  11. #include <linux/module.h>
  12. #include <linux/of_address.h>
  13. #include <linux/slab.h>
  14. #include "clk-pll.h"
  15. #define MHZ (1000 * 1000)
  16. #define REG_CON0 0
  17. #define REG_CON1 4
  18. #define CON0_BASE_EN BIT(0)
  19. #define CON0_PWR_ON BIT(0)
  20. #define CON0_ISO_EN BIT(1)
  21. #define PCW_CHG_BIT 31
  22. #define AUDPLL_TUNER_EN BIT(31)
  23. /* default 7 bits integer, can be overridden with pcwibits. */
  24. #define INTEGER_BITS 7
  25. int mtk_pll_is_prepared(struct clk_hw *hw)
  26. {
  27. struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
  28. return (readl(pll->en_addr) & BIT(pll->data->pll_en_bit)) != 0;
  29. }
  30. static unsigned long __mtk_pll_recalc_rate(struct mtk_clk_pll *pll, u32 fin,
  31. u32 pcw, int postdiv)
  32. {
  33. int pcwbits = pll->data->pcwbits;
  34. int pcwfbits = 0;
  35. int ibits;
  36. u64 vco;
  37. u8 c = 0;
  38. /* The fractional part of the PLL divider. */
  39. ibits = pll->data->pcwibits ? pll->data->pcwibits : INTEGER_BITS;
  40. if (pcwbits > ibits)
  41. pcwfbits = pcwbits - ibits;
  42. vco = (u64)fin * pcw;
  43. if (pcwfbits && (vco & GENMASK(pcwfbits - 1, 0)))
  44. c = 1;
  45. vco >>= pcwfbits;
  46. if (c)
  47. vco++;
  48. return ((unsigned long)vco + postdiv - 1) / postdiv;
  49. }
  50. static void __mtk_pll_tuner_enable(struct mtk_clk_pll *pll)
  51. {
  52. u32 r;
  53. if (pll->tuner_en_addr) {
  54. r = readl(pll->tuner_en_addr) | BIT(pll->data->tuner_en_bit);
  55. writel(r, pll->tuner_en_addr);
  56. } else if (pll->tuner_addr) {
  57. r = readl(pll->tuner_addr) | AUDPLL_TUNER_EN;
  58. writel(r, pll->tuner_addr);
  59. }
  60. }
  61. static void __mtk_pll_tuner_disable(struct mtk_clk_pll *pll)
  62. {
  63. u32 r;
  64. if (pll->tuner_en_addr) {
  65. r = readl(pll->tuner_en_addr) & ~BIT(pll->data->tuner_en_bit);
  66. writel(r, pll->tuner_en_addr);
  67. } else if (pll->tuner_addr) {
  68. r = readl(pll->tuner_addr) & ~AUDPLL_TUNER_EN;
  69. writel(r, pll->tuner_addr);
  70. }
  71. }
  72. static void mtk_pll_set_rate_regs(struct mtk_clk_pll *pll, u32 pcw,
  73. int postdiv)
  74. {
  75. u32 chg, val;
  76. /* disable tuner */
  77. __mtk_pll_tuner_disable(pll);
  78. /* set postdiv */
  79. val = readl(pll->pd_addr);
  80. val &= ~(POSTDIV_MASK << pll->data->pd_shift);
  81. val |= (ffs(postdiv) - 1) << pll->data->pd_shift;
  82. /* postdiv and pcw need to set at the same time if on same register */
  83. if (pll->pd_addr != pll->pcw_addr) {
  84. writel(val, pll->pd_addr);
  85. val = readl(pll->pcw_addr);
  86. }
  87. /* set pcw */
  88. val &= ~GENMASK(pll->data->pcw_shift + pll->data->pcwbits - 1,
  89. pll->data->pcw_shift);
  90. val |= pcw << pll->data->pcw_shift;
  91. writel(val, pll->pcw_addr);
  92. chg = readl(pll->pcw_chg_addr) |
  93. BIT(pll->data->pcw_chg_bit ? : PCW_CHG_BIT);
  94. writel(chg, pll->pcw_chg_addr);
  95. if (pll->tuner_addr)
  96. writel(val + 1, pll->tuner_addr);
  97. /* restore tuner_en */
  98. __mtk_pll_tuner_enable(pll);
  99. udelay(20);
  100. }
  101. /*
  102. * mtk_pll_calc_values - calculate good values for a given input frequency.
  103. * @pll: The pll
  104. * @pcw: The pcw value (output)
  105. * @postdiv: The post divider (output)
  106. * @freq: The desired target frequency
  107. * @fin: The input frequency
  108. *
  109. */
  110. void mtk_pll_calc_values(struct mtk_clk_pll *pll, u32 *pcw, u32 *postdiv,
  111. u32 freq, u32 fin)
  112. {
  113. unsigned long fmin = pll->data->fmin ? pll->data->fmin : (1000 * MHZ);
  114. const struct mtk_pll_div_table *div_table = pll->data->div_table;
  115. u64 _pcw;
  116. int ibits;
  117. u32 val;
  118. if (freq > pll->data->fmax)
  119. freq = pll->data->fmax;
  120. if (div_table) {
  121. if (freq > div_table[0].freq)
  122. freq = div_table[0].freq;
  123. for (val = 0; div_table[val + 1].freq != 0; val++) {
  124. if (freq > div_table[val + 1].freq)
  125. break;
  126. }
  127. *postdiv = 1 << val;
  128. } else {
  129. for (val = 0; val < 5; val++) {
  130. *postdiv = 1 << val;
  131. if ((u64)freq * *postdiv >= fmin)
  132. break;
  133. }
  134. }
  135. /* _pcw = freq * postdiv / fin * 2^pcwfbits */
  136. ibits = pll->data->pcwibits ? pll->data->pcwibits : INTEGER_BITS;
  137. _pcw = ((u64)freq << val) << (pll->data->pcwbits - ibits);
  138. do_div(_pcw, fin);
  139. *pcw = (u32)_pcw;
  140. }
  141. int mtk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
  142. unsigned long parent_rate)
  143. {
  144. struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
  145. u32 pcw = 0;
  146. u32 postdiv;
  147. mtk_pll_calc_values(pll, &pcw, &postdiv, rate, parent_rate);
  148. mtk_pll_set_rate_regs(pll, pcw, postdiv);
  149. return 0;
  150. }
  151. unsigned long mtk_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
  152. {
  153. struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
  154. u32 postdiv;
  155. u32 pcw;
  156. postdiv = (readl(pll->pd_addr) >> pll->data->pd_shift) & POSTDIV_MASK;
  157. postdiv = 1 << postdiv;
  158. pcw = readl(pll->pcw_addr) >> pll->data->pcw_shift;
  159. pcw &= GENMASK(pll->data->pcwbits - 1, 0);
  160. return __mtk_pll_recalc_rate(pll, parent_rate, pcw, postdiv);
  161. }
  162. long mtk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
  163. unsigned long *prate)
  164. {
  165. struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
  166. u32 pcw = 0;
  167. int postdiv;
  168. mtk_pll_calc_values(pll, &pcw, &postdiv, rate, *prate);
  169. return __mtk_pll_recalc_rate(pll, *prate, pcw, postdiv);
  170. }
  171. int mtk_pll_prepare(struct clk_hw *hw)
  172. {
  173. struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
  174. u32 r;
  175. r = readl(pll->pwr_addr) | CON0_PWR_ON;
  176. writel(r, pll->pwr_addr);
  177. udelay(1);
  178. r = readl(pll->pwr_addr) & ~CON0_ISO_EN;
  179. writel(r, pll->pwr_addr);
  180. udelay(1);
  181. r = readl(pll->en_addr) | BIT(pll->data->pll_en_bit);
  182. writel(r, pll->en_addr);
  183. if (pll->data->en_mask) {
  184. r = readl(pll->base_addr + REG_CON0) | pll->data->en_mask;
  185. writel(r, pll->base_addr + REG_CON0);
  186. }
  187. __mtk_pll_tuner_enable(pll);
  188. udelay(20);
  189. if (pll->data->flags & HAVE_RST_BAR) {
  190. r = readl(pll->base_addr + REG_CON0);
  191. r |= pll->data->rst_bar_mask;
  192. writel(r, pll->base_addr + REG_CON0);
  193. }
  194. return 0;
  195. }
  196. void mtk_pll_unprepare(struct clk_hw *hw)
  197. {
  198. struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
  199. u32 r;
  200. if (pll->data->flags & HAVE_RST_BAR) {
  201. r = readl(pll->base_addr + REG_CON0);
  202. r &= ~pll->data->rst_bar_mask;
  203. writel(r, pll->base_addr + REG_CON0);
  204. }
  205. __mtk_pll_tuner_disable(pll);
  206. if (pll->data->en_mask) {
  207. r = readl(pll->base_addr + REG_CON0) & ~pll->data->en_mask;
  208. writel(r, pll->base_addr + REG_CON0);
  209. }
  210. r = readl(pll->en_addr) & ~BIT(pll->data->pll_en_bit);
  211. writel(r, pll->en_addr);
  212. r = readl(pll->pwr_addr) | CON0_ISO_EN;
  213. writel(r, pll->pwr_addr);
  214. r = readl(pll->pwr_addr) & ~CON0_PWR_ON;
  215. writel(r, pll->pwr_addr);
  216. }
  217. const struct clk_ops mtk_pll_ops = {
  218. .is_prepared = mtk_pll_is_prepared,
  219. .prepare = mtk_pll_prepare,
  220. .unprepare = mtk_pll_unprepare,
  221. .recalc_rate = mtk_pll_recalc_rate,
  222. .round_rate = mtk_pll_round_rate,
  223. .set_rate = mtk_pll_set_rate,
  224. };
  225. struct clk_hw *mtk_clk_register_pll_ops(struct mtk_clk_pll *pll,
  226. const struct mtk_pll_data *data,
  227. void __iomem *base,
  228. const struct clk_ops *pll_ops)
  229. {
  230. struct clk_init_data init = {};
  231. int ret;
  232. const char *parent_name = "clk26m";
  233. pll->base_addr = base + data->reg;
  234. pll->pwr_addr = base + data->pwr_reg;
  235. pll->pd_addr = base + data->pd_reg;
  236. pll->pcw_addr = base + data->pcw_reg;
  237. if (data->pcw_chg_reg)
  238. pll->pcw_chg_addr = base + data->pcw_chg_reg;
  239. else
  240. pll->pcw_chg_addr = pll->base_addr + REG_CON1;
  241. if (data->tuner_reg)
  242. pll->tuner_addr = base + data->tuner_reg;
  243. if (data->tuner_en_reg || data->tuner_en_bit)
  244. pll->tuner_en_addr = base + data->tuner_en_reg;
  245. if (data->en_reg)
  246. pll->en_addr = base + data->en_reg;
  247. else
  248. pll->en_addr = pll->base_addr + REG_CON0;
  249. pll->hw.init = &init;
  250. pll->data = data;
  251. init.name = data->name;
  252. init.flags = (data->flags & PLL_AO) ? CLK_IS_CRITICAL : 0;
  253. init.ops = pll_ops;
  254. if (data->parent_name)
  255. init.parent_names = &data->parent_name;
  256. else
  257. init.parent_names = &parent_name;
  258. init.num_parents = 1;
  259. ret = clk_hw_register(NULL, &pll->hw);
  260. if (ret)
  261. return ERR_PTR(ret);
  262. return &pll->hw;
  263. }
  264. struct clk_hw *mtk_clk_register_pll(const struct mtk_pll_data *data,
  265. void __iomem *base)
  266. {
  267. struct mtk_clk_pll *pll;
  268. struct clk_hw *hw;
  269. pll = kzalloc(sizeof(*pll), GFP_KERNEL);
  270. if (!pll)
  271. return ERR_PTR(-ENOMEM);
  272. hw = mtk_clk_register_pll_ops(pll, data, base, &mtk_pll_ops);
  273. if (IS_ERR(hw))
  274. kfree(pll);
  275. return hw;
  276. }
  277. void mtk_clk_unregister_pll(struct clk_hw *hw)
  278. {
  279. struct mtk_clk_pll *pll;
  280. if (!hw)
  281. return;
  282. pll = to_mtk_clk_pll(hw);
  283. clk_hw_unregister(hw);
  284. kfree(pll);
  285. }
  286. int mtk_clk_register_plls(struct device_node *node,
  287. const struct mtk_pll_data *plls, int num_plls,
  288. struct clk_hw_onecell_data *clk_data)
  289. {
  290. void __iomem *base;
  291. int i;
  292. struct clk_hw *hw;
  293. base = of_iomap(node, 0);
  294. if (!base) {
  295. pr_err("%s(): ioremap failed\n", __func__);
  296. return -EINVAL;
  297. }
  298. for (i = 0; i < num_plls; i++) {
  299. const struct mtk_pll_data *pll = &plls[i];
  300. if (!IS_ERR_OR_NULL(clk_data->hws[pll->id])) {
  301. pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
  302. node, pll->id);
  303. continue;
  304. }
  305. hw = mtk_clk_register_pll(pll, base);
  306. if (IS_ERR(hw)) {
  307. pr_err("Failed to register clk %s: %pe\n", pll->name,
  308. hw);
  309. goto err;
  310. }
  311. clk_data->hws[pll->id] = hw;
  312. }
  313. return 0;
  314. err:
  315. while (--i >= 0) {
  316. const struct mtk_pll_data *pll = &plls[i];
  317. mtk_clk_unregister_pll(clk_data->hws[pll->id]);
  318. clk_data->hws[pll->id] = ERR_PTR(-ENOENT);
  319. }
  320. iounmap(base);
  321. return PTR_ERR(hw);
  322. }
  323. EXPORT_SYMBOL_GPL(mtk_clk_register_plls);
  324. __iomem void *mtk_clk_pll_get_base(struct clk_hw *hw,
  325. const struct mtk_pll_data *data)
  326. {
  327. struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
  328. return pll->base_addr - data->reg;
  329. }
  330. void mtk_clk_unregister_plls(const struct mtk_pll_data *plls, int num_plls,
  331. struct clk_hw_onecell_data *clk_data)
  332. {
  333. __iomem void *base = NULL;
  334. int i;
  335. if (!clk_data)
  336. return;
  337. for (i = num_plls; i > 0; i--) {
  338. const struct mtk_pll_data *pll = &plls[i - 1];
  339. if (IS_ERR_OR_NULL(clk_data->hws[pll->id]))
  340. continue;
  341. /*
  342. * This is quite ugly but unfortunately the clks don't have
  343. * any device tied to them, so there's no place to store the
  344. * pointer to the I/O region base address. We have to fetch
  345. * it from one of the registered clks.
  346. */
  347. base = mtk_clk_pll_get_base(clk_data->hws[pll->id], pll);
  348. mtk_clk_unregister_pll(clk_data->hws[pll->id]);
  349. clk_data->hws[pll->id] = ERR_PTR(-ENOENT);
  350. }
  351. iounmap(base);
  352. }
  353. EXPORT_SYMBOL_GPL(mtk_clk_unregister_plls);
  354. MODULE_LICENSE("GPL");