clk-pll.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. /*
  2. * Copyright 2018-2019 Arkmicro, Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms and conditions of the GNU General Public License,
  6. * version 2, as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope it will be useful, but WITHOUT
  9. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  11. * more details.
  12. *
  13. * You should have received a copy of the GNU General Public License along with
  14. * this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include <linux/kernel.h>
  17. #include <linux/slab.h>
  18. #include <linux/err.h>
  19. #include <linux/clk.h>
  20. #include <linux/clk-provider.h>
  21. #include <linux/io.h>
  22. #include <linux/of.h>
  23. #include <linux/of_address.h>
  24. #include <linux/delay.h>
  25. #include "clk-ark.h"
  26. static int clk_pll_is_enable(struct clk_hw *hwclk)
  27. {
  28. struct ark_clk *clk = to_ark_clk(hwclk);
  29. u32 reg;
  30. reg = readl(clk->reg);
  31. return !!(reg & ARK_PLL_ENA);
  32. }
  33. static int clk_pll_enable(struct clk_hw *hwclk)
  34. {
  35. struct ark_clk *clk = to_ark_clk(hwclk);
  36. u32 reg;
  37. reg = readl(clk->reg);
  38. reg |= ARK_PLL_ENA;
  39. writel(reg, clk->reg);
  40. return 0;
  41. }
  42. static void clk_pll_disable(struct clk_hw *hwclk)
  43. {
  44. /* struct ark_clk *clk = to_ark_clk(hwclk);
  45. u32 reg;
  46. reg = readl(clk->reg);
  47. reg &= ~ARK_PLL_ENA;
  48. writel(reg, clk->reg); */
  49. return;
  50. }
  51. static unsigned long clk_pll_recalc_rate(struct clk_hw *hwclk,
  52. unsigned long parent_rate)
  53. {
  54. struct ark_clk *clk = to_ark_clk(hwclk);
  55. unsigned long div, no, reg;
  56. reg = readl(clk->reg);
  57. no = (reg >> ARK_PLL_NO_OFFSET) & ARK_PLL_NO_MASK;
  58. div = (reg >> ARK_PLL_DIV_OFFSET) & ARK_PLL_DIV_MASK;
  59. pr_info("clk %s rate %lu.\n", clk_hw_get_name(hwclk), (parent_rate * div) / (1 << no));
  60. return (parent_rate * div) / (1 << no);
  61. }
  62. static const struct clk_ops clk_pll_ops = {
  63. .is_enabled = clk_pll_is_enable,
  64. .enable = clk_pll_enable,
  65. .disable = clk_pll_disable,
  66. .recalc_rate = clk_pll_recalc_rate,
  67. };
  68. static int clk_dds_is_enable(struct clk_hw *hwclk)
  69. {
  70. struct ark_clk *clk = to_ark_clk(hwclk);
  71. u32 reg;
  72. reg = readl(clk->reg2);
  73. return !!(reg & ARK_DDS_ENA);
  74. }
  75. static int clk_dds_enable(struct clk_hw *hwclk)
  76. {
  77. struct ark_clk *clk = to_ark_clk(hwclk);
  78. u32 reg;
  79. reg = readl(clk->reg2);
  80. reg |= ARK_DDS_ENA;
  81. writel(reg, clk->reg2);
  82. return 0;
  83. }
  84. static void clk_dds_disable(struct clk_hw *hwclk)
  85. {
  86. /* struct ark_clk *clk = to_ark_clk(hwclk);
  87. u32 reg;
  88. reg = readl(clk->reg2);
  89. reg &= ~ARK_DDS_ENA;
  90. writel(reg, clk->reg2); */
  91. return;
  92. }
  93. static unsigned long clk_dds_recalc_rate(struct clk_hw *hwclk,
  94. unsigned long parent_rate)
  95. {
  96. struct ark_clk *clk = to_ark_clk(hwclk);
  97. u32 dto_inc, mul, div, reg, reg2;
  98. u64 freqm;
  99. reg = readl(clk->reg);
  100. reg2 = readl(clk->reg2);
  101. div = (reg2 >> ARK_DDS_DIV_OFFSET) & ARK_DDS_DIV_MASK;
  102. div = 1 << div;
  103. mul = (reg2 >> ARK_DDS_MUL_OFFSET) & ARK_DDS_MUL_MASK;
  104. mul = 32 * (1 << mul);
  105. dto_inc = (reg >> ARK_DDS_DTOINC_OFFSET) & ARK_DDS_DTOINC_MASK;
  106. freqm = parent_rate * dto_inc * mul;
  107. return do_div(freqm, (1 << 22) * div);
  108. }
  109. static void clk_dds_calc(unsigned long rate, unsigned long ref_freq, u32 *dto_inc)
  110. {
  111. u64 freqm;
  112. if (rate < ARK_DDS_MIN_FREQ)
  113. rate = ARK_DDS_MIN_FREQ;
  114. if (rate > ARK_DDS_MAX_FREQ)
  115. rate = ARK_DDS_MAX_FREQ;
  116. freqm = rate * (1 << 22);
  117. *dto_inc = do_div(freqm, ref_freq * 32);
  118. }
  119. static long clk_dds_round_rate(struct clk_hw *hwclk, unsigned long rate,
  120. unsigned long *parent_rate)
  121. {
  122. u32 dto_inc;
  123. u32 ref_freq = *parent_rate;
  124. u64 freqm;
  125. clk_dds_calc(rate, ref_freq, &dto_inc);
  126. freqm = ref_freq * dto_inc * 32;
  127. return do_div(freqm, 1 << 22);
  128. }
  129. static int clk_dds_set_rate(struct clk_hw *hwclk, unsigned long rate,
  130. unsigned long parent_rate)
  131. {
  132. struct ark_clk *clk = to_ark_clk(hwclk);
  133. u32 dto_inc, reg, reg2;
  134. reg = readl(clk->reg);
  135. reg2 = readl(clk->reg2);
  136. reg2 &= ~((ARK_DDS_DIV_MASK << ARK_DDS_DIV_OFFSET) | (ARK_DDS_MUL_MASK << ARK_DDS_MUL_OFFSET));
  137. writel(reg2, clk->reg2);
  138. clk_dds_calc(rate, parent_rate, &dto_inc);
  139. reg &= ~(ARK_DDS_DTOINC_MASK << ARK_DDS_DTOINC_OFFSET);
  140. reg |= (dto_inc << ARK_DDS_DTOINC_OFFSET);
  141. writel(reg, clk->reg);
  142. return 0;
  143. }
  144. static const struct clk_ops clk_dds_ops = {
  145. .is_enabled = clk_dds_is_enable,
  146. .enable = clk_dds_enable,
  147. .disable = clk_dds_disable,
  148. .recalc_rate = clk_dds_recalc_rate,
  149. .round_rate = clk_dds_round_rate,
  150. .set_rate = clk_dds_set_rate,
  151. };
  152. static int clk_arke_sscg_is_enable(struct clk_hw *hwclk)
  153. {
  154. struct ark_clk *clk = to_ark_clk(hwclk);
  155. u32 reg;
  156. reg = readl(clk->reg);
  157. return !!(reg & ARKE_SSCG_ENA);
  158. }
  159. static int clk_arke_sscg_enable(struct clk_hw *hwclk)
  160. {
  161. struct ark_clk *clk = to_ark_clk(hwclk);
  162. u32 reg;
  163. reg = readl(clk->reg);
  164. reg |= ARKE_SSCG_ENA;
  165. writel(reg, clk->reg);
  166. return 0;
  167. }
  168. static void clk_arke_sscg_disable(struct clk_hw *hwclk)
  169. {
  170. /* struct ark_clk *clk = to_ark_clk(hwclk);
  171. u32 reg;
  172. reg = readl(clk->reg);
  173. reg &= ~ARKE_SSCG_ENA;
  174. writel(reg, clk->reg); */
  175. return;
  176. }
  177. /*
  178. * fref=24MHz, nr=3, fint=8MHz
  179. * fvco=1000~2000MHz
  180. * rs = 7 (fvcomax/fint=250)
  181. * nf[23:15] integer nf[14:0] fraction
  182. */
  183. static int clk_arke_sscg_set_rate(struct clk_hw *hwclk, unsigned long rate,
  184. unsigned long parent_rate)
  185. {
  186. struct ark_clk *clk = to_ark_clk(hwclk);
  187. unsigned int nr = 3, fint = 8000, rs = 7;
  188. unsigned int od, fvco, nfx, nff, cpa, cpax;
  189. int i;
  190. u32 regval;
  191. u32 freq_khz = rate / 1000;
  192. regval = readl(clk->reg);
  193. nr = (regval >> ARKE_SSCG_NR_OFFSET) & ARKE_SSCG_NR_MASK;
  194. if (nr == 2) {
  195. fint = 12000;
  196. rs = 4;
  197. } else if (nr == 3) {
  198. fint = 8000;
  199. rs = 7;
  200. }
  201. if (!clk->can_change)
  202. return 0;
  203. freq_khz = freq_khz / fint * fint;
  204. for (i = 0; i < 8; i++) {
  205. fvco = freq_khz * (1 << i);
  206. if (fvco >= 1000 * 1000 && fvco <= 2000 * 1000) {
  207. od = i;
  208. break;
  209. }
  210. }
  211. if (i == 8)
  212. goto fail;
  213. nfx = fvco / fint;
  214. if (nfx >= 50 && nfx <= 100) {
  215. cpa = nfx * 4;
  216. cpax = 3;
  217. } else if (nfx > 100 && nfx <= 200) {
  218. cpa = nfx * 2;
  219. cpax = 1;
  220. } else if (nfx > 200 && nfx <= 400) {
  221. cpa = nfx;
  222. cpax = 0;
  223. }
  224. else
  225. goto fail;
  226. nff = ((1 << 15) * (fvco / 1000) / (fint / 1000)) & ((1 << 15) - 1);
  227. /* disable clk first */
  228. writel(readl(clk->reg2) | (1 << 27), clk->reg2);
  229. regval = readl(clk->reg);
  230. regval &= ~0x3FFFFF;
  231. regval |= (cpa << 0) | (cpax << 9) | (rs << 11) | (nr << 15);
  232. writel(regval, clk->reg);
  233. regval = readl(clk->reg2);
  234. regval &= ~0x7FFFFFF;
  235. regval |= ((nfx<<15) | nff) | (od << 24);
  236. writel(regval, clk->reg2) ;
  237. /* enable clk */
  238. writel(readl(clk->reg2) & ~(1 << 27), clk->reg2);
  239. mdelay(10);
  240. return 0;
  241. fail:
  242. pr_err("Unsupported sscg freq.\n");
  243. return -1;
  244. }
  245. static unsigned long clk_arke_sscg_recalc_rate(struct clk_hw *hwclk,
  246. unsigned long parent_rate)
  247. {
  248. struct ark_clk *clk = to_ark_clk(hwclk);
  249. u32 nr, fint, fvco, nfx, nff, od;
  250. u32 cfg0, cfg1;
  251. cfg0 = readl(clk->reg);
  252. nr = (cfg0 >> ARKE_SSCG_NR_OFFSET) & ARKE_SSCG_NR_MASK;
  253. nr = nr ? nr : 1;
  254. fint = parent_rate / nr;
  255. cfg1 = readl(clk->reg2);
  256. nff = (cfg1 >> ARKE_SSCG_NFF_OFFSET) & ARKE_SSCG_NFF_MASK;
  257. nfx = (cfg1 >> ARKE_SSCG_NFX_OFFSET) & ARKE_SSCG_NFX_MASK;
  258. fvco = fint * nfx + (u64)fint * nff / (ARKE_SSCG_NFF_MASK + 1);
  259. od = (cfg1 >> ARKE_SSCG_OD_OFFSET) & ARKE_SSCG_OD_MASK;
  260. pr_info("clk %s rate %u.\n", clk_hw_get_name(hwclk), fvco / (1 << od));
  261. return fvco / (1 << od);
  262. }
  263. static long clk_arke_sscg_round_rate(struct clk_hw *hwclk, unsigned long rate,
  264. unsigned long *parent_rate)
  265. {
  266. struct ark_clk *clk = to_ark_clk(hwclk);
  267. u32 regval, nr, freq;
  268. if (clk->can_change) {
  269. regval = readl(clk->reg);
  270. nr = (regval >> ARKE_SSCG_NR_OFFSET) & ARKE_SSCG_NR_MASK;
  271. freq = *parent_rate / nr;
  272. freq = rate / freq * freq;
  273. return freq;
  274. }
  275. return rate;
  276. }
  277. static const struct clk_ops clk_arke_sscg_ops = {
  278. .is_enabled = clk_arke_sscg_is_enable,
  279. .enable = clk_arke_sscg_enable,
  280. .disable = clk_arke_sscg_disable,
  281. .recalc_rate = clk_arke_sscg_recalc_rate,
  282. .set_rate = clk_arke_sscg_set_rate,
  283. .round_rate = clk_arke_sscg_round_rate,
  284. };
  285. static int clk_arke_pll_is_enable(struct clk_hw *hwclk)
  286. {
  287. struct ark_clk *clk = to_ark_clk(hwclk);
  288. u32 reg;
  289. reg = readl(clk->reg);
  290. return !!(reg & ARKE_PLL_ENA);
  291. }
  292. static int clk_arke_pll_enable(struct clk_hw *hwclk)
  293. {
  294. struct ark_clk *clk = to_ark_clk(hwclk);
  295. u32 reg;
  296. reg = readl(clk->reg);
  297. reg |= ARKE_PLL_ENA;
  298. writel(reg, clk->reg);
  299. return 0;
  300. }
  301. static void clk_arke_pll_disable(struct clk_hw *hwclk)
  302. {
  303. /* struct ark_clk *clk = to_ark_clk(hwclk);
  304. u32 reg;
  305. reg = readl(clk->reg);
  306. reg &= ~ARKE_PLL_ENA;
  307. writel(reg, clk->reg); */
  308. return;
  309. }
  310. static unsigned long clk_arke_pll_recalc_rate(struct clk_hw *hwclk,
  311. unsigned long parent_rate)
  312. {
  313. struct ark_clk *clk = to_ark_clk(hwclk);
  314. u32 ns, ms, ps;
  315. u32 cfg0;
  316. cfg0 = readl(clk->reg);
  317. ms = (cfg0 >> ARKE_PLL_MS_OFFSET) & ARKE_PLL_MS_MASK;
  318. ns = (cfg0 >> ARKE_PLL_NS_OFFSET) & ARKE_PLL_NS_MASK;
  319. ps = (cfg0 >> ARKE_PLL_PS_OFFSET) & ARKE_PLL_PS_MASK;
  320. ms = ms ? ms : 1;
  321. ns = ns ? ns : 1;
  322. ps = ps ? ps : 1;
  323. pr_info("clk %s rate %lu.\n", clk_hw_get_name(hwclk), parent_rate / ms * ns / ps / 2);
  324. return parent_rate / ms * ns / ps / 2;
  325. }
  326. static const struct clk_ops clk_arke_pll_ops = {
  327. .is_enabled = clk_arke_pll_is_enable,
  328. .enable = clk_arke_pll_enable,
  329. .disable = clk_arke_pll_disable,
  330. .recalc_rate = clk_arke_pll_recalc_rate,
  331. };
  332. static __init struct clk *ark_clk_init(struct device_node *node, enum ARK_CLK_TYPE clk_type, const struct clk_ops *ops)
  333. {
  334. u32 reg, reg2;
  335. struct ark_clk *ark_clk;
  336. const char *clk_name = node->name;
  337. const char *parent_name;
  338. struct clk_init_data init;
  339. struct device_node *srnp;
  340. int rc;
  341. rc = of_property_read_u32(node, "reg", &reg);
  342. if (WARN_ON(rc))
  343. return NULL;
  344. ark_clk = kzalloc(sizeof(*ark_clk), GFP_KERNEL);
  345. if (WARN_ON(!ark_clk))
  346. return NULL;
  347. /* Map system registers */
  348. srnp = of_find_compatible_node(NULL, NULL, "arkmicro,ark-sregs");
  349. ark_clk->reg = of_iomap(srnp, 0);
  350. BUG_ON(!ark_clk->reg);
  351. of_property_read_string(node, "clock-output-names", &clk_name);
  352. init.name = clk_name;
  353. init.ops = ops;
  354. init.flags = 0;
  355. if (clk_type == ARK_CLK_TYPE_PLL) {
  356. u32 offset, mask;
  357. int index;
  358. rc = of_property_read_u32(node, "reg2", &reg2);
  359. if (WARN_ON(rc))
  360. return NULL;
  361. rc = of_property_read_u32(node, "offset", &offset);
  362. if (WARN_ON(rc))
  363. return NULL;
  364. rc = of_property_read_u32(node, "mask", &mask);
  365. if (WARN_ON(rc))
  366. return NULL;
  367. index = (readl(ark_clk->reg + reg2) >> offset) & mask;
  368. parent_name = of_clk_get_parent_name(node, index);
  369. } else if (clk_type == ARK_CLK_TYPE_DDS || clk_type == ARKE_CLK_TYPE_SSCG) {
  370. rc = of_property_read_u32(node, "reg2", &reg2);
  371. if (WARN_ON(rc))
  372. return NULL;
  373. ark_clk->reg2 = ark_clk->reg + reg2;
  374. parent_name = of_clk_get_parent_name(node, 0);
  375. } else {
  376. parent_name = of_clk_get_parent_name(node, 0);
  377. }
  378. init.parent_names = &parent_name;
  379. init.num_parents = 1;
  380. ark_clk->can_change = of_property_read_bool(node, "clk-can-change");
  381. ark_clk->reg += reg;
  382. ark_clk->hw.init = &init;
  383. rc = clk_hw_register(NULL, &ark_clk->hw);
  384. if (WARN_ON(rc)) {
  385. kfree(ark_clk);
  386. return NULL;
  387. }
  388. rc = of_clk_add_hw_provider(node, of_clk_hw_simple_get, &ark_clk->hw);
  389. return ark_clk->hw.clk;
  390. }
  391. static void __init of_ark_clk_dds_setup(struct device_node *np)
  392. {
  393. ark_clk_init(np, ARK_CLK_TYPE_DDS, &clk_dds_ops);
  394. }
  395. CLK_OF_DECLARE(ark_clk_dds, "arkmiro,ark-clk-dds",
  396. of_ark_clk_dds_setup);
  397. static void __init of_ark_clk_pll_setup(struct device_node *np)
  398. {
  399. ark_clk_init(np, ARK_CLK_TYPE_PLL, &clk_pll_ops);
  400. }
  401. CLK_OF_DECLARE(ark_clk_pll, "arkmiro,ark-clk-pll",
  402. of_ark_clk_pll_setup);
  403. static void __init of_arke_clk_sscg_setup(struct device_node *np)
  404. {
  405. ark_clk_init(np, ARKE_CLK_TYPE_SSCG, &clk_arke_sscg_ops);
  406. }
  407. CLK_OF_DECLARE(arke_clk_sscg, "arkmiro,arke-clk-sscg",
  408. of_arke_clk_sscg_setup);
  409. static void __init of_arke_clk_pll_setup(struct device_node *np)
  410. {
  411. ark_clk_init(np, ARKE_CLK_TYPE_PLL, &clk_arke_pll_ops);
  412. }
  413. CLK_OF_DECLARE(arke_clk_pll, "arkmiro,arke-clk-pll",
  414. of_arke_clk_pll_setup);