clk-rcg.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. /*
  2. * Copyright (c) 2013, The Linux Foundation. All rights reserved.
  3. *
  4. * This software is licensed under the terms of the GNU General Public
  5. * License version 2, as published by the Free Software Foundation, and
  6. * may be copied, distributed, and modified under those terms.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #include <linux/kernel.h>
  14. #include <linux/bitops.h>
  15. #include <linux/err.h>
  16. #include <linux/export.h>
  17. #include <linux/clk-provider.h>
  18. #include <linux/regmap.h>
  19. #include <asm/div64.h>
  20. #include "clk-rcg.h"
  21. static u32 ns_to_src(struct src_sel *s, u32 ns)
  22. {
  23. ns >>= s->src_sel_shift;
  24. ns &= SRC_SEL_MASK;
  25. return ns;
  26. }
  27. static u32 src_to_ns(struct src_sel *s, u8 src, u32 ns)
  28. {
  29. u32 mask;
  30. mask = SRC_SEL_MASK;
  31. mask <<= s->src_sel_shift;
  32. ns &= ~mask;
  33. ns |= src << s->src_sel_shift;
  34. return ns;
  35. }
  36. static u8 clk_rcg_get_parent(struct clk_hw *hw)
  37. {
  38. struct clk_rcg *rcg = to_clk_rcg(hw);
  39. int num_parents = __clk_get_num_parents(hw->clk);
  40. u32 ns;
  41. int i;
  42. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  43. ns = ns_to_src(&rcg->s, ns);
  44. for (i = 0; i < num_parents; i++)
  45. if (ns == rcg->s.parent_map[i])
  46. return i;
  47. return -EINVAL;
  48. }
  49. static int reg_to_bank(struct clk_dyn_rcg *rcg, u32 bank)
  50. {
  51. bank &= BIT(rcg->mux_sel_bit);
  52. return !!bank;
  53. }
  54. static u8 clk_dyn_rcg_get_parent(struct clk_hw *hw)
  55. {
  56. struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
  57. int num_parents = __clk_get_num_parents(hw->clk);
  58. u32 ns, ctl;
  59. int bank;
  60. int i;
  61. struct src_sel *s;
  62. regmap_read(rcg->clkr.regmap, rcg->clkr.enable_reg, &ctl);
  63. bank = reg_to_bank(rcg, ctl);
  64. s = &rcg->s[bank];
  65. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  66. ns = ns_to_src(s, ns);
  67. for (i = 0; i < num_parents; i++)
  68. if (ns == s->parent_map[i])
  69. return i;
  70. return -EINVAL;
  71. }
  72. static int clk_rcg_set_parent(struct clk_hw *hw, u8 index)
  73. {
  74. struct clk_rcg *rcg = to_clk_rcg(hw);
  75. u32 ns;
  76. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  77. ns = src_to_ns(&rcg->s, rcg->s.parent_map[index], ns);
  78. regmap_write(rcg->clkr.regmap, rcg->ns_reg, ns);
  79. return 0;
  80. }
  81. static u32 md_to_m(struct mn *mn, u32 md)
  82. {
  83. md >>= mn->m_val_shift;
  84. md &= BIT(mn->width) - 1;
  85. return md;
  86. }
  87. static u32 ns_to_pre_div(struct pre_div *p, u32 ns)
  88. {
  89. ns >>= p->pre_div_shift;
  90. ns &= BIT(p->pre_div_width) - 1;
  91. return ns;
  92. }
  93. static u32 pre_div_to_ns(struct pre_div *p, u8 pre_div, u32 ns)
  94. {
  95. u32 mask;
  96. mask = BIT(p->pre_div_width) - 1;
  97. mask <<= p->pre_div_shift;
  98. ns &= ~mask;
  99. ns |= pre_div << p->pre_div_shift;
  100. return ns;
  101. }
  102. static u32 mn_to_md(struct mn *mn, u32 m, u32 n, u32 md)
  103. {
  104. u32 mask, mask_w;
  105. mask_w = BIT(mn->width) - 1;
  106. mask = (mask_w << mn->m_val_shift) | mask_w;
  107. md &= ~mask;
  108. if (n) {
  109. m <<= mn->m_val_shift;
  110. md |= m;
  111. md |= ~n & mask_w;
  112. }
  113. return md;
  114. }
  115. static u32 ns_m_to_n(struct mn *mn, u32 ns, u32 m)
  116. {
  117. ns = ~ns >> mn->n_val_shift;
  118. ns &= BIT(mn->width) - 1;
  119. return ns + m;
  120. }
  121. static u32 reg_to_mnctr_mode(struct mn *mn, u32 val)
  122. {
  123. val >>= mn->mnctr_mode_shift;
  124. val &= MNCTR_MODE_MASK;
  125. return val;
  126. }
  127. static u32 mn_to_ns(struct mn *mn, u32 m, u32 n, u32 ns)
  128. {
  129. u32 mask;
  130. mask = BIT(mn->width) - 1;
  131. mask <<= mn->n_val_shift;
  132. ns &= ~mask;
  133. if (n) {
  134. n = n - m;
  135. n = ~n;
  136. n &= BIT(mn->width) - 1;
  137. n <<= mn->n_val_shift;
  138. ns |= n;
  139. }
  140. return ns;
  141. }
  142. static u32 mn_to_reg(struct mn *mn, u32 m, u32 n, u32 val)
  143. {
  144. u32 mask;
  145. mask = MNCTR_MODE_MASK << mn->mnctr_mode_shift;
  146. mask |= BIT(mn->mnctr_en_bit);
  147. val &= ~mask;
  148. if (n) {
  149. val |= BIT(mn->mnctr_en_bit);
  150. val |= MNCTR_MODE_DUAL << mn->mnctr_mode_shift;
  151. }
  152. return val;
  153. }
  154. static void configure_bank(struct clk_dyn_rcg *rcg, const struct freq_tbl *f)
  155. {
  156. u32 ns, md, ctl, *regp;
  157. int bank, new_bank;
  158. struct mn *mn;
  159. struct pre_div *p;
  160. struct src_sel *s;
  161. bool enabled;
  162. u32 md_reg;
  163. u32 bank_reg;
  164. bool banked_mn = !!rcg->mn[1].width;
  165. struct clk_hw *hw = &rcg->clkr.hw;
  166. enabled = __clk_is_enabled(hw->clk);
  167. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  168. regmap_read(rcg->clkr.regmap, rcg->clkr.enable_reg, &ctl);
  169. if (banked_mn) {
  170. regp = &ctl;
  171. bank_reg = rcg->clkr.enable_reg;
  172. } else {
  173. regp = &ns;
  174. bank_reg = rcg->ns_reg;
  175. }
  176. bank = reg_to_bank(rcg, *regp);
  177. new_bank = enabled ? !bank : bank;
  178. if (banked_mn) {
  179. mn = &rcg->mn[new_bank];
  180. md_reg = rcg->md_reg[new_bank];
  181. ns |= BIT(mn->mnctr_reset_bit);
  182. regmap_write(rcg->clkr.regmap, rcg->ns_reg, ns);
  183. regmap_read(rcg->clkr.regmap, md_reg, &md);
  184. md = mn_to_md(mn, f->m, f->n, md);
  185. regmap_write(rcg->clkr.regmap, md_reg, md);
  186. ns = mn_to_ns(mn, f->m, f->n, ns);
  187. regmap_write(rcg->clkr.regmap, rcg->ns_reg, ns);
  188. ctl = mn_to_reg(mn, f->m, f->n, ctl);
  189. regmap_write(rcg->clkr.regmap, rcg->clkr.enable_reg, ctl);
  190. ns &= ~BIT(mn->mnctr_reset_bit);
  191. regmap_write(rcg->clkr.regmap, rcg->ns_reg, ns);
  192. } else {
  193. p = &rcg->p[new_bank];
  194. ns = pre_div_to_ns(p, f->pre_div - 1, ns);
  195. }
  196. s = &rcg->s[new_bank];
  197. ns = src_to_ns(s, s->parent_map[f->src], ns);
  198. regmap_write(rcg->clkr.regmap, rcg->ns_reg, ns);
  199. if (enabled) {
  200. *regp ^= BIT(rcg->mux_sel_bit);
  201. regmap_write(rcg->clkr.regmap, bank_reg, *regp);
  202. }
  203. }
  204. static int clk_dyn_rcg_set_parent(struct clk_hw *hw, u8 index)
  205. {
  206. struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
  207. u32 ns, ctl, md, reg;
  208. int bank;
  209. struct freq_tbl f = { 0 };
  210. bool banked_mn = !!rcg->mn[1].width;
  211. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  212. regmap_read(rcg->clkr.regmap, rcg->clkr.enable_reg, &ctl);
  213. reg = banked_mn ? ctl : ns;
  214. bank = reg_to_bank(rcg, reg);
  215. if (banked_mn) {
  216. regmap_read(rcg->clkr.regmap, rcg->md_reg[bank], &md);
  217. f.m = md_to_m(&rcg->mn[bank], md);
  218. f.n = ns_m_to_n(&rcg->mn[bank], ns, f.m);
  219. } else {
  220. f.pre_div = ns_to_pre_div(&rcg->p[bank], ns) + 1;
  221. }
  222. f.src = index;
  223. configure_bank(rcg, &f);
  224. return 0;
  225. }
  226. /*
  227. * Calculate m/n:d rate
  228. *
  229. * parent_rate m
  230. * rate = ----------- x ---
  231. * pre_div n
  232. */
  233. static unsigned long
  234. calc_rate(unsigned long rate, u32 m, u32 n, u32 mode, u32 pre_div)
  235. {
  236. if (pre_div)
  237. rate /= pre_div + 1;
  238. if (mode) {
  239. u64 tmp = rate;
  240. tmp *= m;
  241. do_div(tmp, n);
  242. rate = tmp;
  243. }
  244. return rate;
  245. }
  246. static unsigned long
  247. clk_rcg_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
  248. {
  249. struct clk_rcg *rcg = to_clk_rcg(hw);
  250. u32 pre_div, m = 0, n = 0, ns, md, mode = 0;
  251. struct mn *mn = &rcg->mn;
  252. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  253. pre_div = ns_to_pre_div(&rcg->p, ns);
  254. if (rcg->mn.width) {
  255. regmap_read(rcg->clkr.regmap, rcg->md_reg, &md);
  256. m = md_to_m(mn, md);
  257. n = ns_m_to_n(mn, ns, m);
  258. /* MN counter mode is in hw.enable_reg sometimes */
  259. if (rcg->clkr.enable_reg != rcg->ns_reg)
  260. regmap_read(rcg->clkr.regmap, rcg->clkr.enable_reg, &mode);
  261. else
  262. mode = ns;
  263. mode = reg_to_mnctr_mode(mn, mode);
  264. }
  265. return calc_rate(parent_rate, m, n, mode, pre_div);
  266. }
  267. static unsigned long
  268. clk_dyn_rcg_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
  269. {
  270. struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
  271. u32 m, n, pre_div, ns, md, mode, reg;
  272. int bank;
  273. struct mn *mn;
  274. bool banked_mn = !!rcg->mn[1].width;
  275. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  276. if (banked_mn)
  277. regmap_read(rcg->clkr.regmap, rcg->clkr.enable_reg, &reg);
  278. else
  279. reg = ns;
  280. bank = reg_to_bank(rcg, reg);
  281. if (banked_mn) {
  282. mn = &rcg->mn[bank];
  283. regmap_read(rcg->clkr.regmap, rcg->md_reg[bank], &md);
  284. m = md_to_m(mn, md);
  285. n = ns_m_to_n(mn, ns, m);
  286. mode = reg_to_mnctr_mode(mn, reg);
  287. return calc_rate(parent_rate, m, n, mode, 0);
  288. } else {
  289. pre_div = ns_to_pre_div(&rcg->p[bank], ns);
  290. return calc_rate(parent_rate, 0, 0, 0, pre_div);
  291. }
  292. }
  293. static const
  294. struct freq_tbl *find_freq(const struct freq_tbl *f, unsigned long rate)
  295. {
  296. if (!f)
  297. return NULL;
  298. for (; f->freq; f++)
  299. if (rate <= f->freq)
  300. return f;
  301. return NULL;
  302. }
  303. static long _freq_tbl_determine_rate(struct clk_hw *hw,
  304. const struct freq_tbl *f, unsigned long rate,
  305. unsigned long *p_rate, struct clk **p)
  306. {
  307. unsigned long clk_flags;
  308. f = find_freq(f, rate);
  309. if (!f)
  310. return -EINVAL;
  311. clk_flags = __clk_get_flags(hw->clk);
  312. *p = clk_get_parent_by_index(hw->clk, f->src);
  313. if (clk_flags & CLK_SET_RATE_PARENT) {
  314. rate = rate * f->pre_div;
  315. if (f->n) {
  316. u64 tmp = rate;
  317. tmp = tmp * f->n;
  318. do_div(tmp, f->m);
  319. rate = tmp;
  320. }
  321. } else {
  322. rate = __clk_get_rate(*p);
  323. }
  324. *p_rate = rate;
  325. return f->freq;
  326. }
  327. static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
  328. unsigned long *p_rate, struct clk **p)
  329. {
  330. struct clk_rcg *rcg = to_clk_rcg(hw);
  331. return _freq_tbl_determine_rate(hw, rcg->freq_tbl, rate, p_rate, p);
  332. }
  333. static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
  334. unsigned long *p_rate, struct clk **p)
  335. {
  336. struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
  337. return _freq_tbl_determine_rate(hw, rcg->freq_tbl, rate, p_rate, p);
  338. }
  339. static int clk_rcg_set_rate(struct clk_hw *hw, unsigned long rate,
  340. unsigned long parent_rate)
  341. {
  342. struct clk_rcg *rcg = to_clk_rcg(hw);
  343. const struct freq_tbl *f;
  344. u32 ns, md, ctl;
  345. struct mn *mn = &rcg->mn;
  346. u32 mask = 0;
  347. unsigned int reset_reg;
  348. f = find_freq(rcg->freq_tbl, rate);
  349. if (!f)
  350. return -EINVAL;
  351. if (rcg->mn.reset_in_cc)
  352. reset_reg = rcg->clkr.enable_reg;
  353. else
  354. reset_reg = rcg->ns_reg;
  355. if (rcg->mn.width) {
  356. mask = BIT(mn->mnctr_reset_bit);
  357. regmap_update_bits(rcg->clkr.regmap, reset_reg, mask, mask);
  358. regmap_read(rcg->clkr.regmap, rcg->md_reg, &md);
  359. md = mn_to_md(mn, f->m, f->n, md);
  360. regmap_write(rcg->clkr.regmap, rcg->md_reg, md);
  361. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  362. /* MN counter mode is in hw.enable_reg sometimes */
  363. if (rcg->clkr.enable_reg != rcg->ns_reg) {
  364. regmap_read(rcg->clkr.regmap, rcg->clkr.enable_reg, &ctl);
  365. ctl = mn_to_reg(mn, f->m, f->n, ctl);
  366. regmap_write(rcg->clkr.regmap, rcg->clkr.enable_reg, ctl);
  367. } else {
  368. ns = mn_to_reg(mn, f->m, f->n, ns);
  369. }
  370. ns = mn_to_ns(mn, f->m, f->n, ns);
  371. } else {
  372. regmap_read(rcg->clkr.regmap, rcg->ns_reg, &ns);
  373. }
  374. ns = pre_div_to_ns(&rcg->p, f->pre_div - 1, ns);
  375. regmap_write(rcg->clkr.regmap, rcg->ns_reg, ns);
  376. regmap_update_bits(rcg->clkr.regmap, reset_reg, mask, 0);
  377. return 0;
  378. }
  379. static int __clk_dyn_rcg_set_rate(struct clk_hw *hw, unsigned long rate)
  380. {
  381. struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
  382. const struct freq_tbl *f;
  383. f = find_freq(rcg->freq_tbl, rate);
  384. if (!f)
  385. return -EINVAL;
  386. configure_bank(rcg, f);
  387. return 0;
  388. }
  389. static int clk_dyn_rcg_set_rate(struct clk_hw *hw, unsigned long rate,
  390. unsigned long parent_rate)
  391. {
  392. return __clk_dyn_rcg_set_rate(hw, rate);
  393. }
  394. static int clk_dyn_rcg_set_rate_and_parent(struct clk_hw *hw,
  395. unsigned long rate, unsigned long parent_rate, u8 index)
  396. {
  397. return __clk_dyn_rcg_set_rate(hw, rate);
  398. }
  399. const struct clk_ops clk_rcg_ops = {
  400. .enable = clk_enable_regmap,
  401. .disable = clk_disable_regmap,
  402. .get_parent = clk_rcg_get_parent,
  403. .set_parent = clk_rcg_set_parent,
  404. .recalc_rate = clk_rcg_recalc_rate,
  405. .determine_rate = clk_rcg_determine_rate,
  406. .set_rate = clk_rcg_set_rate,
  407. };
  408. EXPORT_SYMBOL_GPL(clk_rcg_ops);
  409. const struct clk_ops clk_dyn_rcg_ops = {
  410. .enable = clk_enable_regmap,
  411. .is_enabled = clk_is_enabled_regmap,
  412. .disable = clk_disable_regmap,
  413. .get_parent = clk_dyn_rcg_get_parent,
  414. .set_parent = clk_dyn_rcg_set_parent,
  415. .recalc_rate = clk_dyn_rcg_recalc_rate,
  416. .determine_rate = clk_dyn_rcg_determine_rate,
  417. .set_rate = clk_dyn_rcg_set_rate,
  418. .set_rate_and_parent = clk_dyn_rcg_set_rate_and_parent,
  419. };
  420. EXPORT_SYMBOL_GPL(clk_dyn_rcg_ops);