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