q6prm-clocks.c 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2021, Linaro Limited
  3. #include <linux/err.h>
  4. #include <linux/init.h>
  5. #include <linux/clk-provider.h>
  6. #include <linux/module.h>
  7. #include <linux/device.h>
  8. #include <linux/platform_device.h>
  9. #include <dt-bindings/sound/qcom,q6dsp-lpass-ports.h>
  10. #include "q6dsp-lpass-clocks.h"
  11. #include "q6prm.h"
  12. #define Q6PRM_CLK(id) { \
  13. .clk_id = id, \
  14. .q6dsp_clk_id = Q6PRM_##id, \
  15. .name = #id, \
  16. .rate = 19200000, \
  17. }
  18. static const struct q6dsp_clk_init q6prm_clks[] = {
  19. Q6PRM_CLK(LPASS_CLK_ID_PRI_MI2S_IBIT),
  20. Q6PRM_CLK(LPASS_CLK_ID_PRI_MI2S_EBIT),
  21. Q6PRM_CLK(LPASS_CLK_ID_SEC_MI2S_IBIT),
  22. Q6PRM_CLK(LPASS_CLK_ID_SEC_MI2S_EBIT),
  23. Q6PRM_CLK(LPASS_CLK_ID_TER_MI2S_IBIT),
  24. Q6PRM_CLK(LPASS_CLK_ID_TER_MI2S_EBIT),
  25. Q6PRM_CLK(LPASS_CLK_ID_QUAD_MI2S_IBIT),
  26. Q6PRM_CLK(LPASS_CLK_ID_QUAD_MI2S_EBIT),
  27. Q6PRM_CLK(LPASS_CLK_ID_SPEAKER_I2S_IBIT),
  28. Q6PRM_CLK(LPASS_CLK_ID_SPEAKER_I2S_EBIT),
  29. Q6PRM_CLK(LPASS_CLK_ID_SPEAKER_I2S_OSR),
  30. Q6PRM_CLK(LPASS_CLK_ID_QUI_MI2S_IBIT),
  31. Q6PRM_CLK(LPASS_CLK_ID_QUI_MI2S_EBIT),
  32. Q6PRM_CLK(LPASS_CLK_ID_SEN_MI2S_IBIT),
  33. Q6PRM_CLK(LPASS_CLK_ID_SEN_MI2S_EBIT),
  34. Q6PRM_CLK(LPASS_CLK_ID_INT0_MI2S_IBIT),
  35. Q6PRM_CLK(LPASS_CLK_ID_INT1_MI2S_IBIT),
  36. Q6PRM_CLK(LPASS_CLK_ID_INT2_MI2S_IBIT),
  37. Q6PRM_CLK(LPASS_CLK_ID_INT3_MI2S_IBIT),
  38. Q6PRM_CLK(LPASS_CLK_ID_INT4_MI2S_IBIT),
  39. Q6PRM_CLK(LPASS_CLK_ID_INT5_MI2S_IBIT),
  40. Q6PRM_CLK(LPASS_CLK_ID_INT6_MI2S_IBIT),
  41. Q6PRM_CLK(LPASS_CLK_ID_QUI_MI2S_OSR),
  42. Q6PRM_CLK(LPASS_CLK_ID_WSA_CORE_MCLK),
  43. Q6PRM_CLK(LPASS_CLK_ID_WSA_CORE_NPL_MCLK),
  44. Q6PRM_CLK(LPASS_CLK_ID_VA_CORE_MCLK),
  45. Q6PRM_CLK(LPASS_CLK_ID_TX_CORE_MCLK),
  46. Q6PRM_CLK(LPASS_CLK_ID_TX_CORE_NPL_MCLK),
  47. Q6PRM_CLK(LPASS_CLK_ID_RX_CORE_MCLK),
  48. Q6PRM_CLK(LPASS_CLK_ID_RX_CORE_NPL_MCLK),
  49. Q6PRM_CLK(LPASS_CLK_ID_VA_CORE_2X_MCLK),
  50. Q6PRM_CLK(LPASS_CLK_ID_WSA2_CORE_MCLK),
  51. Q6PRM_CLK(LPASS_CLK_ID_WSA2_CORE_2X_MCLK),
  52. Q6PRM_CLK(LPASS_CLK_ID_RX_CORE_TX_MCLK),
  53. Q6PRM_CLK(LPASS_CLK_ID_RX_CORE_TX_2X_MCLK),
  54. Q6PRM_CLK(LPASS_CLK_ID_WSA_CORE_TX_MCLK),
  55. Q6PRM_CLK(LPASS_CLK_ID_WSA_CORE_TX_2X_MCLK),
  56. Q6PRM_CLK(LPASS_CLK_ID_WSA2_CORE_TX_MCLK),
  57. Q6PRM_CLK(LPASS_CLK_ID_WSA2_CORE_TX_2X_MCLK),
  58. Q6PRM_CLK(LPASS_CLK_ID_RX_CORE_MCLK2_2X_MCLK),
  59. Q6DSP_VOTE_CLK(LPASS_HW_MACRO_VOTE, Q6PRM_HW_CORE_ID_LPASS,
  60. "LPASS_HW_MACRO"),
  61. Q6DSP_VOTE_CLK(LPASS_HW_DCODEC_VOTE, Q6PRM_HW_CORE_ID_DCODEC,
  62. "LPASS_HW_DCODEC"),
  63. };
  64. static const struct q6dsp_clk_desc q6dsp_clk_q6prm __maybe_unused = {
  65. .clks = q6prm_clks,
  66. .num_clks = ARRAY_SIZE(q6prm_clks),
  67. .lpass_set_clk = q6prm_set_lpass_clock,
  68. .lpass_vote_clk = q6prm_vote_lpass_core_hw,
  69. .lpass_unvote_clk = q6prm_unvote_lpass_core_hw,
  70. };
  71. #ifdef CONFIG_OF
  72. static const struct of_device_id q6prm_clock_device_id[] = {
  73. { .compatible = "qcom,q6prm-lpass-clocks", .data = &q6dsp_clk_q6prm },
  74. {},
  75. };
  76. MODULE_DEVICE_TABLE(of, q6prm_clock_device_id);
  77. #endif
  78. static struct platform_driver q6prm_clock_platform_driver = {
  79. .driver = {
  80. .name = "q6prm-lpass-clock",
  81. .of_match_table = of_match_ptr(q6prm_clock_device_id),
  82. },
  83. .probe = q6dsp_clock_dev_probe,
  84. };
  85. module_platform_driver(q6prm_clock_platform_driver);
  86. MODULE_DESCRIPTION("Q6 Proxy Resource Manager LPASS clock driver");
  87. MODULE_LICENSE("GPL");