ddp_pwm_mux.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include <linux/kernel.h>
  2. #include <linux/clk.h>
  3. #include <ddp_drv.h>
  4. #include <ddp_pwm_mux.h>
  5. #include <linux/of.h>
  6. #include <linux/of_address.h>
  7. #include <ddp_reg.h>
  8. #define PWM_MSG(fmt, arg...) pr_debug("[PWM] " fmt "\n", ##arg)
  9. #define PWM_ERR(fmt, arg...) pr_err("[PWM] " fmt "\n", ##arg)
  10. /*****************************************************************************
  11. *
  12. * variable for get clock node fromdts
  13. *
  14. *****************************************************************************/
  15. static void __iomem *disp_pmw_mux_base;
  16. #ifndef MUX_DISPPWM_ADDR /* disp pwm source clock select register address */
  17. #define MUX_DISPPWM_ADDR (disp_pmw_mux_base + 0xB0)
  18. #endif
  19. /* clock hard code access API */
  20. #define DRV_Reg32(addr) INREG32(addr)
  21. #define clk_readl(addr) DRV_Reg32(addr)
  22. #define clk_writel(addr, val) mt_reg_sync_writel(val, addr)
  23. /*****************************************************************************
  24. *
  25. * disp pwm source clock select mux api
  26. *
  27. *****************************************************************************/
  28. #ifndef CONFIG_MTK_CLKMGR
  29. eDDP_CLK_ID disp_pwm_get_clkid(unsigned int clk_req)
  30. {
  31. eDDP_CLK_ID clkid = -1;
  32. switch (clk_req) {
  33. case 1:
  34. clkid = UNIVPLL2_D4;
  35. break;
  36. case 2:
  37. clkid = SYSPLL4_D2_D8;
  38. break;
  39. case 3:
  40. clkid = SYS_26M_CK;
  41. break;
  42. default:
  43. clkid = -1;
  44. break;
  45. }
  46. return clkid;
  47. }
  48. #endif
  49. /*****************************************************************************
  50. *
  51. * get disp pwm source mux node
  52. *
  53. *****************************************************************************/
  54. #define DTSI_TOPCKGEN "mediatek,mt6735-topckgen"
  55. int disp_pwm_get_muxbase(void)
  56. {
  57. int ret = 0;
  58. struct device_node *node;
  59. if (disp_pmw_mux_base != NULL) {
  60. PWM_MSG("TOPCKGEN node exist");
  61. return 0;
  62. }
  63. node = of_find_compatible_node(NULL, NULL, DTSI_TOPCKGEN);
  64. if (!node) {
  65. PWM_ERR("DISP find TOPCKGEN node failed\n");
  66. return -1;
  67. }
  68. disp_pmw_mux_base = of_iomap(node, 0);
  69. if (!disp_pmw_mux_base) {
  70. PWM_ERR("DISP TOPCKGEN base failed\n");
  71. return -1;
  72. }
  73. PWM_MSG("find TOPCKGEN node");
  74. return ret;
  75. }
  76. unsigned int disp_pwm_get_pwmmux(void)
  77. {
  78. unsigned int regsrc = 0;
  79. #ifdef CONFIG_MTK_CLKMGR /* MTK Clock Manager */
  80. regsrc = DISP_REG_GET(CLK_CFG_7);
  81. #else /* Common Clock Framework */
  82. if (MUX_DISPPWM_ADDR != NULL)
  83. regsrc = clk_readl(MUX_DISPPWM_ADDR);
  84. else
  85. PWM_ERR("mux addr illegal");
  86. #endif
  87. return regsrc;
  88. }
  89. /*****************************************************************************
  90. *
  91. * disp pwm source clock select mux api
  92. *
  93. *****************************************************************************/
  94. int disp_pwm_set_pwmmux(unsigned int clk_req)
  95. {
  96. unsigned int regsrc;
  97. #ifdef CONFIG_MTK_CLKMGR /* MTK Clock Manager */
  98. regsrc = disp_pwm_get_pwmmux();
  99. clkmux_sel(MT_MUX_DISPPWM, clk_req, "DISP_PWM");
  100. PWM_MSG("PWM_MUX %x->%x", regsrc, disp_pwm_get_pwmmux());
  101. #else /* Common Clock Framework */
  102. int ret = 0;
  103. eDDP_CLK_ID clkid = -1;
  104. clkid = disp_pwm_get_clkid(clk_req);
  105. ret = disp_pwm_get_muxbase();
  106. regsrc = disp_pwm_get_pwmmux();
  107. PWM_MSG("clk_req=%d clkid=%d", clk_req, clkid);
  108. if (clkid != -1) {
  109. ddp_clk_enable(MUX_PWM);
  110. ddp_clk_set_parent(MUX_PWM, clkid);
  111. ddp_clk_disable(MUX_PWM);
  112. }
  113. PWM_MSG("PWM_MUX %x->%x", regsrc, disp_pwm_get_pwmmux());
  114. #endif
  115. return 0;
  116. }