clock.h 22 KB

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