clock.c 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105
  1. /*
  2. * linux/arch/arm/mach-omap1/clock.c
  3. *
  4. * Copyright (C) 2004 - 2005, 2009-2010 Nokia Corporation
  5. * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
  6. *
  7. * Modified to use omap shared clock framework by
  8. * Tony Lindgren <tony@atomide.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. */
  14. #include <linux/kernel.h>
  15. #include <linux/export.h>
  16. #include <linux/list.h>
  17. #include <linux/errno.h>
  18. #include <linux/err.h>
  19. #include <linux/io.h>
  20. #include <linux/clk.h>
  21. #include <linux/clkdev.h>
  22. #include <asm/mach-types.h>
  23. #include <mach/hardware.h>
  24. #include "soc.h"
  25. #include "iomap.h"
  26. #include "clock.h"
  27. #include "opp.h"
  28. #include "sram.h"
  29. __u32 arm_idlect1_mask;
  30. struct clk *api_ck_p, *ck_dpll1_p, *ck_ref_p;
  31. static LIST_HEAD(clocks);
  32. static DEFINE_MUTEX(clocks_mutex);
  33. static DEFINE_SPINLOCK(clockfw_lock);
  34. /*
  35. * Omap1 specific clock functions
  36. */
  37. unsigned long omap1_uart_recalc(struct clk *clk)
  38. {
  39. unsigned int val = __raw_readl(clk->enable_reg);
  40. return val & clk->enable_bit ? 48000000 : 12000000;
  41. }
  42. unsigned long omap1_sossi_recalc(struct clk *clk)
  43. {
  44. u32 div = omap_readl(MOD_CONF_CTRL_1);
  45. div = (div >> 17) & 0x7;
  46. div++;
  47. return clk->parent->rate / div;
  48. }
  49. static void omap1_clk_allow_idle(struct clk *clk)
  50. {
  51. struct arm_idlect1_clk * iclk = (struct arm_idlect1_clk *)clk;
  52. if (!(clk->flags & CLOCK_IDLE_CONTROL))
  53. return;
  54. if (iclk->no_idle_count > 0 && !(--iclk->no_idle_count))
  55. arm_idlect1_mask |= 1 << iclk->idlect_shift;
  56. }
  57. static void omap1_clk_deny_idle(struct clk *clk)
  58. {
  59. struct arm_idlect1_clk * iclk = (struct arm_idlect1_clk *)clk;
  60. if (!(clk->flags & CLOCK_IDLE_CONTROL))
  61. return;
  62. if (iclk->no_idle_count++ == 0)
  63. arm_idlect1_mask &= ~(1 << iclk->idlect_shift);
  64. }
  65. static __u16 verify_ckctl_value(__u16 newval)
  66. {
  67. /* This function checks for following limitations set
  68. * by the hardware (all conditions must be true):
  69. * DSPMMU_CK == DSP_CK or DSPMMU_CK == DSP_CK/2
  70. * ARM_CK >= TC_CK
  71. * DSP_CK >= TC_CK
  72. * DSPMMU_CK >= TC_CK
  73. *
  74. * In addition following rules are enforced:
  75. * LCD_CK <= TC_CK
  76. * ARMPER_CK <= TC_CK
  77. *
  78. * However, maximum frequencies are not checked for!
  79. */
  80. __u8 per_exp;
  81. __u8 lcd_exp;
  82. __u8 arm_exp;
  83. __u8 dsp_exp;
  84. __u8 tc_exp;
  85. __u8 dspmmu_exp;
  86. per_exp = (newval >> CKCTL_PERDIV_OFFSET) & 3;
  87. lcd_exp = (newval >> CKCTL_LCDDIV_OFFSET) & 3;
  88. arm_exp = (newval >> CKCTL_ARMDIV_OFFSET) & 3;
  89. dsp_exp = (newval >> CKCTL_DSPDIV_OFFSET) & 3;
  90. tc_exp = (newval >> CKCTL_TCDIV_OFFSET) & 3;
  91. dspmmu_exp = (newval >> CKCTL_DSPMMUDIV_OFFSET) & 3;
  92. if (dspmmu_exp < dsp_exp)
  93. dspmmu_exp = dsp_exp;
  94. if (dspmmu_exp > dsp_exp+1)
  95. dspmmu_exp = dsp_exp+1;
  96. if (tc_exp < arm_exp)
  97. tc_exp = arm_exp;
  98. if (tc_exp < dspmmu_exp)
  99. tc_exp = dspmmu_exp;
  100. if (tc_exp > lcd_exp)
  101. lcd_exp = tc_exp;
  102. if (tc_exp > per_exp)
  103. per_exp = tc_exp;
  104. newval &= 0xf000;
  105. newval |= per_exp << CKCTL_PERDIV_OFFSET;
  106. newval |= lcd_exp << CKCTL_LCDDIV_OFFSET;
  107. newval |= arm_exp << CKCTL_ARMDIV_OFFSET;
  108. newval |= dsp_exp << CKCTL_DSPDIV_OFFSET;
  109. newval |= tc_exp << CKCTL_TCDIV_OFFSET;
  110. newval |= dspmmu_exp << CKCTL_DSPMMUDIV_OFFSET;
  111. return newval;
  112. }
  113. static int calc_dsor_exp(struct clk *clk, unsigned long rate)
  114. {
  115. /* Note: If target frequency is too low, this function will return 4,
  116. * which is invalid value. Caller must check for this value and act
  117. * accordingly.
  118. *
  119. * Note: This function does not check for following limitations set
  120. * by the hardware (all conditions must be true):
  121. * DSPMMU_CK == DSP_CK or DSPMMU_CK == DSP_CK/2
  122. * ARM_CK >= TC_CK
  123. * DSP_CK >= TC_CK
  124. * DSPMMU_CK >= TC_CK
  125. */
  126. unsigned long realrate;
  127. struct clk * parent;
  128. unsigned dsor_exp;
  129. parent = clk->parent;
  130. if (unlikely(parent == NULL))
  131. return -EIO;
  132. realrate = parent->rate;
  133. for (dsor_exp=0; dsor_exp<4; dsor_exp++) {
  134. if (realrate <= rate)
  135. break;
  136. realrate /= 2;
  137. }
  138. return dsor_exp;
  139. }
  140. unsigned long omap1_ckctl_recalc(struct clk *clk)
  141. {
  142. /* Calculate divisor encoded as 2-bit exponent */
  143. int dsor = 1 << (3 & (omap_readw(ARM_CKCTL) >> clk->rate_offset));
  144. return clk->parent->rate / dsor;
  145. }
  146. unsigned long omap1_ckctl_recalc_dsp_domain(struct clk *clk)
  147. {
  148. int dsor;
  149. /* Calculate divisor encoded as 2-bit exponent
  150. *
  151. * The clock control bits are in DSP domain,
  152. * so api_ck is needed for access.
  153. * Note that DSP_CKCTL virt addr = phys addr, so
  154. * we must use __raw_readw() instead of omap_readw().
  155. */
  156. omap1_clk_enable(api_ck_p);
  157. dsor = 1 << (3 & (__raw_readw(DSP_CKCTL) >> clk->rate_offset));
  158. omap1_clk_disable(api_ck_p);
  159. return clk->parent->rate / dsor;
  160. }
  161. /* MPU virtual clock functions */
  162. int omap1_select_table_rate(struct clk *clk, unsigned long rate)
  163. {
  164. /* Find the highest supported frequency <= rate and switch to it */
  165. struct mpu_rate * ptr;
  166. unsigned long ref_rate;
  167. ref_rate = ck_ref_p->rate;
  168. for (ptr = omap1_rate_table; ptr->rate; ptr++) {
  169. if (!(ptr->flags & cpu_mask))
  170. continue;
  171. if (ptr->xtal != ref_rate)
  172. continue;
  173. /* Can check only after xtal frequency check */
  174. if (ptr->rate <= rate)
  175. break;
  176. }
  177. if (!ptr->rate)
  178. return -EINVAL;
  179. /*
  180. * In most cases we should not need to reprogram DPLL.
  181. * Reprogramming the DPLL is tricky, it must be done from SRAM.
  182. */
  183. omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val);
  184. /* XXX Do we need to recalculate the tree below DPLL1 at this point? */
  185. ck_dpll1_p->rate = ptr->pll_rate;
  186. return 0;
  187. }
  188. int omap1_clk_set_rate_dsp_domain(struct clk *clk, unsigned long rate)
  189. {
  190. int dsor_exp;
  191. u16 regval;
  192. dsor_exp = calc_dsor_exp(clk, rate);
  193. if (dsor_exp > 3)
  194. dsor_exp = -EINVAL;
  195. if (dsor_exp < 0)
  196. return dsor_exp;
  197. regval = __raw_readw(DSP_CKCTL);
  198. regval &= ~(3 << clk->rate_offset);
  199. regval |= dsor_exp << clk->rate_offset;
  200. __raw_writew(regval, DSP_CKCTL);
  201. clk->rate = clk->parent->rate / (1 << dsor_exp);
  202. return 0;
  203. }
  204. long omap1_clk_round_rate_ckctl_arm(struct clk *clk, unsigned long rate)
  205. {
  206. int dsor_exp = calc_dsor_exp(clk, rate);
  207. if (dsor_exp < 0)
  208. return dsor_exp;
  209. if (dsor_exp > 3)
  210. dsor_exp = 3;
  211. return clk->parent->rate / (1 << dsor_exp);
  212. }
  213. int omap1_clk_set_rate_ckctl_arm(struct clk *clk, unsigned long rate)
  214. {
  215. int dsor_exp;
  216. u16 regval;
  217. dsor_exp = calc_dsor_exp(clk, rate);
  218. if (dsor_exp > 3)
  219. dsor_exp = -EINVAL;
  220. if (dsor_exp < 0)
  221. return dsor_exp;
  222. regval = omap_readw(ARM_CKCTL);
  223. regval &= ~(3 << clk->rate_offset);
  224. regval |= dsor_exp << clk->rate_offset;
  225. regval = verify_ckctl_value(regval);
  226. omap_writew(regval, ARM_CKCTL);
  227. clk->rate = clk->parent->rate / (1 << dsor_exp);
  228. return 0;
  229. }
  230. long omap1_round_to_table_rate(struct clk *clk, unsigned long rate)
  231. {
  232. /* Find the highest supported frequency <= rate */
  233. struct mpu_rate * ptr;
  234. long highest_rate;
  235. unsigned long ref_rate;
  236. ref_rate = ck_ref_p->rate;
  237. highest_rate = -EINVAL;
  238. for (ptr = omap1_rate_table; ptr->rate; ptr++) {
  239. if (!(ptr->flags & cpu_mask))
  240. continue;
  241. if (ptr->xtal != ref_rate)
  242. continue;
  243. highest_rate = ptr->rate;
  244. /* Can check only after xtal frequency check */
  245. if (ptr->rate <= rate)
  246. break;
  247. }
  248. return highest_rate;
  249. }
  250. static unsigned calc_ext_dsor(unsigned long rate)
  251. {
  252. unsigned dsor;
  253. /* MCLK and BCLK divisor selection is not linear:
  254. * freq = 96MHz / dsor
  255. *
  256. * RATIO_SEL range: dsor <-> RATIO_SEL
  257. * 0..6: (RATIO_SEL+2) <-> (dsor-2)
  258. * 6..48: (8+(RATIO_SEL-6)*2) <-> ((dsor-8)/2+6)
  259. * Minimum dsor is 2 and maximum is 96. Odd divisors starting from 9
  260. * can not be used.
  261. */
  262. for (dsor = 2; dsor < 96; ++dsor) {
  263. if ((dsor & 1) && dsor > 8)
  264. continue;
  265. if (rate >= 96000000 / dsor)
  266. break;
  267. }
  268. return dsor;
  269. }
  270. /* XXX Only needed on 1510 */
  271. int omap1_set_uart_rate(struct clk *clk, unsigned long rate)
  272. {
  273. unsigned int val;
  274. val = __raw_readl(clk->enable_reg);
  275. if (rate == 12000000)
  276. val &= ~(1 << clk->enable_bit);
  277. else if (rate == 48000000)
  278. val |= (1 << clk->enable_bit);
  279. else
  280. return -EINVAL;
  281. __raw_writel(val, clk->enable_reg);
  282. clk->rate = rate;
  283. return 0;
  284. }
  285. /* External clock (MCLK & BCLK) functions */
  286. int omap1_set_ext_clk_rate(struct clk *clk, unsigned long rate)
  287. {
  288. unsigned dsor;
  289. __u16 ratio_bits;
  290. dsor = calc_ext_dsor(rate);
  291. clk->rate = 96000000 / dsor;
  292. if (dsor > 8)
  293. ratio_bits = ((dsor - 8) / 2 + 6) << 2;
  294. else
  295. ratio_bits = (dsor - 2) << 2;
  296. ratio_bits |= __raw_readw(clk->enable_reg) & ~0xfd;
  297. __raw_writew(ratio_bits, clk->enable_reg);
  298. return 0;
  299. }
  300. int omap1_set_sossi_rate(struct clk *clk, unsigned long rate)
  301. {
  302. u32 l;
  303. int div;
  304. unsigned long p_rate;
  305. p_rate = clk->parent->rate;
  306. /* Round towards slower frequency */
  307. div = (p_rate + rate - 1) / rate;
  308. div--;
  309. if (div < 0 || div > 7)
  310. return -EINVAL;
  311. l = omap_readl(MOD_CONF_CTRL_1);
  312. l &= ~(7 << 17);
  313. l |= div << 17;
  314. omap_writel(l, MOD_CONF_CTRL_1);
  315. clk->rate = p_rate / (div + 1);
  316. return 0;
  317. }
  318. long omap1_round_ext_clk_rate(struct clk *clk, unsigned long rate)
  319. {
  320. return 96000000 / calc_ext_dsor(rate);
  321. }
  322. void omap1_init_ext_clk(struct clk *clk)
  323. {
  324. unsigned dsor;
  325. __u16 ratio_bits;
  326. /* Determine current rate and ensure clock is based on 96MHz APLL */
  327. ratio_bits = __raw_readw(clk->enable_reg) & ~1;
  328. __raw_writew(ratio_bits, clk->enable_reg);
  329. ratio_bits = (ratio_bits & 0xfc) >> 2;
  330. if (ratio_bits > 6)
  331. dsor = (ratio_bits - 6) * 2 + 8;
  332. else
  333. dsor = ratio_bits + 2;
  334. clk-> rate = 96000000 / dsor;
  335. }
  336. int omap1_clk_enable(struct clk *clk)
  337. {
  338. int ret = 0;
  339. if (clk->usecount++ == 0) {
  340. if (clk->parent) {
  341. ret = omap1_clk_enable(clk->parent);
  342. if (ret)
  343. goto err;
  344. if (clk->flags & CLOCK_NO_IDLE_PARENT)
  345. omap1_clk_deny_idle(clk->parent);
  346. }
  347. ret = clk->ops->enable(clk);
  348. if (ret) {
  349. if (clk->parent)
  350. omap1_clk_disable(clk->parent);
  351. goto err;
  352. }
  353. }
  354. return ret;
  355. err:
  356. clk->usecount--;
  357. return ret;
  358. }
  359. void omap1_clk_disable(struct clk *clk)
  360. {
  361. if (clk->usecount > 0 && !(--clk->usecount)) {
  362. clk->ops->disable(clk);
  363. if (likely(clk->parent)) {
  364. omap1_clk_disable(clk->parent);
  365. if (clk->flags & CLOCK_NO_IDLE_PARENT)
  366. omap1_clk_allow_idle(clk->parent);
  367. }
  368. }
  369. }
  370. static int omap1_clk_enable_generic(struct clk *clk)
  371. {
  372. __u16 regval16;
  373. __u32 regval32;
  374. if (unlikely(clk->enable_reg == NULL)) {
  375. printk(KERN_ERR "clock.c: Enable for %s without enable code\n",
  376. clk->name);
  377. return -EINVAL;
  378. }
  379. if (clk->flags & ENABLE_REG_32BIT) {
  380. regval32 = __raw_readl(clk->enable_reg);
  381. regval32 |= (1 << clk->enable_bit);
  382. __raw_writel(regval32, clk->enable_reg);
  383. } else {
  384. regval16 = __raw_readw(clk->enable_reg);
  385. regval16 |= (1 << clk->enable_bit);
  386. __raw_writew(regval16, clk->enable_reg);
  387. }
  388. return 0;
  389. }
  390. static void omap1_clk_disable_generic(struct clk *clk)
  391. {
  392. __u16 regval16;
  393. __u32 regval32;
  394. if (clk->enable_reg == NULL)
  395. return;
  396. if (clk->flags & ENABLE_REG_32BIT) {
  397. regval32 = __raw_readl(clk->enable_reg);
  398. regval32 &= ~(1 << clk->enable_bit);
  399. __raw_writel(regval32, clk->enable_reg);
  400. } else {
  401. regval16 = __raw_readw(clk->enable_reg);
  402. regval16 &= ~(1 << clk->enable_bit);
  403. __raw_writew(regval16, clk->enable_reg);
  404. }
  405. }
  406. const struct clkops clkops_generic = {
  407. .enable = omap1_clk_enable_generic,
  408. .disable = omap1_clk_disable_generic,
  409. };
  410. static int omap1_clk_enable_dsp_domain(struct clk *clk)
  411. {
  412. int retval;
  413. retval = omap1_clk_enable(api_ck_p);
  414. if (!retval) {
  415. retval = omap1_clk_enable_generic(clk);
  416. omap1_clk_disable(api_ck_p);
  417. }
  418. return retval;
  419. }
  420. static void omap1_clk_disable_dsp_domain(struct clk *clk)
  421. {
  422. if (omap1_clk_enable(api_ck_p) == 0) {
  423. omap1_clk_disable_generic(clk);
  424. omap1_clk_disable(api_ck_p);
  425. }
  426. }
  427. const struct clkops clkops_dspck = {
  428. .enable = omap1_clk_enable_dsp_domain,
  429. .disable = omap1_clk_disable_dsp_domain,
  430. };
  431. /* XXX SYSC register handling does not belong in the clock framework */
  432. static int omap1_clk_enable_uart_functional_16xx(struct clk *clk)
  433. {
  434. int ret;
  435. struct uart_clk *uclk;
  436. ret = omap1_clk_enable_generic(clk);
  437. if (ret == 0) {
  438. /* Set smart idle acknowledgement mode */
  439. uclk = (struct uart_clk *)clk;
  440. omap_writeb((omap_readb(uclk->sysc_addr) & ~0x10) | 8,
  441. uclk->sysc_addr);
  442. }
  443. return ret;
  444. }
  445. /* XXX SYSC register handling does not belong in the clock framework */
  446. static void omap1_clk_disable_uart_functional_16xx(struct clk *clk)
  447. {
  448. struct uart_clk *uclk;
  449. /* Set force idle acknowledgement mode */
  450. uclk = (struct uart_clk *)clk;
  451. omap_writeb((omap_readb(uclk->sysc_addr) & ~0x18), uclk->sysc_addr);
  452. omap1_clk_disable_generic(clk);
  453. }
  454. /* XXX SYSC register handling does not belong in the clock framework */
  455. const struct clkops clkops_uart_16xx = {
  456. .enable = omap1_clk_enable_uart_functional_16xx,
  457. .disable = omap1_clk_disable_uart_functional_16xx,
  458. };
  459. long omap1_clk_round_rate(struct clk *clk, unsigned long rate)
  460. {
  461. if (clk->round_rate != NULL)
  462. return clk->round_rate(clk, rate);
  463. return clk->rate;
  464. }
  465. int omap1_clk_set_rate(struct clk *clk, unsigned long rate)
  466. {
  467. int ret = -EINVAL;
  468. if (clk->set_rate)
  469. ret = clk->set_rate(clk, rate);
  470. return ret;
  471. }
  472. /*
  473. * Omap1 clock reset and init functions
  474. */
  475. #ifdef CONFIG_OMAP_RESET_CLOCKS
  476. void omap1_clk_disable_unused(struct clk *clk)
  477. {
  478. __u32 regval32;
  479. /* Clocks in the DSP domain need api_ck. Just assume bootloader
  480. * has not enabled any DSP clocks */
  481. if (clk->enable_reg == DSP_IDLECT2) {
  482. pr_info("Skipping reset check for DSP domain clock \"%s\"\n",
  483. clk->name);
  484. return;
  485. }
  486. /* Is the clock already disabled? */
  487. if (clk->flags & ENABLE_REG_32BIT)
  488. regval32 = __raw_readl(clk->enable_reg);
  489. else
  490. regval32 = __raw_readw(clk->enable_reg);
  491. if ((regval32 & (1 << clk->enable_bit)) == 0)
  492. return;
  493. printk(KERN_INFO "Disabling unused clock \"%s\"... ", clk->name);
  494. clk->ops->disable(clk);
  495. printk(" done\n");
  496. }
  497. #endif
  498. int clk_enable(struct clk *clk)
  499. {
  500. unsigned long flags;
  501. int ret;
  502. if (clk == NULL || IS_ERR(clk))
  503. return -EINVAL;
  504. spin_lock_irqsave(&clockfw_lock, flags);
  505. ret = omap1_clk_enable(clk);
  506. spin_unlock_irqrestore(&clockfw_lock, flags);
  507. return ret;
  508. }
  509. EXPORT_SYMBOL(clk_enable);
  510. void clk_disable(struct clk *clk)
  511. {
  512. unsigned long flags;
  513. if (clk == NULL || IS_ERR(clk))
  514. return;
  515. spin_lock_irqsave(&clockfw_lock, flags);
  516. if (clk->usecount == 0) {
  517. pr_err("Trying disable clock %s with 0 usecount\n",
  518. clk->name);
  519. WARN_ON(1);
  520. goto out;
  521. }
  522. omap1_clk_disable(clk);
  523. out:
  524. spin_unlock_irqrestore(&clockfw_lock, flags);
  525. }
  526. EXPORT_SYMBOL(clk_disable);
  527. unsigned long clk_get_rate(struct clk *clk)
  528. {
  529. unsigned long flags;
  530. unsigned long ret;
  531. if (clk == NULL || IS_ERR(clk))
  532. return 0;
  533. spin_lock_irqsave(&clockfw_lock, flags);
  534. ret = clk->rate;
  535. spin_unlock_irqrestore(&clockfw_lock, flags);
  536. return ret;
  537. }
  538. EXPORT_SYMBOL(clk_get_rate);
  539. /*
  540. * Optional clock functions defined in include/linux/clk.h
  541. */
  542. long clk_round_rate(struct clk *clk, unsigned long rate)
  543. {
  544. unsigned long flags;
  545. long ret;
  546. if (clk == NULL || IS_ERR(clk))
  547. return 0;
  548. spin_lock_irqsave(&clockfw_lock, flags);
  549. ret = omap1_clk_round_rate(clk, rate);
  550. spin_unlock_irqrestore(&clockfw_lock, flags);
  551. return ret;
  552. }
  553. EXPORT_SYMBOL(clk_round_rate);
  554. int clk_set_rate(struct clk *clk, unsigned long rate)
  555. {
  556. unsigned long flags;
  557. int ret = -EINVAL;
  558. if (clk == NULL || IS_ERR(clk))
  559. return ret;
  560. spin_lock_irqsave(&clockfw_lock, flags);
  561. ret = omap1_clk_set_rate(clk, rate);
  562. if (ret == 0)
  563. propagate_rate(clk);
  564. spin_unlock_irqrestore(&clockfw_lock, flags);
  565. return ret;
  566. }
  567. EXPORT_SYMBOL(clk_set_rate);
  568. int clk_set_parent(struct clk *clk, struct clk *parent)
  569. {
  570. WARN_ONCE(1, "clk_set_parent() not implemented for OMAP1\n");
  571. return -EINVAL;
  572. }
  573. EXPORT_SYMBOL(clk_set_parent);
  574. struct clk *clk_get_parent(struct clk *clk)
  575. {
  576. return clk->parent;
  577. }
  578. EXPORT_SYMBOL(clk_get_parent);
  579. /*
  580. * OMAP specific clock functions shared between omap1 and omap2
  581. */
  582. int __initdata mpurate;
  583. /*
  584. * By default we use the rate set by the bootloader.
  585. * You can override this with mpurate= cmdline option.
  586. */
  587. static int __init omap_clk_setup(char *str)
  588. {
  589. get_option(&str, &mpurate);
  590. if (!mpurate)
  591. return 1;
  592. if (mpurate < 1000)
  593. mpurate *= 1000000;
  594. return 1;
  595. }
  596. __setup("mpurate=", omap_clk_setup);
  597. /* Used for clocks that always have same value as the parent clock */
  598. unsigned long followparent_recalc(struct clk *clk)
  599. {
  600. return clk->parent->rate;
  601. }
  602. /*
  603. * Used for clocks that have the same value as the parent clock,
  604. * divided by some factor
  605. */
  606. unsigned long omap_fixed_divisor_recalc(struct clk *clk)
  607. {
  608. WARN_ON(!clk->fixed_div);
  609. return clk->parent->rate / clk->fixed_div;
  610. }
  611. void clk_reparent(struct clk *child, struct clk *parent)
  612. {
  613. list_del_init(&child->sibling);
  614. if (parent)
  615. list_add(&child->sibling, &parent->children);
  616. child->parent = parent;
  617. /* now do the debugfs renaming to reattach the child
  618. to the proper parent */
  619. }
  620. /* Propagate rate to children */
  621. void propagate_rate(struct clk *tclk)
  622. {
  623. struct clk *clkp;
  624. list_for_each_entry(clkp, &tclk->children, sibling) {
  625. if (clkp->recalc)
  626. clkp->rate = clkp->recalc(clkp);
  627. propagate_rate(clkp);
  628. }
  629. }
  630. static LIST_HEAD(root_clks);
  631. /**
  632. * recalculate_root_clocks - recalculate and propagate all root clocks
  633. *
  634. * Recalculates all root clocks (clocks with no parent), which if the
  635. * clock's .recalc is set correctly, should also propagate their rates.
  636. * Called at init.
  637. */
  638. void recalculate_root_clocks(void)
  639. {
  640. struct clk *clkp;
  641. list_for_each_entry(clkp, &root_clks, sibling) {
  642. if (clkp->recalc)
  643. clkp->rate = clkp->recalc(clkp);
  644. propagate_rate(clkp);
  645. }
  646. }
  647. /**
  648. * clk_preinit - initialize any fields in the struct clk before clk init
  649. * @clk: struct clk * to initialize
  650. *
  651. * Initialize any struct clk fields needed before normal clk initialization
  652. * can run. No return value.
  653. */
  654. void clk_preinit(struct clk *clk)
  655. {
  656. INIT_LIST_HEAD(&clk->children);
  657. }
  658. int clk_register(struct clk *clk)
  659. {
  660. if (clk == NULL || IS_ERR(clk))
  661. return -EINVAL;
  662. /*
  663. * trap out already registered clocks
  664. */
  665. if (clk->node.next || clk->node.prev)
  666. return 0;
  667. mutex_lock(&clocks_mutex);
  668. if (clk->parent)
  669. list_add(&clk->sibling, &clk->parent->children);
  670. else
  671. list_add(&clk->sibling, &root_clks);
  672. list_add(&clk->node, &clocks);
  673. if (clk->init)
  674. clk->init(clk);
  675. mutex_unlock(&clocks_mutex);
  676. return 0;
  677. }
  678. EXPORT_SYMBOL(clk_register);
  679. void clk_unregister(struct clk *clk)
  680. {
  681. if (clk == NULL || IS_ERR(clk))
  682. return;
  683. mutex_lock(&clocks_mutex);
  684. list_del(&clk->sibling);
  685. list_del(&clk->node);
  686. mutex_unlock(&clocks_mutex);
  687. }
  688. EXPORT_SYMBOL(clk_unregister);
  689. void clk_enable_init_clocks(void)
  690. {
  691. struct clk *clkp;
  692. list_for_each_entry(clkp, &clocks, node)
  693. if (clkp->flags & ENABLE_ON_INIT)
  694. clk_enable(clkp);
  695. }
  696. /**
  697. * omap_clk_get_by_name - locate OMAP struct clk by its name
  698. * @name: name of the struct clk to locate
  699. *
  700. * Locate an OMAP struct clk by its name. Assumes that struct clk
  701. * names are unique. Returns NULL if not found or a pointer to the
  702. * struct clk if found.
  703. */
  704. struct clk *omap_clk_get_by_name(const char *name)
  705. {
  706. struct clk *c;
  707. struct clk *ret = NULL;
  708. mutex_lock(&clocks_mutex);
  709. list_for_each_entry(c, &clocks, node) {
  710. if (!strcmp(c->name, name)) {
  711. ret = c;
  712. break;
  713. }
  714. }
  715. mutex_unlock(&clocks_mutex);
  716. return ret;
  717. }
  718. int omap_clk_enable_autoidle_all(void)
  719. {
  720. struct clk *c;
  721. unsigned long flags;
  722. spin_lock_irqsave(&clockfw_lock, flags);
  723. list_for_each_entry(c, &clocks, node)
  724. if (c->ops->allow_idle)
  725. c->ops->allow_idle(c);
  726. spin_unlock_irqrestore(&clockfw_lock, flags);
  727. return 0;
  728. }
  729. int omap_clk_disable_autoidle_all(void)
  730. {
  731. struct clk *c;
  732. unsigned long flags;
  733. spin_lock_irqsave(&clockfw_lock, flags);
  734. list_for_each_entry(c, &clocks, node)
  735. if (c->ops->deny_idle)
  736. c->ops->deny_idle(c);
  737. spin_unlock_irqrestore(&clockfw_lock, flags);
  738. return 0;
  739. }
  740. /*
  741. * Low level helpers
  742. */
  743. static int clkll_enable_null(struct clk *clk)
  744. {
  745. return 0;
  746. }
  747. static void clkll_disable_null(struct clk *clk)
  748. {
  749. }
  750. const struct clkops clkops_null = {
  751. .enable = clkll_enable_null,
  752. .disable = clkll_disable_null,
  753. };
  754. /*
  755. * Dummy clock
  756. *
  757. * Used for clock aliases that are needed on some OMAPs, but not others
  758. */
  759. struct clk dummy_ck = {
  760. .name = "dummy",
  761. .ops = &clkops_null,
  762. };
  763. /*
  764. *
  765. */
  766. #ifdef CONFIG_OMAP_RESET_CLOCKS
  767. /*
  768. * Disable any unused clocks left on by the bootloader
  769. */
  770. static int __init clk_disable_unused(void)
  771. {
  772. struct clk *ck;
  773. unsigned long flags;
  774. pr_info("clock: disabling unused clocks to save power\n");
  775. spin_lock_irqsave(&clockfw_lock, flags);
  776. list_for_each_entry(ck, &clocks, node) {
  777. if (ck->ops == &clkops_null)
  778. continue;
  779. if (ck->usecount > 0 || !ck->enable_reg)
  780. continue;
  781. omap1_clk_disable_unused(ck);
  782. }
  783. spin_unlock_irqrestore(&clockfw_lock, flags);
  784. return 0;
  785. }
  786. late_initcall(clk_disable_unused);
  787. late_initcall(omap_clk_enable_autoidle_all);
  788. #endif
  789. #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
  790. /*
  791. * debugfs support to trace clock tree hierarchy and attributes
  792. */
  793. #include <linux/debugfs.h>
  794. #include <linux/seq_file.h>
  795. static struct dentry *clk_debugfs_root;
  796. static int clk_dbg_show_summary(struct seq_file *s, void *unused)
  797. {
  798. struct clk *c;
  799. struct clk *pa;
  800. mutex_lock(&clocks_mutex);
  801. seq_printf(s, "%-30s %-30s %-10s %s\n",
  802. "clock-name", "parent-name", "rate", "use-count");
  803. list_for_each_entry(c, &clocks, node) {
  804. pa = c->parent;
  805. seq_printf(s, "%-30s %-30s %-10lu %d\n",
  806. c->name, pa ? pa->name : "none", c->rate,
  807. c->usecount);
  808. }
  809. mutex_unlock(&clocks_mutex);
  810. return 0;
  811. }
  812. static int clk_dbg_open(struct inode *inode, struct file *file)
  813. {
  814. return single_open(file, clk_dbg_show_summary, inode->i_private);
  815. }
  816. static const struct file_operations debug_clock_fops = {
  817. .open = clk_dbg_open,
  818. .read = seq_read,
  819. .llseek = seq_lseek,
  820. .release = single_release,
  821. };
  822. static int clk_debugfs_register_one(struct clk *c)
  823. {
  824. int err;
  825. struct dentry *d;
  826. struct clk *pa = c->parent;
  827. d = debugfs_create_dir(c->name, pa ? pa->dent : clk_debugfs_root);
  828. if (!d)
  829. return -ENOMEM;
  830. c->dent = d;
  831. d = debugfs_create_u8("usecount", S_IRUGO, c->dent, &c->usecount);
  832. if (!d) {
  833. err = -ENOMEM;
  834. goto err_out;
  835. }
  836. d = debugfs_create_ulong("rate", S_IRUGO, c->dent, &c->rate);
  837. if (!d) {
  838. err = -ENOMEM;
  839. goto err_out;
  840. }
  841. d = debugfs_create_x8("flags", S_IRUGO, c->dent, &c->flags);
  842. if (!d) {
  843. err = -ENOMEM;
  844. goto err_out;
  845. }
  846. return 0;
  847. err_out:
  848. debugfs_remove_recursive(c->dent);
  849. return err;
  850. }
  851. static int clk_debugfs_register(struct clk *c)
  852. {
  853. int err;
  854. struct clk *pa = c->parent;
  855. if (pa && !pa->dent) {
  856. err = clk_debugfs_register(pa);
  857. if (err)
  858. return err;
  859. }
  860. if (!c->dent) {
  861. err = clk_debugfs_register_one(c);
  862. if (err)
  863. return err;
  864. }
  865. return 0;
  866. }
  867. static int __init clk_debugfs_init(void)
  868. {
  869. struct clk *c;
  870. struct dentry *d;
  871. int err;
  872. d = debugfs_create_dir("clock", NULL);
  873. if (!d)
  874. return -ENOMEM;
  875. clk_debugfs_root = d;
  876. list_for_each_entry(c, &clocks, node) {
  877. err = clk_debugfs_register(c);
  878. if (err)
  879. goto err_out;
  880. }
  881. d = debugfs_create_file("summary", S_IRUGO,
  882. d, NULL, &debug_clock_fops);
  883. if (!d)
  884. return -ENOMEM;
  885. return 0;
  886. err_out:
  887. debugfs_remove_recursive(clk_debugfs_root);
  888. return err;
  889. }
  890. late_initcall(clk_debugfs_init);
  891. #endif /* defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) */