clock.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  1. /*
  2. * arch/arm/mach-pnx4008/clock.c
  3. *
  4. * Clock control driver for PNX4008
  5. *
  6. * Authors: Vitaly Wool, Dmitry Chigirev <source@mvista.com>
  7. * Generic clock management functions are partially based on:
  8. * linux/arch/arm/mach-omap/clock.c
  9. *
  10. * 2005-2006 (c) MontaVista Software, Inc. This file is licensed under
  11. * the terms of the GNU General Public License version 2. This program
  12. * is licensed "as is" without any warranty of any kind, whether express
  13. * or implied.
  14. */
  15. #include <linux/module.h>
  16. #include <linux/kernel.h>
  17. #include <linux/list.h>
  18. #include <linux/errno.h>
  19. #include <linux/device.h>
  20. #include <linux/err.h>
  21. #include <linux/delay.h>
  22. #include <linux/io.h>
  23. #include <linux/clkdev.h>
  24. #include <mach/hardware.h>
  25. #include <mach/clock.h>
  26. #include "clock.h"
  27. /*forward declaration*/
  28. static struct clk per_ck;
  29. static struct clk hclk_ck;
  30. static struct clk ck_1MHz;
  31. static struct clk ck_13MHz;
  32. static struct clk ck_pll1;
  33. static int local_set_rate(struct clk *clk, u32 rate);
  34. static inline void clock_lock(void)
  35. {
  36. local_irq_disable();
  37. }
  38. static inline void clock_unlock(void)
  39. {
  40. local_irq_enable();
  41. }
  42. static void propagate_rate(struct clk *clk)
  43. {
  44. struct clk *tmp_clk;
  45. tmp_clk = clk;
  46. while (tmp_clk->propagate_next) {
  47. tmp_clk = tmp_clk->propagate_next;
  48. local_set_rate(tmp_clk, tmp_clk->user_rate);
  49. }
  50. }
  51. static void clk_reg_disable(struct clk *clk)
  52. {
  53. if (clk->enable_reg)
  54. __raw_writel(__raw_readl(clk->enable_reg) &
  55. ~(1 << clk->enable_shift), clk->enable_reg);
  56. }
  57. static int clk_reg_enable(struct clk *clk)
  58. {
  59. if (clk->enable_reg)
  60. __raw_writel(__raw_readl(clk->enable_reg) |
  61. (1 << clk->enable_shift), clk->enable_reg);
  62. return 0;
  63. }
  64. static inline void clk_reg_disable1(struct clk *clk)
  65. {
  66. if (clk->enable_reg1)
  67. __raw_writel(__raw_readl(clk->enable_reg1) &
  68. ~(1 << clk->enable_shift1), clk->enable_reg1);
  69. }
  70. static inline void clk_reg_enable1(struct clk *clk)
  71. {
  72. if (clk->enable_reg1)
  73. __raw_writel(__raw_readl(clk->enable_reg1) |
  74. (1 << clk->enable_shift1), clk->enable_reg1);
  75. }
  76. static int clk_wait_for_pll_lock(struct clk *clk)
  77. {
  78. int i;
  79. i = 0;
  80. while (i++ < 0xFFF && !(__raw_readl(clk->scale_reg) & 1)) ; /*wait for PLL to lock */
  81. if (!(__raw_readl(clk->scale_reg) & 1)) {
  82. printk(KERN_ERR
  83. "%s ERROR: failed to lock, scale reg data: %x\n",
  84. clk->name, __raw_readl(clk->scale_reg));
  85. return -1;
  86. }
  87. return 0;
  88. }
  89. static int switch_to_dirty_13mhz(struct clk *clk)
  90. {
  91. int i;
  92. int ret;
  93. u32 tmp_reg;
  94. ret = 0;
  95. if (!clk->rate)
  96. clk_reg_enable1(clk);
  97. tmp_reg = __raw_readl(clk->parent_switch_reg);
  98. /*if 13Mhz clock selected, select 13'MHz (dirty) source from OSC */
  99. if (!(tmp_reg & 1)) {
  100. tmp_reg |= (1 << 1); /* Trigger switch to 13'MHz (dirty) clock */
  101. __raw_writel(tmp_reg, clk->parent_switch_reg);
  102. i = 0;
  103. while (i++ < 0xFFF && !(__raw_readl(clk->parent_switch_reg) & 1)) ; /*wait for 13'MHz selection status */
  104. if (!(__raw_readl(clk->parent_switch_reg) & 1)) {
  105. printk(KERN_ERR
  106. "%s ERROR: failed to select 13'MHz, parent sw reg data: %x\n",
  107. clk->name, __raw_readl(clk->parent_switch_reg));
  108. ret = -1;
  109. }
  110. }
  111. if (!clk->rate)
  112. clk_reg_disable1(clk);
  113. return ret;
  114. }
  115. static int switch_to_clean_13mhz(struct clk *clk)
  116. {
  117. int i;
  118. int ret;
  119. u32 tmp_reg;
  120. ret = 0;
  121. if (!clk->rate)
  122. clk_reg_enable1(clk);
  123. tmp_reg = __raw_readl(clk->parent_switch_reg);
  124. /*if 13'Mhz clock selected, select 13MHz (clean) source from OSC */
  125. if (tmp_reg & 1) {
  126. tmp_reg &= ~(1 << 1); /* Trigger switch to 13MHz (clean) clock */
  127. __raw_writel(tmp_reg, clk->parent_switch_reg);
  128. i = 0;
  129. while (i++ < 0xFFF && (__raw_readl(clk->parent_switch_reg) & 1)) ; /*wait for 13MHz selection status */
  130. if (__raw_readl(clk->parent_switch_reg) & 1) {
  131. printk(KERN_ERR
  132. "%s ERROR: failed to select 13MHz, parent sw reg data: %x\n",
  133. clk->name, __raw_readl(clk->parent_switch_reg));
  134. ret = -1;
  135. }
  136. }
  137. if (!clk->rate)
  138. clk_reg_disable1(clk);
  139. return ret;
  140. }
  141. static int set_13MHz_parent(struct clk *clk, struct clk *parent)
  142. {
  143. int ret = -EINVAL;
  144. if (parent == &ck_13MHz)
  145. ret = switch_to_clean_13mhz(clk);
  146. else if (parent == &ck_pll1)
  147. ret = switch_to_dirty_13mhz(clk);
  148. return ret;
  149. }
  150. #define PLL160_MIN_FCCO 156000
  151. #define PLL160_MAX_FCCO 320000
  152. /*
  153. * Calculate pll160 settings.
  154. * Possible input: up to 320MHz with step of clk->parent->rate.
  155. * In PNX4008 parent rate for pll160s may be either 1 or 13MHz.
  156. * Ignored paths: "feedback" (bit 13 set), "div-by-N".
  157. * Setting ARM PLL4 rate to 0 will put CPU into direct run mode.
  158. * Setting PLL5 and PLL3 rate to 0 will disable USB and DSP clock input.
  159. * Please refer to PNX4008 IC manual for details.
  160. */
  161. static int pll160_set_rate(struct clk *clk, u32 rate)
  162. {
  163. u32 tmp_reg, tmp_m, tmp_2p, i;
  164. u32 parent_rate;
  165. int ret = -EINVAL;
  166. parent_rate = clk->parent->rate;
  167. if (!parent_rate)
  168. goto out;
  169. /* set direct run for ARM or disable output for others */
  170. clk_reg_disable(clk);
  171. /* disable source input as well (ignored for ARM) */
  172. clk_reg_disable1(clk);
  173. tmp_reg = __raw_readl(clk->scale_reg);
  174. tmp_reg &= ~0x1ffff; /*clear all settings, power down */
  175. __raw_writel(tmp_reg, clk->scale_reg);
  176. rate -= rate % parent_rate; /*round down the input */
  177. if (rate > PLL160_MAX_FCCO)
  178. rate = PLL160_MAX_FCCO;
  179. if (!rate) {
  180. clk->rate = 0;
  181. ret = 0;
  182. goto out;
  183. }
  184. clk_reg_enable1(clk);
  185. tmp_reg = __raw_readl(clk->scale_reg);
  186. if (rate == parent_rate) {
  187. /*enter direct bypass mode */
  188. tmp_reg |= ((1 << 14) | (1 << 15));
  189. __raw_writel(tmp_reg, clk->scale_reg);
  190. clk->rate = parent_rate;
  191. clk_reg_enable(clk);
  192. ret = 0;
  193. goto out;
  194. }
  195. i = 0;
  196. for (tmp_2p = 1; tmp_2p < 16; tmp_2p <<= 1) {
  197. if (rate * tmp_2p >= PLL160_MIN_FCCO)
  198. break;
  199. i++;
  200. }
  201. if (tmp_2p > 1)
  202. tmp_reg |= ((i - 1) << 11);
  203. else
  204. tmp_reg |= (1 << 14); /*direct mode, no divide */
  205. tmp_m = rate * tmp_2p;
  206. tmp_m /= parent_rate;
  207. tmp_reg |= (tmp_m - 1) << 1; /*calculate M */
  208. tmp_reg |= (1 << 16); /*power up PLL */
  209. __raw_writel(tmp_reg, clk->scale_reg);
  210. if (clk_wait_for_pll_lock(clk) < 0) {
  211. clk_reg_disable(clk);
  212. clk_reg_disable1(clk);
  213. tmp_reg = __raw_readl(clk->scale_reg);
  214. tmp_reg &= ~0x1ffff; /*clear all settings, power down */
  215. __raw_writel(tmp_reg, clk->scale_reg);
  216. clk->rate = 0;
  217. ret = -EFAULT;
  218. goto out;
  219. }
  220. clk->rate = (tmp_m * parent_rate) / tmp_2p;
  221. if (clk->flags & RATE_PROPAGATES)
  222. propagate_rate(clk);
  223. clk_reg_enable(clk);
  224. ret = 0;
  225. out:
  226. return ret;
  227. }
  228. /*configure PER_CLK*/
  229. static int per_clk_set_rate(struct clk *clk, u32 rate)
  230. {
  231. u32 tmp;
  232. tmp = __raw_readl(clk->scale_reg);
  233. tmp &= ~(0x1f << 2);
  234. tmp |= ((clk->parent->rate / clk->rate) - 1) << 2;
  235. __raw_writel(tmp, clk->scale_reg);
  236. clk->rate = rate;
  237. return 0;
  238. }
  239. /*configure HCLK*/
  240. static int hclk_set_rate(struct clk *clk, u32 rate)
  241. {
  242. u32 tmp;
  243. tmp = __raw_readl(clk->scale_reg);
  244. tmp = tmp & ~0x3;
  245. switch (rate) {
  246. case 1:
  247. break;
  248. case 2:
  249. tmp |= 1;
  250. break;
  251. case 4:
  252. tmp |= 2;
  253. break;
  254. }
  255. __raw_writel(tmp, clk->scale_reg);
  256. clk->rate = rate;
  257. return 0;
  258. }
  259. static u32 hclk_round_rate(struct clk *clk, u32 rate)
  260. {
  261. switch (rate) {
  262. case 1:
  263. case 4:
  264. return rate;
  265. }
  266. return 2;
  267. }
  268. static u32 per_clk_round_rate(struct clk *clk, u32 rate)
  269. {
  270. return CLK_RATE_13MHZ;
  271. }
  272. static int on_off_set_rate(struct clk *clk, u32 rate)
  273. {
  274. if (rate) {
  275. clk_reg_enable(clk);
  276. clk->rate = 1;
  277. } else {
  278. clk_reg_disable(clk);
  279. clk->rate = 0;
  280. }
  281. return 0;
  282. }
  283. static int on_off_inv_set_rate(struct clk *clk, u32 rate)
  284. {
  285. if (rate) {
  286. clk_reg_disable(clk); /*enable bit is inverted */
  287. clk->rate = 1;
  288. } else {
  289. clk_reg_enable(clk);
  290. clk->rate = 0;
  291. }
  292. return 0;
  293. }
  294. static u32 on_off_round_rate(struct clk *clk, u32 rate)
  295. {
  296. return (rate ? 1 : 0);
  297. }
  298. static u32 pll4_round_rate(struct clk *clk, u32 rate)
  299. {
  300. if (rate > CLK_RATE_208MHZ)
  301. rate = CLK_RATE_208MHZ;
  302. if (rate == CLK_RATE_208MHZ && hclk_ck.user_rate == 1)
  303. rate = CLK_RATE_208MHZ - CLK_RATE_13MHZ;
  304. return (rate - (rate % (hclk_ck.user_rate * CLK_RATE_13MHZ)));
  305. }
  306. static u32 pll3_round_rate(struct clk *clk, u32 rate)
  307. {
  308. if (rate > CLK_RATE_208MHZ)
  309. rate = CLK_RATE_208MHZ;
  310. return (rate - rate % CLK_RATE_13MHZ);
  311. }
  312. static u32 pll5_round_rate(struct clk *clk, u32 rate)
  313. {
  314. return (rate ? CLK_RATE_48MHZ : 0);
  315. }
  316. static u32 ck_13MHz_round_rate(struct clk *clk, u32 rate)
  317. {
  318. return (rate ? CLK_RATE_13MHZ : 0);
  319. }
  320. static int ck_13MHz_set_rate(struct clk *clk, u32 rate)
  321. {
  322. if (rate) {
  323. clk_reg_disable(clk); /*enable bit is inverted */
  324. udelay(500);
  325. clk->rate = CLK_RATE_13MHZ;
  326. ck_1MHz.rate = CLK_RATE_1MHZ;
  327. } else {
  328. clk_reg_enable(clk);
  329. clk->rate = 0;
  330. ck_1MHz.rate = 0;
  331. }
  332. return 0;
  333. }
  334. static int pll1_set_rate(struct clk *clk, u32 rate)
  335. {
  336. #if 0 /* doesn't work on some boards, probably a HW BUG */
  337. if (rate) {
  338. clk_reg_disable(clk); /*enable bit is inverted */
  339. if (!clk_wait_for_pll_lock(clk)) {
  340. clk->rate = CLK_RATE_13MHZ;
  341. } else {
  342. clk_reg_enable(clk);
  343. clk->rate = 0;
  344. }
  345. } else {
  346. clk_reg_enable(clk);
  347. clk->rate = 0;
  348. }
  349. #endif
  350. return 0;
  351. }
  352. /* Clock sources */
  353. static struct clk osc_13MHz = {
  354. .name = "osc_13MHz",
  355. .flags = FIXED_RATE,
  356. .rate = CLK_RATE_13MHZ,
  357. };
  358. static struct clk ck_13MHz = {
  359. .name = "ck_13MHz",
  360. .parent = &osc_13MHz,
  361. .flags = NEEDS_INITIALIZATION,
  362. .round_rate = &ck_13MHz_round_rate,
  363. .set_rate = &ck_13MHz_set_rate,
  364. .enable_reg = OSC13CTRL_REG,
  365. .enable_shift = 0,
  366. .rate = CLK_RATE_13MHZ,
  367. };
  368. static struct clk osc_32KHz = {
  369. .name = "osc_32KHz",
  370. .flags = FIXED_RATE,
  371. .rate = CLK_RATE_32KHZ,
  372. };
  373. /*attached to PLL5*/
  374. static struct clk ck_1MHz = {
  375. .name = "ck_1MHz",
  376. .flags = FIXED_RATE | PARENT_SET_RATE,
  377. .parent = &ck_13MHz,
  378. };
  379. /* PLL1 (397) - provides 13' MHz clock */
  380. static struct clk ck_pll1 = {
  381. .name = "ck_pll1",
  382. .parent = &osc_32KHz,
  383. .flags = NEEDS_INITIALIZATION,
  384. .round_rate = &ck_13MHz_round_rate,
  385. .set_rate = &pll1_set_rate,
  386. .enable_reg = PLLCTRL_REG,
  387. .enable_shift = 1,
  388. .scale_reg = PLLCTRL_REG,
  389. .rate = CLK_RATE_13MHZ,
  390. };
  391. /* CPU/Bus PLL */
  392. static struct clk ck_pll4 = {
  393. .name = "ck_pll4",
  394. .parent = &ck_pll1,
  395. .flags = RATE_PROPAGATES | NEEDS_INITIALIZATION,
  396. .propagate_next = &per_ck,
  397. .round_rate = &pll4_round_rate,
  398. .set_rate = &pll160_set_rate,
  399. .rate = CLK_RATE_208MHZ,
  400. .scale_reg = HCLKPLLCTRL_REG,
  401. .enable_reg = PWRCTRL_REG,
  402. .enable_shift = 2,
  403. .parent_switch_reg = SYSCLKCTRL_REG,
  404. .set_parent = &set_13MHz_parent,
  405. };
  406. /* USB PLL */
  407. static struct clk ck_pll5 = {
  408. .name = "ck_pll5",
  409. .parent = &ck_1MHz,
  410. .flags = NEEDS_INITIALIZATION,
  411. .round_rate = &pll5_round_rate,
  412. .set_rate = &pll160_set_rate,
  413. .scale_reg = USBCTRL_REG,
  414. .enable_reg = USBCTRL_REG,
  415. .enable_shift = 18,
  416. .enable_reg1 = USBCTRL_REG,
  417. .enable_shift1 = 17,
  418. };
  419. /* XPERTTeak DSP PLL */
  420. static struct clk ck_pll3 = {
  421. .name = "ck_pll3",
  422. .parent = &ck_pll1,
  423. .flags = NEEDS_INITIALIZATION,
  424. .round_rate = &pll3_round_rate,
  425. .set_rate = &pll160_set_rate,
  426. .scale_reg = DSPPLLCTRL_REG,
  427. .enable_reg = DSPCLKCTRL_REG,
  428. .enable_shift = 3,
  429. .enable_reg1 = DSPCLKCTRL_REG,
  430. .enable_shift1 = 2,
  431. .parent_switch_reg = DSPCLKCTRL_REG,
  432. .set_parent = &set_13MHz_parent,
  433. };
  434. static struct clk hclk_ck = {
  435. .name = "hclk_ck",
  436. .parent = &ck_pll4,
  437. .flags = PARENT_SET_RATE,
  438. .set_rate = &hclk_set_rate,
  439. .round_rate = &hclk_round_rate,
  440. .scale_reg = HCLKDIVCTRL_REG,
  441. .rate = 2,
  442. .user_rate = 2,
  443. };
  444. static struct clk per_ck = {
  445. .name = "per_ck",
  446. .parent = &ck_pll4,
  447. .flags = FIXED_RATE,
  448. .propagate_next = &hclk_ck,
  449. .set_rate = &per_clk_set_rate,
  450. .round_rate = &per_clk_round_rate,
  451. .scale_reg = HCLKDIVCTRL_REG,
  452. .rate = CLK_RATE_13MHZ,
  453. .user_rate = CLK_RATE_13MHZ,
  454. };
  455. static struct clk m2hclk_ck = {
  456. .name = "m2hclk_ck",
  457. .parent = &hclk_ck,
  458. .flags = NEEDS_INITIALIZATION,
  459. .round_rate = &on_off_round_rate,
  460. .set_rate = &on_off_inv_set_rate,
  461. .rate = 1,
  462. .enable_shift = 6,
  463. .enable_reg = PWRCTRL_REG,
  464. };
  465. static struct clk vfp9_ck = {
  466. .name = "vfp9_ck",
  467. .parent = &ck_pll4,
  468. .flags = NEEDS_INITIALIZATION,
  469. .round_rate = &on_off_round_rate,
  470. .set_rate = &on_off_set_rate,
  471. .rate = 1,
  472. .enable_shift = 4,
  473. .enable_reg = VFP9CLKCTRL_REG,
  474. };
  475. static struct clk keyscan_ck = {
  476. .name = "keyscan_ck",
  477. .parent = &osc_32KHz,
  478. .flags = NEEDS_INITIALIZATION,
  479. .round_rate = &on_off_round_rate,
  480. .set_rate = &on_off_set_rate,
  481. .enable_shift = 0,
  482. .enable_reg = KEYCLKCTRL_REG,
  483. };
  484. static struct clk touch_ck = {
  485. .name = "touch_ck",
  486. .parent = &osc_32KHz,
  487. .flags = NEEDS_INITIALIZATION,
  488. .round_rate = &on_off_round_rate,
  489. .set_rate = &on_off_set_rate,
  490. .enable_shift = 0,
  491. .enable_reg = TSCLKCTRL_REG,
  492. };
  493. static struct clk pwm1_ck = {
  494. .name = "pwm1_ck",
  495. .parent = &osc_32KHz,
  496. .flags = NEEDS_INITIALIZATION,
  497. .round_rate = &on_off_round_rate,
  498. .set_rate = &on_off_set_rate,
  499. .enable_shift = 0,
  500. .enable_reg = PWMCLKCTRL_REG,
  501. };
  502. static struct clk pwm2_ck = {
  503. .name = "pwm2_ck",
  504. .parent = &osc_32KHz,
  505. .flags = NEEDS_INITIALIZATION,
  506. .round_rate = &on_off_round_rate,
  507. .set_rate = &on_off_set_rate,
  508. .enable_shift = 2,
  509. .enable_reg = PWMCLKCTRL_REG,
  510. };
  511. static struct clk jpeg_ck = {
  512. .name = "jpeg_ck",
  513. .parent = &hclk_ck,
  514. .flags = NEEDS_INITIALIZATION,
  515. .round_rate = &on_off_round_rate,
  516. .set_rate = &on_off_set_rate,
  517. .enable_shift = 0,
  518. .enable_reg = JPEGCLKCTRL_REG,
  519. };
  520. static struct clk ms_ck = {
  521. .name = "ms_ck",
  522. .parent = &ck_pll4,
  523. .flags = NEEDS_INITIALIZATION,
  524. .round_rate = &on_off_round_rate,
  525. .set_rate = &on_off_set_rate,
  526. .enable_shift = 5,
  527. .enable_reg = MSCTRL_REG,
  528. };
  529. static struct clk dum_ck = {
  530. .name = "dum_ck",
  531. .parent = &hclk_ck,
  532. .flags = NEEDS_INITIALIZATION,
  533. .round_rate = &on_off_round_rate,
  534. .set_rate = &on_off_set_rate,
  535. .enable_shift = 0,
  536. .enable_reg = DUMCLKCTRL_REG,
  537. };
  538. static struct clk flash_ck = {
  539. .name = "flash_ck",
  540. .parent = &hclk_ck,
  541. .round_rate = &on_off_round_rate,
  542. .set_rate = &on_off_set_rate,
  543. .enable_shift = 1, /* Only MLC clock supported */
  544. .enable_reg = FLASHCLKCTRL_REG,
  545. };
  546. static struct clk i2c0_ck = {
  547. .name = "i2c0_ck",
  548. .parent = &per_ck,
  549. .flags = NEEDS_INITIALIZATION | FIXED_RATE,
  550. .enable_shift = 0,
  551. .enable_reg = I2CCLKCTRL_REG,
  552. .rate = 13000000,
  553. .enable = clk_reg_enable,
  554. .disable = clk_reg_disable,
  555. };
  556. static struct clk i2c1_ck = {
  557. .name = "i2c1_ck",
  558. .parent = &per_ck,
  559. .flags = NEEDS_INITIALIZATION | FIXED_RATE,
  560. .enable_shift = 1,
  561. .enable_reg = I2CCLKCTRL_REG,
  562. .rate = 13000000,
  563. .enable = clk_reg_enable,
  564. .disable = clk_reg_disable,
  565. };
  566. static struct clk i2c2_ck = {
  567. .name = "i2c2_ck",
  568. .parent = &per_ck,
  569. .flags = NEEDS_INITIALIZATION | FIXED_RATE,
  570. .enable_shift = 2,
  571. .enable_reg = USB_OTG_CLKCTRL_REG,
  572. .rate = 13000000,
  573. .enable = clk_reg_enable,
  574. .disable = clk_reg_disable,
  575. };
  576. static struct clk spi0_ck = {
  577. .name = "spi0_ck",
  578. .parent = &hclk_ck,
  579. .flags = NEEDS_INITIALIZATION,
  580. .round_rate = &on_off_round_rate,
  581. .set_rate = &on_off_set_rate,
  582. .enable_shift = 0,
  583. .enable_reg = SPICTRL_REG,
  584. };
  585. static struct clk spi1_ck = {
  586. .name = "spi1_ck",
  587. .parent = &hclk_ck,
  588. .flags = NEEDS_INITIALIZATION,
  589. .round_rate = &on_off_round_rate,
  590. .set_rate = &on_off_set_rate,
  591. .enable_shift = 4,
  592. .enable_reg = SPICTRL_REG,
  593. };
  594. static struct clk dma_ck = {
  595. .name = "dma_ck",
  596. .parent = &hclk_ck,
  597. .round_rate = &on_off_round_rate,
  598. .set_rate = &on_off_set_rate,
  599. .enable_shift = 0,
  600. .enable_reg = DMACLKCTRL_REG,
  601. };
  602. static struct clk uart3_ck = {
  603. .name = "uart3_ck",
  604. .parent = &per_ck,
  605. .flags = NEEDS_INITIALIZATION,
  606. .round_rate = &on_off_round_rate,
  607. .set_rate = &on_off_set_rate,
  608. .rate = 1,
  609. .enable_shift = 0,
  610. .enable_reg = UARTCLKCTRL_REG,
  611. };
  612. static struct clk uart4_ck = {
  613. .name = "uart4_ck",
  614. .parent = &per_ck,
  615. .flags = NEEDS_INITIALIZATION,
  616. .round_rate = &on_off_round_rate,
  617. .set_rate = &on_off_set_rate,
  618. .enable_shift = 1,
  619. .enable_reg = UARTCLKCTRL_REG,
  620. };
  621. static struct clk uart5_ck = {
  622. .name = "uart5_ck",
  623. .parent = &per_ck,
  624. .flags = NEEDS_INITIALIZATION,
  625. .round_rate = &on_off_round_rate,
  626. .set_rate = &on_off_set_rate,
  627. .rate = 1,
  628. .enable_shift = 2,
  629. .enable_reg = UARTCLKCTRL_REG,
  630. };
  631. static struct clk uart6_ck = {
  632. .name = "uart6_ck",
  633. .parent = &per_ck,
  634. .flags = NEEDS_INITIALIZATION,
  635. .round_rate = &on_off_round_rate,
  636. .set_rate = &on_off_set_rate,
  637. .enable_shift = 3,
  638. .enable_reg = UARTCLKCTRL_REG,
  639. };
  640. static struct clk wdt_ck = {
  641. .name = "wdt_ck",
  642. .parent = &per_ck,
  643. .flags = NEEDS_INITIALIZATION,
  644. .enable_shift = 0,
  645. .enable_reg = TIMCLKCTRL_REG,
  646. .enable = clk_reg_enable,
  647. .disable = clk_reg_disable,
  648. };
  649. /* These clocks are visible outside this module
  650. * and can be initialized
  651. */
  652. static struct clk *onchip_clks[] __initdata = {
  653. &ck_13MHz,
  654. &ck_pll1,
  655. &ck_pll4,
  656. &ck_pll5,
  657. &ck_pll3,
  658. &vfp9_ck,
  659. &m2hclk_ck,
  660. &hclk_ck,
  661. &dma_ck,
  662. &flash_ck,
  663. &dum_ck,
  664. &keyscan_ck,
  665. &pwm1_ck,
  666. &pwm2_ck,
  667. &jpeg_ck,
  668. &ms_ck,
  669. &touch_ck,
  670. &i2c0_ck,
  671. &i2c1_ck,
  672. &i2c2_ck,
  673. &spi0_ck,
  674. &spi1_ck,
  675. &uart3_ck,
  676. &uart4_ck,
  677. &uart5_ck,
  678. &uart6_ck,
  679. &wdt_ck,
  680. };
  681. static struct clk_lookup onchip_clkreg[] = {
  682. { .clk = &ck_13MHz, .con_id = "ck_13MHz" },
  683. { .clk = &ck_pll1, .con_id = "ck_pll1" },
  684. { .clk = &ck_pll4, .con_id = "ck_pll4" },
  685. { .clk = &ck_pll5, .con_id = "ck_pll5" },
  686. { .clk = &ck_pll3, .con_id = "ck_pll3" },
  687. { .clk = &vfp9_ck, .con_id = "vfp9_ck" },
  688. { .clk = &m2hclk_ck, .con_id = "m2hclk_ck" },
  689. { .clk = &hclk_ck, .con_id = "hclk_ck" },
  690. { .clk = &dma_ck, .con_id = "dma_ck" },
  691. { .clk = &flash_ck, .con_id = "flash_ck" },
  692. { .clk = &dum_ck, .con_id = "dum_ck" },
  693. { .clk = &keyscan_ck, .con_id = "keyscan_ck" },
  694. { .clk = &pwm1_ck, .con_id = "pwm1_ck" },
  695. { .clk = &pwm2_ck, .con_id = "pwm2_ck" },
  696. { .clk = &jpeg_ck, .con_id = "jpeg_ck" },
  697. { .clk = &ms_ck, .con_id = "ms_ck" },
  698. { .clk = &touch_ck, .con_id = "touch_ck" },
  699. { .clk = &i2c0_ck, .dev_id = "pnx-i2c.0" },
  700. { .clk = &i2c1_ck, .dev_id = "pnx-i2c.1" },
  701. { .clk = &i2c2_ck, .dev_id = "pnx-i2c.2" },
  702. { .clk = &spi0_ck, .con_id = "spi0_ck" },
  703. { .clk = &spi1_ck, .con_id = "spi1_ck" },
  704. { .clk = &uart3_ck, .con_id = "uart3_ck" },
  705. { .clk = &uart4_ck, .con_id = "uart4_ck" },
  706. { .clk = &uart5_ck, .con_id = "uart5_ck" },
  707. { .clk = &uart6_ck, .con_id = "uart6_ck" },
  708. { .clk = &wdt_ck, .dev_id = "pnx4008-watchdog" },
  709. };
  710. static void local_clk_disable(struct clk *clk)
  711. {
  712. if (WARN_ON(clk->usecount == 0))
  713. return;
  714. if (!(--clk->usecount)) {
  715. if (clk->disable)
  716. clk->disable(clk);
  717. else if (!(clk->flags & FIXED_RATE) && clk->rate && clk->set_rate)
  718. clk->set_rate(clk, 0);
  719. if (clk->parent)
  720. local_clk_disable(clk->parent);
  721. }
  722. }
  723. static int local_clk_enable(struct clk *clk)
  724. {
  725. int ret = 0;
  726. if (clk->usecount == 0) {
  727. if (clk->parent) {
  728. ret = local_clk_enable(clk->parent);
  729. if (ret != 0)
  730. goto out;
  731. }
  732. if (clk->enable)
  733. ret = clk->enable(clk);
  734. else if (!(clk->flags & FIXED_RATE) && !clk->rate && clk->set_rate
  735. && clk->user_rate)
  736. ret = clk->set_rate(clk, clk->user_rate);
  737. if (ret != 0 && clk->parent) {
  738. local_clk_disable(clk->parent);
  739. goto out;
  740. }
  741. clk->usecount++;
  742. }
  743. out:
  744. return ret;
  745. }
  746. static int local_set_rate(struct clk *clk, u32 rate)
  747. {
  748. int ret = -EINVAL;
  749. if (clk->set_rate) {
  750. if (clk->user_rate == clk->rate && clk->parent->rate) {
  751. /* if clock enabled or rate not set */
  752. clk->user_rate = clk->round_rate(clk, rate);
  753. ret = clk->set_rate(clk, clk->user_rate);
  754. } else
  755. clk->user_rate = clk->round_rate(clk, rate);
  756. ret = 0;
  757. }
  758. return ret;
  759. }
  760. int clk_set_rate(struct clk *clk, unsigned long rate)
  761. {
  762. int ret = -EINVAL;
  763. if (clk->flags & FIXED_RATE)
  764. goto out;
  765. clock_lock();
  766. if ((clk->flags & PARENT_SET_RATE) && clk->parent) {
  767. clk->user_rate = clk->round_rate(clk, rate);
  768. /* parent clock needs to be refreshed
  769. for the setting to take effect */
  770. } else {
  771. ret = local_set_rate(clk, rate);
  772. }
  773. ret = 0;
  774. clock_unlock();
  775. out:
  776. return ret;
  777. }
  778. EXPORT_SYMBOL(clk_set_rate);
  779. unsigned long clk_get_rate(struct clk *clk)
  780. {
  781. unsigned long ret;
  782. clock_lock();
  783. ret = clk->rate;
  784. clock_unlock();
  785. return ret;
  786. }
  787. EXPORT_SYMBOL(clk_get_rate);
  788. int clk_enable(struct clk *clk)
  789. {
  790. int ret;
  791. clock_lock();
  792. ret = local_clk_enable(clk);
  793. clock_unlock();
  794. return ret;
  795. }
  796. EXPORT_SYMBOL(clk_enable);
  797. void clk_disable(struct clk *clk)
  798. {
  799. clock_lock();
  800. local_clk_disable(clk);
  801. clock_unlock();
  802. }
  803. EXPORT_SYMBOL(clk_disable);
  804. long clk_round_rate(struct clk *clk, unsigned long rate)
  805. {
  806. long ret;
  807. clock_lock();
  808. if (clk->round_rate)
  809. ret = clk->round_rate(clk, rate);
  810. else
  811. ret = clk->rate;
  812. clock_unlock();
  813. return ret;
  814. }
  815. EXPORT_SYMBOL(clk_round_rate);
  816. int clk_set_parent(struct clk *clk, struct clk *parent)
  817. {
  818. int ret = -ENODEV;
  819. if (!clk->set_parent)
  820. goto out;
  821. clock_lock();
  822. ret = clk->set_parent(clk, parent);
  823. if (!ret)
  824. clk->parent = parent;
  825. clock_unlock();
  826. out:
  827. return ret;
  828. }
  829. EXPORT_SYMBOL(clk_set_parent);
  830. static int __init clk_init(void)
  831. {
  832. struct clk **clkp;
  833. /* Disable autoclocking, as it doesn't seem to work */
  834. __raw_writel(0xff, AUTOCLK_CTRL);
  835. for (clkp = onchip_clks; clkp < onchip_clks + ARRAY_SIZE(onchip_clks);
  836. clkp++) {
  837. struct clk *clk = *clkp;
  838. if (clk->flags & NEEDS_INITIALIZATION) {
  839. if (clk->set_rate) {
  840. clk->user_rate = clk->rate;
  841. local_set_rate(clk, clk->user_rate);
  842. if (clk->set_parent)
  843. clk->set_parent(clk, clk->parent);
  844. }
  845. if (clk->enable && clk->usecount)
  846. clk->enable(clk);
  847. if (clk->disable && !clk->usecount)
  848. clk->disable(clk);
  849. }
  850. pr_debug("%s: clock %s, rate %ld\n",
  851. __func__, clk->name, clk->rate);
  852. }
  853. local_clk_enable(&ck_pll4);
  854. /* if ck_13MHz is not used, disable it. */
  855. if (ck_13MHz.usecount == 0)
  856. local_clk_disable(&ck_13MHz);
  857. /* Disable autoclocking */
  858. __raw_writeb(0xff, AUTOCLK_CTRL);
  859. clkdev_add_table(onchip_clkreg, ARRAY_SIZE(onchip_clkreg));
  860. return 0;
  861. }
  862. arch_initcall(clk_init);