clock-r8a7791.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /*
  2. * r8a7791 clock framework support
  3. *
  4. * Copyright (C) 2013 Renesas Electronics Corporation
  5. * Copyright (C) 2013 Renesas Solutions Corp.
  6. * Copyright (C) 2013 Magnus Damm
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; version 2 of the License.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include <linux/init.h>
  22. #include <linux/io.h>
  23. #include <linux/kernel.h>
  24. #include <linux/sh_clk.h>
  25. #include <linux/clkdev.h>
  26. #include "clock.h"
  27. #include "common.h"
  28. #include "rcar-gen2.h"
  29. /*
  30. * MD EXTAL PLL0 PLL1 PLL3
  31. * 14 13 19 (MHz) *1 *1
  32. *---------------------------------------------------
  33. * 0 0 0 15 x 1 x172/2 x208/2 x106
  34. * 0 0 1 15 x 1 x172/2 x208/2 x88
  35. * 0 1 0 20 x 1 x130/2 x156/2 x80
  36. * 0 1 1 20 x 1 x130/2 x156/2 x66
  37. * 1 0 0 26 / 2 x200/2 x240/2 x122
  38. * 1 0 1 26 / 2 x200/2 x240/2 x102
  39. * 1 1 0 30 / 2 x172/2 x208/2 x106
  40. * 1 1 1 30 / 2 x172/2 x208/2 x88
  41. *
  42. * *1 : Table 7.6 indicates VCO ouput (PLLx = VCO/2)
  43. * see "p1 / 2" on R8A7791_CLOCK_ROOT() below
  44. */
  45. #define CPG_BASE 0xe6150000
  46. #define CPG_LEN 0x1000
  47. #define SMSTPCR0 0xE6150130
  48. #define SMSTPCR1 0xE6150134
  49. #define SMSTPCR2 0xe6150138
  50. #define SMSTPCR3 0xE615013C
  51. #define SMSTPCR5 0xE6150144
  52. #define SMSTPCR7 0xe615014c
  53. #define SMSTPCR8 0xE6150990
  54. #define SMSTPCR9 0xE6150994
  55. #define SMSTPCR10 0xE6150998
  56. #define SMSTPCR11 0xE615099C
  57. #define MSTPSR1 IOMEM(0xe6150038)
  58. #define MSTPSR2 IOMEM(0xe6150040)
  59. #define MSTPSR3 IOMEM(0xe6150048)
  60. #define MSTPSR5 IOMEM(0xe615003c)
  61. #define MSTPSR7 IOMEM(0xe61501c4)
  62. #define MSTPSR8 IOMEM(0xe61509a0)
  63. #define MSTPSR9 IOMEM(0xe61509a4)
  64. #define MSTPSR11 IOMEM(0xe61509ac)
  65. #define SDCKCR 0xE6150074
  66. #define SD1CKCR 0xE6150078
  67. #define SD2CKCR 0xE615026c
  68. #define MMC0CKCR 0xE6150240
  69. #define MMC1CKCR 0xE6150244
  70. #define SSPCKCR 0xE6150248
  71. #define SSPRSCKCR 0xE615024C
  72. static struct clk_mapping cpg_mapping = {
  73. .phys = CPG_BASE,
  74. .len = CPG_LEN,
  75. };
  76. static struct clk extal_clk = {
  77. /* .rate will be updated on r8a7791_clock_init() */
  78. .mapping = &cpg_mapping,
  79. };
  80. static struct sh_clk_ops followparent_clk_ops = {
  81. .recalc = followparent_recalc,
  82. };
  83. static struct clk main_clk = {
  84. /* .parent will be set r8a73a4_clock_init */
  85. .ops = &followparent_clk_ops,
  86. };
  87. /*
  88. * clock ratio of these clock will be updated
  89. * on r8a7791_clock_init()
  90. */
  91. SH_FIXED_RATIO_CLK_SET(pll1_clk, main_clk, 1, 1);
  92. SH_FIXED_RATIO_CLK_SET(pll3_clk, main_clk, 1, 1);
  93. SH_FIXED_RATIO_CLK_SET(qspi_clk, pll1_clk, 1, 1);
  94. /* fixed ratio clock */
  95. SH_FIXED_RATIO_CLK_SET(extal_div2_clk, extal_clk, 1, 2);
  96. SH_FIXED_RATIO_CLK_SET(cp_clk, extal_clk, 1, 2);
  97. SH_FIXED_RATIO_CLK_SET(pll1_div2_clk, pll1_clk, 1, 2);
  98. SH_FIXED_RATIO_CLK_SET(hp_clk, pll1_clk, 1, 12);
  99. SH_FIXED_RATIO_CLK_SET(p_clk, pll1_clk, 1, 24);
  100. SH_FIXED_RATIO_CLK_SET(rclk_clk, pll1_clk, 1, (48 * 1024));
  101. SH_FIXED_RATIO_CLK_SET(mp_clk, pll1_div2_clk, 1, 15);
  102. SH_FIXED_RATIO_CLK_SET(zg_clk, pll1_clk, 1, 3);
  103. SH_FIXED_RATIO_CLK_SET(zx_clk, pll1_clk, 1, 3);
  104. SH_FIXED_RATIO_CLK_SET(zs_clk, pll1_clk, 1, 6);
  105. static struct clk *main_clks[] = {
  106. &extal_clk,
  107. &extal_div2_clk,
  108. &main_clk,
  109. &pll1_clk,
  110. &pll1_div2_clk,
  111. &pll3_clk,
  112. &hp_clk,
  113. &p_clk,
  114. &qspi_clk,
  115. &rclk_clk,
  116. &mp_clk,
  117. &cp_clk,
  118. &zg_clk,
  119. &zx_clk,
  120. &zs_clk,
  121. };
  122. /* SDHI (DIV4) clock */
  123. static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, 24, 0, 36, 48, 10 };
  124. static struct clk_div_mult_table div4_div_mult_table = {
  125. .divisors = divisors,
  126. .nr_divisors = ARRAY_SIZE(divisors),
  127. };
  128. static struct clk_div4_table div4_table = {
  129. .div_mult_table = &div4_div_mult_table,
  130. };
  131. enum {
  132. DIV4_SDH, DIV4_SD0,
  133. DIV4_NR
  134. };
  135. static struct clk div4_clks[DIV4_NR] = {
  136. [DIV4_SDH] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 8, 0x0dff, CLK_ENABLE_ON_INIT),
  137. [DIV4_SD0] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 4, 0x1df0, CLK_ENABLE_ON_INIT),
  138. };
  139. /* DIV6 clocks */
  140. enum {
  141. DIV6_SD1, DIV6_SD2,
  142. DIV6_NR
  143. };
  144. static struct clk div6_clks[DIV6_NR] = {
  145. [DIV6_SD1] = SH_CLK_DIV6(&pll1_div2_clk, SD1CKCR, 0),
  146. [DIV6_SD2] = SH_CLK_DIV6(&pll1_div2_clk, SD2CKCR, 0),
  147. };
  148. /* MSTP */
  149. enum {
  150. MSTP1108, MSTP1107, MSTP1106,
  151. MSTP931, MSTP930, MSTP929, MSTP928, MSTP927, MSTP925,
  152. MSTP917,
  153. MSTP815, MSTP814,
  154. MSTP813,
  155. MSTP811, MSTP810, MSTP809,
  156. MSTP726, MSTP724, MSTP723, MSTP721, MSTP720,
  157. MSTP719, MSTP718, MSTP715, MSTP714,
  158. MSTP522,
  159. MSTP314, MSTP312, MSTP311,
  160. MSTP216, MSTP207, MSTP206,
  161. MSTP204, MSTP203, MSTP202,
  162. MSTP124,
  163. MSTP_NR
  164. };
  165. static struct clk mstp_clks[MSTP_NR] = {
  166. [MSTP1108] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR11, 8, MSTPSR11, 0), /* SCIFA5 */
  167. [MSTP1107] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR11, 7, MSTPSR11, 0), /* SCIFA4 */
  168. [MSTP1106] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR11, 6, MSTPSR11, 0), /* SCIFA3 */
  169. [MSTP931] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 31, MSTPSR9, 0), /* I2C0 */
  170. [MSTP930] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 30, MSTPSR9, 0), /* I2C1 */
  171. [MSTP929] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 29, MSTPSR9, 0), /* I2C2 */
  172. [MSTP928] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 28, MSTPSR9, 0), /* I2C3 */
  173. [MSTP927] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 27, MSTPSR9, 0), /* I2C4 */
  174. [MSTP925] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 25, MSTPSR9, 0), /* I2C5 */
  175. [MSTP917] = SH_CLK_MSTP32_STS(&qspi_clk, SMSTPCR9, 17, MSTPSR9, 0), /* QSPI */
  176. [MSTP815] = SH_CLK_MSTP32_STS(&zs_clk, SMSTPCR8, 15, MSTPSR8, 0), /* SATA0 */
  177. [MSTP814] = SH_CLK_MSTP32_STS(&zs_clk, SMSTPCR8, 14, MSTPSR8, 0), /* SATA1 */
  178. [MSTP813] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR8, 13, MSTPSR8, 0), /* Ether */
  179. [MSTP811] = SH_CLK_MSTP32_STS(&zg_clk, SMSTPCR8, 11, MSTPSR8, 0), /* VIN0 */
  180. [MSTP810] = SH_CLK_MSTP32_STS(&zg_clk, SMSTPCR8, 10, MSTPSR8, 0), /* VIN1 */
  181. [MSTP809] = SH_CLK_MSTP32_STS(&zg_clk, SMSTPCR8, 9, MSTPSR8, 0), /* VIN2 */
  182. [MSTP726] = SH_CLK_MSTP32_STS(&zx_clk, SMSTPCR7, 26, MSTPSR7, 0), /* LVDS0 */
  183. [MSTP724] = SH_CLK_MSTP32_STS(&zx_clk, SMSTPCR7, 24, MSTPSR7, 0), /* DU0 */
  184. [MSTP723] = SH_CLK_MSTP32_STS(&zx_clk, SMSTPCR7, 23, MSTPSR7, 0), /* DU1 */
  185. [MSTP721] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR7, 21, MSTPSR7, 0), /* SCIF0 */
  186. [MSTP720] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR7, 20, MSTPSR7, 0), /* SCIF1 */
  187. [MSTP719] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR7, 19, MSTPSR7, 0), /* SCIF2 */
  188. [MSTP718] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR7, 18, MSTPSR7, 0), /* SCIF3 */
  189. [MSTP715] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR7, 15, MSTPSR7, 0), /* SCIF4 */
  190. [MSTP714] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR7, 14, MSTPSR7, 0), /* SCIF5 */
  191. [MSTP522] = SH_CLK_MSTP32_STS(&extal_clk, SMSTPCR5, 22, MSTPSR5, 0), /* Thermal */
  192. [MSTP314] = SH_CLK_MSTP32_STS(&div4_clks[DIV4_SD0], SMSTPCR3, 14, MSTPSR3, 0), /* SDHI0 */
  193. [MSTP312] = SH_CLK_MSTP32_STS(&div6_clks[DIV6_SD1], SMSTPCR3, 12, MSTPSR3, 0), /* SDHI1 */
  194. [MSTP311] = SH_CLK_MSTP32_STS(&div6_clks[DIV6_SD2], SMSTPCR3, 11, MSTPSR3, 0), /* SDHI2 */
  195. [MSTP216] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 16, MSTPSR2, 0), /* SCIFB2 */
  196. [MSTP207] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 7, MSTPSR2, 0), /* SCIFB1 */
  197. [MSTP206] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 6, MSTPSR2, 0), /* SCIFB0 */
  198. [MSTP204] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 4, MSTPSR2, 0), /* SCIFA0 */
  199. [MSTP203] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 3, MSTPSR2, 0), /* SCIFA1 */
  200. [MSTP202] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 2, MSTPSR2, 0), /* SCIFA2 */
  201. [MSTP124] = SH_CLK_MSTP32_STS(&rclk_clk, SMSTPCR1, 24, MSTPSR1, 0), /* CMT0 */
  202. };
  203. static struct clk_lookup lookups[] = {
  204. /* main clocks */
  205. CLKDEV_CON_ID("extal", &extal_clk),
  206. CLKDEV_CON_ID("extal_div2", &extal_div2_clk),
  207. CLKDEV_CON_ID("main", &main_clk),
  208. CLKDEV_CON_ID("pll1", &pll1_clk),
  209. CLKDEV_CON_ID("pll1_div2", &pll1_div2_clk),
  210. CLKDEV_CON_ID("pll3", &pll3_clk),
  211. CLKDEV_CON_ID("zg", &zg_clk),
  212. CLKDEV_CON_ID("zs", &zs_clk),
  213. CLKDEV_CON_ID("hp", &hp_clk),
  214. CLKDEV_CON_ID("p", &p_clk),
  215. CLKDEV_CON_ID("qspi", &qspi_clk),
  216. CLKDEV_CON_ID("rclk", &rclk_clk),
  217. CLKDEV_CON_ID("mp", &mp_clk),
  218. CLKDEV_CON_ID("cp", &cp_clk),
  219. CLKDEV_CON_ID("peripheral_clk", &hp_clk),
  220. /* MSTP */
  221. CLKDEV_ICK_ID("lvds.0", "rcar-du-r8a7791", &mstp_clks[MSTP726]),
  222. CLKDEV_ICK_ID("du.0", "rcar-du-r8a7791", &mstp_clks[MSTP724]),
  223. CLKDEV_ICK_ID("du.1", "rcar-du-r8a7791", &mstp_clks[MSTP723]),
  224. CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */
  225. CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), /* SCIFA1 */
  226. CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP206]), /* SCIFB0 */
  227. CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP207]), /* SCIFB1 */
  228. CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP216]), /* SCIFB2 */
  229. CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP202]), /* SCIFA2 */
  230. CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP721]), /* SCIF0 */
  231. CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP720]), /* SCIF1 */
  232. CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP719]), /* SCIF2 */
  233. CLKDEV_DEV_ID("sh-sci.9", &mstp_clks[MSTP718]), /* SCIF3 */
  234. CLKDEV_DEV_ID("sh-sci.10", &mstp_clks[MSTP715]), /* SCIF4 */
  235. CLKDEV_DEV_ID("sh-sci.11", &mstp_clks[MSTP714]), /* SCIF5 */
  236. CLKDEV_DEV_ID("sh-sci.12", &mstp_clks[MSTP1106]), /* SCIFA3 */
  237. CLKDEV_DEV_ID("sh-sci.13", &mstp_clks[MSTP1107]), /* SCIFA4 */
  238. CLKDEV_DEV_ID("sh-sci.14", &mstp_clks[MSTP1108]), /* SCIFA5 */
  239. CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]),
  240. CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP312]),
  241. CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]),
  242. CLKDEV_ICK_ID("fck", "sh-cmt-48-gen2.0", &mstp_clks[MSTP124]),
  243. CLKDEV_DEV_ID("qspi.0", &mstp_clks[MSTP917]),
  244. CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]),
  245. CLKDEV_DEV_ID("i2c-rcar_gen2.0", &mstp_clks[MSTP931]),
  246. CLKDEV_DEV_ID("i2c-rcar_gen2.1", &mstp_clks[MSTP930]),
  247. CLKDEV_DEV_ID("i2c-rcar_gen2.2", &mstp_clks[MSTP929]),
  248. CLKDEV_DEV_ID("i2c-rcar_gen2.3", &mstp_clks[MSTP928]),
  249. CLKDEV_DEV_ID("i2c-rcar_gen2.4", &mstp_clks[MSTP927]),
  250. CLKDEV_DEV_ID("i2c-rcar_gen2.5", &mstp_clks[MSTP925]),
  251. CLKDEV_DEV_ID("r8a7791-ether", &mstp_clks[MSTP813]), /* Ether */
  252. CLKDEV_DEV_ID("r8a7791-vin.0", &mstp_clks[MSTP811]),
  253. CLKDEV_DEV_ID("r8a7791-vin.1", &mstp_clks[MSTP810]),
  254. CLKDEV_DEV_ID("r8a7791-vin.2", &mstp_clks[MSTP809]),
  255. CLKDEV_DEV_ID("sata-r8a7791.0", &mstp_clks[MSTP815]),
  256. CLKDEV_DEV_ID("sata-r8a7791.1", &mstp_clks[MSTP814]),
  257. };
  258. #define R8A7791_CLOCK_ROOT(e, m, p0, p1, p30, p31) \
  259. extal_clk.rate = e * 1000 * 1000; \
  260. main_clk.parent = m; \
  261. SH_CLK_SET_RATIO(&pll1_clk_ratio, p1 / 2, 1); \
  262. if (mode & MD(19)) \
  263. SH_CLK_SET_RATIO(&pll3_clk_ratio, p31, 1); \
  264. else \
  265. SH_CLK_SET_RATIO(&pll3_clk_ratio, p30, 1)
  266. void __init r8a7791_clock_init(void)
  267. {
  268. u32 mode = rcar_gen2_read_mode_pins();
  269. int k, ret = 0;
  270. switch (mode & (MD(14) | MD(13))) {
  271. case 0:
  272. R8A7791_CLOCK_ROOT(15, &extal_clk, 172, 208, 106, 88);
  273. break;
  274. case MD(13):
  275. R8A7791_CLOCK_ROOT(20, &extal_clk, 130, 156, 80, 66);
  276. break;
  277. case MD(14):
  278. R8A7791_CLOCK_ROOT(26, &extal_div2_clk, 200, 240, 122, 102);
  279. break;
  280. case MD(13) | MD(14):
  281. R8A7791_CLOCK_ROOT(30, &extal_div2_clk, 172, 208, 106, 88);
  282. break;
  283. }
  284. if ((mode & (MD(3) | MD(2) | MD(1))) == MD(2))
  285. SH_CLK_SET_RATIO(&qspi_clk_ratio, 1, 16);
  286. else
  287. SH_CLK_SET_RATIO(&qspi_clk_ratio, 1, 20);
  288. for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
  289. ret = clk_register(main_clks[k]);
  290. if (!ret)
  291. ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
  292. if (!ret)
  293. ret = sh_clk_div6_register(div6_clks, DIV6_NR);
  294. if (!ret)
  295. ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
  296. clkdev_add_table(lookups, ARRAY_SIZE(lookups));
  297. if (!ret)
  298. shmobile_clk_init();
  299. else
  300. goto epanic;
  301. return;
  302. epanic:
  303. panic("failed to setup r8a7791 clocks\n");
  304. }