clock.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  1. /*
  2. * Copyright (C) 2007,2008 Freescale Semiconductor, Inc. All rights reserved.
  3. *
  4. * Author: John Rigby <jrigby@freescale.com>
  5. *
  6. * Implements the clk api defined in include/linux/clk.h
  7. *
  8. * Original based on linux/arch/arm/mach-integrator/clock.c
  9. *
  10. * Copyright (C) 2004 ARM Limited.
  11. * Written by Deep Blue Solutions Limited.
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License version 2 as
  15. * published by the Free Software Foundation.
  16. */
  17. #include <linux/kernel.h>
  18. #include <linux/list.h>
  19. #include <linux/errno.h>
  20. #include <linux/err.h>
  21. #include <linux/module.h>
  22. #include <linux/string.h>
  23. #include <linux/clk.h>
  24. #include <linux/mutex.h>
  25. #include <linux/io.h>
  26. #include <linux/of_address.h>
  27. #include <linux/of_platform.h>
  28. #include <asm/mpc5xxx.h>
  29. #include <asm/mpc5121.h>
  30. #include <asm/clk_interface.h>
  31. #include "mpc512x.h"
  32. #undef CLK_DEBUG
  33. static int clocks_initialized;
  34. #define CLK_HAS_RATE 0x1 /* has rate in MHz */
  35. #define CLK_HAS_CTRL 0x2 /* has control reg and bit */
  36. struct clk {
  37. struct list_head node;
  38. char name[32];
  39. int flags;
  40. struct device *dev;
  41. unsigned long rate;
  42. struct module *owner;
  43. void (*calc) (struct clk *);
  44. struct clk *parent;
  45. int reg, bit; /* CLK_HAS_CTRL */
  46. int div_shift; /* only used by generic_div_clk_calc */
  47. };
  48. static LIST_HEAD(clocks);
  49. static DEFINE_MUTEX(clocks_mutex);
  50. static struct clk *mpc5121_clk_get(struct device *dev, const char *id)
  51. {
  52. struct clk *p, *clk = ERR_PTR(-ENOENT);
  53. int dev_match;
  54. int id_match;
  55. if (dev == NULL || id == NULL)
  56. return clk;
  57. mutex_lock(&clocks_mutex);
  58. list_for_each_entry(p, &clocks, node) {
  59. dev_match = id_match = 0;
  60. if (dev == p->dev)
  61. dev_match++;
  62. if (strcmp(id, p->name) == 0)
  63. id_match++;
  64. if ((dev_match || id_match) && try_module_get(p->owner)) {
  65. clk = p;
  66. break;
  67. }
  68. }
  69. mutex_unlock(&clocks_mutex);
  70. return clk;
  71. }
  72. #ifdef CLK_DEBUG
  73. static void dump_clocks(void)
  74. {
  75. struct clk *p;
  76. mutex_lock(&clocks_mutex);
  77. printk(KERN_INFO "CLOCKS:\n");
  78. list_for_each_entry(p, &clocks, node) {
  79. pr_info(" %s=%ld", p->name, p->rate);
  80. if (p->parent)
  81. pr_cont(" %s=%ld", p->parent->name,
  82. p->parent->rate);
  83. if (p->flags & CLK_HAS_CTRL)
  84. pr_cont(" reg/bit=%d/%d", p->reg, p->bit);
  85. pr_cont("\n");
  86. }
  87. mutex_unlock(&clocks_mutex);
  88. }
  89. #define DEBUG_CLK_DUMP() dump_clocks()
  90. #else
  91. #define DEBUG_CLK_DUMP()
  92. #endif
  93. static void mpc5121_clk_put(struct clk *clk)
  94. {
  95. module_put(clk->owner);
  96. }
  97. #define NRPSC 12
  98. struct mpc512x_clockctl {
  99. u32 spmr; /* System PLL Mode Reg */
  100. u32 sccr[2]; /* System Clk Ctrl Reg 1 & 2 */
  101. u32 scfr1; /* System Clk Freq Reg 1 */
  102. u32 scfr2; /* System Clk Freq Reg 2 */
  103. u32 reserved;
  104. u32 bcr; /* Bread Crumb Reg */
  105. u32 pccr[NRPSC]; /* PSC Clk Ctrl Reg 0-11 */
  106. u32 spccr; /* SPDIF Clk Ctrl Reg */
  107. u32 cccr; /* CFM Clk Ctrl Reg */
  108. u32 dccr; /* DIU Clk Cnfg Reg */
  109. };
  110. static struct mpc512x_clockctl __iomem *clockctl;
  111. static int mpc5121_clk_enable(struct clk *clk)
  112. {
  113. unsigned int mask;
  114. if (clk->flags & CLK_HAS_CTRL) {
  115. mask = in_be32(&clockctl->sccr[clk->reg]);
  116. mask |= 1 << clk->bit;
  117. out_be32(&clockctl->sccr[clk->reg], mask);
  118. }
  119. return 0;
  120. }
  121. static void mpc5121_clk_disable(struct clk *clk)
  122. {
  123. unsigned int mask;
  124. if (clk->flags & CLK_HAS_CTRL) {
  125. mask = in_be32(&clockctl->sccr[clk->reg]);
  126. mask &= ~(1 << clk->bit);
  127. out_be32(&clockctl->sccr[clk->reg], mask);
  128. }
  129. }
  130. static unsigned long mpc5121_clk_get_rate(struct clk *clk)
  131. {
  132. if (clk->flags & CLK_HAS_RATE)
  133. return clk->rate;
  134. else
  135. return 0;
  136. }
  137. static long mpc5121_clk_round_rate(struct clk *clk, unsigned long rate)
  138. {
  139. return rate;
  140. }
  141. static int mpc5121_clk_set_rate(struct clk *clk, unsigned long rate)
  142. {
  143. return 0;
  144. }
  145. static int clk_register(struct clk *clk)
  146. {
  147. mutex_lock(&clocks_mutex);
  148. list_add(&clk->node, &clocks);
  149. mutex_unlock(&clocks_mutex);
  150. return 0;
  151. }
  152. static unsigned long spmf_mult(void)
  153. {
  154. /*
  155. * Convert spmf to multiplier
  156. */
  157. static int spmf_to_mult[] = {
  158. 68, 1, 12, 16,
  159. 20, 24, 28, 32,
  160. 36, 40, 44, 48,
  161. 52, 56, 60, 64
  162. };
  163. int spmf = (in_be32(&clockctl->spmr) >> 24) & 0xf;
  164. return spmf_to_mult[spmf];
  165. }
  166. static unsigned long sysdiv_div_x_2(void)
  167. {
  168. /*
  169. * Convert sysdiv to divisor x 2
  170. * Some divisors have fractional parts so
  171. * multiply by 2 then divide by this value
  172. */
  173. static int sysdiv_to_div_x_2[] = {
  174. 4, 5, 6, 7,
  175. 8, 9, 10, 14,
  176. 12, 16, 18, 22,
  177. 20, 24, 26, 30,
  178. 28, 32, 34, 38,
  179. 36, 40, 42, 46,
  180. 44, 48, 50, 54,
  181. 52, 56, 58, 62,
  182. 60, 64, 66,
  183. };
  184. int sysdiv = (in_be32(&clockctl->scfr2) >> 26) & 0x3f;
  185. return sysdiv_to_div_x_2[sysdiv];
  186. }
  187. static unsigned long ref_to_sys(unsigned long rate)
  188. {
  189. rate *= spmf_mult();
  190. rate *= 2;
  191. rate /= sysdiv_div_x_2();
  192. return rate;
  193. }
  194. static unsigned long sys_to_ref(unsigned long rate)
  195. {
  196. rate *= sysdiv_div_x_2();
  197. rate /= 2;
  198. rate /= spmf_mult();
  199. return rate;
  200. }
  201. static long ips_to_ref(unsigned long rate)
  202. {
  203. int ips_div = (in_be32(&clockctl->scfr1) >> 23) & 0x7;
  204. rate *= ips_div; /* csb_clk = ips_clk * ips_div */
  205. rate *= 2; /* sys_clk = csb_clk * 2 */
  206. return sys_to_ref(rate);
  207. }
  208. static unsigned long devtree_getfreq(char *clockname)
  209. {
  210. struct device_node *np;
  211. const unsigned int *prop;
  212. unsigned int val = 0;
  213. np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-immr");
  214. if (np) {
  215. prop = of_get_property(np, clockname, NULL);
  216. if (prop)
  217. val = *prop;
  218. of_node_put(np);
  219. }
  220. return val;
  221. }
  222. static void ref_clk_calc(struct clk *clk)
  223. {
  224. unsigned long rate;
  225. rate = devtree_getfreq("bus-frequency");
  226. if (rate == 0) {
  227. printk(KERN_ERR "No bus-frequency in dev tree\n");
  228. clk->rate = 0;
  229. return;
  230. }
  231. clk->rate = ips_to_ref(rate);
  232. }
  233. static struct clk ref_clk = {
  234. .name = "ref_clk",
  235. .calc = ref_clk_calc,
  236. };
  237. static void sys_clk_calc(struct clk *clk)
  238. {
  239. clk->rate = ref_to_sys(ref_clk.rate);
  240. }
  241. static struct clk sys_clk = {
  242. .name = "sys_clk",
  243. .calc = sys_clk_calc,
  244. };
  245. static void diu_clk_calc(struct clk *clk)
  246. {
  247. int diudiv_x_2 = in_be32(&clockctl->scfr1) & 0xff;
  248. unsigned long rate;
  249. rate = sys_clk.rate;
  250. rate *= 2;
  251. rate /= diudiv_x_2;
  252. clk->rate = rate;
  253. }
  254. static void viu_clk_calc(struct clk *clk)
  255. {
  256. unsigned long rate;
  257. rate = sys_clk.rate;
  258. rate /= 2;
  259. clk->rate = rate;
  260. }
  261. static void half_clk_calc(struct clk *clk)
  262. {
  263. clk->rate = clk->parent->rate / 2;
  264. }
  265. static void generic_div_clk_calc(struct clk *clk)
  266. {
  267. int div = (in_be32(&clockctl->scfr1) >> clk->div_shift) & 0x7;
  268. clk->rate = clk->parent->rate / div;
  269. }
  270. static void unity_clk_calc(struct clk *clk)
  271. {
  272. clk->rate = clk->parent->rate;
  273. }
  274. static struct clk csb_clk = {
  275. .name = "csb_clk",
  276. .calc = half_clk_calc,
  277. .parent = &sys_clk,
  278. };
  279. static void e300_clk_calc(struct clk *clk)
  280. {
  281. int spmf = (in_be32(&clockctl->spmr) >> 16) & 0xf;
  282. int ratex2 = clk->parent->rate * spmf;
  283. clk->rate = ratex2 / 2;
  284. }
  285. static struct clk e300_clk = {
  286. .name = "e300_clk",
  287. .calc = e300_clk_calc,
  288. .parent = &csb_clk,
  289. };
  290. static struct clk ips_clk = {
  291. .name = "ips_clk",
  292. .calc = generic_div_clk_calc,
  293. .parent = &csb_clk,
  294. .div_shift = 23,
  295. };
  296. /*
  297. * Clocks controlled by SCCR1 (.reg = 0)
  298. */
  299. static struct clk lpc_clk = {
  300. .name = "lpc_clk",
  301. .flags = CLK_HAS_CTRL,
  302. .reg = 0,
  303. .bit = 30,
  304. .calc = generic_div_clk_calc,
  305. .parent = &ips_clk,
  306. .div_shift = 11,
  307. };
  308. static struct clk nfc_clk = {
  309. .name = "nfc_clk",
  310. .flags = CLK_HAS_CTRL,
  311. .reg = 0,
  312. .bit = 29,
  313. .calc = generic_div_clk_calc,
  314. .parent = &ips_clk,
  315. .div_shift = 8,
  316. };
  317. static struct clk pata_clk = {
  318. .name = "pata_clk",
  319. .flags = CLK_HAS_CTRL,
  320. .reg = 0,
  321. .bit = 28,
  322. .calc = unity_clk_calc,
  323. .parent = &ips_clk,
  324. };
  325. /*
  326. * PSC clocks (bits 27 - 16)
  327. * are setup elsewhere
  328. */
  329. static struct clk sata_clk = {
  330. .name = "sata_clk",
  331. .flags = CLK_HAS_CTRL,
  332. .reg = 0,
  333. .bit = 14,
  334. .calc = unity_clk_calc,
  335. .parent = &ips_clk,
  336. };
  337. static struct clk fec_clk = {
  338. .name = "fec_clk",
  339. .flags = CLK_HAS_CTRL,
  340. .reg = 0,
  341. .bit = 13,
  342. .calc = unity_clk_calc,
  343. .parent = &ips_clk,
  344. };
  345. static struct clk pci_clk = {
  346. .name = "pci_clk",
  347. .flags = CLK_HAS_CTRL,
  348. .reg = 0,
  349. .bit = 11,
  350. .calc = generic_div_clk_calc,
  351. .parent = &csb_clk,
  352. .div_shift = 20,
  353. };
  354. /*
  355. * Clocks controlled by SCCR2 (.reg = 1)
  356. */
  357. static struct clk diu_clk = {
  358. .name = "diu_clk",
  359. .flags = CLK_HAS_CTRL,
  360. .reg = 1,
  361. .bit = 31,
  362. .calc = diu_clk_calc,
  363. };
  364. static struct clk viu_clk = {
  365. .name = "viu_clk",
  366. .flags = CLK_HAS_CTRL,
  367. .reg = 1,
  368. .bit = 18,
  369. .calc = viu_clk_calc,
  370. };
  371. static struct clk axe_clk = {
  372. .name = "axe_clk",
  373. .flags = CLK_HAS_CTRL,
  374. .reg = 1,
  375. .bit = 30,
  376. .calc = unity_clk_calc,
  377. .parent = &csb_clk,
  378. };
  379. static struct clk usb1_clk = {
  380. .name = "usb1_clk",
  381. .flags = CLK_HAS_CTRL,
  382. .reg = 1,
  383. .bit = 28,
  384. .calc = unity_clk_calc,
  385. .parent = &csb_clk,
  386. };
  387. static struct clk usb2_clk = {
  388. .name = "usb2_clk",
  389. .flags = CLK_HAS_CTRL,
  390. .reg = 1,
  391. .bit = 27,
  392. .calc = unity_clk_calc,
  393. .parent = &csb_clk,
  394. };
  395. static struct clk i2c_clk = {
  396. .name = "i2c_clk",
  397. .flags = CLK_HAS_CTRL,
  398. .reg = 1,
  399. .bit = 26,
  400. .calc = unity_clk_calc,
  401. .parent = &ips_clk,
  402. };
  403. static struct clk mscan_clk = {
  404. .name = "mscan_clk",
  405. .flags = CLK_HAS_CTRL,
  406. .reg = 1,
  407. .bit = 25,
  408. .calc = unity_clk_calc,
  409. .parent = &ips_clk,
  410. };
  411. static struct clk sdhc_clk = {
  412. .name = "sdhc_clk",
  413. .flags = CLK_HAS_CTRL,
  414. .reg = 1,
  415. .bit = 24,
  416. .calc = unity_clk_calc,
  417. .parent = &ips_clk,
  418. };
  419. static struct clk mbx_bus_clk = {
  420. .name = "mbx_bus_clk",
  421. .flags = CLK_HAS_CTRL,
  422. .reg = 1,
  423. .bit = 22,
  424. .calc = half_clk_calc,
  425. .parent = &csb_clk,
  426. };
  427. static struct clk mbx_clk = {
  428. .name = "mbx_clk",
  429. .flags = CLK_HAS_CTRL,
  430. .reg = 1,
  431. .bit = 21,
  432. .calc = unity_clk_calc,
  433. .parent = &csb_clk,
  434. };
  435. static struct clk mbx_3d_clk = {
  436. .name = "mbx_3d_clk",
  437. .flags = CLK_HAS_CTRL,
  438. .reg = 1,
  439. .bit = 20,
  440. .calc = generic_div_clk_calc,
  441. .parent = &mbx_bus_clk,
  442. .div_shift = 14,
  443. };
  444. static void psc_mclk_in_calc(struct clk *clk)
  445. {
  446. clk->rate = devtree_getfreq("psc_mclk_in");
  447. if (!clk->rate)
  448. clk->rate = 25000000;
  449. }
  450. static struct clk psc_mclk_in = {
  451. .name = "psc_mclk_in",
  452. .calc = psc_mclk_in_calc,
  453. };
  454. static struct clk spdif_txclk = {
  455. .name = "spdif_txclk",
  456. .flags = CLK_HAS_CTRL,
  457. .reg = 1,
  458. .bit = 23,
  459. };
  460. static struct clk spdif_rxclk = {
  461. .name = "spdif_rxclk",
  462. .flags = CLK_HAS_CTRL,
  463. .reg = 1,
  464. .bit = 23,
  465. };
  466. static void ac97_clk_calc(struct clk *clk)
  467. {
  468. /* ac97 bit clock is always 24.567 MHz */
  469. clk->rate = 24567000;
  470. }
  471. static struct clk ac97_clk = {
  472. .name = "ac97_clk_in",
  473. .calc = ac97_clk_calc,
  474. };
  475. static struct clk *rate_clks[] = {
  476. &ref_clk,
  477. &sys_clk,
  478. &diu_clk,
  479. &viu_clk,
  480. &csb_clk,
  481. &e300_clk,
  482. &ips_clk,
  483. &fec_clk,
  484. &sata_clk,
  485. &pata_clk,
  486. &nfc_clk,
  487. &lpc_clk,
  488. &mbx_bus_clk,
  489. &mbx_clk,
  490. &mbx_3d_clk,
  491. &axe_clk,
  492. &usb1_clk,
  493. &usb2_clk,
  494. &i2c_clk,
  495. &mscan_clk,
  496. &sdhc_clk,
  497. &pci_clk,
  498. &psc_mclk_in,
  499. &spdif_txclk,
  500. &spdif_rxclk,
  501. &ac97_clk,
  502. NULL
  503. };
  504. static void rate_clk_init(struct clk *clk)
  505. {
  506. if (clk->calc) {
  507. clk->calc(clk);
  508. clk->flags |= CLK_HAS_RATE;
  509. clk_register(clk);
  510. } else {
  511. printk(KERN_WARNING
  512. "Could not initialize clk %s without a calc routine\n",
  513. clk->name);
  514. }
  515. }
  516. static void rate_clks_init(void)
  517. {
  518. struct clk **cpp, *clk;
  519. cpp = rate_clks;
  520. while ((clk = *cpp++))
  521. rate_clk_init(clk);
  522. }
  523. /*
  524. * There are two clk enable registers with 32 enable bits each
  525. * psc clocks and device clocks are all stored in dev_clks
  526. */
  527. static struct clk dev_clks[2][32];
  528. /*
  529. * Given a psc number return the dev_clk
  530. * associated with it
  531. */
  532. static struct clk *psc_dev_clk(int pscnum)
  533. {
  534. int reg, bit;
  535. struct clk *clk;
  536. reg = 0;
  537. bit = 27 - pscnum;
  538. clk = &dev_clks[reg][bit];
  539. clk->reg = 0;
  540. clk->bit = bit;
  541. return clk;
  542. }
  543. /*
  544. * PSC clock rate calculation
  545. */
  546. static void psc_calc_rate(struct clk *clk, int pscnum, struct device_node *np)
  547. {
  548. unsigned long mclk_src = sys_clk.rate;
  549. unsigned long mclk_div;
  550. /*
  551. * Can only change value of mclk divider
  552. * when the divider is disabled.
  553. *
  554. * Zero is not a valid divider so minimum
  555. * divider is 1
  556. *
  557. * disable/set divider/enable
  558. */
  559. out_be32(&clockctl->pccr[pscnum], 0);
  560. out_be32(&clockctl->pccr[pscnum], 0x00020000);
  561. out_be32(&clockctl->pccr[pscnum], 0x00030000);
  562. if (in_be32(&clockctl->pccr[pscnum]) & 0x80) {
  563. clk->rate = spdif_rxclk.rate;
  564. return;
  565. }
  566. switch ((in_be32(&clockctl->pccr[pscnum]) >> 14) & 0x3) {
  567. case 0:
  568. mclk_src = sys_clk.rate;
  569. break;
  570. case 1:
  571. mclk_src = ref_clk.rate;
  572. break;
  573. case 2:
  574. mclk_src = psc_mclk_in.rate;
  575. break;
  576. case 3:
  577. mclk_src = spdif_txclk.rate;
  578. break;
  579. }
  580. mclk_div = ((in_be32(&clockctl->pccr[pscnum]) >> 17) & 0x7fff) + 1;
  581. clk->rate = mclk_src / mclk_div;
  582. }
  583. /*
  584. * Find all psc nodes in device tree and assign a clock
  585. * with name "psc%d_mclk" and dev pointing at the device
  586. * returned from of_find_device_by_node
  587. */
  588. static void psc_clks_init(void)
  589. {
  590. struct device_node *np;
  591. struct platform_device *ofdev;
  592. u32 reg;
  593. const char *psc_compat;
  594. psc_compat = mpc512x_select_psc_compat();
  595. if (!psc_compat)
  596. return;
  597. for_each_compatible_node(np, NULL, psc_compat) {
  598. if (!of_property_read_u32(np, "reg", &reg)) {
  599. int pscnum = (reg & 0xf00) >> 8;
  600. struct clk *clk = psc_dev_clk(pscnum);
  601. clk->flags = CLK_HAS_RATE | CLK_HAS_CTRL;
  602. ofdev = of_find_device_by_node(np);
  603. clk->dev = &ofdev->dev;
  604. /*
  605. * AC97 is special rate clock does
  606. * not go through normal path
  607. */
  608. if (of_device_is_compatible(np, "fsl,mpc5121-psc-ac97"))
  609. clk->rate = ac97_clk.rate;
  610. else
  611. psc_calc_rate(clk, pscnum, np);
  612. sprintf(clk->name, "psc%d_mclk", pscnum);
  613. clk_register(clk);
  614. clk_enable(clk);
  615. }
  616. }
  617. }
  618. static struct clk_interface mpc5121_clk_functions = {
  619. .clk_get = mpc5121_clk_get,
  620. .clk_enable = mpc5121_clk_enable,
  621. .clk_disable = mpc5121_clk_disable,
  622. .clk_get_rate = mpc5121_clk_get_rate,
  623. .clk_put = mpc5121_clk_put,
  624. .clk_round_rate = mpc5121_clk_round_rate,
  625. .clk_set_rate = mpc5121_clk_set_rate,
  626. .clk_set_parent = NULL,
  627. .clk_get_parent = NULL,
  628. };
  629. int __init mpc5121_clk_init(void)
  630. {
  631. struct device_node *np;
  632. np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-clock");
  633. if (np) {
  634. clockctl = of_iomap(np, 0);
  635. of_node_put(np);
  636. }
  637. if (!clockctl) {
  638. printk(KERN_ERR "Could not map clock control registers\n");
  639. return 0;
  640. }
  641. rate_clks_init();
  642. psc_clks_init();
  643. /* leave clockctl mapped forever */
  644. /*iounmap(clockctl); */
  645. DEBUG_CLK_DUMP();
  646. clocks_initialized++;
  647. clk_functions = mpc5121_clk_functions;
  648. return 0;
  649. }