clk-rcg2.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  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/bug.h>
  17. #include <linux/export.h>
  18. #include <linux/clk-provider.h>
  19. #include <linux/delay.h>
  20. #include <linux/regmap.h>
  21. #include <linux/math64.h>
  22. #include <asm/div64.h>
  23. #include "clk-rcg.h"
  24. #include "common.h"
  25. #define CMD_REG 0x0
  26. #define CMD_UPDATE BIT(0)
  27. #define CMD_ROOT_EN BIT(1)
  28. #define CMD_DIRTY_CFG BIT(4)
  29. #define CMD_DIRTY_N BIT(5)
  30. #define CMD_DIRTY_M BIT(6)
  31. #define CMD_DIRTY_D BIT(7)
  32. #define CMD_ROOT_OFF BIT(31)
  33. #define CFG_REG 0x4
  34. #define CFG_SRC_DIV_SHIFT 0
  35. #define CFG_SRC_SEL_SHIFT 8
  36. #define CFG_SRC_SEL_MASK (0x7 << CFG_SRC_SEL_SHIFT)
  37. #define CFG_MODE_SHIFT 12
  38. #define CFG_MODE_MASK (0x3 << CFG_MODE_SHIFT)
  39. #define CFG_MODE_DUAL_EDGE (0x2 << CFG_MODE_SHIFT)
  40. #define M_REG 0x8
  41. #define N_REG 0xc
  42. #define D_REG 0x10
  43. static int clk_rcg2_is_enabled(struct clk_hw *hw)
  44. {
  45. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  46. u32 cmd;
  47. int ret;
  48. ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG, &cmd);
  49. if (ret)
  50. return ret;
  51. return (cmd & CMD_ROOT_OFF) == 0;
  52. }
  53. static u8 clk_rcg2_get_parent(struct clk_hw *hw)
  54. {
  55. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  56. int num_parents = clk_hw_get_num_parents(hw);
  57. u32 cfg;
  58. int i, ret;
  59. ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
  60. if (ret)
  61. goto err;
  62. cfg &= CFG_SRC_SEL_MASK;
  63. cfg >>= CFG_SRC_SEL_SHIFT;
  64. for (i = 0; i < num_parents; i++)
  65. if (cfg == rcg->parent_map[i].cfg)
  66. return i;
  67. err:
  68. pr_debug("%s: Clock %s has invalid parent, using default.\n",
  69. __func__, clk_hw_get_name(hw));
  70. return 0;
  71. }
  72. static int update_config(struct clk_rcg2 *rcg)
  73. {
  74. int count, ret;
  75. u32 cmd;
  76. struct clk_hw *hw = &rcg->clkr.hw;
  77. const char *name = clk_hw_get_name(hw);
  78. ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG,
  79. CMD_UPDATE, CMD_UPDATE);
  80. if (ret)
  81. return ret;
  82. /* Wait for update to take effect */
  83. for (count = 500; count > 0; count--) {
  84. ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CMD_REG, &cmd);
  85. if (ret)
  86. return ret;
  87. if (!(cmd & CMD_UPDATE))
  88. return 0;
  89. udelay(1);
  90. }
  91. WARN(1, "%s: rcg didn't update its configuration.", name);
  92. return 0;
  93. }
  94. static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index)
  95. {
  96. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  97. int ret;
  98. u32 cfg = rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT;
  99. ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
  100. CFG_SRC_SEL_MASK, cfg);
  101. if (ret)
  102. return ret;
  103. return update_config(rcg);
  104. }
  105. /*
  106. * Calculate m/n:d rate
  107. *
  108. * parent_rate m
  109. * rate = ----------- x ---
  110. * hid_div n
  111. */
  112. static unsigned long
  113. calc_rate(unsigned long rate, u32 m, u32 n, u32 mode, u32 hid_div)
  114. {
  115. if (hid_div) {
  116. rate *= 2;
  117. rate /= hid_div + 1;
  118. }
  119. if (mode) {
  120. u64 tmp = rate;
  121. tmp *= m;
  122. do_div(tmp, n);
  123. rate = tmp;
  124. }
  125. return rate;
  126. }
  127. static unsigned long
  128. clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
  129. {
  130. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  131. u32 cfg, hid_div, m = 0, n = 0, mode = 0, mask;
  132. regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
  133. if (rcg->mnd_width) {
  134. mask = BIT(rcg->mnd_width) - 1;
  135. regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + M_REG, &m);
  136. m &= mask;
  137. regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + N_REG, &n);
  138. n = ~n;
  139. n &= mask;
  140. n += m;
  141. mode = cfg & CFG_MODE_MASK;
  142. mode >>= CFG_MODE_SHIFT;
  143. }
  144. mask = BIT(rcg->hid_width) - 1;
  145. hid_div = cfg >> CFG_SRC_DIV_SHIFT;
  146. hid_div &= mask;
  147. return calc_rate(parent_rate, m, n, mode, hid_div);
  148. }
  149. static int _freq_tbl_determine_rate(struct clk_hw *hw,
  150. const struct freq_tbl *f, struct clk_rate_request *req)
  151. {
  152. unsigned long clk_flags, rate = req->rate;
  153. struct clk_hw *p;
  154. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  155. int index;
  156. f = qcom_find_freq(f, rate);
  157. if (!f)
  158. return -EINVAL;
  159. index = qcom_find_src_index(hw, rcg->parent_map, f->src);
  160. if (index < 0)
  161. return index;
  162. clk_flags = clk_hw_get_flags(hw);
  163. p = clk_hw_get_parent_by_index(hw, index);
  164. if (clk_flags & CLK_SET_RATE_PARENT) {
  165. if (f->pre_div) {
  166. rate /= 2;
  167. rate *= f->pre_div + 1;
  168. }
  169. if (f->n) {
  170. u64 tmp = rate;
  171. tmp = tmp * f->n;
  172. do_div(tmp, f->m);
  173. rate = tmp;
  174. }
  175. } else {
  176. rate = clk_hw_get_rate(p);
  177. }
  178. req->best_parent_hw = p;
  179. req->best_parent_rate = rate;
  180. req->rate = f->freq;
  181. return 0;
  182. }
  183. static int clk_rcg2_determine_rate(struct clk_hw *hw,
  184. struct clk_rate_request *req)
  185. {
  186. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  187. return _freq_tbl_determine_rate(hw, rcg->freq_tbl, req);
  188. }
  189. static int clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)
  190. {
  191. u32 cfg, mask;
  192. struct clk_hw *hw = &rcg->clkr.hw;
  193. int ret, index = qcom_find_src_index(hw, rcg->parent_map, f->src);
  194. if (index < 0)
  195. return index;
  196. if (rcg->mnd_width && f->n) {
  197. mask = BIT(rcg->mnd_width) - 1;
  198. ret = regmap_update_bits(rcg->clkr.regmap,
  199. rcg->cmd_rcgr + M_REG, mask, f->m);
  200. if (ret)
  201. return ret;
  202. ret = regmap_update_bits(rcg->clkr.regmap,
  203. rcg->cmd_rcgr + N_REG, mask, ~(f->n - f->m));
  204. if (ret)
  205. return ret;
  206. ret = regmap_update_bits(rcg->clkr.regmap,
  207. rcg->cmd_rcgr + D_REG, mask, ~f->n);
  208. if (ret)
  209. return ret;
  210. }
  211. mask = BIT(rcg->hid_width) - 1;
  212. mask |= CFG_SRC_SEL_MASK | CFG_MODE_MASK;
  213. cfg = f->pre_div << CFG_SRC_DIV_SHIFT;
  214. cfg |= rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT;
  215. if (rcg->mnd_width && f->n && (f->m != f->n))
  216. cfg |= CFG_MODE_DUAL_EDGE;
  217. ret = regmap_update_bits(rcg->clkr.regmap,
  218. rcg->cmd_rcgr + CFG_REG, mask, cfg);
  219. if (ret)
  220. return ret;
  221. return update_config(rcg);
  222. }
  223. static int __clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate)
  224. {
  225. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  226. const struct freq_tbl *f;
  227. f = qcom_find_freq(rcg->freq_tbl, rate);
  228. if (!f)
  229. return -EINVAL;
  230. return clk_rcg2_configure(rcg, f);
  231. }
  232. static int clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate,
  233. unsigned long parent_rate)
  234. {
  235. return __clk_rcg2_set_rate(hw, rate);
  236. }
  237. static int clk_rcg2_set_rate_and_parent(struct clk_hw *hw,
  238. unsigned long rate, unsigned long parent_rate, u8 index)
  239. {
  240. return __clk_rcg2_set_rate(hw, rate);
  241. }
  242. const struct clk_ops clk_rcg2_ops = {
  243. .is_enabled = clk_rcg2_is_enabled,
  244. .get_parent = clk_rcg2_get_parent,
  245. .set_parent = clk_rcg2_set_parent,
  246. .recalc_rate = clk_rcg2_recalc_rate,
  247. .determine_rate = clk_rcg2_determine_rate,
  248. .set_rate = clk_rcg2_set_rate,
  249. .set_rate_and_parent = clk_rcg2_set_rate_and_parent,
  250. };
  251. EXPORT_SYMBOL_GPL(clk_rcg2_ops);
  252. struct frac_entry {
  253. int num;
  254. int den;
  255. };
  256. static const struct frac_entry frac_table_675m[] = { /* link rate of 270M */
  257. { 52, 295 }, /* 119 M */
  258. { 11, 57 }, /* 130.25 M */
  259. { 63, 307 }, /* 138.50 M */
  260. { 11, 50 }, /* 148.50 M */
  261. { 47, 206 }, /* 154 M */
  262. { 31, 100 }, /* 205.25 M */
  263. { 107, 269 }, /* 268.50 M */
  264. { },
  265. };
  266. static struct frac_entry frac_table_810m[] = { /* Link rate of 162M */
  267. { 31, 211 }, /* 119 M */
  268. { 32, 199 }, /* 130.25 M */
  269. { 63, 307 }, /* 138.50 M */
  270. { 11, 60 }, /* 148.50 M */
  271. { 50, 263 }, /* 154 M */
  272. { 31, 120 }, /* 205.25 M */
  273. { 119, 359 }, /* 268.50 M */
  274. { },
  275. };
  276. static int clk_edp_pixel_set_rate(struct clk_hw *hw, unsigned long rate,
  277. unsigned long parent_rate)
  278. {
  279. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  280. struct freq_tbl f = *rcg->freq_tbl;
  281. const struct frac_entry *frac;
  282. int delta = 100000;
  283. s64 src_rate = parent_rate;
  284. s64 request;
  285. u32 mask = BIT(rcg->hid_width) - 1;
  286. u32 hid_div;
  287. if (src_rate == 810000000)
  288. frac = frac_table_810m;
  289. else
  290. frac = frac_table_675m;
  291. for (; frac->num; frac++) {
  292. request = rate;
  293. request *= frac->den;
  294. request = div_s64(request, frac->num);
  295. if ((src_rate < (request - delta)) ||
  296. (src_rate > (request + delta)))
  297. continue;
  298. regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
  299. &hid_div);
  300. f.pre_div = hid_div;
  301. f.pre_div >>= CFG_SRC_DIV_SHIFT;
  302. f.pre_div &= mask;
  303. f.m = frac->num;
  304. f.n = frac->den;
  305. return clk_rcg2_configure(rcg, &f);
  306. }
  307. return -EINVAL;
  308. }
  309. static int clk_edp_pixel_set_rate_and_parent(struct clk_hw *hw,
  310. unsigned long rate, unsigned long parent_rate, u8 index)
  311. {
  312. /* Parent index is set statically in frequency table */
  313. return clk_edp_pixel_set_rate(hw, rate, parent_rate);
  314. }
  315. static int clk_edp_pixel_determine_rate(struct clk_hw *hw,
  316. struct clk_rate_request *req)
  317. {
  318. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  319. const struct freq_tbl *f = rcg->freq_tbl;
  320. const struct frac_entry *frac;
  321. int delta = 100000;
  322. s64 request;
  323. u32 mask = BIT(rcg->hid_width) - 1;
  324. u32 hid_div;
  325. int index = qcom_find_src_index(hw, rcg->parent_map, f->src);
  326. /* Force the correct parent */
  327. req->best_parent_hw = clk_hw_get_parent_by_index(hw, index);
  328. req->best_parent_rate = clk_hw_get_rate(req->best_parent_hw);
  329. if (req->best_parent_rate == 810000000)
  330. frac = frac_table_810m;
  331. else
  332. frac = frac_table_675m;
  333. for (; frac->num; frac++) {
  334. request = req->rate;
  335. request *= frac->den;
  336. request = div_s64(request, frac->num);
  337. if ((req->best_parent_rate < (request - delta)) ||
  338. (req->best_parent_rate > (request + delta)))
  339. continue;
  340. regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
  341. &hid_div);
  342. hid_div >>= CFG_SRC_DIV_SHIFT;
  343. hid_div &= mask;
  344. req->rate = calc_rate(req->best_parent_rate,
  345. frac->num, frac->den,
  346. !!frac->den, hid_div);
  347. return 0;
  348. }
  349. return -EINVAL;
  350. }
  351. const struct clk_ops clk_edp_pixel_ops = {
  352. .is_enabled = clk_rcg2_is_enabled,
  353. .get_parent = clk_rcg2_get_parent,
  354. .set_parent = clk_rcg2_set_parent,
  355. .recalc_rate = clk_rcg2_recalc_rate,
  356. .set_rate = clk_edp_pixel_set_rate,
  357. .set_rate_and_parent = clk_edp_pixel_set_rate_and_parent,
  358. .determine_rate = clk_edp_pixel_determine_rate,
  359. };
  360. EXPORT_SYMBOL_GPL(clk_edp_pixel_ops);
  361. static int clk_byte_determine_rate(struct clk_hw *hw,
  362. struct clk_rate_request *req)
  363. {
  364. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  365. const struct freq_tbl *f = rcg->freq_tbl;
  366. int index = qcom_find_src_index(hw, rcg->parent_map, f->src);
  367. unsigned long parent_rate, div;
  368. u32 mask = BIT(rcg->hid_width) - 1;
  369. struct clk_hw *p;
  370. if (req->rate == 0)
  371. return -EINVAL;
  372. req->best_parent_hw = p = clk_hw_get_parent_by_index(hw, index);
  373. req->best_parent_rate = parent_rate = clk_hw_round_rate(p, req->rate);
  374. div = DIV_ROUND_UP((2 * parent_rate), req->rate) - 1;
  375. div = min_t(u32, div, mask);
  376. req->rate = calc_rate(parent_rate, 0, 0, 0, div);
  377. return 0;
  378. }
  379. static int clk_byte_set_rate(struct clk_hw *hw, unsigned long rate,
  380. unsigned long parent_rate)
  381. {
  382. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  383. struct freq_tbl f = *rcg->freq_tbl;
  384. unsigned long div;
  385. u32 mask = BIT(rcg->hid_width) - 1;
  386. div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
  387. div = min_t(u32, div, mask);
  388. f.pre_div = div;
  389. return clk_rcg2_configure(rcg, &f);
  390. }
  391. static int clk_byte_set_rate_and_parent(struct clk_hw *hw,
  392. unsigned long rate, unsigned long parent_rate, u8 index)
  393. {
  394. /* Parent index is set statically in frequency table */
  395. return clk_byte_set_rate(hw, rate, parent_rate);
  396. }
  397. const struct clk_ops clk_byte_ops = {
  398. .is_enabled = clk_rcg2_is_enabled,
  399. .get_parent = clk_rcg2_get_parent,
  400. .set_parent = clk_rcg2_set_parent,
  401. .recalc_rate = clk_rcg2_recalc_rate,
  402. .set_rate = clk_byte_set_rate,
  403. .set_rate_and_parent = clk_byte_set_rate_and_parent,
  404. .determine_rate = clk_byte_determine_rate,
  405. };
  406. EXPORT_SYMBOL_GPL(clk_byte_ops);
  407. static const struct frac_entry frac_table_pixel[] = {
  408. { 3, 8 },
  409. { 2, 9 },
  410. { 4, 9 },
  411. { 1, 1 },
  412. { }
  413. };
  414. static int clk_pixel_determine_rate(struct clk_hw *hw,
  415. struct clk_rate_request *req)
  416. {
  417. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  418. unsigned long request, src_rate;
  419. int delta = 100000;
  420. const struct freq_tbl *f = rcg->freq_tbl;
  421. const struct frac_entry *frac = frac_table_pixel;
  422. int index = qcom_find_src_index(hw, rcg->parent_map, f->src);
  423. req->best_parent_hw = clk_hw_get_parent_by_index(hw, index);
  424. for (; frac->num; frac++) {
  425. request = (req->rate * frac->den) / frac->num;
  426. src_rate = clk_hw_round_rate(req->best_parent_hw, request);
  427. if ((src_rate < (request - delta)) ||
  428. (src_rate > (request + delta)))
  429. continue;
  430. req->best_parent_rate = src_rate;
  431. req->rate = (src_rate * frac->num) / frac->den;
  432. return 0;
  433. }
  434. return -EINVAL;
  435. }
  436. static int clk_pixel_set_rate(struct clk_hw *hw, unsigned long rate,
  437. unsigned long parent_rate)
  438. {
  439. struct clk_rcg2 *rcg = to_clk_rcg2(hw);
  440. struct freq_tbl f = *rcg->freq_tbl;
  441. const struct frac_entry *frac = frac_table_pixel;
  442. unsigned long request;
  443. int delta = 100000;
  444. u32 mask = BIT(rcg->hid_width) - 1;
  445. u32 hid_div;
  446. for (; frac->num; frac++) {
  447. request = (rate * frac->den) / frac->num;
  448. if ((parent_rate < (request - delta)) ||
  449. (parent_rate > (request + delta)))
  450. continue;
  451. regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG,
  452. &hid_div);
  453. f.pre_div = hid_div;
  454. f.pre_div >>= CFG_SRC_DIV_SHIFT;
  455. f.pre_div &= mask;
  456. f.m = frac->num;
  457. f.n = frac->den;
  458. return clk_rcg2_configure(rcg, &f);
  459. }
  460. return -EINVAL;
  461. }
  462. static int clk_pixel_set_rate_and_parent(struct clk_hw *hw, unsigned long rate,
  463. unsigned long parent_rate, u8 index)
  464. {
  465. /* Parent index is set statically in frequency table */
  466. return clk_pixel_set_rate(hw, rate, parent_rate);
  467. }
  468. const struct clk_ops clk_pixel_ops = {
  469. .is_enabled = clk_rcg2_is_enabled,
  470. .get_parent = clk_rcg2_get_parent,
  471. .set_parent = clk_rcg2_set_parent,
  472. .recalc_rate = clk_rcg2_recalc_rate,
  473. .set_rate = clk_pixel_set_rate,
  474. .set_rate_and_parent = clk_pixel_set_rate_and_parent,
  475. .determine_rate = clk_pixel_determine_rate,
  476. };
  477. EXPORT_SYMBOL_GPL(clk_pixel_ops);