pll.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Toshiba Visconti PLL driver
  4. *
  5. * Copyright (c) 2021 TOSHIBA CORPORATION
  6. * Copyright (c) 2021 Toshiba Electronic Devices & Storage Corporation
  7. *
  8. * Nobuhiro Iwamatsu <[email protected]>
  9. */
  10. #include <linux/bitfield.h>
  11. #include <linux/clk-provider.h>
  12. #include <linux/delay.h>
  13. #include <linux/slab.h>
  14. #include <linux/io.h>
  15. #include "pll.h"
  16. struct visconti_pll {
  17. struct clk_hw hw;
  18. void __iomem *pll_base;
  19. spinlock_t *lock;
  20. unsigned long flags;
  21. const struct visconti_pll_rate_table *rate_table;
  22. size_t rate_count;
  23. struct visconti_pll_provider *ctx;
  24. };
  25. #define PLL_CONF_REG 0x0000
  26. #define PLL_CTRL_REG 0x0004
  27. #define PLL_FRACMODE_REG 0x0010
  28. #define PLL_INTIN_REG 0x0014
  29. #define PLL_FRACIN_REG 0x0018
  30. #define PLL_REFDIV_REG 0x001c
  31. #define PLL_POSTDIV_REG 0x0020
  32. #define PLL_CONFIG_SEL BIT(0)
  33. #define PLL_PLLEN BIT(4)
  34. #define PLL_BYPASS BIT(16)
  35. #define PLL_INTIN_MASK GENMASK(11, 0)
  36. #define PLL_FRACIN_MASK GENMASK(23, 0)
  37. #define PLL_REFDIV_MASK GENMASK(5, 0)
  38. #define PLL_POSTDIV_MASK GENMASK(2, 0)
  39. #define PLL0_FRACMODE_DACEN BIT(4)
  40. #define PLL0_FRACMODE_DSMEN BIT(0)
  41. #define PLL_CREATE_FRACMODE(table) (table->dacen << 4 | table->dsmen)
  42. #define PLL_CREATE_OSTDIV(table) (table->postdiv2 << 4 | table->postdiv1)
  43. static inline struct visconti_pll *to_visconti_pll(struct clk_hw *hw)
  44. {
  45. return container_of(hw, struct visconti_pll, hw);
  46. }
  47. static void visconti_pll_get_params(struct visconti_pll *pll,
  48. struct visconti_pll_rate_table *rate_table)
  49. {
  50. u32 postdiv, val;
  51. val = readl(pll->pll_base + PLL_FRACMODE_REG);
  52. rate_table->dacen = FIELD_GET(PLL0_FRACMODE_DACEN, val);
  53. rate_table->dsmen = FIELD_GET(PLL0_FRACMODE_DSMEN, val);
  54. rate_table->fracin = readl(pll->pll_base + PLL_FRACIN_REG) & PLL_FRACIN_MASK;
  55. rate_table->intin = readl(pll->pll_base + PLL_INTIN_REG) & PLL_INTIN_MASK;
  56. rate_table->refdiv = readl(pll->pll_base + PLL_REFDIV_REG) & PLL_REFDIV_MASK;
  57. postdiv = readl(pll->pll_base + PLL_POSTDIV_REG);
  58. rate_table->postdiv1 = postdiv & PLL_POSTDIV_MASK;
  59. rate_table->postdiv2 = (postdiv >> 4) & PLL_POSTDIV_MASK;
  60. }
  61. static const struct visconti_pll_rate_table *visconti_get_pll_settings(struct visconti_pll *pll,
  62. unsigned long rate)
  63. {
  64. const struct visconti_pll_rate_table *rate_table = pll->rate_table;
  65. int i;
  66. for (i = 0; i < pll->rate_count; i++)
  67. if (rate == rate_table[i].rate)
  68. return &rate_table[i];
  69. return NULL;
  70. }
  71. static unsigned long visconti_get_pll_rate_from_data(struct visconti_pll *pll,
  72. const struct visconti_pll_rate_table *rate)
  73. {
  74. const struct visconti_pll_rate_table *rate_table = pll->rate_table;
  75. int i;
  76. for (i = 0; i < pll->rate_count; i++)
  77. if (memcmp(&rate_table[i].dacen, &rate->dacen,
  78. sizeof(*rate) - sizeof(unsigned long)) == 0)
  79. return rate_table[i].rate;
  80. /* set default */
  81. return rate_table[0].rate;
  82. }
  83. static long visconti_pll_round_rate(struct clk_hw *hw,
  84. unsigned long rate, unsigned long *prate)
  85. {
  86. struct visconti_pll *pll = to_visconti_pll(hw);
  87. const struct visconti_pll_rate_table *rate_table = pll->rate_table;
  88. int i;
  89. /* Assumming rate_table is in descending order */
  90. for (i = 0; i < pll->rate_count; i++)
  91. if (rate >= rate_table[i].rate)
  92. return rate_table[i].rate;
  93. /* return minimum supported value */
  94. return rate_table[i - 1].rate;
  95. }
  96. static unsigned long visconti_pll_recalc_rate(struct clk_hw *hw,
  97. unsigned long parent_rate)
  98. {
  99. struct visconti_pll *pll = to_visconti_pll(hw);
  100. struct visconti_pll_rate_table rate_table;
  101. memset(&rate_table, 0, sizeof(rate_table));
  102. visconti_pll_get_params(pll, &rate_table);
  103. return visconti_get_pll_rate_from_data(pll, &rate_table);
  104. }
  105. static int visconti_pll_set_params(struct visconti_pll *pll,
  106. const struct visconti_pll_rate_table *rate_table)
  107. {
  108. writel(PLL_CREATE_FRACMODE(rate_table), pll->pll_base + PLL_FRACMODE_REG);
  109. writel(PLL_CREATE_OSTDIV(rate_table), pll->pll_base + PLL_POSTDIV_REG);
  110. writel(rate_table->intin, pll->pll_base + PLL_INTIN_REG);
  111. writel(rate_table->fracin, pll->pll_base + PLL_FRACIN_REG);
  112. writel(rate_table->refdiv, pll->pll_base + PLL_REFDIV_REG);
  113. return 0;
  114. }
  115. static int visconti_pll_set_rate(struct clk_hw *hw, unsigned long rate,
  116. unsigned long parent_rate)
  117. {
  118. struct visconti_pll *pll = to_visconti_pll(hw);
  119. const struct visconti_pll_rate_table *rate_table;
  120. rate_table = visconti_get_pll_settings(pll, rate);
  121. if (!rate_table)
  122. return -EINVAL;
  123. return visconti_pll_set_params(pll, rate_table);
  124. }
  125. static int visconti_pll_is_enabled(struct clk_hw *hw)
  126. {
  127. struct visconti_pll *pll = to_visconti_pll(hw);
  128. u32 reg;
  129. reg = readl(pll->pll_base + PLL_CTRL_REG);
  130. return (reg & PLL_PLLEN);
  131. }
  132. static int visconti_pll_enable(struct clk_hw *hw)
  133. {
  134. struct visconti_pll *pll = to_visconti_pll(hw);
  135. const struct visconti_pll_rate_table *rate_table = pll->rate_table;
  136. unsigned long flags;
  137. u32 reg;
  138. if (visconti_pll_is_enabled(hw))
  139. return 0;
  140. spin_lock_irqsave(pll->lock, flags);
  141. writel(PLL_CONFIG_SEL, pll->pll_base + PLL_CONF_REG);
  142. reg = readl(pll->pll_base + PLL_CTRL_REG);
  143. reg |= PLL_BYPASS;
  144. writel(reg, pll->pll_base + PLL_CTRL_REG);
  145. visconti_pll_set_params(pll, &rate_table[0]);
  146. reg = readl(pll->pll_base + PLL_CTRL_REG);
  147. reg &= ~PLL_PLLEN;
  148. writel(reg, pll->pll_base + PLL_CTRL_REG);
  149. udelay(1);
  150. reg = readl(pll->pll_base + PLL_CTRL_REG);
  151. reg |= PLL_PLLEN;
  152. writel(reg, pll->pll_base + PLL_CTRL_REG);
  153. udelay(40);
  154. reg = readl(pll->pll_base + PLL_CTRL_REG);
  155. reg &= ~PLL_BYPASS;
  156. writel(reg, pll->pll_base + PLL_CTRL_REG);
  157. spin_unlock_irqrestore(pll->lock, flags);
  158. return 0;
  159. }
  160. static void visconti_pll_disable(struct clk_hw *hw)
  161. {
  162. struct visconti_pll *pll = to_visconti_pll(hw);
  163. unsigned long flags;
  164. u32 reg;
  165. if (!visconti_pll_is_enabled(hw))
  166. return;
  167. spin_lock_irqsave(pll->lock, flags);
  168. writel(PLL_CONFIG_SEL, pll->pll_base + PLL_CONF_REG);
  169. reg = readl(pll->pll_base + PLL_CTRL_REG);
  170. reg |= PLL_BYPASS;
  171. writel(reg, pll->pll_base + PLL_CTRL_REG);
  172. reg = readl(pll->pll_base + PLL_CTRL_REG);
  173. reg &= ~PLL_PLLEN;
  174. writel(reg, pll->pll_base + PLL_CTRL_REG);
  175. spin_unlock_irqrestore(pll->lock, flags);
  176. }
  177. static const struct clk_ops visconti_pll_ops = {
  178. .enable = visconti_pll_enable,
  179. .disable = visconti_pll_disable,
  180. .is_enabled = visconti_pll_is_enabled,
  181. .round_rate = visconti_pll_round_rate,
  182. .recalc_rate = visconti_pll_recalc_rate,
  183. .set_rate = visconti_pll_set_rate,
  184. };
  185. static struct clk_hw *visconti_register_pll(struct visconti_pll_provider *ctx,
  186. const char *name,
  187. const char *parent_name,
  188. int offset,
  189. const struct visconti_pll_rate_table *rate_table,
  190. spinlock_t *lock)
  191. {
  192. struct clk_init_data init;
  193. struct visconti_pll *pll;
  194. struct clk_hw *pll_hw_clk;
  195. size_t len;
  196. int ret;
  197. pll = kzalloc(sizeof(*pll), GFP_KERNEL);
  198. if (!pll)
  199. return ERR_PTR(-ENOMEM);
  200. init.name = name;
  201. init.flags = CLK_IGNORE_UNUSED;
  202. init.parent_names = &parent_name;
  203. init.num_parents = 1;
  204. for (len = 0; rate_table[len].rate != 0; )
  205. len++;
  206. pll->rate_count = len;
  207. pll->rate_table = kmemdup(rate_table,
  208. pll->rate_count * sizeof(struct visconti_pll_rate_table),
  209. GFP_KERNEL);
  210. WARN(!pll->rate_table, "%s: could not allocate rate table for %s\n", __func__, name);
  211. init.ops = &visconti_pll_ops;
  212. pll->hw.init = &init;
  213. pll->pll_base = ctx->reg_base + offset;
  214. pll->lock = lock;
  215. pll->ctx = ctx;
  216. pll_hw_clk = &pll->hw;
  217. ret = clk_hw_register(NULL, &pll->hw);
  218. if (ret) {
  219. pr_err("failed to register pll clock %s : %d\n", name, ret);
  220. kfree(pll->rate_table);
  221. kfree(pll);
  222. pll_hw_clk = ERR_PTR(ret);
  223. }
  224. return pll_hw_clk;
  225. }
  226. static void visconti_pll_add_lookup(struct visconti_pll_provider *ctx,
  227. struct clk_hw *hw_clk,
  228. unsigned int id)
  229. {
  230. if (id)
  231. ctx->clk_data.hws[id] = hw_clk;
  232. }
  233. void __init visconti_register_plls(struct visconti_pll_provider *ctx,
  234. const struct visconti_pll_info *list,
  235. unsigned int nr_plls,
  236. spinlock_t *lock)
  237. {
  238. int idx;
  239. for (idx = 0; idx < nr_plls; idx++, list++) {
  240. struct clk_hw *clk;
  241. clk = visconti_register_pll(ctx,
  242. list->name,
  243. list->parent,
  244. list->base_reg,
  245. list->rate_table,
  246. lock);
  247. if (IS_ERR(clk)) {
  248. pr_err("failed to register clock %s\n", list->name);
  249. continue;
  250. }
  251. visconti_pll_add_lookup(ctx, clk, list->id);
  252. }
  253. }
  254. struct visconti_pll_provider * __init visconti_init_pll(struct device_node *np,
  255. void __iomem *base,
  256. unsigned long nr_plls)
  257. {
  258. struct visconti_pll_provider *ctx;
  259. int i;
  260. ctx = kzalloc(struct_size(ctx, clk_data.hws, nr_plls), GFP_KERNEL);
  261. if (!ctx)
  262. return ERR_PTR(-ENOMEM);
  263. for (i = 0; i < nr_plls; ++i)
  264. ctx->clk_data.hws[i] = ERR_PTR(-ENOENT);
  265. ctx->node = np;
  266. ctx->reg_base = base;
  267. ctx->clk_data.num = nr_plls;
  268. return ctx;
  269. }