clk-pxa27x.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Marvell PXA27x family clocks
  4. *
  5. * Copyright (C) 2014 Robert Jarzmik
  6. *
  7. * Heavily inspired from former arch/arm/mach-pxa/clock.c.
  8. */
  9. #include <linux/clk-provider.h>
  10. #include <linux/io.h>
  11. #include <linux/clk.h>
  12. #include <linux/clkdev.h>
  13. #include <linux/of.h>
  14. #include <linux/soc/pxa/smemc.h>
  15. #include <dt-bindings/clock/pxa-clock.h>
  16. #include "clk-pxa.h"
  17. #include "clk-pxa2xx.h"
  18. #define KHz 1000
  19. #define MHz (1000 * 1000)
  20. enum {
  21. PXA_CORE_13Mhz = 0,
  22. PXA_CORE_RUN,
  23. PXA_CORE_TURBO,
  24. };
  25. enum {
  26. PXA_BUS_13Mhz = 0,
  27. PXA_BUS_RUN,
  28. };
  29. enum {
  30. PXA_LCD_13Mhz = 0,
  31. PXA_LCD_RUN,
  32. };
  33. enum {
  34. PXA_MEM_13Mhz = 0,
  35. PXA_MEM_SYSTEM_BUS,
  36. PXA_MEM_RUN,
  37. };
  38. #define PXA27x_CLKCFG(B, HT, T) \
  39. (CLKCFG_FCS | \
  40. ((B) ? CLKCFG_FASTBUS : 0) | \
  41. ((HT) ? CLKCFG_HALFTURBO : 0) | \
  42. ((T) ? CLKCFG_TURBO : 0))
  43. #define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L)
  44. /* Define the refresh period in mSec for the SDRAM and the number of rows */
  45. #define SDRAM_TREF 64 /* standard 64ms SDRAM */
  46. static void __iomem *clk_regs;
  47. static const char * const get_freq_khz[] = {
  48. "core", "run", "cpll", "memory",
  49. "system_bus"
  50. };
  51. static u32 mdrefr_dri(unsigned int freq_khz)
  52. {
  53. u32 interval = freq_khz * SDRAM_TREF / pxa2xx_smemc_get_sdram_rows();
  54. return (interval - 31) / 32;
  55. }
  56. /*
  57. * Get the clock frequency as reflected by CCSR and the turbo flag.
  58. * We assume these values have been applied via a fcs.
  59. * If info is not 0 we also display the current settings.
  60. */
  61. unsigned int pxa27x_get_clk_frequency_khz(int info)
  62. {
  63. struct clk *clk;
  64. unsigned long clks[5];
  65. int i;
  66. for (i = 0; i < 5; i++) {
  67. clk = clk_get(NULL, get_freq_khz[i]);
  68. if (IS_ERR(clk)) {
  69. clks[i] = 0;
  70. } else {
  71. clks[i] = clk_get_rate(clk);
  72. clk_put(clk);
  73. }
  74. }
  75. if (info) {
  76. pr_info("Run Mode clock: %ld.%02ldMHz\n",
  77. clks[1] / 1000000, (clks[1] % 1000000) / 10000);
  78. pr_info("Turbo Mode clock: %ld.%02ldMHz\n",
  79. clks[2] / 1000000, (clks[2] % 1000000) / 10000);
  80. pr_info("Memory clock: %ld.%02ldMHz\n",
  81. clks[3] / 1000000, (clks[3] % 1000000) / 10000);
  82. pr_info("System bus clock: %ld.%02ldMHz\n",
  83. clks[4] / 1000000, (clks[4] % 1000000) / 10000);
  84. }
  85. return (unsigned int)clks[0] / KHz;
  86. }
  87. bool pxa27x_is_ppll_disabled(void)
  88. {
  89. unsigned long ccsr = readl(clk_regs + CCSR);
  90. return ccsr & (1 << CCCR_PPDIS_BIT);
  91. }
  92. #define PXA27X_CKEN(dev_id, con_id, parents, mult_hp, div_hp, \
  93. bit, is_lp, flags) \
  94. PXA_CKEN(dev_id, con_id, bit, parents, 1, 1, mult_hp, div_hp, \
  95. is_lp, CKEN, CKEN_ ## bit, flags)
  96. #define PXA27X_PBUS_CKEN(dev_id, con_id, bit, mult_hp, div_hp, delay) \
  97. PXA27X_CKEN(dev_id, con_id, pxa27x_pbus_parents, mult_hp, \
  98. div_hp, bit, pxa27x_is_ppll_disabled, 0)
  99. PARENTS(pxa27x_pbus) = { "osc_13mhz", "ppll_312mhz" };
  100. PARENTS(pxa27x_sbus) = { "system_bus", "system_bus" };
  101. PARENTS(pxa27x_32Mhz_bus) = { "osc_32_768khz", "osc_32_768khz" };
  102. PARENTS(pxa27x_lcd_bus) = { "lcd_base", "lcd_base" };
  103. PARENTS(pxa27x_membus) = { "lcd_base", "lcd_base" };
  104. #define PXA27X_CKEN_1RATE(dev_id, con_id, bit, parents, delay) \
  105. PXA_CKEN_1RATE(dev_id, con_id, bit, parents, \
  106. CKEN, CKEN_ ## bit, 0)
  107. #define PXA27X_CKEN_1RATE_AO(dev_id, con_id, bit, parents, delay) \
  108. PXA_CKEN_1RATE(dev_id, con_id, bit, parents, \
  109. CKEN, CKEN_ ## bit, CLK_IGNORE_UNUSED)
  110. static struct desc_clk_cken pxa27x_clocks[] __initdata = {
  111. PXA27X_PBUS_CKEN("pxa2xx-uart.0", NULL, FFUART, 2, 42, 1),
  112. PXA27X_PBUS_CKEN("pxa2xx-uart.1", NULL, BTUART, 2, 42, 1),
  113. PXA27X_PBUS_CKEN("pxa2xx-uart.2", NULL, STUART, 2, 42, 1),
  114. PXA27X_PBUS_CKEN("pxa2xx-i2s", NULL, I2S, 2, 51, 0),
  115. PXA27X_PBUS_CKEN("pxa2xx-i2c.0", NULL, I2C, 2, 19, 0),
  116. PXA27X_PBUS_CKEN("pxa27x-udc", NULL, USB, 2, 13, 5),
  117. PXA27X_PBUS_CKEN("pxa2xx-mci.0", NULL, MMC, 2, 32, 0),
  118. PXA27X_PBUS_CKEN("pxa2xx-ir", "FICPCLK", FICP, 2, 13, 0),
  119. PXA27X_PBUS_CKEN("pxa27x-ohci", NULL, USBHOST, 2, 13, 0),
  120. PXA27X_PBUS_CKEN("pxa2xx-i2c.1", NULL, PWRI2C, 1, 24, 0),
  121. PXA27X_PBUS_CKEN("pxa27x-ssp.0", NULL, SSP1, 1, 24, 0),
  122. PXA27X_PBUS_CKEN("pxa27x-ssp.1", NULL, SSP2, 1, 24, 0),
  123. PXA27X_PBUS_CKEN("pxa27x-ssp.2", NULL, SSP3, 1, 24, 0),
  124. PXA27X_PBUS_CKEN("pxa27x-pwm.0", NULL, PWM0, 1, 24, 0),
  125. PXA27X_PBUS_CKEN("pxa27x-pwm.1", NULL, PWM1, 1, 24, 0),
  126. PXA27X_PBUS_CKEN(NULL, "MSLCLK", MSL, 2, 13, 0),
  127. PXA27X_PBUS_CKEN(NULL, "USIMCLK", USIM, 2, 13, 0),
  128. PXA27X_PBUS_CKEN(NULL, "MSTKCLK", MEMSTK, 2, 32, 0),
  129. PXA27X_PBUS_CKEN(NULL, "AC97CLK", AC97, 1, 1, 0),
  130. PXA27X_PBUS_CKEN(NULL, "AC97CONFCLK", AC97CONF, 1, 1, 0),
  131. PXA27X_PBUS_CKEN(NULL, "OSTIMER0", OSTIMER, 1, 96, 0),
  132. PXA27X_CKEN_1RATE("pxa27x-keypad", NULL, KEYPAD,
  133. pxa27x_32Mhz_bus_parents, 0),
  134. PXA27X_CKEN_1RATE(NULL, "IMCLK", IM, pxa27x_sbus_parents, 0),
  135. PXA27X_CKEN_1RATE("pxa2xx-fb", NULL, LCD, pxa27x_lcd_bus_parents, 0),
  136. PXA27X_CKEN_1RATE("pxa27x-camera.0", NULL, CAMERA,
  137. pxa27x_lcd_bus_parents, 0),
  138. PXA27X_CKEN_1RATE_AO("pxa2xx-pcmcia", NULL, MEMC,
  139. pxa27x_membus_parents, 0),
  140. };
  141. /*
  142. * PXA270 definitions
  143. *
  144. * For the PXA27x:
  145. * Control variables are A, L, 2N for CCCR; B, HT, T for CLKCFG.
  146. *
  147. * A = 0 => memory controller clock from table 3-7,
  148. * A = 1 => memory controller clock = system bus clock
  149. * Run mode frequency = 13 MHz * L
  150. * Turbo mode frequency = 13 MHz * L * N
  151. * System bus frequency = 13 MHz * L / (B + 1)
  152. *
  153. * In CCCR:
  154. * A = 1
  155. * L = 16 oscillator to run mode ratio
  156. * 2N = 6 2 * (turbo mode to run mode ratio)
  157. *
  158. * In CCLKCFG:
  159. * B = 1 Fast bus mode
  160. * HT = 0 Half-Turbo mode
  161. * T = 1 Turbo mode
  162. *
  163. * For now, just support some of the combinations in table 3-7 of
  164. * PXA27x Processor Family Developer's Manual to simplify frequency
  165. * change sequences.
  166. */
  167. static struct pxa2xx_freq pxa27x_freqs[] = {
  168. {104000000, 104000, PXA27x_CCCR(1, 8, 2), 0, PXA27x_CLKCFG(1, 0, 1) },
  169. {156000000, 104000, PXA27x_CCCR(1, 8, 3), 0, PXA27x_CLKCFG(1, 0, 1) },
  170. {208000000, 208000, PXA27x_CCCR(0, 16, 2), 1, PXA27x_CLKCFG(0, 0, 1) },
  171. {312000000, 208000, PXA27x_CCCR(1, 16, 3), 1, PXA27x_CLKCFG(1, 0, 1) },
  172. {416000000, 208000, PXA27x_CCCR(1, 16, 4), 1, PXA27x_CLKCFG(1, 0, 1) },
  173. {520000000, 208000, PXA27x_CCCR(1, 16, 5), 1, PXA27x_CLKCFG(1, 0, 1) },
  174. {624000000, 208000, PXA27x_CCCR(1, 16, 6), 1, PXA27x_CLKCFG(1, 0, 1) },
  175. };
  176. static unsigned long clk_pxa27x_cpll_get_rate(struct clk_hw *hw,
  177. unsigned long parent_rate)
  178. {
  179. unsigned long clkcfg;
  180. unsigned int t, ht;
  181. unsigned int l, L, n2, N;
  182. unsigned long ccsr = readl(clk_regs + CCSR);
  183. asm("mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg));
  184. t = clkcfg & (1 << 0);
  185. ht = clkcfg & (1 << 2);
  186. l = ccsr & CCSR_L_MASK;
  187. n2 = (ccsr & CCSR_N2_MASK) >> CCSR_N2_SHIFT;
  188. L = l * parent_rate;
  189. N = (L * n2) / 2;
  190. return N;
  191. }
  192. static int clk_pxa27x_cpll_determine_rate(struct clk_hw *hw,
  193. struct clk_rate_request *req)
  194. {
  195. return pxa2xx_determine_rate(req, pxa27x_freqs,
  196. ARRAY_SIZE(pxa27x_freqs));
  197. }
  198. static int clk_pxa27x_cpll_set_rate(struct clk_hw *hw, unsigned long rate,
  199. unsigned long parent_rate)
  200. {
  201. int i;
  202. pr_debug("%s(rate=%lu parent_rate=%lu)\n", __func__, rate, parent_rate);
  203. for (i = 0; i < ARRAY_SIZE(pxa27x_freqs); i++)
  204. if (pxa27x_freqs[i].cpll == rate)
  205. break;
  206. if (i >= ARRAY_SIZE(pxa27x_freqs))
  207. return -EINVAL;
  208. pxa2xx_cpll_change(&pxa27x_freqs[i], mdrefr_dri, clk_regs + CCCR);
  209. return 0;
  210. }
  211. PARENTS(clk_pxa27x_cpll) = { "osc_13mhz" };
  212. RATE_OPS(clk_pxa27x_cpll, "cpll");
  213. static unsigned long clk_pxa27x_lcd_base_get_rate(struct clk_hw *hw,
  214. unsigned long parent_rate)
  215. {
  216. unsigned int l, osc_forced;
  217. unsigned long ccsr = readl(clk_regs + CCSR);
  218. unsigned long cccr = readl(clk_regs + CCCR);
  219. l = ccsr & CCSR_L_MASK;
  220. osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
  221. if (osc_forced) {
  222. if (cccr & (1 << CCCR_LCD_26_BIT))
  223. return parent_rate * 2;
  224. else
  225. return parent_rate;
  226. }
  227. if (l <= 7)
  228. return parent_rate;
  229. if (l <= 16)
  230. return parent_rate / 2;
  231. return parent_rate / 4;
  232. }
  233. static u8 clk_pxa27x_lcd_base_get_parent(struct clk_hw *hw)
  234. {
  235. unsigned int osc_forced;
  236. unsigned long ccsr = readl(clk_regs + CCSR);
  237. osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
  238. if (osc_forced)
  239. return PXA_LCD_13Mhz;
  240. else
  241. return PXA_LCD_RUN;
  242. }
  243. PARENTS(clk_pxa27x_lcd_base) = { "osc_13mhz", "run" };
  244. MUX_RO_RATE_RO_OPS(clk_pxa27x_lcd_base, "lcd_base");
  245. static void __init pxa27x_register_plls(void)
  246. {
  247. clk_register_fixed_rate(NULL, "osc_13mhz", NULL,
  248. CLK_GET_RATE_NOCACHE,
  249. 13 * MHz);
  250. clkdev_pxa_register(CLK_OSC32k768, "osc_32_768khz", NULL,
  251. clk_register_fixed_rate(NULL, "osc_32_768khz", NULL,
  252. CLK_GET_RATE_NOCACHE,
  253. 32768 * KHz));
  254. clk_register_fixed_rate(NULL, "clk_dummy", NULL, 0, 0);
  255. clk_register_fixed_factor(NULL, "ppll_312mhz", "osc_13mhz", 0, 24, 1);
  256. }
  257. static u8 clk_pxa27x_core_get_parent(struct clk_hw *hw)
  258. {
  259. unsigned long clkcfg;
  260. unsigned int t, ht, osc_forced;
  261. unsigned long ccsr = readl(clk_regs + CCSR);
  262. osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
  263. if (osc_forced)
  264. return PXA_CORE_13Mhz;
  265. asm("mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg));
  266. t = clkcfg & (1 << 0);
  267. ht = clkcfg & (1 << 2);
  268. if (ht || t)
  269. return PXA_CORE_TURBO;
  270. return PXA_CORE_RUN;
  271. }
  272. static int clk_pxa27x_core_set_parent(struct clk_hw *hw, u8 index)
  273. {
  274. if (index > PXA_CORE_TURBO)
  275. return -EINVAL;
  276. pxa2xx_core_turbo_switch(index == PXA_CORE_TURBO);
  277. return 0;
  278. }
  279. static int clk_pxa27x_core_determine_rate(struct clk_hw *hw,
  280. struct clk_rate_request *req)
  281. {
  282. return __clk_mux_determine_rate(hw, req);
  283. }
  284. PARENTS(clk_pxa27x_core) = { "osc_13mhz", "run", "cpll" };
  285. MUX_OPS(clk_pxa27x_core, "core", CLK_SET_RATE_PARENT);
  286. static unsigned long clk_pxa27x_run_get_rate(struct clk_hw *hw,
  287. unsigned long parent_rate)
  288. {
  289. unsigned long ccsr = readl(clk_regs + CCSR);
  290. unsigned int n2 = (ccsr & CCSR_N2_MASK) >> CCSR_N2_SHIFT;
  291. return (parent_rate / n2) * 2;
  292. }
  293. PARENTS(clk_pxa27x_run) = { "cpll" };
  294. RATE_RO_OPS(clk_pxa27x_run, "run");
  295. static void __init pxa27x_register_core(void)
  296. {
  297. clkdev_pxa_register(CLK_NONE, "cpll", NULL,
  298. clk_register_clk_pxa27x_cpll());
  299. clkdev_pxa_register(CLK_NONE, "run", NULL,
  300. clk_register_clk_pxa27x_run());
  301. clkdev_pxa_register(CLK_CORE, "core", NULL,
  302. clk_register_clk_pxa27x_core());
  303. }
  304. static unsigned long clk_pxa27x_system_bus_get_rate(struct clk_hw *hw,
  305. unsigned long parent_rate)
  306. {
  307. unsigned long clkcfg;
  308. unsigned int b, osc_forced;
  309. unsigned long ccsr = readl(clk_regs + CCSR);
  310. osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
  311. asm("mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg));
  312. b = clkcfg & (1 << 3);
  313. if (osc_forced)
  314. return parent_rate;
  315. if (b)
  316. return parent_rate;
  317. else
  318. return parent_rate / 2;
  319. }
  320. static u8 clk_pxa27x_system_bus_get_parent(struct clk_hw *hw)
  321. {
  322. unsigned int osc_forced;
  323. unsigned long ccsr = readl(clk_regs + CCSR);
  324. osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
  325. if (osc_forced)
  326. return PXA_BUS_13Mhz;
  327. else
  328. return PXA_BUS_RUN;
  329. }
  330. PARENTS(clk_pxa27x_system_bus) = { "osc_13mhz", "run" };
  331. MUX_RO_RATE_RO_OPS(clk_pxa27x_system_bus, "system_bus");
  332. static unsigned long clk_pxa27x_memory_get_rate(struct clk_hw *hw,
  333. unsigned long parent_rate)
  334. {
  335. unsigned int a, l, osc_forced;
  336. unsigned long cccr = readl(clk_regs + CCCR);
  337. unsigned long ccsr = readl(clk_regs + CCSR);
  338. osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
  339. a = cccr & (1 << CCCR_A_BIT);
  340. l = ccsr & CCSR_L_MASK;
  341. if (osc_forced || a)
  342. return parent_rate;
  343. if (l <= 10)
  344. return parent_rate;
  345. if (l <= 20)
  346. return parent_rate / 2;
  347. return parent_rate / 4;
  348. }
  349. static u8 clk_pxa27x_memory_get_parent(struct clk_hw *hw)
  350. {
  351. unsigned int osc_forced, a;
  352. unsigned long cccr = readl(clk_regs + CCCR);
  353. unsigned long ccsr = readl(clk_regs + CCSR);
  354. osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
  355. a = cccr & (1 << CCCR_A_BIT);
  356. if (osc_forced)
  357. return PXA_MEM_13Mhz;
  358. if (a)
  359. return PXA_MEM_SYSTEM_BUS;
  360. else
  361. return PXA_MEM_RUN;
  362. }
  363. PARENTS(clk_pxa27x_memory) = { "osc_13mhz", "system_bus", "run" };
  364. MUX_RO_RATE_RO_OPS(clk_pxa27x_memory, "memory");
  365. #define DUMMY_CLK(_con_id, _dev_id, _parent) \
  366. { .con_id = _con_id, .dev_id = _dev_id, .parent = _parent }
  367. struct dummy_clk {
  368. const char *con_id;
  369. const char *dev_id;
  370. const char *parent;
  371. };
  372. static struct dummy_clk dummy_clks[] __initdata = {
  373. DUMMY_CLK(NULL, "pxa27x-gpio", "osc_32_768khz"),
  374. DUMMY_CLK(NULL, "pxa-rtc", "osc_32_768khz"),
  375. DUMMY_CLK(NULL, "sa1100-rtc", "osc_32_768khz"),
  376. DUMMY_CLK("UARTCLK", "pxa2xx-ir", "STUART"),
  377. };
  378. static void __init pxa27x_dummy_clocks_init(void)
  379. {
  380. struct clk *clk;
  381. struct dummy_clk *d;
  382. const char *name;
  383. int i;
  384. for (i = 0; i < ARRAY_SIZE(dummy_clks); i++) {
  385. d = &dummy_clks[i];
  386. name = d->dev_id ? d->dev_id : d->con_id;
  387. clk = clk_register_fixed_factor(NULL, name, d->parent, 0, 1, 1);
  388. clk_register_clkdev(clk, d->con_id, d->dev_id);
  389. }
  390. }
  391. static void __init pxa27x_base_clocks_init(void)
  392. {
  393. pxa27x_register_plls();
  394. pxa27x_register_core();
  395. clkdev_pxa_register(CLK_NONE, "system_bus", NULL,
  396. clk_register_clk_pxa27x_system_bus());
  397. clkdev_pxa_register(CLK_NONE, "memory", NULL,
  398. clk_register_clk_pxa27x_memory());
  399. clk_register_clk_pxa27x_lcd_base();
  400. }
  401. int __init pxa27x_clocks_init(void __iomem *regs)
  402. {
  403. clk_regs = regs;
  404. pxa27x_base_clocks_init();
  405. pxa27x_dummy_clocks_init();
  406. return clk_pxa_cken_init(pxa27x_clocks, ARRAY_SIZE(pxa27x_clocks), regs);
  407. }
  408. static void __init pxa27x_dt_clocks_init(struct device_node *np)
  409. {
  410. pxa27x_clocks_init(ioremap(0x41300000ul, 0x10));
  411. clk_pxa_dt_common_init(np);
  412. }
  413. CLK_OF_DECLARE(pxa_clks, "marvell,pxa270-clocks", pxa27x_dt_clocks_init);