abx500-clk.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. * abx500 clock implementation for ux500 platform.
  3. *
  4. * Copyright (C) 2012 ST-Ericsson SA
  5. * Author: Ulf Hansson <ulf.hansson@linaro.org>
  6. *
  7. * License terms: GNU General Public License (GPL) version 2
  8. */
  9. #include <linux/err.h>
  10. #include <linux/module.h>
  11. #include <linux/device.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/mfd/abx500/ab8500.h>
  14. #include <linux/mfd/abx500/ab8500-sysctrl.h>
  15. #include <linux/clkdev.h>
  16. #include <linux/clk-provider.h>
  17. #include <linux/mfd/dbx500-prcmu.h>
  18. #include "clk.h"
  19. /* Clock definitions for ab8500 */
  20. static int ab8500_reg_clks(struct device *dev)
  21. {
  22. int ret;
  23. struct clk *clk;
  24. const char *intclk_parents[] = {"ab8500_sysclk", "ulpclk"};
  25. u16 intclk_reg_sel[] = {0 , AB8500_SYSULPCLKCTRL1};
  26. u8 intclk_reg_mask[] = {0 , AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_MASK};
  27. u8 intclk_reg_bits[] = {
  28. 0 ,
  29. (1 << AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_SHIFT)
  30. };
  31. dev_info(dev, "register clocks for ab850x\n");
  32. /* Enable SWAT */
  33. ret = ab8500_sysctrl_set(AB8500_SWATCTRL, AB8500_SWATCTRL_SWATENABLE);
  34. if (ret)
  35. return ret;
  36. /* ab8500_sysclk */
  37. clk = clk_reg_prcmu_gate("ab8500_sysclk", NULL, PRCMU_SYSCLK, 0);
  38. clk_register_clkdev(clk, "sysclk", "ab8500-usb.0");
  39. clk_register_clkdev(clk, "sysclk", "ab-iddet.0");
  40. clk_register_clkdev(clk, "sysclk", "snd-soc-mop500.0");
  41. clk_register_clkdev(clk, "sysclk", "shrm_bus");
  42. /* ab8500_sysclk2 */
  43. clk = clk_reg_sysctrl_gate(dev , "ab8500_sysclk2", "ab8500_sysclk",
  44. AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSCLKBUF2REQ,
  45. AB8500_SYSULPCLKCTRL1_SYSCLKBUF2REQ, 0, 0);
  46. clk_register_clkdev(clk, "sysclk", "0-0070");
  47. /* ab8500_sysclk3 */
  48. clk = clk_reg_sysctrl_gate(dev , "ab8500_sysclk3", "ab8500_sysclk",
  49. AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSCLKBUF3REQ,
  50. AB8500_SYSULPCLKCTRL1_SYSCLKBUF3REQ, 0, 0);
  51. clk_register_clkdev(clk, "sysclk", "cg1960_core.0");
  52. /* ab8500_sysclk4 */
  53. clk = clk_reg_sysctrl_gate(dev , "ab8500_sysclk4", "ab8500_sysclk",
  54. AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSCLKBUF4REQ,
  55. AB8500_SYSULPCLKCTRL1_SYSCLKBUF4REQ, 0, 0);
  56. /* ab_ulpclk */
  57. clk = clk_reg_sysctrl_gate_fixed_rate(dev, "ulpclk", NULL,
  58. AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_ULPCLKREQ,
  59. AB8500_SYSULPCLKCTRL1_ULPCLKREQ,
  60. 38400000, 9000, 0);
  61. clk_register_clkdev(clk, "ulpclk", "snd-soc-mop500.0");
  62. /* ab8500_intclk */
  63. clk = clk_reg_sysctrl_set_parent(dev , "intclk", intclk_parents, 2,
  64. intclk_reg_sel, intclk_reg_mask, intclk_reg_bits, 0);
  65. clk_register_clkdev(clk, "intclk", "snd-soc-mop500.0");
  66. clk_register_clkdev(clk, NULL, "ab8500-pwm.1");
  67. /* ab8500_audioclk */
  68. clk = clk_reg_sysctrl_gate(dev , "audioclk", "intclk",
  69. AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_AUDIOCLKENA,
  70. AB8500_SYSULPCLKCTRL1_AUDIOCLKENA, 0, 0);
  71. clk_register_clkdev(clk, "audioclk", "ab8500-codec.0");
  72. return 0;
  73. }
  74. /* Clock definitions for ab8540 */
  75. static int ab8540_reg_clks(struct device *dev)
  76. {
  77. return 0;
  78. }
  79. /* Clock definitions for ab9540 */
  80. static int ab9540_reg_clks(struct device *dev)
  81. {
  82. return 0;
  83. }
  84. static int abx500_clk_probe(struct platform_device *pdev)
  85. {
  86. struct ab8500 *parent = dev_get_drvdata(pdev->dev.parent);
  87. int ret;
  88. if (is_ab8500(parent) || is_ab8505(parent)) {
  89. ret = ab8500_reg_clks(&pdev->dev);
  90. } else if (is_ab8540(parent)) {
  91. ret = ab8540_reg_clks(&pdev->dev);
  92. } else if (is_ab9540(parent)) {
  93. ret = ab9540_reg_clks(&pdev->dev);
  94. } else {
  95. dev_err(&pdev->dev, "non supported plf id\n");
  96. return -ENODEV;
  97. }
  98. return ret;
  99. }
  100. static struct platform_driver abx500_clk_driver = {
  101. .driver = {
  102. .name = "abx500-clk",
  103. },
  104. .probe = abx500_clk_probe,
  105. };
  106. static int __init abx500_clk_init(void)
  107. {
  108. return platform_driver_register(&abx500_clk_driver);
  109. }
  110. arch_initcall(abx500_clk_init);
  111. MODULE_AUTHOR("Ulf Hansson <ulf.hansson@linaro.org");
  112. MODULE_DESCRIPTION("ABX500 clk driver");
  113. MODULE_LICENSE("GPL v2");