clk-realview.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include <linux/clk.h>
  2. #include <linux/clkdev.h>
  3. #include <linux/err.h>
  4. #include <linux/io.h>
  5. #include <linux/clk-provider.h>
  6. #include <mach/hardware.h>
  7. #include <mach/platform.h>
  8. #include "clk-icst.h"
  9. /*
  10. * Implementation of the ARM RealView clock trees.
  11. */
  12. static void __iomem *sys_lock;
  13. static void __iomem *sys_vcoreg;
  14. /**
  15. * realview_oscvco_get() - get ICST OSC settings for the RealView
  16. */
  17. static struct icst_vco realview_oscvco_get(void)
  18. {
  19. u32 val;
  20. struct icst_vco vco;
  21. val = readl(sys_vcoreg);
  22. vco.v = val & 0x1ff;
  23. vco.r = (val >> 9) & 0x7f;
  24. vco.s = (val >> 16) & 03;
  25. return vco;
  26. }
  27. static void realview_oscvco_set(struct icst_vco vco)
  28. {
  29. u32 val;
  30. val = readl(sys_vcoreg) & ~0x7ffff;
  31. val |= vco.v | (vco.r << 9) | (vco.s << 16);
  32. /* This magic unlocks the CM VCO so it can be controlled */
  33. writel(0xa05f, sys_lock);
  34. writel(val, sys_vcoreg);
  35. /* This locks the CM again */
  36. writel(0, sys_lock);
  37. }
  38. static const struct icst_params realview_oscvco_params = {
  39. .ref = 24000000,
  40. .vco_max = ICST307_VCO_MAX,
  41. .vco_min = ICST307_VCO_MIN,
  42. .vd_min = 4 + 8,
  43. .vd_max = 511 + 8,
  44. .rd_min = 1 + 2,
  45. .rd_max = 127 + 2,
  46. .s2div = icst307_s2div,
  47. .idx2s = icst307_idx2s,
  48. };
  49. static const struct clk_icst_desc __initdata realview_icst_desc = {
  50. .params = &realview_oscvco_params,
  51. .getvco = realview_oscvco_get,
  52. .setvco = realview_oscvco_set,
  53. };
  54. /*
  55. * realview_clk_init() - set up the RealView clock tree
  56. */
  57. void __init realview_clk_init(void __iomem *sysbase, bool is_pb1176)
  58. {
  59. struct clk *clk;
  60. sys_lock = sysbase + REALVIEW_SYS_LOCK_OFFSET;
  61. if (is_pb1176)
  62. sys_vcoreg = sysbase + REALVIEW_SYS_OSC0_OFFSET;
  63. else
  64. sys_vcoreg = sysbase + REALVIEW_SYS_OSC4_OFFSET;
  65. /* APB clock dummy */
  66. clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, CLK_IS_ROOT, 0);
  67. clk_register_clkdev(clk, "apb_pclk", NULL);
  68. /* 24 MHz clock */
  69. clk = clk_register_fixed_rate(NULL, "clk24mhz", NULL, CLK_IS_ROOT,
  70. 24000000);
  71. clk_register_clkdev(clk, NULL, "dev:uart0");
  72. clk_register_clkdev(clk, NULL, "dev:uart1");
  73. clk_register_clkdev(clk, NULL, "dev:uart2");
  74. clk_register_clkdev(clk, NULL, "fpga:kmi0");
  75. clk_register_clkdev(clk, NULL, "fpga:kmi1");
  76. clk_register_clkdev(clk, NULL, "fpga:mmc0");
  77. clk_register_clkdev(clk, NULL, "dev:ssp0");
  78. if (is_pb1176) {
  79. /*
  80. * UART3 is on the dev chip in PB1176
  81. * UART4 only exists in PB1176
  82. */
  83. clk_register_clkdev(clk, NULL, "dev:uart3");
  84. clk_register_clkdev(clk, NULL, "dev:uart4");
  85. } else
  86. clk_register_clkdev(clk, NULL, "fpga:uart3");
  87. /* 1 MHz clock */
  88. clk = clk_register_fixed_rate(NULL, "clk1mhz", NULL, CLK_IS_ROOT,
  89. 1000000);
  90. clk_register_clkdev(clk, NULL, "sp804");
  91. /* ICST VCO clock */
  92. clk = icst_clk_register(NULL, &realview_icst_desc);
  93. clk_register_clkdev(clk, NULL, "dev:clcd");
  94. clk_register_clkdev(clk, NULL, "issp:clcd");
  95. }