clock.h 24 KB

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