clock.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. /*
  2. * arch/arm/mach-spear6xx/clock.c
  3. *
  4. * SPEAr6xx machines clock framework source file
  5. *
  6. * Copyright (C) 2009 ST Microelectronics
  7. * Viresh Kumar<viresh.kumar@st.com>
  8. *
  9. * This file is licensed under the terms of the GNU General Public
  10. * License version 2. This program is licensed "as is" without any
  11. * warranty of any kind, whether express or implied.
  12. */
  13. #include <linux/init.h>
  14. #include <linux/io.h>
  15. #include <linux/kernel.h>
  16. #include <plat/clock.h>
  17. #include <mach/misc_regs.h>
  18. #include <mach/spear.h>
  19. #define PLL1_CTR (MISC_BASE + 0x008)
  20. #define PLL1_FRQ (MISC_BASE + 0x00C)
  21. #define PLL1_MOD (MISC_BASE + 0x010)
  22. #define PLL2_CTR (MISC_BASE + 0x014)
  23. /* PLL_CTR register masks */
  24. #define PLL_ENABLE 2
  25. #define PLL_MODE_SHIFT 4
  26. #define PLL_MODE_MASK 0x3
  27. #define PLL_MODE_NORMAL 0
  28. #define PLL_MODE_FRACTION 1
  29. #define PLL_MODE_DITH_DSB 2
  30. #define PLL_MODE_DITH_SSB 3
  31. #define PLL2_FRQ (MISC_BASE + 0x018)
  32. /* PLL FRQ register masks */
  33. #define PLL_DIV_N_SHIFT 0
  34. #define PLL_DIV_N_MASK 0xFF
  35. #define PLL_DIV_P_SHIFT 8
  36. #define PLL_DIV_P_MASK 0x7
  37. #define PLL_NORM_FDBK_M_SHIFT 24
  38. #define PLL_NORM_FDBK_M_MASK 0xFF
  39. #define PLL_DITH_FDBK_M_SHIFT 16
  40. #define PLL_DITH_FDBK_M_MASK 0xFFFF
  41. #define PLL2_MOD (MISC_BASE + 0x01C)
  42. #define PLL_CLK_CFG (MISC_BASE + 0x020)
  43. #define CORE_CLK_CFG (MISC_BASE + 0x024)
  44. /* CORE CLK CFG register masks */
  45. #define PLL_HCLK_RATIO_SHIFT 10
  46. #define PLL_HCLK_RATIO_MASK 0x3
  47. #define HCLK_PCLK_RATIO_SHIFT 8
  48. #define HCLK_PCLK_RATIO_MASK 0x3
  49. #define PERIP_CLK_CFG (MISC_BASE + 0x028)
  50. /* PERIP_CLK_CFG register masks */
  51. #define CLCD_CLK_SHIFT 2
  52. #define CLCD_CLK_MASK 0x3
  53. #define UART_CLK_SHIFT 4
  54. #define UART_CLK_MASK 0x1
  55. #define FIRDA_CLK_SHIFT 5
  56. #define FIRDA_CLK_MASK 0x3
  57. #define GPT0_CLK_SHIFT 8
  58. #define GPT1_CLK_SHIFT 10
  59. #define GPT2_CLK_SHIFT 11
  60. #define GPT3_CLK_SHIFT 12
  61. #define GPT_CLK_MASK 0x1
  62. #define AUX_CLK_PLL3_VAL 0
  63. #define AUX_CLK_PLL1_VAL 1
  64. #define PERIP1_CLK_ENB (MISC_BASE + 0x02C)
  65. /* PERIP1_CLK_ENB register masks */
  66. #define UART0_CLK_ENB 3
  67. #define UART1_CLK_ENB 4
  68. #define SSP0_CLK_ENB 5
  69. #define SSP1_CLK_ENB 6
  70. #define I2C_CLK_ENB 7
  71. #define JPEG_CLK_ENB 8
  72. #define FSMC_CLK_ENB 9
  73. #define FIRDA_CLK_ENB 10
  74. #define GPT2_CLK_ENB 11
  75. #define GPT3_CLK_ENB 12
  76. #define GPIO2_CLK_ENB 13
  77. #define SSP2_CLK_ENB 14
  78. #define ADC_CLK_ENB 15
  79. #define GPT1_CLK_ENB 11
  80. #define RTC_CLK_ENB 17
  81. #define GPIO1_CLK_ENB 18
  82. #define DMA_CLK_ENB 19
  83. #define SMI_CLK_ENB 21
  84. #define CLCD_CLK_ENB 22
  85. #define GMAC_CLK_ENB 23
  86. #define USBD_CLK_ENB 24
  87. #define USBH0_CLK_ENB 25
  88. #define USBH1_CLK_ENB 26
  89. #define PRSC1_CLK_CFG (MISC_BASE + 0x044)
  90. #define PRSC2_CLK_CFG (MISC_BASE + 0x048)
  91. #define PRSC3_CLK_CFG (MISC_BASE + 0x04C)
  92. /* gpt synthesizer register masks */
  93. #define GPT_MSCALE_SHIFT 0
  94. #define GPT_MSCALE_MASK 0xFFF
  95. #define GPT_NSCALE_SHIFT 12
  96. #define GPT_NSCALE_MASK 0xF
  97. #define AMEM_CLK_CFG (MISC_BASE + 0x050)
  98. #define EXPI_CLK_CFG (MISC_BASE + 0x054)
  99. #define CLCD_CLK_SYNT (MISC_BASE + 0x05C)
  100. #define FIRDA_CLK_SYNT (MISC_BASE + 0x060)
  101. #define UART_CLK_SYNT (MISC_BASE + 0x064)
  102. #define GMAC_CLK_SYNT (MISC_BASE + 0x068)
  103. #define RAS1_CLK_SYNT (MISC_BASE + 0x06C)
  104. #define RAS2_CLK_SYNT (MISC_BASE + 0x070)
  105. #define RAS3_CLK_SYNT (MISC_BASE + 0x074)
  106. #define RAS4_CLK_SYNT (MISC_BASE + 0x078)
  107. /* aux clk synthesiser register masks for irda to ras4 */
  108. #define AUX_SYNT_ENB 31
  109. #define AUX_EQ_SEL_SHIFT 30
  110. #define AUX_EQ_SEL_MASK 1
  111. #define AUX_EQ1_SEL 0
  112. #define AUX_EQ2_SEL 1
  113. #define AUX_XSCALE_SHIFT 16
  114. #define AUX_XSCALE_MASK 0xFFF
  115. #define AUX_YSCALE_SHIFT 0
  116. #define AUX_YSCALE_MASK 0xFFF
  117. /* root clks */
  118. /* 32 KHz oscillator clock */
  119. static struct clk osc_32k_clk = {
  120. .flags = ALWAYS_ENABLED,
  121. .rate = 32000,
  122. };
  123. /* 30 MHz oscillator clock */
  124. static struct clk osc_30m_clk = {
  125. .flags = ALWAYS_ENABLED,
  126. .rate = 30000000,
  127. };
  128. /* clock derived from 32 KHz osc clk */
  129. /* rtc clock */
  130. static struct clk rtc_clk = {
  131. .pclk = &osc_32k_clk,
  132. .en_reg = PERIP1_CLK_ENB,
  133. .en_reg_bit = RTC_CLK_ENB,
  134. .recalc = &follow_parent,
  135. };
  136. /* clock derived from 30 MHz osc clk */
  137. /* pll masks structure */
  138. static struct pll_clk_masks pll1_masks = {
  139. .mode_mask = PLL_MODE_MASK,
  140. .mode_shift = PLL_MODE_SHIFT,
  141. .norm_fdbk_m_mask = PLL_NORM_FDBK_M_MASK,
  142. .norm_fdbk_m_shift = PLL_NORM_FDBK_M_SHIFT,
  143. .dith_fdbk_m_mask = PLL_DITH_FDBK_M_MASK,
  144. .dith_fdbk_m_shift = PLL_DITH_FDBK_M_SHIFT,
  145. .div_p_mask = PLL_DIV_P_MASK,
  146. .div_p_shift = PLL_DIV_P_SHIFT,
  147. .div_n_mask = PLL_DIV_N_MASK,
  148. .div_n_shift = PLL_DIV_N_SHIFT,
  149. };
  150. /* pll1 configuration structure */
  151. static struct pll_clk_config pll1_config = {
  152. .mode_reg = PLL1_CTR,
  153. .cfg_reg = PLL1_FRQ,
  154. .masks = &pll1_masks,
  155. };
  156. /* pll rate configuration table, in ascending order of rates */
  157. struct pll_rate_tbl pll_rtbl[] = {
  158. {.mode = 0, .m = 0x85, .n = 0x0C, .p = 0x1}, /* 266 MHz */
  159. {.mode = 0, .m = 0xA6, .n = 0x0C, .p = 0x1}, /* 332 MHz */
  160. };
  161. /* PLL1 clock */
  162. static struct clk pll1_clk = {
  163. .flags = ENABLED_ON_INIT,
  164. .pclk = &osc_30m_clk,
  165. .en_reg = PLL1_CTR,
  166. .en_reg_bit = PLL_ENABLE,
  167. .calc_rate = &pll_calc_rate,
  168. .recalc = &pll_clk_recalc,
  169. .set_rate = &pll_clk_set_rate,
  170. .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1},
  171. .private_data = &pll1_config,
  172. };
  173. /* PLL3 48 MHz clock */
  174. static struct clk pll3_48m_clk = {
  175. .flags = ALWAYS_ENABLED,
  176. .pclk = &osc_30m_clk,
  177. .rate = 48000000,
  178. };
  179. /* watch dog timer clock */
  180. static struct clk wdt_clk = {
  181. .flags = ALWAYS_ENABLED,
  182. .pclk = &osc_30m_clk,
  183. .recalc = &follow_parent,
  184. };
  185. /* clock derived from pll1 clk */
  186. /* cpu clock */
  187. static struct clk cpu_clk = {
  188. .flags = ALWAYS_ENABLED,
  189. .pclk = &pll1_clk,
  190. .recalc = &follow_parent,
  191. };
  192. /* ahb masks structure */
  193. static struct bus_clk_masks ahb_masks = {
  194. .mask = PLL_HCLK_RATIO_MASK,
  195. .shift = PLL_HCLK_RATIO_SHIFT,
  196. };
  197. /* ahb configuration structure */
  198. static struct bus_clk_config ahb_config = {
  199. .reg = CORE_CLK_CFG,
  200. .masks = &ahb_masks,
  201. };
  202. /* ahb rate configuration table, in ascending order of rates */
  203. struct bus_rate_tbl bus_rtbl[] = {
  204. {.div = 3}, /* == parent divided by 4 */
  205. {.div = 2}, /* == parent divided by 3 */
  206. {.div = 1}, /* == parent divided by 2 */
  207. {.div = 0}, /* == parent divided by 1 */
  208. };
  209. /* ahb clock */
  210. static struct clk ahb_clk = {
  211. .flags = ALWAYS_ENABLED,
  212. .pclk = &pll1_clk,
  213. .calc_rate = &bus_calc_rate,
  214. .recalc = &bus_clk_recalc,
  215. .set_rate = &bus_clk_set_rate,
  216. .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2},
  217. .private_data = &ahb_config,
  218. };
  219. /* auxiliary synthesizers masks */
  220. static struct aux_clk_masks aux_masks = {
  221. .eq_sel_mask = AUX_EQ_SEL_MASK,
  222. .eq_sel_shift = AUX_EQ_SEL_SHIFT,
  223. .eq1_mask = AUX_EQ1_SEL,
  224. .eq2_mask = AUX_EQ2_SEL,
  225. .xscale_sel_mask = AUX_XSCALE_MASK,
  226. .xscale_sel_shift = AUX_XSCALE_SHIFT,
  227. .yscale_sel_mask = AUX_YSCALE_MASK,
  228. .yscale_sel_shift = AUX_YSCALE_SHIFT,
  229. };
  230. /* uart configurations */
  231. static struct aux_clk_config uart_synth_config = {
  232. .synth_reg = UART_CLK_SYNT,
  233. .masks = &aux_masks,
  234. };
  235. /* aux rate configuration table, in ascending order of rates */
  236. struct aux_rate_tbl aux_rtbl[] = {
  237. /* For PLL1 = 332 MHz */
  238. {.xscale = 1, .yscale = 8, .eq = 1}, /* 41.5 MHz */
  239. {.xscale = 1, .yscale = 4, .eq = 1}, /* 83 MHz */
  240. {.xscale = 1, .yscale = 2, .eq = 1}, /* 166 MHz */
  241. };
  242. /* uart synth clock */
  243. static struct clk uart_synth_clk = {
  244. .en_reg = UART_CLK_SYNT,
  245. .en_reg_bit = AUX_SYNT_ENB,
  246. .pclk = &pll1_clk,
  247. .calc_rate = &aux_calc_rate,
  248. .recalc = &aux_clk_recalc,
  249. .set_rate = &aux_clk_set_rate,
  250. .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2},
  251. .private_data = &uart_synth_config,
  252. };
  253. /* uart parents */
  254. static struct pclk_info uart_pclk_info[] = {
  255. {
  256. .pclk = &uart_synth_clk,
  257. .pclk_val = AUX_CLK_PLL1_VAL,
  258. }, {
  259. .pclk = &pll3_48m_clk,
  260. .pclk_val = AUX_CLK_PLL3_VAL,
  261. },
  262. };
  263. /* uart parent select structure */
  264. static struct pclk_sel uart_pclk_sel = {
  265. .pclk_info = uart_pclk_info,
  266. .pclk_count = ARRAY_SIZE(uart_pclk_info),
  267. .pclk_sel_reg = PERIP_CLK_CFG,
  268. .pclk_sel_mask = UART_CLK_MASK,
  269. };
  270. /* uart0 clock */
  271. static struct clk uart0_clk = {
  272. .en_reg = PERIP1_CLK_ENB,
  273. .en_reg_bit = UART0_CLK_ENB,
  274. .pclk_sel = &uart_pclk_sel,
  275. .pclk_sel_shift = UART_CLK_SHIFT,
  276. .recalc = &follow_parent,
  277. };
  278. /* uart1 clock */
  279. static struct clk uart1_clk = {
  280. .en_reg = PERIP1_CLK_ENB,
  281. .en_reg_bit = UART1_CLK_ENB,
  282. .pclk_sel = &uart_pclk_sel,
  283. .pclk_sel_shift = UART_CLK_SHIFT,
  284. .recalc = &follow_parent,
  285. };
  286. /* firda configurations */
  287. static struct aux_clk_config firda_synth_config = {
  288. .synth_reg = FIRDA_CLK_SYNT,
  289. .masks = &aux_masks,
  290. };
  291. /* firda synth clock */
  292. static struct clk firda_synth_clk = {
  293. .en_reg = FIRDA_CLK_SYNT,
  294. .en_reg_bit = AUX_SYNT_ENB,
  295. .pclk = &pll1_clk,
  296. .calc_rate = &aux_calc_rate,
  297. .recalc = &aux_clk_recalc,
  298. .set_rate = &aux_clk_set_rate,
  299. .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2},
  300. .private_data = &firda_synth_config,
  301. };
  302. /* firda parents */
  303. static struct pclk_info firda_pclk_info[] = {
  304. {
  305. .pclk = &firda_synth_clk,
  306. .pclk_val = AUX_CLK_PLL1_VAL,
  307. }, {
  308. .pclk = &pll3_48m_clk,
  309. .pclk_val = AUX_CLK_PLL3_VAL,
  310. },
  311. };
  312. /* firda parent select structure */
  313. static struct pclk_sel firda_pclk_sel = {
  314. .pclk_info = firda_pclk_info,
  315. .pclk_count = ARRAY_SIZE(firda_pclk_info),
  316. .pclk_sel_reg = PERIP_CLK_CFG,
  317. .pclk_sel_mask = FIRDA_CLK_MASK,
  318. };
  319. /* firda clock */
  320. static struct clk firda_clk = {
  321. .en_reg = PERIP1_CLK_ENB,
  322. .en_reg_bit = FIRDA_CLK_ENB,
  323. .pclk_sel = &firda_pclk_sel,
  324. .pclk_sel_shift = FIRDA_CLK_SHIFT,
  325. .recalc = &follow_parent,
  326. };
  327. /* clcd configurations */
  328. static struct aux_clk_config clcd_synth_config = {
  329. .synth_reg = CLCD_CLK_SYNT,
  330. .masks = &aux_masks,
  331. };
  332. /* firda synth clock */
  333. static struct clk clcd_synth_clk = {
  334. .en_reg = CLCD_CLK_SYNT,
  335. .en_reg_bit = AUX_SYNT_ENB,
  336. .pclk = &pll1_clk,
  337. .calc_rate = &aux_calc_rate,
  338. .recalc = &aux_clk_recalc,
  339. .set_rate = &aux_clk_set_rate,
  340. .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 2},
  341. .private_data = &clcd_synth_config,
  342. };
  343. /* clcd parents */
  344. static struct pclk_info clcd_pclk_info[] = {
  345. {
  346. .pclk = &clcd_synth_clk,
  347. .pclk_val = AUX_CLK_PLL1_VAL,
  348. }, {
  349. .pclk = &pll3_48m_clk,
  350. .pclk_val = AUX_CLK_PLL3_VAL,
  351. },
  352. };
  353. /* clcd parent select structure */
  354. static struct pclk_sel clcd_pclk_sel = {
  355. .pclk_info = clcd_pclk_info,
  356. .pclk_count = ARRAY_SIZE(clcd_pclk_info),
  357. .pclk_sel_reg = PERIP_CLK_CFG,
  358. .pclk_sel_mask = CLCD_CLK_MASK,
  359. };
  360. /* clcd clock */
  361. static struct clk clcd_clk = {
  362. .en_reg = PERIP1_CLK_ENB,
  363. .en_reg_bit = CLCD_CLK_ENB,
  364. .pclk_sel = &clcd_pclk_sel,
  365. .pclk_sel_shift = CLCD_CLK_SHIFT,
  366. .recalc = &follow_parent,
  367. };
  368. /* gpt synthesizer masks */
  369. static struct gpt_clk_masks gpt_masks = {
  370. .mscale_sel_mask = GPT_MSCALE_MASK,
  371. .mscale_sel_shift = GPT_MSCALE_SHIFT,
  372. .nscale_sel_mask = GPT_NSCALE_MASK,
  373. .nscale_sel_shift = GPT_NSCALE_SHIFT,
  374. };
  375. /* gpt rate configuration table, in ascending order of rates */
  376. struct gpt_rate_tbl gpt_rtbl[] = {
  377. /* For pll1 = 332 MHz */
  378. {.mscale = 4, .nscale = 0}, /* 41.5 MHz */
  379. {.mscale = 2, .nscale = 0}, /* 55.3 MHz */
  380. {.mscale = 1, .nscale = 0}, /* 83 MHz */
  381. };
  382. /* gpt0 synth clk config*/
  383. static struct gpt_clk_config gpt0_synth_config = {
  384. .synth_reg = PRSC1_CLK_CFG,
  385. .masks = &gpt_masks,
  386. };
  387. /* gpt synth clock */
  388. static struct clk gpt0_synth_clk = {
  389. .flags = ALWAYS_ENABLED,
  390. .pclk = &pll1_clk,
  391. .calc_rate = &gpt_calc_rate,
  392. .recalc = &gpt_clk_recalc,
  393. .set_rate = &gpt_clk_set_rate,
  394. .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
  395. .private_data = &gpt0_synth_config,
  396. };
  397. /* gpt parents */
  398. static struct pclk_info gpt0_pclk_info[] = {
  399. {
  400. .pclk = &gpt0_synth_clk,
  401. .pclk_val = AUX_CLK_PLL1_VAL,
  402. }, {
  403. .pclk = &pll3_48m_clk,
  404. .pclk_val = AUX_CLK_PLL3_VAL,
  405. },
  406. };
  407. /* gpt parent select structure */
  408. static struct pclk_sel gpt0_pclk_sel = {
  409. .pclk_info = gpt0_pclk_info,
  410. .pclk_count = ARRAY_SIZE(gpt0_pclk_info),
  411. .pclk_sel_reg = PERIP_CLK_CFG,
  412. .pclk_sel_mask = GPT_CLK_MASK,
  413. };
  414. /* gpt0 ARM1 subsystem timer clock */
  415. static struct clk gpt0_clk = {
  416. .flags = ALWAYS_ENABLED,
  417. .pclk_sel = &gpt0_pclk_sel,
  418. .pclk_sel_shift = GPT0_CLK_SHIFT,
  419. .recalc = &follow_parent,
  420. };
  421. /* Note: gpt0 and gpt1 share same parent clocks */
  422. /* gpt parent select structure */
  423. static struct pclk_sel gpt1_pclk_sel = {
  424. .pclk_info = gpt0_pclk_info,
  425. .pclk_count = ARRAY_SIZE(gpt0_pclk_info),
  426. .pclk_sel_reg = PERIP_CLK_CFG,
  427. .pclk_sel_mask = GPT_CLK_MASK,
  428. };
  429. /* gpt1 timer clock */
  430. static struct clk gpt1_clk = {
  431. .flags = ALWAYS_ENABLED,
  432. .pclk_sel = &gpt1_pclk_sel,
  433. .pclk_sel_shift = GPT1_CLK_SHIFT,
  434. .recalc = &follow_parent,
  435. };
  436. /* gpt2 synth clk config*/
  437. static struct gpt_clk_config gpt2_synth_config = {
  438. .synth_reg = PRSC2_CLK_CFG,
  439. .masks = &gpt_masks,
  440. };
  441. /* gpt synth clock */
  442. static struct clk gpt2_synth_clk = {
  443. .flags = ALWAYS_ENABLED,
  444. .pclk = &pll1_clk,
  445. .calc_rate = &gpt_calc_rate,
  446. .recalc = &gpt_clk_recalc,
  447. .set_rate = &gpt_clk_set_rate,
  448. .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
  449. .private_data = &gpt2_synth_config,
  450. };
  451. /* gpt parents */
  452. static struct pclk_info gpt2_pclk_info[] = {
  453. {
  454. .pclk = &gpt2_synth_clk,
  455. .pclk_val = AUX_CLK_PLL1_VAL,
  456. }, {
  457. .pclk = &pll3_48m_clk,
  458. .pclk_val = AUX_CLK_PLL3_VAL,
  459. },
  460. };
  461. /* gpt parent select structure */
  462. static struct pclk_sel gpt2_pclk_sel = {
  463. .pclk_info = gpt2_pclk_info,
  464. .pclk_count = ARRAY_SIZE(gpt2_pclk_info),
  465. .pclk_sel_reg = PERIP_CLK_CFG,
  466. .pclk_sel_mask = GPT_CLK_MASK,
  467. };
  468. /* gpt2 timer clock */
  469. static struct clk gpt2_clk = {
  470. .flags = ALWAYS_ENABLED,
  471. .pclk_sel = &gpt2_pclk_sel,
  472. .pclk_sel_shift = GPT2_CLK_SHIFT,
  473. .recalc = &follow_parent,
  474. };
  475. /* gpt3 synth clk config*/
  476. static struct gpt_clk_config gpt3_synth_config = {
  477. .synth_reg = PRSC3_CLK_CFG,
  478. .masks = &gpt_masks,
  479. };
  480. /* gpt synth clock */
  481. static struct clk gpt3_synth_clk = {
  482. .flags = ALWAYS_ENABLED,
  483. .pclk = &pll1_clk,
  484. .calc_rate = &gpt_calc_rate,
  485. .recalc = &gpt_clk_recalc,
  486. .set_rate = &gpt_clk_set_rate,
  487. .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
  488. .private_data = &gpt3_synth_config,
  489. };
  490. /* gpt parents */
  491. static struct pclk_info gpt3_pclk_info[] = {
  492. {
  493. .pclk = &gpt3_synth_clk,
  494. .pclk_val = AUX_CLK_PLL1_VAL,
  495. }, {
  496. .pclk = &pll3_48m_clk,
  497. .pclk_val = AUX_CLK_PLL3_VAL,
  498. },
  499. };
  500. /* gpt parent select structure */
  501. static struct pclk_sel gpt3_pclk_sel = {
  502. .pclk_info = gpt3_pclk_info,
  503. .pclk_count = ARRAY_SIZE(gpt3_pclk_info),
  504. .pclk_sel_reg = PERIP_CLK_CFG,
  505. .pclk_sel_mask = GPT_CLK_MASK,
  506. };
  507. /* gpt3 timer clock */
  508. static struct clk gpt3_clk = {
  509. .flags = ALWAYS_ENABLED,
  510. .pclk_sel = &gpt3_pclk_sel,
  511. .pclk_sel_shift = GPT3_CLK_SHIFT,
  512. .recalc = &follow_parent,
  513. };
  514. /* clock derived from pll3 clk */
  515. /* usbh0 clock */
  516. static struct clk usbh0_clk = {
  517. .pclk = &pll3_48m_clk,
  518. .en_reg = PERIP1_CLK_ENB,
  519. .en_reg_bit = USBH0_CLK_ENB,
  520. .recalc = &follow_parent,
  521. };
  522. /* usbh1 clock */
  523. static struct clk usbh1_clk = {
  524. .pclk = &pll3_48m_clk,
  525. .en_reg = PERIP1_CLK_ENB,
  526. .en_reg_bit = USBH1_CLK_ENB,
  527. .recalc = &follow_parent,
  528. };
  529. /* usbd clock */
  530. static struct clk usbd_clk = {
  531. .pclk = &pll3_48m_clk,
  532. .en_reg = PERIP1_CLK_ENB,
  533. .en_reg_bit = USBD_CLK_ENB,
  534. .recalc = &follow_parent,
  535. };
  536. /* clock derived from ahb clk */
  537. /* apb masks structure */
  538. static struct bus_clk_masks apb_masks = {
  539. .mask = HCLK_PCLK_RATIO_MASK,
  540. .shift = HCLK_PCLK_RATIO_SHIFT,
  541. };
  542. /* apb configuration structure */
  543. static struct bus_clk_config apb_config = {
  544. .reg = CORE_CLK_CFG,
  545. .masks = &apb_masks,
  546. };
  547. /* apb clock */
  548. static struct clk apb_clk = {
  549. .flags = ALWAYS_ENABLED,
  550. .pclk = &ahb_clk,
  551. .calc_rate = &bus_calc_rate,
  552. .recalc = &bus_clk_recalc,
  553. .set_rate = &bus_clk_set_rate,
  554. .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2},
  555. .private_data = &apb_config,
  556. };
  557. /* i2c clock */
  558. static struct clk i2c_clk = {
  559. .pclk = &ahb_clk,
  560. .en_reg = PERIP1_CLK_ENB,
  561. .en_reg_bit = I2C_CLK_ENB,
  562. .recalc = &follow_parent,
  563. };
  564. /* dma clock */
  565. static struct clk dma_clk = {
  566. .pclk = &ahb_clk,
  567. .en_reg = PERIP1_CLK_ENB,
  568. .en_reg_bit = DMA_CLK_ENB,
  569. .recalc = &follow_parent,
  570. };
  571. /* jpeg clock */
  572. static struct clk jpeg_clk = {
  573. .pclk = &ahb_clk,
  574. .en_reg = PERIP1_CLK_ENB,
  575. .en_reg_bit = JPEG_CLK_ENB,
  576. .recalc = &follow_parent,
  577. };
  578. /* gmac clock */
  579. static struct clk gmac_clk = {
  580. .pclk = &ahb_clk,
  581. .en_reg = PERIP1_CLK_ENB,
  582. .en_reg_bit = GMAC_CLK_ENB,
  583. .recalc = &follow_parent,
  584. };
  585. /* smi clock */
  586. static struct clk smi_clk = {
  587. .pclk = &ahb_clk,
  588. .en_reg = PERIP1_CLK_ENB,
  589. .en_reg_bit = SMI_CLK_ENB,
  590. .recalc = &follow_parent,
  591. };
  592. /* fsmc clock */
  593. static struct clk fsmc_clk = {
  594. .pclk = &ahb_clk,
  595. .en_reg = PERIP1_CLK_ENB,
  596. .en_reg_bit = FSMC_CLK_ENB,
  597. .recalc = &follow_parent,
  598. };
  599. /* clock derived from apb clk */
  600. /* adc clock */
  601. static struct clk adc_clk = {
  602. .pclk = &apb_clk,
  603. .en_reg = PERIP1_CLK_ENB,
  604. .en_reg_bit = ADC_CLK_ENB,
  605. .recalc = &follow_parent,
  606. };
  607. /* ssp0 clock */
  608. static struct clk ssp0_clk = {
  609. .pclk = &apb_clk,
  610. .en_reg = PERIP1_CLK_ENB,
  611. .en_reg_bit = SSP0_CLK_ENB,
  612. .recalc = &follow_parent,
  613. };
  614. /* ssp1 clock */
  615. static struct clk ssp1_clk = {
  616. .pclk = &apb_clk,
  617. .en_reg = PERIP1_CLK_ENB,
  618. .en_reg_bit = SSP1_CLK_ENB,
  619. .recalc = &follow_parent,
  620. };
  621. /* ssp2 clock */
  622. static struct clk ssp2_clk = {
  623. .pclk = &apb_clk,
  624. .en_reg = PERIP1_CLK_ENB,
  625. .en_reg_bit = SSP2_CLK_ENB,
  626. .recalc = &follow_parent,
  627. };
  628. /* gpio0 ARM subsystem clock */
  629. static struct clk gpio0_clk = {
  630. .flags = ALWAYS_ENABLED,
  631. .pclk = &apb_clk,
  632. .recalc = &follow_parent,
  633. };
  634. /* gpio1 clock */
  635. static struct clk gpio1_clk = {
  636. .pclk = &apb_clk,
  637. .en_reg = PERIP1_CLK_ENB,
  638. .en_reg_bit = GPIO1_CLK_ENB,
  639. .recalc = &follow_parent,
  640. };
  641. /* gpio2 clock */
  642. static struct clk gpio2_clk = {
  643. .pclk = &apb_clk,
  644. .en_reg = PERIP1_CLK_ENB,
  645. .en_reg_bit = GPIO2_CLK_ENB,
  646. .recalc = &follow_parent,
  647. };
  648. static struct clk dummy_apb_pclk;
  649. /* array of all spear 6xx clock lookups */
  650. static struct clk_lookup spear_clk_lookups[] = {
  651. CLKDEV_INIT(NULL, "apb_pclk", &dummy_apb_pclk),
  652. /* root clks */
  653. CLKDEV_INIT(NULL, "osc_32k_clk", &osc_32k_clk),
  654. CLKDEV_INIT(NULL, "osc_30m_clk", &osc_30m_clk),
  655. /* clock derived from 32 KHz os clk */
  656. CLKDEV_INIT("rtc-spear", NULL, &rtc_clk),
  657. /* clock derived from 30 MHz os clk */
  658. CLKDEV_INIT(NULL, "pll1_clk", &pll1_clk),
  659. CLKDEV_INIT(NULL, "pll3_48m_clk", &pll3_48m_clk),
  660. CLKDEV_INIT("wdt", NULL, &wdt_clk),
  661. /* clock derived from pll1 clk */
  662. CLKDEV_INIT(NULL, "cpu_clk", &cpu_clk),
  663. CLKDEV_INIT(NULL, "ahb_clk", &ahb_clk),
  664. CLKDEV_INIT(NULL, "uart_synth_clk", &uart_synth_clk),
  665. CLKDEV_INIT(NULL, "firda_synth_clk", &firda_synth_clk),
  666. CLKDEV_INIT(NULL, "clcd_synth_clk", &clcd_synth_clk),
  667. CLKDEV_INIT(NULL, "gpt0_synth_clk", &gpt0_synth_clk),
  668. CLKDEV_INIT(NULL, "gpt2_synth_clk", &gpt2_synth_clk),
  669. CLKDEV_INIT(NULL, "gpt3_synth_clk", &gpt3_synth_clk),
  670. CLKDEV_INIT("d0000000.serial", NULL, &uart0_clk),
  671. CLKDEV_INIT("d0080000.serial", NULL, &uart1_clk),
  672. CLKDEV_INIT("firda", NULL, &firda_clk),
  673. CLKDEV_INIT("clcd", NULL, &clcd_clk),
  674. CLKDEV_INIT("gpt0", NULL, &gpt0_clk),
  675. CLKDEV_INIT("gpt1", NULL, &gpt1_clk),
  676. CLKDEV_INIT("gpt2", NULL, &gpt2_clk),
  677. CLKDEV_INIT("gpt3", NULL, &gpt3_clk),
  678. /* clock derived from pll3 clk */
  679. CLKDEV_INIT("designware_udc", NULL, &usbd_clk),
  680. CLKDEV_INIT(NULL, "usbh.0_clk", &usbh0_clk),
  681. CLKDEV_INIT(NULL, "usbh.1_clk", &usbh1_clk),
  682. /* clock derived from ahb clk */
  683. CLKDEV_INIT(NULL, "apb_clk", &apb_clk),
  684. CLKDEV_INIT("d0200000.i2c", NULL, &i2c_clk),
  685. CLKDEV_INIT("fc400000.dma", NULL, &dma_clk),
  686. CLKDEV_INIT("jpeg", NULL, &jpeg_clk),
  687. CLKDEV_INIT("gmac", NULL, &gmac_clk),
  688. CLKDEV_INIT("fc000000.flash", NULL, &smi_clk),
  689. CLKDEV_INIT("d1800000.flash", NULL, &fsmc_clk),
  690. /* clock derived from apb clk */
  691. CLKDEV_INIT("adc", NULL, &adc_clk),
  692. CLKDEV_INIT("ssp-pl022.0", NULL, &ssp0_clk),
  693. CLKDEV_INIT("ssp-pl022.1", NULL, &ssp1_clk),
  694. CLKDEV_INIT("ssp-pl022.2", NULL, &ssp2_clk),
  695. CLKDEV_INIT("f0100000.gpio", NULL, &gpio0_clk),
  696. CLKDEV_INIT("fc980000.gpio", NULL, &gpio1_clk),
  697. CLKDEV_INIT("d8100000.gpio", NULL, &gpio2_clk),
  698. };
  699. void __init spear6xx_clk_init(void)
  700. {
  701. int i;
  702. for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++)
  703. clk_register(&spear_clk_lookups[i]);
  704. clk_init();
  705. }