clk-realview.c 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Clock driver for the ARM RealView boards
  3. * Copyright (C) 2012 Linus Walleij
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. */
  9. #include <linux/clkdev.h>
  10. #include <linux/err.h>
  11. #include <linux/io.h>
  12. #include <linux/clk-provider.h>
  13. #include "icst.h"
  14. #include "clk-icst.h"
  15. #define REALVIEW_SYS_OSC0_OFFSET 0x0C
  16. #define REALVIEW_SYS_OSC1_OFFSET 0x10
  17. #define REALVIEW_SYS_OSC2_OFFSET 0x14
  18. #define REALVIEW_SYS_OSC3_OFFSET 0x18
  19. #define REALVIEW_SYS_OSC4_OFFSET 0x1C /* OSC1 for RealView/AB */
  20. #define REALVIEW_SYS_LOCK_OFFSET 0x20
  21. /*
  22. * Implementation of the ARM RealView clock trees.
  23. */
  24. static const struct icst_params realview_oscvco_params = {
  25. .ref = 24000000,
  26. .vco_max = ICST307_VCO_MAX,
  27. .vco_min = ICST307_VCO_MIN,
  28. .vd_min = 4 + 8,
  29. .vd_max = 511 + 8,
  30. .rd_min = 1 + 2,
  31. .rd_max = 127 + 2,
  32. .s2div = icst307_s2div,
  33. .idx2s = icst307_idx2s,
  34. };
  35. static const struct clk_icst_desc realview_osc0_desc __initconst = {
  36. .params = &realview_oscvco_params,
  37. .vco_offset = REALVIEW_SYS_OSC0_OFFSET,
  38. .lock_offset = REALVIEW_SYS_LOCK_OFFSET,
  39. };
  40. static const struct clk_icst_desc realview_osc4_desc __initconst = {
  41. .params = &realview_oscvco_params,
  42. .vco_offset = REALVIEW_SYS_OSC4_OFFSET,
  43. .lock_offset = REALVIEW_SYS_LOCK_OFFSET,
  44. };
  45. /*
  46. * realview_clk_init() - set up the RealView clock tree
  47. */
  48. void __init realview_clk_init(void __iomem *sysbase, bool is_pb1176)
  49. {
  50. struct clk *clk;
  51. /* APB clock dummy */
  52. clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, 0, 0);
  53. clk_register_clkdev(clk, "apb_pclk", NULL);
  54. /* 24 MHz clock */
  55. clk = clk_register_fixed_rate(NULL, "clk24mhz", NULL, 0, 24000000);
  56. clk_register_clkdev(clk, NULL, "dev:uart0");
  57. clk_register_clkdev(clk, NULL, "dev:uart1");
  58. clk_register_clkdev(clk, NULL, "dev:uart2");
  59. clk_register_clkdev(clk, NULL, "fpga:kmi0");
  60. clk_register_clkdev(clk, NULL, "fpga:kmi1");
  61. clk_register_clkdev(clk, NULL, "fpga:mmc0");
  62. clk_register_clkdev(clk, NULL, "dev:ssp0");
  63. if (is_pb1176) {
  64. /*
  65. * UART3 is on the dev chip in PB1176
  66. * UART4 only exists in PB1176
  67. */
  68. clk_register_clkdev(clk, NULL, "dev:uart3");
  69. clk_register_clkdev(clk, NULL, "dev:uart4");
  70. } else
  71. clk_register_clkdev(clk, NULL, "fpga:uart3");
  72. /* 1 MHz clock */
  73. clk = clk_register_fixed_rate(NULL, "clk1mhz", NULL, 0, 1000000);
  74. clk_register_clkdev(clk, NULL, "sp804");
  75. /* ICST VCO clock */
  76. if (is_pb1176)
  77. clk = icst_clk_register(NULL, &realview_osc0_desc,
  78. "osc0", NULL, sysbase);
  79. else
  80. clk = icst_clk_register(NULL, &realview_osc4_desc,
  81. "osc4", NULL, sysbase);
  82. clk_register_clkdev(clk, NULL, "dev:clcd");
  83. clk_register_clkdev(clk, NULL, "issp:clcd");
  84. }