rcar-gen4-cpg.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * R-Car Gen4 Clock Pulse Generator
  4. *
  5. * Copyright (C) 2021 Renesas Electronics Corp.
  6. *
  7. * Based on rcar-gen3-cpg.c
  8. *
  9. * Copyright (C) 2015-2018 Glider bvba
  10. * Copyright (C) 2019 Renesas Electronics Corp.
  11. */
  12. #include <linux/bitfield.h>
  13. #include <linux/clk.h>
  14. #include <linux/clk-provider.h>
  15. #include <linux/device.h>
  16. #include <linux/err.h>
  17. #include <linux/init.h>
  18. #include <linux/io.h>
  19. #include <linux/slab.h>
  20. #include "renesas-cpg-mssr.h"
  21. #include "rcar-gen4-cpg.h"
  22. #include "rcar-cpg-lib.h"
  23. static const struct rcar_gen4_cpg_pll_config *cpg_pll_config __initdata;
  24. static unsigned int cpg_clk_extalr __initdata;
  25. static u32 cpg_mode __initdata;
  26. /*
  27. * Z0 Clock & Z1 Clock
  28. */
  29. #define CPG_FRQCRB 0x00000804
  30. #define CPG_FRQCRB_KICK BIT(31)
  31. #define CPG_FRQCRC 0x00000808
  32. struct cpg_z_clk {
  33. struct clk_hw hw;
  34. void __iomem *reg;
  35. void __iomem *kick_reg;
  36. unsigned long max_rate; /* Maximum rate for normal mode */
  37. unsigned int fixed_div;
  38. u32 mask;
  39. };
  40. #define to_z_clk(_hw) container_of(_hw, struct cpg_z_clk, hw)
  41. static unsigned long cpg_z_clk_recalc_rate(struct clk_hw *hw,
  42. unsigned long parent_rate)
  43. {
  44. struct cpg_z_clk *zclk = to_z_clk(hw);
  45. unsigned int mult;
  46. u32 val;
  47. val = readl(zclk->reg) & zclk->mask;
  48. mult = 32 - (val >> __ffs(zclk->mask));
  49. return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult,
  50. 32 * zclk->fixed_div);
  51. }
  52. static int cpg_z_clk_determine_rate(struct clk_hw *hw,
  53. struct clk_rate_request *req)
  54. {
  55. struct cpg_z_clk *zclk = to_z_clk(hw);
  56. unsigned int min_mult, max_mult, mult;
  57. unsigned long rate, prate;
  58. rate = min(req->rate, req->max_rate);
  59. if (rate <= zclk->max_rate) {
  60. /* Set parent rate to initial value for normal modes */
  61. prate = zclk->max_rate;
  62. } else {
  63. /* Set increased parent rate for boost modes */
  64. prate = rate;
  65. }
  66. req->best_parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw),
  67. prate * zclk->fixed_div);
  68. prate = req->best_parent_rate / zclk->fixed_div;
  69. min_mult = max(div64_ul(req->min_rate * 32ULL, prate), 1ULL);
  70. max_mult = min(div64_ul(req->max_rate * 32ULL, prate), 32ULL);
  71. if (max_mult < min_mult)
  72. return -EINVAL;
  73. mult = DIV_ROUND_CLOSEST_ULL(rate * 32ULL, prate);
  74. mult = clamp(mult, min_mult, max_mult);
  75. req->rate = DIV_ROUND_CLOSEST_ULL((u64)prate * mult, 32);
  76. return 0;
  77. }
  78. static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  79. unsigned long parent_rate)
  80. {
  81. struct cpg_z_clk *zclk = to_z_clk(hw);
  82. unsigned int mult;
  83. unsigned int i;
  84. mult = DIV64_U64_ROUND_CLOSEST(rate * 32ULL * zclk->fixed_div,
  85. parent_rate);
  86. mult = clamp(mult, 1U, 32U);
  87. if (readl(zclk->kick_reg) & CPG_FRQCRB_KICK)
  88. return -EBUSY;
  89. cpg_reg_modify(zclk->reg, zclk->mask, (32 - mult) << __ffs(zclk->mask));
  90. /*
  91. * Set KICK bit in FRQCRB to update hardware setting and wait for
  92. * clock change completion.
  93. */
  94. cpg_reg_modify(zclk->kick_reg, 0, CPG_FRQCRB_KICK);
  95. /*
  96. * Note: There is no HW information about the worst case latency.
  97. *
  98. * Using experimental measurements, it seems that no more than
  99. * ~10 iterations are needed, independently of the CPU rate.
  100. * Since this value might be dependent on external xtal rate, pll1
  101. * rate or even the other emulation clocks rate, use 1000 as a
  102. * "super" safe value.
  103. */
  104. for (i = 1000; i; i--) {
  105. if (!(readl(zclk->kick_reg) & CPG_FRQCRB_KICK))
  106. return 0;
  107. cpu_relax();
  108. }
  109. return -ETIMEDOUT;
  110. }
  111. static const struct clk_ops cpg_z_clk_ops = {
  112. .recalc_rate = cpg_z_clk_recalc_rate,
  113. .determine_rate = cpg_z_clk_determine_rate,
  114. .set_rate = cpg_z_clk_set_rate,
  115. };
  116. static struct clk * __init cpg_z_clk_register(const char *name,
  117. const char *parent_name,
  118. void __iomem *reg,
  119. unsigned int div,
  120. unsigned int offset)
  121. {
  122. struct clk_init_data init = {};
  123. struct cpg_z_clk *zclk;
  124. struct clk *clk;
  125. zclk = kzalloc(sizeof(*zclk), GFP_KERNEL);
  126. if (!zclk)
  127. return ERR_PTR(-ENOMEM);
  128. init.name = name;
  129. init.ops = &cpg_z_clk_ops;
  130. init.flags = CLK_SET_RATE_PARENT;
  131. init.parent_names = &parent_name;
  132. init.num_parents = 1;
  133. zclk->reg = reg + CPG_FRQCRC;
  134. zclk->kick_reg = reg + CPG_FRQCRB;
  135. zclk->hw.init = &init;
  136. zclk->mask = GENMASK(offset + 4, offset);
  137. zclk->fixed_div = div; /* PLLVCO x 1/div x SYS-CPU divider */
  138. clk = clk_register(NULL, &zclk->hw);
  139. if (IS_ERR(clk)) {
  140. kfree(zclk);
  141. return clk;
  142. }
  143. zclk->max_rate = clk_hw_get_rate(clk_hw_get_parent(&zclk->hw)) /
  144. zclk->fixed_div;
  145. return clk;
  146. }
  147. /*
  148. * RPC Clocks
  149. */
  150. static const struct clk_div_table cpg_rpcsrc_div_table[] = {
  151. { 0, 4 }, { 1, 6 }, { 2, 5 }, { 3, 6 }, { 0, 0 },
  152. };
  153. struct clk * __init rcar_gen4_cpg_clk_register(struct device *dev,
  154. const struct cpg_core_clk *core, const struct cpg_mssr_info *info,
  155. struct clk **clks, void __iomem *base,
  156. struct raw_notifier_head *notifiers)
  157. {
  158. const struct clk *parent;
  159. unsigned int mult = 1;
  160. unsigned int div = 1;
  161. u32 value;
  162. parent = clks[core->parent & 0xffff]; /* some types use high bits */
  163. if (IS_ERR(parent))
  164. return ERR_CAST(parent);
  165. switch (core->type) {
  166. case CLK_TYPE_GEN4_MAIN:
  167. div = cpg_pll_config->extal_div;
  168. break;
  169. case CLK_TYPE_GEN4_PLL1:
  170. mult = cpg_pll_config->pll1_mult;
  171. div = cpg_pll_config->pll1_div;
  172. break;
  173. case CLK_TYPE_GEN4_PLL2:
  174. mult = cpg_pll_config->pll2_mult;
  175. div = cpg_pll_config->pll2_div;
  176. break;
  177. case CLK_TYPE_GEN4_PLL3:
  178. mult = cpg_pll_config->pll3_mult;
  179. div = cpg_pll_config->pll3_div;
  180. break;
  181. case CLK_TYPE_GEN4_PLL4:
  182. mult = cpg_pll_config->pll4_mult;
  183. div = cpg_pll_config->pll4_div;
  184. break;
  185. case CLK_TYPE_GEN4_PLL5:
  186. mult = cpg_pll_config->pll5_mult;
  187. div = cpg_pll_config->pll5_div;
  188. break;
  189. case CLK_TYPE_GEN4_PLL6:
  190. mult = cpg_pll_config->pll6_mult;
  191. div = cpg_pll_config->pll6_div;
  192. break;
  193. case CLK_TYPE_GEN4_PLL2X_3X:
  194. value = readl(base + core->offset);
  195. mult = (((value >> 24) & 0x7f) + 1) * 2;
  196. break;
  197. case CLK_TYPE_GEN4_Z:
  198. return cpg_z_clk_register(core->name, __clk_get_name(parent),
  199. base, core->div, core->offset);
  200. case CLK_TYPE_GEN4_SDSRC:
  201. div = ((readl(base + SD0CKCR1) >> 29) & 0x03) + 4;
  202. break;
  203. case CLK_TYPE_GEN4_SDH:
  204. return cpg_sdh_clk_register(core->name, base + core->offset,
  205. __clk_get_name(parent), notifiers);
  206. case CLK_TYPE_GEN4_SD:
  207. return cpg_sd_clk_register(core->name, base + core->offset,
  208. __clk_get_name(parent));
  209. case CLK_TYPE_GEN4_MDSEL:
  210. /*
  211. * Clock selectable between two parents and two fixed dividers
  212. * using a mode pin
  213. */
  214. if (cpg_mode & BIT(core->offset)) {
  215. div = core->div & 0xffff;
  216. } else {
  217. parent = clks[core->parent >> 16];
  218. if (IS_ERR(parent))
  219. return ERR_CAST(parent);
  220. div = core->div >> 16;
  221. }
  222. mult = 1;
  223. break;
  224. case CLK_TYPE_GEN4_OSC:
  225. /*
  226. * Clock combining OSC EXTAL predivider and a fixed divider
  227. */
  228. div = cpg_pll_config->osc_prediv * core->div;
  229. break;
  230. case CLK_TYPE_GEN4_RPCSRC:
  231. return clk_register_divider_table(NULL, core->name,
  232. __clk_get_name(parent), 0,
  233. base + CPG_RPCCKCR, 3, 2, 0,
  234. cpg_rpcsrc_div_table,
  235. &cpg_lock);
  236. case CLK_TYPE_GEN4_RPC:
  237. return cpg_rpc_clk_register(core->name, base + CPG_RPCCKCR,
  238. __clk_get_name(parent), notifiers);
  239. case CLK_TYPE_GEN4_RPCD2:
  240. return cpg_rpcd2_clk_register(core->name, base + CPG_RPCCKCR,
  241. __clk_get_name(parent));
  242. default:
  243. return ERR_PTR(-EINVAL);
  244. }
  245. return clk_register_fixed_factor(NULL, core->name,
  246. __clk_get_name(parent), 0, mult, div);
  247. }
  248. int __init rcar_gen4_cpg_init(const struct rcar_gen4_cpg_pll_config *config,
  249. unsigned int clk_extalr, u32 mode)
  250. {
  251. cpg_pll_config = config;
  252. cpg_clk_extalr = clk_extalr;
  253. cpg_mode = mode;
  254. spin_lock_init(&cpg_lock);
  255. return 0;
  256. }