clock.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323
  1. /*
  2. * linux/arch/arm/plat-omap/clock.c
  3. *
  4. * Copyright (C) 2004 Nokia corporation
  5. * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. */
  11. #include <linux/module.h>
  12. #include <linux/kernel.h>
  13. #include <linux/list.h>
  14. #include <linux/errno.h>
  15. #include <linux/err.h>
  16. #include <asm/io.h>
  17. #include <asm/semaphore.h>
  18. #include <asm/hardware/clock.h>
  19. #include <asm/arch/board.h>
  20. #include <asm/arch/usb.h>
  21. #include "clock.h"
  22. static LIST_HEAD(clocks);
  23. static DECLARE_MUTEX(clocks_sem);
  24. static DEFINE_SPINLOCK(clockfw_lock);
  25. static void propagate_rate(struct clk * clk);
  26. /* UART clock function */
  27. static int set_uart_rate(struct clk * clk, unsigned long rate);
  28. /* External clock (MCLK & BCLK) functions */
  29. static int set_ext_clk_rate(struct clk * clk, unsigned long rate);
  30. static long round_ext_clk_rate(struct clk * clk, unsigned long rate);
  31. static void init_ext_clk(struct clk * clk);
  32. /* MPU virtual clock functions */
  33. static int select_table_rate(struct clk * clk, unsigned long rate);
  34. static long round_to_table_rate(struct clk * clk, unsigned long rate);
  35. void clk_setdpll(__u16, __u16);
  36. static struct mpu_rate rate_table[] = {
  37. /* MPU MHz, xtal MHz, dpll1 MHz, CKCTL, DPLL_CTL
  38. * armdiv, dspdiv, dspmmu, tcdiv, perdiv, lcddiv
  39. */
  40. #if defined(CONFIG_OMAP_ARM_216MHZ)
  41. { 216000000, 12000000, 216000000, 0x050d, 0x2910 }, /* 1/1/2/2/2/8 */
  42. #endif
  43. #if defined(CONFIG_OMAP_ARM_195MHZ)
  44. { 195000000, 13000000, 195000000, 0x050e, 0x2790 }, /* 1/1/2/2/4/8 */
  45. #endif
  46. #if defined(CONFIG_OMAP_ARM_192MHZ)
  47. { 192000000, 19200000, 192000000, 0x050f, 0x2510 }, /* 1/1/2/2/8/8 */
  48. { 192000000, 12000000, 192000000, 0x050f, 0x2810 }, /* 1/1/2/2/8/8 */
  49. { 96000000, 12000000, 192000000, 0x055f, 0x2810 }, /* 2/2/2/2/8/8 */
  50. { 48000000, 12000000, 192000000, 0x0baf, 0x2810 }, /* 4/8/4/4/8/8 */
  51. { 24000000, 12000000, 192000000, 0x0fff, 0x2810 }, /* 8/8/8/8/8/8 */
  52. #endif
  53. #if defined(CONFIG_OMAP_ARM_182MHZ)
  54. { 182000000, 13000000, 182000000, 0x050e, 0x2710 }, /* 1/1/2/2/4/8 */
  55. #endif
  56. #if defined(CONFIG_OMAP_ARM_168MHZ)
  57. { 168000000, 12000000, 168000000, 0x010f, 0x2710 }, /* 1/1/1/2/8/8 */
  58. #endif
  59. #if defined(CONFIG_OMAP_ARM_150MHZ)
  60. { 150000000, 12000000, 150000000, 0x010a, 0x2cb0 }, /* 1/1/1/2/4/4 */
  61. #endif
  62. #if defined(CONFIG_OMAP_ARM_120MHZ)
  63. { 120000000, 12000000, 120000000, 0x010a, 0x2510 }, /* 1/1/1/2/4/4 */
  64. #endif
  65. #if defined(CONFIG_OMAP_ARM_96MHZ)
  66. { 96000000, 12000000, 96000000, 0x0005, 0x2410 }, /* 1/1/1/1/2/2 */
  67. #endif
  68. #if defined(CONFIG_OMAP_ARM_60MHZ)
  69. { 60000000, 12000000, 60000000, 0x0005, 0x2290 }, /* 1/1/1/1/2/2 */
  70. #endif
  71. #if defined(CONFIG_OMAP_ARM_30MHZ)
  72. { 30000000, 12000000, 60000000, 0x0555, 0x2290 }, /* 2/2/2/2/2/2 */
  73. #endif
  74. { 0, 0, 0, 0, 0 },
  75. };
  76. static void ckctl_recalc(struct clk * clk);
  77. int __clk_enable(struct clk *clk);
  78. void __clk_disable(struct clk *clk);
  79. void __clk_unuse(struct clk *clk);
  80. int __clk_use(struct clk *clk);
  81. static void followparent_recalc(struct clk * clk)
  82. {
  83. clk->rate = clk->parent->rate;
  84. }
  85. static void watchdog_recalc(struct clk * clk)
  86. {
  87. clk->rate = clk->parent->rate / 14;
  88. }
  89. static void uart_recalc(struct clk * clk)
  90. {
  91. unsigned int val = omap_readl(clk->enable_reg);
  92. if (val & clk->enable_bit)
  93. clk->rate = 48000000;
  94. else
  95. clk->rate = 12000000;
  96. }
  97. static struct clk ck_ref = {
  98. .name = "ck_ref",
  99. .rate = 12000000,
  100. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  101. ALWAYS_ENABLED,
  102. };
  103. static struct clk ck_dpll1 = {
  104. .name = "ck_dpll1",
  105. .parent = &ck_ref,
  106. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  107. RATE_PROPAGATES | ALWAYS_ENABLED,
  108. };
  109. static struct clk ck_dpll1out = {
  110. .name = "ck_dpll1out",
  111. .parent = &ck_dpll1,
  112. .flags = CLOCK_IN_OMAP16XX,
  113. .enable_reg = ARM_IDLECT2,
  114. .enable_bit = EN_CKOUT_ARM,
  115. .recalc = &followparent_recalc,
  116. };
  117. static struct clk arm_ck = {
  118. .name = "arm_ck",
  119. .parent = &ck_dpll1,
  120. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  121. RATE_CKCTL | RATE_PROPAGATES | ALWAYS_ENABLED,
  122. .rate_offset = CKCTL_ARMDIV_OFFSET,
  123. .recalc = &ckctl_recalc,
  124. };
  125. static struct clk armper_ck = {
  126. .name = "armper_ck",
  127. .parent = &ck_dpll1,
  128. .flags = CLOCK_IN_OMAP730 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  129. RATE_CKCTL,
  130. .enable_reg = ARM_IDLECT2,
  131. .enable_bit = EN_PERCK,
  132. .rate_offset = CKCTL_PERDIV_OFFSET,
  133. .recalc = &ckctl_recalc,
  134. };
  135. static struct clk arm_gpio_ck = {
  136. .name = "arm_gpio_ck",
  137. .parent = &ck_dpll1,
  138. .flags = CLOCK_IN_OMAP1510,
  139. .enable_reg = ARM_IDLECT2,
  140. .enable_bit = EN_GPIOCK,
  141. .recalc = &followparent_recalc,
  142. };
  143. static struct clk armxor_ck = {
  144. .name = "armxor_ck",
  145. .parent = &ck_ref,
  146. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
  147. .enable_reg = ARM_IDLECT2,
  148. .enable_bit = EN_XORPCK,
  149. .recalc = &followparent_recalc,
  150. };
  151. static struct clk armtim_ck = {
  152. .name = "armtim_ck",
  153. .parent = &ck_ref,
  154. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
  155. .enable_reg = ARM_IDLECT2,
  156. .enable_bit = EN_TIMCK,
  157. .recalc = &followparent_recalc,
  158. };
  159. static struct clk armwdt_ck = {
  160. .name = "armwdt_ck",
  161. .parent = &ck_ref,
  162. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
  163. .enable_reg = ARM_IDLECT2,
  164. .enable_bit = EN_WDTCK,
  165. .recalc = &watchdog_recalc,
  166. };
  167. static struct clk arminth_ck16xx = {
  168. .name = "arminth_ck",
  169. .parent = &arm_ck,
  170. .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
  171. .recalc = &followparent_recalc,
  172. /* Note: On 16xx the frequency can be divided by 2 by programming
  173. * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
  174. *
  175. * 1510 version is in TC clocks.
  176. */
  177. };
  178. static struct clk dsp_ck = {
  179. .name = "dsp_ck",
  180. .parent = &ck_dpll1,
  181. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  182. RATE_CKCTL,
  183. .enable_reg = ARM_CKCTL,
  184. .enable_bit = EN_DSPCK,
  185. .rate_offset = CKCTL_DSPDIV_OFFSET,
  186. .recalc = &ckctl_recalc,
  187. };
  188. static struct clk dspmmu_ck = {
  189. .name = "dspmmu_ck",
  190. .parent = &ck_dpll1,
  191. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  192. RATE_CKCTL | ALWAYS_ENABLED,
  193. .rate_offset = CKCTL_DSPMMUDIV_OFFSET,
  194. .recalc = &ckctl_recalc,
  195. };
  196. static struct clk dspper_ck = {
  197. .name = "dspper_ck",
  198. .parent = &ck_dpll1,
  199. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  200. RATE_CKCTL | DSP_DOMAIN_CLOCK | VIRTUAL_IO_ADDRESS,
  201. .enable_reg = DSP_IDLECT2,
  202. .enable_bit = EN_PERCK,
  203. .rate_offset = CKCTL_PERDIV_OFFSET,
  204. .recalc = &followparent_recalc,
  205. //.recalc = &ckctl_recalc,
  206. };
  207. static struct clk dspxor_ck = {
  208. .name = "dspxor_ck",
  209. .parent = &ck_ref,
  210. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  211. DSP_DOMAIN_CLOCK | VIRTUAL_IO_ADDRESS,
  212. .enable_reg = DSP_IDLECT2,
  213. .enable_bit = EN_XORPCK,
  214. .recalc = &followparent_recalc,
  215. };
  216. static struct clk dsptim_ck = {
  217. .name = "dsptim_ck",
  218. .parent = &ck_ref,
  219. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  220. DSP_DOMAIN_CLOCK | VIRTUAL_IO_ADDRESS,
  221. .enable_reg = DSP_IDLECT2,
  222. .enable_bit = EN_DSPTIMCK,
  223. .recalc = &followparent_recalc,
  224. };
  225. static struct clk tc_ck = {
  226. .name = "tc_ck",
  227. .parent = &ck_dpll1,
  228. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730 |
  229. RATE_CKCTL | RATE_PROPAGATES | ALWAYS_ENABLED,
  230. .rate_offset = CKCTL_TCDIV_OFFSET,
  231. .recalc = &ckctl_recalc,
  232. };
  233. static struct clk arminth_ck1510 = {
  234. .name = "arminth_ck",
  235. .parent = &tc_ck,
  236. .flags = CLOCK_IN_OMAP1510 | ALWAYS_ENABLED,
  237. .recalc = &followparent_recalc,
  238. /* Note: On 1510 the frequency follows TC_CK
  239. *
  240. * 16xx version is in MPU clocks.
  241. */
  242. };
  243. static struct clk tipb_ck = {
  244. .name = "tibp_ck",
  245. .parent = &tc_ck,
  246. .flags = CLOCK_IN_OMAP1510 | ALWAYS_ENABLED,
  247. .recalc = &followparent_recalc,
  248. };
  249. static struct clk l3_ocpi_ck = {
  250. .name = "l3_ocpi_ck",
  251. .parent = &tc_ck,
  252. .flags = CLOCK_IN_OMAP16XX,
  253. .enable_reg = ARM_IDLECT3,
  254. .enable_bit = EN_OCPI_CK,
  255. .recalc = &followparent_recalc,
  256. };
  257. static struct clk tc1_ck = {
  258. .name = "tc1_ck",
  259. .parent = &tc_ck,
  260. .flags = CLOCK_IN_OMAP16XX,
  261. .enable_reg = ARM_IDLECT3,
  262. .enable_bit = EN_TC1_CK,
  263. .recalc = &followparent_recalc,
  264. };
  265. static struct clk tc2_ck = {
  266. .name = "tc2_ck",
  267. .parent = &tc_ck,
  268. .flags = CLOCK_IN_OMAP16XX,
  269. .enable_reg = ARM_IDLECT3,
  270. .enable_bit = EN_TC2_CK,
  271. .recalc = &followparent_recalc,
  272. };
  273. static struct clk dma_ck = {
  274. .name = "dma_ck",
  275. .parent = &tc_ck,
  276. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  277. ALWAYS_ENABLED,
  278. .recalc = &followparent_recalc,
  279. };
  280. static struct clk dma_lcdfree_ck = {
  281. .name = "dma_lcdfree_ck",
  282. .parent = &tc_ck,
  283. .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
  284. .recalc = &followparent_recalc,
  285. };
  286. static struct clk api_ck = {
  287. .name = "api_ck",
  288. .parent = &tc_ck,
  289. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX,
  290. .enable_reg = ARM_IDLECT2,
  291. .enable_bit = EN_APICK,
  292. .recalc = &followparent_recalc,
  293. };
  294. static struct clk lb_ck = {
  295. .name = "lb_ck",
  296. .parent = &tc_ck,
  297. .flags = CLOCK_IN_OMAP1510,
  298. .enable_reg = ARM_IDLECT2,
  299. .enable_bit = EN_LBCK,
  300. .recalc = &followparent_recalc,
  301. };
  302. static struct clk rhea1_ck = {
  303. .name = "rhea1_ck",
  304. .parent = &tc_ck,
  305. .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
  306. .recalc = &followparent_recalc,
  307. };
  308. static struct clk rhea2_ck = {
  309. .name = "rhea2_ck",
  310. .parent = &tc_ck,
  311. .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
  312. .recalc = &followparent_recalc,
  313. };
  314. static struct clk lcd_ck = {
  315. .name = "lcd_ck",
  316. .parent = &ck_dpll1,
  317. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730 |
  318. RATE_CKCTL,
  319. .enable_reg = ARM_IDLECT2,
  320. .enable_bit = EN_LCDCK,
  321. .rate_offset = CKCTL_LCDDIV_OFFSET,
  322. .recalc = &ckctl_recalc,
  323. };
  324. static struct clk uart1_1510 = {
  325. .name = "uart1_ck",
  326. /* Direct from ULPD, no parent */
  327. .rate = 12000000,
  328. .flags = CLOCK_IN_OMAP1510 | ENABLE_REG_32BIT | ALWAYS_ENABLED,
  329. .enable_reg = MOD_CONF_CTRL_0,
  330. .enable_bit = 29, /* Chooses between 12MHz and 48MHz */
  331. .set_rate = &set_uart_rate,
  332. .recalc = &uart_recalc,
  333. };
  334. static struct clk uart1_16xx = {
  335. .name = "uart1_ck",
  336. /* Direct from ULPD, no parent */
  337. .rate = 48000000,
  338. .flags = CLOCK_IN_OMAP16XX | RATE_FIXED | ENABLE_REG_32BIT,
  339. .enable_reg = MOD_CONF_CTRL_0,
  340. .enable_bit = 29,
  341. };
  342. static struct clk uart2_ck = {
  343. .name = "uart2_ck",
  344. /* Direct from ULPD, no parent */
  345. .rate = 12000000,
  346. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | ENABLE_REG_32BIT,
  347. .enable_reg = MOD_CONF_CTRL_0,
  348. .enable_bit = 30, /* Chooses between 12MHz and 48MHz */
  349. .set_rate = &set_uart_rate,
  350. .recalc = &uart_recalc,
  351. };
  352. static struct clk uart3_1510 = {
  353. .name = "uart3_ck",
  354. /* Direct from ULPD, no parent */
  355. .rate = 12000000,
  356. .flags = CLOCK_IN_OMAP1510 | ENABLE_REG_32BIT | ALWAYS_ENABLED,
  357. .enable_reg = MOD_CONF_CTRL_0,
  358. .enable_bit = 31, /* Chooses between 12MHz and 48MHz */
  359. .set_rate = &set_uart_rate,
  360. .recalc = &uart_recalc,
  361. };
  362. static struct clk uart3_16xx = {
  363. .name = "uart3_ck",
  364. /* Direct from ULPD, no parent */
  365. .rate = 48000000,
  366. .flags = CLOCK_IN_OMAP16XX | RATE_FIXED | ENABLE_REG_32BIT,
  367. .enable_reg = MOD_CONF_CTRL_0,
  368. .enable_bit = 31,
  369. };
  370. static struct clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */
  371. .name = "usb_clko",
  372. /* Direct from ULPD, no parent */
  373. .rate = 6000000,
  374. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  375. RATE_FIXED | ENABLE_REG_32BIT,
  376. .enable_reg = ULPD_CLOCK_CTRL,
  377. .enable_bit = USB_MCLK_EN_BIT,
  378. };
  379. static struct clk usb_hhc_ck1510 = {
  380. .name = "usb_hhc_ck",
  381. /* Direct from ULPD, no parent */
  382. .rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */
  383. .flags = CLOCK_IN_OMAP1510 |
  384. RATE_FIXED | ENABLE_REG_32BIT,
  385. .enable_reg = MOD_CONF_CTRL_0,
  386. .enable_bit = USB_HOST_HHC_UHOST_EN,
  387. };
  388. static struct clk usb_hhc_ck16xx = {
  389. .name = "usb_hhc_ck",
  390. /* Direct from ULPD, no parent */
  391. .rate = 48000000,
  392. /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */
  393. .flags = CLOCK_IN_OMAP16XX |
  394. RATE_FIXED | ENABLE_REG_32BIT,
  395. .enable_reg = OTG_BASE + 0x08 /* OTG_SYSCON_2 */,
  396. .enable_bit = 8 /* UHOST_EN */,
  397. };
  398. static struct clk mclk_1510 = {
  399. .name = "mclk",
  400. /* Direct from ULPD, no parent. May be enabled by ext hardware. */
  401. .rate = 12000000,
  402. .flags = CLOCK_IN_OMAP1510 | RATE_FIXED,
  403. };
  404. static struct clk mclk_16xx = {
  405. .name = "mclk",
  406. /* Direct from ULPD, no parent. May be enabled by ext hardware. */
  407. .flags = CLOCK_IN_OMAP16XX,
  408. .enable_reg = COM_CLK_DIV_CTRL_SEL,
  409. .enable_bit = COM_ULPD_PLL_CLK_REQ,
  410. .set_rate = &set_ext_clk_rate,
  411. .round_rate = &round_ext_clk_rate,
  412. .init = &init_ext_clk,
  413. };
  414. static struct clk bclk_1510 = {
  415. .name = "bclk",
  416. /* Direct from ULPD, no parent. May be enabled by ext hardware. */
  417. .rate = 12000000,
  418. .flags = CLOCK_IN_OMAP1510 | RATE_FIXED,
  419. };
  420. static struct clk bclk_16xx = {
  421. .name = "bclk",
  422. /* Direct from ULPD, no parent. May be enabled by ext hardware. */
  423. .flags = CLOCK_IN_OMAP16XX,
  424. .enable_reg = SWD_CLK_DIV_CTRL_SEL,
  425. .enable_bit = SWD_ULPD_PLL_CLK_REQ,
  426. .set_rate = &set_ext_clk_rate,
  427. .round_rate = &round_ext_clk_rate,
  428. .init = &init_ext_clk,
  429. };
  430. static struct clk mmc1_ck = {
  431. .name = "mmc1_ck",
  432. /* Functional clock is direct from ULPD, interface clock is ARMPER */
  433. .parent = &armper_ck,
  434. .rate = 48000000,
  435. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  436. RATE_FIXED | ENABLE_REG_32BIT,
  437. .enable_reg = MOD_CONF_CTRL_0,
  438. .enable_bit = 23,
  439. };
  440. static struct clk mmc2_ck = {
  441. .name = "mmc2_ck",
  442. /* Functional clock is direct from ULPD, interface clock is ARMPER */
  443. .parent = &armper_ck,
  444. .rate = 48000000,
  445. .flags = CLOCK_IN_OMAP16XX |
  446. RATE_FIXED | ENABLE_REG_32BIT,
  447. .enable_reg = MOD_CONF_CTRL_0,
  448. .enable_bit = 20,
  449. };
  450. static struct clk virtual_ck_mpu = {
  451. .name = "mpu",
  452. .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
  453. VIRTUAL_CLOCK | ALWAYS_ENABLED,
  454. .parent = &arm_ck, /* Is smarter alias for */
  455. .recalc = &followparent_recalc,
  456. .set_rate = &select_table_rate,
  457. .round_rate = &round_to_table_rate,
  458. };
  459. static struct clk * onchip_clks[] = {
  460. /* non-ULPD clocks */
  461. &ck_ref,
  462. &ck_dpll1,
  463. /* CK_GEN1 clocks */
  464. &ck_dpll1out,
  465. &arm_ck,
  466. &armper_ck,
  467. &arm_gpio_ck,
  468. &armxor_ck,
  469. &armtim_ck,
  470. &armwdt_ck,
  471. &arminth_ck1510, &arminth_ck16xx,
  472. /* CK_GEN2 clocks */
  473. &dsp_ck,
  474. &dspmmu_ck,
  475. &dspper_ck,
  476. &dspxor_ck,
  477. &dsptim_ck,
  478. /* CK_GEN3 clocks */
  479. &tc_ck,
  480. &tipb_ck,
  481. &l3_ocpi_ck,
  482. &tc1_ck,
  483. &tc2_ck,
  484. &dma_ck,
  485. &dma_lcdfree_ck,
  486. &api_ck,
  487. &lb_ck,
  488. &rhea1_ck,
  489. &rhea2_ck,
  490. &lcd_ck,
  491. /* ULPD clocks */
  492. &uart1_1510,
  493. &uart1_16xx,
  494. &uart2_ck,
  495. &uart3_1510,
  496. &uart3_16xx,
  497. &usb_clko,
  498. &usb_hhc_ck1510, &usb_hhc_ck16xx,
  499. &mclk_1510, &mclk_16xx,
  500. &bclk_1510, &bclk_16xx,
  501. &mmc1_ck,
  502. &mmc2_ck,
  503. /* Virtual clocks */
  504. &virtual_ck_mpu,
  505. };
  506. struct clk *clk_get(struct device *dev, const char *id)
  507. {
  508. struct clk *p, *clk = ERR_PTR(-ENOENT);
  509. down(&clocks_sem);
  510. list_for_each_entry(p, &clocks, node) {
  511. if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
  512. clk = p;
  513. break;
  514. }
  515. }
  516. up(&clocks_sem);
  517. return clk;
  518. }
  519. EXPORT_SYMBOL(clk_get);
  520. void clk_put(struct clk *clk)
  521. {
  522. if (clk && !IS_ERR(clk))
  523. module_put(clk->owner);
  524. }
  525. EXPORT_SYMBOL(clk_put);
  526. int __clk_enable(struct clk *clk)
  527. {
  528. __u16 regval16;
  529. __u32 regval32;
  530. if (clk->flags & ALWAYS_ENABLED)
  531. return 0;
  532. if (unlikely(clk->enable_reg == 0)) {
  533. printk(KERN_ERR "clock.c: Enable for %s without enable code\n",
  534. clk->name);
  535. return 0;
  536. }
  537. if (clk->flags & DSP_DOMAIN_CLOCK) {
  538. __clk_use(&api_ck);
  539. }
  540. if (clk->flags & ENABLE_REG_32BIT) {
  541. if (clk->flags & VIRTUAL_IO_ADDRESS) {
  542. regval32 = __raw_readl(clk->enable_reg);
  543. regval32 |= (1 << clk->enable_bit);
  544. __raw_writel(regval32, clk->enable_reg);
  545. } else {
  546. regval32 = omap_readl(clk->enable_reg);
  547. regval32 |= (1 << clk->enable_bit);
  548. omap_writel(regval32, clk->enable_reg);
  549. }
  550. } else {
  551. if (clk->flags & VIRTUAL_IO_ADDRESS) {
  552. regval16 = __raw_readw(clk->enable_reg);
  553. regval16 |= (1 << clk->enable_bit);
  554. __raw_writew(regval16, clk->enable_reg);
  555. } else {
  556. regval16 = omap_readw(clk->enable_reg);
  557. regval16 |= (1 << clk->enable_bit);
  558. omap_writew(regval16, clk->enable_reg);
  559. }
  560. }
  561. if (clk->flags & DSP_DOMAIN_CLOCK) {
  562. __clk_unuse(&api_ck);
  563. }
  564. return 0;
  565. }
  566. void __clk_disable(struct clk *clk)
  567. {
  568. __u16 regval16;
  569. __u32 regval32;
  570. if (clk->enable_reg == 0)
  571. return;
  572. if (clk->flags & DSP_DOMAIN_CLOCK) {
  573. __clk_use(&api_ck);
  574. }
  575. if (clk->flags & ENABLE_REG_32BIT) {
  576. if (clk->flags & VIRTUAL_IO_ADDRESS) {
  577. regval32 = __raw_readl(clk->enable_reg);
  578. regval32 &= ~(1 << clk->enable_bit);
  579. __raw_writel(regval32, clk->enable_reg);
  580. } else {
  581. regval32 = omap_readl(clk->enable_reg);
  582. regval32 &= ~(1 << clk->enable_bit);
  583. omap_writel(regval32, clk->enable_reg);
  584. }
  585. } else {
  586. if (clk->flags & VIRTUAL_IO_ADDRESS) {
  587. regval16 = __raw_readw(clk->enable_reg);
  588. regval16 &= ~(1 << clk->enable_bit);
  589. __raw_writew(regval16, clk->enable_reg);
  590. } else {
  591. regval16 = omap_readw(clk->enable_reg);
  592. regval16 &= ~(1 << clk->enable_bit);
  593. omap_writew(regval16, clk->enable_reg);
  594. }
  595. }
  596. if (clk->flags & DSP_DOMAIN_CLOCK) {
  597. __clk_unuse(&api_ck);
  598. }
  599. }
  600. void __clk_unuse(struct clk *clk)
  601. {
  602. if (clk->usecount > 0 && !(--clk->usecount)) {
  603. __clk_disable(clk);
  604. if (likely(clk->parent))
  605. __clk_unuse(clk->parent);
  606. }
  607. }
  608. int __clk_use(struct clk *clk)
  609. {
  610. int ret = 0;
  611. if (clk->usecount++ == 0) {
  612. if (likely(clk->parent))
  613. ret = __clk_use(clk->parent);
  614. if (unlikely(ret != 0)) {
  615. clk->usecount--;
  616. return ret;
  617. }
  618. ret = __clk_enable(clk);
  619. if (unlikely(ret != 0) && clk->parent) {
  620. __clk_unuse(clk->parent);
  621. clk->usecount--;
  622. }
  623. }
  624. return ret;
  625. }
  626. int clk_enable(struct clk *clk)
  627. {
  628. unsigned long flags;
  629. int ret;
  630. spin_lock_irqsave(&clockfw_lock, flags);
  631. ret = __clk_enable(clk);
  632. spin_unlock_irqrestore(&clockfw_lock, flags);
  633. return ret;
  634. }
  635. EXPORT_SYMBOL(clk_enable);
  636. void clk_disable(struct clk *clk)
  637. {
  638. unsigned long flags;
  639. spin_lock_irqsave(&clockfw_lock, flags);
  640. __clk_disable(clk);
  641. spin_unlock_irqrestore(&clockfw_lock, flags);
  642. }
  643. EXPORT_SYMBOL(clk_disable);
  644. int clk_use(struct clk *clk)
  645. {
  646. unsigned long flags;
  647. int ret = 0;
  648. spin_lock_irqsave(&clockfw_lock, flags);
  649. ret = __clk_use(clk);
  650. spin_unlock_irqrestore(&clockfw_lock, flags);
  651. return ret;
  652. }
  653. EXPORT_SYMBOL(clk_use);
  654. void clk_unuse(struct clk *clk)
  655. {
  656. unsigned long flags;
  657. spin_lock_irqsave(&clockfw_lock, flags);
  658. __clk_unuse(clk);
  659. spin_unlock_irqrestore(&clockfw_lock, flags);
  660. }
  661. EXPORT_SYMBOL(clk_unuse);
  662. int clk_get_usecount(struct clk *clk)
  663. {
  664. return clk->usecount;
  665. }
  666. EXPORT_SYMBOL(clk_get_usecount);
  667. unsigned long clk_get_rate(struct clk *clk)
  668. {
  669. return clk->rate;
  670. }
  671. EXPORT_SYMBOL(clk_get_rate);
  672. static __u16 verify_ckctl_value(__u16 newval)
  673. {
  674. /* This function checks for following limitations set
  675. * by the hardware (all conditions must be true):
  676. * DSPMMU_CK == DSP_CK or DSPMMU_CK == DSP_CK/2
  677. * ARM_CK >= TC_CK
  678. * DSP_CK >= TC_CK
  679. * DSPMMU_CK >= TC_CK
  680. *
  681. * In addition following rules are enforced:
  682. * LCD_CK <= TC_CK
  683. * ARMPER_CK <= TC_CK
  684. *
  685. * However, maximum frequencies are not checked for!
  686. */
  687. __u8 per_exp;
  688. __u8 lcd_exp;
  689. __u8 arm_exp;
  690. __u8 dsp_exp;
  691. __u8 tc_exp;
  692. __u8 dspmmu_exp;
  693. per_exp = (newval >> CKCTL_PERDIV_OFFSET) & 3;
  694. lcd_exp = (newval >> CKCTL_LCDDIV_OFFSET) & 3;
  695. arm_exp = (newval >> CKCTL_ARMDIV_OFFSET) & 3;
  696. dsp_exp = (newval >> CKCTL_DSPDIV_OFFSET) & 3;
  697. tc_exp = (newval >> CKCTL_TCDIV_OFFSET) & 3;
  698. dspmmu_exp = (newval >> CKCTL_DSPMMUDIV_OFFSET) & 3;
  699. if (dspmmu_exp < dsp_exp)
  700. dspmmu_exp = dsp_exp;
  701. if (dspmmu_exp > dsp_exp+1)
  702. dspmmu_exp = dsp_exp+1;
  703. if (tc_exp < arm_exp)
  704. tc_exp = arm_exp;
  705. if (tc_exp < dspmmu_exp)
  706. tc_exp = dspmmu_exp;
  707. if (tc_exp > lcd_exp)
  708. lcd_exp = tc_exp;
  709. if (tc_exp > per_exp)
  710. per_exp = tc_exp;
  711. newval &= 0xf000;
  712. newval |= per_exp << CKCTL_PERDIV_OFFSET;
  713. newval |= lcd_exp << CKCTL_LCDDIV_OFFSET;
  714. newval |= arm_exp << CKCTL_ARMDIV_OFFSET;
  715. newval |= dsp_exp << CKCTL_DSPDIV_OFFSET;
  716. newval |= tc_exp << CKCTL_TCDIV_OFFSET;
  717. newval |= dspmmu_exp << CKCTL_DSPMMUDIV_OFFSET;
  718. return newval;
  719. }
  720. static int calc_dsor_exp(struct clk *clk, unsigned long rate)
  721. {
  722. /* Note: If target frequency is too low, this function will return 4,
  723. * which is invalid value. Caller must check for this value and act
  724. * accordingly.
  725. *
  726. * Note: This function does not check for following limitations set
  727. * by the hardware (all conditions must be true):
  728. * DSPMMU_CK == DSP_CK or DSPMMU_CK == DSP_CK/2
  729. * ARM_CK >= TC_CK
  730. * DSP_CK >= TC_CK
  731. * DSPMMU_CK >= TC_CK
  732. */
  733. unsigned long realrate;
  734. struct clk * parent;
  735. unsigned dsor_exp;
  736. if (unlikely(!(clk->flags & RATE_CKCTL)))
  737. return -EINVAL;
  738. parent = clk->parent;
  739. if (unlikely(parent == 0))
  740. return -EIO;
  741. realrate = parent->rate;
  742. for (dsor_exp=0; dsor_exp<4; dsor_exp++) {
  743. if (realrate <= rate)
  744. break;
  745. realrate /= 2;
  746. }
  747. return dsor_exp;
  748. }
  749. static void ckctl_recalc(struct clk * clk)
  750. {
  751. int dsor;
  752. /* Calculate divisor encoded as 2-bit exponent */
  753. if (clk->flags & DSP_DOMAIN_CLOCK) {
  754. /* The clock control bits are in DSP domain,
  755. * so api_ck is needed for access.
  756. * Note that DSP_CKCTL virt addr = phys addr, so
  757. * we must use __raw_readw() instead of omap_readw().
  758. */
  759. __clk_use(&api_ck);
  760. dsor = 1 << (3 & (__raw_readw(DSP_CKCTL) >> clk->rate_offset));
  761. __clk_unuse(&api_ck);
  762. } else {
  763. dsor = 1 << (3 & (omap_readw(ARM_CKCTL) >> clk->rate_offset));
  764. }
  765. if (unlikely(clk->rate == clk->parent->rate / dsor))
  766. return; /* No change, quick exit */
  767. clk->rate = clk->parent->rate / dsor;
  768. if (unlikely(clk->flags & RATE_PROPAGATES))
  769. propagate_rate(clk);
  770. }
  771. long clk_round_rate(struct clk *clk, unsigned long rate)
  772. {
  773. int dsor_exp;
  774. if (clk->flags & RATE_FIXED)
  775. return clk->rate;
  776. if (clk->flags & RATE_CKCTL) {
  777. dsor_exp = calc_dsor_exp(clk, rate);
  778. if (dsor_exp < 0)
  779. return dsor_exp;
  780. if (dsor_exp > 3)
  781. dsor_exp = 3;
  782. return clk->parent->rate / (1 << dsor_exp);
  783. }
  784. if(clk->round_rate != 0)
  785. return clk->round_rate(clk, rate);
  786. return clk->rate;
  787. }
  788. EXPORT_SYMBOL(clk_round_rate);
  789. static void propagate_rate(struct clk * clk)
  790. {
  791. struct clk ** clkp;
  792. for (clkp = onchip_clks; clkp < onchip_clks+ARRAY_SIZE(onchip_clks); clkp++) {
  793. if (likely((*clkp)->parent != clk)) continue;
  794. if (likely((*clkp)->recalc))
  795. (*clkp)->recalc(*clkp);
  796. }
  797. }
  798. static int select_table_rate(struct clk * clk, unsigned long rate)
  799. {
  800. /* Find the highest supported frequency <= rate and switch to it */
  801. struct mpu_rate * ptr;
  802. if (clk != &virtual_ck_mpu)
  803. return -EINVAL;
  804. for (ptr = rate_table; ptr->rate; ptr++) {
  805. if (ptr->xtal != ck_ref.rate)
  806. continue;
  807. /* DPLL1 cannot be reprogrammed without risking system crash */
  808. if (likely(ck_dpll1.rate!=0) && ptr->pll_rate != ck_dpll1.rate)
  809. continue;
  810. /* Can check only after xtal frequency check */
  811. if (ptr->rate <= rate)
  812. break;
  813. }
  814. if (!ptr->rate)
  815. return -EINVAL;
  816. if (!ptr->rate)
  817. return -EINVAL;
  818. if (unlikely(ck_dpll1.rate == 0)) {
  819. omap_writew(ptr->dpllctl_val, DPLL_CTL);
  820. ck_dpll1.rate = ptr->pll_rate;
  821. }
  822. omap_writew(ptr->ckctl_val, ARM_CKCTL);
  823. propagate_rate(&ck_dpll1);
  824. return 0;
  825. }
  826. static long round_to_table_rate(struct clk * clk, unsigned long rate)
  827. {
  828. /* Find the highest supported frequency <= rate */
  829. struct mpu_rate * ptr;
  830. long highest_rate;
  831. if (clk != &virtual_ck_mpu)
  832. return -EINVAL;
  833. highest_rate = -EINVAL;
  834. for (ptr = rate_table; ptr->rate; ptr++) {
  835. if (ptr->xtal != ck_ref.rate)
  836. continue;
  837. highest_rate = ptr->rate;
  838. /* Can check only after xtal frequency check */
  839. if (ptr->rate <= rate)
  840. break;
  841. }
  842. return highest_rate;
  843. }
  844. int clk_set_rate(struct clk *clk, unsigned long rate)
  845. {
  846. int ret = -EINVAL;
  847. int dsor_exp;
  848. __u16 regval;
  849. unsigned long flags;
  850. if (clk->flags & RATE_CKCTL) {
  851. dsor_exp = calc_dsor_exp(clk, rate);
  852. if (dsor_exp > 3)
  853. dsor_exp = -EINVAL;
  854. if (dsor_exp < 0)
  855. return dsor_exp;
  856. spin_lock_irqsave(&clockfw_lock, flags);
  857. regval = omap_readw(ARM_CKCTL);
  858. regval &= ~(3 << clk->rate_offset);
  859. regval |= dsor_exp << clk->rate_offset;
  860. regval = verify_ckctl_value(regval);
  861. omap_writew(regval, ARM_CKCTL);
  862. clk->rate = clk->parent->rate / (1 << dsor_exp);
  863. spin_unlock_irqrestore(&clockfw_lock, flags);
  864. ret = 0;
  865. } else if(clk->set_rate != 0) {
  866. spin_lock_irqsave(&clockfw_lock, flags);
  867. ret = clk->set_rate(clk, rate);
  868. spin_unlock_irqrestore(&clockfw_lock, flags);
  869. }
  870. if (unlikely(ret == 0 && (clk->flags & RATE_PROPAGATES)))
  871. propagate_rate(clk);
  872. return ret;
  873. }
  874. EXPORT_SYMBOL(clk_set_rate);
  875. static unsigned calc_ext_dsor(unsigned long rate)
  876. {
  877. unsigned dsor;
  878. /* MCLK and BCLK divisor selection is not linear:
  879. * freq = 96MHz / dsor
  880. *
  881. * RATIO_SEL range: dsor <-> RATIO_SEL
  882. * 0..6: (RATIO_SEL+2) <-> (dsor-2)
  883. * 6..48: (8+(RATIO_SEL-6)*2) <-> ((dsor-8)/2+6)
  884. * Minimum dsor is 2 and maximum is 96. Odd divisors starting from 9
  885. * can not be used.
  886. */
  887. for (dsor = 2; dsor < 96; ++dsor) {
  888. if ((dsor & 1) && dsor > 8)
  889. continue;
  890. if (rate >= 96000000 / dsor)
  891. break;
  892. }
  893. return dsor;
  894. }
  895. /* Only needed on 1510 */
  896. static int set_uart_rate(struct clk * clk, unsigned long rate)
  897. {
  898. unsigned int val;
  899. val = omap_readl(clk->enable_reg);
  900. if (rate == 12000000)
  901. val &= ~(1 << clk->enable_bit);
  902. else if (rate == 48000000)
  903. val |= (1 << clk->enable_bit);
  904. else
  905. return -EINVAL;
  906. omap_writel(val, clk->enable_reg);
  907. clk->rate = rate;
  908. return 0;
  909. }
  910. static int set_ext_clk_rate(struct clk * clk, unsigned long rate)
  911. {
  912. unsigned dsor;
  913. __u16 ratio_bits;
  914. dsor = calc_ext_dsor(rate);
  915. clk->rate = 96000000 / dsor;
  916. if (dsor > 8)
  917. ratio_bits = ((dsor - 8) / 2 + 6) << 2;
  918. else
  919. ratio_bits = (dsor - 2) << 2;
  920. ratio_bits |= omap_readw(clk->enable_reg) & ~0xfd;
  921. omap_writew(ratio_bits, clk->enable_reg);
  922. return 0;
  923. }
  924. static long round_ext_clk_rate(struct clk * clk, unsigned long rate)
  925. {
  926. return 96000000 / calc_ext_dsor(rate);
  927. }
  928. static void init_ext_clk(struct clk * clk)
  929. {
  930. unsigned dsor;
  931. __u16 ratio_bits;
  932. /* Determine current rate and ensure clock is based on 96MHz APLL */
  933. ratio_bits = omap_readw(clk->enable_reg) & ~1;
  934. omap_writew(ratio_bits, clk->enable_reg);
  935. ratio_bits = (ratio_bits & 0xfc) >> 2;
  936. if (ratio_bits > 6)
  937. dsor = (ratio_bits - 6) * 2 + 8;
  938. else
  939. dsor = ratio_bits + 2;
  940. clk-> rate = 96000000 / dsor;
  941. }
  942. int clk_register(struct clk *clk)
  943. {
  944. down(&clocks_sem);
  945. list_add(&clk->node, &clocks);
  946. if (clk->init)
  947. clk->init(clk);
  948. up(&clocks_sem);
  949. return 0;
  950. }
  951. EXPORT_SYMBOL(clk_register);
  952. void clk_unregister(struct clk *clk)
  953. {
  954. down(&clocks_sem);
  955. list_del(&clk->node);
  956. up(&clocks_sem);
  957. }
  958. EXPORT_SYMBOL(clk_unregister);
  959. #ifdef CONFIG_OMAP_RESET_CLOCKS
  960. /*
  961. * Resets some clocks that may be left on from bootloader,
  962. * but leaves serial clocks on. See also omap_late_clk_reset().
  963. */
  964. static inline void omap_early_clk_reset(void)
  965. {
  966. //omap_writel(0x3 << 29, MOD_CONF_CTRL_0);
  967. }
  968. #else
  969. #define omap_early_clk_reset() {}
  970. #endif
  971. int __init clk_init(void)
  972. {
  973. struct clk ** clkp;
  974. const struct omap_clock_config *info;
  975. int crystal_type = 0; /* Default 12 MHz */
  976. omap_early_clk_reset();
  977. for (clkp = onchip_clks; clkp < onchip_clks+ARRAY_SIZE(onchip_clks); clkp++) {
  978. if (((*clkp)->flags &CLOCK_IN_OMAP1510) && cpu_is_omap1510()) {
  979. clk_register(*clkp);
  980. continue;
  981. }
  982. if (((*clkp)->flags &CLOCK_IN_OMAP16XX) && cpu_is_omap16xx()) {
  983. clk_register(*clkp);
  984. continue;
  985. }
  986. if (((*clkp)->flags &CLOCK_IN_OMAP730) && cpu_is_omap730()) {
  987. clk_register(*clkp);
  988. continue;
  989. }
  990. }
  991. info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config);
  992. if (info != NULL) {
  993. if (!cpu_is_omap1510())
  994. crystal_type = info->system_clock_type;
  995. }
  996. #if defined(CONFIG_ARCH_OMAP730)
  997. ck_ref.rate = 13000000;
  998. #elif defined(CONFIG_ARCH_OMAP16XX)
  999. if (crystal_type == 2)
  1000. ck_ref.rate = 19200000;
  1001. #endif
  1002. printk("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: 0x%04x\n",
  1003. omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
  1004. omap_readw(ARM_CKCTL));
  1005. /* We want to be in syncronous scalable mode */
  1006. omap_writew(0x1000, ARM_SYSST);
  1007. #ifdef CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER
  1008. /* Use values set by bootloader. Determine PLL rate and recalculate
  1009. * dependent clocks as if kernel had changed PLL or divisors.
  1010. */
  1011. {
  1012. unsigned pll_ctl_val = omap_readw(DPLL_CTL);
  1013. ck_dpll1.rate = ck_ref.rate; /* Base xtal rate */
  1014. if (pll_ctl_val & 0x10) {
  1015. /* PLL enabled, apply multiplier and divisor */
  1016. if (pll_ctl_val & 0xf80)
  1017. ck_dpll1.rate *= (pll_ctl_val & 0xf80) >> 7;
  1018. ck_dpll1.rate /= ((pll_ctl_val & 0x60) >> 5) + 1;
  1019. } else {
  1020. /* PLL disabled, apply bypass divisor */
  1021. switch (pll_ctl_val & 0xc) {
  1022. case 0:
  1023. break;
  1024. case 0x4:
  1025. ck_dpll1.rate /= 2;
  1026. break;
  1027. default:
  1028. ck_dpll1.rate /= 4;
  1029. break;
  1030. }
  1031. }
  1032. }
  1033. propagate_rate(&ck_dpll1);
  1034. #else
  1035. /* Find the highest supported frequency and enable it */
  1036. if (select_table_rate(&virtual_ck_mpu, ~0)) {
  1037. printk(KERN_ERR "System frequencies not set. Check your config.\n");
  1038. /* Guess sane values (60MHz) */
  1039. omap_writew(0x2290, DPLL_CTL);
  1040. omap_writew(0x1005, ARM_CKCTL);
  1041. ck_dpll1.rate = 60000000;
  1042. propagate_rate(&ck_dpll1);
  1043. }
  1044. #endif
  1045. /* Cache rates for clocks connected to ck_ref (not dpll1) */
  1046. propagate_rate(&ck_ref);
  1047. printk(KERN_INFO "Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld/%ld MHz\n",
  1048. ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
  1049. ck_dpll1.rate, arm_ck.rate);
  1050. #ifdef CONFIG_MACH_OMAP_PERSEUS2
  1051. /* Select slicer output as OMAP input clock */
  1052. omap_writew(omap_readw(OMAP730_PCC_UPLD_CTRL) & ~0x1, OMAP730_PCC_UPLD_CTRL);
  1053. #endif
  1054. /* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */
  1055. omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL);
  1056. /* Put DSP/MPUI into reset until needed */
  1057. omap_writew(0, ARM_RSTCT1);
  1058. omap_writew(1, ARM_RSTCT2);
  1059. omap_writew(0x400, ARM_IDLECT1);
  1060. /*
  1061. * According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8)
  1062. * of the ARM_IDLECT2 register must be set to zero. The power-on
  1063. * default value of this bit is one.
  1064. */
  1065. omap_writew(0x0000, ARM_IDLECT2); /* Turn LCD clock off also */
  1066. /*
  1067. * Only enable those clocks we will need, let the drivers
  1068. * enable other clocks as necessary
  1069. */
  1070. clk_use(&armper_ck);
  1071. clk_use(&armxor_ck);
  1072. clk_use(&armtim_ck);
  1073. if (cpu_is_omap1510())
  1074. clk_enable(&arm_gpio_ck);
  1075. return 0;
  1076. }
  1077. #ifdef CONFIG_OMAP_RESET_CLOCKS
  1078. static int __init omap_late_clk_reset(void)
  1079. {
  1080. /* Turn off all unused clocks */
  1081. struct clk *p;
  1082. __u32 regval32;
  1083. omap_writew(0, SOFT_REQ_REG);
  1084. omap_writew(0, SOFT_REQ_REG2);
  1085. list_for_each_entry(p, &clocks, node) {
  1086. if (p->usecount > 0 || (p->flags & ALWAYS_ENABLED) ||
  1087. p->enable_reg == 0)
  1088. continue;
  1089. /* Assume no DSP clocks have been activated by bootloader */
  1090. if (p->flags & DSP_DOMAIN_CLOCK)
  1091. continue;
  1092. /* Is the clock already disabled? */
  1093. if (p->flags & ENABLE_REG_32BIT) {
  1094. if (p->flags & VIRTUAL_IO_ADDRESS)
  1095. regval32 = __raw_readl(p->enable_reg);
  1096. else
  1097. regval32 = omap_readl(p->enable_reg);
  1098. } else {
  1099. if (p->flags & VIRTUAL_IO_ADDRESS)
  1100. regval32 = __raw_readw(p->enable_reg);
  1101. else
  1102. regval32 = omap_readw(p->enable_reg);
  1103. }
  1104. if ((regval32 & (1 << p->enable_bit)) == 0)
  1105. continue;
  1106. /* FIXME: This clock seems to be necessary but no-one
  1107. * has asked for its activation. */
  1108. if (p == &tc2_ck // FIX: pm.c (SRAM), CCP, Camera
  1109. || p == &ck_dpll1out // FIX: SoSSI, SSR
  1110. || p == &arm_gpio_ck // FIX: GPIO code for 1510
  1111. ) {
  1112. printk(KERN_INFO "FIXME: Clock \"%s\" seems unused\n",
  1113. p->name);
  1114. continue;
  1115. }
  1116. printk(KERN_INFO "Disabling unused clock \"%s\"... ", p->name);
  1117. __clk_disable(p);
  1118. printk(" done\n");
  1119. }
  1120. return 0;
  1121. }
  1122. late_initcall(omap_late_clk_reset);
  1123. #endif