rouleur-regmap.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/regmap.h>
  6. #include <linux/device.h>
  7. #include "rouleur-registers.h"
  8. extern const u8 rouleur_reg_access_analog[
  9. ROULEUR_REG(ROULEUR_ANALOG_REGISTERS_MAX_SIZE)];
  10. extern const u8 rouleur_reg_access_digital[
  11. ROULEUR_REG(ROULEUR_DIGITAL_REGISTERS_MAX_SIZE)];
  12. static const struct reg_default rouleur_defaults[] = {
  13. { ROULEUR_ANA_MICBIAS_MICB_1_2_EN, 0x01 },
  14. { ROULEUR_ANA_MICBIAS_MICB_3_EN, 0x00 },
  15. { ROULEUR_ANA_MICBIAS_LDO_1_SETTING, 0x21 },
  16. { ROULEUR_ANA_MICBIAS_LDO_1_CTRL, 0x01 },
  17. { ROULEUR_ANA_TX_AMIC1, 0x00 },
  18. { ROULEUR_ANA_TX_AMIC2, 0x00 },
  19. { ROULEUR_ANA_MBHC_MECH, 0x39 },
  20. { ROULEUR_ANA_MBHC_ELECT, 0x08 },
  21. { ROULEUR_ANA_MBHC_ZDET, 0x10 },
  22. { ROULEUR_ANA_MBHC_RESULT_1, 0x00 },
  23. { ROULEUR_ANA_MBHC_RESULT_2, 0x00 },
  24. { ROULEUR_ANA_MBHC_RESULT_3, 0x00 },
  25. { ROULEUR_ANA_MBHC_BTN0_ZDET_VREF1, 0x00 },
  26. { ROULEUR_ANA_MBHC_BTN1_ZDET_VREF2, 0x10 },
  27. { ROULEUR_ANA_MBHC_BTN2_ZDET_VREF3, 0x20 },
  28. { ROULEUR_ANA_MBHC_BTN3_ZDET_DBG_400, 0x30 },
  29. { ROULEUR_ANA_MBHC_BTN4_ZDET_DBG_1400, 0x40 },
  30. { ROULEUR_ANA_MBHC_MICB2_RAMP, 0x00 },
  31. { ROULEUR_ANA_MBHC_CTL_1, 0x02 },
  32. { ROULEUR_ANA_MBHC_CTL_2, 0x05 },
  33. { ROULEUR_ANA_MBHC_PLUG_DETECT_CTL, 0xE9 },
  34. { ROULEUR_ANA_MBHC_ZDET_ANA_CTL, 0x0F },
  35. { ROULEUR_ANA_MBHC_ZDET_RAMP_CTL, 0x00 },
  36. { ROULEUR_ANA_MBHC_FSM_STATUS, 0x00 },
  37. { ROULEUR_ANA_MBHC_ADC_RESULT, 0x00 },
  38. { ROULEUR_ANA_MBHC_CTL_CLK, 0x30 },
  39. { ROULEUR_ANA_MBHC_ZDET_CALIB_RESULT, 0x00 },
  40. { ROULEUR_ANA_NCP_EN, 0x00 },
  41. { ROULEUR_ANA_NCP_VCTRL, 0xA7 },
  42. { ROULEUR_ANA_HPHPA_CNP_CTL_1, 0x54 },
  43. { ROULEUR_ANA_HPHPA_CNP_CTL_2, 0x2B },
  44. { ROULEUR_ANA_HPHPA_PA_STATUS, 0x00 },
  45. { ROULEUR_ANA_HPHPA_FSM_CLK, 0x12 },
  46. { ROULEUR_ANA_HPHPA_L_GAIN, 0x00 },
  47. { ROULEUR_ANA_HPHPA_R_GAIN, 0x00 },
  48. { ROULEUR_SWR_HPHPA_HD2, 0x1B },
  49. { ROULEUR_ANA_HPHPA_SPARE_CTL, 0x02 },
  50. { ROULEUR_ANA_SURGE_EN, 0x38 },
  51. { ROULEUR_ANA_COMBOPA_CTL, 0x35 },
  52. { ROULEUR_ANA_COMBOPA_CTL_4, 0x84 },
  53. { ROULEUR_ANA_COMBOPA_CTL_5, 0x05 },
  54. { ROULEUR_ANA_RXLDO_CTL, 0x86 },
  55. { ROULEUR_ANA_MBIAS_EN, 0x00 },
  56. { ROULEUR_DIG_SWR_CHIP_ID0, 0x00 },
  57. { ROULEUR_DIG_SWR_CHIP_ID1, 0x00 },
  58. { ROULEUR_DIG_SWR_CHIP_ID2, 0x0C },
  59. { ROULEUR_DIG_SWR_CHIP_ID3, 0x01 },
  60. { ROULEUR_DIG_SWR_SWR_TX_CLK_RATE, 0x00 },
  61. { ROULEUR_DIG_SWR_CDC_RST_CTL, 0x03 },
  62. { ROULEUR_DIG_SWR_TOP_CLK_CFG, 0x00 },
  63. { ROULEUR_DIG_SWR_CDC_RX_CLK_CTL, 0x00 },
  64. { ROULEUR_DIG_SWR_CDC_TX_CLK_CTL, 0x33 },
  65. { ROULEUR_DIG_SWR_SWR_RST_EN, 0x00 },
  66. { ROULEUR_DIG_SWR_CDC_RX_RST, 0x00 },
  67. { ROULEUR_DIG_SWR_CDC_RX0_CTL, 0xFC },
  68. { ROULEUR_DIG_SWR_CDC_RX1_CTL, 0xFC },
  69. { ROULEUR_DIG_SWR_CDC_TX_ANA_MODE_0_1, 0x00 },
  70. { ROULEUR_DIG_SWR_CDC_COMP_CTL_0, 0x00 },
  71. { ROULEUR_DIG_SWR_CDC_RX_DELAY_CTL, 0x66 },
  72. { ROULEUR_DIG_SWR_CDC_RX_GAIN_0, 0x55 },
  73. { ROULEUR_DIG_SWR_CDC_RX_GAIN_1, 0xA9 },
  74. { ROULEUR_DIG_SWR_CDC_RX_GAIN_CTL, 0x00 },
  75. { ROULEUR_DIG_SWR_CDC_TX0_CTL, 0x68 },
  76. { ROULEUR_DIG_SWR_CDC_TX1_CTL, 0x68 },
  77. { ROULEUR_DIG_SWR_CDC_TX_RST, 0x00 },
  78. { ROULEUR_DIG_SWR_CDC_REQ0_CTL, 0x01 },
  79. { ROULEUR_DIG_SWR_CDC_REQ1_CTL, 0x01 },
  80. { ROULEUR_DIG_SWR_CDC_RST, 0x00 },
  81. { ROULEUR_DIG_SWR_CDC_AMIC_CTL, 0x02 },
  82. { ROULEUR_DIG_SWR_CDC_DMIC_CTL, 0x00 },
  83. { ROULEUR_DIG_SWR_CDC_DMIC1_CTL, 0x00 },
  84. { ROULEUR_DIG_SWR_CDC_DMIC1_RATE, 0x01 },
  85. { ROULEUR_DIG_SWR_PDM_WD_CTL0, 0x00 },
  86. { ROULEUR_DIG_SWR_PDM_WD_CTL1, 0x00 },
  87. { ROULEUR_DIG_SWR_INTR_MODE, 0x00 },
  88. { ROULEUR_DIG_SWR_INTR_MASK_0, 0xFF },
  89. { ROULEUR_DIG_SWR_INTR_MASK_1, 0x7F },
  90. { ROULEUR_DIG_SWR_INTR_MASK_2, 0x0C },
  91. { ROULEUR_DIG_SWR_INTR_STATUS_0, 0x00 },
  92. { ROULEUR_DIG_SWR_INTR_STATUS_1, 0x00 },
  93. { ROULEUR_DIG_SWR_INTR_STATUS_2, 0x00 },
  94. { ROULEUR_DIG_SWR_INTR_CLEAR_0, 0x00 },
  95. { ROULEUR_DIG_SWR_INTR_CLEAR_1, 0x00 },
  96. { ROULEUR_DIG_SWR_INTR_CLEAR_2, 0x00 },
  97. { ROULEUR_DIG_SWR_INTR_LEVEL_0, 0x00 },
  98. { ROULEUR_DIG_SWR_INTR_LEVEL_1, 0x2A },
  99. { ROULEUR_DIG_SWR_INTR_LEVEL_2, 0x00 },
  100. { ROULEUR_DIG_SWR_CDC_CONN_RX0_CTL, 0x00 },
  101. { ROULEUR_DIG_SWR_CDC_CONN_RX1_CTL, 0x00 },
  102. { ROULEUR_DIG_SWR_LOOP_BACK_MODE, 0x00 },
  103. { ROULEUR_DIG_SWR_DRIVE_STRENGTH_0, 0x00 },
  104. { ROULEUR_DIG_SWR_DIG_DEBUG_CTL, 0x00 },
  105. { ROULEUR_DIG_SWR_DIG_DEBUG_EN, 0x00 },
  106. { ROULEUR_DIG_SWR_DEM_BYPASS_DATA0, 0x55 },
  107. { ROULEUR_DIG_SWR_DEM_BYPASS_DATA1, 0x55 },
  108. { ROULEUR_DIG_SWR_DEM_BYPASS_DATA2, 0x55 },
  109. { ROULEUR_DIG_SWR_DEM_BYPASS_DATA3, 0x01 },
  110. };
  111. static bool rouleur_readable_register(struct device *dev, unsigned int reg)
  112. {
  113. if (reg > ROULEUR_ANA_BASE_ADDR && reg <
  114. ROULEUR_ANALOG_REGISTERS_MAX_SIZE)
  115. return rouleur_reg_access_analog[ROULEUR_REG(reg)] & RD_REG;
  116. if (reg > ROULEUR_DIG_BASE_ADDR && reg <
  117. ROULEUR_DIGITAL_REGISTERS_MAX_SIZE)
  118. return rouleur_reg_access_digital[ROULEUR_REG(reg)] & RD_REG;
  119. return 0;
  120. }
  121. static bool rouleur_writeable_register(struct device *dev, unsigned int reg)
  122. {
  123. if (reg > ROULEUR_ANA_BASE_ADDR && reg <
  124. ROULEUR_ANALOG_REGISTERS_MAX_SIZE)
  125. return rouleur_reg_access_analog[ROULEUR_REG(reg)] & WR_REG;
  126. if (reg > ROULEUR_DIG_BASE_ADDR && reg <
  127. ROULEUR_DIGITAL_REGISTERS_MAX_SIZE)
  128. return rouleur_reg_access_digital[ROULEUR_REG(reg)] & WR_REG;
  129. return 0;
  130. }
  131. static bool rouleur_volatile_register(struct device *dev, unsigned int reg)
  132. {
  133. if (reg > ROULEUR_ANA_BASE_ADDR && reg <
  134. ROULEUR_ANALOG_REGISTERS_MAX_SIZE)
  135. if ((rouleur_reg_access_analog[ROULEUR_REG(reg)] & RD_REG)
  136. && !(rouleur_reg_access_analog[ROULEUR_REG(reg)] & WR_REG))
  137. return true;
  138. if (reg > ROULEUR_DIG_BASE_ADDR && reg <
  139. ROULEUR_DIGITAL_REGISTERS_MAX_SIZE)
  140. if ((rouleur_reg_access_digital[ROULEUR_REG(reg)] & RD_REG)
  141. && !(rouleur_reg_access_digital[ROULEUR_REG(reg)] & WR_REG))
  142. return true;
  143. return 0;
  144. }
  145. struct regmap_config rouleur_regmap_config = {
  146. .name = "rouleur_csr",
  147. .reg_bits = 16,
  148. .val_bits = 8,
  149. .cache_type = REGCACHE_RBTREE,
  150. .reg_defaults = rouleur_defaults,
  151. .num_reg_defaults = ARRAY_SIZE(rouleur_defaults),
  152. .max_register = ROULEUR_ANALOG_MAX_REGISTER +
  153. ROULEUR_DIGITAL_MAX_REGISTER,
  154. .readable_reg = rouleur_readable_register,
  155. .writeable_reg = rouleur_writeable_register,
  156. .volatile_reg = rouleur_volatile_register,
  157. .can_multi_write = true,
  158. };