clk-ep93xx.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  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 long ep93xx_div_round_rate(struct clk_hw *hw, unsigned long rate,
  323. unsigned long *parent_rate)
  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 ((rate * clk->div[i]) == *parent_rate)
  330. return rate;
  331. now = DIV_ROUND_CLOSEST(*parent_rate, clk->div[i]);
  332. if (!best || is_best(rate, now, best))
  333. best = now;
  334. }
  335. return best;
  336. }
  337. static int ep93xx_div_set_rate(struct clk_hw *hw, unsigned long rate,
  338. unsigned long parent_rate)
  339. {
  340. struct ep93xx_clk *clk = ep93xx_clk_from(hw);
  341. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  342. unsigned int i;
  343. u32 val;
  344. regmap_read(priv->map, clk->reg, &val);
  345. val &= ~clk->mask;
  346. for (i = 0; i < clk->num_div; i++)
  347. if (rate == DIV_ROUND_CLOSEST(parent_rate, clk->div[i]))
  348. break;
  349. if (i == clk->num_div)
  350. return -EINVAL;
  351. val |= i << clk->shift;
  352. ep93xx_clk_write(priv, clk->reg, val);
  353. return 0;
  354. }
  355. static const struct clk_ops ep93xx_div_ops = {
  356. .enable = ep93xx_clk_enable,
  357. .disable = ep93xx_clk_disable,
  358. .is_enabled = ep93xx_clk_is_enabled,
  359. .recalc_rate = ep93xx_div_recalc_rate,
  360. .round_rate = ep93xx_div_round_rate,
  361. .set_rate = ep93xx_div_set_rate,
  362. };
  363. static int ep93xx_register_div(struct ep93xx_clk *clk,
  364. const char *name,
  365. const struct clk_parent_data *parent_data,
  366. unsigned int reg,
  367. u8 enable_bit,
  368. u8 shift,
  369. u8 width,
  370. const char *clk_divisors,
  371. u8 num_div)
  372. {
  373. struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
  374. struct clk_init_data init = { };
  375. init.name = name;
  376. init.ops = &ep93xx_div_ops;
  377. init.flags = 0;
  378. init.parent_data = parent_data;
  379. init.num_parents = 1;
  380. clk->reg = reg;
  381. clk->bit_idx = enable_bit;
  382. clk->mask = GENMASK(shift + width - 1, shift);
  383. clk->shift = shift;
  384. clk->div = clk_divisors;
  385. clk->num_div = num_div;
  386. clk->hw.init = &init;
  387. return devm_clk_hw_register(priv->dev, &clk->hw);
  388. }
  389. struct ep93xx_gate {
  390. unsigned int idx;
  391. unsigned int bit;
  392. const char *name;
  393. };
  394. static const struct ep93xx_gate ep93xx_uarts[] = {
  395. { EP93XX_CLK_UART1, EP93XX_SYSCON_DEVCFG_U1EN, "uart1" },
  396. { EP93XX_CLK_UART2, EP93XX_SYSCON_DEVCFG_U2EN, "uart2" },
  397. { EP93XX_CLK_UART3, EP93XX_SYSCON_DEVCFG_U3EN, "uart3" },
  398. };
  399. static int ep93xx_uart_clock_init(struct ep93xx_clk_priv *priv)
  400. {
  401. struct clk_parent_data parent_data = { };
  402. unsigned int i, idx, ret, clk_uart_div;
  403. struct ep93xx_clk *clk;
  404. u32 val;
  405. regmap_read(priv->map, EP93XX_SYSCON_PWRCNT, &val);
  406. if (val & EP93XX_SYSCON_PWRCNT_UARTBAUD)
  407. clk_uart_div = 1;
  408. else
  409. clk_uart_div = 2;
  410. priv->fixed[EP93XX_CLK_UART] =
  411. devm_clk_hw_register_fixed_factor_index(priv->dev, "uart",
  412. 0, /* XTALI external clock */
  413. 0, 1, clk_uart_div);
  414. parent_data.hw = priv->fixed[EP93XX_CLK_UART];
  415. /* parenting uart gate clocks to uart clock */
  416. for (i = 0; i < ARRAY_SIZE(ep93xx_uarts); i++) {
  417. idx = ep93xx_uarts[i].idx - EP93XX_CLK_UART1;
  418. clk = &priv->reg[idx];
  419. clk->idx = idx;
  420. ret = ep93xx_clk_register_gate(clk,
  421. ep93xx_uarts[i].name,
  422. &parent_data, CLK_SET_RATE_PARENT,
  423. EP93XX_SYSCON_DEVCFG,
  424. ep93xx_uarts[i].bit);
  425. if (ret)
  426. return dev_err_probe(priv->dev, ret,
  427. "failed to register uart[%d] clock\n", i);
  428. }
  429. return 0;
  430. }
  431. static const struct ep93xx_gate ep93xx_dmas[] = {
  432. { EP93XX_CLK_M2M0, EP93XX_SYSCON_PWRCNT_DMA_M2M0, "m2m0" },
  433. { EP93XX_CLK_M2M1, EP93XX_SYSCON_PWRCNT_DMA_M2M1, "m2m1" },
  434. { EP93XX_CLK_M2P0, EP93XX_SYSCON_PWRCNT_DMA_M2P0, "m2p0" },
  435. { EP93XX_CLK_M2P1, EP93XX_SYSCON_PWRCNT_DMA_M2P1, "m2p1" },
  436. { EP93XX_CLK_M2P2, EP93XX_SYSCON_PWRCNT_DMA_M2P2, "m2p2" },
  437. { EP93XX_CLK_M2P3, EP93XX_SYSCON_PWRCNT_DMA_M2P3, "m2p3" },
  438. { EP93XX_CLK_M2P4, EP93XX_SYSCON_PWRCNT_DMA_M2P4, "m2p4" },
  439. { EP93XX_CLK_M2P5, EP93XX_SYSCON_PWRCNT_DMA_M2P5, "m2p5" },
  440. { EP93XX_CLK_M2P6, EP93XX_SYSCON_PWRCNT_DMA_M2P6, "m2p6" },
  441. { EP93XX_CLK_M2P7, EP93XX_SYSCON_PWRCNT_DMA_M2P7, "m2p7" },
  442. { EP93XX_CLK_M2P8, EP93XX_SYSCON_PWRCNT_DMA_M2P8, "m2p8" },
  443. { EP93XX_CLK_M2P9, EP93XX_SYSCON_PWRCNT_DMA_M2P9, "m2p9" },
  444. };
  445. static int ep93xx_dma_clock_init(struct ep93xx_clk_priv *priv)
  446. {
  447. struct clk_parent_data parent_data = { };
  448. unsigned int i, idx;
  449. parent_data.hw = priv->fixed[EP93XX_CLK_HCLK];
  450. for (i = 0; i < ARRAY_SIZE(ep93xx_dmas); i++) {
  451. idx = ep93xx_dmas[i].idx;
  452. priv->fixed[idx] = devm_clk_hw_register_gate_parent_data(priv->dev,
  453. ep93xx_dmas[i].name,
  454. &parent_data, 0,
  455. priv->base + EP93XX_SYSCON_PWRCNT,
  456. ep93xx_dmas[i].bit,
  457. 0,
  458. &priv->lock);
  459. if (IS_ERR(priv->fixed[idx]))
  460. return PTR_ERR(priv->fixed[idx]);
  461. }
  462. return 0;
  463. }
  464. static struct clk_hw *of_clk_ep93xx_get(struct of_phandle_args *clkspec, void *data)
  465. {
  466. struct ep93xx_clk_priv *priv = data;
  467. unsigned int idx = clkspec->args[0];
  468. if (idx < EP93XX_CLK_UART1)
  469. return priv->fixed[idx];
  470. if (idx <= EP93XX_CLK_I2S_LRCLK)
  471. return &priv->reg[idx - EP93XX_CLK_UART1].hw;
  472. return ERR_PTR(-EINVAL);
  473. }
  474. /*
  475. * PLL rate = 14.7456 MHz * (X1FBD + 1) * (X2FBD + 1) / (X2IPD + 1) / 2^PS
  476. */
  477. static unsigned long calc_pll_rate(u64 rate, u32 config_word)
  478. {
  479. rate *= ((config_word >> 11) & GENMASK(4, 0)) + 1; /* X1FBD */
  480. rate *= ((config_word >> 5) & GENMASK(5, 0)) + 1; /* X2FBD */
  481. do_div(rate, (config_word & GENMASK(4, 0)) + 1); /* X2IPD */
  482. rate >>= (config_word >> 16) & GENMASK(1, 0); /* PS */
  483. return rate;
  484. }
  485. static int ep93xx_plls_init(struct ep93xx_clk_priv *priv)
  486. {
  487. const char fclk_divisors[] = { 1, 2, 4, 8, 16, 1, 1, 1 };
  488. const char hclk_divisors[] = { 1, 2, 4, 5, 6, 8, 16, 32 };
  489. const char pclk_divisors[] = { 1, 2, 4, 8 };
  490. struct clk_parent_data xtali = { .index = 0 };
  491. unsigned int clk_f_div, clk_h_div, clk_p_div;
  492. unsigned long clk_pll1_rate, clk_pll2_rate;
  493. struct device *dev = priv->dev;
  494. struct clk_hw *hw, *pll1;
  495. u32 value;
  496. /* Determine the bootloader configured pll1 rate */
  497. regmap_read(priv->map, EP93XX_SYSCON_CLKSET1, &value);
  498. if (value & EP93XX_SYSCON_CLKSET1_NBYP1)
  499. clk_pll1_rate = calc_pll_rate(EP93XX_EXT_CLK_RATE, value);
  500. else
  501. clk_pll1_rate = EP93XX_EXT_CLK_RATE;
  502. pll1 = devm_clk_hw_register_fixed_rate_parent_data(dev, "pll1", &xtali,
  503. 0, clk_pll1_rate);
  504. if (IS_ERR(pll1))
  505. return PTR_ERR(pll1);
  506. priv->fixed[EP93XX_CLK_PLL1] = pll1;
  507. /* Initialize the pll1 derived clocks */
  508. clk_f_div = fclk_divisors[(value >> 25) & GENMASK(2, 0)];
  509. clk_h_div = hclk_divisors[(value >> 20) & GENMASK(2, 0)];
  510. clk_p_div = pclk_divisors[(value >> 18) & GENMASK(1, 0)];
  511. hw = devm_clk_hw_register_fixed_factor_parent_hw(dev, "fclk", pll1, 0, 1, clk_f_div);
  512. if (IS_ERR(hw))
  513. return PTR_ERR(hw);
  514. priv->fixed[EP93XX_CLK_FCLK] = hw;
  515. hw = devm_clk_hw_register_fixed_factor_parent_hw(dev, "hclk", pll1, 0, 1, clk_h_div);
  516. if (IS_ERR(hw))
  517. return PTR_ERR(hw);
  518. priv->fixed[EP93XX_CLK_HCLK] = hw;
  519. hw = devm_clk_hw_register_fixed_factor_parent_hw(dev, "pclk", hw, 0, 1, clk_p_div);
  520. if (IS_ERR(hw))
  521. return PTR_ERR(hw);
  522. priv->fixed[EP93XX_CLK_PCLK] = hw;
  523. /* Determine the bootloader configured pll2 rate */
  524. regmap_read(priv->map, EP93XX_SYSCON_CLKSET2, &value);
  525. if (!(value & EP93XX_SYSCON_CLKSET2_NBYP2))
  526. clk_pll2_rate = EP93XX_EXT_CLK_RATE;
  527. else if (value & EP93XX_SYSCON_CLKSET2_PLL2_EN)
  528. clk_pll2_rate = calc_pll_rate(EP93XX_EXT_CLK_RATE, value);
  529. else
  530. clk_pll2_rate = 0;
  531. hw = devm_clk_hw_register_fixed_rate_parent_data(dev, "pll2", &xtali,
  532. 0, clk_pll2_rate);
  533. if (IS_ERR(hw))
  534. return PTR_ERR(hw);
  535. priv->fixed[EP93XX_CLK_PLL2] = hw;
  536. return 0;
  537. }
  538. static int ep93xx_clk_probe(struct auxiliary_device *adev,
  539. const struct auxiliary_device_id *id)
  540. {
  541. struct ep93xx_regmap_adev *rdev = to_ep93xx_regmap_adev(adev);
  542. struct clk_parent_data xtali = { .index = 0 };
  543. struct clk_parent_data ddiv_pdata[3] = { };
  544. unsigned int clk_spi_div, clk_usb_div;
  545. struct clk_parent_data pdata = {};
  546. struct device *dev = &adev->dev;
  547. struct ep93xx_clk_priv *priv;
  548. struct ep93xx_clk *clk;
  549. struct clk_hw *hw;
  550. unsigned int idx;
  551. int ret;
  552. u32 value;
  553. priv = devm_kzalloc(dev, struct_size(priv, reg, 10), GFP_KERNEL);
  554. if (!priv)
  555. return -ENOMEM;
  556. spin_lock_init(&priv->lock);
  557. priv->dev = dev;
  558. priv->aux_dev = rdev;
  559. priv->map = rdev->map;
  560. priv->base = rdev->base;
  561. ret = ep93xx_plls_init(priv);
  562. if (ret)
  563. return ret;
  564. regmap_read(priv->map, EP93XX_SYSCON_CLKSET2, &value);
  565. clk_usb_div = (value >> 28 & GENMASK(3, 0)) + 1;
  566. hw = devm_clk_hw_register_fixed_factor_parent_hw(dev, "usb_clk",
  567. priv->fixed[EP93XX_CLK_PLL2], 0, 1,
  568. clk_usb_div);
  569. if (IS_ERR(hw))
  570. return PTR_ERR(hw);
  571. priv->fixed[EP93XX_CLK_USB] = hw;
  572. ret = ep93xx_uart_clock_init(priv);
  573. if (ret)
  574. return ret;
  575. ret = ep93xx_dma_clock_init(priv);
  576. if (ret)
  577. return ret;
  578. clk_spi_div = id->driver_data;
  579. hw = devm_clk_hw_register_fixed_factor_index(dev, "ep93xx-spi.0",
  580. 0, /* XTALI external clock */
  581. 0, 1, clk_spi_div);
  582. if (IS_ERR(hw))
  583. return PTR_ERR(hw);
  584. priv->fixed[EP93XX_CLK_SPI] = hw;
  585. /* PWM clock */
  586. hw = devm_clk_hw_register_fixed_factor_index(dev, "pwm_clk", 0, /* XTALI external clock */
  587. 0, 1, 1);
  588. if (IS_ERR(hw))
  589. return PTR_ERR(hw);
  590. priv->fixed[EP93XX_CLK_PWM] = hw;
  591. /* USB clock */
  592. pdata.hw = priv->fixed[EP93XX_CLK_USB];
  593. hw = devm_clk_hw_register_gate_parent_data(priv->dev, "ohci-platform", &pdata,
  594. 0, priv->base + EP93XX_SYSCON_PWRCNT,
  595. EP93XX_SYSCON_PWRCNT_USH_EN, 0,
  596. &priv->lock);
  597. if (IS_ERR(hw))
  598. return PTR_ERR(hw);
  599. priv->fixed[EP93XX_CLK_USB] = hw;
  600. ddiv_pdata[0].index = 0; /* XTALI external clock */
  601. ddiv_pdata[1].hw = priv->fixed[EP93XX_CLK_PLL1];
  602. ddiv_pdata[2].hw = priv->fixed[EP93XX_CLK_PLL2];
  603. /* touchscreen/ADC clock */
  604. idx = EP93XX_CLK_ADC - EP93XX_CLK_UART1;
  605. clk = &priv->reg[idx];
  606. clk->idx = idx;
  607. ret = ep93xx_register_div(clk, "ep93xx-adc", &xtali,
  608. EP93XX_SYSCON_KEYTCHCLKDIV,
  609. EP93XX_SYSCON_KEYTCHCLKDIV_TSEN,
  610. EP93XX_SYSCON_KEYTCHCLKDIV_ADIV,
  611. 1,
  612. ep93xx_adc_divisors,
  613. ARRAY_SIZE(ep93xx_adc_divisors));
  614. /* keypad clock */
  615. idx = EP93XX_CLK_KEYPAD - EP93XX_CLK_UART1;
  616. clk = &priv->reg[idx];
  617. clk->idx = idx;
  618. ret = ep93xx_register_div(clk, "ep93xx-keypad", &xtali,
  619. EP93XX_SYSCON_KEYTCHCLKDIV,
  620. EP93XX_SYSCON_KEYTCHCLKDIV_KEN,
  621. EP93XX_SYSCON_KEYTCHCLKDIV_KDIV,
  622. 1,
  623. ep93xx_adc_divisors,
  624. ARRAY_SIZE(ep93xx_adc_divisors));
  625. /*
  626. * On reset PDIV and VDIV is set to zero, while PDIV zero
  627. * means clock disable, VDIV shouldn't be zero.
  628. * So we set both video and i2s dividers to minimum.
  629. * ENA - Enable CLK divider.
  630. * PDIV - 00 - Disable clock
  631. * VDIV - at least 2
  632. */
  633. /* Check and enable video clk registers */
  634. regmap_read(priv->map, EP93XX_SYSCON_VIDCLKDIV, &value);
  635. value |= BIT(EP93XX_SYSCON_CLKDIV_PDIV_SHIFT) | 2;
  636. ep93xx_clk_write(priv, EP93XX_SYSCON_VIDCLKDIV, value);
  637. /* Check and enable i2s clk registers */
  638. regmap_read(priv->map, EP93XX_SYSCON_I2SCLKDIV, &value);
  639. value |= BIT(EP93XX_SYSCON_CLKDIV_PDIV_SHIFT) | 2;
  640. /*
  641. * Override the SAI_MSTR_CLK_CFG from the I2S block and use the
  642. * I2SClkDiv Register settings. LRCLK transitions on the falling SCLK
  643. * edge.
  644. */
  645. value |= EP93XX_SYSCON_I2SCLKDIV_ORIDE | EP93XX_SYSCON_I2SCLKDIV_SPOL;
  646. ep93xx_clk_write(priv, EP93XX_SYSCON_I2SCLKDIV, value);
  647. /* video clk */
  648. idx = EP93XX_CLK_VIDEO - EP93XX_CLK_UART1;
  649. clk = &priv->reg[idx];
  650. clk->idx = idx;
  651. ret = ep93xx_clk_register_ddiv(clk, "ep93xx-fb",
  652. ddiv_pdata, ARRAY_SIZE(ddiv_pdata),
  653. EP93XX_SYSCON_VIDCLKDIV,
  654. EP93XX_SYSCON_CLKDIV_ENABLE);
  655. /* i2s clk */
  656. idx = EP93XX_CLK_I2S_MCLK - EP93XX_CLK_UART1;
  657. clk = &priv->reg[idx];
  658. clk->idx = idx;
  659. ret = ep93xx_clk_register_ddiv(clk, "mclk",
  660. ddiv_pdata, ARRAY_SIZE(ddiv_pdata),
  661. EP93XX_SYSCON_I2SCLKDIV,
  662. EP93XX_SYSCON_CLKDIV_ENABLE);
  663. /* i2s sclk */
  664. idx = EP93XX_CLK_I2S_SCLK - EP93XX_CLK_UART1;
  665. clk = &priv->reg[idx];
  666. clk->idx = idx;
  667. pdata.hw = &priv->reg[EP93XX_CLK_I2S_MCLK - EP93XX_CLK_UART1].hw;
  668. ret = ep93xx_register_div(clk, "sclk", &pdata,
  669. EP93XX_SYSCON_I2SCLKDIV,
  670. EP93XX_SYSCON_I2SCLKDIV_SENA,
  671. 16, /* EP93XX_I2SCLKDIV_SDIV_SHIFT */
  672. 1, /* EP93XX_I2SCLKDIV_SDIV_WIDTH */
  673. ep93xx_sclk_divisors,
  674. ARRAY_SIZE(ep93xx_sclk_divisors));
  675. /* i2s lrclk */
  676. idx = EP93XX_CLK_I2S_LRCLK - EP93XX_CLK_UART1;
  677. clk = &priv->reg[idx];
  678. clk->idx = idx;
  679. pdata.hw = &priv->reg[EP93XX_CLK_I2S_SCLK - EP93XX_CLK_UART1].hw;
  680. ret = ep93xx_register_div(clk, "lrclk", &pdata,
  681. EP93XX_SYSCON_I2SCLKDIV,
  682. EP93XX_SYSCON_I2SCLKDIV_SENA,
  683. 17, /* EP93XX_I2SCLKDIV_LRDIV32_SHIFT */
  684. 2, /* EP93XX_I2SCLKDIV_LRDIV32_WIDTH */
  685. ep93xx_lrclk_divisors,
  686. ARRAY_SIZE(ep93xx_lrclk_divisors));
  687. /* IrDa clk uses same pattern but no init code presents in original clock driver */
  688. return devm_of_clk_add_hw_provider(priv->dev, of_clk_ep93xx_get, priv);
  689. }
  690. static const struct auxiliary_device_id ep93xx_clk_ids[] = {
  691. { .name = "soc_ep93xx.clk-ep93xx", .driver_data = 2, },
  692. { .name = "soc_ep93xx.clk-ep93xx.e2", .driver_data = 1, },
  693. { /* sentinel */ }
  694. };
  695. MODULE_DEVICE_TABLE(auxiliary, ep93xx_clk_ids);
  696. static struct auxiliary_driver ep93xx_clk_driver = {
  697. .probe = ep93xx_clk_probe,
  698. .id_table = ep93xx_clk_ids,
  699. };
  700. module_auxiliary_driver(ep93xx_clk_driver);
  701. MODULE_LICENSE("GPL");
  702. MODULE_AUTHOR("Nikita Shubin <nikita.shubin@maquefel.me>");
  703. MODULE_DESCRIPTION("Clock control for Cirrus EP93xx chips");