clk-u300.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. /*
  2. * U300 clock implementation
  3. * Copyright (C) 2007-2012 ST-Ericsson AB
  4. * License terms: GNU General Public License (GPL) version 2
  5. * Author: Linus Walleij <linus.walleij@stericsson.com>
  6. * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
  7. */
  8. #include <linux/clk.h>
  9. #include <linux/clkdev.h>
  10. #include <linux/err.h>
  11. #include <linux/io.h>
  12. #include <linux/clk-provider.h>
  13. #include <linux/spinlock.h>
  14. #include <mach/syscon.h>
  15. /*
  16. * The clocking hierarchy currently looks like this.
  17. * NOTE: the idea is NOT to show how the clocks are routed on the chip!
  18. * The ideas is to show dependencies, so a clock higher up in the
  19. * hierarchy has to be on in order for another clock to be on. Now,
  20. * both CPU and DMA can actually be on top of the hierarchy, and that
  21. * is not modeled currently. Instead we have the backbone AMBA bus on
  22. * top. This bus cannot be programmed in any way but conceptually it
  23. * needs to be active for the bridges and devices to transport data.
  24. *
  25. * Please be aware that a few clocks are hw controlled, which mean that
  26. * the hw itself can turn on/off or change the rate of the clock when
  27. * needed!
  28. *
  29. * AMBA bus
  30. * |
  31. * +- CPU
  32. * +- FSMC NANDIF NAND Flash interface
  33. * +- SEMI Shared Memory interface
  34. * +- ISP Image Signal Processor (U335 only)
  35. * +- CDS (U335 only)
  36. * +- DMA Direct Memory Access Controller
  37. * +- AAIF APP/ACC Inteface (Mobile Scalable Link, MSL)
  38. * +- APEX
  39. * +- VIDEO_ENC AVE2/3 Video Encoder
  40. * +- XGAM Graphics Accelerator Controller
  41. * +- AHB
  42. * |
  43. * +- ahb:0 AHB Bridge
  44. * | |
  45. * | +- ahb:1 INTCON Interrupt controller
  46. * | +- ahb:3 MSPRO Memory Stick Pro controller
  47. * | +- ahb:4 EMIF External Memory interface
  48. * |
  49. * +- fast:0 FAST bridge
  50. * | |
  51. * | +- fast:1 MMCSD MMC/SD card reader controller
  52. * | +- fast:2 I2S0 PCM I2S channel 0 controller
  53. * | +- fast:3 I2S1 PCM I2S channel 1 controller
  54. * | +- fast:4 I2C0 I2C channel 0 controller
  55. * | +- fast:5 I2C1 I2C channel 1 controller
  56. * | +- fast:6 SPI SPI controller
  57. * | +- fast:7 UART1 Secondary UART (U335 only)
  58. * |
  59. * +- slow:0 SLOW bridge
  60. * |
  61. * +- slow:1 SYSCON (not possible to control)
  62. * +- slow:2 WDOG Watchdog
  63. * +- slow:3 UART0 primary UART
  64. * +- slow:4 TIMER_APP Application timer - used in Linux
  65. * +- slow:5 KEYPAD controller
  66. * +- slow:6 GPIO controller
  67. * +- slow:7 RTC controller
  68. * +- slow:8 BT Bus Tracer (not used currently)
  69. * +- slow:9 EH Event Handler (not used currently)
  70. * +- slow:a TIMER_ACC Access style timer (not used currently)
  71. * +- slow:b PPM (U335 only, what is that?)
  72. */
  73. /* Global syscon virtual base */
  74. static void __iomem *syscon_vbase;
  75. /**
  76. * struct clk_syscon - U300 syscon clock
  77. * @hw: corresponding clock hardware entry
  78. * @hw_ctrld: whether this clock is hardware controlled (for refcount etc)
  79. * and does not need any magic pokes to be enabled/disabled
  80. * @reset: state holder, whether this block's reset line is asserted or not
  81. * @res_reg: reset line enable/disable flag register
  82. * @res_bit: bit for resetting or taking this consumer out of reset
  83. * @en_reg: clock line enable/disable flag register
  84. * @en_bit: bit for enabling/disabling this consumer clock line
  85. * @clk_val: magic value to poke in the register to enable/disable
  86. * this one clock
  87. */
  88. struct clk_syscon {
  89. struct clk_hw hw;
  90. bool hw_ctrld;
  91. bool reset;
  92. void __iomem *res_reg;
  93. u8 res_bit;
  94. void __iomem *en_reg;
  95. u8 en_bit;
  96. u16 clk_val;
  97. };
  98. #define to_syscon(_hw) container_of(_hw, struct clk_syscon, hw)
  99. static DEFINE_SPINLOCK(syscon_resetreg_lock);
  100. /*
  101. * Reset control functions. We remember if a block has been
  102. * taken out of reset and don't remove the reset assertion again
  103. * and vice versa. Currently we only remove resets so the
  104. * enablement function is defined out.
  105. */
  106. static void syscon_block_reset_enable(struct clk_syscon *sclk)
  107. {
  108. unsigned long iflags;
  109. u16 val;
  110. /* Not all blocks support resetting */
  111. if (!sclk->res_reg)
  112. return;
  113. spin_lock_irqsave(&syscon_resetreg_lock, iflags);
  114. val = readw(sclk->res_reg);
  115. val |= BIT(sclk->res_bit);
  116. writew(val, sclk->res_reg);
  117. spin_unlock_irqrestore(&syscon_resetreg_lock, iflags);
  118. sclk->reset = true;
  119. }
  120. static void syscon_block_reset_disable(struct clk_syscon *sclk)
  121. {
  122. unsigned long iflags;
  123. u16 val;
  124. /* Not all blocks support resetting */
  125. if (!sclk->res_reg)
  126. return;
  127. spin_lock_irqsave(&syscon_resetreg_lock, iflags);
  128. val = readw(sclk->res_reg);
  129. val &= ~BIT(sclk->res_bit);
  130. writew(val, sclk->res_reg);
  131. spin_unlock_irqrestore(&syscon_resetreg_lock, iflags);
  132. sclk->reset = false;
  133. }
  134. static int syscon_clk_prepare(struct clk_hw *hw)
  135. {
  136. struct clk_syscon *sclk = to_syscon(hw);
  137. /* If the block is in reset, bring it out */
  138. if (sclk->reset)
  139. syscon_block_reset_disable(sclk);
  140. return 0;
  141. }
  142. static void syscon_clk_unprepare(struct clk_hw *hw)
  143. {
  144. struct clk_syscon *sclk = to_syscon(hw);
  145. /* Please don't force the console into reset */
  146. if (sclk->clk_val == U300_SYSCON_SBCER_UART_CLK_EN)
  147. return;
  148. /* When unpreparing, force block into reset */
  149. if (!sclk->reset)
  150. syscon_block_reset_enable(sclk);
  151. }
  152. static int syscon_clk_enable(struct clk_hw *hw)
  153. {
  154. struct clk_syscon *sclk = to_syscon(hw);
  155. /* Don't touch the hardware controlled clocks */
  156. if (sclk->hw_ctrld)
  157. return 0;
  158. /* These cannot be controlled */
  159. if (sclk->clk_val == 0xFFFFU)
  160. return 0;
  161. writew(sclk->clk_val, syscon_vbase + U300_SYSCON_SBCER);
  162. return 0;
  163. }
  164. static void syscon_clk_disable(struct clk_hw *hw)
  165. {
  166. struct clk_syscon *sclk = to_syscon(hw);
  167. /* Don't touch the hardware controlled clocks */
  168. if (sclk->hw_ctrld)
  169. return;
  170. if (sclk->clk_val == 0xFFFFU)
  171. return;
  172. /* Please don't disable the console port */
  173. if (sclk->clk_val == U300_SYSCON_SBCER_UART_CLK_EN)
  174. return;
  175. writew(sclk->clk_val, syscon_vbase + U300_SYSCON_SBCDR);
  176. }
  177. static int syscon_clk_is_enabled(struct clk_hw *hw)
  178. {
  179. struct clk_syscon *sclk = to_syscon(hw);
  180. u16 val;
  181. /* If no enable register defined, it's always-on */
  182. if (!sclk->en_reg)
  183. return 1;
  184. val = readw(sclk->en_reg);
  185. val &= BIT(sclk->en_bit);
  186. return val ? 1 : 0;
  187. }
  188. static u16 syscon_get_perf(void)
  189. {
  190. u16 val;
  191. val = readw(syscon_vbase + U300_SYSCON_CCR);
  192. val &= U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
  193. return val;
  194. }
  195. static unsigned long
  196. syscon_clk_recalc_rate(struct clk_hw *hw,
  197. unsigned long parent_rate)
  198. {
  199. struct clk_syscon *sclk = to_syscon(hw);
  200. u16 perf = syscon_get_perf();
  201. switch(sclk->clk_val) {
  202. case U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN:
  203. case U300_SYSCON_SBCER_I2C0_CLK_EN:
  204. case U300_SYSCON_SBCER_I2C1_CLK_EN:
  205. case U300_SYSCON_SBCER_MMC_CLK_EN:
  206. case U300_SYSCON_SBCER_SPI_CLK_EN:
  207. /* The FAST clocks have one progression */
  208. switch(perf) {
  209. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  210. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  211. return 13000000;
  212. default:
  213. return parent_rate; /* 26 MHz */
  214. }
  215. case U300_SYSCON_SBCER_DMAC_CLK_EN:
  216. case U300_SYSCON_SBCER_NANDIF_CLK_EN:
  217. case U300_SYSCON_SBCER_XGAM_CLK_EN:
  218. /* AMBA interconnect peripherals */
  219. switch(perf) {
  220. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  221. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  222. return 6500000;
  223. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  224. return 26000000;
  225. default:
  226. return parent_rate; /* 52 MHz */
  227. }
  228. case U300_SYSCON_SBCER_SEMI_CLK_EN:
  229. case U300_SYSCON_SBCER_EMIF_CLK_EN:
  230. /* EMIF speeds */
  231. switch(perf) {
  232. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  233. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  234. return 13000000;
  235. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  236. return 52000000;
  237. default:
  238. return 104000000;
  239. }
  240. case U300_SYSCON_SBCER_CPU_CLK_EN:
  241. /* And the fast CPU clock */
  242. switch(perf) {
  243. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  244. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  245. return 13000000;
  246. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  247. return 52000000;
  248. case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
  249. return 104000000;
  250. default:
  251. return parent_rate; /* 208 MHz */
  252. }
  253. default:
  254. /*
  255. * The SLOW clocks and default just inherit the rate of
  256. * their parent (typically PLL13 13 MHz).
  257. */
  258. return parent_rate;
  259. }
  260. }
  261. static long
  262. syscon_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  263. unsigned long *prate)
  264. {
  265. struct clk_syscon *sclk = to_syscon(hw);
  266. if (sclk->clk_val != U300_SYSCON_SBCER_CPU_CLK_EN)
  267. return *prate;
  268. /* We really only support setting the rate of the CPU clock */
  269. if (rate <= 13000000)
  270. return 13000000;
  271. if (rate <= 52000000)
  272. return 52000000;
  273. if (rate <= 104000000)
  274. return 104000000;
  275. return 208000000;
  276. }
  277. static int syscon_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  278. unsigned long parent_rate)
  279. {
  280. struct clk_syscon *sclk = to_syscon(hw);
  281. u16 val;
  282. /* We only support setting the rate of the CPU clock */
  283. if (sclk->clk_val != U300_SYSCON_SBCER_CPU_CLK_EN)
  284. return -EINVAL;
  285. switch (rate) {
  286. case 13000000:
  287. val = U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER;
  288. break;
  289. case 52000000:
  290. val = U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE;
  291. break;
  292. case 104000000:
  293. val = U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH;
  294. break;
  295. case 208000000:
  296. val = U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST;
  297. break;
  298. default:
  299. return -EINVAL;
  300. }
  301. val |= readw(syscon_vbase + U300_SYSCON_CCR) &
  302. ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK ;
  303. writew(val, syscon_vbase + U300_SYSCON_CCR);
  304. return 0;
  305. }
  306. static const struct clk_ops syscon_clk_ops = {
  307. .prepare = syscon_clk_prepare,
  308. .unprepare = syscon_clk_unprepare,
  309. .enable = syscon_clk_enable,
  310. .disable = syscon_clk_disable,
  311. .is_enabled = syscon_clk_is_enabled,
  312. .recalc_rate = syscon_clk_recalc_rate,
  313. .round_rate = syscon_clk_round_rate,
  314. .set_rate = syscon_clk_set_rate,
  315. };
  316. static struct clk * __init
  317. syscon_clk_register(struct device *dev, const char *name,
  318. const char *parent_name, unsigned long flags,
  319. bool hw_ctrld,
  320. void __iomem *res_reg, u8 res_bit,
  321. void __iomem *en_reg, u8 en_bit,
  322. u16 clk_val)
  323. {
  324. struct clk *clk;
  325. struct clk_syscon *sclk;
  326. struct clk_init_data init;
  327. sclk = kzalloc(sizeof(struct clk_syscon), GFP_KERNEL);
  328. if (!sclk) {
  329. pr_err("could not allocate syscon clock %s\n",
  330. name);
  331. return ERR_PTR(-ENOMEM);
  332. }
  333. init.name = name;
  334. init.ops = &syscon_clk_ops;
  335. init.flags = flags;
  336. init.parent_names = (parent_name ? &parent_name : NULL);
  337. init.num_parents = (parent_name ? 1 : 0);
  338. sclk->hw.init = &init;
  339. sclk->hw_ctrld = hw_ctrld;
  340. /* Assume the block is in reset at registration */
  341. sclk->reset = true;
  342. sclk->res_reg = res_reg;
  343. sclk->res_bit = res_bit;
  344. sclk->en_reg = en_reg;
  345. sclk->en_bit = en_bit;
  346. sclk->clk_val = clk_val;
  347. clk = clk_register(dev, &sclk->hw);
  348. if (IS_ERR(clk))
  349. kfree(sclk);
  350. return clk;
  351. }
  352. /**
  353. * struct clk_mclk - U300 MCLK clock (MMC/SD clock)
  354. * @hw: corresponding clock hardware entry
  355. * @is_mspro: if this is the memory stick clock rather than MMC/SD
  356. */
  357. struct clk_mclk {
  358. struct clk_hw hw;
  359. bool is_mspro;
  360. };
  361. #define to_mclk(_hw) container_of(_hw, struct clk_mclk, hw)
  362. static int mclk_clk_prepare(struct clk_hw *hw)
  363. {
  364. struct clk_mclk *mclk = to_mclk(hw);
  365. u16 val;
  366. /* The MMC and MSPRO clocks need some special set-up */
  367. if (!mclk->is_mspro) {
  368. /* Set default MMC clock divisor to 18.9 MHz */
  369. writew(0x0054U, syscon_vbase + U300_SYSCON_MMF0R);
  370. val = readw(syscon_vbase + U300_SYSCON_MMCR);
  371. /* Disable the MMC feedback clock */
  372. val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE;
  373. /* Disable MSPRO frequency */
  374. val &= ~U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE;
  375. writew(val, syscon_vbase + U300_SYSCON_MMCR);
  376. } else {
  377. val = readw(syscon_vbase + U300_SYSCON_MMCR);
  378. /* Disable the MMC feedback clock */
  379. val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE;
  380. /* Enable MSPRO frequency */
  381. val |= U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE;
  382. writew(val, syscon_vbase + U300_SYSCON_MMCR);
  383. }
  384. return 0;
  385. }
  386. static unsigned long
  387. mclk_clk_recalc_rate(struct clk_hw *hw,
  388. unsigned long parent_rate)
  389. {
  390. u16 perf = syscon_get_perf();
  391. switch (perf) {
  392. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  393. /*
  394. * Here, the 208 MHz PLL gets shut down and the always
  395. * on 13 MHz PLL used for RTC etc kicks into use
  396. * instead.
  397. */
  398. return 13000000;
  399. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  400. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  401. case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
  402. case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
  403. {
  404. /*
  405. * This clock is under program control. The register is
  406. * divided in two nybbles, bit 7-4 gives cycles-1 to count
  407. * high, bit 3-0 gives cycles-1 to count low. Distribute
  408. * these with no more than 1 cycle difference between
  409. * low and high and add low and high to get the actual
  410. * divisor. The base PLL is 208 MHz. Writing 0x00 will
  411. * divide by 1 and 1 so the highest frequency possible
  412. * is 104 MHz.
  413. *
  414. * e.g. 0x54 =>
  415. * f = 208 / ((5+1) + (4+1)) = 208 / 11 = 18.9 MHz
  416. */
  417. u16 val = readw(syscon_vbase + U300_SYSCON_MMF0R) &
  418. U300_SYSCON_MMF0R_MASK;
  419. switch (val) {
  420. case 0x0054:
  421. return 18900000;
  422. case 0x0044:
  423. return 20800000;
  424. case 0x0043:
  425. return 23100000;
  426. case 0x0033:
  427. return 26000000;
  428. case 0x0032:
  429. return 29700000;
  430. case 0x0022:
  431. return 34700000;
  432. case 0x0021:
  433. return 41600000;
  434. case 0x0011:
  435. return 52000000;
  436. case 0x0000:
  437. return 104000000;
  438. default:
  439. break;
  440. }
  441. }
  442. default:
  443. break;
  444. }
  445. return parent_rate;
  446. }
  447. static long
  448. mclk_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  449. unsigned long *prate)
  450. {
  451. if (rate <= 18900000)
  452. return 18900000;
  453. if (rate <= 20800000)
  454. return 20800000;
  455. if (rate <= 23100000)
  456. return 23100000;
  457. if (rate <= 26000000)
  458. return 26000000;
  459. if (rate <= 29700000)
  460. return 29700000;
  461. if (rate <= 34700000)
  462. return 34700000;
  463. if (rate <= 41600000)
  464. return 41600000;
  465. /* Highest rate */
  466. return 52000000;
  467. }
  468. static int mclk_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  469. unsigned long parent_rate)
  470. {
  471. u16 val;
  472. u16 reg;
  473. switch (rate) {
  474. case 18900000:
  475. val = 0x0054;
  476. break;
  477. case 20800000:
  478. val = 0x0044;
  479. break;
  480. case 23100000:
  481. val = 0x0043;
  482. break;
  483. case 26000000:
  484. val = 0x0033;
  485. break;
  486. case 29700000:
  487. val = 0x0032;
  488. break;
  489. case 34700000:
  490. val = 0x0022;
  491. break;
  492. case 41600000:
  493. val = 0x0021;
  494. break;
  495. case 52000000:
  496. val = 0x0011;
  497. break;
  498. case 104000000:
  499. val = 0x0000;
  500. break;
  501. default:
  502. return -EINVAL;
  503. }
  504. reg = readw(syscon_vbase + U300_SYSCON_MMF0R) &
  505. ~U300_SYSCON_MMF0R_MASK;
  506. writew(reg | val, syscon_vbase + U300_SYSCON_MMF0R);
  507. return 0;
  508. }
  509. static const struct clk_ops mclk_ops = {
  510. .prepare = mclk_clk_prepare,
  511. .recalc_rate = mclk_clk_recalc_rate,
  512. .round_rate = mclk_clk_round_rate,
  513. .set_rate = mclk_clk_set_rate,
  514. };
  515. static struct clk * __init
  516. mclk_clk_register(struct device *dev, const char *name,
  517. const char *parent_name, bool is_mspro)
  518. {
  519. struct clk *clk;
  520. struct clk_mclk *mclk;
  521. struct clk_init_data init;
  522. mclk = kzalloc(sizeof(struct clk_mclk), GFP_KERNEL);
  523. if (!mclk) {
  524. pr_err("could not allocate MMC/SD clock %s\n",
  525. name);
  526. return ERR_PTR(-ENOMEM);
  527. }
  528. init.name = "mclk";
  529. init.ops = &mclk_ops;
  530. init.flags = 0;
  531. init.parent_names = (parent_name ? &parent_name : NULL);
  532. init.num_parents = (parent_name ? 1 : 0);
  533. mclk->hw.init = &init;
  534. mclk->is_mspro = is_mspro;
  535. clk = clk_register(dev, &mclk->hw);
  536. if (IS_ERR(clk))
  537. kfree(mclk);
  538. return clk;
  539. }
  540. void __init u300_clk_init(void __iomem *base)
  541. {
  542. u16 val;
  543. struct clk *clk;
  544. syscon_vbase = base;
  545. /* Set system to run at PLL208, max performance, a known state. */
  546. val = readw(syscon_vbase + U300_SYSCON_CCR);
  547. val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
  548. writew(val, syscon_vbase + U300_SYSCON_CCR);
  549. /* Wait for the PLL208 to lock if not locked in yet */
  550. while (!(readw(syscon_vbase + U300_SYSCON_CSR) &
  551. U300_SYSCON_CSR_PLL208_LOCK_IND));
  552. /* Power management enable */
  553. val = readw(syscon_vbase + U300_SYSCON_PMCR);
  554. val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE;
  555. writew(val, syscon_vbase + U300_SYSCON_PMCR);
  556. /* These are always available (RTC and PLL13) */
  557. clk = clk_register_fixed_rate(NULL, "app_32_clk", NULL,
  558. CLK_IS_ROOT, 32768);
  559. /* The watchdog sits directly on the 32 kHz clock */
  560. clk_register_clkdev(clk, NULL, "coh901327_wdog");
  561. clk = clk_register_fixed_rate(NULL, "pll13", NULL,
  562. CLK_IS_ROOT, 13000000);
  563. /* These derive from PLL208 */
  564. clk = clk_register_fixed_rate(NULL, "pll208", NULL,
  565. CLK_IS_ROOT, 208000000);
  566. clk = clk_register_fixed_factor(NULL, "app_208_clk", "pll208",
  567. 0, 1, 1);
  568. clk = clk_register_fixed_factor(NULL, "app_104_clk", "pll208",
  569. 0, 1, 2);
  570. clk = clk_register_fixed_factor(NULL, "app_52_clk", "pll208",
  571. 0, 1, 4);
  572. /* The 52 MHz is divided down to 26 MHz */
  573. clk = clk_register_fixed_factor(NULL, "app_26_clk", "app_52_clk",
  574. 0, 1, 2);
  575. /* Directly on the AMBA interconnect */
  576. clk = syscon_clk_register(NULL, "cpu_clk", "app_208_clk", 0, true,
  577. syscon_vbase + U300_SYSCON_RRR, 3,
  578. syscon_vbase + U300_SYSCON_CERR, 3,
  579. U300_SYSCON_SBCER_CPU_CLK_EN);
  580. clk = syscon_clk_register(NULL, "dmac_clk", "app_52_clk", 0, true,
  581. syscon_vbase + U300_SYSCON_RRR, 4,
  582. syscon_vbase + U300_SYSCON_CERR, 4,
  583. U300_SYSCON_SBCER_DMAC_CLK_EN);
  584. clk_register_clkdev(clk, NULL, "dma");
  585. clk = syscon_clk_register(NULL, "fsmc_clk", "app_52_clk", 0, false,
  586. syscon_vbase + U300_SYSCON_RRR, 6,
  587. syscon_vbase + U300_SYSCON_CERR, 6,
  588. U300_SYSCON_SBCER_NANDIF_CLK_EN);
  589. clk_register_clkdev(clk, NULL, "fsmc-nand");
  590. clk = syscon_clk_register(NULL, "xgam_clk", "app_52_clk", 0, true,
  591. syscon_vbase + U300_SYSCON_RRR, 8,
  592. syscon_vbase + U300_SYSCON_CERR, 8,
  593. U300_SYSCON_SBCER_XGAM_CLK_EN);
  594. clk_register_clkdev(clk, NULL, "xgam");
  595. clk = syscon_clk_register(NULL, "semi_clk", "app_104_clk", 0, false,
  596. syscon_vbase + U300_SYSCON_RRR, 9,
  597. syscon_vbase + U300_SYSCON_CERR, 9,
  598. U300_SYSCON_SBCER_SEMI_CLK_EN);
  599. clk_register_clkdev(clk, NULL, "semi");
  600. /* AHB bridge clocks */
  601. clk = syscon_clk_register(NULL, "ahb_subsys_clk", "app_52_clk", 0, true,
  602. syscon_vbase + U300_SYSCON_RRR, 10,
  603. syscon_vbase + U300_SYSCON_CERR, 10,
  604. U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN);
  605. clk = syscon_clk_register(NULL, "intcon_clk", "ahb_subsys_clk", 0, false,
  606. syscon_vbase + U300_SYSCON_RRR, 12,
  607. syscon_vbase + U300_SYSCON_CERR, 12,
  608. /* Cannot be enabled, just taken out of reset */
  609. 0xFFFFU);
  610. clk_register_clkdev(clk, NULL, "intcon");
  611. clk = syscon_clk_register(NULL, "emif_clk", "ahb_subsys_clk", 0, false,
  612. syscon_vbase + U300_SYSCON_RRR, 5,
  613. syscon_vbase + U300_SYSCON_CERR, 5,
  614. U300_SYSCON_SBCER_EMIF_CLK_EN);
  615. clk_register_clkdev(clk, NULL, "pl172");
  616. /* FAST bridge clocks */
  617. clk = syscon_clk_register(NULL, "fast_clk", "app_26_clk", 0, true,
  618. syscon_vbase + U300_SYSCON_RFR, 0,
  619. syscon_vbase + U300_SYSCON_CEFR, 0,
  620. U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN);
  621. clk = syscon_clk_register(NULL, "i2c0_p_clk", "fast_clk", 0, false,
  622. syscon_vbase + U300_SYSCON_RFR, 1,
  623. syscon_vbase + U300_SYSCON_CEFR, 1,
  624. U300_SYSCON_SBCER_I2C0_CLK_EN);
  625. clk_register_clkdev(clk, NULL, "stu300.0");
  626. clk = syscon_clk_register(NULL, "i2c1_p_clk", "fast_clk", 0, false,
  627. syscon_vbase + U300_SYSCON_RFR, 2,
  628. syscon_vbase + U300_SYSCON_CEFR, 2,
  629. U300_SYSCON_SBCER_I2C1_CLK_EN);
  630. clk_register_clkdev(clk, NULL, "stu300.1");
  631. clk = syscon_clk_register(NULL, "mmc_p_clk", "fast_clk", 0, false,
  632. syscon_vbase + U300_SYSCON_RFR, 5,
  633. syscon_vbase + U300_SYSCON_CEFR, 5,
  634. U300_SYSCON_SBCER_MMC_CLK_EN);
  635. clk_register_clkdev(clk, "apb_pclk", "mmci");
  636. clk = syscon_clk_register(NULL, "spi_p_clk", "fast_clk", 0, false,
  637. syscon_vbase + U300_SYSCON_RFR, 6,
  638. syscon_vbase + U300_SYSCON_CEFR, 6,
  639. U300_SYSCON_SBCER_SPI_CLK_EN);
  640. /* The SPI has no external clock for the outward bus, uses the pclk */
  641. clk_register_clkdev(clk, NULL, "pl022");
  642. clk_register_clkdev(clk, "apb_pclk", "pl022");
  643. /* SLOW bridge clocks */
  644. clk = syscon_clk_register(NULL, "slow_clk", "pll13", 0, true,
  645. syscon_vbase + U300_SYSCON_RSR, 0,
  646. syscon_vbase + U300_SYSCON_CESR, 0,
  647. U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN);
  648. clk = syscon_clk_register(NULL, "uart0_clk", "slow_clk", 0, false,
  649. syscon_vbase + U300_SYSCON_RSR, 1,
  650. syscon_vbase + U300_SYSCON_CESR, 1,
  651. U300_SYSCON_SBCER_UART_CLK_EN);
  652. /* Same clock is used for APB and outward bus */
  653. clk_register_clkdev(clk, NULL, "uart0");
  654. clk_register_clkdev(clk, "apb_pclk", "uart0");
  655. clk = syscon_clk_register(NULL, "gpio_clk", "slow_clk", 0, false,
  656. syscon_vbase + U300_SYSCON_RSR, 4,
  657. syscon_vbase + U300_SYSCON_CESR, 4,
  658. U300_SYSCON_SBCER_GPIO_CLK_EN);
  659. clk_register_clkdev(clk, NULL, "u300-gpio");
  660. clk = syscon_clk_register(NULL, "keypad_clk", "slow_clk", 0, false,
  661. syscon_vbase + U300_SYSCON_RSR, 5,
  662. syscon_vbase + U300_SYSCON_CESR, 6,
  663. U300_SYSCON_SBCER_KEYPAD_CLK_EN);
  664. clk_register_clkdev(clk, NULL, "coh901461-keypad");
  665. clk = syscon_clk_register(NULL, "rtc_clk", "slow_clk", 0, true,
  666. syscon_vbase + U300_SYSCON_RSR, 6,
  667. /* No clock enable register bit */
  668. NULL, 0, 0xFFFFU);
  669. clk_register_clkdev(clk, NULL, "rtc-coh901331");
  670. clk = syscon_clk_register(NULL, "app_tmr_clk", "slow_clk", 0, false,
  671. syscon_vbase + U300_SYSCON_RSR, 7,
  672. syscon_vbase + U300_SYSCON_CESR, 7,
  673. U300_SYSCON_SBCER_APP_TMR_CLK_EN);
  674. clk_register_clkdev(clk, NULL, "apptimer");
  675. clk = syscon_clk_register(NULL, "acc_tmr_clk", "slow_clk", 0, false,
  676. syscon_vbase + U300_SYSCON_RSR, 8,
  677. syscon_vbase + U300_SYSCON_CESR, 8,
  678. U300_SYSCON_SBCER_ACC_TMR_CLK_EN);
  679. clk_register_clkdev(clk, NULL, "timer");
  680. /* Then this special MMC/SD clock */
  681. clk = mclk_clk_register(NULL, "mmc_clk", "mmc_p_clk", false);
  682. clk_register_clkdev(clk, NULL, "mmci");
  683. }