clkt2xxx_osc.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * OMAP2xxx osc_clk-specific clock code
  3. *
  4. * Copyright (C) 2005-2008 Texas Instruments, Inc.
  5. * Copyright (C) 2004-2010 Nokia Corporation
  6. *
  7. * Contacts:
  8. * Richard Woodruff <r-woodruff2@ti.com>
  9. * Paul Walmsley
  10. *
  11. * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
  12. * Gordon McNutt and RidgeRun, Inc.
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License version 2 as
  16. * published by the Free Software Foundation.
  17. */
  18. #undef DEBUG
  19. #include <linux/module.h>
  20. #include <linux/kernel.h>
  21. #include <linux/errno.h>
  22. #include <linux/clk.h>
  23. #include <linux/io.h>
  24. #include <plat/clock.h>
  25. #include "clock.h"
  26. #include "clock2xxx.h"
  27. #include "prm2xxx_3xxx.h"
  28. #include "prm-regbits-24xx.h"
  29. /*
  30. * XXX This does not actually enable the osc_ck, since the osc_ck must
  31. * be running for this function to be called. Instead, this function
  32. * is used to disable an autoidle mode on the osc_ck. The existing
  33. * clk_enable/clk_disable()-based usecounting for osc_ck should be
  34. * replaced with autoidle-based usecounting.
  35. */
  36. static int omap2_enable_osc_ck(struct clk *clk)
  37. {
  38. u32 pcc;
  39. pcc = __raw_readl(prcm_clksrc_ctrl);
  40. __raw_writel(pcc & ~OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
  41. return 0;
  42. }
  43. /*
  44. * XXX This does not actually disable the osc_ck, since doing so would
  45. * immediately halt the system. Instead, this function is used to
  46. * enable an autoidle mode on the osc_ck. The existing
  47. * clk_enable/clk_disable()-based usecounting for osc_ck should be
  48. * replaced with autoidle-based usecounting.
  49. */
  50. static void omap2_disable_osc_ck(struct clk *clk)
  51. {
  52. u32 pcc;
  53. pcc = __raw_readl(prcm_clksrc_ctrl);
  54. __raw_writel(pcc | OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
  55. }
  56. const struct clkops clkops_oscck = {
  57. .enable = omap2_enable_osc_ck,
  58. .disable = omap2_disable_osc_ck,
  59. };
  60. unsigned long omap2_osc_clk_recalc(struct clk *clk)
  61. {
  62. return omap2xxx_get_apll_clkin() * omap2xxx_get_sysclkdiv();
  63. }