clk-ep93xx.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Clock control for Cirrus EP93xx chips.
  4. * Copyright (C) 2021 Nikita Shubin <nikita.shubin@maquefel.me>
  5. *
  6. * Based on a rewrite of arch/arm/mach-ep93xx/clock.c:
  7. * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
  8. */
  9. #define pr_fmt(fmt) "ep93xx " KBUILD_MODNAME ": " fmt
  10. #include <linux/bits.h>
  11. #include <linux/cleanup.h>
  12. #include <linux/clk-provider.h>
  13. #include <linux/math.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/regmap.h>
  16. #include <linux/spinlock.h>
  17. #include <linux/soc/cirrus/ep93xx.h>
  18. #include <dt-bindings/clock/cirrus,ep9301-syscon.h>
  19. #include <asm/div64.h>
  20. #define EP93XX_EXT_CLK_RATE 14745600
  21. #define EP93XX_EXT_RTC_RATE 32768
  22. #define EP93XX_SYSCON_POWER_STATE 0x00
  23. #define EP93XX_SYSCON_PWRCNT 0x04
  24. #define EP93XX_SYSCON_PWRCNT_UARTBAUD BIT(29)
  25. #define EP93XX_SYSCON_PWRCNT_USH_EN 28
  26. #define EP93XX_SYSCON_PWRCNT_DMA_M2M1 27
  27. #define EP93XX_SYSCON_PWRCNT_DMA_M2M0 26
  28. #define EP93XX_SYSCON_PWRCNT_DMA_M2P8 25
  29. #define EP93XX_SYSCON_PWRCNT_DMA_M2P9 24
  30. #define EP93XX_SYSCON_PWRCNT_DMA_M2P6 23
  31. #define EP93XX_SYSCON_PWRCNT_DMA_M2P7 22
  32. #define EP93XX_SYSCON_PWRCNT_DMA_M2P4 21
  33. #define EP93XX_SYSCON_PWRCNT_DMA_M2P5 20
  34. #define EP93XX_SYSCON_PWRCNT_DMA_M2P2 19
  35. #define EP93XX_SYSCON_PWRCNT_DMA_M2P3 18
  36. #define EP93XX_SYSCON_PWRCNT_DMA_M2P0 17
  37. #define EP93XX_SYSCON_PWRCNT_DMA_M2P1 16
  38. #define EP93XX_SYSCON_CLKSET1 0x20
  39. #define EP93XX_SYSCON_CLKSET1_NBYP1 BIT(23)
  40. #define EP93XX_SYSCON_CLKSET2 0x24
  41. #define EP93XX_SYSCON_CLKSET2_NBYP2 BIT(19)
  42. #define EP93XX_SYSCON_CLKSET2_PLL2_EN BIT(18)
  43. #define EP93XX_SYSCON_DEVCFG 0x80
  44. #define EP93XX_SYSCON_DEVCFG_U3EN 24
  45. #define EP93XX_SYSCON_DEVCFG_U2EN 20
  46. #define EP93XX_SYSCON_DEVCFG_U1EN 18
  47. #define EP93XX_SYSCON_VIDCLKDIV 0x84
  48. #define EP93XX_SYSCON_CLKDIV_ENABLE 15
  49. #define EP93XX_SYSCON_CLKDIV_ESEL BIT(14)
  50. #define EP93XX_SYSCON_CLKDIV_PSEL BIT(13)
  51. #define EP93XX_SYSCON_CLKDIV_MASK GENMASK(14, 13)
  52. #define EP93XX_SYSCON_CLKDIV_PDIV_SHIFT 8
  53. #define EP93XX_SYSCON_I2SCLKDIV 0x8c
  54. #define EP93XX_SYSCON_I2SCLKDIV_SENA 31
  55. #define EP93XX_SYSCON_I2SCLKDIV_ORIDE BIT(29)
  56. #define EP93XX_SYSCON_I2SCLKDIV_SPOL BIT(19)
  57. #define EP93XX_SYSCON_KEYTCHCLKDIV 0x90
  58. #define EP93XX_SYSCON_KEYTCHCLKDIV_TSEN 31
  59. #define EP93XX_SYSCON_KEYTCHCLKDIV_ADIV 16
  60. #define EP93XX_SYSCON_KEYTCHCLKDIV_KEN 15
  61. #define EP93XX_SYSCON_KEYTCHCLKDIV_KDIV 0
  62. #define EP93XX_SYSCON_CHIPID 0x94
  63. #define EP93XX_SYSCON_CHIPID_ID 0x9213
  64. #define EP93XX_FIXED_CLK_COUNT 21
  65. static const char ep93xx_adc_divisors[] = { 16, 4 };
  66. static const char ep93xx_sclk_divisors[] = { 2, 4 };
  67. static const char ep93xx_lrclk_divisors[] = { 32, 64, 128 };
  68. struct ep93xx_clk {
  69. struct clk_hw hw;
  70. u16 idx;
  71. u16 reg;
  72. u32 mask;
  73. u8 bit_idx;
  74. u8 shift;
  75. u8 width;
  76. u8 num_div;
  77. const char *div;
  78. };
  79. struct ep93xx_clk_priv {
  80. spinlock_t lock;
  81. struct ep93xx_regmap_adev *aux_dev;
  82. struct device *dev;
  83. void __iomem *base;
  84. struct regmap *map;
  85. struct clk_hw *fixed[EP93XX_FIXED_CLK_COUNT];
  86. struct ep93xx_clk reg[];
  87. };
  88. static struct ep93xx_clk *ep93xx_clk_from(struct clk_hw *hw)
  89. {
  90. return container_of(hw, struct ep93xx_clk, hw);
  91. }
  92. static struct ep93xx_clk_priv *ep93xx_priv_from(struct ep93xx_clk *clk)
  93. {
  94. return container_of(clk, struct ep93xx_clk_priv, reg[clk->idx]);
  95. }
  96. static void ep93xx_clk_write(struct ep93xx_clk_priv *priv, unsigned int reg, unsigned int val)
  97. {
  98. struct ep93xx_regmap_adev *aux = priv->aux_dev;
  99. aux->write(aux->map, aux->lock, reg, val);
  100. }
  101. static int ep93xx_clk_is_enabled(struct clk_hw *hw)
  102. {
  103. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  104. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  105. u32 val;
  106. regmap_read(priv->map, clk->reg, &val);
  107. return !!(val & BIT(clk->bit_idx));
  108. }
  109. static int ep93xx_clk_enable(struct clk_hw *hw)
  110. {
  111. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  112. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  113. u32 val;
  114. guard(spinlock_irqsave)(&priv->lock);
  115. regmap_read(priv->map, clk->reg, &val);
  116. val |= BIT(clk->bit_idx);
  117. ep93xx_clk_write(priv, clk->reg, val);
  118. return 0;
  119. }
  120. static void ep93xx_clk_disable(struct clk_hw *hw)
  121. {
  122. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  123. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  124. u32 val;
  125. guard(spinlock_irqsave)(&priv->lock);
  126. regmap_read(priv->map, clk->reg, &val);
  127. val &= ~BIT(clk->bit_idx);
  128. ep93xx_clk_write(priv, clk->reg, val);
  129. }
  130. static const struct clk_ops clk_ep93xx_gate_ops = {
  131. .enable = ep93xx_clk_enable,
  132. .disable = ep93xx_clk_disable,
  133. .is_enabled = ep93xx_clk_is_enabled,
  134. };
  135. static int ep93xx_clk_register_gate(struct ep93xx_clk *clk,
  136. const char *name,
  137. struct clk_parent_data *parent_data,
  138. unsigned long flags,
  139. unsigned int reg,
  140. u8 bit_idx)
  141. {
  142. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  143. struct clk_init_data init = { };
  144. init.name = name;
  145. init.ops = &clk_ep93xx_gate_ops;
  146. init.flags = flags;
  147. init.parent_data = parent_data;
  148. init.num_parents = 1;
  149. clk->reg = reg;
  150. clk->bit_idx = bit_idx;
  151. clk->hw.init = &init;
  152. return devm_clk_hw_register(priv->dev, &clk->hw);
  153. }
  154. static u8 ep93xx_mux_get_parent(struct clk_hw *hw)
  155. {
  156. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  157. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  158. u32 val;
  159. regmap_read(priv->map, clk->reg, &val);
  160. val &= EP93XX_SYSCON_CLKDIV_MASK;
  161. switch (val) {
  162. case EP93XX_SYSCON_CLKDIV_ESEL:
  163. return 1; /* PLL1 */
  164. case EP93XX_SYSCON_CLKDIV_MASK:
  165. return 2; /* PLL2 */
  166. default:
  167. return 0; /* XTALI */
  168. };
  169. }
  170. static int ep93xx_mux_set_parent_lock(struct clk_hw *hw, u8 index)
  171. {
  172. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  173. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  174. u32 val;
  175. if (index >= 3)
  176. return -EINVAL;
  177. guard(spinlock_irqsave)(&priv->lock);
  178. regmap_read(priv->map, clk->reg, &val);
  179. val &= ~(EP93XX_SYSCON_CLKDIV_MASK);
  180. val |= index > 0 ? EP93XX_SYSCON_CLKDIV_ESEL : 0;
  181. val |= index > 1 ? EP93XX_SYSCON_CLKDIV_PSEL : 0;
  182. ep93xx_clk_write(priv, clk->reg, val);
  183. return 0;
  184. }
  185. static bool is_best(unsigned long rate, unsigned long now,
  186. unsigned long best)
  187. {
  188. return abs_diff(rate, now) < abs_diff(rate, best);
  189. }
  190. static int ep93xx_mux_determine_rate(struct clk_hw *hw,
  191. struct clk_rate_request *req)
  192. {
  193. unsigned long best_rate = 0, actual_rate, mclk_rate;
  194. unsigned long rate = req->rate;
  195. struct clk_hw *parent_best = NULL;
  196. unsigned long parent_rate_best;
  197. unsigned long parent_rate;
  198. int div, pdiv;
  199. unsigned int i;
  200. /*
  201. * Try the two pll's and the external clock,
  202. * because the valid predividers are 2, 2.5 and 3, we multiply
  203. * all the clocks by 2 to avoid floating point math.
  204. *
  205. * This is based on the algorithm in the ep93xx raster guide:
  206. * http://be-a-maverick.com/en/pubs/appNote/AN269REV1.pdf
  207. *
  208. */
  209. for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
  210. struct clk_hw *parent = clk_hw_get_parent_by_index(hw, i);
  211. parent_rate = clk_hw_get_rate(parent);
  212. mclk_rate = parent_rate * 2;
  213. /* Try each predivider value */
  214. for (pdiv = 4; pdiv <= 6; pdiv++) {
  215. div = DIV_ROUND_CLOSEST(mclk_rate, rate * pdiv);
  216. if (!in_range(div, 1, 127))
  217. continue;
  218. actual_rate = DIV_ROUND_CLOSEST(mclk_rate, pdiv * div);
  219. if (is_best(rate, actual_rate, best_rate)) {
  220. best_rate = actual_rate;
  221. parent_rate_best = parent_rate;
  222. parent_best = parent;
  223. }
  224. }
  225. }
  226. if (!parent_best)
  227. return -EINVAL;
  228. req->best_parent_rate = parent_rate_best;
  229. req->best_parent_hw = parent_best;
  230. req->rate = best_rate;
  231. return 0;
  232. }
  233. static unsigned long ep93xx_ddiv_recalc_rate(struct clk_hw *hw,
  234. unsigned long parent_rate)
  235. {
  236. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  237. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  238. unsigned int pdiv, div;
  239. u32 val;
  240. regmap_read(priv->map, clk->reg, &val);
  241. pdiv = (val >> EP93XX_SYSCON_CLKDIV_PDIV_SHIFT) & GENMASK(1, 0);
  242. div = val & GENMASK(6, 0);
  243. if (!div)
  244. return 0;
  245. return DIV_ROUND_CLOSEST(parent_rate * 2, (pdiv + 3) * div);
  246. }
  247. static int ep93xx_ddiv_set_rate(struct clk_hw *hw, unsigned long rate,
  248. unsigned long parent_rate)
  249. {
  250. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  251. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  252. int pdiv, div, npdiv, ndiv;
  253. unsigned long actual_rate, mclk_rate, rate_err = ULONG_MAX;
  254. u32 val;
  255. regmap_read(priv->map, clk->reg, &val);
  256. mclk_rate = parent_rate * 2;
  257. for (pdiv = 4; pdiv <= 6; pdiv++) {
  258. div = DIV_ROUND_CLOSEST(mclk_rate, rate * pdiv);
  259. if (!in_range(div, 1, 127))
  260. continue;
  261. actual_rate = DIV_ROUND_CLOSEST(mclk_rate, pdiv * div);
  262. if (abs(actual_rate - rate) < rate_err) {
  263. npdiv = pdiv - 3;
  264. ndiv = div;
  265. rate_err = abs(actual_rate - rate);
  266. }
  267. }
  268. if (rate_err == ULONG_MAX)
  269. return -EINVAL;
  270. /*
  271. * Clear old dividers.
  272. * Bit 7 is reserved bit in all ClkDiv registers.
  273. */
  274. val &= ~(GENMASK(9, 0) & ~BIT(7));
  275. /* Set the new pdiv and div bits for the new clock rate */
  276. val |= (npdiv << EP93XX_SYSCON_CLKDIV_PDIV_SHIFT) | ndiv;
  277. ep93xx_clk_write(priv, clk->reg, val);
  278. return 0;
  279. }
  280. static const struct clk_ops clk_ddiv_ops = {
  281. .enable = ep93xx_clk_enable,
  282. .disable = ep93xx_clk_disable,
  283. .is_enabled = ep93xx_clk_is_enabled,
  284. .get_parent = ep93xx_mux_get_parent,
  285. .set_parent = ep93xx_mux_set_parent_lock,
  286. .determine_rate = ep93xx_mux_determine_rate,
  287. .recalc_rate = ep93xx_ddiv_recalc_rate,
  288. .set_rate = ep93xx_ddiv_set_rate,
  289. };
  290. static int ep93xx_clk_register_ddiv(struct ep93xx_clk *clk,
  291. const char *name,
  292. struct clk_parent_data *parent_data,
  293. u8 num_parents,
  294. unsigned int reg,
  295. u8 bit_idx)
  296. {
  297. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  298. struct clk_init_data init = { };
  299. init.name = name;
  300. init.ops = &clk_ddiv_ops;
  301. init.flags = 0;
  302. init.parent_data = parent_data;
  303. init.num_parents = num_parents;
  304. clk->reg = reg;
  305. clk->bit_idx = bit_idx;
  306. clk->hw.init = &init;
  307. return devm_clk_hw_register(priv->dev, &clk->hw);
  308. }
  309. static unsigned long ep93xx_div_recalc_rate(struct clk_hw *hw,
  310. unsigned long parent_rate)
  311. {
  312. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  313. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  314. u32 val;
  315. u8 index;
  316. regmap_read(priv->map, clk->reg, &val);
  317. index = (val & clk->mask) >> clk->shift;
  318. if (index >= clk->num_div)
  319. return 0;
  320. return DIV_ROUND_CLOSEST(parent_rate, clk->div[index]);
  321. }
  322. static int ep93xx_div_determine_rate(struct clk_hw *hw,
  323. struct clk_rate_request *req)
  324. {
  325. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  326. unsigned long best = 0, now;
  327. unsigned int i;
  328. for (i = 0; i < clk->num_div; i++) {
  329. if (req->rate * clk->div[i] == req->best_parent_rate)
  330. return 0;
  331. now = DIV_ROUND_CLOSEST(req->best_parent_rate, clk->div[i]);
  332. if (!best || is_best(req->rate, now, best))
  333. best = now;
  334. }
  335. req->rate = best;
  336. return 0;
  337. }
  338. static int ep93xx_div_set_rate(struct clk_hw *hw, unsigned long rate,
  339. unsigned long parent_rate)
  340. {
  341. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  342. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  343. unsigned int i;
  344. u32 val;
  345. regmap_read(priv->map, clk->reg, &val);
  346. val &= ~clk->mask;
  347. for (i = 0; i < clk->num_div; i++)
  348. if (rate == DIV_ROUND_CLOSEST(parent_rate, clk->div[i]))
  349. break;
  350. if (i == clk->num_div)
  351. return -EINVAL;
  352. val |= i << clk->shift;
  353. ep93xx_clk_write(priv, clk->reg, val);
  354. return 0;
  355. }
  356. static const struct clk_ops ep93xx_div_ops = {
  357. .enable = ep93xx_clk_enable,
  358. .disable = ep93xx_clk_disable,
  359. .is_enabled = ep93xx_clk_is_enabled,
  360. .recalc_rate = ep93xx_div_recalc_rate,
  361. .determine_rate = ep93xx_div_determine_rate,
  362. .set_rate = ep93xx_div_set_rate,
  363. };
  364. static int ep93xx_register_div(struct ep93xx_clk *clk,
  365. const char *name,
  366. const struct clk_parent_data *parent_data,
  367. unsigned int reg,
  368. u8 enable_bit,
  369. u8 shift,
  370. u8 width,
  371. const char *clk_divisors,
  372. u8 num_div)
  373. {
  374. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  375. struct clk_init_data init = { };
  376. init.name = name;
  377. init.ops = &ep93xx_div_ops;
  378. init.flags = 0;
  379. init.parent_data = parent_data;
  380. init.num_parents = 1;
  381. clk->reg = reg;
  382. clk->bit_idx = enable_bit;
  383. clk->mask = GENMASK(shift + width - 1, shift);
  384. clk->shift = shift;
  385. clk->div = clk_divisors;
  386. clk->num_div = num_div;
  387. clk->hw.init = &init;
  388. return devm_clk_hw_register(priv->dev, &clk->hw);
  389. }
  390. struct ep93xx_gate {
  391. unsigned int idx;
  392. unsigned int bit;
  393. const char *name;
  394. };
  395. static const struct ep93xx_gate ep93xx_uarts[] = {
  396. { EP93XX_CLK_UART1, EP93XX_SYSCON_DEVCFG_U1EN, "uart1" },
  397. { EP93XX_CLK_UART2, EP93XX_SYSCON_DEVCFG_U2EN, "uart2" },
  398. { EP93XX_CLK_UART3, EP93XX_SYSCON_DEVCFG_U3EN, "uart3" },
  399. };
  400. static int ep93xx_uart_clock_init(struct ep93xx_clk_priv *priv)
  401. {
  402. struct clk_parent_data parent_data = { };
  403. unsigned int i, idx, clk_uart_div;
  404. struct ep93xx_clk *clk;
  405. u32 val;
  406. int ret;
  407. regmap_read(priv->map, EP93XX_SYSCON_PWRCNT, &val);
  408. if (val & EP93XX_SYSCON_PWRCNT_UARTBAUD)
  409. clk_uart_div = 1;
  410. else
  411. clk_uart_div = 2;
  412. priv->fixed[EP93XX_CLK_UART] =
  413. devm_clk_hw_register_fixed_factor_index(priv->dev, "uart",
  414. 0, /* XTALI external clock */
  415. 0, 1, clk_uart_div);
  416. parent_data.hw = priv->fixed[EP93XX_CLK_UART];
  417. /* parenting uart gate clocks to uart clock */
  418. for (i = 0; i < ARRAY_SIZE(ep93xx_uarts); i++) {
  419. idx = ep93xx_uarts[i].idx - EP93XX_CLK_UART1;
  420. clk = &priv->reg[idx];
  421. clk->idx = idx;
  422. ret = ep93xx_clk_register_gate(clk,
  423. ep93xx_uarts[i].name,
  424. &parent_data, CLK_SET_RATE_PARENT,
  425. EP93XX_SYSCON_DEVCFG,
  426. ep93xx_uarts[i].bit);
  427. if (ret)
  428. return dev_err_probe(priv->dev, ret,
  429. "failed to register uart[%d] clock\n", i);
  430. }
  431. return 0;
  432. }
  433. static const struct ep93xx_gate ep93xx_dmas[] = {
  434. { EP93XX_CLK_M2M0, EP93XX_SYSCON_PWRCNT_DMA_M2M0, "m2m0" },
  435. { EP93XX_CLK_M2M1, EP93XX_SYSCON_PWRCNT_DMA_M2M1, "m2m1" },
  436. { EP93XX_CLK_M2P0, EP93XX_SYSCON_PWRCNT_DMA_M2P0, "m2p0" },
  437. { EP93XX_CLK_M2P1, EP93XX_SYSCON_PWRCNT_DMA_M2P1, "m2p1" },
  438. { EP93XX_CLK_M2P2, EP93XX_SYSCON_PWRCNT_DMA_M2P2, "m2p2" },
  439. { EP93XX_CLK_M2P3, EP93XX_SYSCON_PWRCNT_DMA_M2P3, "m2p3" },
  440. { EP93XX_CLK_M2P4, EP93XX_SYSCON_PWRCNT_DMA_M2P4, "m2p4" },
  441. { EP93XX_CLK_M2P5, EP93XX_SYSCON_PWRCNT_DMA_M2P5, "m2p5" },
  442. { EP93XX_CLK_M2P6, EP93XX_SYSCON_PWRCNT_DMA_M2P6, "m2p6" },
  443. { EP93XX_CLK_M2P7, EP93XX_SYSCON_PWRCNT_DMA_M2P7, "m2p7" },
  444. { EP93XX_CLK_M2P8, EP93XX_SYSCON_PWRCNT_DMA_M2P8, "m2p8" },
  445. { EP93XX_CLK_M2P9, EP93XX_SYSCON_PWRCNT_DMA_M2P9, "m2p9" },
  446. };
  447. static int ep93xx_dma_clock_init(struct ep93xx_clk_priv *priv)
  448. {
  449. struct clk_parent_data parent_data = { };
  450. unsigned int i, idx;
  451. parent_data.hw = priv->fixed[EP93XX_CLK_HCLK];
  452. for (i = 0; i < ARRAY_SIZE(ep93xx_dmas); i++) {
  453. idx = ep93xx_dmas[i].idx;
  454. priv->fixed[idx] = devm_clk_hw_register_gate_parent_data(priv->dev,
  455. ep93xx_dmas[i].name,
  456. &parent_data, 0,
  457. priv->base + EP93XX_SYSCON_PWRCNT,
  458. ep93xx_dmas[i].bit,
  459. 0,
  460. &priv->lock);
  461. if (IS_ERR(priv->fixed[idx]))
  462. return PTR_ERR(priv->fixed[idx]);
  463. }
  464. return 0;
  465. }
  466. static struct clk_hw *of_clk_ep93xx_get(struct of_phandle_args *clkspec, void *data)
  467. {
  468. struct ep93xx_clk_priv *priv = data;
  469. unsigned int idx = clkspec->args[0];
  470. if (idx < EP93XX_CLK_UART1)
  471. return priv->fixed[idx];
  472. if (idx <= EP93XX_CLK_I2S_LRCLK)
  473. return &priv->reg[idx - EP93XX_CLK_UART1].hw;
  474. return ERR_PTR(-EINVAL);
  475. }
  476. /*
  477. * PLL rate = 14.7456 MHz * (X1FBD + 1) * (X2FBD + 1) / (X2IPD + 1) / 2^PS
  478. */
  479. static unsigned long calc_pll_rate(u64 rate, u32 config_word)
  480. {
  481. rate *= ((config_word >> 11) & GENMASK(4, 0)) + 1; /* X1FBD */
  482. rate *= ((config_word >> 5) & GENMASK(5, 0)) + 1; /* X2FBD */
  483. do_div(rate, (config_word & GENMASK(4, 0)) + 1); /* X2IPD */
  484. rate >>= (config_word >> 16) & GENMASK(1, 0); /* PS */
  485. return rate;
  486. }
  487. static int ep93xx_plls_init(struct ep93xx_clk_priv *priv)
  488. {
  489. static const char fclk_divisors[] = { 1, 2, 4, 8, 16, 1, 1, 1 };
  490. static const char hclk_divisors[] = { 1, 2, 4, 5, 6, 8, 16, 32 };
  491. static const char pclk_divisors[] = { 1, 2, 4, 8 };
  492. struct clk_parent_data xtali = { .index = 0 };
  493. unsigned int clk_f_div, clk_h_div, clk_p_div;
  494. unsigned long clk_pll1_rate, clk_pll2_rate;
  495. struct device *dev = priv->dev;
  496. struct clk_hw *hw, *pll1;
  497. u32 value;
  498. /* Determine the bootloader configured pll1 rate */
  499. regmap_read(priv->map, EP93XX_SYSCON_CLKSET1, &value);
  500. if (value & EP93XX_SYSCON_CLKSET1_NBYP1)
  501. clk_pll1_rate = calc_pll_rate(EP93XX_EXT_CLK_RATE, value);
  502. else
  503. clk_pll1_rate = EP93XX_EXT_CLK_RATE;
  504. pll1 = devm_clk_hw_register_fixed_rate_parent_data(dev, "pll1", &xtali,
  505. 0, clk_pll1_rate);
  506. if (IS_ERR(pll1))
  507. return PTR_ERR(pll1);
  508. priv->fixed[EP93XX_CLK_PLL1] = pll1;
  509. /* Initialize the pll1 derived clocks */
  510. clk_f_div = fclk_divisors[(value >> 25) & GENMASK(2, 0)];
  511. clk_h_div = hclk_divisors[(value >> 20) & GENMASK(2, 0)];
  512. clk_p_div = pclk_divisors[(value >> 18) & GENMASK(1, 0)];
  513. hw = devm_clk_hw_register_fixed_factor_parent_hw(dev, "fclk", pll1, 0, 1, clk_f_div);
  514. if (IS_ERR(hw))
  515. return PTR_ERR(hw);
  516. priv->fixed[EP93XX_CLK_FCLK] = hw;
  517. hw = devm_clk_hw_register_fixed_factor_parent_hw(dev, "hclk", pll1, 0, 1, clk_h_div);
  518. if (IS_ERR(hw))
  519. return PTR_ERR(hw);
  520. priv->fixed[EP93XX_CLK_HCLK] = hw;
  521. hw = devm_clk_hw_register_fixed_factor_parent_hw(dev, "pclk", hw, 0, 1, clk_p_div);
  522. if (IS_ERR(hw))
  523. return PTR_ERR(hw);
  524. priv->fixed[EP93XX_CLK_PCLK] = hw;
  525. /* Determine the bootloader configured pll2 rate */
  526. regmap_read(priv->map, EP93XX_SYSCON_CLKSET2, &value);
  527. if (!(value & EP93XX_SYSCON_CLKSET2_NBYP2))
  528. clk_pll2_rate = EP93XX_EXT_CLK_RATE;
  529. else if (value & EP93XX_SYSCON_CLKSET2_PLL2_EN)
  530. clk_pll2_rate = calc_pll_rate(EP93XX_EXT_CLK_RATE, value);
  531. else
  532. clk_pll2_rate = 0;
  533. hw = devm_clk_hw_register_fixed_rate_parent_data(dev, "pll2", &xtali,
  534. 0, clk_pll2_rate);
  535. if (IS_ERR(hw))
  536. return PTR_ERR(hw);
  537. priv->fixed[EP93XX_CLK_PLL2] = hw;
  538. return 0;
  539. }
  540. static int ep93xx_clk_probe(struct auxiliary_device *adev,
  541. const struct auxiliary_device_id *id)
  542. {
  543. struct ep93xx_regmap_adev *rdev = to_ep93xx_regmap_adev(adev);
  544. struct clk_parent_data xtali = { .index = 0 };
  545. struct clk_parent_data ddiv_pdata[3] = { };
  546. unsigned int clk_spi_div, clk_usb_div;
  547. struct clk_parent_data pdata = {};
  548. struct device *dev = &adev->dev;
  549. struct ep93xx_clk_priv *priv;
  550. struct ep93xx_clk *clk;
  551. struct clk_hw *hw;
  552. unsigned int idx;
  553. int ret;
  554. u32 value;
  555. priv = devm_kzalloc(dev, struct_size(priv, reg, 10), GFP_KERNEL);
  556. if (!priv)
  557. return -ENOMEM;
  558. spin_lock_init(&priv->lock);
  559. priv->dev = dev;
  560. priv->aux_dev = rdev;
  561. priv->map = rdev->map;
  562. priv->base = rdev->base;
  563. ret = ep93xx_plls_init(priv);
  564. if (ret)
  565. return ret;
  566. regmap_read(priv->map, EP93XX_SYSCON_CLKSET2, &value);
  567. clk_usb_div = (value >> 28 & GENMASK(3, 0)) + 1;
  568. hw = devm_clk_hw_register_fixed_factor_parent_hw(dev, "usb_clk",
  569. priv->fixed[EP93XX_CLK_PLL2], 0, 1,
  570. clk_usb_div);
  571. if (IS_ERR(hw))
  572. return PTR_ERR(hw);
  573. priv->fixed[EP93XX_CLK_USB] = hw;
  574. ret = ep93xx_uart_clock_init(priv);
  575. if (ret)
  576. return ret;
  577. ret = ep93xx_dma_clock_init(priv);
  578. if (ret)
  579. return ret;
  580. clk_spi_div = id->driver_data;
  581. hw = devm_clk_hw_register_fixed_factor_index(dev, "ep93xx-spi.0",
  582. 0, /* XTALI external clock */
  583. 0, 1, clk_spi_div);
  584. if (IS_ERR(hw))
  585. return PTR_ERR(hw);
  586. priv->fixed[EP93XX_CLK_SPI] = hw;
  587. /* PWM clock */
  588. hw = devm_clk_hw_register_fixed_factor_index(dev, "pwm_clk", 0, /* XTALI external clock */
  589. 0, 1, 1);
  590. if (IS_ERR(hw))
  591. return PTR_ERR(hw);
  592. priv->fixed[EP93XX_CLK_PWM] = hw;
  593. /* USB clock */
  594. pdata.hw = priv->fixed[EP93XX_CLK_USB];
  595. hw = devm_clk_hw_register_gate_parent_data(priv->dev, "ohci-platform", &pdata,
  596. 0, priv->base + EP93XX_SYSCON_PWRCNT,
  597. EP93XX_SYSCON_PWRCNT_USH_EN, 0,
  598. &priv->lock);
  599. if (IS_ERR(hw))
  600. return PTR_ERR(hw);
  601. priv->fixed[EP93XX_CLK_USB] = hw;
  602. ddiv_pdata[0].index = 0; /* XTALI external clock */
  603. ddiv_pdata[1].hw = priv->fixed[EP93XX_CLK_PLL1];
  604. ddiv_pdata[2].hw = priv->fixed[EP93XX_CLK_PLL2];
  605. /* touchscreen/ADC clock */
  606. idx = EP93XX_CLK_ADC - EP93XX_CLK_UART1;
  607. clk = &priv->reg[idx];
  608. clk->idx = idx;
  609. ret = ep93xx_register_div(clk, "ep93xx-adc", &xtali,
  610. EP93XX_SYSCON_KEYTCHCLKDIV,
  611. EP93XX_SYSCON_KEYTCHCLKDIV_TSEN,
  612. EP93XX_SYSCON_KEYTCHCLKDIV_ADIV,
  613. 1,
  614. ep93xx_adc_divisors,
  615. ARRAY_SIZE(ep93xx_adc_divisors));
  616. /* keypad clock */
  617. idx = EP93XX_CLK_KEYPAD - EP93XX_CLK_UART1;
  618. clk = &priv->reg[idx];
  619. clk->idx = idx;
  620. ret = ep93xx_register_div(clk, "ep93xx-keypad", &xtali,
  621. EP93XX_SYSCON_KEYTCHCLKDIV,
  622. EP93XX_SYSCON_KEYTCHCLKDIV_KEN,
  623. EP93XX_SYSCON_KEYTCHCLKDIV_KDIV,
  624. 1,
  625. ep93xx_adc_divisors,
  626. ARRAY_SIZE(ep93xx_adc_divisors));
  627. /*
  628. * On reset PDIV and VDIV is set to zero, while PDIV zero
  629. * means clock disable, VDIV shouldn't be zero.
  630. * So we set both video and i2s dividers to minimum.
  631. * ENA - Enable CLK divider.
  632. * PDIV - 00 - Disable clock
  633. * VDIV - at least 2
  634. */
  635. /* Check and enable video clk registers */
  636. regmap_read(priv->map, EP93XX_SYSCON_VIDCLKDIV, &value);
  637. value |= BIT(EP93XX_SYSCON_CLKDIV_PDIV_SHIFT) | 2;
  638. ep93xx_clk_write(priv, EP93XX_SYSCON_VIDCLKDIV, value);
  639. /* Check and enable i2s clk registers */
  640. regmap_read(priv->map, EP93XX_SYSCON_I2SCLKDIV, &value);
  641. value |= BIT(EP93XX_SYSCON_CLKDIV_PDIV_SHIFT) | 2;
  642. /*
  643. * Override the SAI_MSTR_CLK_CFG from the I2S block and use the
  644. * I2SClkDiv Register settings. LRCLK transitions on the falling SCLK
  645. * edge.
  646. */
  647. value |= EP93XX_SYSCON_I2SCLKDIV_ORIDE | EP93XX_SYSCON_I2SCLKDIV_SPOL;
  648. ep93xx_clk_write(priv, EP93XX_SYSCON_I2SCLKDIV, value);
  649. /* video clk */
  650. idx = EP93XX_CLK_VIDEO - EP93XX_CLK_UART1;
  651. clk = &priv->reg[idx];
  652. clk->idx = idx;
  653. ret = ep93xx_clk_register_ddiv(clk, "ep93xx-fb",
  654. ddiv_pdata, ARRAY_SIZE(ddiv_pdata),
  655. EP93XX_SYSCON_VIDCLKDIV,
  656. EP93XX_SYSCON_CLKDIV_ENABLE);
  657. /* i2s clk */
  658. idx = EP93XX_CLK_I2S_MCLK - EP93XX_CLK_UART1;
  659. clk = &priv->reg[idx];
  660. clk->idx = idx;
  661. ret = ep93xx_clk_register_ddiv(clk, "mclk",
  662. ddiv_pdata, ARRAY_SIZE(ddiv_pdata),
  663. EP93XX_SYSCON_I2SCLKDIV,
  664. EP93XX_SYSCON_CLKDIV_ENABLE);
  665. /* i2s sclk */
  666. idx = EP93XX_CLK_I2S_SCLK - EP93XX_CLK_UART1;
  667. clk = &priv->reg[idx];
  668. clk->idx = idx;
  669. pdata.hw = &priv->reg[EP93XX_CLK_I2S_MCLK - EP93XX_CLK_UART1].hw;
  670. ret = ep93xx_register_div(clk, "sclk", &pdata,
  671. EP93XX_SYSCON_I2SCLKDIV,
  672. EP93XX_SYSCON_I2SCLKDIV_SENA,
  673. 16, /* EP93XX_I2SCLKDIV_SDIV_SHIFT */
  674. 1, /* EP93XX_I2SCLKDIV_SDIV_WIDTH */
  675. ep93xx_sclk_divisors,
  676. ARRAY_SIZE(ep93xx_sclk_divisors));
  677. /* i2s lrclk */
  678. idx = EP93XX_CLK_I2S_LRCLK - EP93XX_CLK_UART1;
  679. clk = &priv->reg[idx];
  680. clk->idx = idx;
  681. pdata.hw = &priv->reg[EP93XX_CLK_I2S_SCLK - EP93XX_CLK_UART1].hw;
  682. ret = ep93xx_register_div(clk, "lrclk", &pdata,
  683. EP93XX_SYSCON_I2SCLKDIV,
  684. EP93XX_SYSCON_I2SCLKDIV_SENA,
  685. 17, /* EP93XX_I2SCLKDIV_LRDIV32_SHIFT */
  686. 2, /* EP93XX_I2SCLKDIV_LRDIV32_WIDTH */
  687. ep93xx_lrclk_divisors,
  688. ARRAY_SIZE(ep93xx_lrclk_divisors));
  689. /* IrDa clk uses same pattern but no init code presents in original clock driver */
  690. return devm_of_clk_add_hw_provider(priv->dev, of_clk_ep93xx_get, priv);
  691. }
  692. static const struct auxiliary_device_id ep93xx_clk_ids[] = {
  693. { .name = "soc_ep93xx.clk-ep93xx", .driver_data = 2, },
  694. { .name = "soc_ep93xx.clk-ep93xx.e2", .driver_data = 1, },
  695. { /* sentinel */ }
  696. };
  697. MODULE_DEVICE_TABLE(auxiliary, ep93xx_clk_ids);
  698. static struct auxiliary_driver ep93xx_clk_driver = {
  699. .probe = ep93xx_clk_probe,
  700. .id_table = ep93xx_clk_ids,
  701. };
  702. module_auxiliary_driver(ep93xx_clk_driver);
  703. MODULE_LICENSE("GPL");
  704. MODULE_AUTHOR("Nikita Shubin <nikita.shubin@maquefel.me>");
  705. MODULE_DESCRIPTION("Clock control for Cirrus EP93xx chips");