clock.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892
  1. /*
  2. * arch/arm/mach-spear3xx/clock.c
  3. *
  4. * SPEAr3xx 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/clkdev.h>
  14. #include <linux/init.h>
  15. #include <linux/io.h>
  16. #include <linux/kernel.h>
  17. #include <linux/of_platform.h>
  18. #include <asm/mach-types.h>
  19. #include <plat/clock.h>
  20. #include <mach/misc_regs.h>
  21. #include <mach/spear.h>
  22. #define PLL1_CTR (MISC_BASE + 0x008)
  23. #define PLL1_FRQ (MISC_BASE + 0x00C)
  24. #define PLL1_MOD (MISC_BASE + 0x010)
  25. #define PLL2_CTR (MISC_BASE + 0x014)
  26. /* PLL_CTR register masks */
  27. #define PLL_ENABLE 2
  28. #define PLL_MODE_SHIFT 4
  29. #define PLL_MODE_MASK 0x3
  30. #define PLL_MODE_NORMAL 0
  31. #define PLL_MODE_FRACTION 1
  32. #define PLL_MODE_DITH_DSB 2
  33. #define PLL_MODE_DITH_SSB 3
  34. #define PLL2_FRQ (MISC_BASE + 0x018)
  35. /* PLL FRQ register masks */
  36. #define PLL_DIV_N_SHIFT 0
  37. #define PLL_DIV_N_MASK 0xFF
  38. #define PLL_DIV_P_SHIFT 8
  39. #define PLL_DIV_P_MASK 0x7
  40. #define PLL_NORM_FDBK_M_SHIFT 24
  41. #define PLL_NORM_FDBK_M_MASK 0xFF
  42. #define PLL_DITH_FDBK_M_SHIFT 16
  43. #define PLL_DITH_FDBK_M_MASK 0xFFFF
  44. #define PLL2_MOD (MISC_BASE + 0x01C)
  45. #define PLL_CLK_CFG (MISC_BASE + 0x020)
  46. #define CORE_CLK_CFG (MISC_BASE + 0x024)
  47. /* CORE CLK CFG register masks */
  48. #define PLL_HCLK_RATIO_SHIFT 10
  49. #define PLL_HCLK_RATIO_MASK 0x3
  50. #define HCLK_PCLK_RATIO_SHIFT 8
  51. #define HCLK_PCLK_RATIO_MASK 0x3
  52. #define PERIP_CLK_CFG (MISC_BASE + 0x028)
  53. /* PERIP_CLK_CFG register masks */
  54. #define UART_CLK_SHIFT 4
  55. #define UART_CLK_MASK 0x1
  56. #define FIRDA_CLK_SHIFT 5
  57. #define FIRDA_CLK_MASK 0x3
  58. #define GPT0_CLK_SHIFT 8
  59. #define GPT1_CLK_SHIFT 11
  60. #define GPT2_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 UART_CLK_ENB 3
  67. #define SSP_CLK_ENB 5
  68. #define I2C_CLK_ENB 7
  69. #define JPEG_CLK_ENB 8
  70. #define FIRDA_CLK_ENB 10
  71. #define GPT1_CLK_ENB 11
  72. #define GPT2_CLK_ENB 12
  73. #define ADC_CLK_ENB 15
  74. #define RTC_CLK_ENB 17
  75. #define GPIO_CLK_ENB 18
  76. #define DMA_CLK_ENB 19
  77. #define SMI_CLK_ENB 21
  78. #define GMAC_CLK_ENB 23
  79. #define USBD_CLK_ENB 24
  80. #define USBH_CLK_ENB 25
  81. #define C3_CLK_ENB 31
  82. #define RAS_CLK_ENB (MISC_BASE + 0x034)
  83. #define PRSC1_CLK_CFG (MISC_BASE + 0x044)
  84. #define PRSC2_CLK_CFG (MISC_BASE + 0x048)
  85. #define PRSC3_CLK_CFG (MISC_BASE + 0x04C)
  86. /* gpt synthesizer register masks */
  87. #define GPT_MSCALE_SHIFT 0
  88. #define GPT_MSCALE_MASK 0xFFF
  89. #define GPT_NSCALE_SHIFT 12
  90. #define GPT_NSCALE_MASK 0xF
  91. #define AMEM_CLK_CFG (MISC_BASE + 0x050)
  92. #define EXPI_CLK_CFG (MISC_BASE + 0x054)
  93. #define CLCD_CLK_SYNT (MISC_BASE + 0x05C)
  94. #define FIRDA_CLK_SYNT (MISC_BASE + 0x060)
  95. #define UART_CLK_SYNT (MISC_BASE + 0x064)
  96. #define GMAC_CLK_SYNT (MISC_BASE + 0x068)
  97. #define RAS1_CLK_SYNT (MISC_BASE + 0x06C)
  98. #define RAS2_CLK_SYNT (MISC_BASE + 0x070)
  99. #define RAS3_CLK_SYNT (MISC_BASE + 0x074)
  100. #define RAS4_CLK_SYNT (MISC_BASE + 0x078)
  101. /* aux clk synthesiser register masks for irda to ras4 */
  102. #define AUX_SYNT_ENB 31
  103. #define AUX_EQ_SEL_SHIFT 30
  104. #define AUX_EQ_SEL_MASK 1
  105. #define AUX_EQ1_SEL 0
  106. #define AUX_EQ2_SEL 1
  107. #define AUX_XSCALE_SHIFT 16
  108. #define AUX_XSCALE_MASK 0xFFF
  109. #define AUX_YSCALE_SHIFT 0
  110. #define AUX_YSCALE_MASK 0xFFF
  111. /* root clks */
  112. /* 32 KHz oscillator clock */
  113. static struct clk osc_32k_clk = {
  114. .flags = ALWAYS_ENABLED,
  115. .rate = 32000,
  116. };
  117. /* 24 MHz oscillator clock */
  118. static struct clk osc_24m_clk = {
  119. .flags = ALWAYS_ENABLED,
  120. .rate = 24000000,
  121. };
  122. /* clock derived from 32 KHz osc clk */
  123. /* rtc clock */
  124. static struct clk rtc_clk = {
  125. .pclk = &osc_32k_clk,
  126. .en_reg = PERIP1_CLK_ENB,
  127. .en_reg_bit = RTC_CLK_ENB,
  128. .recalc = &follow_parent,
  129. };
  130. /* clock derived from 24 MHz osc clk */
  131. /* pll masks structure */
  132. static struct pll_clk_masks pll1_masks = {
  133. .mode_mask = PLL_MODE_MASK,
  134. .mode_shift = PLL_MODE_SHIFT,
  135. .norm_fdbk_m_mask = PLL_NORM_FDBK_M_MASK,
  136. .norm_fdbk_m_shift = PLL_NORM_FDBK_M_SHIFT,
  137. .dith_fdbk_m_mask = PLL_DITH_FDBK_M_MASK,
  138. .dith_fdbk_m_shift = PLL_DITH_FDBK_M_SHIFT,
  139. .div_p_mask = PLL_DIV_P_MASK,
  140. .div_p_shift = PLL_DIV_P_SHIFT,
  141. .div_n_mask = PLL_DIV_N_MASK,
  142. .div_n_shift = PLL_DIV_N_SHIFT,
  143. };
  144. /* pll1 configuration structure */
  145. static struct pll_clk_config pll1_config = {
  146. .mode_reg = PLL1_CTR,
  147. .cfg_reg = PLL1_FRQ,
  148. .masks = &pll1_masks,
  149. };
  150. /* pll rate configuration table, in ascending order of rates */
  151. struct pll_rate_tbl pll_rtbl[] = {
  152. {.mode = 0, .m = 0x85, .n = 0x0C, .p = 0x1}, /* 266 MHz */
  153. {.mode = 0, .m = 0xA6, .n = 0x0C, .p = 0x1}, /* 332 MHz */
  154. };
  155. /* PLL1 clock */
  156. static struct clk pll1_clk = {
  157. .flags = ENABLED_ON_INIT,
  158. .pclk = &osc_24m_clk,
  159. .en_reg = PLL1_CTR,
  160. .en_reg_bit = PLL_ENABLE,
  161. .calc_rate = &pll_calc_rate,
  162. .recalc = &pll_clk_recalc,
  163. .set_rate = &pll_clk_set_rate,
  164. .rate_config = {pll_rtbl, ARRAY_SIZE(pll_rtbl), 1},
  165. .private_data = &pll1_config,
  166. };
  167. /* PLL3 48 MHz clock */
  168. static struct clk pll3_48m_clk = {
  169. .flags = ALWAYS_ENABLED,
  170. .pclk = &osc_24m_clk,
  171. .rate = 48000000,
  172. };
  173. /* watch dog timer clock */
  174. static struct clk wdt_clk = {
  175. .flags = ALWAYS_ENABLED,
  176. .pclk = &osc_24m_clk,
  177. .recalc = &follow_parent,
  178. };
  179. /* clock derived from pll1 clk */
  180. /* cpu clock */
  181. static struct clk cpu_clk = {
  182. .flags = ALWAYS_ENABLED,
  183. .pclk = &pll1_clk,
  184. .recalc = &follow_parent,
  185. };
  186. /* ahb masks structure */
  187. static struct bus_clk_masks ahb_masks = {
  188. .mask = PLL_HCLK_RATIO_MASK,
  189. .shift = PLL_HCLK_RATIO_SHIFT,
  190. };
  191. /* ahb configuration structure */
  192. static struct bus_clk_config ahb_config = {
  193. .reg = CORE_CLK_CFG,
  194. .masks = &ahb_masks,
  195. };
  196. /* ahb rate configuration table, in ascending order of rates */
  197. struct bus_rate_tbl bus_rtbl[] = {
  198. {.div = 3}, /* == parent divided by 4 */
  199. {.div = 2}, /* == parent divided by 3 */
  200. {.div = 1}, /* == parent divided by 2 */
  201. {.div = 0}, /* == parent divided by 1 */
  202. };
  203. /* ahb clock */
  204. static struct clk ahb_clk = {
  205. .flags = ALWAYS_ENABLED,
  206. .pclk = &pll1_clk,
  207. .calc_rate = &bus_calc_rate,
  208. .recalc = &bus_clk_recalc,
  209. .set_rate = &bus_clk_set_rate,
  210. .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2},
  211. .private_data = &ahb_config,
  212. };
  213. /* auxiliary synthesizers masks */
  214. static struct aux_clk_masks aux_masks = {
  215. .eq_sel_mask = AUX_EQ_SEL_MASK,
  216. .eq_sel_shift = AUX_EQ_SEL_SHIFT,
  217. .eq1_mask = AUX_EQ1_SEL,
  218. .eq2_mask = AUX_EQ2_SEL,
  219. .xscale_sel_mask = AUX_XSCALE_MASK,
  220. .xscale_sel_shift = AUX_XSCALE_SHIFT,
  221. .yscale_sel_mask = AUX_YSCALE_MASK,
  222. .yscale_sel_shift = AUX_YSCALE_SHIFT,
  223. };
  224. /* uart synth configurations */
  225. static struct aux_clk_config uart_synth_config = {
  226. .synth_reg = UART_CLK_SYNT,
  227. .masks = &aux_masks,
  228. };
  229. /* aux rate configuration table, in ascending order of rates */
  230. struct aux_rate_tbl aux_rtbl[] = {
  231. /* For PLL1 = 332 MHz */
  232. {.xscale = 1, .yscale = 8, .eq = 1}, /* 41.5 MHz */
  233. {.xscale = 1, .yscale = 4, .eq = 1}, /* 83 MHz */
  234. {.xscale = 1, .yscale = 2, .eq = 1}, /* 166 MHz */
  235. };
  236. /* uart synth clock */
  237. static struct clk uart_synth_clk = {
  238. .en_reg = UART_CLK_SYNT,
  239. .en_reg_bit = AUX_SYNT_ENB,
  240. .pclk = &pll1_clk,
  241. .calc_rate = &aux_calc_rate,
  242. .recalc = &aux_clk_recalc,
  243. .set_rate = &aux_clk_set_rate,
  244. .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 1},
  245. .private_data = &uart_synth_config,
  246. };
  247. /* uart parents */
  248. static struct pclk_info uart_pclk_info[] = {
  249. {
  250. .pclk = &uart_synth_clk,
  251. .pclk_val = AUX_CLK_PLL1_VAL,
  252. }, {
  253. .pclk = &pll3_48m_clk,
  254. .pclk_val = AUX_CLK_PLL3_VAL,
  255. },
  256. };
  257. /* uart parent select structure */
  258. static struct pclk_sel uart_pclk_sel = {
  259. .pclk_info = uart_pclk_info,
  260. .pclk_count = ARRAY_SIZE(uart_pclk_info),
  261. .pclk_sel_reg = PERIP_CLK_CFG,
  262. .pclk_sel_mask = UART_CLK_MASK,
  263. };
  264. /* uart clock */
  265. static struct clk uart_clk = {
  266. .en_reg = PERIP1_CLK_ENB,
  267. .en_reg_bit = UART_CLK_ENB,
  268. .pclk_sel = &uart_pclk_sel,
  269. .pclk_sel_shift = UART_CLK_SHIFT,
  270. .recalc = &follow_parent,
  271. };
  272. /* firda configurations */
  273. static struct aux_clk_config firda_synth_config = {
  274. .synth_reg = FIRDA_CLK_SYNT,
  275. .masks = &aux_masks,
  276. };
  277. /* firda synth clock */
  278. static struct clk firda_synth_clk = {
  279. .en_reg = FIRDA_CLK_SYNT,
  280. .en_reg_bit = AUX_SYNT_ENB,
  281. .pclk = &pll1_clk,
  282. .calc_rate = &aux_calc_rate,
  283. .recalc = &aux_clk_recalc,
  284. .set_rate = &aux_clk_set_rate,
  285. .rate_config = {aux_rtbl, ARRAY_SIZE(aux_rtbl), 1},
  286. .private_data = &firda_synth_config,
  287. };
  288. /* firda parents */
  289. static struct pclk_info firda_pclk_info[] = {
  290. {
  291. .pclk = &firda_synth_clk,
  292. .pclk_val = AUX_CLK_PLL1_VAL,
  293. }, {
  294. .pclk = &pll3_48m_clk,
  295. .pclk_val = AUX_CLK_PLL3_VAL,
  296. },
  297. };
  298. /* firda parent select structure */
  299. static struct pclk_sel firda_pclk_sel = {
  300. .pclk_info = firda_pclk_info,
  301. .pclk_count = ARRAY_SIZE(firda_pclk_info),
  302. .pclk_sel_reg = PERIP_CLK_CFG,
  303. .pclk_sel_mask = FIRDA_CLK_MASK,
  304. };
  305. /* firda clock */
  306. static struct clk firda_clk = {
  307. .en_reg = PERIP1_CLK_ENB,
  308. .en_reg_bit = FIRDA_CLK_ENB,
  309. .pclk_sel = &firda_pclk_sel,
  310. .pclk_sel_shift = FIRDA_CLK_SHIFT,
  311. .recalc = &follow_parent,
  312. };
  313. /* gpt synthesizer masks */
  314. static struct gpt_clk_masks gpt_masks = {
  315. .mscale_sel_mask = GPT_MSCALE_MASK,
  316. .mscale_sel_shift = GPT_MSCALE_SHIFT,
  317. .nscale_sel_mask = GPT_NSCALE_MASK,
  318. .nscale_sel_shift = GPT_NSCALE_SHIFT,
  319. };
  320. /* gpt rate configuration table, in ascending order of rates */
  321. struct gpt_rate_tbl gpt_rtbl[] = {
  322. /* For pll1 = 332 MHz */
  323. {.mscale = 4, .nscale = 0}, /* 41.5 MHz */
  324. {.mscale = 2, .nscale = 0}, /* 55.3 MHz */
  325. {.mscale = 1, .nscale = 0}, /* 83 MHz */
  326. };
  327. /* gpt0 synth clk config*/
  328. static struct gpt_clk_config gpt0_synth_config = {
  329. .synth_reg = PRSC1_CLK_CFG,
  330. .masks = &gpt_masks,
  331. };
  332. /* gpt synth clock */
  333. static struct clk gpt0_synth_clk = {
  334. .flags = ALWAYS_ENABLED,
  335. .pclk = &pll1_clk,
  336. .calc_rate = &gpt_calc_rate,
  337. .recalc = &gpt_clk_recalc,
  338. .set_rate = &gpt_clk_set_rate,
  339. .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
  340. .private_data = &gpt0_synth_config,
  341. };
  342. /* gpt parents */
  343. static struct pclk_info gpt0_pclk_info[] = {
  344. {
  345. .pclk = &gpt0_synth_clk,
  346. .pclk_val = AUX_CLK_PLL1_VAL,
  347. }, {
  348. .pclk = &pll3_48m_clk,
  349. .pclk_val = AUX_CLK_PLL3_VAL,
  350. },
  351. };
  352. /* gpt parent select structure */
  353. static struct pclk_sel gpt0_pclk_sel = {
  354. .pclk_info = gpt0_pclk_info,
  355. .pclk_count = ARRAY_SIZE(gpt0_pclk_info),
  356. .pclk_sel_reg = PERIP_CLK_CFG,
  357. .pclk_sel_mask = GPT_CLK_MASK,
  358. };
  359. /* gpt0 timer clock */
  360. static struct clk gpt0_clk = {
  361. .flags = ALWAYS_ENABLED,
  362. .pclk_sel = &gpt0_pclk_sel,
  363. .pclk_sel_shift = GPT0_CLK_SHIFT,
  364. .recalc = &follow_parent,
  365. };
  366. /* gpt1 synth clk configurations */
  367. static struct gpt_clk_config gpt1_synth_config = {
  368. .synth_reg = PRSC2_CLK_CFG,
  369. .masks = &gpt_masks,
  370. };
  371. /* gpt1 synth clock */
  372. static struct clk gpt1_synth_clk = {
  373. .flags = ALWAYS_ENABLED,
  374. .pclk = &pll1_clk,
  375. .calc_rate = &gpt_calc_rate,
  376. .recalc = &gpt_clk_recalc,
  377. .set_rate = &gpt_clk_set_rate,
  378. .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
  379. .private_data = &gpt1_synth_config,
  380. };
  381. static struct pclk_info gpt1_pclk_info[] = {
  382. {
  383. .pclk = &gpt1_synth_clk,
  384. .pclk_val = AUX_CLK_PLL1_VAL,
  385. }, {
  386. .pclk = &pll3_48m_clk,
  387. .pclk_val = AUX_CLK_PLL3_VAL,
  388. },
  389. };
  390. /* gpt parent select structure */
  391. static struct pclk_sel gpt1_pclk_sel = {
  392. .pclk_info = gpt1_pclk_info,
  393. .pclk_count = ARRAY_SIZE(gpt1_pclk_info),
  394. .pclk_sel_reg = PERIP_CLK_CFG,
  395. .pclk_sel_mask = GPT_CLK_MASK,
  396. };
  397. /* gpt1 timer clock */
  398. static struct clk gpt1_clk = {
  399. .en_reg = PERIP1_CLK_ENB,
  400. .en_reg_bit = GPT1_CLK_ENB,
  401. .pclk_sel = &gpt1_pclk_sel,
  402. .pclk_sel_shift = GPT1_CLK_SHIFT,
  403. .recalc = &follow_parent,
  404. };
  405. /* gpt2 synth clk configurations */
  406. static struct gpt_clk_config gpt2_synth_config = {
  407. .synth_reg = PRSC3_CLK_CFG,
  408. .masks = &gpt_masks,
  409. };
  410. /* gpt1 synth clock */
  411. static struct clk gpt2_synth_clk = {
  412. .flags = ALWAYS_ENABLED,
  413. .pclk = &pll1_clk,
  414. .calc_rate = &gpt_calc_rate,
  415. .recalc = &gpt_clk_recalc,
  416. .set_rate = &gpt_clk_set_rate,
  417. .rate_config = {gpt_rtbl, ARRAY_SIZE(gpt_rtbl), 2},
  418. .private_data = &gpt2_synth_config,
  419. };
  420. static struct pclk_info gpt2_pclk_info[] = {
  421. {
  422. .pclk = &gpt2_synth_clk,
  423. .pclk_val = AUX_CLK_PLL1_VAL,
  424. }, {
  425. .pclk = &pll3_48m_clk,
  426. .pclk_val = AUX_CLK_PLL3_VAL,
  427. },
  428. };
  429. /* gpt parent select structure */
  430. static struct pclk_sel gpt2_pclk_sel = {
  431. .pclk_info = gpt2_pclk_info,
  432. .pclk_count = ARRAY_SIZE(gpt2_pclk_info),
  433. .pclk_sel_reg = PERIP_CLK_CFG,
  434. .pclk_sel_mask = GPT_CLK_MASK,
  435. };
  436. /* gpt2 timer clock */
  437. static struct clk gpt2_clk = {
  438. .en_reg = PERIP1_CLK_ENB,
  439. .en_reg_bit = GPT2_CLK_ENB,
  440. .pclk_sel = &gpt2_pclk_sel,
  441. .pclk_sel_shift = GPT2_CLK_SHIFT,
  442. .recalc = &follow_parent,
  443. };
  444. /* clock derived from pll3 clk */
  445. /* usbh clock */
  446. static struct clk usbh_clk = {
  447. .pclk = &pll3_48m_clk,
  448. .en_reg = PERIP1_CLK_ENB,
  449. .en_reg_bit = USBH_CLK_ENB,
  450. .recalc = &follow_parent,
  451. };
  452. /* usbd clock */
  453. static struct clk usbd_clk = {
  454. .pclk = &pll3_48m_clk,
  455. .en_reg = PERIP1_CLK_ENB,
  456. .en_reg_bit = USBD_CLK_ENB,
  457. .recalc = &follow_parent,
  458. };
  459. /* clock derived from usbh clk */
  460. /* usbh0 clock */
  461. static struct clk usbh0_clk = {
  462. .flags = ALWAYS_ENABLED,
  463. .pclk = &usbh_clk,
  464. .recalc = &follow_parent,
  465. };
  466. /* usbh1 clock */
  467. static struct clk usbh1_clk = {
  468. .flags = ALWAYS_ENABLED,
  469. .pclk = &usbh_clk,
  470. .recalc = &follow_parent,
  471. };
  472. /* clock derived from ahb clk */
  473. /* apb masks structure */
  474. static struct bus_clk_masks apb_masks = {
  475. .mask = HCLK_PCLK_RATIO_MASK,
  476. .shift = HCLK_PCLK_RATIO_SHIFT,
  477. };
  478. /* apb configuration structure */
  479. static struct bus_clk_config apb_config = {
  480. .reg = CORE_CLK_CFG,
  481. .masks = &apb_masks,
  482. };
  483. /* apb clock */
  484. static struct clk apb_clk = {
  485. .flags = ALWAYS_ENABLED,
  486. .pclk = &ahb_clk,
  487. .calc_rate = &bus_calc_rate,
  488. .recalc = &bus_clk_recalc,
  489. .set_rate = &bus_clk_set_rate,
  490. .rate_config = {bus_rtbl, ARRAY_SIZE(bus_rtbl), 2},
  491. .private_data = &apb_config,
  492. };
  493. /* i2c clock */
  494. static struct clk i2c_clk = {
  495. .pclk = &ahb_clk,
  496. .en_reg = PERIP1_CLK_ENB,
  497. .en_reg_bit = I2C_CLK_ENB,
  498. .recalc = &follow_parent,
  499. };
  500. /* dma clock */
  501. static struct clk dma_clk = {
  502. .pclk = &ahb_clk,
  503. .en_reg = PERIP1_CLK_ENB,
  504. .en_reg_bit = DMA_CLK_ENB,
  505. .recalc = &follow_parent,
  506. };
  507. /* jpeg clock */
  508. static struct clk jpeg_clk = {
  509. .pclk = &ahb_clk,
  510. .en_reg = PERIP1_CLK_ENB,
  511. .en_reg_bit = JPEG_CLK_ENB,
  512. .recalc = &follow_parent,
  513. };
  514. /* gmac clock */
  515. static struct clk gmac_clk = {
  516. .pclk = &ahb_clk,
  517. .en_reg = PERIP1_CLK_ENB,
  518. .en_reg_bit = GMAC_CLK_ENB,
  519. .recalc = &follow_parent,
  520. };
  521. /* smi clock */
  522. static struct clk smi_clk = {
  523. .pclk = &ahb_clk,
  524. .en_reg = PERIP1_CLK_ENB,
  525. .en_reg_bit = SMI_CLK_ENB,
  526. .recalc = &follow_parent,
  527. };
  528. /* c3 clock */
  529. static struct clk c3_clk = {
  530. .pclk = &ahb_clk,
  531. .en_reg = PERIP1_CLK_ENB,
  532. .en_reg_bit = C3_CLK_ENB,
  533. .recalc = &follow_parent,
  534. };
  535. /* clock derived from apb clk */
  536. /* adc clock */
  537. static struct clk adc_clk = {
  538. .pclk = &apb_clk,
  539. .en_reg = PERIP1_CLK_ENB,
  540. .en_reg_bit = ADC_CLK_ENB,
  541. .recalc = &follow_parent,
  542. };
  543. #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320)
  544. /* emi clock */
  545. static struct clk emi_clk = {
  546. .flags = ALWAYS_ENABLED,
  547. .pclk = &ahb_clk,
  548. .recalc = &follow_parent,
  549. };
  550. #endif
  551. /* ssp clock */
  552. static struct clk ssp0_clk = {
  553. .pclk = &apb_clk,
  554. .en_reg = PERIP1_CLK_ENB,
  555. .en_reg_bit = SSP_CLK_ENB,
  556. .recalc = &follow_parent,
  557. };
  558. /* gpio clock */
  559. static struct clk gpio_clk = {
  560. .pclk = &apb_clk,
  561. .en_reg = PERIP1_CLK_ENB,
  562. .en_reg_bit = GPIO_CLK_ENB,
  563. .recalc = &follow_parent,
  564. };
  565. static struct clk dummy_apb_pclk;
  566. #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR310) || \
  567. defined(CONFIG_MACH_SPEAR320)
  568. /* fsmc clock */
  569. static struct clk fsmc_clk = {
  570. .flags = ALWAYS_ENABLED,
  571. .pclk = &ahb_clk,
  572. .recalc = &follow_parent,
  573. };
  574. #endif
  575. /* common clocks to spear310 and spear320 */
  576. #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320)
  577. /* uart1 clock */
  578. static struct clk uart1_clk = {
  579. .flags = ALWAYS_ENABLED,
  580. .pclk = &apb_clk,
  581. .recalc = &follow_parent,
  582. };
  583. /* uart2 clock */
  584. static struct clk uart2_clk = {
  585. .flags = ALWAYS_ENABLED,
  586. .pclk = &apb_clk,
  587. .recalc = &follow_parent,
  588. };
  589. #endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */
  590. /* common clocks to spear300 and spear320 */
  591. #if defined(CONFIG_MACH_SPEAR300) || defined(CONFIG_MACH_SPEAR320)
  592. /* clcd clock */
  593. static struct clk clcd_clk = {
  594. .flags = ALWAYS_ENABLED,
  595. .pclk = &pll3_48m_clk,
  596. .recalc = &follow_parent,
  597. };
  598. /* sdhci clock */
  599. static struct clk sdhci_clk = {
  600. .flags = ALWAYS_ENABLED,
  601. .pclk = &ahb_clk,
  602. .recalc = &follow_parent,
  603. };
  604. #endif /* CONFIG_MACH_SPEAR300 || CONFIG_MACH_SPEAR320 */
  605. /* spear300 machine specific clock structures */
  606. #ifdef CONFIG_MACH_SPEAR300
  607. /* gpio1 clock */
  608. static struct clk gpio1_clk = {
  609. .flags = ALWAYS_ENABLED,
  610. .pclk = &apb_clk,
  611. .recalc = &follow_parent,
  612. };
  613. /* keyboard clock */
  614. static struct clk kbd_clk = {
  615. .flags = ALWAYS_ENABLED,
  616. .pclk = &apb_clk,
  617. .recalc = &follow_parent,
  618. };
  619. #endif
  620. /* spear310 machine specific clock structures */
  621. #ifdef CONFIG_MACH_SPEAR310
  622. /* uart3 clock */
  623. static struct clk uart3_clk = {
  624. .flags = ALWAYS_ENABLED,
  625. .pclk = &apb_clk,
  626. .recalc = &follow_parent,
  627. };
  628. /* uart4 clock */
  629. static struct clk uart4_clk = {
  630. .flags = ALWAYS_ENABLED,
  631. .pclk = &apb_clk,
  632. .recalc = &follow_parent,
  633. };
  634. /* uart5 clock */
  635. static struct clk uart5_clk = {
  636. .flags = ALWAYS_ENABLED,
  637. .pclk = &apb_clk,
  638. .recalc = &follow_parent,
  639. };
  640. #endif
  641. /* spear320 machine specific clock structures */
  642. #ifdef CONFIG_MACH_SPEAR320
  643. /* can0 clock */
  644. static struct clk can0_clk = {
  645. .flags = ALWAYS_ENABLED,
  646. .pclk = &apb_clk,
  647. .recalc = &follow_parent,
  648. };
  649. /* can1 clock */
  650. static struct clk can1_clk = {
  651. .flags = ALWAYS_ENABLED,
  652. .pclk = &apb_clk,
  653. .recalc = &follow_parent,
  654. };
  655. /* i2c1 clock */
  656. static struct clk i2c1_clk = {
  657. .flags = ALWAYS_ENABLED,
  658. .pclk = &ahb_clk,
  659. .recalc = &follow_parent,
  660. };
  661. /* ssp1 clock */
  662. static struct clk ssp1_clk = {
  663. .flags = ALWAYS_ENABLED,
  664. .pclk = &apb_clk,
  665. .recalc = &follow_parent,
  666. };
  667. /* ssp2 clock */
  668. static struct clk ssp2_clk = {
  669. .flags = ALWAYS_ENABLED,
  670. .pclk = &apb_clk,
  671. .recalc = &follow_parent,
  672. };
  673. /* pwm clock */
  674. static struct clk pwm_clk = {
  675. .flags = ALWAYS_ENABLED,
  676. .pclk = &apb_clk,
  677. .recalc = &follow_parent,
  678. };
  679. #endif
  680. /* array of all spear 3xx clock lookups */
  681. static struct clk_lookup spear_clk_lookups[] = {
  682. CLKDEV_INIT(NULL, "apb_pclk", &dummy_apb_pclk),
  683. /* root clks */
  684. CLKDEV_INIT(NULL, "osc_32k_clk", &osc_32k_clk),
  685. CLKDEV_INIT(NULL, "osc_24m_clk", &osc_24m_clk),
  686. /* clock derived from 32 KHz osc clk */
  687. CLKDEV_INIT("fc900000.rtc", NULL, &rtc_clk),
  688. /* clock derived from 24 MHz osc clk */
  689. CLKDEV_INIT(NULL, "pll1_clk", &pll1_clk),
  690. CLKDEV_INIT(NULL, "pll3_48m_clk", &pll3_48m_clk),
  691. CLKDEV_INIT("fc880000.wdt", NULL, &wdt_clk),
  692. /* clock derived from pll1 clk */
  693. CLKDEV_INIT(NULL, "cpu_clk", &cpu_clk),
  694. CLKDEV_INIT(NULL, "ahb_clk", &ahb_clk),
  695. CLKDEV_INIT(NULL, "uart_synth_clk", &uart_synth_clk),
  696. CLKDEV_INIT(NULL, "firda_synth_clk", &firda_synth_clk),
  697. CLKDEV_INIT(NULL, "gpt0_synth_clk", &gpt0_synth_clk),
  698. CLKDEV_INIT(NULL, "gpt1_synth_clk", &gpt1_synth_clk),
  699. CLKDEV_INIT(NULL, "gpt2_synth_clk", &gpt2_synth_clk),
  700. CLKDEV_INIT("d0000000.serial", NULL, &uart_clk),
  701. CLKDEV_INIT("firda", NULL, &firda_clk),
  702. CLKDEV_INIT("gpt0", NULL, &gpt0_clk),
  703. CLKDEV_INIT("gpt1", NULL, &gpt1_clk),
  704. CLKDEV_INIT("gpt2", NULL, &gpt2_clk),
  705. /* clock derived from pll3 clk */
  706. CLKDEV_INIT("designware_udc", NULL, &usbd_clk),
  707. CLKDEV_INIT(NULL, "usbh_clk", &usbh_clk),
  708. /* clock derived from usbh clk */
  709. CLKDEV_INIT(NULL, "usbh.0_clk", &usbh0_clk),
  710. CLKDEV_INIT(NULL, "usbh.1_clk", &usbh1_clk),
  711. /* clock derived from ahb clk */
  712. CLKDEV_INIT(NULL, "apb_clk", &apb_clk),
  713. CLKDEV_INIT("d0180000.i2c", NULL, &i2c_clk),
  714. CLKDEV_INIT("fc400000.dma", NULL, &dma_clk),
  715. CLKDEV_INIT("jpeg", NULL, &jpeg_clk),
  716. CLKDEV_INIT("e0800000.eth", NULL, &gmac_clk),
  717. CLKDEV_INIT("fc000000.flash", NULL, &smi_clk),
  718. CLKDEV_INIT("c3", NULL, &c3_clk),
  719. /* clock derived from apb clk */
  720. CLKDEV_INIT("adc", NULL, &adc_clk),
  721. CLKDEV_INIT("d0100000.spi", NULL, &ssp0_clk),
  722. CLKDEV_INIT("fc980000.gpio", NULL, &gpio_clk),
  723. };
  724. /* array of all spear 300 clock lookups */
  725. #ifdef CONFIG_MACH_SPEAR300
  726. static struct clk_lookup spear300_clk_lookups[] = {
  727. CLKDEV_INIT("60000000.clcd", NULL, &clcd_clk),
  728. CLKDEV_INIT("94000000.flash", NULL, &fsmc_clk),
  729. CLKDEV_INIT("a9000000.gpio", NULL, &gpio1_clk),
  730. CLKDEV_INIT("a0000000.kbd", NULL, &kbd_clk),
  731. CLKDEV_INIT("70000000.sdhci", NULL, &sdhci_clk),
  732. };
  733. void __init spear300_clk_init(void)
  734. {
  735. int i;
  736. for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++)
  737. clk_register(&spear_clk_lookups[i]);
  738. for (i = 0; i < ARRAY_SIZE(spear300_clk_lookups); i++)
  739. clk_register(&spear300_clk_lookups[i]);
  740. clk_init();
  741. }
  742. #endif
  743. /* array of all spear 310 clock lookups */
  744. #ifdef CONFIG_MACH_SPEAR310
  745. static struct clk_lookup spear310_clk_lookups[] = {
  746. CLKDEV_INIT("44000000.flash", NULL, &fsmc_clk),
  747. CLKDEV_INIT(NULL, "emi", &emi_clk),
  748. CLKDEV_INIT("b2000000.serial", NULL, &uart1_clk),
  749. CLKDEV_INIT("b2080000.serial", NULL, &uart2_clk),
  750. CLKDEV_INIT("b2100000.serial", NULL, &uart3_clk),
  751. CLKDEV_INIT("b2180000.serial", NULL, &uart4_clk),
  752. CLKDEV_INIT("b2200000.serial", NULL, &uart5_clk),
  753. };
  754. void __init spear310_clk_init(void)
  755. {
  756. int i;
  757. for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++)
  758. clk_register(&spear_clk_lookups[i]);
  759. for (i = 0; i < ARRAY_SIZE(spear310_clk_lookups); i++)
  760. clk_register(&spear310_clk_lookups[i]);
  761. clk_init();
  762. }
  763. #endif
  764. /* array of all spear 320 clock lookups */
  765. #ifdef CONFIG_MACH_SPEAR320
  766. static struct clk_lookup spear320_clk_lookups[] = {
  767. CLKDEV_INIT("90000000.clcd", NULL, &clcd_clk),
  768. CLKDEV_INIT("4c000000.flash", NULL, &fsmc_clk),
  769. CLKDEV_INIT("a7000000.i2c", NULL, &i2c1_clk),
  770. CLKDEV_INIT(NULL, "emi", &emi_clk),
  771. CLKDEV_INIT("pwm", NULL, &pwm_clk),
  772. CLKDEV_INIT("70000000.sdhci", NULL, &sdhci_clk),
  773. CLKDEV_INIT("c_can_platform.0", NULL, &can0_clk),
  774. CLKDEV_INIT("c_can_platform.1", NULL, &can1_clk),
  775. CLKDEV_INIT("a5000000.spi", NULL, &ssp1_clk),
  776. CLKDEV_INIT("a6000000.spi", NULL, &ssp2_clk),
  777. CLKDEV_INIT("a3000000.serial", NULL, &uart1_clk),
  778. CLKDEV_INIT("a4000000.serial", NULL, &uart2_clk),
  779. };
  780. void __init spear320_clk_init(void)
  781. {
  782. int i;
  783. for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++)
  784. clk_register(&spear_clk_lookups[i]);
  785. for (i = 0; i < ARRAY_SIZE(spear320_clk_lookups); i++)
  786. clk_register(&spear320_clk_lookups[i]);
  787. clk_init();
  788. }
  789. #endif