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 "clk-icst.h"
  14. #define REALVIEW_SYS_OSC0_OFFSET 0x0C
  15. #define REALVIEW_SYS_OSC1_OFFSET 0x10
  16. #define REALVIEW_SYS_OSC2_OFFSET 0x14
  17. #define REALVIEW_SYS_OSC3_OFFSET 0x18
  18. #define REALVIEW_SYS_OSC4_OFFSET 0x1C /* OSC1 for RealView/AB */
  19. #define REALVIEW_SYS_LOCK_OFFSET 0x20
  20. /*
  21. * Implementation of the ARM RealView clock trees.
  22. */
  23. static const struct icst_params realview_oscvco_params = {
  24. .ref = 24000000,
  25. .vco_max = ICST307_VCO_MAX,
  26. .vco_min = ICST307_VCO_MIN,
  27. .vd_min = 4 + 8,
  28. .vd_max = 511 + 8,
  29. .rd_min = 1 + 2,
  30. .rd_max = 127 + 2,
  31. .s2div = icst307_s2div,
  32. .idx2s = icst307_idx2s,
  33. };
  34. static const struct clk_icst_desc realview_osc0_desc __initconst = {
  35. .params = &realview_oscvco_params,
  36. .vco_offset = REALVIEW_SYS_OSC0_OFFSET,
  37. .lock_offset = REALVIEW_SYS_LOCK_OFFSET,
  38. };
  39. static const struct clk_icst_desc realview_osc4_desc __initconst = {
  40. .params = &realview_oscvco_params,
  41. .vco_offset = REALVIEW_SYS_OSC4_OFFSET,
  42. .lock_offset = REALVIEW_SYS_LOCK_OFFSET,
  43. };
  44. /*
  45. * realview_clk_init() - set up the RealView clock tree
  46. */
  47. void __init realview_clk_init(void __iomem *sysbase, bool is_pb1176)
  48. {
  49. struct clk *clk;
  50. /* APB clock dummy */
  51. clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, 0, 0);
  52. clk_register_clkdev(clk, "apb_pclk", NULL);
  53. /* 24 MHz clock */
  54. clk = clk_register_fixed_rate(NULL, "clk24mhz", NULL, 0, 24000000);
  55. clk_register_clkdev(clk, NULL, "dev:uart0");
  56. clk_register_clkdev(clk, NULL, "dev:uart1");
  57. clk_register_clkdev(clk, NULL, "dev:uart2");
  58. clk_register_clkdev(clk, NULL, "fpga:kmi0");
  59. clk_register_clkdev(clk, NULL, "fpga:kmi1");
  60. clk_register_clkdev(clk, NULL, "fpga:mmc0");
  61. clk_register_clkdev(clk, NULL, "dev:ssp0");
  62. if (is_pb1176) {
  63. /*
  64. * UART3 is on the dev chip in PB1176
  65. * UART4 only exists in PB1176
  66. */
  67. clk_register_clkdev(clk, NULL, "dev:uart3");
  68. clk_register_clkdev(clk, NULL, "dev:uart4");
  69. } else
  70. clk_register_clkdev(clk, NULL, "fpga:uart3");
  71. /* 1 MHz clock */
  72. clk = clk_register_fixed_rate(NULL, "clk1mhz", NULL, 0, 1000000);
  73. clk_register_clkdev(clk, NULL, "sp804");
  74. /* ICST VCO clock */
  75. if (is_pb1176)
  76. clk = icst_clk_register(NULL, &realview_osc0_desc,
  77. "osc0", NULL, sysbase);
  78. else
  79. clk = icst_clk_register(NULL, &realview_osc4_desc,
  80. "osc4", NULL, sysbase);
  81. clk_register_clkdev(clk, NULL, "dev:clcd");
  82. clk_register_clkdev(clk, NULL, "issp:clcd");
  83. }