mdss_msm_gpio_pwm.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. #include <linux/gpio.h>
  13. #include <linux/of_gpio.h>
  14. #include "mdss_fb.h"
  15. #define GP_CLK_M_DEFAULT 1
  16. #define GP_CLK_N_DEFAULT 127
  17. #define GP_CLK_D_DEFAULT 127
  18. #define __inp(port) ioread8(port)
  19. #define __inpw(port) ioread16(port)
  20. #define __inpdw(port) ioread32(port)
  21. #define __outp(port, val) iowrite8(val, port)
  22. #define __outpw(port, val) iowrite16(val, port)
  23. #define __outpdw(port, val) iowrite32(val, port)
  24. #define in_dword(addr) (__inpdw(addr))
  25. #define in_dword_masked(addr, mask) (__inpdw(addr) & (mask))
  26. #define out_dword(addr, val) __outpdw(addr, val)
  27. #define out_dword_masked(io, mask, val, shadow) \
  28. (void) out_dword(io, \
  29. ((shadow & (unsigned int)(~(mask))) | ((unsigned int)((val) & (mask)))))
  30. #define out_dword_masked_ns(io, mask, val, current_reg_content) \
  31. (void) out_dword(io, \
  32. ((current_reg_content & (unsigned int)(~(mask))) \
  33. | ((unsigned int)((val) & (mask)))))
  34. extern void __iomem *virt_mmss_gp0_base;
  35. #define HWIO_GP0_CMD_RCGR_ADDR ((void __iomem *)(virt_mmss_gp0_base + 0)) //MMSS_CC_GP0_CMD_RCGR
  36. #define HWIO_GP0_CFG_RCGR_ADDR ((void __iomem *)(virt_mmss_gp0_base + 4)) //MMSS_CC_GP0_CFG_RCGR
  37. #define HWIO_GP_M_REG_ADDR ((void __iomem *)(virt_mmss_gp0_base + 8)) //MMSS_CC_GP0_M
  38. #define HWIO_GP_NS_REG_ADDR ((void __iomem *)(virt_mmss_gp0_base + 0xc)) //MMSS_CC_GP0_N
  39. #define HWIO_GP_D_REG_ADDR ((void __iomem *)(virt_mmss_gp0_base + 0x10)) //MMSS_CC_GP0_D
  40. #define HWIO_CAMSS_GP0_CBCR_ADDR ((void __iomem *)(virt_mmss_gp0_base + 0x24)) //MMSS_CC_CAMSS_GP0_CBCR
  41. #define HWIO_GP_MD_REG_RMSK 0xffffffff
  42. #define HWIO_GP_NS_REG_RMSK 0xffffffff
  43. #define HWIO_GP_MD_REG_M_VAL_BMSK 0xff
  44. #define HWIO_GP_MD_REG_M_VAL_SHFT 0
  45. #define HWIO_GP_MD_REG_D_VAL_BMSK 0xff
  46. #define HWIO_GP_MD_REG_D_VAL_SHFT 0
  47. #define HWIO_GP_NS_REG_GP_N_VAL_BMSK 0xff
  48. #define HWIO_GP_SRC_SEL_VAL_BMSK 0x700
  49. #define HWIO_GP_SRC_SEL_VAL_SHFT 8
  50. #define HWIO_GP_SRC_DIV_VAL_BMSK 0x1f
  51. #define HWIO_GP_SRC_DIV_VAL_SHFT 0
  52. #define HWIO_GP_MODE_VAL_BMSK 0x3000
  53. #define HWIO_GP_MODE_VAL_SHFT 12
  54. #define HWIO_CLK_ENABLE_VAL_BMSK 0x1
  55. #define HWIO_CLK_ENABLE_VAL_SHFT 0
  56. #define HWIO_UPDATE_VAL_BMSK 0x1
  57. #define HWIO_UPDATE_VAL_SHFT 0
  58. #define HWIO_ROOT_EN_VAL_BMSK 0x2
  59. #define HWIO_ROOT_EN_VAL_SHFT 1
  60. #define HWIO_GP0_CMD_RCGR_IN \
  61. in_dword_masked(HWIO_GP0_CMD_RCGR_ADDR, HWIO_GP_NS_REG_RMSK)
  62. #define HWIO_GP0_CMD_RCGR_OUTM(m, v) \
  63. out_dword_masked_ns(HWIO_GP0_CMD_RCGR_ADDR, m, v, HWIO_GP0_CMD_RCGR_IN)
  64. #define HWIO_GP0_CFG_RCGR_IN \
  65. in_dword_masked(HWIO_GP0_CFG_RCGR_ADDR, HWIO_GP_NS_REG_RMSK)
  66. #define HWIO_GP0_CFG_RCGR_OUTM(m, v) \
  67. out_dword_masked_ns(HWIO_GP0_CFG_RCGR_ADDR, m, v, HWIO_GP0_CFG_RCGR_IN)
  68. #define HWIO_CAMSS_GP0_CBCR_IN \
  69. in_dword_masked(HWIO_CAMSS_GP0_CBCR_ADDR, HWIO_GP_NS_REG_RMSK)
  70. #define HWIO_CAMSS_GP0_CBCR_OUTM(m, v) \
  71. out_dword_masked_ns(HWIO_CAMSS_GP0_CBCR_ADDR, m, v, HWIO_CAMSS_GP0_CBCR_IN)
  72. #define HWIO_GP_D_REG_IN \
  73. in_dword_masked(HWIO_GP_D_REG_ADDR, HWIO_GP_MD_REG_RMSK)
  74. #define HWIO_GP_D_REG_OUTM(m, v)\
  75. out_dword_masked_ns(HWIO_GP_D_REG_ADDR, m, v, HWIO_GP_D_REG_IN)
  76. #define HWIO_GP_M_REG_IN \
  77. in_dword_masked(HWIO_GP_M_REG_ADDR, HWIO_GP_MD_REG_RMSK)
  78. #define HWIO_GP_M_REG_OUTM(m, v)\
  79. out_dword_masked_ns(HWIO_GP_M_REG_ADDR, m, v, HWIO_GP_M_REG_IN)
  80. #define HWIO_GP_NS_REG_IN \
  81. in_dword_masked(HWIO_GP_NS_REG_ADDR, HWIO_GP_NS_REG_RMSK)
  82. #define HWIO_GP_NS_REG_OUTM(m, v) \
  83. out_dword_masked_ns(HWIO_GP_NS_REG_ADDR, m, v, HWIO_GP_NS_REG_IN)
  84. #define __msmhwio_outm(hwiosym, mask, val) HWIO_##hwiosym##_OUTM(mask, val)
  85. #define HWIO_OUTM(hwiosym, mask, val) __msmhwio_outm(hwiosym, mask, val)
  86. void mdss_dsi_panel_bklt_pwm( int level)
  87. {
  88. /* Put the MND counter in reset mode for programming */
  89. HWIO_OUTM(GP0_CFG_RCGR, HWIO_GP_SRC_SEL_VAL_BMSK,
  90. 0 << HWIO_GP_SRC_SEL_VAL_SHFT); //SRC_SEL = 000(cxo)
  91. HWIO_OUTM(GP0_CFG_RCGR, HWIO_GP_SRC_DIV_VAL_BMSK,
  92. 31 << HWIO_GP_SRC_DIV_VAL_SHFT); //SRC_DIV = 11111 (Div 16)
  93. HWIO_OUTM(GP0_CFG_RCGR, HWIO_GP_MODE_VAL_BMSK,
  94. 2 << HWIO_GP_MODE_VAL_SHFT); //Mode Select 10
  95. //M value
  96. HWIO_OUTM(GP_M_REG, HWIO_GP_MD_REG_M_VAL_BMSK,
  97. GP_CLK_M_DEFAULT << HWIO_GP_MD_REG_M_VAL_SHFT);
  98. // D value
  99. HWIO_OUTM(GP_D_REG, HWIO_GP_MD_REG_D_VAL_BMSK,
  100. (~((int16_t)level << 1)) << HWIO_GP_MD_REG_D_VAL_SHFT);
  101. //N value
  102. HWIO_OUTM(GP_NS_REG, HWIO_GP_NS_REG_GP_N_VAL_BMSK,
  103. ~(GP_CLK_N_DEFAULT - GP_CLK_M_DEFAULT) << 0);
  104. HWIO_OUTM(GP0_CMD_RCGR,HWIO_UPDATE_VAL_BMSK,
  105. 1 << HWIO_UPDATE_VAL_SHFT);//UPDATE ACTIVE
  106. HWIO_OUTM(GP0_CMD_RCGR,HWIO_ROOT_EN_VAL_BMSK,
  107. 1 << HWIO_ROOT_EN_VAL_SHFT);//ROOT_EN
  108. HWIO_OUTM(CAMSS_GP0_CBCR, HWIO_CLK_ENABLE_VAL_BMSK,
  109. 1 << HWIO_CLK_ENABLE_VAL_SHFT); //CLK_ENABLE
  110. }