xref: /linux/sound/soc/codecs/max98396.c (revision 2aa680df68062e4e0c356ec2aa7100c13654907b)
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2022, Analog Devices Inc.
3 
4 #include <linux/gpio/consumer.h>
5 #include <linux/i2c.h>
6 #include <linux/module.h>
7 #include <sound/pcm_params.h>
8 #include <linux/regulator/consumer.h>
9 #include <sound/soc.h>
10 #include <sound/tlv.h>
11 #include "max98396.h"
12 
13 static const char * const max98396_core_supplies[MAX98396_NUM_CORE_SUPPLIES] = {
14 	"avdd",
15 	"dvdd",
16 	"dvddio",
17 };
18 
19 static const struct reg_default max98396_reg[] = {
20 	{MAX98396_R2000_SW_RESET, 0x00},
21 	{MAX98396_R2001_INT_RAW1, 0x00},
22 	{MAX98396_R2002_INT_RAW2, 0x00},
23 	{MAX98396_R2003_INT_RAW3, 0x00},
24 	{MAX98396_R2004_INT_RAW4, 0x00},
25 	{MAX98396_R2006_INT_STATE1, 0x00},
26 	{MAX98396_R2007_INT_STATE2, 0x00},
27 	{MAX98396_R2008_INT_STATE3, 0x00},
28 	{MAX98396_R2009_INT_STATE4, 0x00},
29 	{MAX98396_R200B_INT_FLAG1, 0x00},
30 	{MAX98396_R200C_INT_FLAG2, 0x00},
31 	{MAX98396_R200D_INT_FLAG3, 0x00},
32 	{MAX98396_R200E_INT_FLAG4, 0x00},
33 	{MAX98396_R2010_INT_EN1, 0x02},
34 	{MAX98396_R2011_INT_EN2, 0x00},
35 	{MAX98396_R2012_INT_EN3, 0x00},
36 	{MAX98396_R2013_INT_EN4, 0x00},
37 	{MAX98396_R2015_INT_FLAG_CLR1, 0x00},
38 	{MAX98396_R2016_INT_FLAG_CLR2, 0x00},
39 	{MAX98396_R2017_INT_FLAG_CLR3, 0x00},
40 	{MAX98396_R2018_INT_FLAG_CLR4, 0x00},
41 	{MAX98396_R201F_IRQ_CTRL, 0x00},
42 	{MAX98396_R2020_THERM_WARN_THRESH, 0x46},
43 	{MAX98396_R2021_THERM_WARN_THRESH2, 0x46},
44 	{MAX98396_R2022_THERM_SHDN_THRESH, 0x64},
45 	{MAX98396_R2023_THERM_HYSTERESIS, 0x02},
46 	{MAX98396_R2024_THERM_FOLDBACK_SET, 0xC5},
47 	{MAX98396_R2027_THERM_FOLDBACK_EN, 0x01},
48 	{MAX98396_R2030_NOISEGATE_MODE_CTRL, 0x32},
49 	{MAX98396_R2033_NOISEGATE_MODE_EN, 0x00},
50 	{MAX98396_R2038_CLK_MON_CTRL, 0x00},
51 	{MAX98396_R2039_DATA_MON_CTRL, 0x00},
52 	{MAX98396_R203F_ENABLE_CTRLS, 0x0F},
53 	{MAX98396_R2040_PIN_CFG, 0x55},
54 	{MAX98396_R2041_PCM_MODE_CFG, 0xC0},
55 	{MAX98396_R2042_PCM_CLK_SETUP, 0x04},
56 	{MAX98396_R2043_PCM_SR_SETUP, 0x88},
57 	{MAX98396_R2044_PCM_TX_CTRL_1, 0x00},
58 	{MAX98396_R2045_PCM_TX_CTRL_2, 0x00},
59 	{MAX98396_R2046_PCM_TX_CTRL_3, 0x00},
60 	{MAX98396_R2047_PCM_TX_CTRL_4, 0x00},
61 	{MAX98396_R2048_PCM_TX_CTRL_5, 0x00},
62 	{MAX98396_R2049_PCM_TX_CTRL_6, 0x00},
63 	{MAX98396_R204A_PCM_TX_CTRL_7, 0x00},
64 	{MAX98396_R204B_PCM_TX_CTRL_8, 0x00},
65 	{MAX98396_R204C_PCM_TX_HIZ_CTRL_1, 0xFF},
66 	{MAX98396_R204D_PCM_TX_HIZ_CTRL_2, 0xFF},
67 	{MAX98396_R204E_PCM_TX_HIZ_CTRL_3, 0xFF},
68 	{MAX98396_R204F_PCM_TX_HIZ_CTRL_4, 0xFF},
69 	{MAX98396_R2050_PCM_TX_HIZ_CTRL_5, 0xFF},
70 	{MAX98396_R2051_PCM_TX_HIZ_CTRL_6, 0xFF},
71 	{MAX98396_R2052_PCM_TX_HIZ_CTRL_7, 0xFF},
72 	{MAX98396_R2053_PCM_TX_HIZ_CTRL_8, 0xFF},
73 	{MAX98396_R2055_PCM_RX_SRC1, 0x00},
74 	{MAX98396_R2056_PCM_RX_SRC2, 0x00},
75 	{MAX98396_R2058_PCM_BYPASS_SRC, 0x00},
76 	{MAX98396_R205D_PCM_TX_SRC_EN, 0x00},
77 	{MAX98396_R205E_PCM_RX_EN, 0x00},
78 	{MAX98396_R205F_PCM_TX_EN, 0x00},
79 	{MAX98396_R2070_ICC_RX_EN_A, 0x00},
80 	{MAX98396_R2071_ICC_RX_EN_B, 0x00},
81 	{MAX98396_R2072_ICC_TX_CTRL, 0x00},
82 	{MAX98396_R207F_ICC_EN, 0x00},
83 	{MAX98396_R2083_TONE_GEN_DC_CFG, 0x04},
84 	{MAX98396_R2084_TONE_GEN_DC_LVL1, 0x00},
85 	{MAX98396_R2085_TONE_GEN_DC_LVL2, 0x00},
86 	{MAX98396_R2086_TONE_GEN_DC_LVL3, 0x00},
87 	{MAX98396_R208F_TONE_GEN_EN, 0x00},
88 	{MAX98396_R2090_AMP_VOL_CTRL, 0x00},
89 	{MAX98396_R2091_AMP_PATH_GAIN, 0x0B},
90 	{MAX98396_R2092_AMP_DSP_CFG, 0x23},
91 	{MAX98396_R2093_SSM_CFG, 0x0D},
92 	{MAX98396_R2094_SPK_CLS_DG_THRESH, 0x12},
93 	{MAX98396_R2095_SPK_CLS_DG_HDR, 0x17},
94 	{MAX98396_R2096_SPK_CLS_DG_HOLD_TIME, 0x17},
95 	{MAX98396_R2097_SPK_CLS_DG_DELAY, 0x00},
96 	{MAX98396_R2098_SPK_CLS_DG_MODE, 0x00},
97 	{MAX98396_R2099_SPK_CLS_DG_VBAT_LVL, 0x03},
98 	{MAX98396_R209A_SPK_EDGE_CTRL, 0x00},
99 	{MAX98396_R209C_SPK_EDGE_CTRL1, 0x0A},
100 	{MAX98396_R209D_SPK_EDGE_CTRL2, 0xAA},
101 	{MAX98396_R209E_AMP_CLIP_GAIN, 0x00},
102 	{MAX98396_R209F_BYPASS_PATH_CFG, 0x00},
103 	{MAX98396_R20A0_AMP_SUPPLY_CTL, 0x00},
104 	{MAX98396_R20AF_AMP_EN, 0x00},
105 	{MAX98396_R20B0_ADC_SR, 0x30},
106 	{MAX98396_R20B1_ADC_PVDD_CFG, 0x00},
107 	{MAX98396_R20B2_ADC_VBAT_CFG, 0x00},
108 	{MAX98396_R20B3_ADC_THERMAL_CFG, 0x00},
109 	{MAX98396_R20B4_ADC_READBACK_CTRL1, 0x00},
110 	{MAX98396_R20B5_ADC_READBACK_CTRL2, 0x00},
111 	{MAX98396_R20B6_ADC_PVDD_READBACK_MSB, 0x00},
112 	{MAX98396_R20B7_ADC_PVDD_READBACK_LSB, 0x00},
113 	{MAX98396_R20B8_ADC_VBAT_READBACK_MSB, 0x00},
114 	{MAX98396_R20B9_ADC_VBAT_READBACK_LSB, 0x00},
115 	{MAX98396_R20BA_ADC_TEMP_READBACK_MSB, 0x00},
116 	{MAX98396_R20BB_ADC_TEMP_READBACK_LSB, 0x00},
117 	{MAX98396_R20BC_ADC_LO_PVDD_READBACK_MSB, 0x00},
118 	{MAX98396_R20BD_ADC_LO_PVDD_READBACK_LSB, 0x00},
119 	{MAX98396_R20BE_ADC_LO_VBAT_READBACK_MSB, 0x00},
120 	{MAX98396_R20BF_ADC_LO_VBAT_READBACK_LSB, 0x00},
121 	{MAX98396_R20C7_ADC_CFG, 0x00},
122 	{MAX98396_R20D0_DHT_CFG1, 0x00},
123 	{MAX98396_R20D1_LIMITER_CFG1, 0x08},
124 	{MAX98396_R20D2_LIMITER_CFG2, 0x00},
125 	{MAX98396_R20D3_DHT_CFG2, 0x14},
126 	{MAX98396_R20D4_DHT_CFG3, 0x02},
127 	{MAX98396_R20D5_DHT_CFG4, 0x04},
128 	{MAX98396_R20D6_DHT_HYSTERESIS_CFG, 0x07},
129 	{MAX98396_R20DF_DHT_EN, 0x00},
130 	{MAX98396_R20E0_IV_SENSE_PATH_CFG, 0x04},
131 	{MAX98396_R20E4_IV_SENSE_PATH_EN, 0x00},
132 	{MAX98396_R20E5_BPE_STATE, 0x00},
133 	{MAX98396_R20E6_BPE_L3_THRESH_MSB, 0x00},
134 	{MAX98396_R20E7_BPE_L3_THRESH_LSB, 0x00},
135 	{MAX98396_R20E8_BPE_L2_THRESH_MSB, 0x00},
136 	{MAX98396_R20E9_BPE_L2_THRESH_LSB, 0x00},
137 	{MAX98396_R20EA_BPE_L1_THRESH_MSB, 0x00},
138 	{MAX98396_R20EB_BPE_L1_THRESH_LSB, 0x00},
139 	{MAX98396_R20EC_BPE_L0_THRESH_MSB, 0x00},
140 	{MAX98396_R20ED_BPE_L0_THRESH_LSB, 0x00},
141 	{MAX98396_R20EE_BPE_L3_DWELL_HOLD_TIME, 0x00},
142 	{MAX98396_R20EF_BPE_L2_DWELL_HOLD_TIME, 0x00},
143 	{MAX98396_R20F0_BPE_L1_DWELL_HOLD_TIME, 0x00},
144 	{MAX98396_R20F1_BPE_L0_HOLD_TIME, 0x00},
145 	{MAX98396_R20F2_BPE_L3_ATTACK_REL_STEP, 0x00},
146 	{MAX98396_R20F3_BPE_L2_ATTACK_REL_STEP, 0x00},
147 	{MAX98396_R20F4_BPE_L1_ATTACK_REL_STEP, 0x00},
148 	{MAX98396_R20F5_BPE_L0_ATTACK_REL_STEP, 0x00},
149 	{MAX98396_R20F6_BPE_L3_MAX_GAIN_ATTN, 0x00},
150 	{MAX98396_R20F7_BPE_L2_MAX_GAIN_ATTN, 0x00},
151 	{MAX98396_R20F8_BPE_L1_MAX_GAIN_ATTN, 0x00},
152 	{MAX98396_R20F9_BPE_L0_MAX_GAIN_ATTN, 0x00},
153 	{MAX98396_R20FA_BPE_L3_ATT_REL_RATE, 0x00},
154 	{MAX98396_R20FB_BPE_L2_ATT_REL_RATE, 0x00},
155 	{MAX98396_R20FC_BPE_L1_ATT_REL_RATE, 0x00},
156 	{MAX98396_R20FD_BPE_L0_ATT_REL_RATE, 0x00},
157 	{MAX98396_R20FE_BPE_L3_LIMITER_CFG, 0x00},
158 	{MAX98396_R20FF_BPE_L2_LIMITER_CFG, 0x00},
159 	{MAX98396_R2100_BPE_L1_LIMITER_CFG, 0x00},
160 	{MAX98396_R2101_BPE_L0_LIMITER_CFG, 0x00},
161 	{MAX98396_R2102_BPE_L3_LIM_ATT_REL_RATE, 0x00},
162 	{MAX98396_R2103_BPE_L2_LIM_ATT_REL_RATE, 0x00},
163 	{MAX98396_R2104_BPE_L1_LIM_ATT_REL_RATE, 0x00},
164 	{MAX98396_R2105_BPE_L0_LIM_ATT_REL_RATE, 0x00},
165 	{MAX98396_R2106_BPE_THRESH_HYSTERESIS, 0x00},
166 	{MAX98396_R2107_BPE_INFINITE_HOLD_CLR, 0x00},
167 	{MAX98396_R2108_BPE_SUPPLY_SRC, 0x00},
168 	{MAX98396_R2109_BPE_LOW_STATE, 0x00},
169 	{MAX98396_R210A_BPE_LOW_GAIN, 0x00},
170 	{MAX98396_R210B_BPE_LOW_LIMITER, 0x00},
171 	{MAX98396_R210D_BPE_EN, 0x00},
172 	{MAX98396_R210E_AUTO_RESTART, 0x00},
173 	{MAX98396_R210F_GLOBAL_EN, 0x00},
174 	{MAX98396_R21FF_REVISION_ID, 0x00},
175 };
176 
177 static const struct reg_default max98397_reg[] = {
178 	{MAX98396_R2000_SW_RESET, 0x00},
179 	{MAX98396_R2001_INT_RAW1, 0x00},
180 	{MAX98396_R2002_INT_RAW2, 0x00},
181 	{MAX98396_R2003_INT_RAW3, 0x00},
182 	{MAX98396_R2004_INT_RAW4, 0x00},
183 	{MAX98396_R2006_INT_STATE1, 0x00},
184 	{MAX98396_R2007_INT_STATE2, 0x00},
185 	{MAX98396_R2008_INT_STATE3, 0x00},
186 	{MAX98396_R2009_INT_STATE4, 0x00},
187 	{MAX98396_R200B_INT_FLAG1, 0x00},
188 	{MAX98396_R200C_INT_FLAG2, 0x00},
189 	{MAX98396_R200D_INT_FLAG3, 0x00},
190 	{MAX98396_R200E_INT_FLAG4, 0x00},
191 	{MAX98396_R2010_INT_EN1, 0x02},
192 	{MAX98396_R2011_INT_EN2, 0x00},
193 	{MAX98396_R2012_INT_EN3, 0x00},
194 	{MAX98396_R2013_INT_EN4, 0x00},
195 	{MAX98396_R2015_INT_FLAG_CLR1, 0x00},
196 	{MAX98396_R2016_INT_FLAG_CLR2, 0x00},
197 	{MAX98396_R2017_INT_FLAG_CLR3, 0x00},
198 	{MAX98396_R2018_INT_FLAG_CLR4, 0x00},
199 	{MAX98396_R201F_IRQ_CTRL, 0x00},
200 	{MAX98396_R2020_THERM_WARN_THRESH, 0x46},
201 	{MAX98396_R2021_THERM_WARN_THRESH2, 0x46},
202 	{MAX98396_R2022_THERM_SHDN_THRESH, 0x64},
203 	{MAX98396_R2023_THERM_HYSTERESIS, 0x02},
204 	{MAX98396_R2024_THERM_FOLDBACK_SET, 0xC5},
205 	{MAX98396_R2027_THERM_FOLDBACK_EN, 0x01},
206 	{MAX98396_R2030_NOISEGATE_MODE_CTRL, 0x32},
207 	{MAX98396_R2033_NOISEGATE_MODE_EN, 0x00},
208 	{MAX98396_R2038_CLK_MON_CTRL, 0x00},
209 	{MAX98396_R2039_DATA_MON_CTRL, 0x00},
210 	{MAX98397_R203A_SPK_MON_THRESH, 0x03},
211 	{MAX98396_R203F_ENABLE_CTRLS, 0x0F},
212 	{MAX98396_R2040_PIN_CFG, 0x55},
213 	{MAX98396_R2041_PCM_MODE_CFG, 0xC0},
214 	{MAX98396_R2042_PCM_CLK_SETUP, 0x04},
215 	{MAX98396_R2043_PCM_SR_SETUP, 0x88},
216 	{MAX98396_R2044_PCM_TX_CTRL_1, 0x00},
217 	{MAX98396_R2045_PCM_TX_CTRL_2, 0x00},
218 	{MAX98396_R2046_PCM_TX_CTRL_3, 0x00},
219 	{MAX98396_R2047_PCM_TX_CTRL_4, 0x00},
220 	{MAX98396_R2048_PCM_TX_CTRL_5, 0x00},
221 	{MAX98396_R2049_PCM_TX_CTRL_6, 0x00},
222 	{MAX98396_R204A_PCM_TX_CTRL_7, 0x00},
223 	{MAX98396_R204B_PCM_TX_CTRL_8, 0x00},
224 	{MAX98397_R204C_PCM_TX_CTRL_9, 0x00},
225 	{MAX98397_R204D_PCM_TX_HIZ_CTRL_1, 0xFF},
226 	{MAX98397_R204E_PCM_TX_HIZ_CTRL_2, 0xFF},
227 	{MAX98397_R204F_PCM_TX_HIZ_CTRL_3, 0xFF},
228 	{MAX98397_R2050_PCM_TX_HIZ_CTRL_4, 0xFF},
229 	{MAX98397_R2051_PCM_TX_HIZ_CTRL_5, 0xFF},
230 	{MAX98397_R2052_PCM_TX_HIZ_CTRL_6, 0xFF},
231 	{MAX98397_R2053_PCM_TX_HIZ_CTRL_7, 0xFF},
232 	{MAX98397_R2054_PCM_TX_HIZ_CTRL_8, 0xFF},
233 	{MAX98397_R2056_PCM_RX_SRC1, 0x00},
234 	{MAX98397_R2057_PCM_RX_SRC2, 0x00},
235 	{MAX98396_R2058_PCM_BYPASS_SRC, 0x00},
236 	{MAX98396_R205D_PCM_TX_SRC_EN, 0x00},
237 	{MAX98396_R205E_PCM_RX_EN, 0x00},
238 	{MAX98396_R205F_PCM_TX_EN, 0x00},
239 	{MAX98397_R2060_PCM_TX_SUPPLY_SEL, 0x00},
240 	{MAX98396_R2070_ICC_RX_EN_A, 0x00},
241 	{MAX98396_R2071_ICC_RX_EN_B, 0x00},
242 	{MAX98396_R2072_ICC_TX_CTRL, 0x00},
243 	{MAX98396_R207F_ICC_EN, 0x00},
244 	{MAX98396_R2083_TONE_GEN_DC_CFG, 0x04},
245 	{MAX98396_R2084_TONE_GEN_DC_LVL1, 0x00},
246 	{MAX98396_R2085_TONE_GEN_DC_LVL2, 0x00},
247 	{MAX98396_R2086_TONE_GEN_DC_LVL3, 0x00},
248 	{MAX98396_R208F_TONE_GEN_EN, 0x00},
249 	{MAX98396_R2090_AMP_VOL_CTRL, 0x00},
250 	{MAX98396_R2091_AMP_PATH_GAIN, 0x12},
251 	{MAX98396_R2092_AMP_DSP_CFG, 0x22},
252 	{MAX98396_R2093_SSM_CFG, 0x08},
253 	{MAX98396_R2094_SPK_CLS_DG_THRESH, 0x12},
254 	{MAX98396_R2095_SPK_CLS_DG_HDR, 0x17},
255 	{MAX98396_R2096_SPK_CLS_DG_HOLD_TIME, 0x17},
256 	{MAX98396_R2097_SPK_CLS_DG_DELAY, 0x00},
257 	{MAX98396_R2098_SPK_CLS_DG_MODE, 0x00},
258 	{MAX98396_R2099_SPK_CLS_DG_VBAT_LVL, 0x03},
259 	{MAX98396_R209A_SPK_EDGE_CTRL, 0x00},
260 	{MAX98397_R209B_SPK_PATH_WB_ONLY, 0x00},
261 	{MAX98396_R209C_SPK_EDGE_CTRL1, 0x03},
262 	{MAX98396_R209D_SPK_EDGE_CTRL2, 0xFC},
263 	{MAX98396_R209E_AMP_CLIP_GAIN, 0x00},
264 	{MAX98396_R209F_BYPASS_PATH_CFG, 0x00},
265 	{MAX98396_R20AF_AMP_EN, 0x00},
266 	{MAX98396_R20B0_ADC_SR, 0x30},
267 	{MAX98396_R20B1_ADC_PVDD_CFG, 0x00},
268 	{MAX98396_R20B2_ADC_VBAT_CFG, 0x00},
269 	{MAX98396_R20B3_ADC_THERMAL_CFG, 0x00},
270 	{MAX98397_R20B4_ADC_VDDH_CFG, 0x00},
271 	{MAX98397_R20B5_ADC_READBACK_CTRL1, 0x00},
272 	{MAX98397_R20B6_ADC_READBACK_CTRL2, 0x00},
273 	{MAX98397_R20B7_ADC_PVDD_READBACK_MSB, 0x00},
274 	{MAX98397_R20B8_ADC_PVDD_READBACK_LSB, 0x00},
275 	{MAX98397_R20B9_ADC_VBAT_READBACK_MSB, 0x00},
276 	{MAX98397_R20BA_ADC_VBAT_READBACK_LSB, 0x00},
277 	{MAX98397_R20BB_ADC_TEMP_READBACK_MSB, 0x00},
278 	{MAX98397_R20BC_ADC_TEMP_READBACK_LSB, 0x00},
279 	{MAX98397_R20BD_ADC_VDDH__READBACK_MSB, 0x00},
280 	{MAX98397_R20BE_ADC_VDDH_READBACK_LSB, 0x00},
281 	{MAX98396_R20BF_ADC_LO_VBAT_READBACK_LSB, 0x00},
282 	{MAX98397_R20C3_ADC_LO_VDDH_READBACK_MSB, 0x00},
283 	{MAX98397_R20C4_ADC_LO_VDDH_READBACK_LSB, 0x00},
284 	{MAX98397_R20C5_MEAS_ADC_OPTIMAL_MODE, 0x04},
285 	{MAX98396_R20C7_ADC_CFG, 0x00},
286 	{MAX98396_R20D0_DHT_CFG1, 0x00},
287 	{MAX98396_R20D1_LIMITER_CFG1, 0x08},
288 	{MAX98396_R20D2_LIMITER_CFG2, 0x00},
289 	{MAX98396_R20D3_DHT_CFG2, 0x14},
290 	{MAX98396_R20D4_DHT_CFG3, 0x02},
291 	{MAX98396_R20D5_DHT_CFG4, 0x04},
292 	{MAX98396_R20D6_DHT_HYSTERESIS_CFG, 0x07},
293 	{MAX98396_R20DF_DHT_EN, 0x00},
294 	{MAX98396_R20E0_IV_SENSE_PATH_CFG, 0x04},
295 	{MAX98396_R20E4_IV_SENSE_PATH_EN, 0x00},
296 	{MAX98396_R20E5_BPE_STATE, 0x00},
297 	{MAX98396_R20E6_BPE_L3_THRESH_MSB, 0x00},
298 	{MAX98396_R20E7_BPE_L3_THRESH_LSB, 0x00},
299 	{MAX98396_R20E8_BPE_L2_THRESH_MSB, 0x00},
300 	{MAX98396_R20E9_BPE_L2_THRESH_LSB, 0x00},
301 	{MAX98396_R20EA_BPE_L1_THRESH_MSB, 0x00},
302 	{MAX98396_R20EB_BPE_L1_THRESH_LSB, 0x00},
303 	{MAX98396_R20EC_BPE_L0_THRESH_MSB, 0x00},
304 	{MAX98396_R20ED_BPE_L0_THRESH_LSB, 0x00},
305 	{MAX98396_R20EE_BPE_L3_DWELL_HOLD_TIME, 0x00},
306 	{MAX98396_R20EF_BPE_L2_DWELL_HOLD_TIME, 0x00},
307 	{MAX98396_R20F0_BPE_L1_DWELL_HOLD_TIME, 0x00},
308 	{MAX98396_R20F1_BPE_L0_HOLD_TIME, 0x00},
309 	{MAX98396_R20F2_BPE_L3_ATTACK_REL_STEP, 0x00},
310 	{MAX98396_R20F3_BPE_L2_ATTACK_REL_STEP, 0x00},
311 	{MAX98396_R20F4_BPE_L1_ATTACK_REL_STEP, 0x00},
312 	{MAX98396_R20F5_BPE_L0_ATTACK_REL_STEP, 0x00},
313 	{MAX98396_R20F6_BPE_L3_MAX_GAIN_ATTN, 0x00},
314 	{MAX98396_R20F7_BPE_L2_MAX_GAIN_ATTN, 0x00},
315 	{MAX98396_R20F8_BPE_L1_MAX_GAIN_ATTN, 0x00},
316 	{MAX98396_R20F9_BPE_L0_MAX_GAIN_ATTN, 0x00},
317 	{MAX98396_R20FA_BPE_L3_ATT_REL_RATE, 0x00},
318 	{MAX98396_R20FB_BPE_L2_ATT_REL_RATE, 0x00},
319 	{MAX98396_R20FC_BPE_L1_ATT_REL_RATE, 0x00},
320 	{MAX98396_R20FD_BPE_L0_ATT_REL_RATE, 0x00},
321 	{MAX98396_R20FE_BPE_L3_LIMITER_CFG, 0x00},
322 	{MAX98396_R20FF_BPE_L2_LIMITER_CFG, 0x00},
323 	{MAX98396_R2100_BPE_L1_LIMITER_CFG, 0x00},
324 	{MAX98396_R2101_BPE_L0_LIMITER_CFG, 0x00},
325 	{MAX98396_R2102_BPE_L3_LIM_ATT_REL_RATE, 0x00},
326 	{MAX98396_R2103_BPE_L2_LIM_ATT_REL_RATE, 0x00},
327 	{MAX98396_R2104_BPE_L1_LIM_ATT_REL_RATE, 0x00},
328 	{MAX98396_R2105_BPE_L0_LIM_ATT_REL_RATE, 0x00},
329 	{MAX98396_R2106_BPE_THRESH_HYSTERESIS, 0x00},
330 	{MAX98396_R2107_BPE_INFINITE_HOLD_CLR, 0x00},
331 	{MAX98396_R2108_BPE_SUPPLY_SRC, 0x00},
332 	{MAX98396_R2109_BPE_LOW_STATE, 0x00},
333 	{MAX98396_R210A_BPE_LOW_GAIN, 0x00},
334 	{MAX98396_R210B_BPE_LOW_LIMITER, 0x00},
335 	{MAX98396_R210D_BPE_EN, 0x00},
336 	{MAX98396_R210E_AUTO_RESTART, 0x00},
337 	{MAX98396_R210F_GLOBAL_EN, 0x00},
338 	{MAX98397_R22FF_REVISION_ID, 0x00},
339 };
340 
341 static void max98396_global_enable_onoff(struct regmap *regmap, bool onoff)
342 {
343 	regmap_write(regmap, MAX98396_R210F_GLOBAL_EN, onoff ? 1 : 0);
344 	usleep_range(11000, 12000);
345 }
346 
347 static int max98396_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
348 {
349 	struct snd_soc_component *component = codec_dai->component;
350 	struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component);
351 	unsigned int format_mask, format = 0;
352 	unsigned int bclk_pol = 0;
353 	int ret, status;
354 	int reg;
355 	bool update = false;
356 
357 	format_mask = MAX98396_PCM_MODE_CFG_FORMAT_MASK |
358 		      MAX98396_PCM_MODE_CFG_LRCLKEDGE;
359 
360 	dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt);
361 
362 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
363 	case SND_SOC_DAIFMT_NB_NF:
364 		break;
365 	case SND_SOC_DAIFMT_NB_IF:
366 		format = MAX98396_PCM_MODE_CFG_LRCLKEDGE;
367 		break;
368 	case SND_SOC_DAIFMT_IB_NF:
369 		bclk_pol = MAX98396_PCM_MODE_CFG_BCLKEDGE;
370 		break;
371 	case SND_SOC_DAIFMT_IB_IF:
372 		bclk_pol = MAX98396_PCM_MODE_CFG_BCLKEDGE;
373 		format = MAX98396_PCM_MODE_CFG_LRCLKEDGE;
374 		break;
375 
376 	default:
377 		dev_err(component->dev, "DAI invert mode %d unsupported\n",
378 			fmt & SND_SOC_DAIFMT_INV_MASK);
379 		return -EINVAL;
380 	}
381 
382 	/* interface format */
383 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
384 	case SND_SOC_DAIFMT_I2S:
385 		format |= MAX98396_PCM_FORMAT_I2S;
386 		break;
387 	case SND_SOC_DAIFMT_LEFT_J:
388 		format |= MAX98396_PCM_FORMAT_LJ;
389 		break;
390 	case SND_SOC_DAIFMT_DSP_A:
391 		format |= MAX98396_PCM_FORMAT_TDM_MODE1;
392 		break;
393 	case SND_SOC_DAIFMT_DSP_B:
394 		format |= MAX98396_PCM_FORMAT_TDM_MODE0;
395 		break;
396 	default:
397 		dev_err(component->dev, "DAI format %d unsupported\n",
398 			fmt & SND_SOC_DAIFMT_FORMAT_MASK);
399 		return -EINVAL;
400 	}
401 
402 	ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status);
403 	if (ret < 0)
404 		return -EINVAL;
405 
406 	if (status) {
407 		ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, &reg);
408 		if (ret < 0)
409 			return -EINVAL;
410 		if (format != (reg & format_mask)) {
411 			update = true;
412 		} else {
413 			ret = regmap_read(max98396->regmap,
414 					  MAX98396_R2042_PCM_CLK_SETUP, &reg);
415 			if (ret < 0)
416 				return -EINVAL;
417 			if (bclk_pol != (reg & MAX98396_PCM_MODE_CFG_BCLKEDGE))
418 				update = true;
419 		}
420 		/* GLOBAL_EN OFF prior to pcm mode, clock configuration change */
421 		if (update)
422 			max98396_global_enable_onoff(max98396->regmap, false);
423 	}
424 
425 	regmap_update_bits(max98396->regmap,
426 			   MAX98396_R2041_PCM_MODE_CFG,
427 			   format_mask, format);
428 
429 	regmap_update_bits(max98396->regmap,
430 			   MAX98396_R2042_PCM_CLK_SETUP,
431 			   MAX98396_PCM_MODE_CFG_BCLKEDGE,
432 			   bclk_pol);
433 
434 	if (status && update)
435 		max98396_global_enable_onoff(max98396->regmap, true);
436 
437 	return 0;
438 }
439 
440 #define MAX98396_BSEL_32	0x2
441 #define MAX98396_BSEL_48	0x3
442 #define MAX98396_BSEL_64	0x4
443 #define MAX98396_BSEL_96	0x5
444 #define MAX98396_BSEL_128	0x6
445 #define MAX98396_BSEL_192	0x7
446 #define MAX98396_BSEL_256	0x8
447 #define MAX98396_BSEL_384	0x9
448 #define MAX98396_BSEL_512	0xa
449 #define MAX98396_BSEL_320	0xb
450 #define MAX98396_BSEL_250	0xc
451 #define MAX98396_BSEL_125	0xd
452 
453 /* Refer to table 5 in the datasheet */
454 static const struct max98396_pcm_config {
455 	int in, out, width, bsel, max_sr;
456 } max98396_pcm_configs[] = {
457 	{ .in = 2,  .out = 4,  .width = 16, .bsel = MAX98396_BSEL_32,  .max_sr = 192000 },
458 	{ .in = 2,  .out = 6,  .width = 24, .bsel = MAX98396_BSEL_48,  .max_sr = 192000 },
459 	{ .in = 2,  .out = 8,  .width = 32, .bsel = MAX98396_BSEL_64,  .max_sr = 192000 },
460 	{ .in = 3,  .out = 15, .width = 32, .bsel = MAX98396_BSEL_125, .max_sr = 192000 },
461 	{ .in = 4,  .out = 8,  .width = 16, .bsel = MAX98396_BSEL_64,  .max_sr = 192000 },
462 	{ .in = 4,  .out = 12, .width = 24, .bsel = MAX98396_BSEL_96,  .max_sr = 192000 },
463 	{ .in = 4,  .out = 16, .width = 32, .bsel = MAX98396_BSEL_128, .max_sr = 192000 },
464 	{ .in = 5,  .out = 15, .width = 24, .bsel = MAX98396_BSEL_125, .max_sr = 192000 },
465 	{ .in = 7,  .out = 15, .width = 16, .bsel = MAX98396_BSEL_125, .max_sr = 192000 },
466 	{ .in = 2,  .out = 4,  .width = 16, .bsel = MAX98396_BSEL_32,  .max_sr = 96000  },
467 	{ .in = 2,  .out = 6,  .width = 24, .bsel = MAX98396_BSEL_48,  .max_sr = 96000  },
468 	{ .in = 2,  .out = 8,  .width = 32, .bsel = MAX98396_BSEL_64,  .max_sr = 96000  },
469 	{ .in = 3,  .out = 15, .width = 32, .bsel = MAX98396_BSEL_125, .max_sr = 96000  },
470 	{ .in = 4,  .out = 8,  .width = 16, .bsel = MAX98396_BSEL_64,  .max_sr = 96000  },
471 	{ .in = 4,  .out = 12, .width = 24, .bsel = MAX98396_BSEL_96,  .max_sr = 96000  },
472 	{ .in = 4,  .out = 16, .width = 32, .bsel = MAX98396_BSEL_128, .max_sr = 96000  },
473 	{ .in = 5,  .out = 15, .width = 24, .bsel = MAX98396_BSEL_125, .max_sr = 96000  },
474 	{ .in = 7,  .out = 15, .width = 16, .bsel = MAX98396_BSEL_125, .max_sr = 96000  },
475 	{ .in = 7,  .out = 31, .width = 32, .bsel = MAX98396_BSEL_250, .max_sr = 96000  },
476 	{ .in = 8,  .out = 16, .width = 16, .bsel = MAX98396_BSEL_128, .max_sr = 96000  },
477 	{ .in = 8,  .out = 24, .width = 24, .bsel = MAX98396_BSEL_192, .max_sr = 96000  },
478 	{ .in = 8,  .out = 32, .width = 32, .bsel = MAX98396_BSEL_256, .max_sr = 96000  },
479 	{ .in = 10, .out = 31, .width = 24, .bsel = MAX98396_BSEL_250, .max_sr = 96000  },
480 	{ .in = 15, .out = 31, .width = 16, .bsel = MAX98396_BSEL_250, .max_sr = 96000  },
481 	{ .in = 16, .out = 32, .width = 16, .bsel = MAX98396_BSEL_256, .max_sr = 96000  },
482 	{ .in = 7,  .out = 31, .width = 32, .bsel = MAX98396_BSEL_250, .max_sr = 48000  },
483 	{ .in = 10, .out = 31, .width = 24, .bsel = MAX98396_BSEL_250, .max_sr = 48000  },
484 	{ .in = 10, .out = 40, .width = 32, .bsel = MAX98396_BSEL_320, .max_sr = 48000  },
485 	{ .in = 15, .out = 31, .width = 16, .bsel = MAX98396_BSEL_250, .max_sr = 48000  },
486 	{ .in = 16, .out = 48, .width = 24, .bsel = MAX98396_BSEL_384, .max_sr = 48000  },
487 	{ .in = 16, .out = 64, .width = 32, .bsel = MAX98396_BSEL_512, .max_sr = 48000  },
488 };
489 
490 static int max98396_pcm_config_index(int in_slots, int out_slots, int width)
491 {
492 	int i;
493 
494 	for (i = 0; i < ARRAY_SIZE(max98396_pcm_configs); i++) {
495 		const struct max98396_pcm_config *c = &max98396_pcm_configs[i];
496 
497 		if (in_slots == c->in && out_slots <= c->out && width == c->width)
498 			return i;
499 	}
500 
501 	return -1;
502 }
503 
504 static int max98396_dai_hw_params(struct snd_pcm_substream *substream,
505 				  struct snd_pcm_hw_params *params,
506 				  struct snd_soc_dai *dai)
507 {
508 	struct snd_soc_component *component = dai->component;
509 	struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component);
510 	unsigned int sampling_rate = 0;
511 	unsigned int chan_sz = 0;
512 	int ret, reg, status, bsel = 0;
513 	bool update = false;
514 
515 	/* pcm mode configuration */
516 	switch (snd_pcm_format_width(params_format(params))) {
517 	case 16:
518 		chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_16;
519 		break;
520 	case 24:
521 		chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_24;
522 		break;
523 	case 32:
524 		chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_32;
525 		break;
526 	default:
527 		dev_err(component->dev, "format unsupported %d\n",
528 			params_format(params));
529 		goto err;
530 	}
531 
532 	dev_dbg(component->dev, "format supported %d",
533 		params_format(params));
534 
535 	/* sampling rate configuration */
536 	switch (params_rate(params)) {
537 	case 8000:
538 		sampling_rate = MAX98396_PCM_SR_8000;
539 		break;
540 	case 11025:
541 		sampling_rate = MAX98396_PCM_SR_11025;
542 		break;
543 	case 12000:
544 		sampling_rate = MAX98396_PCM_SR_12000;
545 		break;
546 	case 16000:
547 		sampling_rate = MAX98396_PCM_SR_16000;
548 		break;
549 	case 22050:
550 		sampling_rate = MAX98396_PCM_SR_22050;
551 		break;
552 	case 24000:
553 		sampling_rate = MAX98396_PCM_SR_24000;
554 		break;
555 	case 32000:
556 		sampling_rate = MAX98396_PCM_SR_32000;
557 		break;
558 	case 44100:
559 		sampling_rate = MAX98396_PCM_SR_44100;
560 		break;
561 	case 48000:
562 		sampling_rate = MAX98396_PCM_SR_48000;
563 		break;
564 	case 88200:
565 		sampling_rate = MAX98396_PCM_SR_88200;
566 		break;
567 	case 96000:
568 		sampling_rate = MAX98396_PCM_SR_96000;
569 		break;
570 	case 192000:
571 		sampling_rate = MAX98396_PCM_SR_192000;
572 		break;
573 	default:
574 		dev_err(component->dev, "rate %d not supported\n",
575 			params_rate(params));
576 		goto err;
577 	}
578 
579 	if (max98396->tdm_mode) {
580 		if (params_rate(params) > max98396->tdm_max_samplerate) {
581 			dev_err(component->dev, "TDM sample rate %d too high",
582 				params_rate(params));
583 			goto err;
584 		}
585 	} else {
586 		/* BCLK configuration */
587 		ret = max98396_pcm_config_index(params_channels(params),
588 						params_channels(params),
589 						snd_pcm_format_width(params_format(params)));
590 		if (ret < 0) {
591 			dev_err(component->dev,
592 				"no PCM config for %d channels, format %d\n",
593 				params_channels(params), params_format(params));
594 			goto err;
595 		}
596 
597 		bsel = max98396_pcm_configs[ret].bsel;
598 
599 		if (params_rate(params) > max98396_pcm_configs[ret].max_sr) {
600 			dev_err(component->dev, "sample rate %d too high",
601 				params_rate(params));
602 			goto err;
603 		}
604 	}
605 
606 	ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status);
607 	if (ret < 0)
608 		goto err;
609 
610 	if (status) {
611 		ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, &reg);
612 		if (ret < 0)
613 			goto err;
614 		if (chan_sz != (reg & MAX98396_PCM_MODE_CFG_CHANSZ_MASK)) {
615 			update = true;
616 		} else {
617 			ret = regmap_read(max98396->regmap, MAX98396_R2043_PCM_SR_SETUP, &reg);
618 			if (ret < 0)
619 				goto err;
620 			if (sampling_rate != (reg & MAX98396_PCM_SR_MASK))
621 				update = true;
622 		}
623 
624 		/* GLOBAL_EN OFF prior to channel size and sampling rate change */
625 		if (update)
626 			max98396_global_enable_onoff(max98396->regmap, false);
627 	}
628 
629 	/* set channel size */
630 	regmap_update_bits(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG,
631 			   MAX98396_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
632 
633 	/* set DAI_SR to correct LRCLK frequency */
634 	regmap_update_bits(max98396->regmap, MAX98396_R2043_PCM_SR_SETUP,
635 			   MAX98396_PCM_SR_MASK, sampling_rate);
636 
637 	/* set sampling rate of IV */
638 	if (max98396->interleave_mode &&
639 	    sampling_rate > MAX98396_PCM_SR_16000)
640 		regmap_update_bits(max98396->regmap,
641 				   MAX98396_R2043_PCM_SR_SETUP,
642 				   MAX98396_IVADC_SR_MASK,
643 				   (sampling_rate - 3)
644 				   << MAX98396_IVADC_SR_SHIFT);
645 	else
646 		regmap_update_bits(max98396->regmap,
647 				   MAX98396_R2043_PCM_SR_SETUP,
648 				   MAX98396_IVADC_SR_MASK,
649 				   sampling_rate << MAX98396_IVADC_SR_SHIFT);
650 
651 	if (bsel)
652 		regmap_update_bits(max98396->regmap,
653 				MAX98396_R2042_PCM_CLK_SETUP,
654 				MAX98396_PCM_CLK_SETUP_BSEL_MASK,
655 				bsel);
656 
657 	if (status && update)
658 		max98396_global_enable_onoff(max98396->regmap, true);
659 
660 	return 0;
661 
662 err:
663 	return -EINVAL;
664 }
665 
666 static int max98396_dai_tdm_slot(struct snd_soc_dai *dai,
667 				 unsigned int tx_mask, unsigned int rx_mask,
668 				 int slots, int slot_width)
669 {
670 	struct snd_soc_component *component = dai->component;
671 	struct max98396_priv *max98396 =
672 		snd_soc_component_get_drvdata(component);
673 	int bsel;
674 	unsigned int chan_sz = 0;
675 	int ret, status;
676 	int reg;
677 	bool update = false;
678 
679 	if (!tx_mask && !rx_mask && !slots && !slot_width)
680 		max98396->tdm_mode = false;
681 	else
682 		max98396->tdm_mode = true;
683 
684 	/* BCLK configuration */
685 	ret = max98396_pcm_config_index(slots, slots, slot_width);
686 	if (ret < 0) {
687 		dev_err(component->dev, "no TDM config for %d slots %d bits\n",
688 			slots, slot_width);
689 		return -EINVAL;
690 	}
691 
692 	bsel = max98396_pcm_configs[ret].bsel;
693 	max98396->tdm_max_samplerate = max98396_pcm_configs[ret].max_sr;
694 
695 	/* Channel size configuration */
696 	switch (slot_width) {
697 	case 16:
698 		chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_16;
699 		break;
700 	case 24:
701 		chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_24;
702 		break;
703 	case 32:
704 		chan_sz = MAX98396_PCM_MODE_CFG_CHANSZ_32;
705 		break;
706 	default:
707 		dev_err(component->dev, "slot width %d unsupported\n",
708 			slot_width);
709 		return -EINVAL;
710 	}
711 
712 	ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status);
713 	if (ret < 0)
714 		return -EINVAL;
715 
716 	if (status) {
717 		ret = regmap_read(max98396->regmap, MAX98396_R2042_PCM_CLK_SETUP, &reg);
718 		if (ret < 0)
719 			return -EINVAL;
720 		if (bsel != (reg & MAX98396_PCM_CLK_SETUP_BSEL_MASK)) {
721 			update = true;
722 		} else {
723 			ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, &reg);
724 			if (ret < 0)
725 				return -EINVAL;
726 			if (chan_sz != (reg & MAX98396_PCM_MODE_CFG_CHANSZ_MASK))
727 				update = true;
728 		}
729 
730 		/* GLOBAL_EN OFF prior to channel size and BCLK per LRCLK change */
731 		if (update)
732 			max98396_global_enable_onoff(max98396->regmap, false);
733 	}
734 
735 	regmap_update_bits(max98396->regmap,
736 			   MAX98396_R2042_PCM_CLK_SETUP,
737 			   MAX98396_PCM_CLK_SETUP_BSEL_MASK,
738 			   bsel);
739 
740 	regmap_update_bits(max98396->regmap,
741 			   MAX98396_R2041_PCM_MODE_CFG,
742 			   MAX98396_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
743 
744 	/* Rx slot configuration */
745 	if (max98396->device_id == CODEC_TYPE_MAX98396) {
746 		regmap_update_bits(max98396->regmap,
747 				   MAX98396_R2056_PCM_RX_SRC2,
748 				   MAX98396_PCM_DMIX_CH0_SRC_MASK,
749 				   rx_mask);
750 		regmap_update_bits(max98396->regmap,
751 				   MAX98396_R2056_PCM_RX_SRC2,
752 				   MAX98396_PCM_DMIX_CH1_SRC_MASK,
753 				   rx_mask << MAX98396_PCM_DMIX_CH1_SHIFT);
754 	} else {
755 		regmap_update_bits(max98396->regmap,
756 				   MAX98397_R2057_PCM_RX_SRC2,
757 				   MAX98396_PCM_DMIX_CH0_SRC_MASK,
758 				   rx_mask);
759 		regmap_update_bits(max98396->regmap,
760 				   MAX98397_R2057_PCM_RX_SRC2,
761 				   MAX98396_PCM_DMIX_CH1_SRC_MASK,
762 				   rx_mask << MAX98396_PCM_DMIX_CH1_SHIFT);
763 	}
764 
765 	/* Tx slot Hi-Z configuration */
766 	if (max98396->device_id == CODEC_TYPE_MAX98396) {
767 		regmap_write(max98396->regmap,
768 			     MAX98396_R2053_PCM_TX_HIZ_CTRL_8,
769 			     ~tx_mask & 0xFF);
770 		regmap_write(max98396->regmap,
771 			     MAX98396_R2052_PCM_TX_HIZ_CTRL_7,
772 			     (~tx_mask & 0xFF00) >> 8);
773 	} else {
774 		regmap_write(max98396->regmap,
775 			     MAX98397_R2054_PCM_TX_HIZ_CTRL_8,
776 			     ~tx_mask & 0xFF);
777 		regmap_write(max98396->regmap,
778 			     MAX98397_R2053_PCM_TX_HIZ_CTRL_7,
779 			     (~tx_mask & 0xFF00) >> 8);
780 	}
781 
782 	if (status && update)
783 		max98396_global_enable_onoff(max98396->regmap, true);
784 
785 	return 0;
786 }
787 
788 #define MAX98396_RATES SNDRV_PCM_RATE_8000_192000
789 
790 #define MAX98396_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
791 	SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
792 
793 static const struct snd_soc_dai_ops max98396_dai_ops = {
794 	.set_fmt = max98396_dai_set_fmt,
795 	.hw_params = max98396_dai_hw_params,
796 	.set_tdm_slot = max98396_dai_tdm_slot,
797 };
798 
799 static int max98396_dac_event(struct snd_soc_dapm_widget *w,
800 			      struct snd_kcontrol *kcontrol, int event)
801 {
802 	struct snd_soc_component *component =
803 		snd_soc_dapm_to_component(w->dapm);
804 	struct max98396_priv *max98396 =
805 		snd_soc_component_get_drvdata(component);
806 
807 	switch (event) {
808 	case SND_SOC_DAPM_POST_PMU:
809 		max98396_global_enable_onoff(max98396->regmap, true);
810 		break;
811 	case SND_SOC_DAPM_PRE_PMD:
812 		max98396_global_enable_onoff(max98396->regmap, false);
813 
814 		max98396->tdm_mode = false;
815 		break;
816 	default:
817 		return 0;
818 	}
819 	return 0;
820 }
821 
822 static bool max98396_readable_register(struct device *dev, unsigned int reg)
823 {
824 	switch (reg) {
825 	case MAX98396_R2001_INT_RAW1 ... MAX98396_R2004_INT_RAW4:
826 	case MAX98396_R2006_INT_STATE1 ... MAX98396_R2009_INT_STATE4:
827 	case MAX98396_R200B_INT_FLAG1 ... MAX98396_R200E_INT_FLAG4:
828 	case MAX98396_R2010_INT_EN1 ... MAX98396_R2013_INT_EN4:
829 	case MAX98396_R2015_INT_FLAG_CLR1 ... MAX98396_R2018_INT_FLAG_CLR4:
830 	case MAX98396_R201F_IRQ_CTRL ... MAX98396_R2024_THERM_FOLDBACK_SET:
831 	case MAX98396_R2027_THERM_FOLDBACK_EN:
832 	case MAX98396_R2030_NOISEGATE_MODE_CTRL:
833 	case MAX98396_R2033_NOISEGATE_MODE_EN:
834 	case MAX98396_R2038_CLK_MON_CTRL ... MAX98396_R2039_DATA_MON_CTRL:
835 	case MAX98396_R203F_ENABLE_CTRLS ... MAX98396_R2053_PCM_TX_HIZ_CTRL_8:
836 	case MAX98396_R2055_PCM_RX_SRC1 ... MAX98396_R2056_PCM_RX_SRC2:
837 	case MAX98396_R2058_PCM_BYPASS_SRC:
838 	case MAX98396_R205D_PCM_TX_SRC_EN ... MAX98396_R205F_PCM_TX_EN:
839 	case MAX98396_R2070_ICC_RX_EN_A... MAX98396_R2072_ICC_TX_CTRL:
840 	case MAX98396_R207F_ICC_EN:
841 	case MAX98396_R2083_TONE_GEN_DC_CFG ... MAX98396_R2086_TONE_GEN_DC_LVL3:
842 	case MAX98396_R208F_TONE_GEN_EN ... MAX98396_R209A_SPK_EDGE_CTRL:
843 	case MAX98396_R209C_SPK_EDGE_CTRL1 ... MAX98396_R20A0_AMP_SUPPLY_CTL:
844 	case MAX98396_R20AF_AMP_EN ... MAX98396_R20BF_ADC_LO_VBAT_READBACK_LSB:
845 	case MAX98396_R20C7_ADC_CFG:
846 	case MAX98396_R20D0_DHT_CFG1 ... MAX98396_R20D6_DHT_HYSTERESIS_CFG:
847 	case MAX98396_R20DF_DHT_EN:
848 	case MAX98396_R20E0_IV_SENSE_PATH_CFG:
849 	case MAX98396_R20E4_IV_SENSE_PATH_EN
850 		... MAX98396_R2106_BPE_THRESH_HYSTERESIS:
851 	case MAX98396_R2108_BPE_SUPPLY_SRC ... MAX98396_R210B_BPE_LOW_LIMITER:
852 	case MAX98396_R210D_BPE_EN ... MAX98396_R210F_GLOBAL_EN:
853 	case MAX98396_R21FF_REVISION_ID:
854 		return true;
855 	default:
856 		return false;
857 	}
858 };
859 
860 static bool max98396_volatile_reg(struct device *dev, unsigned int reg)
861 {
862 	switch (reg) {
863 	case MAX98396_R2000_SW_RESET:
864 	case MAX98396_R2001_INT_RAW1 ... MAX98396_R200E_INT_FLAG4:
865 	case MAX98396_R2041_PCM_MODE_CFG:
866 	case MAX98396_R20B6_ADC_PVDD_READBACK_MSB
867 		... MAX98396_R20BF_ADC_LO_VBAT_READBACK_LSB:
868 	case MAX98396_R20E5_BPE_STATE:
869 	case MAX98396_R2109_BPE_LOW_STATE
870 		... MAX98396_R210B_BPE_LOW_LIMITER:
871 	case MAX98396_R210F_GLOBAL_EN:
872 	case MAX98396_R21FF_REVISION_ID:
873 		return true;
874 	default:
875 		return false;
876 	}
877 }
878 
879 static bool max98397_readable_register(struct device *dev, unsigned int reg)
880 {
881 	switch (reg) {
882 	case MAX98396_R2001_INT_RAW1 ... MAX98396_R2004_INT_RAW4:
883 	case MAX98396_R2006_INT_STATE1 ... MAX98396_R2009_INT_STATE4:
884 	case MAX98396_R200B_INT_FLAG1 ... MAX98396_R200E_INT_FLAG4:
885 	case MAX98396_R2010_INT_EN1 ... MAX98396_R2013_INT_EN4:
886 	case MAX98396_R2015_INT_FLAG_CLR1 ... MAX98396_R2018_INT_FLAG_CLR4:
887 	case MAX98396_R201F_IRQ_CTRL ... MAX98396_R2024_THERM_FOLDBACK_SET:
888 	case MAX98396_R2027_THERM_FOLDBACK_EN:
889 	case MAX98396_R2030_NOISEGATE_MODE_CTRL:
890 	case MAX98396_R2033_NOISEGATE_MODE_EN:
891 	case MAX98396_R2038_CLK_MON_CTRL ... MAX98397_R203A_SPK_MON_THRESH:
892 	case MAX98396_R203F_ENABLE_CTRLS ... MAX98397_R2054_PCM_TX_HIZ_CTRL_8:
893 	case MAX98397_R2056_PCM_RX_SRC1... MAX98396_R2058_PCM_BYPASS_SRC:
894 	case MAX98396_R205D_PCM_TX_SRC_EN ... MAX98397_R2060_PCM_TX_SUPPLY_SEL:
895 	case MAX98396_R2070_ICC_RX_EN_A... MAX98396_R2072_ICC_TX_CTRL:
896 	case MAX98396_R207F_ICC_EN:
897 	case MAX98396_R2083_TONE_GEN_DC_CFG ... MAX98396_R2086_TONE_GEN_DC_LVL3:
898 	case MAX98396_R208F_TONE_GEN_EN ... MAX98396_R209F_BYPASS_PATH_CFG:
899 	case MAX98396_R20AF_AMP_EN ... MAX98397_R20C5_MEAS_ADC_OPTIMAL_MODE:
900 	case MAX98396_R20C7_ADC_CFG:
901 	case MAX98396_R20D0_DHT_CFG1 ... MAX98396_R20D6_DHT_HYSTERESIS_CFG:
902 	case MAX98396_R20DF_DHT_EN:
903 	case MAX98396_R20E0_IV_SENSE_PATH_CFG:
904 	case MAX98396_R20E4_IV_SENSE_PATH_EN
905 		... MAX98396_R2106_BPE_THRESH_HYSTERESIS:
906 	case MAX98396_R2108_BPE_SUPPLY_SRC ... MAX98396_R210B_BPE_LOW_LIMITER:
907 	case MAX98396_R210D_BPE_EN ... MAX98396_R210F_GLOBAL_EN:
908 	case MAX98397_R22FF_REVISION_ID:
909 		return true;
910 	default:
911 		return false;
912 	}
913 };
914 
915 static bool max98397_volatile_reg(struct device *dev, unsigned int reg)
916 {
917 	switch (reg) {
918 	case MAX98396_R2001_INT_RAW1 ... MAX98396_R200E_INT_FLAG4:
919 	case MAX98396_R2041_PCM_MODE_CFG:
920 	case MAX98397_R20B7_ADC_PVDD_READBACK_MSB
921 		... MAX98397_R20C4_ADC_LO_VDDH_READBACK_LSB:
922 	case MAX98396_R20E5_BPE_STATE:
923 	case MAX98396_R2109_BPE_LOW_STATE
924 		... MAX98396_R210B_BPE_LOW_LIMITER:
925 	case MAX98396_R210F_GLOBAL_EN:
926 	case MAX98397_R22FF_REVISION_ID:
927 		return true;
928 	default:
929 		return false;
930 	}
931 }
932 
933 static const char * const max98396_op_mod_text[] = {
934 	"DG", "PVDD", "VBAT",
935 };
936 
937 static SOC_ENUM_SINGLE_DECL(max98396_op_mod_enum,
938 			    MAX98396_R2098_SPK_CLS_DG_MODE,
939 			    0, max98396_op_mod_text);
940 
941 static DECLARE_TLV_DB_SCALE(max98396_digital_tlv, -6350, 50, 1);
942 static const DECLARE_TLV_DB_RANGE(max98396_spk_tlv,
943 	0, 0x11, TLV_DB_SCALE_ITEM(400, 100, 0),
944 );
945 static DECLARE_TLV_DB_RANGE(max98397_digital_tlv,
946 	0, 0x4A, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
947 	0x4B, 0xFF, TLV_DB_SCALE_ITEM(-9000, 50, 0),
948 );
949 static const DECLARE_TLV_DB_RANGE(max98397_spk_tlv,
950 	0, 0x15, TLV_DB_SCALE_ITEM(600, 100, 0),
951 );
952 
953 static int max98396_mux_get(struct snd_kcontrol *kcontrol,
954 			    struct snd_ctl_elem_value *ucontrol)
955 {
956 	struct snd_soc_component *component = snd_soc_dapm_kcontrol_to_component(kcontrol);
957 	struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component);
958 	int reg, val;
959 
960 	if (max98396->device_id == CODEC_TYPE_MAX98396)
961 		reg = MAX98396_R2055_PCM_RX_SRC1;
962 	else
963 		reg = MAX98397_R2056_PCM_RX_SRC1;
964 
965 	regmap_read(max98396->regmap, reg, &val);
966 
967 	ucontrol->value.enumerated.item[0] = val;
968 
969 	return 0;
970 }
971 
972 static int max98396_mux_put(struct snd_kcontrol *kcontrol,
973 			    struct snd_ctl_elem_value *ucontrol)
974 {
975 	struct snd_soc_component *component = snd_soc_dapm_kcontrol_to_component(kcontrol);
976 	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
977 	struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component);
978 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
979 	unsigned int *item = ucontrol->value.enumerated.item;
980 	int reg, val;
981 	int change;
982 
983 	if (item[0] >= e->items)
984 		return -EINVAL;
985 
986 	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
987 
988 	if (max98396->device_id == CODEC_TYPE_MAX98396)
989 		reg = MAX98396_R2055_PCM_RX_SRC1;
990 	else
991 		reg = MAX98397_R2056_PCM_RX_SRC1;
992 
993 	change = snd_soc_component_test_bits(component, reg,
994 					     MAX98396_PCM_RX_MASK, val);
995 
996 	if (change)
997 		regmap_update_bits(max98396->regmap, reg,
998 				   MAX98396_PCM_RX_MASK, val);
999 
1000 	snd_soc_dapm_mux_update_power(dapm, kcontrol, item[0], e, NULL);
1001 
1002 	return change;
1003 }
1004 
1005 static const char * const max98396_switch_text[] = {
1006 	"Left", "Right", "LeftRight"};
1007 
1008 static SOC_ENUM_SINGLE_DECL(dai_sel_enum, SND_SOC_NOPM, 0,
1009 			    max98396_switch_text);
1010 
1011 static const struct snd_kcontrol_new max98396_dai_mux =
1012 	SOC_DAPM_ENUM_EXT("DAI Sel Mux", dai_sel_enum,
1013 			  max98396_mux_get, max98396_mux_put);
1014 
1015 static const struct snd_kcontrol_new max98396_vi_control =
1016 	SOC_DAPM_SINGLE("Switch", MAX98396_R205F_PCM_TX_EN, 0, 1, 0);
1017 
1018 static const struct snd_soc_dapm_widget max98396_dapm_widgets[] = {
1019 	SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback",
1020 			   MAX98396_R20AF_AMP_EN, 0, 0, max98396_dac_event,
1021 			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1022 	SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0,
1023 			 &max98396_dai_mux),
1024 	SND_SOC_DAPM_OUTPUT("BE_OUT"),
1025 	SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture", 0,
1026 			     MAX98396_R20E4_IV_SENSE_PATH_EN, 0, 0),
1027 	SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0,
1028 			     MAX98396_R20E4_IV_SENSE_PATH_EN, 1, 0),
1029 	SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM, 0, 0,
1030 			    &max98396_vi_control),
1031 	SND_SOC_DAPM_SIGGEN("VMON"),
1032 	SND_SOC_DAPM_SIGGEN("IMON"),
1033 	SND_SOC_DAPM_SIGGEN("FBMON"),
1034 };
1035 
1036 static const char * const max98396_thermal_thresh_text[] = {
1037 	"50C", "51C", "52C", "53C", "54C", "55C", "56C", "57C",
1038 	"58C", "59C", "60C", "61C", "62C", "63C", "64C", "65C",
1039 	"66C", "67C", "68C", "69C", "70C", "71C", "72C", "73C",
1040 	"74C", "75C", "76C", "77C", "78C", "79C", "80C", "81C",
1041 	"82C", "83C", "84C", "85C", "86C", "87C", "88C", "89C",
1042 	"90C", "91C", "92C", "93C", "94C", "95C", "96C", "97C",
1043 	"98C", "99C", "100C", "101C", "102C", "103C", "104C", "105C",
1044 	"106C", "107C", "108C", "109C", "110C", "111C", "112C", "113C",
1045 	"114C", "115C", "116C", "117C", "118C", "119C", "120C", "121C",
1046 	"122C", "123C", "124C", "125C", "126C", "127C", "128C", "129C",
1047 	"130C", "131C", "132C", "133C", "134C", "135C", "136C", "137C",
1048 	"138C", "139C", "140C", "141C", "142C", "143C", "144C", "145C",
1049 	"146C", "147C", "148C", "149C", "150C"
1050 };
1051 
1052 static SOC_ENUM_SINGLE_DECL(max98396_thermal_warn_thresh1_enum,
1053 			    MAX98396_R2020_THERM_WARN_THRESH, 0,
1054 			    max98396_thermal_thresh_text);
1055 
1056 static SOC_ENUM_SINGLE_DECL(max98396_thermal_warn_thresh2_enum,
1057 			    MAX98396_R2021_THERM_WARN_THRESH2, 0,
1058 			    max98396_thermal_thresh_text);
1059 
1060 static SOC_ENUM_SINGLE_DECL(max98396_thermal_shdn_thresh_enum,
1061 			    MAX98396_R2022_THERM_SHDN_THRESH, 0,
1062 			    max98396_thermal_thresh_text);
1063 
1064 static const char * const max98396_thermal_hyteresis_text[] = {
1065 	"2C", "5C", "7C", "10C"
1066 };
1067 
1068 static SOC_ENUM_SINGLE_DECL(max98396_thermal_hysteresis_enum,
1069 			    MAX98396_R2023_THERM_HYSTERESIS, 0,
1070 			    max98396_thermal_hyteresis_text);
1071 
1072 static const char * const max98396_foldback_slope_text[] = {
1073 	"0.25", "0.5", "1.0", "2.0"
1074 };
1075 
1076 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_slope1_enum,
1077 			    MAX98396_R2024_THERM_FOLDBACK_SET,
1078 			    MAX98396_THERM_FB_SLOPE1_SHIFT,
1079 			    max98396_foldback_slope_text);
1080 
1081 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_slope2_enum,
1082 			    MAX98396_R2024_THERM_FOLDBACK_SET,
1083 			    MAX98396_THERM_FB_SLOPE2_SHIFT,
1084 			    max98396_foldback_slope_text);
1085 
1086 static const char * const max98396_foldback_reltime_text[] = {
1087 	"3ms", "10ms", "100ms", "300ms"
1088 };
1089 
1090 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_reltime_enum,
1091 			    MAX98396_R2024_THERM_FOLDBACK_SET,
1092 			    MAX98396_THERM_FB_REL_SHIFT,
1093 			    max98396_foldback_reltime_text);
1094 
1095 static const char * const max98396_foldback_holdtime_text[] = {
1096 	"0ms", "20ms", "40ms", "80ms"
1097 };
1098 
1099 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_holdtime_enum,
1100 			    MAX98396_R2024_THERM_FOLDBACK_SET,
1101 			    MAX98396_THERM_FB_HOLD_SHIFT,
1102 			    max98396_foldback_holdtime_text);
1103 
1104 static int max98396_adc_value_get(struct snd_kcontrol *kcontrol,
1105 				  struct snd_ctl_elem_value *ucontrol)
1106 {
1107 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
1108 	struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
1109 	struct soc_mixer_control *mc =
1110 		(struct soc_mixer_control *)kcontrol->private_value;
1111 	struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component);
1112 	int ret;
1113 	u8 val[2];
1114 	int reg = mc->reg;
1115 
1116 	/* ADC value is not available if the device is powered down */
1117 	if (snd_soc_dapm_get_bias_level(dapm) == SND_SOC_BIAS_OFF)
1118 		goto exit;
1119 
1120 	if (max98396->device_id == CODEC_TYPE_MAX98397) {
1121 		switch (mc->reg) {
1122 		case MAX98396_R20B6_ADC_PVDD_READBACK_MSB:
1123 			reg = MAX98397_R20B7_ADC_PVDD_READBACK_MSB;
1124 			break;
1125 		case MAX98396_R20B8_ADC_VBAT_READBACK_MSB:
1126 			reg = MAX98397_R20B9_ADC_VBAT_READBACK_MSB;
1127 			break;
1128 		case MAX98396_R20BA_ADC_TEMP_READBACK_MSB:
1129 			reg = MAX98397_R20BB_ADC_TEMP_READBACK_MSB;
1130 			break;
1131 		default:
1132 			goto exit;
1133 		}
1134 	}
1135 
1136 	ret = regmap_raw_read(max98396->regmap, reg, &val, 2);
1137 	if (ret)
1138 		goto exit;
1139 
1140 	/* ADC readback bits[8:0] rearrangement */
1141 	ucontrol->value.integer.value[0] = (val[0] << 1) | (val[1] & 1);
1142 	return 0;
1143 
1144 exit:
1145 	ucontrol->value.integer.value[0] = 0;
1146 	return 0;
1147 }
1148 
1149 static const struct snd_kcontrol_new max98396_snd_controls[] = {
1150 	/* Volume */
1151 	SOC_SINGLE_TLV("Digital Volume", MAX98396_R2090_AMP_VOL_CTRL,
1152 		       0, 0x7F, 1, max98396_digital_tlv),
1153 	SOC_SINGLE_TLV("Speaker Volume", MAX98396_R2091_AMP_PATH_GAIN,
1154 		       0, 0x11, 0, max98396_spk_tlv),
1155 	/* Volume Ramp Up/Down Enable*/
1156 	SOC_SINGLE("Ramp Up Switch", MAX98396_R2092_AMP_DSP_CFG,
1157 		   MAX98396_DSP_SPK_VOL_RMPUP_SHIFT, 1, 0),
1158 	SOC_SINGLE("Ramp Down Switch", MAX98396_R2092_AMP_DSP_CFG,
1159 		   MAX98396_DSP_SPK_VOL_RMPDN_SHIFT, 1, 0),
1160 	/* Clock Monitor Enable */
1161 	SOC_SINGLE("CLK Monitor Switch", MAX98396_R203F_ENABLE_CTRLS,
1162 		   MAX98396_CTRL_CMON_EN_SHIFT, 1, 0),
1163 	/* Dither Enable */
1164 	SOC_SINGLE("Dither Switch", MAX98396_R2092_AMP_DSP_CFG,
1165 		   MAX98396_DSP_SPK_DITH_EN_SHIFT, 1, 0),
1166 	SOC_SINGLE("IV Dither Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1167 		   MAX98396_IV_SENSE_DITH_EN_SHIFT, 1, 0),
1168 	/* DC Blocker Enable */
1169 	SOC_SINGLE("DC Blocker Switch", MAX98396_R2092_AMP_DSP_CFG,
1170 		   MAX98396_DSP_SPK_DCBLK_EN_SHIFT, 1, 0),
1171 	SOC_SINGLE("IV DC Blocker Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1172 		   MAX98396_IV_SENSE_DCBLK_EN_SHIFT, 3, 0),
1173 	/* Speaker Safe Mode Enable */
1174 	SOC_SINGLE("Safe Mode Switch", MAX98396_R2092_AMP_DSP_CFG,
1175 		   MAX98396_DSP_SPK_SAFE_EN_SHIFT, 1, 0),
1176 	/* Wideband Filter Enable */
1177 	SOC_SINGLE("WB Filter Switch", MAX98396_R2092_AMP_DSP_CFG,
1178 		   MAX98396_DSP_SPK_WB_FLT_EN_SHIFT, 1, 0),
1179 	SOC_SINGLE("IV WB Filter Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1180 		   MAX98396_IV_SENSE_WB_FLT_EN_SHIFT, 1, 0),
1181 	/* Dynamic Headroom Tracking */
1182 	SOC_SINGLE("DHT Switch", MAX98396_R20DF_DHT_EN, 0, 1, 0),
1183 	/* Brownout Protection Engine */
1184 	SOC_SINGLE("BPE Switch", MAX98396_R210D_BPE_EN, 0, 1, 0),
1185 	SOC_SINGLE("BPE Limiter Switch", MAX98396_R210D_BPE_EN, 1, 1, 0),
1186 	/* Bypass Path Enable */
1187 	SOC_SINGLE("Bypass Path Switch",
1188 		   MAX98396_R205E_PCM_RX_EN, 1, 1, 0),
1189 	/* Speaker Operation Mode */
1190 	SOC_ENUM("OP Mode", max98396_op_mod_enum),
1191 	/* Auto Restart functions */
1192 	SOC_SINGLE("CMON Auto Restart Switch", MAX98396_R2038_CLK_MON_CTRL,
1193 		   MAX98396_CLK_MON_AUTO_RESTART_SHIFT, 1, 0),
1194 	SOC_SINGLE("PVDD Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1195 		   MAX98396_PVDD_UVLO_RESTART_SHFT, 1, 0),
1196 	SOC_SINGLE("VBAT Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1197 		   MAX98396_VBAT_UVLO_RESTART_SHFT, 1, 0),
1198 	SOC_SINGLE("THERM Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1199 		   MAX98396_THEM_SHDN_RESTART_SHFT, 1, 0),
1200 	SOC_SINGLE("OVC Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1201 		   MAX98396_OVC_RESTART_SHFT, 1, 0),
1202 	/* Thermal Threshold */
1203 	SOC_ENUM("THERM Thresh1", max98396_thermal_warn_thresh1_enum),
1204 	SOC_ENUM("THERM Thresh2", max98396_thermal_warn_thresh2_enum),
1205 	SOC_ENUM("THERM SHDN Thresh", max98396_thermal_shdn_thresh_enum),
1206 	SOC_ENUM("THERM Hysteresis", max98396_thermal_hysteresis_enum),
1207 	SOC_SINGLE("THERM Foldback Switch",
1208 		   MAX98396_R2027_THERM_FOLDBACK_EN, 0, 1, 0),
1209 	SOC_ENUM("THERM Slope1", max98396_thermal_fb_slope1_enum),
1210 	SOC_ENUM("THERM Slope2", max98396_thermal_fb_slope2_enum),
1211 	SOC_ENUM("THERM Release", max98396_thermal_fb_reltime_enum),
1212 	SOC_ENUM("THERM Hold", max98396_thermal_fb_holdtime_enum),
1213 	/* ADC */
1214 	SOC_SINGLE_EXT("ADC PVDD", MAX98396_R20B6_ADC_PVDD_READBACK_MSB, 0, 0x1FF, 0,
1215 		       max98396_adc_value_get, NULL),
1216 	SOC_SINGLE_EXT("ADC VBAT", MAX98396_R20B8_ADC_VBAT_READBACK_MSB, 0, 0x1FF, 0,
1217 		       max98396_adc_value_get, NULL),
1218 	SOC_SINGLE_EXT("ADC TEMP", MAX98396_R20BA_ADC_TEMP_READBACK_MSB, 0, 0x1FF, 0,
1219 		       max98396_adc_value_get, NULL),
1220 };
1221 
1222 static const struct snd_kcontrol_new max98397_snd_controls[] = {
1223 	/* Volume */
1224 	SOC_SINGLE_TLV("Digital Volume", MAX98396_R2090_AMP_VOL_CTRL,
1225 		       0, 0xFF, 1, max98397_digital_tlv),
1226 	SOC_SINGLE_TLV("Speaker Volume", MAX98396_R2091_AMP_PATH_GAIN,
1227 		       0, 0x15, 0, max98397_spk_tlv),
1228 	/* Volume Ramp Up/Down Enable*/
1229 	SOC_SINGLE("Ramp Up Switch", MAX98396_R2092_AMP_DSP_CFG,
1230 		   MAX98396_DSP_SPK_VOL_RMPUP_SHIFT, 1, 0),
1231 	SOC_SINGLE("Ramp Down Switch", MAX98396_R2092_AMP_DSP_CFG,
1232 		   MAX98396_DSP_SPK_VOL_RMPDN_SHIFT, 1, 0),
1233 	/* Clock Monitor Enable */
1234 	SOC_SINGLE("CLK Monitor Switch", MAX98396_R203F_ENABLE_CTRLS,
1235 		   MAX98396_CTRL_CMON_EN_SHIFT, 1, 0),
1236 	/* Dither Enable */
1237 	SOC_SINGLE("Dither Switch", MAX98396_R2092_AMP_DSP_CFG,
1238 		   MAX98396_DSP_SPK_DITH_EN_SHIFT, 1, 0),
1239 	SOC_SINGLE("IV Dither Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1240 		   MAX98396_IV_SENSE_DITH_EN_SHIFT, 1, 0),
1241 	/* DC Blocker Enable */
1242 	SOC_SINGLE("DC Blocker Switch", MAX98396_R2092_AMP_DSP_CFG,
1243 		   MAX98396_DSP_SPK_DCBLK_EN_SHIFT, 1, 0),
1244 	SOC_SINGLE("IV DC Blocker Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1245 		   MAX98396_IV_SENSE_DCBLK_EN_SHIFT, 3, 0),
1246 	/* Speaker Safe Mode Enable */
1247 	SOC_SINGLE("Safe Mode Switch", MAX98396_R2092_AMP_DSP_CFG,
1248 		   MAX98396_DSP_SPK_SAFE_EN_SHIFT, 1, 0),
1249 	/* Wideband Filter Enable */
1250 	SOC_SINGLE("WB Filter Switch", MAX98396_R2092_AMP_DSP_CFG,
1251 		   MAX98396_DSP_SPK_WB_FLT_EN_SHIFT, 1, 0),
1252 	SOC_SINGLE("IV WB Filter Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1253 		   MAX98396_IV_SENSE_WB_FLT_EN_SHIFT, 1, 0),
1254 	/* Dynamic Headroom Tracking */
1255 	SOC_SINGLE("DHT Switch", MAX98396_R20DF_DHT_EN, 0, 1, 0),
1256 	/* Brownout Protection Engine */
1257 	SOC_SINGLE("BPE Switch", MAX98396_R210D_BPE_EN, 0, 1, 0),
1258 	SOC_SINGLE("BPE Limiter Switch", MAX98396_R210D_BPE_EN, 1, 1, 0),
1259 	/* Bypass Path Enable */
1260 	SOC_SINGLE("Bypass Path Switch",
1261 		   MAX98396_R205E_PCM_RX_EN, 1, 1, 0),
1262 	/* Speaker Operation Mode */
1263 	SOC_ENUM("OP Mode", max98396_op_mod_enum),
1264 	/* Auto Restart functions */
1265 	SOC_SINGLE("CMON Auto Restart Switch", MAX98396_R2038_CLK_MON_CTRL,
1266 		   MAX98396_CLK_MON_AUTO_RESTART_SHIFT, 1, 0),
1267 	SOC_SINGLE("PVDD Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1268 		   MAX98396_PVDD_UVLO_RESTART_SHFT, 1, 0),
1269 	SOC_SINGLE("VBAT Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1270 		   MAX98396_VBAT_UVLO_RESTART_SHFT, 1, 0),
1271 	SOC_SINGLE("THERM Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1272 		   MAX98396_THEM_SHDN_RESTART_SHFT, 1, 0),
1273 	SOC_SINGLE("OVC Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1274 		   MAX98396_OVC_RESTART_SHFT, 1, 0),
1275 	/* Thermal Threshold */
1276 	SOC_ENUM("THERM Thresh1", max98396_thermal_warn_thresh1_enum),
1277 	SOC_ENUM("THERM Thresh2", max98396_thermal_warn_thresh2_enum),
1278 	SOC_ENUM("THERM SHDN Thresh", max98396_thermal_shdn_thresh_enum),
1279 	SOC_ENUM("THERM Hysteresis", max98396_thermal_hysteresis_enum),
1280 	SOC_SINGLE("THERM Foldback Switch",
1281 		   MAX98396_R2027_THERM_FOLDBACK_EN, 0, 1, 0),
1282 	SOC_ENUM("THERM Slope1", max98396_thermal_fb_slope1_enum),
1283 	SOC_ENUM("THERM Slope2", max98396_thermal_fb_slope2_enum),
1284 	SOC_ENUM("THERM Release", max98396_thermal_fb_reltime_enum),
1285 	SOC_ENUM("THERM Hold", max98396_thermal_fb_holdtime_enum),
1286 	/* ADC */
1287 	SOC_SINGLE_EXT("ADC PVDD", MAX98396_R20B6_ADC_PVDD_READBACK_MSB, 0, 0x1FF, 0,
1288 		       max98396_adc_value_get, NULL),
1289 	SOC_SINGLE_EXT("ADC VBAT", MAX98396_R20B8_ADC_VBAT_READBACK_MSB, 0, 0x1FF, 0,
1290 		       max98396_adc_value_get, NULL),
1291 	SOC_SINGLE_EXT("ADC TEMP", MAX98396_R20BA_ADC_TEMP_READBACK_MSB, 0, 0x1FF, 0,
1292 		       max98396_adc_value_get, NULL),
1293 };
1294 
1295 static const struct snd_soc_dapm_route max98396_audio_map[] = {
1296 	/* Plabyack */
1297 	{"DAI Sel Mux", "Left", "Amp Enable"},
1298 	{"DAI Sel Mux", "Right", "Amp Enable"},
1299 	{"DAI Sel Mux", "LeftRight", "Amp Enable"},
1300 	{"BE_OUT", NULL, "DAI Sel Mux"},
1301 	/* Capture */
1302 	{ "VI Sense", "Switch", "VMON" },
1303 	{ "VI Sense", "Switch", "IMON" },
1304 	{ "Voltage Sense", NULL, "VI Sense" },
1305 	{ "Current Sense", NULL, "VI Sense" },
1306 };
1307 
1308 static struct snd_soc_dai_driver max98396_dai[] = {
1309 	{
1310 		.name = "max98396-aif1",
1311 		.playback = {
1312 			.stream_name = "HiFi Playback",
1313 			.channels_min = 1,
1314 			.channels_max = 2,
1315 			.rates = MAX98396_RATES,
1316 			.formats = MAX98396_FORMATS,
1317 		},
1318 		.capture = {
1319 			.stream_name = "HiFi Capture",
1320 			.channels_min = 1,
1321 			.channels_max = 2,
1322 			.rates = MAX98396_RATES,
1323 			.formats = MAX98396_FORMATS,
1324 		},
1325 		.ops = &max98396_dai_ops,
1326 	}
1327 };
1328 
1329 static struct snd_soc_dai_driver max98397_dai[] = {
1330 	{
1331 		.name = "max98397-aif1",
1332 		.playback = {
1333 			.stream_name = "HiFi Playback",
1334 			.channels_min = 1,
1335 			.channels_max = 2,
1336 			.rates = MAX98396_RATES,
1337 			.formats = MAX98396_FORMATS,
1338 		},
1339 		.capture = {
1340 			.stream_name = "HiFi Capture",
1341 			.channels_min = 1,
1342 			.channels_max = 2,
1343 			.rates = MAX98396_RATES,
1344 			.formats = MAX98396_FORMATS,
1345 		},
1346 		.ops = &max98396_dai_ops,
1347 	}
1348 };
1349 
1350 static void max98396_reset(struct max98396_priv *max98396, struct device *dev)
1351 {
1352 	int ret, reg, count;
1353 
1354 	/* Software Reset */
1355 	ret = regmap_write(max98396->regmap,
1356 			   MAX98396_R2000_SW_RESET, 1);
1357 	if (ret)
1358 		dev_err(dev, "Reset command failed. (ret:%d)\n", ret);
1359 
1360 	count = 0;
1361 	while (count < 3) {
1362 		usleep_range(5000, 6000);
1363 		/* Software Reset Verification */
1364 		ret = regmap_read(max98396->regmap,
1365 				  GET_REG_ADDR_REV_ID(max98396->device_id), &reg);
1366 		if (!ret) {
1367 			dev_info(dev, "Reset completed (retry:%d)\n", count);
1368 			return;
1369 		}
1370 		count++;
1371 	}
1372 	dev_err(dev, "Reset failed. (ret:%d)\n", ret);
1373 }
1374 
1375 static int max98396_probe(struct snd_soc_component *component)
1376 {
1377 	struct max98396_priv *max98396 =
1378 		snd_soc_component_get_drvdata(component);
1379 
1380 	/* Software Reset */
1381 	max98396_reset(max98396, component->dev);
1382 
1383 	/* L/R mix configuration */
1384 	if (max98396->device_id == CODEC_TYPE_MAX98396) {
1385 		regmap_write(max98396->regmap,
1386 			     MAX98396_R2055_PCM_RX_SRC1, 0x02);
1387 		regmap_write(max98396->regmap,
1388 			     MAX98396_R2056_PCM_RX_SRC2, 0x10);
1389 	} else {
1390 		regmap_write(max98396->regmap,
1391 			     MAX98397_R2056_PCM_RX_SRC1, 0x02);
1392 		regmap_write(max98396->regmap,
1393 			     MAX98397_R2057_PCM_RX_SRC2, 0x10);
1394 	}
1395 	/* Supply control */
1396 	regmap_update_bits(max98396->regmap,
1397 			   MAX98396_R20A0_AMP_SUPPLY_CTL,
1398 			   MAX98396_AMP_SUPPLY_NOVBAT,
1399 			   (max98396->vbat == NULL) ?
1400 				MAX98396_AMP_SUPPLY_NOVBAT : 0);
1401 	/* Enable DC blocker */
1402 	regmap_update_bits(max98396->regmap,
1403 			   MAX98396_R2092_AMP_DSP_CFG, 1, 1);
1404 	/* Enable IV Monitor DC blocker */
1405 	regmap_update_bits(max98396->regmap,
1406 			   MAX98396_R20E0_IV_SENSE_PATH_CFG,
1407 			   MAX98396_IV_SENSE_DCBLK_EN_MASK,
1408 			   MAX98396_IV_SENSE_DCBLK_EN_MASK);
1409 	/* Configure default data output sources */
1410 	regmap_write(max98396->regmap,
1411 		     MAX98396_R205D_PCM_TX_SRC_EN, 3);
1412 	/* Enable Wideband Filter */
1413 	regmap_update_bits(max98396->regmap,
1414 			   MAX98396_R2092_AMP_DSP_CFG, 0x40, 0x40);
1415 	/* Enable IV Wideband Filter */
1416 	regmap_update_bits(max98396->regmap,
1417 			   MAX98396_R20E0_IV_SENSE_PATH_CFG, 8, 8);
1418 
1419 	/* Enable Bypass Source */
1420 	regmap_write(max98396->regmap,
1421 		     MAX98396_R2058_PCM_BYPASS_SRC,
1422 		     max98396->bypass_slot);
1423 	/* Voltage, current slot configuration */
1424 	regmap_write(max98396->regmap,
1425 		     MAX98396_R2044_PCM_TX_CTRL_1,
1426 		     max98396->v_slot);
1427 	regmap_write(max98396->regmap,
1428 		     MAX98396_R2045_PCM_TX_CTRL_2,
1429 		     max98396->i_slot);
1430 	regmap_write(max98396->regmap,
1431 		     MAX98396_R204A_PCM_TX_CTRL_7,
1432 		     max98396->spkfb_slot);
1433 
1434 	if (max98396->v_slot < 8)
1435 		if (max98396->device_id == CODEC_TYPE_MAX98396)
1436 			regmap_update_bits(max98396->regmap,
1437 					   MAX98396_R2053_PCM_TX_HIZ_CTRL_8,
1438 					   1 << max98396->v_slot, 0);
1439 		else
1440 			regmap_update_bits(max98396->regmap,
1441 					   MAX98397_R2054_PCM_TX_HIZ_CTRL_8,
1442 					   1 << max98396->v_slot, 0);
1443 	else
1444 		if (max98396->device_id == CODEC_TYPE_MAX98396)
1445 			regmap_update_bits(max98396->regmap,
1446 					   MAX98396_R2052_PCM_TX_HIZ_CTRL_7,
1447 					   1 << (max98396->v_slot - 8), 0);
1448 		else
1449 			regmap_update_bits(max98396->regmap,
1450 					   MAX98397_R2053_PCM_TX_HIZ_CTRL_7,
1451 					   1 << (max98396->v_slot - 8), 0);
1452 
1453 	if (max98396->i_slot < 8)
1454 		if (max98396->device_id == CODEC_TYPE_MAX98396)
1455 			regmap_update_bits(max98396->regmap,
1456 					   MAX98396_R2053_PCM_TX_HIZ_CTRL_8,
1457 					   1 << max98396->i_slot, 0);
1458 		else
1459 			regmap_update_bits(max98396->regmap,
1460 					   MAX98397_R2054_PCM_TX_HIZ_CTRL_8,
1461 					   1 << max98396->i_slot, 0);
1462 	else
1463 		if (max98396->device_id == CODEC_TYPE_MAX98396)
1464 			regmap_update_bits(max98396->regmap,
1465 					   MAX98396_R2052_PCM_TX_HIZ_CTRL_7,
1466 					   1 << (max98396->i_slot - 8), 0);
1467 		else
1468 			regmap_update_bits(max98396->regmap,
1469 					   MAX98397_R2053_PCM_TX_HIZ_CTRL_7,
1470 					   1 << (max98396->i_slot - 8), 0);
1471 
1472 	/* Set interleave mode */
1473 	if (max98396->interleave_mode)
1474 		regmap_update_bits(max98396->regmap,
1475 				   MAX98396_R2041_PCM_MODE_CFG,
1476 				   MAX98396_PCM_TX_CH_INTERLEAVE_MASK,
1477 				   MAX98396_PCM_TX_CH_INTERLEAVE_MASK);
1478 
1479 	regmap_update_bits(max98396->regmap,
1480 			   MAX98396_R2038_CLK_MON_CTRL,
1481 			   MAX98396_CLK_MON_AUTO_RESTART_MASK,
1482 			   MAX98396_CLK_MON_AUTO_RESTART_MASK);
1483 
1484 	regmap_update_bits(max98396->regmap,
1485 			   MAX98396_R203F_ENABLE_CTRLS,
1486 			   MAX98396_CTRL_DMON_STUCK_EN_MASK,
1487 			   max98396->dmon_stuck_enable ?
1488 				MAX98396_CTRL_DMON_STUCK_EN_MASK : 0);
1489 
1490 	regmap_update_bits(max98396->regmap,
1491 			   MAX98396_R203F_ENABLE_CTRLS,
1492 			   MAX98396_CTRL_DMON_MAG_EN_MASK,
1493 			   max98396->dmon_mag_enable ?
1494 				MAX98396_CTRL_DMON_MAG_EN_MASK : 0);
1495 
1496 	switch (max98396->dmon_duration) {
1497 	case 64:
1498 		regmap_update_bits(max98396->regmap,
1499 				   MAX98396_R2039_DATA_MON_CTRL,
1500 				   MAX98396_DMON_DURATION_MASK, 0);
1501 		break;
1502 	case 256:
1503 		regmap_update_bits(max98396->regmap,
1504 				   MAX98396_R2039_DATA_MON_CTRL,
1505 				   MAX98396_DMON_DURATION_MASK, 1);
1506 		break;
1507 	case 1024:
1508 		regmap_update_bits(max98396->regmap,
1509 				   MAX98396_R2039_DATA_MON_CTRL,
1510 				   MAX98396_DMON_DURATION_MASK, 2);
1511 		break;
1512 	case 4096:
1513 		regmap_update_bits(max98396->regmap,
1514 				   MAX98396_R2039_DATA_MON_CTRL,
1515 				   MAX98396_DMON_DURATION_MASK, 3);
1516 		break;
1517 	default:
1518 		dev_err(component->dev, "Invalid DMON duration %d\n",
1519 			max98396->dmon_duration);
1520 	}
1521 
1522 	switch (max98396->dmon_stuck_threshold) {
1523 	case 15:
1524 		regmap_update_bits(max98396->regmap,
1525 				   MAX98396_R2039_DATA_MON_CTRL,
1526 				   MAX98396_DMON_STUCK_THRESH_MASK,
1527 				   0 << MAX98396_DMON_STUCK_THRESH_SHIFT);
1528 		break;
1529 	case 13:
1530 		regmap_update_bits(max98396->regmap,
1531 				   MAX98396_R2039_DATA_MON_CTRL,
1532 				   MAX98396_DMON_STUCK_THRESH_MASK,
1533 				   1 << MAX98396_DMON_STUCK_THRESH_SHIFT);
1534 		break;
1535 	case 22:
1536 		regmap_update_bits(max98396->regmap,
1537 				   MAX98396_R2039_DATA_MON_CTRL,
1538 				   MAX98396_DMON_STUCK_THRESH_MASK,
1539 				   2 << MAX98396_DMON_STUCK_THRESH_SHIFT);
1540 		break;
1541 	case 9:
1542 		regmap_update_bits(max98396->regmap,
1543 				   MAX98396_R2039_DATA_MON_CTRL,
1544 				   MAX98396_DMON_STUCK_THRESH_MASK,
1545 				   3 << MAX98396_DMON_STUCK_THRESH_SHIFT);
1546 		break;
1547 	default:
1548 		dev_err(component->dev, "Invalid DMON stuck threshold %d\n",
1549 			max98396->dmon_stuck_threshold);
1550 	}
1551 
1552 	switch (max98396->dmon_mag_threshold) {
1553 	case 2 ... 5:
1554 		regmap_update_bits(max98396->regmap,
1555 				   MAX98396_R2039_DATA_MON_CTRL,
1556 				   MAX98396_DMON_STUCK_THRESH_MASK,
1557 				   (5 - max98396->dmon_mag_threshold)
1558 					<< MAX98396_DMON_MAG_THRESH_SHIFT);
1559 		break;
1560 	default:
1561 		dev_err(component->dev, "Invalid DMON magnitude threshold %d\n",
1562 			max98396->dmon_mag_threshold);
1563 	}
1564 
1565 	/* Speaker Amplifier PCM RX Enable by default */
1566 	regmap_update_bits(max98396->regmap,
1567 			   MAX98396_R205E_PCM_RX_EN,
1568 			   MAX98396_PCM_RX_EN_MASK, 1);
1569 
1570 	return 0;
1571 }
1572 
1573 static int max98396_suspend(struct device *dev)
1574 {
1575 	struct max98396_priv *max98396 = dev_get_drvdata(dev);
1576 
1577 	regcache_cache_only(max98396->regmap, true);
1578 	regcache_mark_dirty(max98396->regmap);
1579 	regulator_bulk_disable(MAX98396_NUM_CORE_SUPPLIES,
1580 			       max98396->core_supplies);
1581 	if (max98396->pvdd)
1582 		regulator_disable(max98396->pvdd);
1583 
1584 	if (max98396->vbat)
1585 		regulator_disable(max98396->vbat);
1586 
1587 	return 0;
1588 }
1589 
1590 static int max98396_resume(struct device *dev)
1591 {
1592 	struct max98396_priv *max98396 = dev_get_drvdata(dev);
1593 	int ret;
1594 
1595 	ret = regulator_bulk_enable(MAX98396_NUM_CORE_SUPPLIES,
1596 				    max98396->core_supplies);
1597 	if (ret < 0)
1598 		return ret;
1599 
1600 	if (max98396->pvdd) {
1601 		ret = regulator_enable(max98396->pvdd);
1602 		if (ret < 0)
1603 			return ret;
1604 	}
1605 
1606 	if (max98396->vbat) {
1607 		ret = regulator_enable(max98396->vbat);
1608 		if (ret < 0)
1609 			return ret;
1610 	}
1611 
1612 	regcache_cache_only(max98396->regmap, false);
1613 	max98396_reset(max98396, dev);
1614 	regcache_sync(max98396->regmap);
1615 	return 0;
1616 }
1617 
1618 static const struct dev_pm_ops max98396_pm = {
1619 	SYSTEM_SLEEP_PM_OPS(max98396_suspend, max98396_resume)
1620 };
1621 
1622 static const struct snd_soc_component_driver soc_codec_dev_max98396 = {
1623 	.probe			= max98396_probe,
1624 	.controls		= max98396_snd_controls,
1625 	.num_controls		= ARRAY_SIZE(max98396_snd_controls),
1626 	.dapm_widgets		= max98396_dapm_widgets,
1627 	.num_dapm_widgets	= ARRAY_SIZE(max98396_dapm_widgets),
1628 	.dapm_routes		= max98396_audio_map,
1629 	.num_dapm_routes	= ARRAY_SIZE(max98396_audio_map),
1630 	.idle_bias_on		= 1,
1631 	.use_pmdown_time	= 1,
1632 	.endianness		= 1,
1633 };
1634 
1635 static const struct snd_soc_component_driver soc_codec_dev_max98397 = {
1636 	.probe			= max98396_probe,
1637 	.controls		= max98397_snd_controls,
1638 	.num_controls		= ARRAY_SIZE(max98397_snd_controls),
1639 	.dapm_widgets		= max98396_dapm_widgets,
1640 	.num_dapm_widgets	= ARRAY_SIZE(max98396_dapm_widgets),
1641 	.dapm_routes		= max98396_audio_map,
1642 	.num_dapm_routes	= ARRAY_SIZE(max98396_audio_map),
1643 	.idle_bias_on		= 1,
1644 	.use_pmdown_time	= 1,
1645 	.endianness		= 1,
1646 };
1647 
1648 static const struct regmap_config max98396_regmap = {
1649 	.reg_bits = 16,
1650 	.val_bits = 8,
1651 	.max_register = MAX98396_R21FF_REVISION_ID,
1652 	.reg_defaults  = max98396_reg,
1653 	.num_reg_defaults = ARRAY_SIZE(max98396_reg),
1654 	.readable_reg = max98396_readable_register,
1655 	.volatile_reg = max98396_volatile_reg,
1656 	.cache_type = REGCACHE_RBTREE,
1657 };
1658 
1659 static const struct regmap_config max98397_regmap = {
1660 	.reg_bits = 16,
1661 	.val_bits = 8,
1662 	.max_register = MAX98397_R22FF_REVISION_ID,
1663 	.reg_defaults  = max98397_reg,
1664 	.num_reg_defaults = ARRAY_SIZE(max98397_reg),
1665 	.readable_reg = max98397_readable_register,
1666 	.volatile_reg = max98397_volatile_reg,
1667 	.cache_type = REGCACHE_RBTREE,
1668 };
1669 
1670 static void max98396_read_device_property(struct device *dev,
1671 					  struct max98396_priv *max98396)
1672 {
1673 	int value;
1674 
1675 	if (!device_property_read_u32(dev, "adi,vmon-slot-no", &value))
1676 		max98396->v_slot = value & 0xF;
1677 	else
1678 		max98396->v_slot = 0;
1679 
1680 	if (!device_property_read_u32(dev, "adi,imon-slot-no", &value))
1681 		max98396->i_slot = value & 0xF;
1682 	else
1683 		max98396->i_slot = 1;
1684 
1685 	if (!device_property_read_u32(dev, "adi,spkfb-slot-no", &value))
1686 		max98396->spkfb_slot = value & 0xF;
1687 	else
1688 		max98396->spkfb_slot = 2;
1689 
1690 	if (!device_property_read_u32(dev, "adi,bypass-slot-no", &value))
1691 		max98396->bypass_slot = value & 0xF;
1692 	else
1693 		max98396->bypass_slot = 0;
1694 
1695 	max98396->dmon_stuck_enable =
1696 		device_property_read_bool(dev, "adi,dmon-stuck-enable");
1697 
1698 	if (!device_property_read_u32(dev, "adi,dmon-stuck-threshold-bits", &value))
1699 		max98396->dmon_stuck_threshold = value;
1700 	else
1701 		max98396->dmon_stuck_threshold = 15;
1702 
1703 	max98396->dmon_mag_enable =
1704 		device_property_read_bool(dev, "adi,dmon-magnitude-enable");
1705 
1706 	if (!device_property_read_u32(dev, "adi,dmon-magnitude-threshold-bits", &value))
1707 		max98396->dmon_mag_threshold = value;
1708 	else
1709 		max98396->dmon_mag_threshold = 5;
1710 
1711 	if (!device_property_read_u32(dev, "adi,dmon-duration-ms", &value))
1712 		max98396->dmon_duration = value;
1713 	else
1714 		max98396->dmon_duration = 64;
1715 }
1716 
1717 static void max98396_core_supplies_disable(void *priv)
1718 {
1719 	struct max98396_priv *max98396 = priv;
1720 
1721 	regulator_bulk_disable(MAX98396_NUM_CORE_SUPPLIES,
1722 			       max98396->core_supplies);
1723 }
1724 
1725 static void max98396_supply_disable(void *r)
1726 {
1727 	regulator_disable((struct regulator *) r);
1728 }
1729 
1730 static int max98396_i2c_probe(struct i2c_client *i2c)
1731 {
1732 	const struct i2c_device_id *id = i2c_client_get_device_id(i2c);
1733 	struct max98396_priv *max98396 = NULL;
1734 	int i, ret, reg;
1735 
1736 	max98396 = devm_kzalloc(&i2c->dev, sizeof(*max98396), GFP_KERNEL);
1737 
1738 	if (!max98396) {
1739 		ret = -ENOMEM;
1740 		return ret;
1741 	}
1742 	i2c_set_clientdata(i2c, max98396);
1743 
1744 	max98396->device_id =  id->driver_data;
1745 
1746 	/* regmap initialization */
1747 	if (max98396->device_id == CODEC_TYPE_MAX98396)
1748 		max98396->regmap = devm_regmap_init_i2c(i2c, &max98396_regmap);
1749 
1750 	else
1751 		max98396->regmap = devm_regmap_init_i2c(i2c, &max98397_regmap);
1752 
1753 	if (IS_ERR(max98396->regmap)) {
1754 		ret = PTR_ERR(max98396->regmap);
1755 		dev_err(&i2c->dev,
1756 			"Failed to allocate regmap: %d\n", ret);
1757 		return ret;
1758 	}
1759 
1760 	/* Obtain regulator supplies */
1761 	for (i = 0; i < MAX98396_NUM_CORE_SUPPLIES; i++)
1762 		max98396->core_supplies[i].supply = max98396_core_supplies[i];
1763 
1764 	ret = devm_regulator_bulk_get(&i2c->dev, MAX98396_NUM_CORE_SUPPLIES,
1765 				      max98396->core_supplies);
1766 	if (ret < 0) {
1767 		dev_err(&i2c->dev, "Failed to request core supplies: %d\n", ret);
1768 		return ret;
1769 	}
1770 
1771 	max98396->vbat = devm_regulator_get_optional(&i2c->dev, "vbat");
1772 	if (IS_ERR(max98396->vbat)) {
1773 		if (PTR_ERR(max98396->vbat) == -EPROBE_DEFER)
1774 			return -EPROBE_DEFER;
1775 
1776 		max98396->vbat = NULL;
1777 	}
1778 
1779 	max98396->pvdd = devm_regulator_get_optional(&i2c->dev, "pvdd");
1780 	if (IS_ERR(max98396->pvdd)) {
1781 		if (PTR_ERR(max98396->pvdd) == -EPROBE_DEFER)
1782 			return -EPROBE_DEFER;
1783 
1784 		max98396->pvdd = NULL;
1785 	}
1786 
1787 	ret = regulator_bulk_enable(MAX98396_NUM_CORE_SUPPLIES,
1788 				    max98396->core_supplies);
1789 	if (ret < 0) {
1790 		dev_err(&i2c->dev, "Unable to enable core supplies: %d", ret);
1791 		return ret;
1792 	}
1793 
1794 	ret = devm_add_action_or_reset(&i2c->dev, max98396_core_supplies_disable,
1795 				       max98396);
1796 	if (ret < 0)
1797 		return ret;
1798 
1799 	if (max98396->pvdd) {
1800 		ret = regulator_enable(max98396->pvdd);
1801 		if (ret < 0)
1802 			return ret;
1803 
1804 		ret = devm_add_action_or_reset(&i2c->dev,
1805 					       max98396_supply_disable,
1806 					       max98396->pvdd);
1807 		if (ret < 0)
1808 			return ret;
1809 	}
1810 
1811 	if (max98396->vbat) {
1812 		ret = regulator_enable(max98396->vbat);
1813 		if (ret < 0)
1814 			return ret;
1815 
1816 		ret = devm_add_action_or_reset(&i2c->dev,
1817 					       max98396_supply_disable,
1818 					       max98396->vbat);
1819 		if (ret < 0)
1820 			return ret;
1821 	}
1822 
1823 	/* update interleave mode info */
1824 	if (device_property_read_bool(&i2c->dev, "adi,interleave_mode"))
1825 		max98396->interleave_mode = true;
1826 	else
1827 		max98396->interleave_mode = false;
1828 
1829 	/* voltage/current slot & gpio configuration */
1830 	max98396_read_device_property(&i2c->dev, max98396);
1831 
1832 	/* Reset the Device */
1833 	max98396->reset_gpio = devm_gpiod_get_optional(&i2c->dev,
1834 						       "reset", GPIOD_OUT_HIGH);
1835 	if (IS_ERR(max98396->reset_gpio)) {
1836 		ret = PTR_ERR(max98396->reset_gpio);
1837 		dev_err(&i2c->dev, "Unable to request GPIO pin: %d.\n", ret);
1838 		return ret;
1839 	}
1840 
1841 	if (max98396->reset_gpio) {
1842 		usleep_range(5000, 6000);
1843 		gpiod_set_value_cansleep(max98396->reset_gpio, 0);
1844 		/* Wait for the hw reset done */
1845 		usleep_range(5000, 6000);
1846 	}
1847 
1848 	ret = regmap_read(max98396->regmap,
1849 			  GET_REG_ADDR_REV_ID(max98396->device_id), &reg);
1850 	if (ret < 0) {
1851 		dev_err(&i2c->dev, "%s: failed to read revision of the device.\n",  id->name);
1852 		return ret;
1853 	}
1854 	dev_info(&i2c->dev, "%s revision ID: 0x%02X\n", id->name, reg);
1855 
1856 	/* codec registration */
1857 	if (max98396->device_id == CODEC_TYPE_MAX98396)
1858 		ret = devm_snd_soc_register_component(&i2c->dev,
1859 						      &soc_codec_dev_max98396,
1860 						      max98396_dai,
1861 						      ARRAY_SIZE(max98396_dai));
1862 	else
1863 		ret = devm_snd_soc_register_component(&i2c->dev,
1864 						      &soc_codec_dev_max98397,
1865 						      max98397_dai,
1866 						      ARRAY_SIZE(max98397_dai));
1867 	if (ret < 0)
1868 		dev_err(&i2c->dev, "Failed to register codec: %d\n", ret);
1869 
1870 	return ret;
1871 }
1872 
1873 static const struct i2c_device_id max98396_i2c_id[] = {
1874 	{ "max98396", CODEC_TYPE_MAX98396},
1875 	{ "max98397", CODEC_TYPE_MAX98397},
1876 	{ },
1877 };
1878 
1879 MODULE_DEVICE_TABLE(i2c, max98396_i2c_id);
1880 
1881 #if defined(CONFIG_OF)
1882 static const struct of_device_id max98396_of_match[] = {
1883 	{ .compatible = "adi,max98396", },
1884 	{ .compatible = "adi,max98397", },
1885 	{ }
1886 };
1887 MODULE_DEVICE_TABLE(of, max98396_of_match);
1888 #endif
1889 
1890 #ifdef CONFIG_ACPI
1891 static const struct acpi_device_id max98396_acpi_match[] = {
1892 	{ "ADS8396", 0 },
1893 	{ "ADS8397", 0 },
1894 	{},
1895 };
1896 MODULE_DEVICE_TABLE(acpi, max98396_acpi_match);
1897 #endif
1898 
1899 static struct i2c_driver max98396_i2c_driver = {
1900 	.driver = {
1901 		.name = "max98396",
1902 		.of_match_table = of_match_ptr(max98396_of_match),
1903 		.acpi_match_table = ACPI_PTR(max98396_acpi_match),
1904 		.pm = pm_ptr(&max98396_pm),
1905 	},
1906 	.probe = max98396_i2c_probe,
1907 	.id_table = max98396_i2c_id,
1908 };
1909 
1910 module_i2c_driver(max98396_i2c_driver)
1911 
1912 MODULE_DESCRIPTION("ALSA SoC MAX98396 driver");
1913 MODULE_AUTHOR("Ryan Lee <ryans.lee@analog.com>");
1914 MODULE_LICENSE("GPL");
1915