clock.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. //kernel/linux-omap-fsample/arch/arm/mach-omap1/clock.c#2 - edit change 3808 (text)
  2. /*
  3. * linux/arch/arm/mach-omap1/clock.c
  4. *
  5. * Copyright (C) 2004 - 2005 Nokia corporation
  6. * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
  7. *
  8. * Modified to use omap shared clock framework by
  9. * Tony Lindgren <tony@atomide.com>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License version 2 as
  13. * published by the Free Software Foundation.
  14. */
  15. #include <linux/module.h>
  16. #include <linux/kernel.h>
  17. #include <linux/list.h>
  18. #include <linux/errno.h>
  19. #include <linux/err.h>
  20. #include <linux/clk.h>
  21. #include <asm/io.h>
  22. #include <asm/mach-types.h>
  23. #include <asm/arch/cpu.h>
  24. #include <asm/arch/usb.h>
  25. #include <asm/arch/clock.h>
  26. #include <asm/arch/sram.h>
  27. #include "clock.h"
  28. __u32 arm_idlect1_mask;
  29. /*-------------------------------------------------------------------------
  30. * Omap1 specific clock functions
  31. *-------------------------------------------------------------------------*/
  32. static void omap1_watchdog_recalc(struct clk * clk)
  33. {
  34. clk->rate = clk->parent->rate / 14;
  35. }
  36. static void omap1_uart_recalc(struct clk * clk)
  37. {
  38. unsigned int val = omap_readl(clk->enable_reg);
  39. if (val & clk->enable_bit)
  40. clk->rate = 48000000;
  41. else
  42. clk->rate = 12000000;
  43. }
  44. static void omap1_sossi_recalc(struct clk *clk)
  45. {
  46. u32 div = omap_readl(MOD_CONF_CTRL_1);
  47. div = (div >> 17) & 0x7;
  48. div++;
  49. clk->rate = clk->parent->rate / div;
  50. }
  51. static int omap1_clk_enable_dsp_domain(struct clk *clk)
  52. {
  53. int retval;
  54. retval = omap1_clk_enable(&api_ck.clk);
  55. if (!retval) {
  56. retval = omap1_clk_enable_generic(clk);
  57. omap1_clk_disable(&api_ck.clk);
  58. }
  59. return retval;
  60. }
  61. static void omap1_clk_disable_dsp_domain(struct clk *clk)
  62. {
  63. if (omap1_clk_enable(&api_ck.clk) == 0) {
  64. omap1_clk_disable_generic(clk);
  65. omap1_clk_disable(&api_ck.clk);
  66. }
  67. }
  68. static int omap1_clk_enable_uart_functional(struct clk *clk)
  69. {
  70. int ret;
  71. struct uart_clk *uclk;
  72. ret = omap1_clk_enable_generic(clk);
  73. if (ret == 0) {
  74. /* Set smart idle acknowledgement mode */
  75. uclk = (struct uart_clk *)clk;
  76. omap_writeb((omap_readb(uclk->sysc_addr) & ~0x10) | 8,
  77. uclk->sysc_addr);
  78. }
  79. return ret;
  80. }
  81. static void omap1_clk_disable_uart_functional(struct clk *clk)
  82. {
  83. struct uart_clk *uclk;
  84. /* Set force idle acknowledgement mode */
  85. uclk = (struct uart_clk *)clk;
  86. omap_writeb((omap_readb(uclk->sysc_addr) & ~0x18), uclk->sysc_addr);
  87. omap1_clk_disable_generic(clk);
  88. }
  89. static void omap1_clk_allow_idle(struct clk *clk)
  90. {
  91. struct arm_idlect1_clk * iclk = (struct arm_idlect1_clk *)clk;
  92. if (!(clk->flags & CLOCK_IDLE_CONTROL))
  93. return;
  94. if (iclk->no_idle_count > 0 && !(--iclk->no_idle_count))
  95. arm_idlect1_mask |= 1 << iclk->idlect_shift;
  96. }
  97. static void omap1_clk_deny_idle(struct clk *clk)
  98. {
  99. struct arm_idlect1_clk * iclk = (struct arm_idlect1_clk *)clk;
  100. if (!(clk->flags & CLOCK_IDLE_CONTROL))
  101. return;
  102. if (iclk->no_idle_count++ == 0)
  103. arm_idlect1_mask &= ~(1 << iclk->idlect_shift);
  104. }
  105. static __u16 verify_ckctl_value(__u16 newval)
  106. {
  107. /* This function checks for following limitations set
  108. * by the hardware (all conditions must be true):
  109. * DSPMMU_CK == DSP_CK or DSPMMU_CK == DSP_CK/2
  110. * ARM_CK >= TC_CK
  111. * DSP_CK >= TC_CK
  112. * DSPMMU_CK >= TC_CK
  113. *
  114. * In addition following rules are enforced:
  115. * LCD_CK <= TC_CK
  116. * ARMPER_CK <= TC_CK
  117. *
  118. * However, maximum frequencies are not checked for!
  119. */
  120. __u8 per_exp;
  121. __u8 lcd_exp;
  122. __u8 arm_exp;
  123. __u8 dsp_exp;
  124. __u8 tc_exp;
  125. __u8 dspmmu_exp;
  126. per_exp = (newval >> CKCTL_PERDIV_OFFSET) & 3;
  127. lcd_exp = (newval >> CKCTL_LCDDIV_OFFSET) & 3;
  128. arm_exp = (newval >> CKCTL_ARMDIV_OFFSET) & 3;
  129. dsp_exp = (newval >> CKCTL_DSPDIV_OFFSET) & 3;
  130. tc_exp = (newval >> CKCTL_TCDIV_OFFSET) & 3;
  131. dspmmu_exp = (newval >> CKCTL_DSPMMUDIV_OFFSET) & 3;
  132. if (dspmmu_exp < dsp_exp)
  133. dspmmu_exp = dsp_exp;
  134. if (dspmmu_exp > dsp_exp+1)
  135. dspmmu_exp = dsp_exp+1;
  136. if (tc_exp < arm_exp)
  137. tc_exp = arm_exp;
  138. if (tc_exp < dspmmu_exp)
  139. tc_exp = dspmmu_exp;
  140. if (tc_exp > lcd_exp)
  141. lcd_exp = tc_exp;
  142. if (tc_exp > per_exp)
  143. per_exp = tc_exp;
  144. newval &= 0xf000;
  145. newval |= per_exp << CKCTL_PERDIV_OFFSET;
  146. newval |= lcd_exp << CKCTL_LCDDIV_OFFSET;
  147. newval |= arm_exp << CKCTL_ARMDIV_OFFSET;
  148. newval |= dsp_exp << CKCTL_DSPDIV_OFFSET;
  149. newval |= tc_exp << CKCTL_TCDIV_OFFSET;
  150. newval |= dspmmu_exp << CKCTL_DSPMMUDIV_OFFSET;
  151. return newval;
  152. }
  153. static int calc_dsor_exp(struct clk *clk, unsigned long rate)
  154. {
  155. /* Note: If target frequency is too low, this function will return 4,
  156. * which is invalid value. Caller must check for this value and act
  157. * accordingly.
  158. *
  159. * Note: This function does not check for following limitations set
  160. * by the hardware (all conditions must be true):
  161. * DSPMMU_CK == DSP_CK or DSPMMU_CK == DSP_CK/2
  162. * ARM_CK >= TC_CK
  163. * DSP_CK >= TC_CK
  164. * DSPMMU_CK >= TC_CK
  165. */
  166. unsigned long realrate;
  167. struct clk * parent;
  168. unsigned dsor_exp;
  169. if (unlikely(!(clk->flags & RATE_CKCTL)))
  170. return -EINVAL;
  171. parent = clk->parent;
  172. if (unlikely(parent == 0))
  173. return -EIO;
  174. realrate = parent->rate;
  175. for (dsor_exp=0; dsor_exp<4; dsor_exp++) {
  176. if (realrate <= rate)
  177. break;
  178. realrate /= 2;
  179. }
  180. return dsor_exp;
  181. }
  182. static void omap1_ckctl_recalc(struct clk * clk)
  183. {
  184. int dsor;
  185. /* Calculate divisor encoded as 2-bit exponent */
  186. dsor = 1 << (3 & (omap_readw(ARM_CKCTL) >> clk->rate_offset));
  187. if (unlikely(clk->rate == clk->parent->rate / dsor))
  188. return; /* No change, quick exit */
  189. clk->rate = clk->parent->rate / dsor;
  190. if (unlikely(clk->flags & RATE_PROPAGATES))
  191. propagate_rate(clk);
  192. }
  193. static void omap1_ckctl_recalc_dsp_domain(struct clk * clk)
  194. {
  195. int dsor;
  196. /* Calculate divisor encoded as 2-bit exponent
  197. *
  198. * The clock control bits are in DSP domain,
  199. * so api_ck is needed for access.
  200. * Note that DSP_CKCTL virt addr = phys addr, so
  201. * we must use __raw_readw() instead of omap_readw().
  202. */
  203. omap1_clk_enable(&api_ck.clk);
  204. dsor = 1 << (3 & (__raw_readw(DSP_CKCTL) >> clk->rate_offset));
  205. omap1_clk_disable(&api_ck.clk);
  206. if (unlikely(clk->rate == clk->parent->rate / dsor))
  207. return; /* No change, quick exit */
  208. clk->rate = clk->parent->rate / dsor;
  209. if (unlikely(clk->flags & RATE_PROPAGATES))
  210. propagate_rate(clk);
  211. }
  212. /* MPU virtual clock functions */
  213. static int omap1_select_table_rate(struct clk * clk, unsigned long rate)
  214. {
  215. /* Find the highest supported frequency <= rate and switch to it */
  216. struct mpu_rate * ptr;
  217. if (clk != &virtual_ck_mpu)
  218. return -EINVAL;
  219. for (ptr = rate_table; ptr->rate; ptr++) {
  220. if (ptr->xtal != ck_ref.rate)
  221. continue;
  222. /* DPLL1 cannot be reprogrammed without risking system crash */
  223. if (likely(ck_dpll1.rate!=0) && ptr->pll_rate != ck_dpll1.rate)
  224. continue;
  225. /* Can check only after xtal frequency check */
  226. if (ptr->rate <= rate)
  227. break;
  228. }
  229. if (!ptr->rate)
  230. return -EINVAL;
  231. /*
  232. * In most cases we should not need to reprogram DPLL.
  233. * Reprogramming the DPLL is tricky, it must be done from SRAM.
  234. * (on 730, bit 13 must always be 1)
  235. */
  236. if (cpu_is_omap730())
  237. omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val | 0x2000);
  238. else
  239. omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val);
  240. ck_dpll1.rate = ptr->pll_rate;
  241. propagate_rate(&ck_dpll1);
  242. return 0;
  243. }
  244. static int omap1_clk_set_rate_dsp_domain(struct clk *clk, unsigned long rate)
  245. {
  246. int ret = -EINVAL;
  247. int dsor_exp;
  248. __u16 regval;
  249. if (clk->flags & RATE_CKCTL) {
  250. dsor_exp = calc_dsor_exp(clk, rate);
  251. if (dsor_exp > 3)
  252. dsor_exp = -EINVAL;
  253. if (dsor_exp < 0)
  254. return dsor_exp;
  255. regval = __raw_readw(DSP_CKCTL);
  256. regval &= ~(3 << clk->rate_offset);
  257. regval |= dsor_exp << clk->rate_offset;
  258. __raw_writew(regval, DSP_CKCTL);
  259. clk->rate = clk->parent->rate / (1 << dsor_exp);
  260. ret = 0;
  261. }
  262. if (unlikely(ret == 0 && (clk->flags & RATE_PROPAGATES)))
  263. propagate_rate(clk);
  264. return ret;
  265. }
  266. static long omap1_round_to_table_rate(struct clk * clk, unsigned long rate)
  267. {
  268. /* Find the highest supported frequency <= rate */
  269. struct mpu_rate * ptr;
  270. long highest_rate;
  271. if (clk != &virtual_ck_mpu)
  272. return -EINVAL;
  273. highest_rate = -EINVAL;
  274. for (ptr = rate_table; ptr->rate; ptr++) {
  275. if (ptr->xtal != ck_ref.rate)
  276. continue;
  277. highest_rate = ptr->rate;
  278. /* Can check only after xtal frequency check */
  279. if (ptr->rate <= rate)
  280. break;
  281. }
  282. return highest_rate;
  283. }
  284. static unsigned calc_ext_dsor(unsigned long rate)
  285. {
  286. unsigned dsor;
  287. /* MCLK and BCLK divisor selection is not linear:
  288. * freq = 96MHz / dsor
  289. *
  290. * RATIO_SEL range: dsor <-> RATIO_SEL
  291. * 0..6: (RATIO_SEL+2) <-> (dsor-2)
  292. * 6..48: (8+(RATIO_SEL-6)*2) <-> ((dsor-8)/2+6)
  293. * Minimum dsor is 2 and maximum is 96. Odd divisors starting from 9
  294. * can not be used.
  295. */
  296. for (dsor = 2; dsor < 96; ++dsor) {
  297. if ((dsor & 1) && dsor > 8)
  298. continue;
  299. if (rate >= 96000000 / dsor)
  300. break;
  301. }
  302. return dsor;
  303. }
  304. /* Only needed on 1510 */
  305. static int omap1_set_uart_rate(struct clk * clk, unsigned long rate)
  306. {
  307. unsigned int val;
  308. val = omap_readl(clk->enable_reg);
  309. if (rate == 12000000)
  310. val &= ~(1 << clk->enable_bit);
  311. else if (rate == 48000000)
  312. val |= (1 << clk->enable_bit);
  313. else
  314. return -EINVAL;
  315. omap_writel(val, clk->enable_reg);
  316. clk->rate = rate;
  317. return 0;
  318. }
  319. /* External clock (MCLK & BCLK) functions */
  320. static int omap1_set_ext_clk_rate(struct clk * clk, unsigned long rate)
  321. {
  322. unsigned dsor;
  323. __u16 ratio_bits;
  324. dsor = calc_ext_dsor(rate);
  325. clk->rate = 96000000 / dsor;
  326. if (dsor > 8)
  327. ratio_bits = ((dsor - 8) / 2 + 6) << 2;
  328. else
  329. ratio_bits = (dsor - 2) << 2;
  330. ratio_bits |= omap_readw(clk->enable_reg) & ~0xfd;
  331. omap_writew(ratio_bits, clk->enable_reg);
  332. return 0;
  333. }
  334. static int omap1_set_sossi_rate(struct clk *clk, unsigned long rate)
  335. {
  336. u32 l;
  337. int div;
  338. unsigned long p_rate;
  339. p_rate = clk->parent->rate;
  340. /* Round towards slower frequency */
  341. div = (p_rate + rate - 1) / rate;
  342. div--;
  343. if (div < 0 || div > 7)
  344. return -EINVAL;
  345. l = omap_readl(MOD_CONF_CTRL_1);
  346. l &= ~(7 << 17);
  347. l |= div << 17;
  348. omap_writel(l, MOD_CONF_CTRL_1);
  349. clk->rate = p_rate / (div + 1);
  350. if (unlikely(clk->flags & RATE_PROPAGATES))
  351. propagate_rate(clk);
  352. return 0;
  353. }
  354. static long omap1_round_ext_clk_rate(struct clk * clk, unsigned long rate)
  355. {
  356. return 96000000 / calc_ext_dsor(rate);
  357. }
  358. static void omap1_init_ext_clk(struct clk * clk)
  359. {
  360. unsigned dsor;
  361. __u16 ratio_bits;
  362. /* Determine current rate and ensure clock is based on 96MHz APLL */
  363. ratio_bits = omap_readw(clk->enable_reg) & ~1;
  364. omap_writew(ratio_bits, clk->enable_reg);
  365. ratio_bits = (ratio_bits & 0xfc) >> 2;
  366. if (ratio_bits > 6)
  367. dsor = (ratio_bits - 6) * 2 + 8;
  368. else
  369. dsor = ratio_bits + 2;
  370. clk-> rate = 96000000 / dsor;
  371. }
  372. static int omap1_clk_enable(struct clk *clk)
  373. {
  374. int ret = 0;
  375. if (clk->usecount++ == 0) {
  376. if (likely(clk->parent)) {
  377. ret = omap1_clk_enable(clk->parent);
  378. if (unlikely(ret != 0)) {
  379. clk->usecount--;
  380. return ret;
  381. }
  382. if (clk->flags & CLOCK_NO_IDLE_PARENT)
  383. omap1_clk_deny_idle(clk->parent);
  384. }
  385. ret = clk->enable(clk);
  386. if (unlikely(ret != 0) && clk->parent) {
  387. omap1_clk_disable(clk->parent);
  388. clk->usecount--;
  389. }
  390. }
  391. return ret;
  392. }
  393. static void omap1_clk_disable(struct clk *clk)
  394. {
  395. if (clk->usecount > 0 && !(--clk->usecount)) {
  396. clk->disable(clk);
  397. if (likely(clk->parent)) {
  398. omap1_clk_disable(clk->parent);
  399. if (clk->flags & CLOCK_NO_IDLE_PARENT)
  400. omap1_clk_allow_idle(clk->parent);
  401. }
  402. }
  403. }
  404. static int omap1_clk_enable_generic(struct clk *clk)
  405. {
  406. __u16 regval16;
  407. __u32 regval32;
  408. if (clk->flags & ALWAYS_ENABLED)
  409. return 0;
  410. if (unlikely(clk->enable_reg == 0)) {
  411. printk(KERN_ERR "clock.c: Enable for %s without enable code\n",
  412. clk->name);
  413. return -EINVAL;
  414. }
  415. if (clk->flags & ENABLE_REG_32BIT) {
  416. if (clk->flags & VIRTUAL_IO_ADDRESS) {
  417. regval32 = __raw_readl(clk->enable_reg);
  418. regval32 |= (1 << clk->enable_bit);
  419. __raw_writel(regval32, clk->enable_reg);
  420. } else {
  421. regval32 = omap_readl(clk->enable_reg);
  422. regval32 |= (1 << clk->enable_bit);
  423. omap_writel(regval32, clk->enable_reg);
  424. }
  425. } else {
  426. if (clk->flags & VIRTUAL_IO_ADDRESS) {
  427. regval16 = __raw_readw(clk->enable_reg);
  428. regval16 |= (1 << clk->enable_bit);
  429. __raw_writew(regval16, clk->enable_reg);
  430. } else {
  431. regval16 = omap_readw(clk->enable_reg);
  432. regval16 |= (1 << clk->enable_bit);
  433. omap_writew(regval16, clk->enable_reg);
  434. }
  435. }
  436. return 0;
  437. }
  438. static void omap1_clk_disable_generic(struct clk *clk)
  439. {
  440. __u16 regval16;
  441. __u32 regval32;
  442. if (clk->enable_reg == 0)
  443. return;
  444. if (clk->flags & ENABLE_REG_32BIT) {
  445. if (clk->flags & VIRTUAL_IO_ADDRESS) {
  446. regval32 = __raw_readl(clk->enable_reg);
  447. regval32 &= ~(1 << clk->enable_bit);
  448. __raw_writel(regval32, clk->enable_reg);
  449. } else {
  450. regval32 = omap_readl(clk->enable_reg);
  451. regval32 &= ~(1 << clk->enable_bit);
  452. omap_writel(regval32, clk->enable_reg);
  453. }
  454. } else {
  455. if (clk->flags & VIRTUAL_IO_ADDRESS) {
  456. regval16 = __raw_readw(clk->enable_reg);
  457. regval16 &= ~(1 << clk->enable_bit);
  458. __raw_writew(regval16, clk->enable_reg);
  459. } else {
  460. regval16 = omap_readw(clk->enable_reg);
  461. regval16 &= ~(1 << clk->enable_bit);
  462. omap_writew(regval16, clk->enable_reg);
  463. }
  464. }
  465. }
  466. static long omap1_clk_round_rate(struct clk *clk, unsigned long rate)
  467. {
  468. int dsor_exp;
  469. if (clk->flags & RATE_FIXED)
  470. return clk->rate;
  471. if (clk->flags & RATE_CKCTL) {
  472. dsor_exp = calc_dsor_exp(clk, rate);
  473. if (dsor_exp < 0)
  474. return dsor_exp;
  475. if (dsor_exp > 3)
  476. dsor_exp = 3;
  477. return clk->parent->rate / (1 << dsor_exp);
  478. }
  479. if(clk->round_rate != 0)
  480. return clk->round_rate(clk, rate);
  481. return clk->rate;
  482. }
  483. static int omap1_clk_set_rate(struct clk *clk, unsigned long rate)
  484. {
  485. int ret = -EINVAL;
  486. int dsor_exp;
  487. __u16 regval;
  488. if (clk->set_rate)
  489. ret = clk->set_rate(clk, rate);
  490. else if (clk->flags & RATE_CKCTL) {
  491. dsor_exp = calc_dsor_exp(clk, rate);
  492. if (dsor_exp > 3)
  493. dsor_exp = -EINVAL;
  494. if (dsor_exp < 0)
  495. return dsor_exp;
  496. regval = omap_readw(ARM_CKCTL);
  497. regval &= ~(3 << clk->rate_offset);
  498. regval |= dsor_exp << clk->rate_offset;
  499. regval = verify_ckctl_value(regval);
  500. omap_writew(regval, ARM_CKCTL);
  501. clk->rate = clk->parent->rate / (1 << dsor_exp);
  502. ret = 0;
  503. }
  504. if (unlikely(ret == 0 && (clk->flags & RATE_PROPAGATES)))
  505. propagate_rate(clk);
  506. return ret;
  507. }
  508. /*-------------------------------------------------------------------------
  509. * Omap1 clock reset and init functions
  510. *-------------------------------------------------------------------------*/
  511. #ifdef CONFIG_OMAP_RESET_CLOCKS
  512. static void __init omap1_clk_disable_unused(struct clk *clk)
  513. {
  514. __u32 regval32;
  515. /* Clocks in the DSP domain need api_ck. Just assume bootloader
  516. * has not enabled any DSP clocks */
  517. if ((u32)clk->enable_reg == DSP_IDLECT2) {
  518. printk(KERN_INFO "Skipping reset check for DSP domain "
  519. "clock \"%s\"\n", clk->name);
  520. return;
  521. }
  522. /* Is the clock already disabled? */
  523. if (clk->flags & ENABLE_REG_32BIT) {
  524. if (clk->flags & VIRTUAL_IO_ADDRESS)
  525. regval32 = __raw_readl(clk->enable_reg);
  526. else
  527. regval32 = omap_readl(clk->enable_reg);
  528. } else {
  529. if (clk->flags & VIRTUAL_IO_ADDRESS)
  530. regval32 = __raw_readw(clk->enable_reg);
  531. else
  532. regval32 = omap_readw(clk->enable_reg);
  533. }
  534. if ((regval32 & (1 << clk->enable_bit)) == 0)
  535. return;
  536. /* FIXME: This clock seems to be necessary but no-one
  537. * has asked for its activation. */
  538. if (clk == &tc2_ck // FIX: pm.c (SRAM), CCP, Camera
  539. || clk == &ck_dpll1out.clk // FIX: SoSSI, SSR
  540. || clk == &arm_gpio_ck // FIX: GPIO code for 1510
  541. ) {
  542. printk(KERN_INFO "FIXME: Clock \"%s\" seems unused\n",
  543. clk->name);
  544. return;
  545. }
  546. printk(KERN_INFO "Disabling unused clock \"%s\"... ", clk->name);
  547. clk->disable(clk);
  548. printk(" done\n");
  549. }
  550. #else
  551. #define omap1_clk_disable_unused NULL
  552. #endif
  553. static struct clk_functions omap1_clk_functions = {
  554. .clk_enable = omap1_clk_enable,
  555. .clk_disable = omap1_clk_disable,
  556. .clk_round_rate = omap1_clk_round_rate,
  557. .clk_set_rate = omap1_clk_set_rate,
  558. .clk_disable_unused = omap1_clk_disable_unused,
  559. };
  560. int __init omap1_clk_init(void)
  561. {
  562. struct clk ** clkp;
  563. const struct omap_clock_config *info;
  564. int crystal_type = 0; /* Default 12 MHz */
  565. u32 reg;
  566. #ifdef CONFIG_DEBUG_LL
  567. /* Resets some clocks that may be left on from bootloader,
  568. * but leaves serial clocks on.
  569. */
  570. omap_writel(0x3 << 29, MOD_CONF_CTRL_0);
  571. #endif
  572. /* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */
  573. reg = omap_readw(SOFT_REQ_REG) & (1 << 4);
  574. omap_writew(reg, SOFT_REQ_REG);
  575. if (!cpu_is_omap15xx())
  576. omap_writew(0, SOFT_REQ_REG2);
  577. clk_init(&omap1_clk_functions);
  578. /* By default all idlect1 clocks are allowed to idle */
  579. arm_idlect1_mask = ~0;
  580. for (clkp = onchip_clks; clkp < onchip_clks+ARRAY_SIZE(onchip_clks); clkp++) {
  581. if (((*clkp)->flags &CLOCK_IN_OMAP1510) && cpu_is_omap1510()) {
  582. clk_register(*clkp);
  583. continue;
  584. }
  585. if (((*clkp)->flags &CLOCK_IN_OMAP16XX) && cpu_is_omap16xx()) {
  586. clk_register(*clkp);
  587. continue;
  588. }
  589. if (((*clkp)->flags &CLOCK_IN_OMAP730) && cpu_is_omap730()) {
  590. clk_register(*clkp);
  591. continue;
  592. }
  593. if (((*clkp)->flags &CLOCK_IN_OMAP310) && cpu_is_omap310()) {
  594. clk_register(*clkp);
  595. continue;
  596. }
  597. }
  598. info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config);
  599. if (info != NULL) {
  600. if (!cpu_is_omap15xx())
  601. crystal_type = info->system_clock_type;
  602. }
  603. #if defined(CONFIG_ARCH_OMAP730)
  604. ck_ref.rate = 13000000;
  605. #elif defined(CONFIG_ARCH_OMAP16XX)
  606. if (crystal_type == 2)
  607. ck_ref.rate = 19200000;
  608. #endif
  609. printk("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: 0x%04x\n",
  610. omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
  611. omap_readw(ARM_CKCTL));
  612. /* We want to be in syncronous scalable mode */
  613. omap_writew(0x1000, ARM_SYSST);
  614. #ifdef CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER
  615. /* Use values set by bootloader. Determine PLL rate and recalculate
  616. * dependent clocks as if kernel had changed PLL or divisors.
  617. */
  618. {
  619. unsigned pll_ctl_val = omap_readw(DPLL_CTL);
  620. ck_dpll1.rate = ck_ref.rate; /* Base xtal rate */
  621. if (pll_ctl_val & 0x10) {
  622. /* PLL enabled, apply multiplier and divisor */
  623. if (pll_ctl_val & 0xf80)
  624. ck_dpll1.rate *= (pll_ctl_val & 0xf80) >> 7;
  625. ck_dpll1.rate /= ((pll_ctl_val & 0x60) >> 5) + 1;
  626. } else {
  627. /* PLL disabled, apply bypass divisor */
  628. switch (pll_ctl_val & 0xc) {
  629. case 0:
  630. break;
  631. case 0x4:
  632. ck_dpll1.rate /= 2;
  633. break;
  634. default:
  635. ck_dpll1.rate /= 4;
  636. break;
  637. }
  638. }
  639. }
  640. propagate_rate(&ck_dpll1);
  641. #else
  642. /* Find the highest supported frequency and enable it */
  643. if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) {
  644. printk(KERN_ERR "System frequencies not set. Check your config.\n");
  645. /* Guess sane values (60MHz) */
  646. omap_writew(0x2290, DPLL_CTL);
  647. omap_writew(cpu_is_omap730() ? 0x3005 : 0x1005, ARM_CKCTL);
  648. ck_dpll1.rate = 60000000;
  649. propagate_rate(&ck_dpll1);
  650. }
  651. #endif
  652. /* Cache rates for clocks connected to ck_ref (not dpll1) */
  653. propagate_rate(&ck_ref);
  654. printk(KERN_INFO "Clocking rate (xtal/DPLL1/MPU): "
  655. "%ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
  656. ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
  657. ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
  658. arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
  659. #if defined(CONFIG_MACH_OMAP_PERSEUS2) || defined(CONFIG_MACH_OMAP_FSAMPLE)
  660. /* Select slicer output as OMAP input clock */
  661. omap_writew(omap_readw(OMAP730_PCC_UPLD_CTRL) & ~0x1, OMAP730_PCC_UPLD_CTRL);
  662. #endif
  663. /* Amstrad Delta wants BCLK high when inactive */
  664. if (machine_is_ams_delta())
  665. omap_writel(omap_readl(ULPD_CLOCK_CTRL) |
  666. (1 << SDW_MCLK_INV_BIT),
  667. ULPD_CLOCK_CTRL);
  668. /* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */
  669. /* (on 730, bit 13 must not be cleared) */
  670. if (cpu_is_omap730())
  671. omap_writew(omap_readw(ARM_CKCTL) & 0x2fff, ARM_CKCTL);
  672. else
  673. omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL);
  674. /* Put DSP/MPUI into reset until needed */
  675. omap_writew(0, ARM_RSTCT1);
  676. omap_writew(1, ARM_RSTCT2);
  677. omap_writew(0x400, ARM_IDLECT1);
  678. /*
  679. * According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8)
  680. * of the ARM_IDLECT2 register must be set to zero. The power-on
  681. * default value of this bit is one.
  682. */
  683. omap_writew(0x0000, ARM_IDLECT2); /* Turn LCD clock off also */
  684. /*
  685. * Only enable those clocks we will need, let the drivers
  686. * enable other clocks as necessary
  687. */
  688. clk_enable(&armper_ck.clk);
  689. clk_enable(&armxor_ck.clk);
  690. clk_enable(&armtim_ck.clk); /* This should be done by timer code */
  691. if (cpu_is_omap15xx())
  692. clk_enable(&arm_gpio_ck);
  693. return 0;
  694. }