GNU Linux-libre 6.9.1-gnu
[releases.git] / sound / soc / codecs / max98396.c
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 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 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 =
957                 snd_soc_dapm_kcontrol_component(kcontrol);
958         struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component);
959         int reg, val;
960
961         if (max98396->device_id == CODEC_TYPE_MAX98396)
962                 reg = MAX98396_R2055_PCM_RX_SRC1;
963         else
964                 reg = MAX98397_R2056_PCM_RX_SRC1;
965
966         regmap_read(max98396->regmap, reg, &val);
967
968         ucontrol->value.enumerated.item[0] = val;
969
970         return 0;
971 }
972
973 static int max98396_mux_put(struct snd_kcontrol *kcontrol,
974                             struct snd_ctl_elem_value *ucontrol)
975 {
976         struct snd_soc_component *component =
977                 snd_soc_dapm_kcontrol_component(kcontrol);
978         struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
979         struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component);
980         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
981         unsigned int *item = ucontrol->value.enumerated.item;
982         int reg, val;
983         int change;
984
985         if (item[0] >= e->items)
986                 return -EINVAL;
987
988         val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
989
990         if (max98396->device_id == CODEC_TYPE_MAX98396)
991                 reg = MAX98396_R2055_PCM_RX_SRC1;
992         else
993                 reg = MAX98397_R2056_PCM_RX_SRC1;
994
995         change = snd_soc_component_test_bits(component, reg,
996                                              MAX98396_PCM_RX_MASK, val);
997
998         if (change)
999                 regmap_update_bits(max98396->regmap, reg,
1000                                    MAX98396_PCM_RX_MASK, val);
1001
1002         snd_soc_dapm_mux_update_power(dapm, kcontrol, item[0], e, NULL);
1003
1004         return change;
1005 }
1006
1007 static const char * const max98396_switch_text[] = {
1008         "Left", "Right", "LeftRight"};
1009
1010 static SOC_ENUM_SINGLE_DECL(dai_sel_enum, SND_SOC_NOPM, 0,
1011                             max98396_switch_text);
1012
1013 static const struct snd_kcontrol_new max98396_dai_mux =
1014         SOC_DAPM_ENUM_EXT("DAI Sel Mux", dai_sel_enum,
1015                           max98396_mux_get, max98396_mux_put);
1016
1017 static const struct snd_kcontrol_new max98396_vi_control =
1018         SOC_DAPM_SINGLE("Switch", MAX98396_R205F_PCM_TX_EN, 0, 1, 0);
1019
1020 static const struct snd_soc_dapm_widget max98396_dapm_widgets[] = {
1021         SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback",
1022                            MAX98396_R20AF_AMP_EN, 0, 0, max98396_dac_event,
1023                            SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1024         SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0,
1025                          &max98396_dai_mux),
1026         SND_SOC_DAPM_OUTPUT("BE_OUT"),
1027         SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture", 0,
1028                              MAX98396_R20E4_IV_SENSE_PATH_EN, 0, 0),
1029         SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0,
1030                              MAX98396_R20E4_IV_SENSE_PATH_EN, 1, 0),
1031         SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM, 0, 0,
1032                             &max98396_vi_control),
1033         SND_SOC_DAPM_SIGGEN("VMON"),
1034         SND_SOC_DAPM_SIGGEN("IMON"),
1035         SND_SOC_DAPM_SIGGEN("FBMON"),
1036 };
1037
1038 static const char * const max98396_thermal_thresh_text[] = {
1039         "50C", "51C", "52C", "53C", "54C", "55C", "56C", "57C",
1040         "58C", "59C", "60C", "61C", "62C", "63C", "64C", "65C",
1041         "66C", "67C", "68C", "69C", "70C", "71C", "72C", "73C",
1042         "74C", "75C", "76C", "77C", "78C", "79C", "80C", "81C",
1043         "82C", "83C", "84C", "85C", "86C", "87C", "88C", "89C",
1044         "90C", "91C", "92C", "93C", "94C", "95C", "96C", "97C",
1045         "98C", "99C", "100C", "101C", "102C", "103C", "104C", "105C",
1046         "106C", "107C", "108C", "109C", "110C", "111C", "112C", "113C",
1047         "114C", "115C", "116C", "117C", "118C", "119C", "120C", "121C",
1048         "122C", "123C", "124C", "125C", "126C", "127C", "128C", "129C",
1049         "130C", "131C", "132C", "133C", "134C", "135C", "136C", "137C",
1050         "138C", "139C", "140C", "141C", "142C", "143C", "144C", "145C",
1051         "146C", "147C", "148C", "149C", "150C"
1052 };
1053
1054 static SOC_ENUM_SINGLE_DECL(max98396_thermal_warn_thresh1_enum,
1055                             MAX98396_R2020_THERM_WARN_THRESH, 0,
1056                             max98396_thermal_thresh_text);
1057
1058 static SOC_ENUM_SINGLE_DECL(max98396_thermal_warn_thresh2_enum,
1059                             MAX98396_R2021_THERM_WARN_THRESH2, 0,
1060                             max98396_thermal_thresh_text);
1061
1062 static SOC_ENUM_SINGLE_DECL(max98396_thermal_shdn_thresh_enum,
1063                             MAX98396_R2022_THERM_SHDN_THRESH, 0,
1064                             max98396_thermal_thresh_text);
1065
1066 static const char * const max98396_thermal_hyteresis_text[] = {
1067         "2C", "5C", "7C", "10C"
1068 };
1069
1070 static SOC_ENUM_SINGLE_DECL(max98396_thermal_hysteresis_enum,
1071                             MAX98396_R2023_THERM_HYSTERESIS, 0,
1072                             max98396_thermal_hyteresis_text);
1073
1074 static const char * const max98396_foldback_slope_text[] = {
1075         "0.25", "0.5", "1.0", "2.0"
1076 };
1077
1078 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_slope1_enum,
1079                             MAX98396_R2024_THERM_FOLDBACK_SET,
1080                             MAX98396_THERM_FB_SLOPE1_SHIFT,
1081                             max98396_foldback_slope_text);
1082
1083 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_slope2_enum,
1084                             MAX98396_R2024_THERM_FOLDBACK_SET,
1085                             MAX98396_THERM_FB_SLOPE2_SHIFT,
1086                             max98396_foldback_slope_text);
1087
1088 static const char * const max98396_foldback_reltime_text[] = {
1089         "3ms", "10ms", "100ms", "300ms"
1090 };
1091
1092 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_reltime_enum,
1093                             MAX98396_R2024_THERM_FOLDBACK_SET,
1094                             MAX98396_THERM_FB_REL_SHIFT,
1095                             max98396_foldback_reltime_text);
1096
1097 static const char * const max98396_foldback_holdtime_text[] = {
1098         "0ms", "20ms", "40ms", "80ms"
1099 };
1100
1101 static SOC_ENUM_SINGLE_DECL(max98396_thermal_fb_holdtime_enum,
1102                             MAX98396_R2024_THERM_FOLDBACK_SET,
1103                             MAX98396_THERM_FB_HOLD_SHIFT,
1104                             max98396_foldback_holdtime_text);
1105
1106 static int max98396_adc_value_get(struct snd_kcontrol *kcontrol,
1107                                   struct snd_ctl_elem_value *ucontrol)
1108 {
1109         struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
1110         struct soc_mixer_control *mc =
1111                 (struct soc_mixer_control *)kcontrol->private_value;
1112         struct max98396_priv *max98396 = snd_soc_component_get_drvdata(component);
1113         int ret;
1114         u8 val[2];
1115         int reg = mc->reg;
1116
1117         /* ADC value is not available if the device is powered down */
1118         if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF)
1119                 goto exit;
1120
1121         if (max98396->device_id == CODEC_TYPE_MAX98397) {
1122                 switch (mc->reg) {
1123                 case MAX98396_R20B6_ADC_PVDD_READBACK_MSB:
1124                         reg = MAX98397_R20B7_ADC_PVDD_READBACK_MSB;
1125                         break;
1126                 case MAX98396_R20B8_ADC_VBAT_READBACK_MSB:
1127                         reg = MAX98397_R20B9_ADC_VBAT_READBACK_MSB;
1128                         break;
1129                 case MAX98396_R20BA_ADC_TEMP_READBACK_MSB:
1130                         reg = MAX98397_R20BB_ADC_TEMP_READBACK_MSB;
1131                         break;
1132                 default:
1133                         goto exit;
1134                 }
1135         }
1136
1137         ret = regmap_raw_read(max98396->regmap, reg, &val, 2);
1138         if (ret)
1139                 goto exit;
1140
1141         /* ADC readback bits[8:0] rearrangement */
1142         ucontrol->value.integer.value[0] = (val[0] << 1) | (val[1] & 1);
1143         return 0;
1144
1145 exit:
1146         ucontrol->value.integer.value[0] = 0;
1147         return 0;
1148 }
1149
1150 static const struct snd_kcontrol_new max98396_snd_controls[] = {
1151         /* Volume */
1152         SOC_SINGLE_TLV("Digital Volume", MAX98396_R2090_AMP_VOL_CTRL,
1153                        0, 0x7F, 1, max98396_digital_tlv),
1154         SOC_SINGLE_TLV("Speaker Volume", MAX98396_R2091_AMP_PATH_GAIN,
1155                        0, 0x11, 0, max98396_spk_tlv),
1156         /* Volume Ramp Up/Down Enable*/
1157         SOC_SINGLE("Ramp Up Switch", MAX98396_R2092_AMP_DSP_CFG,
1158                    MAX98396_DSP_SPK_VOL_RMPUP_SHIFT, 1, 0),
1159         SOC_SINGLE("Ramp Down Switch", MAX98396_R2092_AMP_DSP_CFG,
1160                    MAX98396_DSP_SPK_VOL_RMPDN_SHIFT, 1, 0),
1161         /* Clock Monitor Enable */
1162         SOC_SINGLE("CLK Monitor Switch", MAX98396_R203F_ENABLE_CTRLS,
1163                    MAX98396_CTRL_CMON_EN_SHIFT, 1, 0),
1164         /* Dither Enable */
1165         SOC_SINGLE("Dither Switch", MAX98396_R2092_AMP_DSP_CFG,
1166                    MAX98396_DSP_SPK_DITH_EN_SHIFT, 1, 0),
1167         SOC_SINGLE("IV Dither Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1168                    MAX98396_IV_SENSE_DITH_EN_SHIFT, 1, 0),
1169         /* DC Blocker Enable */
1170         SOC_SINGLE("DC Blocker Switch", MAX98396_R2092_AMP_DSP_CFG,
1171                    MAX98396_DSP_SPK_DCBLK_EN_SHIFT, 1, 0),
1172         SOC_SINGLE("IV DC Blocker Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1173                    MAX98396_IV_SENSE_DCBLK_EN_SHIFT, 3, 0),
1174         /* Speaker Safe Mode Enable */
1175         SOC_SINGLE("Safe Mode Switch", MAX98396_R2092_AMP_DSP_CFG,
1176                    MAX98396_DSP_SPK_SAFE_EN_SHIFT, 1, 0),
1177         /* Wideband Filter Enable */
1178         SOC_SINGLE("WB Filter Switch", MAX98396_R2092_AMP_DSP_CFG,
1179                    MAX98396_DSP_SPK_WB_FLT_EN_SHIFT, 1, 0),
1180         SOC_SINGLE("IV WB Filter Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1181                    MAX98396_IV_SENSE_WB_FLT_EN_SHIFT, 1, 0),
1182         /* Dynamic Headroom Tracking */
1183         SOC_SINGLE("DHT Switch", MAX98396_R20DF_DHT_EN, 0, 1, 0),
1184         /* Brownout Protection Engine */
1185         SOC_SINGLE("BPE Switch", MAX98396_R210D_BPE_EN, 0, 1, 0),
1186         SOC_SINGLE("BPE Limiter Switch", MAX98396_R210D_BPE_EN, 1, 1, 0),
1187         /* Bypass Path Enable */
1188         SOC_SINGLE("Bypass Path Switch",
1189                    MAX98396_R205E_PCM_RX_EN, 1, 1, 0),
1190         /* Speaker Operation Mode */
1191         SOC_ENUM("OP Mode", max98396_op_mod_enum),
1192         /* Auto Restart functions */
1193         SOC_SINGLE("CMON Auto Restart Switch", MAX98396_R2038_CLK_MON_CTRL,
1194                    MAX98396_CLK_MON_AUTO_RESTART_SHIFT, 1, 0),
1195         SOC_SINGLE("PVDD Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1196                    MAX98396_PVDD_UVLO_RESTART_SHFT, 1, 0),
1197         SOC_SINGLE("VBAT Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1198                    MAX98396_VBAT_UVLO_RESTART_SHFT, 1, 0),
1199         SOC_SINGLE("THERM Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1200                    MAX98396_THEM_SHDN_RESTART_SHFT, 1, 0),
1201         SOC_SINGLE("OVC Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1202                    MAX98396_OVC_RESTART_SHFT, 1, 0),
1203         /* Thermal Threshold */
1204         SOC_ENUM("THERM Thresh1", max98396_thermal_warn_thresh1_enum),
1205         SOC_ENUM("THERM Thresh2", max98396_thermal_warn_thresh2_enum),
1206         SOC_ENUM("THERM SHDN Thresh", max98396_thermal_shdn_thresh_enum),
1207         SOC_ENUM("THERM Hysteresis", max98396_thermal_hysteresis_enum),
1208         SOC_SINGLE("THERM Foldback Switch",
1209                    MAX98396_R2027_THERM_FOLDBACK_EN, 0, 1, 0),
1210         SOC_ENUM("THERM Slope1", max98396_thermal_fb_slope1_enum),
1211         SOC_ENUM("THERM Slope2", max98396_thermal_fb_slope2_enum),
1212         SOC_ENUM("THERM Release", max98396_thermal_fb_reltime_enum),
1213         SOC_ENUM("THERM Hold", max98396_thermal_fb_holdtime_enum),
1214         /* ADC */
1215         SOC_SINGLE_EXT("ADC PVDD", MAX98396_R20B6_ADC_PVDD_READBACK_MSB, 0, 0x1FF, 0,
1216                        max98396_adc_value_get, NULL),
1217         SOC_SINGLE_EXT("ADC VBAT", MAX98396_R20B8_ADC_VBAT_READBACK_MSB, 0, 0x1FF, 0,
1218                        max98396_adc_value_get, NULL),
1219         SOC_SINGLE_EXT("ADC TEMP", MAX98396_R20BA_ADC_TEMP_READBACK_MSB, 0, 0x1FF, 0,
1220                        max98396_adc_value_get, NULL),
1221 };
1222
1223 static const struct snd_kcontrol_new max98397_snd_controls[] = {
1224         /* Volume */
1225         SOC_SINGLE_TLV("Digital Volume", MAX98396_R2090_AMP_VOL_CTRL,
1226                        0, 0xFF, 1, max98397_digital_tlv),
1227         SOC_SINGLE_TLV("Speaker Volume", MAX98396_R2091_AMP_PATH_GAIN,
1228                        0, 0x15, 0, max98397_spk_tlv),
1229         /* Volume Ramp Up/Down Enable*/
1230         SOC_SINGLE("Ramp Up Switch", MAX98396_R2092_AMP_DSP_CFG,
1231                    MAX98396_DSP_SPK_VOL_RMPUP_SHIFT, 1, 0),
1232         SOC_SINGLE("Ramp Down Switch", MAX98396_R2092_AMP_DSP_CFG,
1233                    MAX98396_DSP_SPK_VOL_RMPDN_SHIFT, 1, 0),
1234         /* Clock Monitor Enable */
1235         SOC_SINGLE("CLK Monitor Switch", MAX98396_R203F_ENABLE_CTRLS,
1236                    MAX98396_CTRL_CMON_EN_SHIFT, 1, 0),
1237         /* Dither Enable */
1238         SOC_SINGLE("Dither Switch", MAX98396_R2092_AMP_DSP_CFG,
1239                    MAX98396_DSP_SPK_DITH_EN_SHIFT, 1, 0),
1240         SOC_SINGLE("IV Dither Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1241                    MAX98396_IV_SENSE_DITH_EN_SHIFT, 1, 0),
1242         /* DC Blocker Enable */
1243         SOC_SINGLE("DC Blocker Switch", MAX98396_R2092_AMP_DSP_CFG,
1244                    MAX98396_DSP_SPK_DCBLK_EN_SHIFT, 1, 0),
1245         SOC_SINGLE("IV DC Blocker Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1246                    MAX98396_IV_SENSE_DCBLK_EN_SHIFT, 3, 0),
1247         /* Speaker Safe Mode Enable */
1248         SOC_SINGLE("Safe Mode Switch", MAX98396_R2092_AMP_DSP_CFG,
1249                    MAX98396_DSP_SPK_SAFE_EN_SHIFT, 1, 0),
1250         /* Wideband Filter Enable */
1251         SOC_SINGLE("WB Filter Switch", MAX98396_R2092_AMP_DSP_CFG,
1252                    MAX98396_DSP_SPK_WB_FLT_EN_SHIFT, 1, 0),
1253         SOC_SINGLE("IV WB Filter Switch", MAX98396_R20E0_IV_SENSE_PATH_CFG,
1254                    MAX98396_IV_SENSE_WB_FLT_EN_SHIFT, 1, 0),
1255         /* Dynamic Headroom Tracking */
1256         SOC_SINGLE("DHT Switch", MAX98396_R20DF_DHT_EN, 0, 1, 0),
1257         /* Brownout Protection Engine */
1258         SOC_SINGLE("BPE Switch", MAX98396_R210D_BPE_EN, 0, 1, 0),
1259         SOC_SINGLE("BPE Limiter Switch", MAX98396_R210D_BPE_EN, 1, 1, 0),
1260         /* Bypass Path Enable */
1261         SOC_SINGLE("Bypass Path Switch",
1262                    MAX98396_R205E_PCM_RX_EN, 1, 1, 0),
1263         /* Speaker Operation Mode */
1264         SOC_ENUM("OP Mode", max98396_op_mod_enum),
1265         /* Auto Restart functions */
1266         SOC_SINGLE("CMON Auto Restart Switch", MAX98396_R2038_CLK_MON_CTRL,
1267                    MAX98396_CLK_MON_AUTO_RESTART_SHIFT, 1, 0),
1268         SOC_SINGLE("PVDD Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1269                    MAX98396_PVDD_UVLO_RESTART_SHFT, 1, 0),
1270         SOC_SINGLE("VBAT Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1271                    MAX98396_VBAT_UVLO_RESTART_SHFT, 1, 0),
1272         SOC_SINGLE("THERM Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1273                    MAX98396_THEM_SHDN_RESTART_SHFT, 1, 0),
1274         SOC_SINGLE("OVC Auto Restart Switch", MAX98396_R210E_AUTO_RESTART,
1275                    MAX98396_OVC_RESTART_SHFT, 1, 0),
1276         /* Thermal Threshold */
1277         SOC_ENUM("THERM Thresh1", max98396_thermal_warn_thresh1_enum),
1278         SOC_ENUM("THERM Thresh2", max98396_thermal_warn_thresh2_enum),
1279         SOC_ENUM("THERM SHDN Thresh", max98396_thermal_shdn_thresh_enum),
1280         SOC_ENUM("THERM Hysteresis", max98396_thermal_hysteresis_enum),
1281         SOC_SINGLE("THERM Foldback Switch",
1282                    MAX98396_R2027_THERM_FOLDBACK_EN, 0, 1, 0),
1283         SOC_ENUM("THERM Slope1", max98396_thermal_fb_slope1_enum),
1284         SOC_ENUM("THERM Slope2", max98396_thermal_fb_slope2_enum),
1285         SOC_ENUM("THERM Release", max98396_thermal_fb_reltime_enum),
1286         SOC_ENUM("THERM Hold", max98396_thermal_fb_holdtime_enum),
1287         /* ADC */
1288         SOC_SINGLE_EXT("ADC PVDD", MAX98396_R20B6_ADC_PVDD_READBACK_MSB, 0, 0x1FF, 0,
1289                        max98396_adc_value_get, NULL),
1290         SOC_SINGLE_EXT("ADC VBAT", MAX98396_R20B8_ADC_VBAT_READBACK_MSB, 0, 0x1FF, 0,
1291                        max98396_adc_value_get, NULL),
1292         SOC_SINGLE_EXT("ADC TEMP", MAX98396_R20BA_ADC_TEMP_READBACK_MSB, 0, 0x1FF, 0,
1293                        max98396_adc_value_get, NULL),
1294 };
1295
1296 static const struct snd_soc_dapm_route max98396_audio_map[] = {
1297         /* Plabyack */
1298         {"DAI Sel Mux", "Left", "Amp Enable"},
1299         {"DAI Sel Mux", "Right", "Amp Enable"},
1300         {"DAI Sel Mux", "LeftRight", "Amp Enable"},
1301         {"BE_OUT", NULL, "DAI Sel Mux"},
1302         /* Capture */
1303         { "VI Sense", "Switch", "VMON" },
1304         { "VI Sense", "Switch", "IMON" },
1305         { "Voltage Sense", NULL, "VI Sense" },
1306         { "Current Sense", NULL, "VI Sense" },
1307 };
1308
1309 static struct snd_soc_dai_driver max98396_dai[] = {
1310         {
1311                 .name = "max98396-aif1",
1312                 .playback = {
1313                         .stream_name = "HiFi Playback",
1314                         .channels_min = 1,
1315                         .channels_max = 2,
1316                         .rates = MAX98396_RATES,
1317                         .formats = MAX98396_FORMATS,
1318                 },
1319                 .capture = {
1320                         .stream_name = "HiFi Capture",
1321                         .channels_min = 1,
1322                         .channels_max = 2,
1323                         .rates = MAX98396_RATES,
1324                         .formats = MAX98396_FORMATS,
1325                 },
1326                 .ops = &max98396_dai_ops,
1327         }
1328 };
1329
1330 static struct snd_soc_dai_driver max98397_dai[] = {
1331         {
1332                 .name = "max98397-aif1",
1333                 .playback = {
1334                         .stream_name = "HiFi Playback",
1335                         .channels_min = 1,
1336                         .channels_max = 2,
1337                         .rates = MAX98396_RATES,
1338                         .formats = MAX98396_FORMATS,
1339                 },
1340                 .capture = {
1341                         .stream_name = "HiFi Capture",
1342                         .channels_min = 1,
1343                         .channels_max = 2,
1344                         .rates = MAX98396_RATES,
1345                         .formats = MAX98396_FORMATS,
1346                 },
1347                 .ops = &max98396_dai_ops,
1348         }
1349 };
1350
1351 static void max98396_reset(struct max98396_priv *max98396, struct device *dev)
1352 {
1353         int ret, reg, count;
1354
1355         /* Software Reset */
1356         ret = regmap_write(max98396->regmap,
1357                            MAX98396_R2000_SW_RESET, 1);
1358         if (ret)
1359                 dev_err(dev, "Reset command failed. (ret:%d)\n", ret);
1360
1361         count = 0;
1362         while (count < 3) {
1363                 usleep_range(5000, 6000);
1364                 /* Software Reset Verification */
1365                 ret = regmap_read(max98396->regmap,
1366                                   GET_REG_ADDR_REV_ID(max98396->device_id), &reg);
1367                 if (!ret) {
1368                         dev_info(dev, "Reset completed (retry:%d)\n", count);
1369                         return;
1370                 }
1371                 count++;
1372         }
1373         dev_err(dev, "Reset failed. (ret:%d)\n", ret);
1374 }
1375
1376 static int max98396_probe(struct snd_soc_component *component)
1377 {
1378         struct max98396_priv *max98396 =
1379                 snd_soc_component_get_drvdata(component);
1380
1381         /* Software Reset */
1382         max98396_reset(max98396, component->dev);
1383
1384         /* L/R mix configuration */
1385         if (max98396->device_id == CODEC_TYPE_MAX98396) {
1386                 regmap_write(max98396->regmap,
1387                              MAX98396_R2055_PCM_RX_SRC1, 0x02);
1388                 regmap_write(max98396->regmap,
1389                              MAX98396_R2056_PCM_RX_SRC2, 0x10);
1390         } else {
1391                 regmap_write(max98396->regmap,
1392                              MAX98397_R2056_PCM_RX_SRC1, 0x02);
1393                 regmap_write(max98396->regmap,
1394                              MAX98397_R2057_PCM_RX_SRC2, 0x10);
1395         }
1396         /* Supply control */
1397         regmap_update_bits(max98396->regmap,
1398                            MAX98396_R20A0_AMP_SUPPLY_CTL,
1399                            MAX98396_AMP_SUPPLY_NOVBAT,
1400                            (max98396->vbat == NULL) ?
1401                                 MAX98396_AMP_SUPPLY_NOVBAT : 0);
1402         /* Enable DC blocker */
1403         regmap_update_bits(max98396->regmap,
1404                            MAX98396_R2092_AMP_DSP_CFG, 1, 1);
1405         /* Enable IV Monitor DC blocker */
1406         regmap_update_bits(max98396->regmap,
1407                            MAX98396_R20E0_IV_SENSE_PATH_CFG,
1408                            MAX98396_IV_SENSE_DCBLK_EN_MASK,
1409                            MAX98396_IV_SENSE_DCBLK_EN_MASK);
1410         /* Configure default data output sources */
1411         regmap_write(max98396->regmap,
1412                      MAX98396_R205D_PCM_TX_SRC_EN, 3);
1413         /* Enable Wideband Filter */
1414         regmap_update_bits(max98396->regmap,
1415                            MAX98396_R2092_AMP_DSP_CFG, 0x40, 0x40);
1416         /* Enable IV Wideband Filter */
1417         regmap_update_bits(max98396->regmap,
1418                            MAX98396_R20E0_IV_SENSE_PATH_CFG, 8, 8);
1419
1420         /* Enable Bypass Source */
1421         regmap_write(max98396->regmap,
1422                      MAX98396_R2058_PCM_BYPASS_SRC,
1423                      max98396->bypass_slot);
1424         /* Voltage, current slot configuration */
1425         regmap_write(max98396->regmap,
1426                      MAX98396_R2044_PCM_TX_CTRL_1,
1427                      max98396->v_slot);
1428         regmap_write(max98396->regmap,
1429                      MAX98396_R2045_PCM_TX_CTRL_2,
1430                      max98396->i_slot);
1431         regmap_write(max98396->regmap,
1432                      MAX98396_R204A_PCM_TX_CTRL_7,
1433                      max98396->spkfb_slot);
1434
1435         if (max98396->v_slot < 8)
1436                 if (max98396->device_id == CODEC_TYPE_MAX98396)
1437                         regmap_update_bits(max98396->regmap,
1438                                            MAX98396_R2053_PCM_TX_HIZ_CTRL_8,
1439                                            1 << max98396->v_slot, 0);
1440                 else
1441                         regmap_update_bits(max98396->regmap,
1442                                            MAX98397_R2054_PCM_TX_HIZ_CTRL_8,
1443                                            1 << max98396->v_slot, 0);
1444         else
1445                 if (max98396->device_id == CODEC_TYPE_MAX98396)
1446                         regmap_update_bits(max98396->regmap,
1447                                            MAX98396_R2052_PCM_TX_HIZ_CTRL_7,
1448                                            1 << (max98396->v_slot - 8), 0);
1449                 else
1450                         regmap_update_bits(max98396->regmap,
1451                                            MAX98397_R2053_PCM_TX_HIZ_CTRL_7,
1452                                            1 << (max98396->v_slot - 8), 0);
1453
1454         if (max98396->i_slot < 8)
1455                 if (max98396->device_id == CODEC_TYPE_MAX98396)
1456                         regmap_update_bits(max98396->regmap,
1457                                            MAX98396_R2053_PCM_TX_HIZ_CTRL_8,
1458                                            1 << max98396->i_slot, 0);
1459                 else
1460                         regmap_update_bits(max98396->regmap,
1461                                            MAX98397_R2054_PCM_TX_HIZ_CTRL_8,
1462                                            1 << max98396->i_slot, 0);
1463         else
1464                 if (max98396->device_id == CODEC_TYPE_MAX98396)
1465                         regmap_update_bits(max98396->regmap,
1466                                            MAX98396_R2052_PCM_TX_HIZ_CTRL_7,
1467                                            1 << (max98396->i_slot - 8), 0);
1468                 else
1469                         regmap_update_bits(max98396->regmap,
1470                                            MAX98397_R2053_PCM_TX_HIZ_CTRL_7,
1471                                            1 << (max98396->i_slot - 8), 0);
1472
1473         /* Set interleave mode */
1474         if (max98396->interleave_mode)
1475                 regmap_update_bits(max98396->regmap,
1476                                    MAX98396_R2041_PCM_MODE_CFG,
1477                                    MAX98396_PCM_TX_CH_INTERLEAVE_MASK,
1478                                    MAX98396_PCM_TX_CH_INTERLEAVE_MASK);
1479
1480         regmap_update_bits(max98396->regmap,
1481                            MAX98396_R2038_CLK_MON_CTRL,
1482                            MAX98396_CLK_MON_AUTO_RESTART_MASK,
1483                            MAX98396_CLK_MON_AUTO_RESTART_MASK);
1484
1485         regmap_update_bits(max98396->regmap,
1486                            MAX98396_R203F_ENABLE_CTRLS,
1487                            MAX98396_CTRL_DMON_STUCK_EN_MASK,
1488                            max98396->dmon_stuck_enable ?
1489                                 MAX98396_CTRL_DMON_STUCK_EN_MASK : 0);
1490
1491         regmap_update_bits(max98396->regmap,
1492                            MAX98396_R203F_ENABLE_CTRLS,
1493                            MAX98396_CTRL_DMON_MAG_EN_MASK,
1494                            max98396->dmon_mag_enable ?
1495                                 MAX98396_CTRL_DMON_MAG_EN_MASK : 0);
1496
1497         switch (max98396->dmon_duration) {
1498         case 64:
1499                 regmap_update_bits(max98396->regmap,
1500                                    MAX98396_R2039_DATA_MON_CTRL,
1501                                    MAX98396_DMON_DURATION_MASK, 0);
1502                 break;
1503         case 256:
1504                 regmap_update_bits(max98396->regmap,
1505                                    MAX98396_R2039_DATA_MON_CTRL,
1506                                    MAX98396_DMON_DURATION_MASK, 1);
1507                 break;
1508         case 1024:
1509                 regmap_update_bits(max98396->regmap,
1510                                    MAX98396_R2039_DATA_MON_CTRL,
1511                                    MAX98396_DMON_DURATION_MASK, 2);
1512                 break;
1513         case 4096:
1514                 regmap_update_bits(max98396->regmap,
1515                                    MAX98396_R2039_DATA_MON_CTRL,
1516                                    MAX98396_DMON_DURATION_MASK, 3);
1517                 break;
1518         default:
1519                 dev_err(component->dev, "Invalid DMON duration %d\n",
1520                         max98396->dmon_duration);
1521         }
1522
1523         switch (max98396->dmon_stuck_threshold) {
1524         case 15:
1525                 regmap_update_bits(max98396->regmap,
1526                                    MAX98396_R2039_DATA_MON_CTRL,
1527                                    MAX98396_DMON_STUCK_THRESH_MASK,
1528                                    0 << MAX98396_DMON_STUCK_THRESH_SHIFT);
1529                 break;
1530         case 13:
1531                 regmap_update_bits(max98396->regmap,
1532                                    MAX98396_R2039_DATA_MON_CTRL,
1533                                    MAX98396_DMON_STUCK_THRESH_MASK,
1534                                    1 << MAX98396_DMON_STUCK_THRESH_SHIFT);
1535                 break;
1536         case 22:
1537                 regmap_update_bits(max98396->regmap,
1538                                    MAX98396_R2039_DATA_MON_CTRL,
1539                                    MAX98396_DMON_STUCK_THRESH_MASK,
1540                                    2 << MAX98396_DMON_STUCK_THRESH_SHIFT);
1541                 break;
1542         case 9:
1543                 regmap_update_bits(max98396->regmap,
1544                                    MAX98396_R2039_DATA_MON_CTRL,
1545                                    MAX98396_DMON_STUCK_THRESH_MASK,
1546                                    3 << MAX98396_DMON_STUCK_THRESH_SHIFT);
1547                 break;
1548         default:
1549                 dev_err(component->dev, "Invalid DMON stuck threshold %d\n",
1550                         max98396->dmon_stuck_threshold);
1551         }
1552
1553         switch (max98396->dmon_mag_threshold) {
1554         case 2 ... 5:
1555                 regmap_update_bits(max98396->regmap,
1556                                    MAX98396_R2039_DATA_MON_CTRL,
1557                                    MAX98396_DMON_STUCK_THRESH_MASK,
1558                                    (5 - max98396->dmon_mag_threshold)
1559                                         << MAX98396_DMON_MAG_THRESH_SHIFT);
1560                 break;
1561         default:
1562                 dev_err(component->dev, "Invalid DMON magnitude threshold %d\n",
1563                         max98396->dmon_mag_threshold);
1564         }
1565
1566         /* Speaker Amplifier PCM RX Enable by default */
1567         regmap_update_bits(max98396->regmap,
1568                            MAX98396_R205E_PCM_RX_EN,
1569                            MAX98396_PCM_RX_EN_MASK, 1);
1570
1571         return 0;
1572 }
1573
1574 #ifdef CONFIG_PM_SLEEP
1575 static int max98396_suspend(struct device *dev)
1576 {
1577         struct max98396_priv *max98396 = dev_get_drvdata(dev);
1578
1579         regcache_cache_only(max98396->regmap, true);
1580         regcache_mark_dirty(max98396->regmap);
1581         regulator_bulk_disable(MAX98396_NUM_CORE_SUPPLIES,
1582                                max98396->core_supplies);
1583         if (max98396->pvdd)
1584                 regulator_disable(max98396->pvdd);
1585
1586         if (max98396->vbat)
1587                 regulator_disable(max98396->vbat);
1588
1589         return 0;
1590 }
1591
1592 static int max98396_resume(struct device *dev)
1593 {
1594         struct max98396_priv *max98396 = dev_get_drvdata(dev);
1595         int ret;
1596
1597         ret = regulator_bulk_enable(MAX98396_NUM_CORE_SUPPLIES,
1598                                     max98396->core_supplies);
1599         if (ret < 0)
1600                 return ret;
1601
1602         if (max98396->pvdd) {
1603                 ret = regulator_enable(max98396->pvdd);
1604                 if (ret < 0)
1605                         return ret;
1606         }
1607
1608         if (max98396->vbat) {
1609                 ret = regulator_enable(max98396->vbat);
1610                 if (ret < 0)
1611                         return ret;
1612         }
1613
1614         regcache_cache_only(max98396->regmap, false);
1615         max98396_reset(max98396, dev);
1616         regcache_sync(max98396->regmap);
1617         return 0;
1618 }
1619 #endif
1620
1621 static const struct dev_pm_ops max98396_pm = {
1622         SET_SYSTEM_SLEEP_PM_OPS(max98396_suspend, max98396_resume)
1623 };
1624
1625 static const struct snd_soc_component_driver soc_codec_dev_max98396 = {
1626         .probe                  = max98396_probe,
1627         .controls               = max98396_snd_controls,
1628         .num_controls           = ARRAY_SIZE(max98396_snd_controls),
1629         .dapm_widgets           = max98396_dapm_widgets,
1630         .num_dapm_widgets       = ARRAY_SIZE(max98396_dapm_widgets),
1631         .dapm_routes            = max98396_audio_map,
1632         .num_dapm_routes        = ARRAY_SIZE(max98396_audio_map),
1633         .idle_bias_on           = 1,
1634         .use_pmdown_time        = 1,
1635         .endianness             = 1,
1636 };
1637
1638 static const struct snd_soc_component_driver soc_codec_dev_max98397 = {
1639         .probe                  = max98396_probe,
1640         .controls               = max98397_snd_controls,
1641         .num_controls           = ARRAY_SIZE(max98397_snd_controls),
1642         .dapm_widgets           = max98396_dapm_widgets,
1643         .num_dapm_widgets       = ARRAY_SIZE(max98396_dapm_widgets),
1644         .dapm_routes            = max98396_audio_map,
1645         .num_dapm_routes        = ARRAY_SIZE(max98396_audio_map),
1646         .idle_bias_on           = 1,
1647         .use_pmdown_time        = 1,
1648         .endianness             = 1,
1649 };
1650
1651 static const struct regmap_config max98396_regmap = {
1652         .reg_bits = 16,
1653         .val_bits = 8,
1654         .max_register = MAX98396_R21FF_REVISION_ID,
1655         .reg_defaults  = max98396_reg,
1656         .num_reg_defaults = ARRAY_SIZE(max98396_reg),
1657         .readable_reg = max98396_readable_register,
1658         .volatile_reg = max98396_volatile_reg,
1659         .cache_type = REGCACHE_RBTREE,
1660 };
1661
1662 static const struct regmap_config max98397_regmap = {
1663         .reg_bits = 16,
1664         .val_bits = 8,
1665         .max_register = MAX98397_R22FF_REVISION_ID,
1666         .reg_defaults  = max98397_reg,
1667         .num_reg_defaults = ARRAY_SIZE(max98397_reg),
1668         .readable_reg = max98397_readable_register,
1669         .volatile_reg = max98397_volatile_reg,
1670         .cache_type = REGCACHE_RBTREE,
1671 };
1672
1673 static void max98396_read_device_property(struct device *dev,
1674                                           struct max98396_priv *max98396)
1675 {
1676         int value;
1677
1678         if (!device_property_read_u32(dev, "adi,vmon-slot-no", &value))
1679                 max98396->v_slot = value & 0xF;
1680         else
1681                 max98396->v_slot = 0;
1682
1683         if (!device_property_read_u32(dev, "adi,imon-slot-no", &value))
1684                 max98396->i_slot = value & 0xF;
1685         else
1686                 max98396->i_slot = 1;
1687
1688         if (!device_property_read_u32(dev, "adi,spkfb-slot-no", &value))
1689                 max98396->spkfb_slot = value & 0xF;
1690         else
1691                 max98396->spkfb_slot = 2;
1692
1693         if (!device_property_read_u32(dev, "adi,bypass-slot-no", &value))
1694                 max98396->bypass_slot = value & 0xF;
1695         else
1696                 max98396->bypass_slot = 0;
1697
1698         max98396->dmon_stuck_enable =
1699                 device_property_read_bool(dev, "adi,dmon-stuck-enable");
1700
1701         if (!device_property_read_u32(dev, "adi,dmon-stuck-threshold-bits", &value))
1702                 max98396->dmon_stuck_threshold = value;
1703         else
1704                 max98396->dmon_stuck_threshold = 15;
1705
1706         max98396->dmon_mag_enable =
1707                 device_property_read_bool(dev, "adi,dmon-magnitude-enable");
1708
1709         if (!device_property_read_u32(dev, "adi,dmon-magnitude-threshold-bits", &value))
1710                 max98396->dmon_mag_threshold = value;
1711         else
1712                 max98396->dmon_mag_threshold = 5;
1713
1714         if (!device_property_read_u32(dev, "adi,dmon-duration-ms", &value))
1715                 max98396->dmon_duration = value;
1716         else
1717                 max98396->dmon_duration = 64;
1718 }
1719
1720 static void max98396_core_supplies_disable(void *priv)
1721 {
1722         struct max98396_priv *max98396 = priv;
1723
1724         regulator_bulk_disable(MAX98396_NUM_CORE_SUPPLIES,
1725                                max98396->core_supplies);
1726 }
1727
1728 static void max98396_supply_disable(void *r)
1729 {
1730         regulator_disable((struct regulator *) r);
1731 }
1732
1733 static int max98396_i2c_probe(struct i2c_client *i2c)
1734 {
1735         const struct i2c_device_id *id = i2c_client_get_device_id(i2c);
1736         struct max98396_priv *max98396 = NULL;
1737         int i, ret, reg;
1738
1739         max98396 = devm_kzalloc(&i2c->dev, sizeof(*max98396), GFP_KERNEL);
1740
1741         if (!max98396) {
1742                 ret = -ENOMEM;
1743                 return ret;
1744         }
1745         i2c_set_clientdata(i2c, max98396);
1746
1747         max98396->device_id =  id->driver_data;
1748
1749         /* regmap initialization */
1750         if (max98396->device_id == CODEC_TYPE_MAX98396)
1751                 max98396->regmap = devm_regmap_init_i2c(i2c, &max98396_regmap);
1752
1753         else
1754                 max98396->regmap = devm_regmap_init_i2c(i2c, &max98397_regmap);
1755
1756         if (IS_ERR(max98396->regmap)) {
1757                 ret = PTR_ERR(max98396->regmap);
1758                 dev_err(&i2c->dev,
1759                         "Failed to allocate regmap: %d\n", ret);
1760                 return ret;
1761         }
1762
1763         /* Obtain regulator supplies */
1764         for (i = 0; i < MAX98396_NUM_CORE_SUPPLIES; i++)
1765                 max98396->core_supplies[i].supply = max98396_core_supplies[i];
1766
1767         ret = devm_regulator_bulk_get(&i2c->dev, MAX98396_NUM_CORE_SUPPLIES,
1768                                       max98396->core_supplies);
1769         if (ret < 0) {
1770                 dev_err(&i2c->dev, "Failed to request core supplies: %d\n", ret);
1771                 return ret;
1772         }
1773
1774         max98396->vbat = devm_regulator_get_optional(&i2c->dev, "vbat");
1775         if (IS_ERR(max98396->vbat)) {
1776                 if (PTR_ERR(max98396->vbat) == -EPROBE_DEFER)
1777                         return -EPROBE_DEFER;
1778
1779                 max98396->vbat = NULL;
1780         }
1781
1782         max98396->pvdd = devm_regulator_get_optional(&i2c->dev, "pvdd");
1783         if (IS_ERR(max98396->pvdd)) {
1784                 if (PTR_ERR(max98396->pvdd) == -EPROBE_DEFER)
1785                         return -EPROBE_DEFER;
1786
1787                 max98396->pvdd = NULL;
1788         }
1789
1790         ret = regulator_bulk_enable(MAX98396_NUM_CORE_SUPPLIES,
1791                                     max98396->core_supplies);
1792         if (ret < 0) {
1793                 dev_err(&i2c->dev, "Unable to enable core supplies: %d", ret);
1794                 return ret;
1795         }
1796
1797         ret = devm_add_action_or_reset(&i2c->dev, max98396_core_supplies_disable,
1798                                        max98396);
1799         if (ret < 0)
1800                 return ret;
1801
1802         if (max98396->pvdd) {
1803                 ret = regulator_enable(max98396->pvdd);
1804                 if (ret < 0)
1805                         return ret;
1806
1807                 ret = devm_add_action_or_reset(&i2c->dev,
1808                                                max98396_supply_disable,
1809                                                max98396->pvdd);
1810                 if (ret < 0)
1811                         return ret;
1812         }
1813
1814         if (max98396->vbat) {
1815                 ret = regulator_enable(max98396->vbat);
1816                 if (ret < 0)
1817                         return ret;
1818
1819                 ret = devm_add_action_or_reset(&i2c->dev,
1820                                                max98396_supply_disable,
1821                                                max98396->vbat);
1822                 if (ret < 0)
1823                         return ret;
1824         }
1825
1826         /* update interleave mode info */
1827         if (device_property_read_bool(&i2c->dev, "adi,interleave_mode"))
1828                 max98396->interleave_mode = true;
1829         else
1830                 max98396->interleave_mode = false;
1831
1832         /* voltage/current slot & gpio configuration */
1833         max98396_read_device_property(&i2c->dev, max98396);
1834
1835         /* Reset the Device */
1836         max98396->reset_gpio = devm_gpiod_get_optional(&i2c->dev,
1837                                                        "reset", GPIOD_OUT_HIGH);
1838         if (IS_ERR(max98396->reset_gpio)) {
1839                 ret = PTR_ERR(max98396->reset_gpio);
1840                 dev_err(&i2c->dev, "Unable to request GPIO pin: %d.\n", ret);
1841                 return ret;
1842         }
1843
1844         if (max98396->reset_gpio) {
1845                 usleep_range(5000, 6000);
1846                 gpiod_set_value_cansleep(max98396->reset_gpio, 0);
1847                 /* Wait for the hw reset done */
1848                 usleep_range(5000, 6000);
1849         }
1850
1851         ret = regmap_read(max98396->regmap,
1852                           GET_REG_ADDR_REV_ID(max98396->device_id), &reg);
1853         if (ret < 0) {
1854                 dev_err(&i2c->dev, "%s: failed to read revision of the device.\n",  id->name);
1855                 return ret;
1856         }
1857         dev_info(&i2c->dev, "%s revision ID: 0x%02X\n", id->name, reg);
1858
1859         /* codec registration */
1860         if (max98396->device_id == CODEC_TYPE_MAX98396)
1861                 ret = devm_snd_soc_register_component(&i2c->dev,
1862                                                       &soc_codec_dev_max98396,
1863                                                       max98396_dai,
1864                                                       ARRAY_SIZE(max98396_dai));
1865         else
1866                 ret = devm_snd_soc_register_component(&i2c->dev,
1867                                                       &soc_codec_dev_max98397,
1868                                                       max98397_dai,
1869                                                       ARRAY_SIZE(max98397_dai));
1870         if (ret < 0)
1871                 dev_err(&i2c->dev, "Failed to register codec: %d\n", ret);
1872
1873         return ret;
1874 }
1875
1876 static const struct i2c_device_id max98396_i2c_id[] = {
1877         { "max98396", CODEC_TYPE_MAX98396},
1878         { "max98397", CODEC_TYPE_MAX98397},
1879         { },
1880 };
1881
1882 MODULE_DEVICE_TABLE(i2c, max98396_i2c_id);
1883
1884 #if defined(CONFIG_OF)
1885 static const struct of_device_id max98396_of_match[] = {
1886         { .compatible = "adi,max98396", },
1887         { .compatible = "adi,max98397", },
1888         { }
1889 };
1890 MODULE_DEVICE_TABLE(of, max98396_of_match);
1891 #endif
1892
1893 #ifdef CONFIG_ACPI
1894 static const struct acpi_device_id max98396_acpi_match[] = {
1895         { "ADS8396", 0 },
1896         { "ADS8397", 0 },
1897         {},
1898 };
1899 MODULE_DEVICE_TABLE(acpi, max98396_acpi_match);
1900 #endif
1901
1902 static struct i2c_driver max98396_i2c_driver = {
1903         .driver = {
1904                 .name = "max98396",
1905                 .of_match_table = of_match_ptr(max98396_of_match),
1906                 .acpi_match_table = ACPI_PTR(max98396_acpi_match),
1907                 .pm = &max98396_pm,
1908         },
1909         .probe = max98396_i2c_probe,
1910         .id_table = max98396_i2c_id,
1911 };
1912
1913 module_i2c_driver(max98396_i2c_driver)
1914
1915 MODULE_DESCRIPTION("ALSA SoC MAX98396 driver");
1916 MODULE_AUTHOR("Ryan Lee <ryans.lee@analog.com>");
1917 MODULE_LICENSE("GPL");