clock.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. /*
  2. * linux/arch/arm/mach-omap1/clock.h
  3. *
  4. * Copyright (C) 2004 - 2005 Nokia corporation
  5. * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
  6. * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc
  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 version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #ifndef __ARCH_ARM_MACH_OMAP1_CLOCK_H
  13. #define __ARCH_ARM_MACH_OMAP1_CLOCK_H
  14. static void omap1_ckctl_recalc(struct clk * clk);
  15. static void omap1_watchdog_recalc(struct clk * clk);
  16. static int omap1_set_sossi_rate(struct clk *clk, unsigned long rate);
  17. static void omap1_sossi_recalc(struct clk *clk);
  18. static void omap1_ckctl_recalc_dsp_domain(struct clk * clk);
  19. static int omap1_clk_set_rate_dsp_domain(struct clk * clk, unsigned long rate);
  20. static int omap1_set_uart_rate(struct clk * clk, unsigned long rate);
  21. static void omap1_uart_recalc(struct clk * clk);
  22. static int omap1_set_ext_clk_rate(struct clk * clk, unsigned long rate);
  23. static long omap1_round_ext_clk_rate(struct clk * clk, unsigned long rate);
  24. static void omap1_init_ext_clk(struct clk * clk);
  25. static int omap1_select_table_rate(struct clk * clk, unsigned long rate);
  26. static long omap1_round_to_table_rate(struct clk * clk, unsigned long rate);
  27. static int omap1_clk_set_rate_ckctl_arm(struct clk *clk, unsigned long rate);
  28. static long omap1_clk_round_rate_ckctl_arm(struct clk *clk, unsigned long rate);
  29. struct mpu_rate {
  30. unsigned long rate;
  31. unsigned long xtal;
  32. unsigned long pll_rate;
  33. __u16 ckctl_val;
  34. __u16 dpllctl_val;
  35. };
  36. struct uart_clk {
  37. struct clk clk;
  38. unsigned long sysc_addr;
  39. };
  40. /* Provide a method for preventing idling some ARM IDLECT clocks */
  41. struct arm_idlect1_clk {
  42. struct clk clk;
  43. unsigned long no_idle_count;
  44. __u8 idlect_shift;
  45. };
  46. /* ARM_CKCTL bit shifts */
  47. #define CKCTL_PERDIV_OFFSET 0
  48. #define CKCTL_LCDDIV_OFFSET 2
  49. #define CKCTL_ARMDIV_OFFSET 4
  50. #define CKCTL_DSPDIV_OFFSET 6
  51. #define CKCTL_TCDIV_OFFSET 8
  52. #define CKCTL_DSPMMUDIV_OFFSET 10
  53. /*#define ARM_TIMXO 12*/
  54. #define EN_DSPCK 13
  55. /*#define ARM_INTHCK_SEL 14*/ /* Divide-by-2 for mpu inth_ck */
  56. /* DSP_CKCTL bit shifts */
  57. #define CKCTL_DSPPERDIV_OFFSET 0
  58. /* ARM_IDLECT2 bit shifts */
  59. #define EN_WDTCK 0
  60. #define EN_XORPCK 1
  61. #define EN_PERCK 2
  62. #define EN_LCDCK 3
  63. #define EN_LBCK 4 /* Not on 1610/1710 */
  64. /*#define EN_HSABCK 5*/
  65. #define EN_APICK 6
  66. #define EN_TIMCK 7
  67. #define DMACK_REQ 8
  68. #define EN_GPIOCK 9 /* Not on 1610/1710 */
  69. /*#define EN_LBFREECK 10*/
  70. #define EN_CKOUT_ARM 11
  71. /* ARM_IDLECT3 bit shifts */
  72. #define EN_OCPI_CK 0
  73. #define EN_TC1_CK 2
  74. #define EN_TC2_CK 4
  75. /* DSP_IDLECT2 bit shifts (0,1,2 are same as for ARM_IDLECT2) */
  76. #define EN_DSPTIMCK 5
  77. /* Various register defines for clock controls scattered around OMAP chip */
  78. #define SDW_MCLK_INV_BIT 2 /* In ULPD_CLKC_CTRL */
  79. #define USB_MCLK_EN_BIT 4 /* In ULPD_CLKC_CTRL */
  80. #define USB_HOST_HHC_UHOST_EN 9 /* In MOD_CONF_CTRL_0 */
  81. #define SWD_ULPD_PLL_CLK_REQ 1 /* In SWD_CLK_DIV_CTRL_SEL */
  82. #define COM_ULPD_PLL_CLK_REQ 1 /* In COM_CLK_DIV_CTRL_SEL */
  83. #define SWD_CLK_DIV_CTRL_SEL 0xfffe0874
  84. #define COM_CLK_DIV_CTRL_SEL 0xfffe0878
  85. #define SOFT_REQ_REG 0xfffe0834
  86. #define SOFT_REQ_REG2 0xfffe0880
  87. /*-------------------------------------------------------------------------
  88. * Omap1 MPU rate table
  89. *-------------------------------------------------------------------------*/
  90. static struct mpu_rate rate_table[] = {
  91. /* MPU MHz, xtal MHz, dpll1 MHz, CKCTL, DPLL_CTL
  92. * NOTE: Comment order here is different from bits in CKCTL value:
  93. * armdiv, dspdiv, dspmmu, tcdiv, perdiv, lcddiv
  94. */
  95. #if defined(CONFIG_OMAP_ARM_216MHZ)
  96. { 216000000, 12000000, 216000000, 0x050d, 0x2910 }, /* 1/1/2/2/2/8 */
  97. #endif
  98. #if defined(CONFIG_OMAP_ARM_195MHZ)
  99. { 195000000, 13000000, 195000000, 0x050e, 0x2790 }, /* 1/1/2/2/4/8 */
  100. #endif
  101. #if defined(CONFIG_OMAP_ARM_192MHZ)
  102. { 192000000, 19200000, 192000000, 0x050f, 0x2510 }, /* 1/1/2/2/8/8 */
  103. { 192000000, 12000000, 192000000, 0x050f, 0x2810 }, /* 1/1/2/2/8/8 */
  104. { 96000000, 12000000, 192000000, 0x055f, 0x2810 }, /* 2/2/2/2/8/8 */
  105. { 48000000, 12000000, 192000000, 0x0baf, 0x2810 }, /* 4/4/4/8/8/8 */
  106. { 24000000, 12000000, 192000000, 0x0fff, 0x2810 }, /* 8/8/8/8/8/8 */
  107. #endif
  108. #if defined(CONFIG_OMAP_ARM_182MHZ)
  109. { 182000000, 13000000, 182000000, 0x050e, 0x2710 }, /* 1/1/2/2/4/8 */
  110. #endif
  111. #if defined(CONFIG_OMAP_ARM_168MHZ)
  112. { 168000000, 12000000, 168000000, 0x010f, 0x2710 }, /* 1/1/1/2/8/8 */
  113. #endif
  114. #if defined(CONFIG_OMAP_ARM_150MHZ)
  115. { 150000000, 12000000, 150000000, 0x010a, 0x2cb0 }, /* 1/1/1/2/4/4 */
  116. #endif
  117. #if defined(CONFIG_OMAP_ARM_120MHZ)
  118. { 120000000, 12000000, 120000000, 0x010a, 0x2510 }, /* 1/1/1/2/4/4 */
  119. #endif
  120. #if defined(CONFIG_OMAP_ARM_96MHZ)
  121. { 96000000, 12000000, 96000000, 0x0005, 0x2410 }, /* 1/1/1/1/2/2 */
  122. #endif
  123. #if defined(CONFIG_OMAP_ARM_60MHZ)
  124. { 60000000, 12000000, 60000000, 0x0005, 0x2290 }, /* 1/1/1/1/2/2 */
  125. #endif
  126. #if defined(CONFIG_OMAP_ARM_30MHZ)
  127. { 30000000, 12000000, 60000000, 0x0555, 0x2290 }, /* 2/2/2/2/2/2 */
  128. #endif
  129. { 0, 0, 0, 0, 0 },
  130. };
  131. /*-------------------------------------------------------------------------
  132. * Omap1 clocks
  133. *-------------------------------------------------------------------------*/
  134. static struct clk ck_ref = {
  135. .name = "ck_ref",
  136. .ops = &clkops_null,
  137. .rate = 12000000,
  138. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  139. CLOCK_IN_OMAP310,
  140. };
  141. static struct clk ck_dpll1 = {
  142. .name = "ck_dpll1",
  143. .ops = &clkops_null,
  144. .parent = &ck_ref,
  145. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  146. CLOCK_IN_OMAP310 | RATE_PROPAGATES,
  147. };
  148. static struct arm_idlect1_clk ck_dpll1out = {
  149. .clk = {
  150. .name = "ck_dpll1out",
  151. .ops = &clkops_generic,
  152. .parent = &ck_dpll1,
  153. .flags = CLOCK_IN_OMAP16XX | CLOCK_IDLE_CONTROL |
  154. ENABLE_REG_32BIT | RATE_PROPAGATES,
  155. .enable_reg = (void __iomem *)ARM_IDLECT2,
  156. .enable_bit = EN_CKOUT_ARM,
  157. .recalc = &followparent_recalc,
  158. },
  159. .idlect_shift = 12,
  160. };
  161. static struct clk sossi_ck = {
  162. .name = "ck_sossi",
  163. .ops = &clkops_generic,
  164. .parent = &ck_dpll1out.clk,
  165. .flags = CLOCK_IN_OMAP16XX | CLOCK_NO_IDLE_PARENT |
  166. ENABLE_REG_32BIT,
  167. .enable_reg = (void __iomem *)MOD_CONF_CTRL_1,
  168. .enable_bit = 16,
  169. .recalc = &omap1_sossi_recalc,
  170. .set_rate = &omap1_set_sossi_rate,
  171. };
  172. static struct clk arm_ck = {
  173. .name = "arm_ck",
  174. .ops = &clkops_null,
  175. .parent = &ck_dpll1,
  176. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  177. CLOCK_IN_OMAP310 | RATE_PROPAGATES,
  178. .rate_offset = CKCTL_ARMDIV_OFFSET,
  179. .recalc = &omap1_ckctl_recalc,
  180. .round_rate = omap1_clk_round_rate_ckctl_arm,
  181. .set_rate = omap1_clk_set_rate_ckctl_arm,
  182. };
  183. static struct arm_idlect1_clk armper_ck = {
  184. .clk = {
  185. .name = "armper_ck",
  186. .ops = &clkops_generic,
  187. .parent = &ck_dpll1,
  188. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  189. CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
  190. .enable_reg = (void __iomem *)ARM_IDLECT2,
  191. .enable_bit = EN_PERCK,
  192. .rate_offset = CKCTL_PERDIV_OFFSET,
  193. .recalc = &omap1_ckctl_recalc,
  194. .round_rate = omap1_clk_round_rate_ckctl_arm,
  195. .set_rate = omap1_clk_set_rate_ckctl_arm,
  196. },
  197. .idlect_shift = 2,
  198. };
  199. static struct clk arm_gpio_ck = {
  200. .name = "arm_gpio_ck",
  201. .ops = &clkops_generic,
  202. .parent = &ck_dpll1,
  203. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
  204. .enable_reg = (void __iomem *)ARM_IDLECT2,
  205. .enable_bit = EN_GPIOCK,
  206. .recalc = &followparent_recalc,
  207. };
  208. static struct arm_idlect1_clk armxor_ck = {
  209. .clk = {
  210. .name = "armxor_ck",
  211. .ops = &clkops_generic,
  212. .parent = &ck_ref,
  213. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  214. CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
  215. .enable_reg = (void __iomem *)ARM_IDLECT2,
  216. .enable_bit = EN_XORPCK,
  217. .recalc = &followparent_recalc,
  218. },
  219. .idlect_shift = 1,
  220. };
  221. static struct arm_idlect1_clk armtim_ck = {
  222. .clk = {
  223. .name = "armtim_ck",
  224. .ops = &clkops_generic,
  225. .parent = &ck_ref,
  226. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  227. CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
  228. .enable_reg = (void __iomem *)ARM_IDLECT2,
  229. .enable_bit = EN_TIMCK,
  230. .recalc = &followparent_recalc,
  231. },
  232. .idlect_shift = 9,
  233. };
  234. static struct arm_idlect1_clk armwdt_ck = {
  235. .clk = {
  236. .name = "armwdt_ck",
  237. .ops = &clkops_generic,
  238. .parent = &ck_ref,
  239. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  240. CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
  241. .enable_reg = (void __iomem *)ARM_IDLECT2,
  242. .enable_bit = EN_WDTCK,
  243. .recalc = &omap1_watchdog_recalc,
  244. },
  245. .idlect_shift = 0,
  246. };
  247. static struct clk arminth_ck16xx = {
  248. .name = "arminth_ck",
  249. .ops = &clkops_null,
  250. .parent = &arm_ck,
  251. .flags = CLOCK_IN_OMAP16XX,
  252. .recalc = &followparent_recalc,
  253. /* Note: On 16xx the frequency can be divided by 2 by programming
  254. * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
  255. *
  256. * 1510 version is in TC clocks.
  257. */
  258. };
  259. static struct clk dsp_ck = {
  260. .name = "dsp_ck",
  261. .ops = &clkops_generic,
  262. .parent = &ck_dpll1,
  263. .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
  264. .enable_reg = (void __iomem *)ARM_CKCTL,
  265. .enable_bit = EN_DSPCK,
  266. .rate_offset = CKCTL_DSPDIV_OFFSET,
  267. .recalc = &omap1_ckctl_recalc,
  268. .round_rate = omap1_clk_round_rate_ckctl_arm,
  269. .set_rate = omap1_clk_set_rate_ckctl_arm,
  270. };
  271. static struct clk dspmmu_ck = {
  272. .name = "dspmmu_ck",
  273. .ops = &clkops_null,
  274. .parent = &ck_dpll1,
  275. .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
  276. .rate_offset = CKCTL_DSPMMUDIV_OFFSET,
  277. .recalc = &omap1_ckctl_recalc,
  278. .round_rate = omap1_clk_round_rate_ckctl_arm,
  279. .set_rate = omap1_clk_set_rate_ckctl_arm,
  280. };
  281. static struct clk dspper_ck = {
  282. .name = "dspper_ck",
  283. .ops = &clkops_dspck,
  284. .parent = &ck_dpll1,
  285. .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  286. VIRTUAL_IO_ADDRESS,
  287. .enable_reg = DSP_IDLECT2,
  288. .enable_bit = EN_PERCK,
  289. .rate_offset = CKCTL_PERDIV_OFFSET,
  290. .recalc = &omap1_ckctl_recalc_dsp_domain,
  291. .round_rate = omap1_clk_round_rate_ckctl_arm,
  292. .set_rate = &omap1_clk_set_rate_dsp_domain,
  293. };
  294. static struct clk dspxor_ck = {
  295. .name = "dspxor_ck",
  296. .ops = &clkops_dspck,
  297. .parent = &ck_ref,
  298. .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  299. VIRTUAL_IO_ADDRESS,
  300. .enable_reg = DSP_IDLECT2,
  301. .enable_bit = EN_XORPCK,
  302. .recalc = &followparent_recalc,
  303. };
  304. static struct clk dsptim_ck = {
  305. .name = "dsptim_ck",
  306. .ops = &clkops_dspck,
  307. .parent = &ck_ref,
  308. .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  309. VIRTUAL_IO_ADDRESS,
  310. .enable_reg = DSP_IDLECT2,
  311. .enable_bit = EN_DSPTIMCK,
  312. .recalc = &followparent_recalc,
  313. };
  314. /* Tie ARM_IDLECT1:IDLIF_ARM to this logical clock structure */
  315. static struct arm_idlect1_clk tc_ck = {
  316. .clk = {
  317. .name = "tc_ck",
  318. .ops = &clkops_null,
  319. .parent = &ck_dpll1,
  320. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  321. CLOCK_IN_OMAP730 | CLOCK_IN_OMAP310 |
  322. RATE_PROPAGATES | CLOCK_IDLE_CONTROL,
  323. .rate_offset = CKCTL_TCDIV_OFFSET,
  324. .recalc = &omap1_ckctl_recalc,
  325. .round_rate = omap1_clk_round_rate_ckctl_arm,
  326. .set_rate = omap1_clk_set_rate_ckctl_arm,
  327. },
  328. .idlect_shift = 6,
  329. };
  330. static struct clk arminth_ck1510 = {
  331. .name = "arminth_ck",
  332. .ops = &clkops_null,
  333. .parent = &tc_ck.clk,
  334. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
  335. .recalc = &followparent_recalc,
  336. /* Note: On 1510 the frequency follows TC_CK
  337. *
  338. * 16xx version is in MPU clocks.
  339. */
  340. };
  341. static struct clk tipb_ck = {
  342. /* No-idle controlled by "tc_ck" */
  343. .name = "tipb_ck",
  344. .ops = &clkops_null,
  345. .parent = &tc_ck.clk,
  346. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
  347. .recalc = &followparent_recalc,
  348. };
  349. static struct clk l3_ocpi_ck = {
  350. /* No-idle controlled by "tc_ck" */
  351. .name = "l3_ocpi_ck",
  352. .ops = &clkops_generic,
  353. .parent = &tc_ck.clk,
  354. .flags = CLOCK_IN_OMAP16XX,
  355. .enable_reg = (void __iomem *)ARM_IDLECT3,
  356. .enable_bit = EN_OCPI_CK,
  357. .recalc = &followparent_recalc,
  358. };
  359. static struct clk tc1_ck = {
  360. .name = "tc1_ck",
  361. .ops = &clkops_generic,
  362. .parent = &tc_ck.clk,
  363. .flags = CLOCK_IN_OMAP16XX,
  364. .enable_reg = (void __iomem *)ARM_IDLECT3,
  365. .enable_bit = EN_TC1_CK,
  366. .recalc = &followparent_recalc,
  367. };
  368. static struct clk tc2_ck = {
  369. .name = "tc2_ck",
  370. .ops = &clkops_generic,
  371. .parent = &tc_ck.clk,
  372. .flags = CLOCK_IN_OMAP16XX,
  373. .enable_reg = (void __iomem *)ARM_IDLECT3,
  374. .enable_bit = EN_TC2_CK,
  375. .recalc = &followparent_recalc,
  376. };
  377. static struct clk dma_ck = {
  378. /* No-idle controlled by "tc_ck" */
  379. .name = "dma_ck",
  380. .ops = &clkops_null,
  381. .parent = &tc_ck.clk,
  382. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  383. CLOCK_IN_OMAP310,
  384. .recalc = &followparent_recalc,
  385. };
  386. static struct clk dma_lcdfree_ck = {
  387. .name = "dma_lcdfree_ck",
  388. .ops = &clkops_null,
  389. .parent = &tc_ck.clk,
  390. .flags = CLOCK_IN_OMAP16XX,
  391. .recalc = &followparent_recalc,
  392. };
  393. static struct arm_idlect1_clk api_ck = {
  394. .clk = {
  395. .name = "api_ck",
  396. .ops = &clkops_generic,
  397. .parent = &tc_ck.clk,
  398. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  399. CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
  400. .enable_reg = (void __iomem *)ARM_IDLECT2,
  401. .enable_bit = EN_APICK,
  402. .recalc = &followparent_recalc,
  403. },
  404. .idlect_shift = 8,
  405. };
  406. static struct arm_idlect1_clk lb_ck = {
  407. .clk = {
  408. .name = "lb_ck",
  409. .ops = &clkops_generic,
  410. .parent = &tc_ck.clk,
  411. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
  412. CLOCK_IDLE_CONTROL,
  413. .enable_reg = (void __iomem *)ARM_IDLECT2,
  414. .enable_bit = EN_LBCK,
  415. .recalc = &followparent_recalc,
  416. },
  417. .idlect_shift = 4,
  418. };
  419. static struct clk rhea1_ck = {
  420. .name = "rhea1_ck",
  421. .ops = &clkops_null,
  422. .parent = &tc_ck.clk,
  423. .flags = CLOCK_IN_OMAP16XX,
  424. .recalc = &followparent_recalc,
  425. };
  426. static struct clk rhea2_ck = {
  427. .name = "rhea2_ck",
  428. .ops = &clkops_null,
  429. .parent = &tc_ck.clk,
  430. .flags = CLOCK_IN_OMAP16XX,
  431. .recalc = &followparent_recalc,
  432. };
  433. static struct clk lcd_ck_16xx = {
  434. .name = "lcd_ck",
  435. .ops = &clkops_generic,
  436. .parent = &ck_dpll1,
  437. .flags = CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730,
  438. .enable_reg = (void __iomem *)ARM_IDLECT2,
  439. .enable_bit = EN_LCDCK,
  440. .rate_offset = CKCTL_LCDDIV_OFFSET,
  441. .recalc = &omap1_ckctl_recalc,
  442. .round_rate = omap1_clk_round_rate_ckctl_arm,
  443. .set_rate = omap1_clk_set_rate_ckctl_arm,
  444. };
  445. static struct arm_idlect1_clk lcd_ck_1510 = {
  446. .clk = {
  447. .name = "lcd_ck",
  448. .ops = &clkops_generic,
  449. .parent = &ck_dpll1,
  450. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
  451. CLOCK_IDLE_CONTROL,
  452. .enable_reg = (void __iomem *)ARM_IDLECT2,
  453. .enable_bit = EN_LCDCK,
  454. .rate_offset = CKCTL_LCDDIV_OFFSET,
  455. .recalc = &omap1_ckctl_recalc,
  456. .round_rate = omap1_clk_round_rate_ckctl_arm,
  457. .set_rate = omap1_clk_set_rate_ckctl_arm,
  458. },
  459. .idlect_shift = 3,
  460. };
  461. static struct clk uart1_1510 = {
  462. .name = "uart1_ck",
  463. .ops = &clkops_null,
  464. /* Direct from ULPD, no real parent */
  465. .parent = &armper_ck.clk,
  466. .rate = 12000000,
  467. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
  468. ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
  469. .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
  470. .enable_bit = 29, /* Chooses between 12MHz and 48MHz */
  471. .set_rate = &omap1_set_uart_rate,
  472. .recalc = &omap1_uart_recalc,
  473. };
  474. static struct uart_clk uart1_16xx = {
  475. .clk = {
  476. .name = "uart1_ck",
  477. .ops = &clkops_uart,
  478. /* Direct from ULPD, no real parent */
  479. .parent = &armper_ck.clk,
  480. .rate = 48000000,
  481. .flags = CLOCK_IN_OMAP16XX | RATE_FIXED |
  482. ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
  483. .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
  484. .enable_bit = 29,
  485. },
  486. .sysc_addr = 0xfffb0054,
  487. };
  488. static struct clk uart2_ck = {
  489. .name = "uart2_ck",
  490. .ops = &clkops_null,
  491. /* Direct from ULPD, no real parent */
  492. .parent = &armper_ck.clk,
  493. .rate = 12000000,
  494. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  495. CLOCK_IN_OMAP310 | ENABLE_REG_32BIT |
  496. CLOCK_NO_IDLE_PARENT,
  497. .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
  498. .enable_bit = 30, /* Chooses between 12MHz and 48MHz */
  499. .set_rate = &omap1_set_uart_rate,
  500. .recalc = &omap1_uart_recalc,
  501. };
  502. static struct clk uart3_1510 = {
  503. .name = "uart3_ck",
  504. .ops = &clkops_null,
  505. /* Direct from ULPD, no real parent */
  506. .parent = &armper_ck.clk,
  507. .rate = 12000000,
  508. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
  509. ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
  510. .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
  511. .enable_bit = 31, /* Chooses between 12MHz and 48MHz */
  512. .set_rate = &omap1_set_uart_rate,
  513. .recalc = &omap1_uart_recalc,
  514. };
  515. static struct uart_clk uart3_16xx = {
  516. .clk = {
  517. .name = "uart3_ck",
  518. .ops = &clkops_uart,
  519. /* Direct from ULPD, no real parent */
  520. .parent = &armper_ck.clk,
  521. .rate = 48000000,
  522. .flags = CLOCK_IN_OMAP16XX | RATE_FIXED |
  523. ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
  524. .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
  525. .enable_bit = 31,
  526. },
  527. .sysc_addr = 0xfffb9854,
  528. };
  529. static struct clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */
  530. .name = "usb_clko",
  531. .ops = &clkops_generic,
  532. /* Direct from ULPD, no parent */
  533. .rate = 6000000,
  534. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  535. CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT,
  536. .enable_reg = (void __iomem *)ULPD_CLOCK_CTRL,
  537. .enable_bit = USB_MCLK_EN_BIT,
  538. };
  539. static struct clk usb_hhc_ck1510 = {
  540. .name = "usb_hhc_ck",
  541. .ops = &clkops_generic,
  542. /* Direct from ULPD, no parent */
  543. .rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */
  544. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
  545. RATE_FIXED | ENABLE_REG_32BIT,
  546. .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
  547. .enable_bit = USB_HOST_HHC_UHOST_EN,
  548. };
  549. static struct clk usb_hhc_ck16xx = {
  550. .name = "usb_hhc_ck",
  551. .ops = &clkops_generic,
  552. /* Direct from ULPD, no parent */
  553. .rate = 48000000,
  554. /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */
  555. .flags = CLOCK_IN_OMAP16XX |
  556. RATE_FIXED | ENABLE_REG_32BIT,
  557. .enable_reg = (void __iomem *)OTG_BASE + 0x08 /* OTG_SYSCON_2 */,
  558. .enable_bit = 8 /* UHOST_EN */,
  559. };
  560. static struct clk usb_dc_ck = {
  561. .name = "usb_dc_ck",
  562. .ops = &clkops_generic,
  563. /* Direct from ULPD, no parent */
  564. .rate = 48000000,
  565. .flags = CLOCK_IN_OMAP16XX | RATE_FIXED,
  566. .enable_reg = (void __iomem *)SOFT_REQ_REG,
  567. .enable_bit = 4,
  568. };
  569. static struct clk mclk_1510 = {
  570. .name = "mclk",
  571. .ops = &clkops_generic,
  572. /* Direct from ULPD, no parent. May be enabled by ext hardware. */
  573. .rate = 12000000,
  574. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED,
  575. .enable_reg = (void __iomem *)SOFT_REQ_REG,
  576. .enable_bit = 6,
  577. };
  578. static struct clk mclk_16xx = {
  579. .name = "mclk",
  580. .ops = &clkops_generic,
  581. /* Direct from ULPD, no parent. May be enabled by ext hardware. */
  582. .flags = CLOCK_IN_OMAP16XX,
  583. .enable_reg = (void __iomem *)COM_CLK_DIV_CTRL_SEL,
  584. .enable_bit = COM_ULPD_PLL_CLK_REQ,
  585. .set_rate = &omap1_set_ext_clk_rate,
  586. .round_rate = &omap1_round_ext_clk_rate,
  587. .init = &omap1_init_ext_clk,
  588. };
  589. static struct clk bclk_1510 = {
  590. .name = "bclk",
  591. .ops = &clkops_generic,
  592. /* Direct from ULPD, no parent. May be enabled by ext hardware. */
  593. .rate = 12000000,
  594. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED,
  595. };
  596. static struct clk bclk_16xx = {
  597. .name = "bclk",
  598. .ops = &clkops_generic,
  599. /* Direct from ULPD, no parent. May be enabled by ext hardware. */
  600. .flags = CLOCK_IN_OMAP16XX,
  601. .enable_reg = (void __iomem *)SWD_CLK_DIV_CTRL_SEL,
  602. .enable_bit = SWD_ULPD_PLL_CLK_REQ,
  603. .set_rate = &omap1_set_ext_clk_rate,
  604. .round_rate = &omap1_round_ext_clk_rate,
  605. .init = &omap1_init_ext_clk,
  606. };
  607. static struct clk mmc1_ck = {
  608. .name = "mmc_ck",
  609. .ops = &clkops_generic,
  610. /* Functional clock is direct from ULPD, interface clock is ARMPER */
  611. .parent = &armper_ck.clk,
  612. .rate = 48000000,
  613. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  614. CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT |
  615. CLOCK_NO_IDLE_PARENT,
  616. .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
  617. .enable_bit = 23,
  618. };
  619. static struct clk mmc2_ck = {
  620. .name = "mmc_ck",
  621. .id = 1,
  622. .ops = &clkops_generic,
  623. /* Functional clock is direct from ULPD, interface clock is ARMPER */
  624. .parent = &armper_ck.clk,
  625. .rate = 48000000,
  626. .flags = CLOCK_IN_OMAP16XX |
  627. RATE_FIXED | ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
  628. .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
  629. .enable_bit = 20,
  630. };
  631. static struct clk virtual_ck_mpu = {
  632. .name = "mpu",
  633. .ops = &clkops_null,
  634. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  635. CLOCK_IN_OMAP310,
  636. .parent = &arm_ck, /* Is smarter alias for */
  637. .recalc = &followparent_recalc,
  638. .set_rate = &omap1_select_table_rate,
  639. .round_rate = &omap1_round_to_table_rate,
  640. };
  641. /* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK
  642. remains active during MPU idle whenever this is enabled */
  643. static struct clk i2c_fck = {
  644. .name = "i2c_fck",
  645. .id = 1,
  646. .ops = &clkops_null,
  647. .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  648. CLOCK_NO_IDLE_PARENT,
  649. .parent = &armxor_ck.clk,
  650. .recalc = &followparent_recalc,
  651. };
  652. static struct clk i2c_ick = {
  653. .name = "i2c_ick",
  654. .id = 1,
  655. .ops = &clkops_null,
  656. .flags = CLOCK_IN_OMAP16XX | CLOCK_NO_IDLE_PARENT,
  657. .parent = &armper_ck.clk,
  658. .recalc = &followparent_recalc,
  659. };
  660. static struct clk * onchip_clks[] = {
  661. /* non-ULPD clocks */
  662. &ck_ref,
  663. &ck_dpll1,
  664. /* CK_GEN1 clocks */
  665. &ck_dpll1out.clk,
  666. &sossi_ck,
  667. &arm_ck,
  668. &armper_ck.clk,
  669. &arm_gpio_ck,
  670. &armxor_ck.clk,
  671. &armtim_ck.clk,
  672. &armwdt_ck.clk,
  673. &arminth_ck1510, &arminth_ck16xx,
  674. /* CK_GEN2 clocks */
  675. &dsp_ck,
  676. &dspmmu_ck,
  677. &dspper_ck,
  678. &dspxor_ck,
  679. &dsptim_ck,
  680. /* CK_GEN3 clocks */
  681. &tc_ck.clk,
  682. &tipb_ck,
  683. &l3_ocpi_ck,
  684. &tc1_ck,
  685. &tc2_ck,
  686. &dma_ck,
  687. &dma_lcdfree_ck,
  688. &api_ck.clk,
  689. &lb_ck.clk,
  690. &rhea1_ck,
  691. &rhea2_ck,
  692. &lcd_ck_16xx,
  693. &lcd_ck_1510.clk,
  694. /* ULPD clocks */
  695. &uart1_1510,
  696. &uart1_16xx.clk,
  697. &uart2_ck,
  698. &uart3_1510,
  699. &uart3_16xx.clk,
  700. &usb_clko,
  701. &usb_hhc_ck1510, &usb_hhc_ck16xx,
  702. &usb_dc_ck,
  703. &mclk_1510, &mclk_16xx,
  704. &bclk_1510, &bclk_16xx,
  705. &mmc1_ck,
  706. &mmc2_ck,
  707. /* Virtual clocks */
  708. &virtual_ck_mpu,
  709. &i2c_fck,
  710. &i2c_ick,
  711. };
  712. #endif