clock-r8a7779.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /*
  2. * r8a7779 clock framework support
  3. *
  4. * Copyright (C) 2011 Renesas Solutions Corp.
  5. * Copyright (C) 2011 Magnus Damm
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. */
  20. #include <linux/bitops.h>
  21. #include <linux/init.h>
  22. #include <linux/kernel.h>
  23. #include <linux/io.h>
  24. #include <linux/sh_clk.h>
  25. #include <linux/clkdev.h>
  26. #include <mach/clock.h>
  27. #include <mach/common.h>
  28. /*
  29. * MD1 = 1 MD1 = 0
  30. * (PLLA = 1500) (PLLA = 1600)
  31. * (MHz) (MHz)
  32. *------------------------------------------------+--------------------
  33. * clkz 1000 (2/3) 800 (1/2)
  34. * clkzs 250 (1/6) 200 (1/8)
  35. * clki 750 (1/2) 800 (1/2)
  36. * clks 250 (1/6) 200 (1/8)
  37. * clks1 125 (1/12) 100 (1/16)
  38. * clks3 187.5 (1/8) 200 (1/8)
  39. * clks4 93.7 (1/16) 100 (1/16)
  40. * clkp 62.5 (1/24) 50 (1/32)
  41. * clkg 62.5 (1/24) 66.6 (1/24)
  42. * clkb, CLKOUT
  43. * (MD2 = 0) 62.5 (1/24) 66.6 (1/24)
  44. * (MD2 = 1) 41.6 (1/36) 50 (1/32)
  45. */
  46. #define MD(nr) BIT(nr)
  47. #define FRQMR IOMEM(0xffc80014)
  48. #define MSTPCR0 IOMEM(0xffc80030)
  49. #define MSTPCR1 IOMEM(0xffc80034)
  50. #define MSTPCR3 IOMEM(0xffc8003c)
  51. #define MSTPSR1 IOMEM(0xffc80044)
  52. #define MSTPSR4 IOMEM(0xffc80048)
  53. #define MSTPSR6 IOMEM(0xffc8004c)
  54. #define MSTPCR4 IOMEM(0xffc80050)
  55. #define MSTPCR5 IOMEM(0xffc80054)
  56. #define MSTPCR6 IOMEM(0xffc80058)
  57. #define MSTPCR7 IOMEM(0xffc80040)
  58. #define MODEMR 0xffcc0020
  59. /* ioremap() through clock mapping mandatory to avoid
  60. * collision with ARM coherent DMA virtual memory range.
  61. */
  62. static struct clk_mapping cpg_mapping = {
  63. .phys = 0xffc80000,
  64. .len = 0x80,
  65. };
  66. /*
  67. * Default rate for the root input clock, reset this with clk_set_rate()
  68. * from the platform code.
  69. */
  70. static struct clk plla_clk = {
  71. /* .rate will be updated on r8a7779_clock_init() */
  72. .mapping = &cpg_mapping,
  73. };
  74. /*
  75. * clock ratio of these clock will be updated
  76. * on r8a7779_clock_init()
  77. */
  78. SH_FIXED_RATIO_CLK_SET(clkz_clk, plla_clk, 1, 1);
  79. SH_FIXED_RATIO_CLK_SET(clkzs_clk, plla_clk, 1, 1);
  80. SH_FIXED_RATIO_CLK_SET(clki_clk, plla_clk, 1, 1);
  81. SH_FIXED_RATIO_CLK_SET(clks_clk, plla_clk, 1, 1);
  82. SH_FIXED_RATIO_CLK_SET(clks1_clk, plla_clk, 1, 1);
  83. SH_FIXED_RATIO_CLK_SET(clks3_clk, plla_clk, 1, 1);
  84. SH_FIXED_RATIO_CLK_SET(clks4_clk, plla_clk, 1, 1);
  85. SH_FIXED_RATIO_CLK_SET(clkb_clk, plla_clk, 1, 1);
  86. SH_FIXED_RATIO_CLK_SET(clkout_clk, plla_clk, 1, 1);
  87. SH_FIXED_RATIO_CLK_SET(clkp_clk, plla_clk, 1, 1);
  88. SH_FIXED_RATIO_CLK_SET(clkg_clk, plla_clk, 1, 1);
  89. static struct clk *main_clks[] = {
  90. &plla_clk,
  91. &clkz_clk,
  92. &clkzs_clk,
  93. &clki_clk,
  94. &clks_clk,
  95. &clks1_clk,
  96. &clks3_clk,
  97. &clks4_clk,
  98. &clkb_clk,
  99. &clkout_clk,
  100. &clkp_clk,
  101. &clkg_clk,
  102. };
  103. enum { MSTP323, MSTP322, MSTP321, MSTP320,
  104. MSTP116, MSTP115, MSTP114,
  105. MSTP103, MSTP101, MSTP100,
  106. MSTP030,
  107. MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
  108. MSTP016, MSTP015, MSTP014,
  109. MSTP007,
  110. MSTP_NR };
  111. static struct clk mstp_clks[MSTP_NR] = {
  112. [MSTP323] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 23, 0), /* SDHI0 */
  113. [MSTP322] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 22, 0), /* SDHI1 */
  114. [MSTP321] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 21, 0), /* SDHI2 */
  115. [MSTP320] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 20, 0), /* SDHI3 */
  116. [MSTP116] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 16, 0), /* PCIe */
  117. [MSTP115] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 15, 0), /* SATA */
  118. [MSTP114] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 14, 0), /* Ether */
  119. [MSTP103] = SH_CLK_MSTP32(&clks_clk, MSTPCR1, 3, 0), /* DU */
  120. [MSTP101] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 1, 0), /* USB2 */
  121. [MSTP100] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 0, 0), /* USB0/1 */
  122. [MSTP030] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 30, 0), /* I2C0 */
  123. [MSTP029] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 29, 0), /* I2C1 */
  124. [MSTP028] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 28, 0), /* I2C2 */
  125. [MSTP027] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 27, 0), /* I2C3 */
  126. [MSTP026] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 26, 0), /* SCIF0 */
  127. [MSTP025] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 25, 0), /* SCIF1 */
  128. [MSTP024] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 24, 0), /* SCIF2 */
  129. [MSTP023] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 23, 0), /* SCIF3 */
  130. [MSTP022] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 22, 0), /* SCIF4 */
  131. [MSTP021] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 21, 0), /* SCIF5 */
  132. [MSTP016] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 16, 0), /* TMU0 */
  133. [MSTP015] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 15, 0), /* TMU1 */
  134. [MSTP014] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 14, 0), /* TMU2 */
  135. [MSTP007] = SH_CLK_MSTP32(&clks_clk, MSTPCR0, 7, 0), /* HSPI */
  136. };
  137. static struct clk_lookup lookups[] = {
  138. /* main clocks */
  139. CLKDEV_CON_ID("plla_clk", &plla_clk),
  140. CLKDEV_CON_ID("clkz_clk", &clkz_clk),
  141. CLKDEV_CON_ID("clkzs_clk", &clkzs_clk),
  142. /* DIV4 clocks */
  143. CLKDEV_CON_ID("shyway_clk", &clks_clk),
  144. CLKDEV_CON_ID("bus_clk", &clkout_clk),
  145. CLKDEV_CON_ID("shyway4_clk", &clks4_clk),
  146. CLKDEV_CON_ID("shyway3_clk", &clks3_clk),
  147. CLKDEV_CON_ID("shyway1_clk", &clks1_clk),
  148. CLKDEV_CON_ID("peripheral_clk", &clkp_clk),
  149. /* MSTP32 clocks */
  150. CLKDEV_DEV_ID("rcar-pcie", &mstp_clks[MSTP116]), /* PCIe */
  151. CLKDEV_DEV_ID("sata_rcar", &mstp_clks[MSTP115]), /* SATA */
  152. CLKDEV_DEV_ID("fc600000.sata", &mstp_clks[MSTP115]), /* SATA w/DT */
  153. CLKDEV_DEV_ID("r8a777x-ether", &mstp_clks[MSTP114]), /* Ether */
  154. CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */
  155. CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */
  156. CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
  157. CLKDEV_DEV_ID("ohci-platform.0", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */
  158. CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP016]), /* TMU00 */
  159. CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP016]), /* TMU01 */
  160. CLKDEV_DEV_ID("sh_tmu.2", &mstp_clks[MSTP016]), /* TMU02 */
  161. CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */
  162. CLKDEV_DEV_ID("i2c-rcar.1", &mstp_clks[MSTP029]), /* I2C1 */
  163. CLKDEV_DEV_ID("i2c-rcar.2", &mstp_clks[MSTP028]), /* I2C2 */
  164. CLKDEV_DEV_ID("i2c-rcar.3", &mstp_clks[MSTP027]), /* I2C3 */
  165. CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP026]), /* SCIF0 */
  166. CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP025]), /* SCIF1 */
  167. CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP024]), /* SCIF2 */
  168. CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP023]), /* SCIF3 */
  169. CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP022]), /* SCIF4 */
  170. CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP021]), /* SCIF6 */
  171. CLKDEV_DEV_ID("sh-hspi.0", &mstp_clks[MSTP007]), /* HSPI0 */
  172. CLKDEV_DEV_ID("sh-hspi.1", &mstp_clks[MSTP007]), /* HSPI1 */
  173. CLKDEV_DEV_ID("sh-hspi.2", &mstp_clks[MSTP007]), /* HSPI2 */
  174. CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP323]), /* SDHI0 */
  175. CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */
  176. CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */
  177. CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP320]), /* SDHI3 */
  178. CLKDEV_DEV_ID("rcar-du.0", &mstp_clks[MSTP103]), /* DU */
  179. };
  180. void __init r8a7779_clock_init(void)
  181. {
  182. void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
  183. u32 mode;
  184. int k, ret = 0;
  185. BUG_ON(!modemr);
  186. mode = ioread32(modemr);
  187. iounmap(modemr);
  188. if (mode & MD(1)) {
  189. plla_clk.rate = 1500000000;
  190. SH_CLK_SET_RATIO(&clkz_clk_ratio, 2, 3);
  191. SH_CLK_SET_RATIO(&clkzs_clk_ratio, 1, 6);
  192. SH_CLK_SET_RATIO(&clki_clk_ratio, 1, 2);
  193. SH_CLK_SET_RATIO(&clks_clk_ratio, 1, 6);
  194. SH_CLK_SET_RATIO(&clks1_clk_ratio, 1, 12);
  195. SH_CLK_SET_RATIO(&clks3_clk_ratio, 1, 8);
  196. SH_CLK_SET_RATIO(&clks4_clk_ratio, 1, 16);
  197. SH_CLK_SET_RATIO(&clkp_clk_ratio, 1, 24);
  198. SH_CLK_SET_RATIO(&clkg_clk_ratio, 1, 24);
  199. if (mode & MD(2)) {
  200. SH_CLK_SET_RATIO(&clkb_clk_ratio, 1, 36);
  201. SH_CLK_SET_RATIO(&clkout_clk_ratio, 1, 36);
  202. } else {
  203. SH_CLK_SET_RATIO(&clkb_clk_ratio, 1, 24);
  204. SH_CLK_SET_RATIO(&clkout_clk_ratio, 1, 24);
  205. }
  206. } else {
  207. plla_clk.rate = 1600000000;
  208. SH_CLK_SET_RATIO(&clkz_clk_ratio, 1, 2);
  209. SH_CLK_SET_RATIO(&clkzs_clk_ratio, 1, 8);
  210. SH_CLK_SET_RATIO(&clki_clk_ratio, 1, 2);
  211. SH_CLK_SET_RATIO(&clks_clk_ratio, 1, 8);
  212. SH_CLK_SET_RATIO(&clks1_clk_ratio, 1, 16);
  213. SH_CLK_SET_RATIO(&clks3_clk_ratio, 1, 8);
  214. SH_CLK_SET_RATIO(&clks4_clk_ratio, 1, 16);
  215. SH_CLK_SET_RATIO(&clkp_clk_ratio, 1, 32);
  216. SH_CLK_SET_RATIO(&clkg_clk_ratio, 1, 24);
  217. if (mode & MD(2)) {
  218. SH_CLK_SET_RATIO(&clkb_clk_ratio, 1, 32);
  219. SH_CLK_SET_RATIO(&clkout_clk_ratio, 1, 32);
  220. } else {
  221. SH_CLK_SET_RATIO(&clkb_clk_ratio, 1, 24);
  222. SH_CLK_SET_RATIO(&clkout_clk_ratio, 1, 24);
  223. }
  224. }
  225. for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
  226. ret = clk_register(main_clks[k]);
  227. if (!ret)
  228. ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
  229. clkdev_add_table(lookups, ARRAY_SIZE(lookups));
  230. if (!ret)
  231. shmobile_clk_init();
  232. else
  233. panic("failed to setup r8a7779 clocks\n");
  234. }