clock.c 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184
  1. /*
  2. * linux/arch/arm/mach-omap2/clock.c
  3. *
  4. * Copyright (C) 2005 Texas Instruments Inc.
  5. * Richard Woodruff <r-woodruff2@ti.com>
  6. * Created for OMAP2.
  7. *
  8. * Cleaned up and modified to use omap shared clock framework by
  9. * Tony Lindgren <tony@atomide.com>
  10. *
  11. * Based on omap1 clock.c, Copyright (C) 2004 - 2005 Nokia corporation
  12. * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License version 2 as
  16. * published by the Free Software Foundation.
  17. */
  18. #include <linux/module.h>
  19. #include <linux/kernel.h>
  20. #include <linux/device.h>
  21. #include <linux/list.h>
  22. #include <linux/errno.h>
  23. #include <linux/delay.h>
  24. #include <linux/clk.h>
  25. #include <asm/io.h>
  26. #include <asm/arch/clock.h>
  27. #include <asm/arch/sram.h>
  28. #include "prcm-regs.h"
  29. #include "memory.h"
  30. #include "clock.h"
  31. #undef DEBUG
  32. //#define DOWN_VARIABLE_DPLL 1 /* Experimental */
  33. static struct prcm_config *curr_prcm_set;
  34. static u32 curr_perf_level = PRCM_FULL_SPEED;
  35. static struct clk *vclk;
  36. static struct clk *sclk;
  37. /*-------------------------------------------------------------------------
  38. * Omap2 specific clock functions
  39. *-------------------------------------------------------------------------*/
  40. /* Recalculate SYST_CLK */
  41. static void omap2_sys_clk_recalc(struct clk * clk)
  42. {
  43. u32 div = PRCM_CLKSRC_CTRL;
  44. div &= (1 << 7) | (1 << 6); /* Test if ext clk divided by 1 or 2 */
  45. div >>= clk->rate_offset;
  46. clk->rate = (clk->parent->rate / div);
  47. propagate_rate(clk);
  48. }
  49. static u32 omap2_get_dpll_rate(struct clk * tclk)
  50. {
  51. long long dpll_clk;
  52. int dpll_mult, dpll_div, amult;
  53. dpll_mult = (CM_CLKSEL1_PLL >> 12) & 0x03ff; /* 10 bits */
  54. dpll_div = (CM_CLKSEL1_PLL >> 8) & 0x0f; /* 4 bits */
  55. dpll_clk = (long long)tclk->parent->rate * dpll_mult;
  56. do_div(dpll_clk, dpll_div + 1);
  57. amult = CM_CLKSEL2_PLL & 0x3;
  58. dpll_clk *= amult;
  59. return dpll_clk;
  60. }
  61. static void omap2_followparent_recalc(struct clk *clk)
  62. {
  63. followparent_recalc(clk);
  64. }
  65. static void omap2_propagate_rate(struct clk * clk)
  66. {
  67. if (!(clk->flags & RATE_FIXED))
  68. clk->rate = clk->parent->rate;
  69. propagate_rate(clk);
  70. }
  71. static void omap2_set_osc_ck(int enable)
  72. {
  73. if (enable)
  74. PRCM_CLKSRC_CTRL &= ~(0x3 << 3);
  75. else
  76. PRCM_CLKSRC_CTRL |= 0x3 << 3;
  77. }
  78. /* Enable an APLL if off */
  79. static void omap2_clk_fixed_enable(struct clk *clk)
  80. {
  81. u32 cval, i=0;
  82. if (clk->enable_bit == 0xff) /* Parent will do it */
  83. return;
  84. cval = CM_CLKEN_PLL;
  85. if ((cval & (0x3 << clk->enable_bit)) == (0x3 << clk->enable_bit))
  86. return;
  87. cval &= ~(0x3 << clk->enable_bit);
  88. cval |= (0x3 << clk->enable_bit);
  89. CM_CLKEN_PLL = cval;
  90. if (clk == &apll96_ck)
  91. cval = (1 << 8);
  92. else if (clk == &apll54_ck)
  93. cval = (1 << 6);
  94. while (!(CM_IDLEST_CKGEN & cval)) { /* Wait for lock */
  95. ++i;
  96. udelay(1);
  97. if (i == 100000) {
  98. printk(KERN_ERR "Clock %s didn't lock\n", clk->name);
  99. break;
  100. }
  101. }
  102. }
  103. static void omap2_clk_wait_ready(struct clk *clk)
  104. {
  105. unsigned long reg, other_reg, st_reg;
  106. u32 bit;
  107. int i;
  108. reg = (unsigned long) clk->enable_reg;
  109. if (reg == (unsigned long) &CM_FCLKEN1_CORE ||
  110. reg == (unsigned long) &CM_FCLKEN2_CORE)
  111. other_reg = (reg & ~0xf0) | 0x10;
  112. else if (reg == (unsigned long) &CM_ICLKEN1_CORE ||
  113. reg == (unsigned long) &CM_ICLKEN2_CORE)
  114. other_reg = (reg & ~0xf0) | 0x00;
  115. else
  116. return;
  117. /* No check for DSS or cam clocks */
  118. if ((reg & 0x0f) == 0) {
  119. if (clk->enable_bit <= 1 || clk->enable_bit == 31)
  120. return;
  121. }
  122. /* Check if both functional and interface clocks
  123. * are running. */
  124. bit = 1 << clk->enable_bit;
  125. if (!(__raw_readl(other_reg) & bit))
  126. return;
  127. st_reg = (other_reg & ~0xf0) | 0x20;
  128. i = 0;
  129. while (!(__raw_readl(st_reg) & bit)) {
  130. i++;
  131. if (i == 100000) {
  132. printk(KERN_ERR "Timeout enabling clock %s\n", clk->name);
  133. break;
  134. }
  135. }
  136. if (i)
  137. pr_debug("Clock %s stable after %d loops\n", clk->name, i);
  138. }
  139. /* Enables clock without considering parent dependencies or use count
  140. * REVISIT: Maybe change this to use clk->enable like on omap1?
  141. */
  142. static int _omap2_clk_enable(struct clk * clk)
  143. {
  144. u32 regval32;
  145. if (clk->flags & ALWAYS_ENABLED)
  146. return 0;
  147. if (unlikely(clk == &osc_ck)) {
  148. omap2_set_osc_ck(1);
  149. return 0;
  150. }
  151. if (unlikely(clk->enable_reg == 0)) {
  152. printk(KERN_ERR "clock.c: Enable for %s without enable code\n",
  153. clk->name);
  154. return 0;
  155. }
  156. if (clk->enable_reg == (void __iomem *)&CM_CLKEN_PLL) {
  157. omap2_clk_fixed_enable(clk);
  158. return 0;
  159. }
  160. regval32 = __raw_readl(clk->enable_reg);
  161. regval32 |= (1 << clk->enable_bit);
  162. __raw_writel(regval32, clk->enable_reg);
  163. wmb();
  164. omap2_clk_wait_ready(clk);
  165. return 0;
  166. }
  167. /* Stop APLL */
  168. static void omap2_clk_fixed_disable(struct clk *clk)
  169. {
  170. u32 cval;
  171. if(clk->enable_bit == 0xff) /* let parent off do it */
  172. return;
  173. cval = CM_CLKEN_PLL;
  174. cval &= ~(0x3 << clk->enable_bit);
  175. CM_CLKEN_PLL = cval;
  176. }
  177. /* Disables clock without considering parent dependencies or use count */
  178. static void _omap2_clk_disable(struct clk *clk)
  179. {
  180. u32 regval32;
  181. if (unlikely(clk == &osc_ck)) {
  182. omap2_set_osc_ck(0);
  183. return;
  184. }
  185. if (clk->enable_reg == 0)
  186. return;
  187. if (clk->enable_reg == (void __iomem *)&CM_CLKEN_PLL) {
  188. omap2_clk_fixed_disable(clk);
  189. return;
  190. }
  191. regval32 = __raw_readl(clk->enable_reg);
  192. regval32 &= ~(1 << clk->enable_bit);
  193. __raw_writel(regval32, clk->enable_reg);
  194. wmb();
  195. }
  196. static int omap2_clk_enable(struct clk *clk)
  197. {
  198. int ret = 0;
  199. if (clk->usecount++ == 0) {
  200. if (likely((u32)clk->parent))
  201. ret = omap2_clk_enable(clk->parent);
  202. if (unlikely(ret != 0)) {
  203. clk->usecount--;
  204. return ret;
  205. }
  206. ret = _omap2_clk_enable(clk);
  207. if (unlikely(ret != 0) && clk->parent) {
  208. omap2_clk_disable(clk->parent);
  209. clk->usecount--;
  210. }
  211. }
  212. return ret;
  213. }
  214. static void omap2_clk_disable(struct clk *clk)
  215. {
  216. if (clk->usecount > 0 && !(--clk->usecount)) {
  217. _omap2_clk_disable(clk);
  218. if (likely((u32)clk->parent))
  219. omap2_clk_disable(clk->parent);
  220. }
  221. }
  222. /*
  223. * Uses the current prcm set to tell if a rate is valid.
  224. * You can go slower, but not faster within a given rate set.
  225. */
  226. static u32 omap2_dpll_round_rate(unsigned long target_rate)
  227. {
  228. u32 high, low;
  229. if ((CM_CLKSEL2_PLL & 0x3) == 1) { /* DPLL clockout */
  230. high = curr_prcm_set->dpll_speed * 2;
  231. low = curr_prcm_set->dpll_speed;
  232. } else { /* DPLL clockout x 2 */
  233. high = curr_prcm_set->dpll_speed;
  234. low = curr_prcm_set->dpll_speed / 2;
  235. }
  236. #ifdef DOWN_VARIABLE_DPLL
  237. if (target_rate > high)
  238. return high;
  239. else
  240. return target_rate;
  241. #else
  242. if (target_rate > low)
  243. return high;
  244. else
  245. return low;
  246. #endif
  247. }
  248. /*
  249. * Used for clocks that are part of CLKSEL_xyz governed clocks.
  250. * REVISIT: Maybe change to use clk->enable() functions like on omap1?
  251. */
  252. static void omap2_clksel_recalc(struct clk * clk)
  253. {
  254. u32 fixed = 0, div = 0;
  255. if (clk == &dpll_ck) {
  256. clk->rate = omap2_get_dpll_rate(clk);
  257. fixed = 1;
  258. div = 0;
  259. }
  260. if (clk == &iva1_mpu_int_ifck) {
  261. div = 2;
  262. fixed = 1;
  263. }
  264. if ((clk == &dss1_fck) && ((CM_CLKSEL1_CORE & (0x1f << 8)) == 0)) {
  265. clk->rate = sys_ck.rate;
  266. return;
  267. }
  268. if (!fixed) {
  269. div = omap2_clksel_get_divisor(clk);
  270. if (div == 0)
  271. return;
  272. }
  273. if (div != 0) {
  274. if (unlikely(clk->rate == clk->parent->rate / div))
  275. return;
  276. clk->rate = clk->parent->rate / div;
  277. }
  278. if (unlikely(clk->flags & RATE_PROPAGATES))
  279. propagate_rate(clk);
  280. }
  281. /*
  282. * Finds best divider value in an array based on the source and target
  283. * rates. The divider array must be sorted with smallest divider first.
  284. */
  285. static inline u32 omap2_divider_from_table(u32 size, u32 *div_array,
  286. u32 src_rate, u32 tgt_rate)
  287. {
  288. int i, test_rate;
  289. if (div_array == NULL)
  290. return ~1;
  291. for (i=0; i < size; i++) {
  292. test_rate = src_rate / *div_array;
  293. if (test_rate <= tgt_rate)
  294. return *div_array;
  295. ++div_array;
  296. }
  297. return ~0; /* No acceptable divider */
  298. }
  299. /*
  300. * Find divisor for the given clock and target rate.
  301. *
  302. * Note that this will not work for clocks which are part of CONFIG_PARTICIPANT,
  303. * they are only settable as part of virtual_prcm set.
  304. */
  305. static u32 omap2_clksel_round_rate(struct clk *tclk, u32 target_rate,
  306. u32 *new_div)
  307. {
  308. u32 gfx_div[] = {2, 3, 4};
  309. u32 sysclkout_div[] = {1, 2, 4, 8, 16};
  310. u32 dss1_div[] = {1, 2, 3, 4, 5, 6, 8, 9, 12, 16};
  311. u32 vylnq_div[] = {1, 2, 3, 4, 6, 8, 9, 12, 16, 18};
  312. u32 best_div = ~0, asize = 0;
  313. u32 *div_array = NULL;
  314. switch (tclk->flags & SRC_RATE_SEL_MASK) {
  315. case CM_GFX_SEL1:
  316. asize = 3;
  317. div_array = gfx_div;
  318. break;
  319. case CM_PLL_SEL1:
  320. return omap2_dpll_round_rate(target_rate);
  321. case CM_SYSCLKOUT_SEL1:
  322. asize = 5;
  323. div_array = sysclkout_div;
  324. break;
  325. case CM_CORE_SEL1:
  326. if(tclk == &dss1_fck){
  327. if(tclk->parent == &core_ck){
  328. asize = 10;
  329. div_array = dss1_div;
  330. } else {
  331. *new_div = 0; /* fixed clk */
  332. return(tclk->parent->rate);
  333. }
  334. } else if((tclk == &vlynq_fck) && cpu_is_omap2420()){
  335. if(tclk->parent == &core_ck){
  336. asize = 10;
  337. div_array = vylnq_div;
  338. } else {
  339. *new_div = 0; /* fixed clk */
  340. return(tclk->parent->rate);
  341. }
  342. }
  343. break;
  344. }
  345. best_div = omap2_divider_from_table(asize, div_array,
  346. tclk->parent->rate, target_rate);
  347. if (best_div == ~0){
  348. *new_div = 1;
  349. return best_div; /* signal error */
  350. }
  351. *new_div = best_div;
  352. return (tclk->parent->rate / best_div);
  353. }
  354. /* Given a clock and a rate apply a clock specific rounding function */
  355. static long omap2_clk_round_rate(struct clk *clk, unsigned long rate)
  356. {
  357. u32 new_div = 0;
  358. int valid_rate;
  359. if (clk->flags & RATE_FIXED)
  360. return clk->rate;
  361. if (clk->flags & RATE_CKCTL) {
  362. valid_rate = omap2_clksel_round_rate(clk, rate, &new_div);
  363. return valid_rate;
  364. }
  365. if (clk->round_rate != 0)
  366. return clk->round_rate(clk, rate);
  367. return clk->rate;
  368. }
  369. /*
  370. * Check the DLL lock state, and return tue if running in unlock mode.
  371. * This is needed to compenste for the shifted DLL value in unlock mode.
  372. */
  373. static u32 omap2_dll_force_needed(void)
  374. {
  375. u32 dll_state = SDRC_DLLA_CTRL; /* dlla and dllb are a set */
  376. if ((dll_state & (1 << 2)) == (1 << 2))
  377. return 1;
  378. else
  379. return 0;
  380. }
  381. static u32 omap2_reprogram_sdrc(u32 level, u32 force)
  382. {
  383. u32 slow_dll_ctrl, fast_dll_ctrl, m_type;
  384. u32 prev = curr_perf_level, flags;
  385. if ((curr_perf_level == level) && !force)
  386. return prev;
  387. m_type = omap2_memory_get_type();
  388. slow_dll_ctrl = omap2_memory_get_slow_dll_ctrl();
  389. fast_dll_ctrl = omap2_memory_get_fast_dll_ctrl();
  390. if (level == PRCM_HALF_SPEED) {
  391. local_irq_save(flags);
  392. PRCM_VOLTSETUP = 0xffff;
  393. omap2_sram_reprogram_sdrc(PRCM_HALF_SPEED,
  394. slow_dll_ctrl, m_type);
  395. curr_perf_level = PRCM_HALF_SPEED;
  396. local_irq_restore(flags);
  397. }
  398. if (level == PRCM_FULL_SPEED) {
  399. local_irq_save(flags);
  400. PRCM_VOLTSETUP = 0xffff;
  401. omap2_sram_reprogram_sdrc(PRCM_FULL_SPEED,
  402. fast_dll_ctrl, m_type);
  403. curr_perf_level = PRCM_FULL_SPEED;
  404. local_irq_restore(flags);
  405. }
  406. return prev;
  407. }
  408. static int omap2_reprogram_dpll(struct clk * clk, unsigned long rate)
  409. {
  410. u32 flags, cur_rate, low, mult, div, valid_rate, done_rate;
  411. u32 bypass = 0;
  412. struct prcm_config tmpset;
  413. int ret = -EINVAL;
  414. local_irq_save(flags);
  415. cur_rate = omap2_get_dpll_rate(&dpll_ck);
  416. mult = CM_CLKSEL2_PLL & 0x3;
  417. if ((rate == (cur_rate / 2)) && (mult == 2)) {
  418. omap2_reprogram_sdrc(PRCM_HALF_SPEED, 1);
  419. } else if ((rate == (cur_rate * 2)) && (mult == 1)) {
  420. omap2_reprogram_sdrc(PRCM_FULL_SPEED, 1);
  421. } else if (rate != cur_rate) {
  422. valid_rate = omap2_dpll_round_rate(rate);
  423. if (valid_rate != rate)
  424. goto dpll_exit;
  425. if ((CM_CLKSEL2_PLL & 0x3) == 1)
  426. low = curr_prcm_set->dpll_speed;
  427. else
  428. low = curr_prcm_set->dpll_speed / 2;
  429. tmpset.cm_clksel1_pll = CM_CLKSEL1_PLL;
  430. tmpset.cm_clksel1_pll &= ~(0x3FFF << 8);
  431. div = ((curr_prcm_set->xtal_speed / 1000000) - 1);
  432. tmpset.cm_clksel2_pll = CM_CLKSEL2_PLL;
  433. tmpset.cm_clksel2_pll &= ~0x3;
  434. if (rate > low) {
  435. tmpset.cm_clksel2_pll |= 0x2;
  436. mult = ((rate / 2) / 1000000);
  437. done_rate = PRCM_FULL_SPEED;
  438. } else {
  439. tmpset.cm_clksel2_pll |= 0x1;
  440. mult = (rate / 1000000);
  441. done_rate = PRCM_HALF_SPEED;
  442. }
  443. tmpset.cm_clksel1_pll |= ((div << 8) | (mult << 12));
  444. /* Worst case */
  445. tmpset.base_sdrc_rfr = V24XX_SDRC_RFR_CTRL_BYPASS;
  446. if (rate == curr_prcm_set->xtal_speed) /* If asking for 1-1 */
  447. bypass = 1;
  448. omap2_reprogram_sdrc(PRCM_FULL_SPEED, 1); /* For init_mem */
  449. /* Force dll lock mode */
  450. omap2_set_prcm(tmpset.cm_clksel1_pll, tmpset.base_sdrc_rfr,
  451. bypass);
  452. /* Errata: ret dll entry state */
  453. omap2_init_memory_params(omap2_dll_force_needed());
  454. omap2_reprogram_sdrc(done_rate, 0);
  455. }
  456. omap2_clksel_recalc(&dpll_ck);
  457. ret = 0;
  458. dpll_exit:
  459. local_irq_restore(flags);
  460. return(ret);
  461. }
  462. /* Just return the MPU speed */
  463. static void omap2_mpu_recalc(struct clk * clk)
  464. {
  465. clk->rate = curr_prcm_set->mpu_speed;
  466. }
  467. /*
  468. * Look for a rate equal or less than the target rate given a configuration set.
  469. *
  470. * What's not entirely clear is "which" field represents the key field.
  471. * Some might argue L3-DDR, others ARM, others IVA. This code is simple and
  472. * just uses the ARM rates.
  473. */
  474. static long omap2_round_to_table_rate(struct clk * clk, unsigned long rate)
  475. {
  476. struct prcm_config * ptr;
  477. long highest_rate;
  478. if (clk != &virt_prcm_set)
  479. return -EINVAL;
  480. highest_rate = -EINVAL;
  481. for (ptr = rate_table; ptr->mpu_speed; ptr++) {
  482. if (ptr->xtal_speed != sys_ck.rate)
  483. continue;
  484. highest_rate = ptr->mpu_speed;
  485. /* Can check only after xtal frequency check */
  486. if (ptr->mpu_speed <= rate)
  487. break;
  488. }
  489. return highest_rate;
  490. }
  491. /*
  492. * omap2_convert_field_to_div() - turn field value into integer divider
  493. */
  494. static u32 omap2_clksel_to_divisor(u32 div_sel, u32 field_val)
  495. {
  496. u32 i;
  497. u32 clkout_array[] = {1, 2, 4, 8, 16};
  498. if ((div_sel & SRC_RATE_SEL_MASK) == CM_SYSCLKOUT_SEL1) {
  499. for (i = 0; i < 5; i++) {
  500. if (field_val == i)
  501. return clkout_array[i];
  502. }
  503. return ~0;
  504. } else
  505. return field_val;
  506. }
  507. /*
  508. * Returns the CLKSEL divider register value
  509. * REVISIT: This should be cleaned up to work nicely with void __iomem *
  510. */
  511. static u32 omap2_get_clksel(u32 *div_sel, u32 *field_mask,
  512. struct clk *clk)
  513. {
  514. int ret = ~0;
  515. u32 reg_val, div_off;
  516. u32 div_addr = 0;
  517. u32 mask = ~0;
  518. div_off = clk->rate_offset;
  519. switch ((*div_sel & SRC_RATE_SEL_MASK)) {
  520. case CM_MPU_SEL1:
  521. div_addr = (u32)&CM_CLKSEL_MPU;
  522. mask = 0x1f;
  523. break;
  524. case CM_DSP_SEL1:
  525. div_addr = (u32)&CM_CLKSEL_DSP;
  526. if (cpu_is_omap2420()) {
  527. if ((div_off == 0) || (div_off == 8))
  528. mask = 0x1f;
  529. else if (div_off == 5)
  530. mask = 0x3;
  531. } else if (cpu_is_omap2430()) {
  532. if (div_off == 0)
  533. mask = 0x1f;
  534. else if (div_off == 5)
  535. mask = 0x3;
  536. }
  537. break;
  538. case CM_GFX_SEL1:
  539. div_addr = (u32)&CM_CLKSEL_GFX;
  540. if (div_off == 0)
  541. mask = 0x7;
  542. break;
  543. case CM_MODEM_SEL1:
  544. div_addr = (u32)&CM_CLKSEL_MDM;
  545. if (div_off == 0)
  546. mask = 0xf;
  547. break;
  548. case CM_SYSCLKOUT_SEL1:
  549. div_addr = (u32)&PRCM_CLKOUT_CTRL;
  550. if ((div_off == 3) || (div_off = 11))
  551. mask= 0x3;
  552. break;
  553. case CM_CORE_SEL1:
  554. div_addr = (u32)&CM_CLKSEL1_CORE;
  555. switch (div_off) {
  556. case 0: /* l3 */
  557. case 8: /* dss1 */
  558. case 15: /* vylnc-2420 */
  559. case 20: /* ssi */
  560. mask = 0x1f; break;
  561. case 5: /* l4 */
  562. mask = 0x3; break;
  563. case 13: /* dss2 */
  564. mask = 0x1; break;
  565. case 25: /* usb */
  566. mask = 0x7; break;
  567. }
  568. }
  569. *field_mask = mask;
  570. if (unlikely(mask == ~0))
  571. div_addr = 0;
  572. *div_sel = div_addr;
  573. if (unlikely(div_addr == 0))
  574. return ret;
  575. /* Isolate field */
  576. reg_val = __raw_readl((void __iomem *)div_addr) & (mask << div_off);
  577. /* Normalize back to divider value */
  578. reg_val >>= div_off;
  579. return reg_val;
  580. }
  581. /*
  582. * Return divider to be applied to parent clock.
  583. * Return 0 on error.
  584. */
  585. static u32 omap2_clksel_get_divisor(struct clk *clk)
  586. {
  587. int ret = 0;
  588. u32 div, div_sel, div_off, field_mask, field_val;
  589. /* isolate control register */
  590. div_sel = (SRC_RATE_SEL_MASK & clk->flags);
  591. div_off = clk->rate_offset;
  592. field_val = omap2_get_clksel(&div_sel, &field_mask, clk);
  593. if (div_sel == 0)
  594. return ret;
  595. div_sel = (SRC_RATE_SEL_MASK & clk->flags);
  596. div = omap2_clksel_to_divisor(div_sel, field_val);
  597. return div;
  598. }
  599. /* Set the clock rate for a clock source */
  600. static int omap2_clk_set_rate(struct clk *clk, unsigned long rate)
  601. {
  602. int ret = -EINVAL;
  603. void __iomem * reg;
  604. u32 div_sel, div_off, field_mask, field_val, reg_val, validrate;
  605. u32 new_div = 0;
  606. if (!(clk->flags & CONFIG_PARTICIPANT) && (clk->flags & RATE_CKCTL)) {
  607. if (clk == &dpll_ck)
  608. return omap2_reprogram_dpll(clk, rate);
  609. /* Isolate control register */
  610. div_sel = (SRC_RATE_SEL_MASK & clk->flags);
  611. div_off = clk->rate_offset;
  612. validrate = omap2_clksel_round_rate(clk, rate, &new_div);
  613. if (validrate != rate)
  614. return(ret);
  615. field_val = omap2_get_clksel(&div_sel, &field_mask, clk);
  616. if (div_sel == 0)
  617. return ret;
  618. if (clk->flags & CM_SYSCLKOUT_SEL1) {
  619. switch (new_div) {
  620. case 16:
  621. field_val = 4;
  622. break;
  623. case 8:
  624. field_val = 3;
  625. break;
  626. case 4:
  627. field_val = 2;
  628. break;
  629. case 2:
  630. field_val = 1;
  631. break;
  632. case 1:
  633. field_val = 0;
  634. break;
  635. }
  636. } else
  637. field_val = new_div;
  638. reg = (void __iomem *)div_sel;
  639. reg_val = __raw_readl(reg);
  640. reg_val &= ~(field_mask << div_off);
  641. reg_val |= (field_val << div_off);
  642. __raw_writel(reg_val, reg);
  643. wmb();
  644. clk->rate = clk->parent->rate / field_val;
  645. if (clk->flags & DELAYED_APP) {
  646. __raw_writel(0x1, (void __iomem *)&PRCM_CLKCFG_CTRL);
  647. wmb();
  648. }
  649. ret = 0;
  650. } else if (clk->set_rate != 0)
  651. ret = clk->set_rate(clk, rate);
  652. if (unlikely(ret == 0 && (clk->flags & RATE_PROPAGATES)))
  653. propagate_rate(clk);
  654. return ret;
  655. }
  656. /* Converts encoded control register address into a full address */
  657. static u32 omap2_get_src_field(u32 *type_to_addr, u32 reg_offset,
  658. struct clk *src_clk, u32 *field_mask)
  659. {
  660. u32 val = ~0, src_reg_addr = 0, mask = 0;
  661. /* Find target control register.*/
  662. switch ((*type_to_addr & SRC_RATE_SEL_MASK)) {
  663. case CM_CORE_SEL1:
  664. src_reg_addr = (u32)&CM_CLKSEL1_CORE;
  665. if (reg_offset == 13) { /* DSS2_fclk */
  666. mask = 0x1;
  667. if (src_clk == &sys_ck)
  668. val = 0;
  669. if (src_clk == &func_48m_ck)
  670. val = 1;
  671. } else if (reg_offset == 8) { /* DSS1_fclk */
  672. mask = 0x1f;
  673. if (src_clk == &sys_ck)
  674. val = 0;
  675. else if (src_clk == &core_ck) /* divided clock */
  676. val = 0x10; /* rate needs fixing */
  677. } else if ((reg_offset == 15) && cpu_is_omap2420()){ /*vlnyq*/
  678. mask = 0x1F;
  679. if(src_clk == &func_96m_ck)
  680. val = 0;
  681. else if (src_clk == &core_ck)
  682. val = 0x10;
  683. }
  684. break;
  685. case CM_CORE_SEL2:
  686. src_reg_addr = (u32)&CM_CLKSEL2_CORE;
  687. mask = 0x3;
  688. if (src_clk == &func_32k_ck)
  689. val = 0x0;
  690. if (src_clk == &sys_ck)
  691. val = 0x1;
  692. if (src_clk == &alt_ck)
  693. val = 0x2;
  694. break;
  695. case CM_WKUP_SEL1:
  696. src_reg_addr = (u32)&CM_CLKSEL_WKUP;
  697. mask = 0x3;
  698. if (src_clk == &func_32k_ck)
  699. val = 0x0;
  700. if (src_clk == &sys_ck)
  701. val = 0x1;
  702. if (src_clk == &alt_ck)
  703. val = 0x2;
  704. break;
  705. case CM_PLL_SEL1:
  706. src_reg_addr = (u32)&CM_CLKSEL1_PLL;
  707. mask = 0x1;
  708. if (reg_offset == 0x3) {
  709. if (src_clk == &apll96_ck)
  710. val = 0;
  711. if (src_clk == &alt_ck)
  712. val = 1;
  713. }
  714. else if (reg_offset == 0x5) {
  715. if (src_clk == &apll54_ck)
  716. val = 0;
  717. if (src_clk == &alt_ck)
  718. val = 1;
  719. }
  720. break;
  721. case CM_PLL_SEL2:
  722. src_reg_addr = (u32)&CM_CLKSEL2_PLL;
  723. mask = 0x3;
  724. if (src_clk == &func_32k_ck)
  725. val = 0x0;
  726. if (src_clk == &dpll_ck)
  727. val = 0x2;
  728. break;
  729. case CM_SYSCLKOUT_SEL1:
  730. src_reg_addr = (u32)&PRCM_CLKOUT_CTRL;
  731. mask = 0x3;
  732. if (src_clk == &dpll_ck)
  733. val = 0;
  734. if (src_clk == &sys_ck)
  735. val = 1;
  736. if (src_clk == &func_96m_ck)
  737. val = 2;
  738. if (src_clk == &func_54m_ck)
  739. val = 3;
  740. break;
  741. }
  742. if (val == ~0) /* Catch errors in offset */
  743. *type_to_addr = 0;
  744. else
  745. *type_to_addr = src_reg_addr;
  746. *field_mask = mask;
  747. return val;
  748. }
  749. static int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
  750. {
  751. void __iomem * reg;
  752. u32 src_sel, src_off, field_val, field_mask, reg_val, rate;
  753. int ret = -EINVAL;
  754. if (unlikely(clk->flags & CONFIG_PARTICIPANT))
  755. return ret;
  756. if (clk->flags & SRC_SEL_MASK) { /* On-chip SEL collection */
  757. src_sel = (SRC_RATE_SEL_MASK & clk->flags);
  758. src_off = clk->src_offset;
  759. if (src_sel == 0)
  760. goto set_parent_error;
  761. field_val = omap2_get_src_field(&src_sel, src_off, new_parent,
  762. &field_mask);
  763. reg = (void __iomem *)src_sel;
  764. if (clk->usecount > 0)
  765. _omap2_clk_disable(clk);
  766. /* Set new source value (previous dividers if any in effect) */
  767. reg_val = __raw_readl(reg) & ~(field_mask << src_off);
  768. reg_val |= (field_val << src_off);
  769. __raw_writel(reg_val, reg);
  770. wmb();
  771. if (clk->flags & DELAYED_APP) {
  772. __raw_writel(0x1, (void __iomem *)&PRCM_CLKCFG_CTRL);
  773. wmb();
  774. }
  775. if (clk->usecount > 0)
  776. _omap2_clk_enable(clk);
  777. clk->parent = new_parent;
  778. /* SRC_RATE_SEL_MASK clocks follow their parents rates.*/
  779. if ((new_parent == &core_ck) && (clk == &dss1_fck))
  780. clk->rate = new_parent->rate / 0x10;
  781. else
  782. clk->rate = new_parent->rate;
  783. if (unlikely(clk->flags & RATE_PROPAGATES))
  784. propagate_rate(clk);
  785. return 0;
  786. } else {
  787. clk->parent = new_parent;
  788. rate = new_parent->rate;
  789. omap2_clk_set_rate(clk, rate);
  790. ret = 0;
  791. }
  792. set_parent_error:
  793. return ret;
  794. }
  795. /* Sets basic clocks based on the specified rate */
  796. static int omap2_select_table_rate(struct clk * clk, unsigned long rate)
  797. {
  798. u32 flags, cur_rate, done_rate, bypass = 0;
  799. u8 cpu_mask = 0;
  800. struct prcm_config *prcm;
  801. unsigned long found_speed = 0;
  802. if (clk != &virt_prcm_set)
  803. return -EINVAL;
  804. /* FIXME: Change cpu_is_omap2420() to cpu_is_omap242x() */
  805. if (cpu_is_omap2420())
  806. cpu_mask = RATE_IN_242X;
  807. else if (cpu_is_omap2430())
  808. cpu_mask = RATE_IN_243X;
  809. for (prcm = rate_table; prcm->mpu_speed; prcm++) {
  810. if (!(prcm->flags & cpu_mask))
  811. continue;
  812. if (prcm->xtal_speed != sys_ck.rate)
  813. continue;
  814. if (prcm->mpu_speed <= rate) {
  815. found_speed = prcm->mpu_speed;
  816. break;
  817. }
  818. }
  819. if (!found_speed) {
  820. printk(KERN_INFO "Could not set MPU rate to %luMHz\n",
  821. rate / 1000000);
  822. return -EINVAL;
  823. }
  824. curr_prcm_set = prcm;
  825. cur_rate = omap2_get_dpll_rate(&dpll_ck);
  826. if (prcm->dpll_speed == cur_rate / 2) {
  827. omap2_reprogram_sdrc(PRCM_HALF_SPEED, 1);
  828. } else if (prcm->dpll_speed == cur_rate * 2) {
  829. omap2_reprogram_sdrc(PRCM_FULL_SPEED, 1);
  830. } else if (prcm->dpll_speed != cur_rate) {
  831. local_irq_save(flags);
  832. if (prcm->dpll_speed == prcm->xtal_speed)
  833. bypass = 1;
  834. if ((prcm->cm_clksel2_pll & 0x3) == 2)
  835. done_rate = PRCM_FULL_SPEED;
  836. else
  837. done_rate = PRCM_HALF_SPEED;
  838. /* MPU divider */
  839. CM_CLKSEL_MPU = prcm->cm_clksel_mpu;
  840. /* dsp + iva1 div(2420), iva2.1(2430) */
  841. CM_CLKSEL_DSP = prcm->cm_clksel_dsp;
  842. CM_CLKSEL_GFX = prcm->cm_clksel_gfx;
  843. /* Major subsystem dividers */
  844. CM_CLKSEL1_CORE = prcm->cm_clksel1_core;
  845. if (cpu_is_omap2430())
  846. CM_CLKSEL_MDM = prcm->cm_clksel_mdm;
  847. /* x2 to enter init_mem */
  848. omap2_reprogram_sdrc(PRCM_FULL_SPEED, 1);
  849. omap2_set_prcm(prcm->cm_clksel1_pll, prcm->base_sdrc_rfr,
  850. bypass);
  851. omap2_init_memory_params(omap2_dll_force_needed());
  852. omap2_reprogram_sdrc(done_rate, 0);
  853. local_irq_restore(flags);
  854. }
  855. omap2_clksel_recalc(&dpll_ck);
  856. return 0;
  857. }
  858. /*-------------------------------------------------------------------------
  859. * Omap2 clock reset and init functions
  860. *-------------------------------------------------------------------------*/
  861. #ifdef CONFIG_OMAP_RESET_CLOCKS
  862. static void __init omap2_clk_disable_unused(struct clk *clk)
  863. {
  864. u32 regval32;
  865. regval32 = __raw_readl(clk->enable_reg);
  866. if ((regval32 & (1 << clk->enable_bit)) == 0)
  867. return;
  868. printk(KERN_INFO "Disabling unused clock \"%s\"\n", clk->name);
  869. _omap2_clk_disable(clk);
  870. }
  871. #else
  872. #define omap2_clk_disable_unused NULL
  873. #endif
  874. static struct clk_functions omap2_clk_functions = {
  875. .clk_enable = omap2_clk_enable,
  876. .clk_disable = omap2_clk_disable,
  877. .clk_round_rate = omap2_clk_round_rate,
  878. .clk_set_rate = omap2_clk_set_rate,
  879. .clk_set_parent = omap2_clk_set_parent,
  880. .clk_disable_unused = omap2_clk_disable_unused,
  881. };
  882. static void __init omap2_get_crystal_rate(struct clk *osc, struct clk *sys)
  883. {
  884. u32 div, aplls, sclk = 13000000;
  885. aplls = CM_CLKSEL1_PLL;
  886. aplls &= ((1 << 23) | (1 << 24) | (1 << 25));
  887. aplls >>= 23; /* Isolate field, 0,2,3 */
  888. if (aplls == 0)
  889. sclk = 19200000;
  890. else if (aplls == 2)
  891. sclk = 13000000;
  892. else if (aplls == 3)
  893. sclk = 12000000;
  894. div = PRCM_CLKSRC_CTRL;
  895. div &= ((1 << 7) | (1 << 6));
  896. div >>= sys->rate_offset;
  897. osc->rate = sclk * div;
  898. sys->rate = sclk;
  899. }
  900. /*
  901. * Set clocks for bypass mode for reboot to work.
  902. */
  903. void omap2_clk_prepare_for_reboot(void)
  904. {
  905. u32 rate;
  906. if (vclk == NULL || sclk == NULL)
  907. return;
  908. rate = clk_get_rate(sclk);
  909. clk_set_rate(vclk, rate);
  910. }
  911. /*
  912. * Switch the MPU rate if specified on cmdline.
  913. * We cannot do this early until cmdline is parsed.
  914. */
  915. static int __init omap2_clk_arch_init(void)
  916. {
  917. if (!mpurate)
  918. return -EINVAL;
  919. if (omap2_select_table_rate(&virt_prcm_set, mpurate))
  920. printk(KERN_ERR "Could not find matching MPU rate\n");
  921. propagate_rate(&osc_ck); /* update main root fast */
  922. propagate_rate(&func_32k_ck); /* update main root slow */
  923. printk(KERN_INFO "Switched to new clocking rate (Crystal/DPLL/MPU): "
  924. "%ld.%01ld/%ld/%ld MHz\n",
  925. (sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
  926. (dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
  927. return 0;
  928. }
  929. arch_initcall(omap2_clk_arch_init);
  930. int __init omap2_clk_init(void)
  931. {
  932. struct prcm_config *prcm;
  933. struct clk ** clkp;
  934. u32 clkrate;
  935. clk_init(&omap2_clk_functions);
  936. omap2_get_crystal_rate(&osc_ck, &sys_ck);
  937. for (clkp = onchip_clks; clkp < onchip_clks + ARRAY_SIZE(onchip_clks);
  938. clkp++) {
  939. if ((*clkp)->flags & CLOCK_IN_OMAP242X && cpu_is_omap2420()) {
  940. clk_register(*clkp);
  941. continue;
  942. }
  943. if ((*clkp)->flags & CLOCK_IN_OMAP243X && cpu_is_omap2430()) {
  944. clk_register(*clkp);
  945. continue;
  946. }
  947. }
  948. /* Check the MPU rate set by bootloader */
  949. clkrate = omap2_get_dpll_rate(&dpll_ck);
  950. for (prcm = rate_table; prcm->mpu_speed; prcm++) {
  951. if (prcm->xtal_speed != sys_ck.rate)
  952. continue;
  953. if (prcm->dpll_speed <= clkrate)
  954. break;
  955. }
  956. curr_prcm_set = prcm;
  957. propagate_rate(&osc_ck); /* update main root fast */
  958. propagate_rate(&func_32k_ck); /* update main root slow */
  959. printk(KERN_INFO "Clocking rate (Crystal/DPLL/MPU): "
  960. "%ld.%01ld/%ld/%ld MHz\n",
  961. (sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
  962. (dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
  963. /*
  964. * Only enable those clocks we will need, let the drivers
  965. * enable other clocks as necessary
  966. */
  967. clk_enable(&sync_32k_ick);
  968. clk_enable(&omapctrl_ick);
  969. /* Force the APLLs active during bootup to avoid disabling and
  970. * enabling them unnecessarily. */
  971. clk_enable(&apll96_ck);
  972. clk_enable(&apll54_ck);
  973. if (cpu_is_omap2430())
  974. clk_enable(&sdrc_ick);
  975. /* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
  976. vclk = clk_get(NULL, "virt_prcm_set");
  977. sclk = clk_get(NULL, "sys_ck");
  978. return 0;
  979. }
  980. static int __init omap2_disable_aplls(void)
  981. {
  982. clk_disable(&apll96_ck);
  983. clk_disable(&apll54_ck);
  984. return 0;
  985. }
  986. late_initcall(omap2_disable_aplls);