1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun //
3*4882a593Smuzhiyun // rt5682.c -- RT5682 ALSA SoC audio component driver
4*4882a593Smuzhiyun //
5*4882a593Smuzhiyun // Copyright 2018 Realtek Semiconductor Corp.
6*4882a593Smuzhiyun // Author: Bard Liao <bardliao@realtek.com>
7*4882a593Smuzhiyun //
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/module.h>
10*4882a593Smuzhiyun #include <linux/moduleparam.h>
11*4882a593Smuzhiyun #include <linux/init.h>
12*4882a593Smuzhiyun #include <linux/delay.h>
13*4882a593Smuzhiyun #include <linux/pm.h>
14*4882a593Smuzhiyun #include <linux/pm_runtime.h>
15*4882a593Smuzhiyun #include <linux/platform_device.h>
16*4882a593Smuzhiyun #include <linux/spi/spi.h>
17*4882a593Smuzhiyun #include <linux/acpi.h>
18*4882a593Smuzhiyun #include <linux/gpio.h>
19*4882a593Smuzhiyun #include <linux/of_gpio.h>
20*4882a593Smuzhiyun #include <linux/mutex.h>
21*4882a593Smuzhiyun #include <sound/core.h>
22*4882a593Smuzhiyun #include <sound/pcm.h>
23*4882a593Smuzhiyun #include <sound/pcm_params.h>
24*4882a593Smuzhiyun #include <sound/jack.h>
25*4882a593Smuzhiyun #include <sound/soc.h>
26*4882a593Smuzhiyun #include <sound/soc-dapm.h>
27*4882a593Smuzhiyun #include <sound/initval.h>
28*4882a593Smuzhiyun #include <sound/tlv.h>
29*4882a593Smuzhiyun #include <sound/rt5682.h>
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun #include "rl6231.h"
32*4882a593Smuzhiyun #include "rt5682.h"
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun const char *rt5682_supply_names[RT5682_NUM_SUPPLIES] = {
35*4882a593Smuzhiyun "AVDD",
36*4882a593Smuzhiyun "MICVDD",
37*4882a593Smuzhiyun "VBAT",
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_supply_names);
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun static const struct reg_sequence patch_list[] = {
42*4882a593Smuzhiyun {RT5682_HP_IMP_SENS_CTRL_19, 0x1000},
43*4882a593Smuzhiyun {RT5682_DAC_ADC_DIG_VOL1, 0xa020},
44*4882a593Smuzhiyun {RT5682_I2C_CTRL, 0x000f},
45*4882a593Smuzhiyun {RT5682_PLL2_INTERNAL, 0x8266},
46*4882a593Smuzhiyun {RT5682_SAR_IL_CMD_3, 0x8365},
47*4882a593Smuzhiyun {RT5682_SAR_IL_CMD_6, 0x0180},
48*4882a593Smuzhiyun };
49*4882a593Smuzhiyun
rt5682_apply_patch_list(struct rt5682_priv * rt5682,struct device * dev)50*4882a593Smuzhiyun void rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun int ret;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun ret = regmap_multi_reg_write(rt5682->regmap, patch_list,
55*4882a593Smuzhiyun ARRAY_SIZE(patch_list));
56*4882a593Smuzhiyun if (ret)
57*4882a593Smuzhiyun dev_warn(dev, "Failed to apply regmap patch: %d\n", ret);
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_apply_patch_list);
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun const struct reg_default rt5682_reg[RT5682_REG_NUM] = {
62*4882a593Smuzhiyun {0x0002, 0x8080},
63*4882a593Smuzhiyun {0x0003, 0x8000},
64*4882a593Smuzhiyun {0x0005, 0x0000},
65*4882a593Smuzhiyun {0x0006, 0x0000},
66*4882a593Smuzhiyun {0x0008, 0x800f},
67*4882a593Smuzhiyun {0x000b, 0x0000},
68*4882a593Smuzhiyun {0x0010, 0x4040},
69*4882a593Smuzhiyun {0x0011, 0x0000},
70*4882a593Smuzhiyun {0x0012, 0x1404},
71*4882a593Smuzhiyun {0x0013, 0x1000},
72*4882a593Smuzhiyun {0x0014, 0xa00a},
73*4882a593Smuzhiyun {0x0015, 0x0404},
74*4882a593Smuzhiyun {0x0016, 0x0404},
75*4882a593Smuzhiyun {0x0019, 0xafaf},
76*4882a593Smuzhiyun {0x001c, 0x2f2f},
77*4882a593Smuzhiyun {0x001f, 0x0000},
78*4882a593Smuzhiyun {0x0022, 0x5757},
79*4882a593Smuzhiyun {0x0023, 0x0039},
80*4882a593Smuzhiyun {0x0024, 0x000b},
81*4882a593Smuzhiyun {0x0026, 0xc0c4},
82*4882a593Smuzhiyun {0x0029, 0x8080},
83*4882a593Smuzhiyun {0x002a, 0xa0a0},
84*4882a593Smuzhiyun {0x002b, 0x0300},
85*4882a593Smuzhiyun {0x0030, 0x0000},
86*4882a593Smuzhiyun {0x003c, 0x0080},
87*4882a593Smuzhiyun {0x0044, 0x0c0c},
88*4882a593Smuzhiyun {0x0049, 0x0000},
89*4882a593Smuzhiyun {0x0061, 0x0000},
90*4882a593Smuzhiyun {0x0062, 0x0000},
91*4882a593Smuzhiyun {0x0063, 0x003f},
92*4882a593Smuzhiyun {0x0064, 0x0000},
93*4882a593Smuzhiyun {0x0065, 0x0000},
94*4882a593Smuzhiyun {0x0066, 0x0030},
95*4882a593Smuzhiyun {0x0067, 0x0000},
96*4882a593Smuzhiyun {0x006b, 0x0000},
97*4882a593Smuzhiyun {0x006c, 0x0000},
98*4882a593Smuzhiyun {0x006d, 0x2200},
99*4882a593Smuzhiyun {0x006e, 0x0a10},
100*4882a593Smuzhiyun {0x0070, 0x8000},
101*4882a593Smuzhiyun {0x0071, 0x8000},
102*4882a593Smuzhiyun {0x0073, 0x0000},
103*4882a593Smuzhiyun {0x0074, 0x0000},
104*4882a593Smuzhiyun {0x0075, 0x0002},
105*4882a593Smuzhiyun {0x0076, 0x0001},
106*4882a593Smuzhiyun {0x0079, 0x0000},
107*4882a593Smuzhiyun {0x007a, 0x0000},
108*4882a593Smuzhiyun {0x007b, 0x0000},
109*4882a593Smuzhiyun {0x007c, 0x0100},
110*4882a593Smuzhiyun {0x007e, 0x0000},
111*4882a593Smuzhiyun {0x0080, 0x0000},
112*4882a593Smuzhiyun {0x0081, 0x0000},
113*4882a593Smuzhiyun {0x0082, 0x0000},
114*4882a593Smuzhiyun {0x0083, 0x0000},
115*4882a593Smuzhiyun {0x0084, 0x0000},
116*4882a593Smuzhiyun {0x0085, 0x0000},
117*4882a593Smuzhiyun {0x0086, 0x0005},
118*4882a593Smuzhiyun {0x0087, 0x0000},
119*4882a593Smuzhiyun {0x0088, 0x0000},
120*4882a593Smuzhiyun {0x008c, 0x0003},
121*4882a593Smuzhiyun {0x008d, 0x0000},
122*4882a593Smuzhiyun {0x008e, 0x0060},
123*4882a593Smuzhiyun {0x008f, 0x1000},
124*4882a593Smuzhiyun {0x0091, 0x0c26},
125*4882a593Smuzhiyun {0x0092, 0x0073},
126*4882a593Smuzhiyun {0x0093, 0x0000},
127*4882a593Smuzhiyun {0x0094, 0x0080},
128*4882a593Smuzhiyun {0x0098, 0x0000},
129*4882a593Smuzhiyun {0x009a, 0x0000},
130*4882a593Smuzhiyun {0x009b, 0x0000},
131*4882a593Smuzhiyun {0x009c, 0x0000},
132*4882a593Smuzhiyun {0x009d, 0x0000},
133*4882a593Smuzhiyun {0x009e, 0x100c},
134*4882a593Smuzhiyun {0x009f, 0x0000},
135*4882a593Smuzhiyun {0x00a0, 0x0000},
136*4882a593Smuzhiyun {0x00a3, 0x0002},
137*4882a593Smuzhiyun {0x00a4, 0x0001},
138*4882a593Smuzhiyun {0x00ae, 0x2040},
139*4882a593Smuzhiyun {0x00af, 0x0000},
140*4882a593Smuzhiyun {0x00b6, 0x0000},
141*4882a593Smuzhiyun {0x00b7, 0x0000},
142*4882a593Smuzhiyun {0x00b8, 0x0000},
143*4882a593Smuzhiyun {0x00b9, 0x0002},
144*4882a593Smuzhiyun {0x00be, 0x0000},
145*4882a593Smuzhiyun {0x00c0, 0x0160},
146*4882a593Smuzhiyun {0x00c1, 0x82a0},
147*4882a593Smuzhiyun {0x00c2, 0x0000},
148*4882a593Smuzhiyun {0x00d0, 0x0000},
149*4882a593Smuzhiyun {0x00d1, 0x2244},
150*4882a593Smuzhiyun {0x00d2, 0x3300},
151*4882a593Smuzhiyun {0x00d3, 0x2200},
152*4882a593Smuzhiyun {0x00d4, 0x0000},
153*4882a593Smuzhiyun {0x00d9, 0x0009},
154*4882a593Smuzhiyun {0x00da, 0x0000},
155*4882a593Smuzhiyun {0x00db, 0x0000},
156*4882a593Smuzhiyun {0x00dc, 0x00c0},
157*4882a593Smuzhiyun {0x00dd, 0x2220},
158*4882a593Smuzhiyun {0x00de, 0x3131},
159*4882a593Smuzhiyun {0x00df, 0x3131},
160*4882a593Smuzhiyun {0x00e0, 0x3131},
161*4882a593Smuzhiyun {0x00e2, 0x0000},
162*4882a593Smuzhiyun {0x00e3, 0x4000},
163*4882a593Smuzhiyun {0x00e4, 0x0aa0},
164*4882a593Smuzhiyun {0x00e5, 0x3131},
165*4882a593Smuzhiyun {0x00e6, 0x3131},
166*4882a593Smuzhiyun {0x00e7, 0x3131},
167*4882a593Smuzhiyun {0x00e8, 0x3131},
168*4882a593Smuzhiyun {0x00ea, 0xb320},
169*4882a593Smuzhiyun {0x00eb, 0x0000},
170*4882a593Smuzhiyun {0x00f0, 0x0000},
171*4882a593Smuzhiyun {0x00f1, 0x00d0},
172*4882a593Smuzhiyun {0x00f2, 0x00d0},
173*4882a593Smuzhiyun {0x00f6, 0x0000},
174*4882a593Smuzhiyun {0x00fa, 0x0000},
175*4882a593Smuzhiyun {0x00fb, 0x0000},
176*4882a593Smuzhiyun {0x00fc, 0x0000},
177*4882a593Smuzhiyun {0x00fd, 0x0000},
178*4882a593Smuzhiyun {0x00fe, 0x10ec},
179*4882a593Smuzhiyun {0x00ff, 0x6530},
180*4882a593Smuzhiyun {0x0100, 0xa0a0},
181*4882a593Smuzhiyun {0x010b, 0x0000},
182*4882a593Smuzhiyun {0x010c, 0xae00},
183*4882a593Smuzhiyun {0x010d, 0xaaa0},
184*4882a593Smuzhiyun {0x010e, 0x8aa2},
185*4882a593Smuzhiyun {0x010f, 0x02a2},
186*4882a593Smuzhiyun {0x0110, 0xc000},
187*4882a593Smuzhiyun {0x0111, 0x04a2},
188*4882a593Smuzhiyun {0x0112, 0x2800},
189*4882a593Smuzhiyun {0x0113, 0x0000},
190*4882a593Smuzhiyun {0x0117, 0x0100},
191*4882a593Smuzhiyun {0x0125, 0x0410},
192*4882a593Smuzhiyun {0x0132, 0x6026},
193*4882a593Smuzhiyun {0x0136, 0x5555},
194*4882a593Smuzhiyun {0x0138, 0x3700},
195*4882a593Smuzhiyun {0x013a, 0x2000},
196*4882a593Smuzhiyun {0x013b, 0x2000},
197*4882a593Smuzhiyun {0x013c, 0x2005},
198*4882a593Smuzhiyun {0x013f, 0x0000},
199*4882a593Smuzhiyun {0x0142, 0x0000},
200*4882a593Smuzhiyun {0x0145, 0x0002},
201*4882a593Smuzhiyun {0x0146, 0x0000},
202*4882a593Smuzhiyun {0x0147, 0x0000},
203*4882a593Smuzhiyun {0x0148, 0x0000},
204*4882a593Smuzhiyun {0x0149, 0x0000},
205*4882a593Smuzhiyun {0x0150, 0x79a1},
206*4882a593Smuzhiyun {0x0156, 0xaaaa},
207*4882a593Smuzhiyun {0x0160, 0x4ec0},
208*4882a593Smuzhiyun {0x0161, 0x0080},
209*4882a593Smuzhiyun {0x0162, 0x0200},
210*4882a593Smuzhiyun {0x0163, 0x0800},
211*4882a593Smuzhiyun {0x0164, 0x0000},
212*4882a593Smuzhiyun {0x0165, 0x0000},
213*4882a593Smuzhiyun {0x0166, 0x0000},
214*4882a593Smuzhiyun {0x0167, 0x000f},
215*4882a593Smuzhiyun {0x0168, 0x000f},
216*4882a593Smuzhiyun {0x0169, 0x0021},
217*4882a593Smuzhiyun {0x0190, 0x413d},
218*4882a593Smuzhiyun {0x0194, 0x0000},
219*4882a593Smuzhiyun {0x0195, 0x0000},
220*4882a593Smuzhiyun {0x0197, 0x0022},
221*4882a593Smuzhiyun {0x0198, 0x0000},
222*4882a593Smuzhiyun {0x0199, 0x0000},
223*4882a593Smuzhiyun {0x01af, 0x0000},
224*4882a593Smuzhiyun {0x01b0, 0x0400},
225*4882a593Smuzhiyun {0x01b1, 0x0000},
226*4882a593Smuzhiyun {0x01b2, 0x0000},
227*4882a593Smuzhiyun {0x01b3, 0x0000},
228*4882a593Smuzhiyun {0x01b4, 0x0000},
229*4882a593Smuzhiyun {0x01b5, 0x0000},
230*4882a593Smuzhiyun {0x01b6, 0x01c3},
231*4882a593Smuzhiyun {0x01b7, 0x02a0},
232*4882a593Smuzhiyun {0x01b8, 0x03e9},
233*4882a593Smuzhiyun {0x01b9, 0x1389},
234*4882a593Smuzhiyun {0x01ba, 0xc351},
235*4882a593Smuzhiyun {0x01bb, 0x0009},
236*4882a593Smuzhiyun {0x01bc, 0x0018},
237*4882a593Smuzhiyun {0x01bd, 0x002a},
238*4882a593Smuzhiyun {0x01be, 0x004c},
239*4882a593Smuzhiyun {0x01bf, 0x0097},
240*4882a593Smuzhiyun {0x01c0, 0x433d},
241*4882a593Smuzhiyun {0x01c2, 0x0000},
242*4882a593Smuzhiyun {0x01c3, 0x0000},
243*4882a593Smuzhiyun {0x01c4, 0x0000},
244*4882a593Smuzhiyun {0x01c5, 0x0000},
245*4882a593Smuzhiyun {0x01c6, 0x0000},
246*4882a593Smuzhiyun {0x01c7, 0x0000},
247*4882a593Smuzhiyun {0x01c8, 0x40af},
248*4882a593Smuzhiyun {0x01c9, 0x0702},
249*4882a593Smuzhiyun {0x01ca, 0x0000},
250*4882a593Smuzhiyun {0x01cb, 0x0000},
251*4882a593Smuzhiyun {0x01cc, 0x5757},
252*4882a593Smuzhiyun {0x01cd, 0x5757},
253*4882a593Smuzhiyun {0x01ce, 0x5757},
254*4882a593Smuzhiyun {0x01cf, 0x5757},
255*4882a593Smuzhiyun {0x01d0, 0x5757},
256*4882a593Smuzhiyun {0x01d1, 0x5757},
257*4882a593Smuzhiyun {0x01d2, 0x5757},
258*4882a593Smuzhiyun {0x01d3, 0x5757},
259*4882a593Smuzhiyun {0x01d4, 0x5757},
260*4882a593Smuzhiyun {0x01d5, 0x5757},
261*4882a593Smuzhiyun {0x01d6, 0x0000},
262*4882a593Smuzhiyun {0x01d7, 0x0008},
263*4882a593Smuzhiyun {0x01d8, 0x0029},
264*4882a593Smuzhiyun {0x01d9, 0x3333},
265*4882a593Smuzhiyun {0x01da, 0x0000},
266*4882a593Smuzhiyun {0x01db, 0x0004},
267*4882a593Smuzhiyun {0x01dc, 0x0000},
268*4882a593Smuzhiyun {0x01de, 0x7c00},
269*4882a593Smuzhiyun {0x01df, 0x0320},
270*4882a593Smuzhiyun {0x01e0, 0x06a1},
271*4882a593Smuzhiyun {0x01e1, 0x0000},
272*4882a593Smuzhiyun {0x01e2, 0x0000},
273*4882a593Smuzhiyun {0x01e3, 0x0000},
274*4882a593Smuzhiyun {0x01e4, 0x0000},
275*4882a593Smuzhiyun {0x01e6, 0x0001},
276*4882a593Smuzhiyun {0x01e7, 0x0000},
277*4882a593Smuzhiyun {0x01e8, 0x0000},
278*4882a593Smuzhiyun {0x01ea, 0x0000},
279*4882a593Smuzhiyun {0x01eb, 0x0000},
280*4882a593Smuzhiyun {0x01ec, 0x0000},
281*4882a593Smuzhiyun {0x01ed, 0x0000},
282*4882a593Smuzhiyun {0x01ee, 0x0000},
283*4882a593Smuzhiyun {0x01ef, 0x0000},
284*4882a593Smuzhiyun {0x01f0, 0x0000},
285*4882a593Smuzhiyun {0x01f1, 0x0000},
286*4882a593Smuzhiyun {0x01f2, 0x0000},
287*4882a593Smuzhiyun {0x01f3, 0x0000},
288*4882a593Smuzhiyun {0x01f4, 0x0000},
289*4882a593Smuzhiyun {0x0210, 0x6297},
290*4882a593Smuzhiyun {0x0211, 0xa005},
291*4882a593Smuzhiyun {0x0212, 0x824c},
292*4882a593Smuzhiyun {0x0213, 0xf7ff},
293*4882a593Smuzhiyun {0x0214, 0xf24c},
294*4882a593Smuzhiyun {0x0215, 0x0102},
295*4882a593Smuzhiyun {0x0216, 0x00a3},
296*4882a593Smuzhiyun {0x0217, 0x0048},
297*4882a593Smuzhiyun {0x0218, 0xa2c0},
298*4882a593Smuzhiyun {0x0219, 0x0400},
299*4882a593Smuzhiyun {0x021a, 0x00c8},
300*4882a593Smuzhiyun {0x021b, 0x00c0},
301*4882a593Smuzhiyun {0x021c, 0x0000},
302*4882a593Smuzhiyun {0x0250, 0x4500},
303*4882a593Smuzhiyun {0x0251, 0x40b3},
304*4882a593Smuzhiyun {0x0252, 0x0000},
305*4882a593Smuzhiyun {0x0253, 0x0000},
306*4882a593Smuzhiyun {0x0254, 0x0000},
307*4882a593Smuzhiyun {0x0255, 0x0000},
308*4882a593Smuzhiyun {0x0256, 0x0000},
309*4882a593Smuzhiyun {0x0257, 0x0000},
310*4882a593Smuzhiyun {0x0258, 0x0000},
311*4882a593Smuzhiyun {0x0259, 0x0000},
312*4882a593Smuzhiyun {0x025a, 0x0005},
313*4882a593Smuzhiyun {0x0270, 0x0000},
314*4882a593Smuzhiyun {0x02ff, 0x0110},
315*4882a593Smuzhiyun {0x0300, 0x001f},
316*4882a593Smuzhiyun {0x0301, 0x032c},
317*4882a593Smuzhiyun {0x0302, 0x5f21},
318*4882a593Smuzhiyun {0x0303, 0x4000},
319*4882a593Smuzhiyun {0x0304, 0x4000},
320*4882a593Smuzhiyun {0x0305, 0x06d5},
321*4882a593Smuzhiyun {0x0306, 0x8000},
322*4882a593Smuzhiyun {0x0307, 0x0700},
323*4882a593Smuzhiyun {0x0310, 0x4560},
324*4882a593Smuzhiyun {0x0311, 0xa4a8},
325*4882a593Smuzhiyun {0x0312, 0x7418},
326*4882a593Smuzhiyun {0x0313, 0x0000},
327*4882a593Smuzhiyun {0x0314, 0x0006},
328*4882a593Smuzhiyun {0x0315, 0xffff},
329*4882a593Smuzhiyun {0x0316, 0xc400},
330*4882a593Smuzhiyun {0x0317, 0x0000},
331*4882a593Smuzhiyun {0x03c0, 0x7e00},
332*4882a593Smuzhiyun {0x03c1, 0x8000},
333*4882a593Smuzhiyun {0x03c2, 0x8000},
334*4882a593Smuzhiyun {0x03c3, 0x8000},
335*4882a593Smuzhiyun {0x03c4, 0x8000},
336*4882a593Smuzhiyun {0x03c5, 0x8000},
337*4882a593Smuzhiyun {0x03c6, 0x8000},
338*4882a593Smuzhiyun {0x03c7, 0x8000},
339*4882a593Smuzhiyun {0x03c8, 0x8000},
340*4882a593Smuzhiyun {0x03c9, 0x8000},
341*4882a593Smuzhiyun {0x03ca, 0x8000},
342*4882a593Smuzhiyun {0x03cb, 0x8000},
343*4882a593Smuzhiyun {0x03cc, 0x8000},
344*4882a593Smuzhiyun {0x03d0, 0x0000},
345*4882a593Smuzhiyun {0x03d1, 0x0000},
346*4882a593Smuzhiyun {0x03d2, 0x0000},
347*4882a593Smuzhiyun {0x03d3, 0x0000},
348*4882a593Smuzhiyun {0x03d4, 0x2000},
349*4882a593Smuzhiyun {0x03d5, 0x2000},
350*4882a593Smuzhiyun {0x03d6, 0x0000},
351*4882a593Smuzhiyun {0x03d7, 0x0000},
352*4882a593Smuzhiyun {0x03d8, 0x2000},
353*4882a593Smuzhiyun {0x03d9, 0x2000},
354*4882a593Smuzhiyun {0x03da, 0x2000},
355*4882a593Smuzhiyun {0x03db, 0x2000},
356*4882a593Smuzhiyun {0x03dc, 0x0000},
357*4882a593Smuzhiyun {0x03dd, 0x0000},
358*4882a593Smuzhiyun {0x03de, 0x0000},
359*4882a593Smuzhiyun {0x03df, 0x2000},
360*4882a593Smuzhiyun {0x03e0, 0x0000},
361*4882a593Smuzhiyun {0x03e1, 0x0000},
362*4882a593Smuzhiyun {0x03e2, 0x0000},
363*4882a593Smuzhiyun {0x03e3, 0x0000},
364*4882a593Smuzhiyun {0x03e4, 0x0000},
365*4882a593Smuzhiyun {0x03e5, 0x0000},
366*4882a593Smuzhiyun {0x03e6, 0x0000},
367*4882a593Smuzhiyun {0x03e7, 0x0000},
368*4882a593Smuzhiyun {0x03e8, 0x0000},
369*4882a593Smuzhiyun {0x03e9, 0x0000},
370*4882a593Smuzhiyun {0x03ea, 0x0000},
371*4882a593Smuzhiyun {0x03eb, 0x0000},
372*4882a593Smuzhiyun {0x03ec, 0x0000},
373*4882a593Smuzhiyun {0x03ed, 0x0000},
374*4882a593Smuzhiyun {0x03ee, 0x0000},
375*4882a593Smuzhiyun {0x03ef, 0x0000},
376*4882a593Smuzhiyun {0x03f0, 0x0800},
377*4882a593Smuzhiyun {0x03f1, 0x0800},
378*4882a593Smuzhiyun {0x03f2, 0x0800},
379*4882a593Smuzhiyun {0x03f3, 0x0800},
380*4882a593Smuzhiyun };
381*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_reg);
382*4882a593Smuzhiyun
rt5682_volatile_register(struct device * dev,unsigned int reg)383*4882a593Smuzhiyun bool rt5682_volatile_register(struct device *dev, unsigned int reg)
384*4882a593Smuzhiyun {
385*4882a593Smuzhiyun switch (reg) {
386*4882a593Smuzhiyun case RT5682_RESET:
387*4882a593Smuzhiyun case RT5682_CBJ_CTRL_2:
388*4882a593Smuzhiyun case RT5682_INT_ST_1:
389*4882a593Smuzhiyun case RT5682_4BTN_IL_CMD_1:
390*4882a593Smuzhiyun case RT5682_AJD1_CTRL:
391*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_1:
392*4882a593Smuzhiyun case RT5682_DEVICE_ID:
393*4882a593Smuzhiyun case RT5682_I2C_MODE:
394*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_10:
395*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_2:
396*4882a593Smuzhiyun case RT5682_JD_TOP_VC_VTRL:
397*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_19:
398*4882a593Smuzhiyun case RT5682_IL_CMD_1:
399*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_2:
400*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_4:
401*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_10:
402*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_11:
403*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_6...RT5682_EFUSE_CTRL_11:
404*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_1...RT5682_HP_CALIB_STA_11:
405*4882a593Smuzhiyun return true;
406*4882a593Smuzhiyun default:
407*4882a593Smuzhiyun return false;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_volatile_register);
411*4882a593Smuzhiyun
rt5682_readable_register(struct device * dev,unsigned int reg)412*4882a593Smuzhiyun bool rt5682_readable_register(struct device *dev, unsigned int reg)
413*4882a593Smuzhiyun {
414*4882a593Smuzhiyun switch (reg) {
415*4882a593Smuzhiyun case RT5682_RESET:
416*4882a593Smuzhiyun case RT5682_VERSION_ID:
417*4882a593Smuzhiyun case RT5682_VENDOR_ID:
418*4882a593Smuzhiyun case RT5682_DEVICE_ID:
419*4882a593Smuzhiyun case RT5682_HP_CTRL_1:
420*4882a593Smuzhiyun case RT5682_HP_CTRL_2:
421*4882a593Smuzhiyun case RT5682_HPL_GAIN:
422*4882a593Smuzhiyun case RT5682_HPR_GAIN:
423*4882a593Smuzhiyun case RT5682_I2C_CTRL:
424*4882a593Smuzhiyun case RT5682_CBJ_BST_CTRL:
425*4882a593Smuzhiyun case RT5682_CBJ_CTRL_1:
426*4882a593Smuzhiyun case RT5682_CBJ_CTRL_2:
427*4882a593Smuzhiyun case RT5682_CBJ_CTRL_3:
428*4882a593Smuzhiyun case RT5682_CBJ_CTRL_4:
429*4882a593Smuzhiyun case RT5682_CBJ_CTRL_5:
430*4882a593Smuzhiyun case RT5682_CBJ_CTRL_6:
431*4882a593Smuzhiyun case RT5682_CBJ_CTRL_7:
432*4882a593Smuzhiyun case RT5682_DAC1_DIG_VOL:
433*4882a593Smuzhiyun case RT5682_STO1_ADC_DIG_VOL:
434*4882a593Smuzhiyun case RT5682_STO1_ADC_BOOST:
435*4882a593Smuzhiyun case RT5682_HP_IMP_GAIN_1:
436*4882a593Smuzhiyun case RT5682_HP_IMP_GAIN_2:
437*4882a593Smuzhiyun case RT5682_SIDETONE_CTRL:
438*4882a593Smuzhiyun case RT5682_STO1_ADC_MIXER:
439*4882a593Smuzhiyun case RT5682_AD_DA_MIXER:
440*4882a593Smuzhiyun case RT5682_STO1_DAC_MIXER:
441*4882a593Smuzhiyun case RT5682_A_DAC1_MUX:
442*4882a593Smuzhiyun case RT5682_DIG_INF2_DATA:
443*4882a593Smuzhiyun case RT5682_REC_MIXER:
444*4882a593Smuzhiyun case RT5682_CAL_REC:
445*4882a593Smuzhiyun case RT5682_ALC_BACK_GAIN:
446*4882a593Smuzhiyun case RT5682_PWR_DIG_1:
447*4882a593Smuzhiyun case RT5682_PWR_DIG_2:
448*4882a593Smuzhiyun case RT5682_PWR_ANLG_1:
449*4882a593Smuzhiyun case RT5682_PWR_ANLG_2:
450*4882a593Smuzhiyun case RT5682_PWR_ANLG_3:
451*4882a593Smuzhiyun case RT5682_PWR_MIXER:
452*4882a593Smuzhiyun case RT5682_PWR_VOL:
453*4882a593Smuzhiyun case RT5682_CLK_DET:
454*4882a593Smuzhiyun case RT5682_RESET_LPF_CTRL:
455*4882a593Smuzhiyun case RT5682_RESET_HPF_CTRL:
456*4882a593Smuzhiyun case RT5682_DMIC_CTRL_1:
457*4882a593Smuzhiyun case RT5682_I2S1_SDP:
458*4882a593Smuzhiyun case RT5682_I2S2_SDP:
459*4882a593Smuzhiyun case RT5682_ADDA_CLK_1:
460*4882a593Smuzhiyun case RT5682_ADDA_CLK_2:
461*4882a593Smuzhiyun case RT5682_I2S1_F_DIV_CTRL_1:
462*4882a593Smuzhiyun case RT5682_I2S1_F_DIV_CTRL_2:
463*4882a593Smuzhiyun case RT5682_TDM_CTRL:
464*4882a593Smuzhiyun case RT5682_TDM_ADDA_CTRL_1:
465*4882a593Smuzhiyun case RT5682_TDM_ADDA_CTRL_2:
466*4882a593Smuzhiyun case RT5682_DATA_SEL_CTRL_1:
467*4882a593Smuzhiyun case RT5682_TDM_TCON_CTRL:
468*4882a593Smuzhiyun case RT5682_GLB_CLK:
469*4882a593Smuzhiyun case RT5682_PLL_CTRL_1:
470*4882a593Smuzhiyun case RT5682_PLL_CTRL_2:
471*4882a593Smuzhiyun case RT5682_PLL_TRACK_1:
472*4882a593Smuzhiyun case RT5682_PLL_TRACK_2:
473*4882a593Smuzhiyun case RT5682_PLL_TRACK_3:
474*4882a593Smuzhiyun case RT5682_PLL_TRACK_4:
475*4882a593Smuzhiyun case RT5682_PLL_TRACK_5:
476*4882a593Smuzhiyun case RT5682_PLL_TRACK_6:
477*4882a593Smuzhiyun case RT5682_PLL_TRACK_11:
478*4882a593Smuzhiyun case RT5682_SDW_REF_CLK:
479*4882a593Smuzhiyun case RT5682_DEPOP_1:
480*4882a593Smuzhiyun case RT5682_DEPOP_2:
481*4882a593Smuzhiyun case RT5682_HP_CHARGE_PUMP_1:
482*4882a593Smuzhiyun case RT5682_HP_CHARGE_PUMP_2:
483*4882a593Smuzhiyun case RT5682_MICBIAS_1:
484*4882a593Smuzhiyun case RT5682_MICBIAS_2:
485*4882a593Smuzhiyun case RT5682_PLL_TRACK_12:
486*4882a593Smuzhiyun case RT5682_PLL_TRACK_14:
487*4882a593Smuzhiyun case RT5682_PLL2_CTRL_1:
488*4882a593Smuzhiyun case RT5682_PLL2_CTRL_2:
489*4882a593Smuzhiyun case RT5682_PLL2_CTRL_3:
490*4882a593Smuzhiyun case RT5682_PLL2_CTRL_4:
491*4882a593Smuzhiyun case RT5682_RC_CLK_CTRL:
492*4882a593Smuzhiyun case RT5682_I2S_M_CLK_CTRL_1:
493*4882a593Smuzhiyun case RT5682_I2S2_F_DIV_CTRL_1:
494*4882a593Smuzhiyun case RT5682_I2S2_F_DIV_CTRL_2:
495*4882a593Smuzhiyun case RT5682_EQ_CTRL_1:
496*4882a593Smuzhiyun case RT5682_EQ_CTRL_2:
497*4882a593Smuzhiyun case RT5682_IRQ_CTRL_1:
498*4882a593Smuzhiyun case RT5682_IRQ_CTRL_2:
499*4882a593Smuzhiyun case RT5682_IRQ_CTRL_3:
500*4882a593Smuzhiyun case RT5682_IRQ_CTRL_4:
501*4882a593Smuzhiyun case RT5682_INT_ST_1:
502*4882a593Smuzhiyun case RT5682_GPIO_CTRL_1:
503*4882a593Smuzhiyun case RT5682_GPIO_CTRL_2:
504*4882a593Smuzhiyun case RT5682_GPIO_CTRL_3:
505*4882a593Smuzhiyun case RT5682_HP_AMP_DET_CTRL_1:
506*4882a593Smuzhiyun case RT5682_HP_AMP_DET_CTRL_2:
507*4882a593Smuzhiyun case RT5682_MID_HP_AMP_DET:
508*4882a593Smuzhiyun case RT5682_LOW_HP_AMP_DET:
509*4882a593Smuzhiyun case RT5682_DELAY_BUF_CTRL:
510*4882a593Smuzhiyun case RT5682_SV_ZCD_1:
511*4882a593Smuzhiyun case RT5682_SV_ZCD_2:
512*4882a593Smuzhiyun case RT5682_IL_CMD_1:
513*4882a593Smuzhiyun case RT5682_IL_CMD_2:
514*4882a593Smuzhiyun case RT5682_IL_CMD_3:
515*4882a593Smuzhiyun case RT5682_IL_CMD_4:
516*4882a593Smuzhiyun case RT5682_IL_CMD_5:
517*4882a593Smuzhiyun case RT5682_IL_CMD_6:
518*4882a593Smuzhiyun case RT5682_4BTN_IL_CMD_1:
519*4882a593Smuzhiyun case RT5682_4BTN_IL_CMD_2:
520*4882a593Smuzhiyun case RT5682_4BTN_IL_CMD_3:
521*4882a593Smuzhiyun case RT5682_4BTN_IL_CMD_4:
522*4882a593Smuzhiyun case RT5682_4BTN_IL_CMD_5:
523*4882a593Smuzhiyun case RT5682_4BTN_IL_CMD_6:
524*4882a593Smuzhiyun case RT5682_4BTN_IL_CMD_7:
525*4882a593Smuzhiyun case RT5682_ADC_STO1_HP_CTRL_1:
526*4882a593Smuzhiyun case RT5682_ADC_STO1_HP_CTRL_2:
527*4882a593Smuzhiyun case RT5682_AJD1_CTRL:
528*4882a593Smuzhiyun case RT5682_JD1_THD:
529*4882a593Smuzhiyun case RT5682_JD2_THD:
530*4882a593Smuzhiyun case RT5682_JD_CTRL_1:
531*4882a593Smuzhiyun case RT5682_DUMMY_1:
532*4882a593Smuzhiyun case RT5682_DUMMY_2:
533*4882a593Smuzhiyun case RT5682_DUMMY_3:
534*4882a593Smuzhiyun case RT5682_DAC_ADC_DIG_VOL1:
535*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_2:
536*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_3:
537*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_4:
538*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_5:
539*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_6:
540*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_7:
541*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_8:
542*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_9:
543*4882a593Smuzhiyun case RT5682_BIAS_CUR_CTRL_10:
544*4882a593Smuzhiyun case RT5682_VREF_REC_OP_FB_CAP_CTRL:
545*4882a593Smuzhiyun case RT5682_CHARGE_PUMP_1:
546*4882a593Smuzhiyun case RT5682_DIG_IN_CTRL_1:
547*4882a593Smuzhiyun case RT5682_PAD_DRIVING_CTRL:
548*4882a593Smuzhiyun case RT5682_SOFT_RAMP_DEPOP:
549*4882a593Smuzhiyun case RT5682_CHOP_DAC:
550*4882a593Smuzhiyun case RT5682_CHOP_ADC:
551*4882a593Smuzhiyun case RT5682_CALIB_ADC_CTRL:
552*4882a593Smuzhiyun case RT5682_VOL_TEST:
553*4882a593Smuzhiyun case RT5682_SPKVDD_DET_STA:
554*4882a593Smuzhiyun case RT5682_TEST_MODE_CTRL_1:
555*4882a593Smuzhiyun case RT5682_TEST_MODE_CTRL_2:
556*4882a593Smuzhiyun case RT5682_TEST_MODE_CTRL_3:
557*4882a593Smuzhiyun case RT5682_TEST_MODE_CTRL_4:
558*4882a593Smuzhiyun case RT5682_TEST_MODE_CTRL_5:
559*4882a593Smuzhiyun case RT5682_PLL1_INTERNAL:
560*4882a593Smuzhiyun case RT5682_PLL2_INTERNAL:
561*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_1:
562*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_2:
563*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_3:
564*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_4:
565*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_5:
566*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_6:
567*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_7:
568*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_8:
569*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_9:
570*4882a593Smuzhiyun case RT5682_STO_NG2_CTRL_10:
571*4882a593Smuzhiyun case RT5682_STO1_DAC_SIL_DET:
572*4882a593Smuzhiyun case RT5682_SIL_PSV_CTRL1:
573*4882a593Smuzhiyun case RT5682_SIL_PSV_CTRL2:
574*4882a593Smuzhiyun case RT5682_SIL_PSV_CTRL3:
575*4882a593Smuzhiyun case RT5682_SIL_PSV_CTRL4:
576*4882a593Smuzhiyun case RT5682_SIL_PSV_CTRL5:
577*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_01:
578*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_02:
579*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_03:
580*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_04:
581*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_05:
582*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_06:
583*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_07:
584*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_08:
585*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_09:
586*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_10:
587*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_11:
588*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_12:
589*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_13:
590*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_14:
591*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_15:
592*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_16:
593*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_17:
594*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_18:
595*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_19:
596*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_20:
597*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_21:
598*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_22:
599*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_23:
600*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_24:
601*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_25:
602*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_26:
603*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_27:
604*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_28:
605*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_29:
606*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_30:
607*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_31:
608*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_32:
609*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_33:
610*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_34:
611*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_35:
612*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_36:
613*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_37:
614*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_38:
615*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_39:
616*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_40:
617*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_41:
618*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_42:
619*4882a593Smuzhiyun case RT5682_HP_IMP_SENS_CTRL_43:
620*4882a593Smuzhiyun case RT5682_HP_LOGIC_CTRL_1:
621*4882a593Smuzhiyun case RT5682_HP_LOGIC_CTRL_2:
622*4882a593Smuzhiyun case RT5682_HP_LOGIC_CTRL_3:
623*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_1:
624*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_2:
625*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_3:
626*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_4:
627*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_5:
628*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_6:
629*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_7:
630*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_9:
631*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_10:
632*4882a593Smuzhiyun case RT5682_HP_CALIB_CTRL_11:
633*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_1:
634*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_2:
635*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_3:
636*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_4:
637*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_5:
638*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_6:
639*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_7:
640*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_8:
641*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_9:
642*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_10:
643*4882a593Smuzhiyun case RT5682_HP_CALIB_STA_11:
644*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_1:
645*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_2:
646*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_3:
647*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_4:
648*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_5:
649*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_6:
650*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_7:
651*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_8:
652*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_9:
653*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_10:
654*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_11:
655*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_12:
656*4882a593Smuzhiyun case RT5682_SAR_IL_CMD_13:
657*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_1:
658*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_2:
659*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_3:
660*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_4:
661*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_5:
662*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_6:
663*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_7:
664*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_8:
665*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_9:
666*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_10:
667*4882a593Smuzhiyun case RT5682_EFUSE_CTRL_11:
668*4882a593Smuzhiyun case RT5682_JD_TOP_VC_VTRL:
669*4882a593Smuzhiyun case RT5682_DRC1_CTRL_0:
670*4882a593Smuzhiyun case RT5682_DRC1_CTRL_1:
671*4882a593Smuzhiyun case RT5682_DRC1_CTRL_2:
672*4882a593Smuzhiyun case RT5682_DRC1_CTRL_3:
673*4882a593Smuzhiyun case RT5682_DRC1_CTRL_4:
674*4882a593Smuzhiyun case RT5682_DRC1_CTRL_5:
675*4882a593Smuzhiyun case RT5682_DRC1_CTRL_6:
676*4882a593Smuzhiyun case RT5682_DRC1_HARD_LMT_CTRL_1:
677*4882a593Smuzhiyun case RT5682_DRC1_HARD_LMT_CTRL_2:
678*4882a593Smuzhiyun case RT5682_DRC1_PRIV_1:
679*4882a593Smuzhiyun case RT5682_DRC1_PRIV_2:
680*4882a593Smuzhiyun case RT5682_DRC1_PRIV_3:
681*4882a593Smuzhiyun case RT5682_DRC1_PRIV_4:
682*4882a593Smuzhiyun case RT5682_DRC1_PRIV_5:
683*4882a593Smuzhiyun case RT5682_DRC1_PRIV_6:
684*4882a593Smuzhiyun case RT5682_DRC1_PRIV_7:
685*4882a593Smuzhiyun case RT5682_DRC1_PRIV_8:
686*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL1:
687*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL2:
688*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL3:
689*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL4:
690*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL5:
691*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL6:
692*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL7:
693*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL8:
694*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL9:
695*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL10:
696*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL11:
697*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL12:
698*4882a593Smuzhiyun case RT5682_EQ_AUTO_RCV_CTRL13:
699*4882a593Smuzhiyun case RT5682_ADC_L_EQ_LPF1_A1:
700*4882a593Smuzhiyun case RT5682_R_EQ_LPF1_A1:
701*4882a593Smuzhiyun case RT5682_L_EQ_LPF1_H0:
702*4882a593Smuzhiyun case RT5682_R_EQ_LPF1_H0:
703*4882a593Smuzhiyun case RT5682_L_EQ_BPF1_A1:
704*4882a593Smuzhiyun case RT5682_R_EQ_BPF1_A1:
705*4882a593Smuzhiyun case RT5682_L_EQ_BPF1_A2:
706*4882a593Smuzhiyun case RT5682_R_EQ_BPF1_A2:
707*4882a593Smuzhiyun case RT5682_L_EQ_BPF1_H0:
708*4882a593Smuzhiyun case RT5682_R_EQ_BPF1_H0:
709*4882a593Smuzhiyun case RT5682_L_EQ_BPF2_A1:
710*4882a593Smuzhiyun case RT5682_R_EQ_BPF2_A1:
711*4882a593Smuzhiyun case RT5682_L_EQ_BPF2_A2:
712*4882a593Smuzhiyun case RT5682_R_EQ_BPF2_A2:
713*4882a593Smuzhiyun case RT5682_L_EQ_BPF2_H0:
714*4882a593Smuzhiyun case RT5682_R_EQ_BPF2_H0:
715*4882a593Smuzhiyun case RT5682_L_EQ_BPF3_A1:
716*4882a593Smuzhiyun case RT5682_R_EQ_BPF3_A1:
717*4882a593Smuzhiyun case RT5682_L_EQ_BPF3_A2:
718*4882a593Smuzhiyun case RT5682_R_EQ_BPF3_A2:
719*4882a593Smuzhiyun case RT5682_L_EQ_BPF3_H0:
720*4882a593Smuzhiyun case RT5682_R_EQ_BPF3_H0:
721*4882a593Smuzhiyun case RT5682_L_EQ_BPF4_A1:
722*4882a593Smuzhiyun case RT5682_R_EQ_BPF4_A1:
723*4882a593Smuzhiyun case RT5682_L_EQ_BPF4_A2:
724*4882a593Smuzhiyun case RT5682_R_EQ_BPF4_A2:
725*4882a593Smuzhiyun case RT5682_L_EQ_BPF4_H0:
726*4882a593Smuzhiyun case RT5682_R_EQ_BPF4_H0:
727*4882a593Smuzhiyun case RT5682_L_EQ_HPF1_A1:
728*4882a593Smuzhiyun case RT5682_R_EQ_HPF1_A1:
729*4882a593Smuzhiyun case RT5682_L_EQ_HPF1_H0:
730*4882a593Smuzhiyun case RT5682_R_EQ_HPF1_H0:
731*4882a593Smuzhiyun case RT5682_L_EQ_PRE_VOL:
732*4882a593Smuzhiyun case RT5682_R_EQ_PRE_VOL:
733*4882a593Smuzhiyun case RT5682_L_EQ_POST_VOL:
734*4882a593Smuzhiyun case RT5682_R_EQ_POST_VOL:
735*4882a593Smuzhiyun case RT5682_I2C_MODE:
736*4882a593Smuzhiyun return true;
737*4882a593Smuzhiyun default:
738*4882a593Smuzhiyun return false;
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun }
741*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_readable_register);
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
744*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
745*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
748*4882a593Smuzhiyun static const DECLARE_TLV_DB_RANGE(bst_tlv,
749*4882a593Smuzhiyun 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
750*4882a593Smuzhiyun 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
751*4882a593Smuzhiyun 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
752*4882a593Smuzhiyun 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
753*4882a593Smuzhiyun 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
754*4882a593Smuzhiyun 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
755*4882a593Smuzhiyun 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
756*4882a593Smuzhiyun );
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun /* Interface data select */
759*4882a593Smuzhiyun static const char * const rt5682_data_select[] = {
760*4882a593Smuzhiyun "L/R", "R/L", "L/L", "R/R"
761*4882a593Smuzhiyun };
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5682_if2_adc_enum,
764*4882a593Smuzhiyun RT5682_DIG_INF2_DATA, RT5682_IF2_ADC_SEL_SFT, rt5682_data_select);
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5682_if1_01_adc_enum,
767*4882a593Smuzhiyun RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC1_SEL_SFT, rt5682_data_select);
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5682_if1_23_adc_enum,
770*4882a593Smuzhiyun RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC2_SEL_SFT, rt5682_data_select);
771*4882a593Smuzhiyun
772*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5682_if1_45_adc_enum,
773*4882a593Smuzhiyun RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC3_SEL_SFT, rt5682_data_select);
774*4882a593Smuzhiyun
775*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5682_if1_67_adc_enum,
776*4882a593Smuzhiyun RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC4_SEL_SFT, rt5682_data_select);
777*4882a593Smuzhiyun
778*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_if2_adc_swap_mux =
779*4882a593Smuzhiyun SOC_DAPM_ENUM("IF2 ADC Swap Mux", rt5682_if2_adc_enum);
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_if1_01_adc_swap_mux =
782*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 01 ADC Swap Mux", rt5682_if1_01_adc_enum);
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_if1_23_adc_swap_mux =
785*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 23 ADC Swap Mux", rt5682_if1_23_adc_enum);
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_if1_45_adc_swap_mux =
788*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 45 ADC Swap Mux", rt5682_if1_45_adc_enum);
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_if1_67_adc_swap_mux =
791*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 67 ADC Swap Mux", rt5682_if1_67_adc_enum);
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun static const char * const rt5682_dac_select[] = {
794*4882a593Smuzhiyun "IF1", "SOUND"
795*4882a593Smuzhiyun };
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5682_dacl_enum,
798*4882a593Smuzhiyun RT5682_AD_DA_MIXER, RT5682_DAC1_L_SEL_SFT, rt5682_dac_select);
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_dac_l_mux =
801*4882a593Smuzhiyun SOC_DAPM_ENUM("DAC L Mux", rt5682_dacl_enum);
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5682_dacr_enum,
804*4882a593Smuzhiyun RT5682_AD_DA_MIXER, RT5682_DAC1_R_SEL_SFT, rt5682_dac_select);
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_dac_r_mux =
807*4882a593Smuzhiyun SOC_DAPM_ENUM("DAC R Mux", rt5682_dacr_enum);
808*4882a593Smuzhiyun
rt5682_reset(struct rt5682_priv * rt5682)809*4882a593Smuzhiyun void rt5682_reset(struct rt5682_priv *rt5682)
810*4882a593Smuzhiyun {
811*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_RESET, 0);
812*4882a593Smuzhiyun if (!rt5682->is_sdw)
813*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_I2C_MODE, 1);
814*4882a593Smuzhiyun }
815*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_reset);
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun /**
818*4882a593Smuzhiyun * rt5682_sel_asrc_clk_src - select ASRC clock source for a set of filters
819*4882a593Smuzhiyun * @component: SoC audio component device.
820*4882a593Smuzhiyun * @filter_mask: mask of filters.
821*4882a593Smuzhiyun * @clk_src: clock source
822*4882a593Smuzhiyun *
823*4882a593Smuzhiyun * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5682 can
824*4882a593Smuzhiyun * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
825*4882a593Smuzhiyun * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
826*4882a593Smuzhiyun * ASRC function will track i2s clock and generate a corresponding system clock
827*4882a593Smuzhiyun * for codec. This function provides an API to select the clock source for a
828*4882a593Smuzhiyun * set of filters specified by the mask. And the component driver will turn on
829*4882a593Smuzhiyun * ASRC for these filters if ASRC is selected as their clock source.
830*4882a593Smuzhiyun */
rt5682_sel_asrc_clk_src(struct snd_soc_component * component,unsigned int filter_mask,unsigned int clk_src)831*4882a593Smuzhiyun int rt5682_sel_asrc_clk_src(struct snd_soc_component *component,
832*4882a593Smuzhiyun unsigned int filter_mask, unsigned int clk_src)
833*4882a593Smuzhiyun {
834*4882a593Smuzhiyun switch (clk_src) {
835*4882a593Smuzhiyun case RT5682_CLK_SEL_SYS:
836*4882a593Smuzhiyun case RT5682_CLK_SEL_I2S1_ASRC:
837*4882a593Smuzhiyun case RT5682_CLK_SEL_I2S2_ASRC:
838*4882a593Smuzhiyun break;
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun default:
841*4882a593Smuzhiyun return -EINVAL;
842*4882a593Smuzhiyun }
843*4882a593Smuzhiyun
844*4882a593Smuzhiyun if (filter_mask & RT5682_DA_STEREO1_FILTER) {
845*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PLL_TRACK_2,
846*4882a593Smuzhiyun RT5682_FILTER_CLK_SEL_MASK,
847*4882a593Smuzhiyun clk_src << RT5682_FILTER_CLK_SEL_SFT);
848*4882a593Smuzhiyun }
849*4882a593Smuzhiyun
850*4882a593Smuzhiyun if (filter_mask & RT5682_AD_STEREO1_FILTER) {
851*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PLL_TRACK_3,
852*4882a593Smuzhiyun RT5682_FILTER_CLK_SEL_MASK,
853*4882a593Smuzhiyun clk_src << RT5682_FILTER_CLK_SEL_SFT);
854*4882a593Smuzhiyun }
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun return 0;
857*4882a593Smuzhiyun }
858*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_sel_asrc_clk_src);
859*4882a593Smuzhiyun
rt5682_button_detect(struct snd_soc_component * component)860*4882a593Smuzhiyun static int rt5682_button_detect(struct snd_soc_component *component)
861*4882a593Smuzhiyun {
862*4882a593Smuzhiyun int btn_type, val;
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5682_4BTN_IL_CMD_1);
865*4882a593Smuzhiyun btn_type = val & 0xfff0;
866*4882a593Smuzhiyun snd_soc_component_write(component, RT5682_4BTN_IL_CMD_1, val);
867*4882a593Smuzhiyun dev_dbg(component->dev, "%s btn_type=%x\n", __func__, btn_type);
868*4882a593Smuzhiyun snd_soc_component_update_bits(component,
869*4882a593Smuzhiyun RT5682_SAR_IL_CMD_2, 0x10, 0x10);
870*4882a593Smuzhiyun
871*4882a593Smuzhiyun return btn_type;
872*4882a593Smuzhiyun }
873*4882a593Smuzhiyun
rt5682_enable_push_button_irq(struct snd_soc_component * component,bool enable)874*4882a593Smuzhiyun static void rt5682_enable_push_button_irq(struct snd_soc_component *component,
875*4882a593Smuzhiyun bool enable)
876*4882a593Smuzhiyun {
877*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun if (enable) {
880*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
881*4882a593Smuzhiyun RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_EN);
882*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13,
883*4882a593Smuzhiyun RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_BTN);
884*4882a593Smuzhiyun snd_soc_component_write(component, RT5682_IL_CMD_1, 0x0040);
885*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
886*4882a593Smuzhiyun RT5682_4BTN_IL_MASK | RT5682_4BTN_IL_RST_MASK,
887*4882a593Smuzhiyun RT5682_4BTN_IL_EN | RT5682_4BTN_IL_NOR);
888*4882a593Smuzhiyun if (rt5682->is_sdw)
889*4882a593Smuzhiyun snd_soc_component_update_bits(component,
890*4882a593Smuzhiyun RT5682_IRQ_CTRL_3,
891*4882a593Smuzhiyun RT5682_IL_IRQ_MASK | RT5682_IL_IRQ_TYPE_MASK,
892*4882a593Smuzhiyun RT5682_IL_IRQ_EN | RT5682_IL_IRQ_PUL);
893*4882a593Smuzhiyun else
894*4882a593Smuzhiyun snd_soc_component_update_bits(component,
895*4882a593Smuzhiyun RT5682_IRQ_CTRL_3, RT5682_IL_IRQ_MASK,
896*4882a593Smuzhiyun RT5682_IL_IRQ_EN);
897*4882a593Smuzhiyun } else {
898*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_IRQ_CTRL_3,
899*4882a593Smuzhiyun RT5682_IL_IRQ_MASK, RT5682_IL_IRQ_DIS);
900*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
901*4882a593Smuzhiyun RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_DIS);
902*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
903*4882a593Smuzhiyun RT5682_4BTN_IL_MASK, RT5682_4BTN_IL_DIS);
904*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
905*4882a593Smuzhiyun RT5682_4BTN_IL_RST_MASK, RT5682_4BTN_IL_RST);
906*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13,
907*4882a593Smuzhiyun RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_TYPE);
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun }
910*4882a593Smuzhiyun
911*4882a593Smuzhiyun /**
912*4882a593Smuzhiyun * rt5682_headset_detect - Detect headset.
913*4882a593Smuzhiyun * @component: SoC audio component device.
914*4882a593Smuzhiyun * @jack_insert: Jack insert or not.
915*4882a593Smuzhiyun *
916*4882a593Smuzhiyun * Detect whether is headset or not when jack inserted.
917*4882a593Smuzhiyun *
918*4882a593Smuzhiyun * Returns detect status.
919*4882a593Smuzhiyun */
rt5682_headset_detect(struct snd_soc_component * component,int jack_insert)920*4882a593Smuzhiyun int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert)
921*4882a593Smuzhiyun {
922*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
923*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm = &component->dapm;
924*4882a593Smuzhiyun unsigned int val, count;
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun if (jack_insert) {
927*4882a593Smuzhiyun snd_soc_dapm_mutex_lock(dapm);
928*4882a593Smuzhiyun
929*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
930*4882a593Smuzhiyun RT5682_PWR_VREF2 | RT5682_PWR_MB,
931*4882a593Smuzhiyun RT5682_PWR_VREF2 | RT5682_PWR_MB);
932*4882a593Smuzhiyun snd_soc_component_update_bits(component,
933*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0);
934*4882a593Smuzhiyun usleep_range(15000, 20000);
935*4882a593Smuzhiyun snd_soc_component_update_bits(component,
936*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_FV2, RT5682_PWR_FV2);
937*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
938*4882a593Smuzhiyun RT5682_PWR_CBJ, RT5682_PWR_CBJ);
939*4882a593Smuzhiyun snd_soc_component_update_bits(component,
940*4882a593Smuzhiyun RT5682_HP_CHARGE_PUMP_1,
941*4882a593Smuzhiyun RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0);
942*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
943*4882a593Smuzhiyun RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH);
944*4882a593Smuzhiyun
945*4882a593Smuzhiyun count = 0;
946*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5682_CBJ_CTRL_2)
947*4882a593Smuzhiyun & RT5682_JACK_TYPE_MASK;
948*4882a593Smuzhiyun while (val == 0 && count < 50) {
949*4882a593Smuzhiyun usleep_range(10000, 15000);
950*4882a593Smuzhiyun val = snd_soc_component_read(component,
951*4882a593Smuzhiyun RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK;
952*4882a593Smuzhiyun count++;
953*4882a593Smuzhiyun }
954*4882a593Smuzhiyun
955*4882a593Smuzhiyun switch (val) {
956*4882a593Smuzhiyun case 0x1:
957*4882a593Smuzhiyun case 0x2:
958*4882a593Smuzhiyun rt5682->jack_type = SND_JACK_HEADSET;
959*4882a593Smuzhiyun rt5682_enable_push_button_irq(component, true);
960*4882a593Smuzhiyun break;
961*4882a593Smuzhiyun default:
962*4882a593Smuzhiyun rt5682->jack_type = SND_JACK_HEADPHONE;
963*4882a593Smuzhiyun break;
964*4882a593Smuzhiyun }
965*4882a593Smuzhiyun
966*4882a593Smuzhiyun snd_soc_component_update_bits(component,
967*4882a593Smuzhiyun RT5682_HP_CHARGE_PUMP_1,
968*4882a593Smuzhiyun RT5682_OSW_L_MASK | RT5682_OSW_R_MASK,
969*4882a593Smuzhiyun RT5682_OSW_L_EN | RT5682_OSW_R_EN);
970*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_MICBIAS_2,
971*4882a593Smuzhiyun RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK,
972*4882a593Smuzhiyun RT5682_PWR_CLK25M_PU | RT5682_PWR_CLK1M_PU);
973*4882a593Smuzhiyun
974*4882a593Smuzhiyun snd_soc_dapm_mutex_unlock(dapm);
975*4882a593Smuzhiyun } else {
976*4882a593Smuzhiyun rt5682_enable_push_button_irq(component, false);
977*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
978*4882a593Smuzhiyun RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW);
979*4882a593Smuzhiyun if (!snd_soc_dapm_get_pin_status(dapm, "MICBIAS") &&
980*4882a593Smuzhiyun !snd_soc_dapm_get_pin_status(dapm, "PLL1") &&
981*4882a593Smuzhiyun !snd_soc_dapm_get_pin_status(dapm, "PLL2B"))
982*4882a593Smuzhiyun snd_soc_component_update_bits(component,
983*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0);
984*4882a593Smuzhiyun if (!snd_soc_dapm_get_pin_status(dapm, "Vref2") &&
985*4882a593Smuzhiyun !snd_soc_dapm_get_pin_status(dapm, "PLL1") &&
986*4882a593Smuzhiyun !snd_soc_dapm_get_pin_status(dapm, "PLL2B"))
987*4882a593Smuzhiyun snd_soc_component_update_bits(component,
988*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0);
989*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
990*4882a593Smuzhiyun RT5682_PWR_CBJ, 0);
991*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_MICBIAS_2,
992*4882a593Smuzhiyun RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK,
993*4882a593Smuzhiyun RT5682_PWR_CLK25M_PD | RT5682_PWR_CLK1M_PD);
994*4882a593Smuzhiyun
995*4882a593Smuzhiyun rt5682->jack_type = 0;
996*4882a593Smuzhiyun }
997*4882a593Smuzhiyun
998*4882a593Smuzhiyun dev_dbg(component->dev, "jack_type = %d\n", rt5682->jack_type);
999*4882a593Smuzhiyun return rt5682->jack_type;
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_headset_detect);
1002*4882a593Smuzhiyun
rt5682_set_jack_detect(struct snd_soc_component * component,struct snd_soc_jack * hs_jack,void * data)1003*4882a593Smuzhiyun static int rt5682_set_jack_detect(struct snd_soc_component *component,
1004*4882a593Smuzhiyun struct snd_soc_jack *hs_jack, void *data)
1005*4882a593Smuzhiyun {
1006*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun rt5682->hs_jack = hs_jack;
1009*4882a593Smuzhiyun
1010*4882a593Smuzhiyun if (!hs_jack) {
1011*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
1012*4882a593Smuzhiyun RT5682_JD1_EN_MASK, RT5682_JD1_DIS);
1013*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
1014*4882a593Smuzhiyun RT5682_POW_JDH | RT5682_POW_JDL, 0);
1015*4882a593Smuzhiyun cancel_delayed_work_sync(&rt5682->jack_detect_work);
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun return 0;
1018*4882a593Smuzhiyun }
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun if (!rt5682->is_sdw) {
1021*4882a593Smuzhiyun switch (rt5682->pdata.jd_src) {
1022*4882a593Smuzhiyun case RT5682_JD1:
1023*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1024*4882a593Smuzhiyun RT5682_CBJ_CTRL_2, RT5682_EXT_JD_SRC,
1025*4882a593Smuzhiyun RT5682_EXT_JD_SRC_MANUAL);
1026*4882a593Smuzhiyun snd_soc_component_write(component, RT5682_CBJ_CTRL_1,
1027*4882a593Smuzhiyun 0xd042);
1028*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1029*4882a593Smuzhiyun RT5682_CBJ_CTRL_3, RT5682_CBJ_IN_BUF_EN,
1030*4882a593Smuzhiyun RT5682_CBJ_IN_BUF_EN);
1031*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1032*4882a593Smuzhiyun RT5682_SAR_IL_CMD_1, RT5682_SAR_POW_MASK,
1033*4882a593Smuzhiyun RT5682_SAR_POW_EN);
1034*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_GPIO_CTRL_1,
1035*4882a593Smuzhiyun RT5682_GP1_PIN_MASK, RT5682_GP1_PIN_IRQ);
1036*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
1037*4882a593Smuzhiyun RT5682_POW_IRQ | RT5682_POW_JDH |
1038*4882a593Smuzhiyun RT5682_POW_ANA, RT5682_POW_IRQ |
1039*4882a593Smuzhiyun RT5682_POW_JDH | RT5682_POW_ANA);
1040*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_2,
1041*4882a593Smuzhiyun RT5682_PWR_JDH, RT5682_PWR_JDH);
1042*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
1043*4882a593Smuzhiyun RT5682_JD1_EN_MASK | RT5682_JD1_POL_MASK,
1044*4882a593Smuzhiyun RT5682_JD1_EN | RT5682_JD1_POL_NOR);
1045*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_4,
1046*4882a593Smuzhiyun 0x7f7f, (rt5682->pdata.btndet_delay << 8 |
1047*4882a593Smuzhiyun rt5682->pdata.btndet_delay));
1048*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_5,
1049*4882a593Smuzhiyun 0x7f7f, (rt5682->pdata.btndet_delay << 8 |
1050*4882a593Smuzhiyun rt5682->pdata.btndet_delay));
1051*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_6,
1052*4882a593Smuzhiyun 0x7f7f, (rt5682->pdata.btndet_delay << 8 |
1053*4882a593Smuzhiyun rt5682->pdata.btndet_delay));
1054*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_7,
1055*4882a593Smuzhiyun 0x7f7f, (rt5682->pdata.btndet_delay << 8 |
1056*4882a593Smuzhiyun rt5682->pdata.btndet_delay));
1057*4882a593Smuzhiyun mod_delayed_work(system_power_efficient_wq,
1058*4882a593Smuzhiyun &rt5682->jack_detect_work,
1059*4882a593Smuzhiyun msecs_to_jiffies(250));
1060*4882a593Smuzhiyun break;
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun case RT5682_JD_NULL:
1063*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
1064*4882a593Smuzhiyun RT5682_JD1_EN_MASK, RT5682_JD1_DIS);
1065*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
1066*4882a593Smuzhiyun RT5682_POW_JDH | RT5682_POW_JDL, 0);
1067*4882a593Smuzhiyun break;
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun default:
1070*4882a593Smuzhiyun dev_warn(component->dev, "Wrong JD source\n");
1071*4882a593Smuzhiyun break;
1072*4882a593Smuzhiyun }
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun return 0;
1076*4882a593Smuzhiyun }
1077*4882a593Smuzhiyun
rt5682_jack_detect_handler(struct work_struct * work)1078*4882a593Smuzhiyun void rt5682_jack_detect_handler(struct work_struct *work)
1079*4882a593Smuzhiyun {
1080*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
1081*4882a593Smuzhiyun container_of(work, struct rt5682_priv, jack_detect_work.work);
1082*4882a593Smuzhiyun int val, btn_type;
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun if (!rt5682->component || !rt5682->component->card ||
1085*4882a593Smuzhiyun !rt5682->component->card->instantiated) {
1086*4882a593Smuzhiyun /* card not yet ready, try later */
1087*4882a593Smuzhiyun mod_delayed_work(system_power_efficient_wq,
1088*4882a593Smuzhiyun &rt5682->jack_detect_work, msecs_to_jiffies(15));
1089*4882a593Smuzhiyun return;
1090*4882a593Smuzhiyun }
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun mutex_lock(&rt5682->calibrate_mutex);
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun val = snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL)
1095*4882a593Smuzhiyun & RT5682_JDH_RS_MASK;
1096*4882a593Smuzhiyun if (!val) {
1097*4882a593Smuzhiyun /* jack in */
1098*4882a593Smuzhiyun if (rt5682->jack_type == 0) {
1099*4882a593Smuzhiyun /* jack was out, report jack type */
1100*4882a593Smuzhiyun rt5682->jack_type =
1101*4882a593Smuzhiyun rt5682_headset_detect(rt5682->component, 1);
1102*4882a593Smuzhiyun } else if ((rt5682->jack_type & SND_JACK_HEADSET) ==
1103*4882a593Smuzhiyun SND_JACK_HEADSET) {
1104*4882a593Smuzhiyun /* jack is already in, report button event */
1105*4882a593Smuzhiyun rt5682->jack_type = SND_JACK_HEADSET;
1106*4882a593Smuzhiyun btn_type = rt5682_button_detect(rt5682->component);
1107*4882a593Smuzhiyun /**
1108*4882a593Smuzhiyun * rt5682 can report three kinds of button behavior,
1109*4882a593Smuzhiyun * one click, double click and hold. However,
1110*4882a593Smuzhiyun * currently we will report button pressed/released
1111*4882a593Smuzhiyun * event. So all the three button behaviors are
1112*4882a593Smuzhiyun * treated as button pressed.
1113*4882a593Smuzhiyun */
1114*4882a593Smuzhiyun switch (btn_type) {
1115*4882a593Smuzhiyun case 0x8000:
1116*4882a593Smuzhiyun case 0x4000:
1117*4882a593Smuzhiyun case 0x2000:
1118*4882a593Smuzhiyun rt5682->jack_type |= SND_JACK_BTN_0;
1119*4882a593Smuzhiyun break;
1120*4882a593Smuzhiyun case 0x1000:
1121*4882a593Smuzhiyun case 0x0800:
1122*4882a593Smuzhiyun case 0x0400:
1123*4882a593Smuzhiyun rt5682->jack_type |= SND_JACK_BTN_1;
1124*4882a593Smuzhiyun break;
1125*4882a593Smuzhiyun case 0x0200:
1126*4882a593Smuzhiyun case 0x0100:
1127*4882a593Smuzhiyun case 0x0080:
1128*4882a593Smuzhiyun rt5682->jack_type |= SND_JACK_BTN_2;
1129*4882a593Smuzhiyun break;
1130*4882a593Smuzhiyun case 0x0040:
1131*4882a593Smuzhiyun case 0x0020:
1132*4882a593Smuzhiyun case 0x0010:
1133*4882a593Smuzhiyun rt5682->jack_type |= SND_JACK_BTN_3;
1134*4882a593Smuzhiyun break;
1135*4882a593Smuzhiyun case 0x0000: /* unpressed */
1136*4882a593Smuzhiyun break;
1137*4882a593Smuzhiyun default:
1138*4882a593Smuzhiyun dev_err(rt5682->component->dev,
1139*4882a593Smuzhiyun "Unexpected button code 0x%04x\n",
1140*4882a593Smuzhiyun btn_type);
1141*4882a593Smuzhiyun break;
1142*4882a593Smuzhiyun }
1143*4882a593Smuzhiyun }
1144*4882a593Smuzhiyun } else {
1145*4882a593Smuzhiyun /* jack out */
1146*4882a593Smuzhiyun rt5682->jack_type = rt5682_headset_detect(rt5682->component, 0);
1147*4882a593Smuzhiyun }
1148*4882a593Smuzhiyun
1149*4882a593Smuzhiyun snd_soc_jack_report(rt5682->hs_jack, rt5682->jack_type,
1150*4882a593Smuzhiyun SND_JACK_HEADSET |
1151*4882a593Smuzhiyun SND_JACK_BTN_0 | SND_JACK_BTN_1 |
1152*4882a593Smuzhiyun SND_JACK_BTN_2 | SND_JACK_BTN_3);
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun if (!rt5682->is_sdw) {
1155*4882a593Smuzhiyun if (rt5682->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |
1156*4882a593Smuzhiyun SND_JACK_BTN_2 | SND_JACK_BTN_3))
1157*4882a593Smuzhiyun schedule_delayed_work(&rt5682->jd_check_work, 0);
1158*4882a593Smuzhiyun else
1159*4882a593Smuzhiyun cancel_delayed_work_sync(&rt5682->jd_check_work);
1160*4882a593Smuzhiyun }
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun mutex_unlock(&rt5682->calibrate_mutex);
1163*4882a593Smuzhiyun }
1164*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_jack_detect_handler);
1165*4882a593Smuzhiyun
1166*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_snd_controls[] = {
1167*4882a593Smuzhiyun /* DAC Digital Volume */
1168*4882a593Smuzhiyun SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682_DAC1_DIG_VOL,
1169*4882a593Smuzhiyun RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 87, 0, dac_vol_tlv),
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun /* IN Boost Volume */
1172*4882a593Smuzhiyun SOC_SINGLE_TLV("CBJ Boost Volume", RT5682_CBJ_BST_CTRL,
1173*4882a593Smuzhiyun RT5682_BST_CBJ_SFT, 8, 0, bst_tlv),
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun /* ADC Digital Volume Control */
1176*4882a593Smuzhiyun SOC_DOUBLE("STO1 ADC Capture Switch", RT5682_STO1_ADC_DIG_VOL,
1177*4882a593Smuzhiyun RT5682_L_MUTE_SFT, RT5682_R_MUTE_SFT, 1, 1),
1178*4882a593Smuzhiyun SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682_STO1_ADC_DIG_VOL,
1179*4882a593Smuzhiyun RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 63, 0, adc_vol_tlv),
1180*4882a593Smuzhiyun
1181*4882a593Smuzhiyun /* ADC Boost Volume Control */
1182*4882a593Smuzhiyun SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682_STO1_ADC_BOOST,
1183*4882a593Smuzhiyun RT5682_STO1_ADC_L_BST_SFT, RT5682_STO1_ADC_R_BST_SFT,
1184*4882a593Smuzhiyun 3, 0, adc_bst_tlv),
1185*4882a593Smuzhiyun };
1186*4882a593Smuzhiyun
rt5682_div_sel(struct rt5682_priv * rt5682,int target,const int div[],int size)1187*4882a593Smuzhiyun static int rt5682_div_sel(struct rt5682_priv *rt5682,
1188*4882a593Smuzhiyun int target, const int div[], int size)
1189*4882a593Smuzhiyun {
1190*4882a593Smuzhiyun int i;
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun if (rt5682->sysclk < target) {
1193*4882a593Smuzhiyun dev_err(rt5682->component->dev,
1194*4882a593Smuzhiyun "sysclk rate %d is too low\n", rt5682->sysclk);
1195*4882a593Smuzhiyun return 0;
1196*4882a593Smuzhiyun }
1197*4882a593Smuzhiyun
1198*4882a593Smuzhiyun for (i = 0; i < size - 1; i++) {
1199*4882a593Smuzhiyun dev_dbg(rt5682->component->dev, "div[%d]=%d\n", i, div[i]);
1200*4882a593Smuzhiyun if (target * div[i] == rt5682->sysclk)
1201*4882a593Smuzhiyun return i;
1202*4882a593Smuzhiyun if (target * div[i + 1] > rt5682->sysclk) {
1203*4882a593Smuzhiyun dev_dbg(rt5682->component->dev,
1204*4882a593Smuzhiyun "can't find div for sysclk %d\n",
1205*4882a593Smuzhiyun rt5682->sysclk);
1206*4882a593Smuzhiyun return i;
1207*4882a593Smuzhiyun }
1208*4882a593Smuzhiyun }
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun if (target * div[i] < rt5682->sysclk)
1211*4882a593Smuzhiyun dev_err(rt5682->component->dev,
1212*4882a593Smuzhiyun "sysclk rate %d is too high\n", rt5682->sysclk);
1213*4882a593Smuzhiyun
1214*4882a593Smuzhiyun return size - 1;
1215*4882a593Smuzhiyun }
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun /**
1218*4882a593Smuzhiyun * set_dmic_clk - Set parameter of dmic.
1219*4882a593Smuzhiyun *
1220*4882a593Smuzhiyun * @w: DAPM widget.
1221*4882a593Smuzhiyun * @kcontrol: The kcontrol of this widget.
1222*4882a593Smuzhiyun * @event: Event id.
1223*4882a593Smuzhiyun *
1224*4882a593Smuzhiyun * Choose dmic clock between 1MHz and 3MHz.
1225*4882a593Smuzhiyun * It is better for clock to approximate 3MHz.
1226*4882a593Smuzhiyun */
set_dmic_clk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1227*4882a593Smuzhiyun static int set_dmic_clk(struct snd_soc_dapm_widget *w,
1228*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1229*4882a593Smuzhiyun {
1230*4882a593Smuzhiyun struct snd_soc_component *component =
1231*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1232*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
1233*4882a593Smuzhiyun int idx = -EINVAL, dmic_clk_rate = 3072000;
1234*4882a593Smuzhiyun static const int div[] = {2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128};
1235*4882a593Smuzhiyun
1236*4882a593Smuzhiyun if (rt5682->pdata.dmic_clk_rate)
1237*4882a593Smuzhiyun dmic_clk_rate = rt5682->pdata.dmic_clk_rate;
1238*4882a593Smuzhiyun
1239*4882a593Smuzhiyun idx = rt5682_div_sel(rt5682, dmic_clk_rate, div, ARRAY_SIZE(div));
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_DMIC_CTRL_1,
1242*4882a593Smuzhiyun RT5682_DMIC_CLK_MASK, idx << RT5682_DMIC_CLK_SFT);
1243*4882a593Smuzhiyun
1244*4882a593Smuzhiyun return 0;
1245*4882a593Smuzhiyun }
1246*4882a593Smuzhiyun
set_filter_clk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1247*4882a593Smuzhiyun static int set_filter_clk(struct snd_soc_dapm_widget *w,
1248*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1249*4882a593Smuzhiyun {
1250*4882a593Smuzhiyun struct snd_soc_component *component =
1251*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1252*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
1253*4882a593Smuzhiyun int ref, val, reg, idx = -EINVAL;
1254*4882a593Smuzhiyun static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};
1255*4882a593Smuzhiyun static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48};
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun if (rt5682->is_sdw)
1258*4882a593Smuzhiyun return 0;
1259*4882a593Smuzhiyun
1260*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5682_GPIO_CTRL_1) &
1261*4882a593Smuzhiyun RT5682_GP4_PIN_MASK;
1262*4882a593Smuzhiyun if (w->shift == RT5682_PWR_ADC_S1F_BIT &&
1263*4882a593Smuzhiyun val == RT5682_GP4_PIN_ADCDAT2)
1264*4882a593Smuzhiyun ref = 256 * rt5682->lrck[RT5682_AIF2];
1265*4882a593Smuzhiyun else
1266*4882a593Smuzhiyun ref = 256 * rt5682->lrck[RT5682_AIF1];
1267*4882a593Smuzhiyun
1268*4882a593Smuzhiyun idx = rt5682_div_sel(rt5682, ref, div_f, ARRAY_SIZE(div_f));
1269*4882a593Smuzhiyun
1270*4882a593Smuzhiyun if (w->shift == RT5682_PWR_ADC_S1F_BIT)
1271*4882a593Smuzhiyun reg = RT5682_PLL_TRACK_3;
1272*4882a593Smuzhiyun else
1273*4882a593Smuzhiyun reg = RT5682_PLL_TRACK_2;
1274*4882a593Smuzhiyun
1275*4882a593Smuzhiyun snd_soc_component_update_bits(component, reg,
1276*4882a593Smuzhiyun RT5682_FILTER_CLK_DIV_MASK, idx << RT5682_FILTER_CLK_DIV_SFT);
1277*4882a593Smuzhiyun
1278*4882a593Smuzhiyun /* select over sample rate */
1279*4882a593Smuzhiyun for (idx = 0; idx < ARRAY_SIZE(div_o); idx++) {
1280*4882a593Smuzhiyun if (rt5682->sysclk <= 12288000 * div_o[idx])
1281*4882a593Smuzhiyun break;
1282*4882a593Smuzhiyun }
1283*4882a593Smuzhiyun
1284*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1,
1285*4882a593Smuzhiyun RT5682_ADC_OSR_MASK | RT5682_DAC_OSR_MASK,
1286*4882a593Smuzhiyun (idx << RT5682_ADC_OSR_SFT) | (idx << RT5682_DAC_OSR_SFT));
1287*4882a593Smuzhiyun
1288*4882a593Smuzhiyun return 0;
1289*4882a593Smuzhiyun }
1290*4882a593Smuzhiyun
is_sys_clk_from_pll1(struct snd_soc_dapm_widget * w,struct snd_soc_dapm_widget * sink)1291*4882a593Smuzhiyun static int is_sys_clk_from_pll1(struct snd_soc_dapm_widget *w,
1292*4882a593Smuzhiyun struct snd_soc_dapm_widget *sink)
1293*4882a593Smuzhiyun {
1294*4882a593Smuzhiyun unsigned int val;
1295*4882a593Smuzhiyun struct snd_soc_component *component =
1296*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1297*4882a593Smuzhiyun
1298*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5682_GLB_CLK);
1299*4882a593Smuzhiyun val &= RT5682_SCLK_SRC_MASK;
1300*4882a593Smuzhiyun if (val == RT5682_SCLK_SRC_PLL1)
1301*4882a593Smuzhiyun return 1;
1302*4882a593Smuzhiyun else
1303*4882a593Smuzhiyun return 0;
1304*4882a593Smuzhiyun }
1305*4882a593Smuzhiyun
is_sys_clk_from_pll2(struct snd_soc_dapm_widget * w,struct snd_soc_dapm_widget * sink)1306*4882a593Smuzhiyun static int is_sys_clk_from_pll2(struct snd_soc_dapm_widget *w,
1307*4882a593Smuzhiyun struct snd_soc_dapm_widget *sink)
1308*4882a593Smuzhiyun {
1309*4882a593Smuzhiyun unsigned int val;
1310*4882a593Smuzhiyun struct snd_soc_component *component =
1311*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1312*4882a593Smuzhiyun
1313*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5682_GLB_CLK);
1314*4882a593Smuzhiyun val &= RT5682_SCLK_SRC_MASK;
1315*4882a593Smuzhiyun if (val == RT5682_SCLK_SRC_PLL2)
1316*4882a593Smuzhiyun return 1;
1317*4882a593Smuzhiyun else
1318*4882a593Smuzhiyun return 0;
1319*4882a593Smuzhiyun }
1320*4882a593Smuzhiyun
is_using_asrc(struct snd_soc_dapm_widget * w,struct snd_soc_dapm_widget * sink)1321*4882a593Smuzhiyun static int is_using_asrc(struct snd_soc_dapm_widget *w,
1322*4882a593Smuzhiyun struct snd_soc_dapm_widget *sink)
1323*4882a593Smuzhiyun {
1324*4882a593Smuzhiyun unsigned int reg, shift, val;
1325*4882a593Smuzhiyun struct snd_soc_component *component =
1326*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1327*4882a593Smuzhiyun
1328*4882a593Smuzhiyun switch (w->shift) {
1329*4882a593Smuzhiyun case RT5682_ADC_STO1_ASRC_SFT:
1330*4882a593Smuzhiyun reg = RT5682_PLL_TRACK_3;
1331*4882a593Smuzhiyun shift = RT5682_FILTER_CLK_SEL_SFT;
1332*4882a593Smuzhiyun break;
1333*4882a593Smuzhiyun case RT5682_DAC_STO1_ASRC_SFT:
1334*4882a593Smuzhiyun reg = RT5682_PLL_TRACK_2;
1335*4882a593Smuzhiyun shift = RT5682_FILTER_CLK_SEL_SFT;
1336*4882a593Smuzhiyun break;
1337*4882a593Smuzhiyun default:
1338*4882a593Smuzhiyun return 0;
1339*4882a593Smuzhiyun }
1340*4882a593Smuzhiyun
1341*4882a593Smuzhiyun val = (snd_soc_component_read(component, reg) >> shift) & 0xf;
1342*4882a593Smuzhiyun switch (val) {
1343*4882a593Smuzhiyun case RT5682_CLK_SEL_I2S1_ASRC:
1344*4882a593Smuzhiyun case RT5682_CLK_SEL_I2S2_ASRC:
1345*4882a593Smuzhiyun return 1;
1346*4882a593Smuzhiyun default:
1347*4882a593Smuzhiyun return 0;
1348*4882a593Smuzhiyun }
1349*4882a593Smuzhiyun }
1350*4882a593Smuzhiyun
1351*4882a593Smuzhiyun /* Digital Mixer */
1352*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_adc_l_mix[] = {
1353*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER,
1354*4882a593Smuzhiyun RT5682_M_STO1_ADC_L1_SFT, 1, 1),
1355*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER,
1356*4882a593Smuzhiyun RT5682_M_STO1_ADC_L2_SFT, 1, 1),
1357*4882a593Smuzhiyun };
1358*4882a593Smuzhiyun
1359*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_adc_r_mix[] = {
1360*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER,
1361*4882a593Smuzhiyun RT5682_M_STO1_ADC_R1_SFT, 1, 1),
1362*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER,
1363*4882a593Smuzhiyun RT5682_M_STO1_ADC_R2_SFT, 1, 1),
1364*4882a593Smuzhiyun };
1365*4882a593Smuzhiyun
1366*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_dac_l_mix[] = {
1367*4882a593Smuzhiyun SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER,
1368*4882a593Smuzhiyun RT5682_M_ADCMIX_L_SFT, 1, 1),
1369*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER,
1370*4882a593Smuzhiyun RT5682_M_DAC1_L_SFT, 1, 1),
1371*4882a593Smuzhiyun };
1372*4882a593Smuzhiyun
1373*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_dac_r_mix[] = {
1374*4882a593Smuzhiyun SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER,
1375*4882a593Smuzhiyun RT5682_M_ADCMIX_R_SFT, 1, 1),
1376*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER,
1377*4882a593Smuzhiyun RT5682_M_DAC1_R_SFT, 1, 1),
1378*4882a593Smuzhiyun };
1379*4882a593Smuzhiyun
1380*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_dac_l_mix[] = {
1381*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER,
1382*4882a593Smuzhiyun RT5682_M_DAC_L1_STO_L_SFT, 1, 1),
1383*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER,
1384*4882a593Smuzhiyun RT5682_M_DAC_R1_STO_L_SFT, 1, 1),
1385*4882a593Smuzhiyun };
1386*4882a593Smuzhiyun
1387*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_dac_r_mix[] = {
1388*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER,
1389*4882a593Smuzhiyun RT5682_M_DAC_L1_STO_R_SFT, 1, 1),
1390*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER,
1391*4882a593Smuzhiyun RT5682_M_DAC_R1_STO_R_SFT, 1, 1),
1392*4882a593Smuzhiyun };
1393*4882a593Smuzhiyun
1394*4882a593Smuzhiyun /* Analog Input Mixer */
1395*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_rec1_l_mix[] = {
1396*4882a593Smuzhiyun SOC_DAPM_SINGLE("CBJ Switch", RT5682_REC_MIXER,
1397*4882a593Smuzhiyun RT5682_M_CBJ_RM1_L_SFT, 1, 1),
1398*4882a593Smuzhiyun };
1399*4882a593Smuzhiyun
1400*4882a593Smuzhiyun /* STO1 ADC1 Source */
1401*4882a593Smuzhiyun /* MX-26 [13] [5] */
1402*4882a593Smuzhiyun static const char * const rt5682_sto1_adc1_src[] = {
1403*4882a593Smuzhiyun "DAC MIX", "ADC"
1404*4882a593Smuzhiyun };
1405*4882a593Smuzhiyun
1406*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1407*4882a593Smuzhiyun rt5682_sto1_adc1l_enum, RT5682_STO1_ADC_MIXER,
1408*4882a593Smuzhiyun RT5682_STO1_ADC1L_SRC_SFT, rt5682_sto1_adc1_src);
1409*4882a593Smuzhiyun
1410*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_adc1l_mux =
1411*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1l_enum);
1412*4882a593Smuzhiyun
1413*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1414*4882a593Smuzhiyun rt5682_sto1_adc1r_enum, RT5682_STO1_ADC_MIXER,
1415*4882a593Smuzhiyun RT5682_STO1_ADC1R_SRC_SFT, rt5682_sto1_adc1_src);
1416*4882a593Smuzhiyun
1417*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_adc1r_mux =
1418*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1r_enum);
1419*4882a593Smuzhiyun
1420*4882a593Smuzhiyun /* STO1 ADC Source */
1421*4882a593Smuzhiyun /* MX-26 [11:10] [3:2] */
1422*4882a593Smuzhiyun static const char * const rt5682_sto1_adc_src[] = {
1423*4882a593Smuzhiyun "ADC1 L", "ADC1 R"
1424*4882a593Smuzhiyun };
1425*4882a593Smuzhiyun
1426*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1427*4882a593Smuzhiyun rt5682_sto1_adcl_enum, RT5682_STO1_ADC_MIXER,
1428*4882a593Smuzhiyun RT5682_STO1_ADCL_SRC_SFT, rt5682_sto1_adc_src);
1429*4882a593Smuzhiyun
1430*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_adcl_mux =
1431*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5682_sto1_adcl_enum);
1432*4882a593Smuzhiyun
1433*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1434*4882a593Smuzhiyun rt5682_sto1_adcr_enum, RT5682_STO1_ADC_MIXER,
1435*4882a593Smuzhiyun RT5682_STO1_ADCR_SRC_SFT, rt5682_sto1_adc_src);
1436*4882a593Smuzhiyun
1437*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_adcr_mux =
1438*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5682_sto1_adcr_enum);
1439*4882a593Smuzhiyun
1440*4882a593Smuzhiyun /* STO1 ADC2 Source */
1441*4882a593Smuzhiyun /* MX-26 [12] [4] */
1442*4882a593Smuzhiyun static const char * const rt5682_sto1_adc2_src[] = {
1443*4882a593Smuzhiyun "DAC MIX", "DMIC"
1444*4882a593Smuzhiyun };
1445*4882a593Smuzhiyun
1446*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1447*4882a593Smuzhiyun rt5682_sto1_adc2l_enum, RT5682_STO1_ADC_MIXER,
1448*4882a593Smuzhiyun RT5682_STO1_ADC2L_SRC_SFT, rt5682_sto1_adc2_src);
1449*4882a593Smuzhiyun
1450*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_adc2l_mux =
1451*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5682_sto1_adc2l_enum);
1452*4882a593Smuzhiyun
1453*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1454*4882a593Smuzhiyun rt5682_sto1_adc2r_enum, RT5682_STO1_ADC_MIXER,
1455*4882a593Smuzhiyun RT5682_STO1_ADC2R_SRC_SFT, rt5682_sto1_adc2_src);
1456*4882a593Smuzhiyun
1457*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_sto1_adc2r_mux =
1458*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5682_sto1_adc2r_enum);
1459*4882a593Smuzhiyun
1460*4882a593Smuzhiyun /* MX-79 [6:4] I2S1 ADC data location */
1461*4882a593Smuzhiyun static const unsigned int rt5682_if1_adc_slot_values[] = {
1462*4882a593Smuzhiyun 0,
1463*4882a593Smuzhiyun 2,
1464*4882a593Smuzhiyun 4,
1465*4882a593Smuzhiyun 6,
1466*4882a593Smuzhiyun };
1467*4882a593Smuzhiyun
1468*4882a593Smuzhiyun static const char * const rt5682_if1_adc_slot_src[] = {
1469*4882a593Smuzhiyun "Slot 0", "Slot 2", "Slot 4", "Slot 6"
1470*4882a593Smuzhiyun };
1471*4882a593Smuzhiyun
1472*4882a593Smuzhiyun static SOC_VALUE_ENUM_SINGLE_DECL(rt5682_if1_adc_slot_enum,
1473*4882a593Smuzhiyun RT5682_TDM_CTRL, RT5682_TDM_ADC_LCA_SFT, RT5682_TDM_ADC_LCA_MASK,
1474*4882a593Smuzhiyun rt5682_if1_adc_slot_src, rt5682_if1_adc_slot_values);
1475*4882a593Smuzhiyun
1476*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_if1_adc_slot_mux =
1477*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 ADC Slot location", rt5682_if1_adc_slot_enum);
1478*4882a593Smuzhiyun
1479*4882a593Smuzhiyun /* Analog DAC L1 Source, Analog DAC R1 Source*/
1480*4882a593Smuzhiyun /* MX-2B [4], MX-2B [0]*/
1481*4882a593Smuzhiyun static const char * const rt5682_alg_dac1_src[] = {
1482*4882a593Smuzhiyun "Stereo1 DAC Mixer", "DAC1"
1483*4882a593Smuzhiyun };
1484*4882a593Smuzhiyun
1485*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1486*4882a593Smuzhiyun rt5682_alg_dac_l1_enum, RT5682_A_DAC1_MUX,
1487*4882a593Smuzhiyun RT5682_A_DACL1_SFT, rt5682_alg_dac1_src);
1488*4882a593Smuzhiyun
1489*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_alg_dac_l1_mux =
1490*4882a593Smuzhiyun SOC_DAPM_ENUM("Analog DAC L1 Source", rt5682_alg_dac_l1_enum);
1491*4882a593Smuzhiyun
1492*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1493*4882a593Smuzhiyun rt5682_alg_dac_r1_enum, RT5682_A_DAC1_MUX,
1494*4882a593Smuzhiyun RT5682_A_DACR1_SFT, rt5682_alg_dac1_src);
1495*4882a593Smuzhiyun
1496*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_alg_dac_r1_mux =
1497*4882a593Smuzhiyun SOC_DAPM_ENUM("Analog DAC R1 Source", rt5682_alg_dac_r1_enum);
1498*4882a593Smuzhiyun
1499*4882a593Smuzhiyun /* Out Switch */
1500*4882a593Smuzhiyun static const struct snd_kcontrol_new hpol_switch =
1501*4882a593Smuzhiyun SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1,
1502*4882a593Smuzhiyun RT5682_L_MUTE_SFT, 1, 1);
1503*4882a593Smuzhiyun static const struct snd_kcontrol_new hpor_switch =
1504*4882a593Smuzhiyun SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1,
1505*4882a593Smuzhiyun RT5682_R_MUTE_SFT, 1, 1);
1506*4882a593Smuzhiyun
rt5682_hp_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1507*4882a593Smuzhiyun static int rt5682_hp_event(struct snd_soc_dapm_widget *w,
1508*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1509*4882a593Smuzhiyun {
1510*4882a593Smuzhiyun struct snd_soc_component *component =
1511*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1512*4882a593Smuzhiyun
1513*4882a593Smuzhiyun switch (event) {
1514*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMU:
1515*4882a593Smuzhiyun snd_soc_component_write(component,
1516*4882a593Smuzhiyun RT5682_HP_LOGIC_CTRL_2, 0x0012);
1517*4882a593Smuzhiyun snd_soc_component_write(component,
1518*4882a593Smuzhiyun RT5682_HP_CTRL_2, 0x6000);
1519*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1520*4882a593Smuzhiyun RT5682_DEPOP_1, 0x60, 0x60);
1521*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1522*4882a593Smuzhiyun RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080);
1523*4882a593Smuzhiyun break;
1524*4882a593Smuzhiyun
1525*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMD:
1526*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1527*4882a593Smuzhiyun RT5682_DEPOP_1, 0x60, 0x0);
1528*4882a593Smuzhiyun snd_soc_component_write(component,
1529*4882a593Smuzhiyun RT5682_HP_CTRL_2, 0x0000);
1530*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1531*4882a593Smuzhiyun RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0000);
1532*4882a593Smuzhiyun break;
1533*4882a593Smuzhiyun }
1534*4882a593Smuzhiyun
1535*4882a593Smuzhiyun return 0;
1536*4882a593Smuzhiyun }
1537*4882a593Smuzhiyun
set_dmic_power(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1538*4882a593Smuzhiyun static int set_dmic_power(struct snd_soc_dapm_widget *w,
1539*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1540*4882a593Smuzhiyun {
1541*4882a593Smuzhiyun struct snd_soc_component *component =
1542*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1543*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
1544*4882a593Smuzhiyun unsigned int delay = 50, val;
1545*4882a593Smuzhiyun
1546*4882a593Smuzhiyun if (rt5682->pdata.dmic_delay)
1547*4882a593Smuzhiyun delay = rt5682->pdata.dmic_delay;
1548*4882a593Smuzhiyun
1549*4882a593Smuzhiyun switch (event) {
1550*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMU:
1551*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5682_GLB_CLK);
1552*4882a593Smuzhiyun val &= RT5682_SCLK_SRC_MASK;
1553*4882a593Smuzhiyun if (val == RT5682_SCLK_SRC_PLL1 || val == RT5682_SCLK_SRC_PLL2)
1554*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1555*4882a593Smuzhiyun RT5682_PWR_ANLG_1,
1556*4882a593Smuzhiyun RT5682_PWR_VREF2 | RT5682_PWR_MB,
1557*4882a593Smuzhiyun RT5682_PWR_VREF2 | RT5682_PWR_MB);
1558*4882a593Smuzhiyun
1559*4882a593Smuzhiyun /*Add delay to avoid pop noise*/
1560*4882a593Smuzhiyun msleep(delay);
1561*4882a593Smuzhiyun break;
1562*4882a593Smuzhiyun
1563*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMD:
1564*4882a593Smuzhiyun if (!rt5682->jack_type) {
1565*4882a593Smuzhiyun if (!snd_soc_dapm_get_pin_status(w->dapm, "MICBIAS"))
1566*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1567*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0);
1568*4882a593Smuzhiyun if (!snd_soc_dapm_get_pin_status(w->dapm, "Vref2"))
1569*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1570*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0);
1571*4882a593Smuzhiyun }
1572*4882a593Smuzhiyun break;
1573*4882a593Smuzhiyun }
1574*4882a593Smuzhiyun
1575*4882a593Smuzhiyun return 0;
1576*4882a593Smuzhiyun }
1577*4882a593Smuzhiyun
rt5682_set_verf(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1578*4882a593Smuzhiyun static int rt5682_set_verf(struct snd_soc_dapm_widget *w,
1579*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1580*4882a593Smuzhiyun {
1581*4882a593Smuzhiyun struct snd_soc_component *component =
1582*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1583*4882a593Smuzhiyun
1584*4882a593Smuzhiyun switch (event) {
1585*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMU:
1586*4882a593Smuzhiyun switch (w->shift) {
1587*4882a593Smuzhiyun case RT5682_PWR_VREF1_BIT:
1588*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1589*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_FV1, 0);
1590*4882a593Smuzhiyun break;
1591*4882a593Smuzhiyun
1592*4882a593Smuzhiyun case RT5682_PWR_VREF2_BIT:
1593*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1594*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0);
1595*4882a593Smuzhiyun break;
1596*4882a593Smuzhiyun }
1597*4882a593Smuzhiyun break;
1598*4882a593Smuzhiyun
1599*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMU:
1600*4882a593Smuzhiyun usleep_range(15000, 20000);
1601*4882a593Smuzhiyun switch (w->shift) {
1602*4882a593Smuzhiyun case RT5682_PWR_VREF1_BIT:
1603*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1604*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_FV1,
1605*4882a593Smuzhiyun RT5682_PWR_FV1);
1606*4882a593Smuzhiyun break;
1607*4882a593Smuzhiyun
1608*4882a593Smuzhiyun case RT5682_PWR_VREF2_BIT:
1609*4882a593Smuzhiyun snd_soc_component_update_bits(component,
1610*4882a593Smuzhiyun RT5682_PWR_ANLG_1, RT5682_PWR_FV2,
1611*4882a593Smuzhiyun RT5682_PWR_FV2);
1612*4882a593Smuzhiyun break;
1613*4882a593Smuzhiyun }
1614*4882a593Smuzhiyun break;
1615*4882a593Smuzhiyun }
1616*4882a593Smuzhiyun
1617*4882a593Smuzhiyun return 0;
1618*4882a593Smuzhiyun }
1619*4882a593Smuzhiyun
1620*4882a593Smuzhiyun static const unsigned int rt5682_adcdat_pin_values[] = {
1621*4882a593Smuzhiyun 1,
1622*4882a593Smuzhiyun 3,
1623*4882a593Smuzhiyun };
1624*4882a593Smuzhiyun
1625*4882a593Smuzhiyun static const char * const rt5682_adcdat_pin_select[] = {
1626*4882a593Smuzhiyun "ADCDAT1",
1627*4882a593Smuzhiyun "ADCDAT2",
1628*4882a593Smuzhiyun };
1629*4882a593Smuzhiyun
1630*4882a593Smuzhiyun static SOC_VALUE_ENUM_SINGLE_DECL(rt5682_adcdat_pin_enum,
1631*4882a593Smuzhiyun RT5682_GPIO_CTRL_1, RT5682_GP4_PIN_SFT, RT5682_GP4_PIN_MASK,
1632*4882a593Smuzhiyun rt5682_adcdat_pin_select, rt5682_adcdat_pin_values);
1633*4882a593Smuzhiyun
1634*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5682_adcdat_pin_ctrl =
1635*4882a593Smuzhiyun SOC_DAPM_ENUM("ADCDAT", rt5682_adcdat_pin_enum);
1636*4882a593Smuzhiyun
1637*4882a593Smuzhiyun static const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = {
1638*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("LDO2", RT5682_PWR_ANLG_3, RT5682_PWR_LDO2_BIT,
1639*4882a593Smuzhiyun 0, NULL, 0),
1640*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("PLL1", RT5682_PWR_ANLG_3, RT5682_PWR_PLL_BIT,
1641*4882a593Smuzhiyun 0, NULL, 0),
1642*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("PLL2B", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2B_BIT,
1643*4882a593Smuzhiyun 0, NULL, 0),
1644*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("PLL2F", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2F_BIT,
1645*4882a593Smuzhiyun 0, set_filter_clk, SND_SOC_DAPM_PRE_PMU),
1646*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("Vref1", RT5682_PWR_ANLG_1, RT5682_PWR_VREF1_BIT, 0,
1647*4882a593Smuzhiyun rt5682_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1648*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("Vref2", SND_SOC_NOPM, 0, 0, NULL, 0),
1649*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS", SND_SOC_NOPM, 0, 0, NULL, 0),
1650*4882a593Smuzhiyun
1651*4882a593Smuzhiyun /* ASRC */
1652*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682_PLL_TRACK_1,
1653*4882a593Smuzhiyun RT5682_DAC_STO1_ASRC_SFT, 0, NULL, 0),
1654*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5682_PLL_TRACK_1,
1655*4882a593Smuzhiyun RT5682_ADC_STO1_ASRC_SFT, 0, NULL, 0),
1656*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("AD ASRC", 1, RT5682_PLL_TRACK_1,
1657*4882a593Smuzhiyun RT5682_AD_ASRC_SFT, 0, NULL, 0),
1658*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DA ASRC", 1, RT5682_PLL_TRACK_1,
1659*4882a593Smuzhiyun RT5682_DA_ASRC_SFT, 0, NULL, 0),
1660*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DMIC ASRC", 1, RT5682_PLL_TRACK_1,
1661*4882a593Smuzhiyun RT5682_DMIC_ASRC_SFT, 0, NULL, 0),
1662*4882a593Smuzhiyun
1663*4882a593Smuzhiyun /* Input Side */
1664*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5682_PWR_ANLG_2, RT5682_PWR_MB1_BIT,
1665*4882a593Smuzhiyun 0, NULL, 0),
1666*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5682_PWR_ANLG_2, RT5682_PWR_MB2_BIT,
1667*4882a593Smuzhiyun 0, NULL, 0),
1668*4882a593Smuzhiyun
1669*4882a593Smuzhiyun /* Input Lines */
1670*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("DMIC L1"),
1671*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("DMIC R1"),
1672*4882a593Smuzhiyun
1673*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN1P"),
1674*4882a593Smuzhiyun
1675*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
1676*4882a593Smuzhiyun set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
1677*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5682_DMIC_CTRL_1,
1678*4882a593Smuzhiyun RT5682_DMIC_1_EN_SFT, 0, set_dmic_power,
1679*4882a593Smuzhiyun SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
1680*4882a593Smuzhiyun
1681*4882a593Smuzhiyun /* Boost */
1682*4882a593Smuzhiyun SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM,
1683*4882a593Smuzhiyun 0, 0, NULL, 0),
1684*4882a593Smuzhiyun
1685*4882a593Smuzhiyun /* REC Mixer */
1686*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682_rec1_l_mix,
1687*4882a593Smuzhiyun ARRAY_SIZE(rt5682_rec1_l_mix)),
1688*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5682_PWR_ANLG_2,
1689*4882a593Smuzhiyun RT5682_PWR_RM1_L_BIT, 0, NULL, 0),
1690*4882a593Smuzhiyun
1691*4882a593Smuzhiyun /* ADCs */
1692*4882a593Smuzhiyun SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),
1693*4882a593Smuzhiyun SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),
1694*4882a593Smuzhiyun
1695*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5682_PWR_DIG_1,
1696*4882a593Smuzhiyun RT5682_PWR_ADC_L1_BIT, 0, NULL, 0),
1697*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5682_PWR_DIG_1,
1698*4882a593Smuzhiyun RT5682_PWR_ADC_R1_BIT, 0, NULL, 0),
1699*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5682_CHOP_ADC,
1700*4882a593Smuzhiyun RT5682_CKGEN_ADC1_SFT, 0, NULL, 0),
1701*4882a593Smuzhiyun
1702*4882a593Smuzhiyun /* ADC Mux */
1703*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
1704*4882a593Smuzhiyun &rt5682_sto1_adc1l_mux),
1705*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
1706*4882a593Smuzhiyun &rt5682_sto1_adc1r_mux),
1707*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
1708*4882a593Smuzhiyun &rt5682_sto1_adc2l_mux),
1709*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
1710*4882a593Smuzhiyun &rt5682_sto1_adc2r_mux),
1711*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,
1712*4882a593Smuzhiyun &rt5682_sto1_adcl_mux),
1713*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,
1714*4882a593Smuzhiyun &rt5682_sto1_adcr_mux),
1715*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1_ADC Mux", SND_SOC_NOPM, 0, 0,
1716*4882a593Smuzhiyun &rt5682_if1_adc_slot_mux),
1717*4882a593Smuzhiyun
1718*4882a593Smuzhiyun /* ADC Mixer */
1719*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682_PWR_DIG_2,
1720*4882a593Smuzhiyun RT5682_PWR_ADC_S1F_BIT, 0, set_filter_clk,
1721*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU),
1722*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", RT5682_STO1_ADC_DIG_VOL,
1723*4882a593Smuzhiyun RT5682_L_MUTE_SFT, 1, rt5682_sto1_adc_l_mix,
1724*4882a593Smuzhiyun ARRAY_SIZE(rt5682_sto1_adc_l_mix)),
1725*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5682_STO1_ADC_DIG_VOL,
1726*4882a593Smuzhiyun RT5682_R_MUTE_SFT, 1, rt5682_sto1_adc_r_mix,
1727*4882a593Smuzhiyun ARRAY_SIZE(rt5682_sto1_adc_r_mix)),
1728*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("BTN Detection Mode", RT5682_SAR_IL_CMD_1,
1729*4882a593Smuzhiyun 14, 1, NULL, 0),
1730*4882a593Smuzhiyun
1731*4882a593Smuzhiyun /* ADC PGA */
1732*4882a593Smuzhiyun SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
1733*4882a593Smuzhiyun
1734*4882a593Smuzhiyun /* Digital Interface */
1735*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("I2S1", RT5682_PWR_DIG_1, RT5682_PWR_I2S1_BIT,
1736*4882a593Smuzhiyun 0, NULL, 0),
1737*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("I2S2", RT5682_PWR_DIG_1, RT5682_PWR_I2S2_BIT,
1738*4882a593Smuzhiyun 0, NULL, 0),
1739*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
1740*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
1741*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
1742*4882a593Smuzhiyun SND_SOC_DAPM_PGA("SOUND DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1743*4882a593Smuzhiyun SND_SOC_DAPM_PGA("SOUND DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1744*4882a593Smuzhiyun
1745*4882a593Smuzhiyun /* Digital Interface Select */
1746*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
1747*4882a593Smuzhiyun &rt5682_if1_01_adc_swap_mux),
1748*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
1749*4882a593Smuzhiyun &rt5682_if1_23_adc_swap_mux),
1750*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
1751*4882a593Smuzhiyun &rt5682_if1_45_adc_swap_mux),
1752*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
1753*4882a593Smuzhiyun &rt5682_if1_67_adc_swap_mux),
1754*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
1755*4882a593Smuzhiyun &rt5682_if2_adc_swap_mux),
1756*4882a593Smuzhiyun
1757*4882a593Smuzhiyun SND_SOC_DAPM_MUX("ADCDAT Mux", SND_SOC_NOPM, 0, 0,
1758*4882a593Smuzhiyun &rt5682_adcdat_pin_ctrl),
1759*4882a593Smuzhiyun
1760*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC L Mux", SND_SOC_NOPM, 0, 0,
1761*4882a593Smuzhiyun &rt5682_dac_l_mux),
1762*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC R Mux", SND_SOC_NOPM, 0, 0,
1763*4882a593Smuzhiyun &rt5682_dac_r_mux),
1764*4882a593Smuzhiyun
1765*4882a593Smuzhiyun /* Audio Interface */
1766*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0,
1767*4882a593Smuzhiyun RT5682_I2S1_SDP, RT5682_SEL_ADCDAT_SFT, 1),
1768*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0,
1769*4882a593Smuzhiyun RT5682_I2S2_SDP, RT5682_I2S2_PIN_CFG_SFT, 1),
1770*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
1771*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("SDWRX", "SDW Playback", 0, SND_SOC_NOPM, 0, 0),
1772*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("SDWTX", "SDW Capture", 0, SND_SOC_NOPM, 0, 0),
1773*4882a593Smuzhiyun
1774*4882a593Smuzhiyun /* Output Side */
1775*4882a593Smuzhiyun /* DAC mixer before sound effect */
1776*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
1777*4882a593Smuzhiyun rt5682_dac_l_mix, ARRAY_SIZE(rt5682_dac_l_mix)),
1778*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
1779*4882a593Smuzhiyun rt5682_dac_r_mix, ARRAY_SIZE(rt5682_dac_r_mix)),
1780*4882a593Smuzhiyun
1781*4882a593Smuzhiyun /* DAC channel Mux */
1782*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0,
1783*4882a593Smuzhiyun &rt5682_alg_dac_l1_mux),
1784*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0,
1785*4882a593Smuzhiyun &rt5682_alg_dac_r1_mux),
1786*4882a593Smuzhiyun
1787*4882a593Smuzhiyun /* DAC Mixer */
1788*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5682_PWR_DIG_2,
1789*4882a593Smuzhiyun RT5682_PWR_DAC_S1F_BIT, 0, set_filter_clk,
1790*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU),
1791*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0,
1792*4882a593Smuzhiyun rt5682_sto1_dac_l_mix, ARRAY_SIZE(rt5682_sto1_dac_l_mix)),
1793*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0,
1794*4882a593Smuzhiyun rt5682_sto1_dac_r_mix, ARRAY_SIZE(rt5682_sto1_dac_r_mix)),
1795*4882a593Smuzhiyun
1796*4882a593Smuzhiyun /* DACs */
1797*4882a593Smuzhiyun SND_SOC_DAPM_DAC("DAC L1", NULL, RT5682_PWR_DIG_1,
1798*4882a593Smuzhiyun RT5682_PWR_DAC_L1_BIT, 0),
1799*4882a593Smuzhiyun SND_SOC_DAPM_DAC("DAC R1", NULL, RT5682_PWR_DIG_1,
1800*4882a593Smuzhiyun RT5682_PWR_DAC_R1_BIT, 0),
1801*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DAC 1 Clock", 3, RT5682_CHOP_DAC,
1802*4882a593Smuzhiyun RT5682_CKGEN_DAC1_SFT, 0, NULL, 0),
1803*4882a593Smuzhiyun
1804*4882a593Smuzhiyun /* HPO */
1805*4882a593Smuzhiyun SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5682_hp_event,
1806*4882a593Smuzhiyun SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU),
1807*4882a593Smuzhiyun
1808*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("HP Amp L", RT5682_PWR_ANLG_1,
1809*4882a593Smuzhiyun RT5682_PWR_HA_L_BIT, 0, NULL, 0),
1810*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("HP Amp R", RT5682_PWR_ANLG_1,
1811*4882a593Smuzhiyun RT5682_PWR_HA_R_BIT, 0, NULL, 0),
1812*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, RT5682_DEPOP_1,
1813*4882a593Smuzhiyun RT5682_PUMP_EN_SFT, 0, NULL, 0),
1814*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("Capless", 2, RT5682_DEPOP_1,
1815*4882a593Smuzhiyun RT5682_CAPLESS_EN_SFT, 0, NULL, 0),
1816*4882a593Smuzhiyun
1817*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("HPOL Playback", SND_SOC_NOPM, 0, 0,
1818*4882a593Smuzhiyun &hpol_switch),
1819*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("HPOR Playback", SND_SOC_NOPM, 0, 0,
1820*4882a593Smuzhiyun &hpor_switch),
1821*4882a593Smuzhiyun
1822*4882a593Smuzhiyun /* CLK DET */
1823*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682_CLK_DET,
1824*4882a593Smuzhiyun RT5682_SYS_CLK_DET_SFT, 0, NULL, 0),
1825*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("CLKDET PLL1", RT5682_CLK_DET,
1826*4882a593Smuzhiyun RT5682_PLL1_CLK_DET_SFT, 0, NULL, 0),
1827*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("CLKDET PLL2", RT5682_CLK_DET,
1828*4882a593Smuzhiyun RT5682_PLL2_CLK_DET_SFT, 0, NULL, 0),
1829*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("CLKDET", RT5682_CLK_DET,
1830*4882a593Smuzhiyun RT5682_POW_CLK_DET_SFT, 0, NULL, 0),
1831*4882a593Smuzhiyun
1832*4882a593Smuzhiyun /* Output Lines */
1833*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("HPOL"),
1834*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("HPOR"),
1835*4882a593Smuzhiyun };
1836*4882a593Smuzhiyun
1837*4882a593Smuzhiyun static const struct snd_soc_dapm_route rt5682_dapm_routes[] = {
1838*4882a593Smuzhiyun /*PLL*/
1839*4882a593Smuzhiyun {"ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1},
1840*4882a593Smuzhiyun {"ADC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2},
1841*4882a593Smuzhiyun {"ADC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2},
1842*4882a593Smuzhiyun {"DAC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1},
1843*4882a593Smuzhiyun {"DAC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2},
1844*4882a593Smuzhiyun {"DAC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2},
1845*4882a593Smuzhiyun
1846*4882a593Smuzhiyun /*ASRC*/
1847*4882a593Smuzhiyun {"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc},
1848*4882a593Smuzhiyun {"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},
1849*4882a593Smuzhiyun {"ADC STO1 ASRC", NULL, "AD ASRC"},
1850*4882a593Smuzhiyun {"ADC STO1 ASRC", NULL, "DA ASRC"},
1851*4882a593Smuzhiyun {"ADC STO1 ASRC", NULL, "CLKDET"},
1852*4882a593Smuzhiyun {"DAC STO1 ASRC", NULL, "AD ASRC"},
1853*4882a593Smuzhiyun {"DAC STO1 ASRC", NULL, "DA ASRC"},
1854*4882a593Smuzhiyun {"DAC STO1 ASRC", NULL, "CLKDET"},
1855*4882a593Smuzhiyun
1856*4882a593Smuzhiyun /*Vref*/
1857*4882a593Smuzhiyun {"MICBIAS1", NULL, "Vref1"},
1858*4882a593Smuzhiyun {"MICBIAS2", NULL, "Vref1"},
1859*4882a593Smuzhiyun
1860*4882a593Smuzhiyun {"CLKDET SYS", NULL, "CLKDET"},
1861*4882a593Smuzhiyun
1862*4882a593Smuzhiyun {"IN1P", NULL, "LDO2"},
1863*4882a593Smuzhiyun
1864*4882a593Smuzhiyun {"BST1 CBJ", NULL, "IN1P"},
1865*4882a593Smuzhiyun
1866*4882a593Smuzhiyun {"RECMIX1L", "CBJ Switch", "BST1 CBJ"},
1867*4882a593Smuzhiyun {"RECMIX1L", NULL, "RECMIX1L Power"},
1868*4882a593Smuzhiyun
1869*4882a593Smuzhiyun {"ADC1 L", NULL, "RECMIX1L"},
1870*4882a593Smuzhiyun {"ADC1 L", NULL, "ADC1 L Power"},
1871*4882a593Smuzhiyun {"ADC1 L", NULL, "ADC1 clock"},
1872*4882a593Smuzhiyun
1873*4882a593Smuzhiyun {"DMIC L1", NULL, "DMIC CLK"},
1874*4882a593Smuzhiyun {"DMIC L1", NULL, "DMIC1 Power"},
1875*4882a593Smuzhiyun {"DMIC R1", NULL, "DMIC CLK"},
1876*4882a593Smuzhiyun {"DMIC R1", NULL, "DMIC1 Power"},
1877*4882a593Smuzhiyun {"DMIC CLK", NULL, "DMIC ASRC"},
1878*4882a593Smuzhiyun
1879*4882a593Smuzhiyun {"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"},
1880*4882a593Smuzhiyun {"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"},
1881*4882a593Smuzhiyun {"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"},
1882*4882a593Smuzhiyun {"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"},
1883*4882a593Smuzhiyun
1884*4882a593Smuzhiyun {"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"},
1885*4882a593Smuzhiyun {"Stereo1 ADC L1 Mux", "DAC MIX", "Stereo1 DAC MIXL"},
1886*4882a593Smuzhiyun {"Stereo1 ADC L2 Mux", "DMIC", "DMIC L1"},
1887*4882a593Smuzhiyun {"Stereo1 ADC L2 Mux", "DAC MIX", "Stereo1 DAC MIXL"},
1888*4882a593Smuzhiyun
1889*4882a593Smuzhiyun {"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"},
1890*4882a593Smuzhiyun {"Stereo1 ADC R1 Mux", "DAC MIX", "Stereo1 DAC MIXR"},
1891*4882a593Smuzhiyun {"Stereo1 ADC R2 Mux", "DMIC", "DMIC R1"},
1892*4882a593Smuzhiyun {"Stereo1 ADC R2 Mux", "DAC MIX", "Stereo1 DAC MIXR"},
1893*4882a593Smuzhiyun
1894*4882a593Smuzhiyun {"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"},
1895*4882a593Smuzhiyun {"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"},
1896*4882a593Smuzhiyun {"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"},
1897*4882a593Smuzhiyun
1898*4882a593Smuzhiyun {"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"},
1899*4882a593Smuzhiyun {"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"},
1900*4882a593Smuzhiyun {"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"},
1901*4882a593Smuzhiyun
1902*4882a593Smuzhiyun {"ADC Stereo1 Filter", NULL, "BTN Detection Mode"},
1903*4882a593Smuzhiyun
1904*4882a593Smuzhiyun {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"},
1905*4882a593Smuzhiyun {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"},
1906*4882a593Smuzhiyun
1907*4882a593Smuzhiyun {"IF1 01 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
1908*4882a593Smuzhiyun {"IF1 01 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
1909*4882a593Smuzhiyun {"IF1 01 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
1910*4882a593Smuzhiyun {"IF1 01 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
1911*4882a593Smuzhiyun {"IF1 23 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
1912*4882a593Smuzhiyun {"IF1 23 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
1913*4882a593Smuzhiyun {"IF1 23 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
1914*4882a593Smuzhiyun {"IF1 23 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
1915*4882a593Smuzhiyun {"IF1 45 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
1916*4882a593Smuzhiyun {"IF1 45 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
1917*4882a593Smuzhiyun {"IF1 45 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
1918*4882a593Smuzhiyun {"IF1 45 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
1919*4882a593Smuzhiyun {"IF1 67 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
1920*4882a593Smuzhiyun {"IF1 67 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
1921*4882a593Smuzhiyun {"IF1 67 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
1922*4882a593Smuzhiyun {"IF1 67 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
1923*4882a593Smuzhiyun
1924*4882a593Smuzhiyun {"IF1_ADC Mux", "Slot 0", "IF1 01 ADC Swap Mux"},
1925*4882a593Smuzhiyun {"IF1_ADC Mux", "Slot 2", "IF1 23 ADC Swap Mux"},
1926*4882a593Smuzhiyun {"IF1_ADC Mux", "Slot 4", "IF1 45 ADC Swap Mux"},
1927*4882a593Smuzhiyun {"IF1_ADC Mux", "Slot 6", "IF1 67 ADC Swap Mux"},
1928*4882a593Smuzhiyun {"ADCDAT Mux", "ADCDAT1", "IF1_ADC Mux"},
1929*4882a593Smuzhiyun {"AIF1TX", NULL, "I2S1"},
1930*4882a593Smuzhiyun {"AIF1TX", NULL, "ADCDAT Mux"},
1931*4882a593Smuzhiyun {"IF2 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
1932*4882a593Smuzhiyun {"IF2 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
1933*4882a593Smuzhiyun {"IF2 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
1934*4882a593Smuzhiyun {"IF2 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
1935*4882a593Smuzhiyun {"ADCDAT Mux", "ADCDAT2", "IF2 ADC Swap Mux"},
1936*4882a593Smuzhiyun {"AIF2TX", NULL, "ADCDAT Mux"},
1937*4882a593Smuzhiyun
1938*4882a593Smuzhiyun {"SDWTX", NULL, "PLL2B"},
1939*4882a593Smuzhiyun {"SDWTX", NULL, "PLL2F"},
1940*4882a593Smuzhiyun {"SDWTX", NULL, "ADCDAT Mux"},
1941*4882a593Smuzhiyun
1942*4882a593Smuzhiyun {"IF1 DAC1 L", NULL, "AIF1RX"},
1943*4882a593Smuzhiyun {"IF1 DAC1 L", NULL, "I2S1"},
1944*4882a593Smuzhiyun {"IF1 DAC1 L", NULL, "DAC Stereo1 Filter"},
1945*4882a593Smuzhiyun {"IF1 DAC1 R", NULL, "AIF1RX"},
1946*4882a593Smuzhiyun {"IF1 DAC1 R", NULL, "I2S1"},
1947*4882a593Smuzhiyun {"IF1 DAC1 R", NULL, "DAC Stereo1 Filter"},
1948*4882a593Smuzhiyun
1949*4882a593Smuzhiyun {"SOUND DAC L", NULL, "SDWRX"},
1950*4882a593Smuzhiyun {"SOUND DAC L", NULL, "DAC Stereo1 Filter"},
1951*4882a593Smuzhiyun {"SOUND DAC L", NULL, "PLL2B"},
1952*4882a593Smuzhiyun {"SOUND DAC L", NULL, "PLL2F"},
1953*4882a593Smuzhiyun {"SOUND DAC R", NULL, "SDWRX"},
1954*4882a593Smuzhiyun {"SOUND DAC R", NULL, "DAC Stereo1 Filter"},
1955*4882a593Smuzhiyun {"SOUND DAC R", NULL, "PLL2B"},
1956*4882a593Smuzhiyun {"SOUND DAC R", NULL, "PLL2F"},
1957*4882a593Smuzhiyun
1958*4882a593Smuzhiyun {"DAC L Mux", "IF1", "IF1 DAC1 L"},
1959*4882a593Smuzhiyun {"DAC L Mux", "SOUND", "SOUND DAC L"},
1960*4882a593Smuzhiyun {"DAC R Mux", "IF1", "IF1 DAC1 R"},
1961*4882a593Smuzhiyun {"DAC R Mux", "SOUND", "SOUND DAC R"},
1962*4882a593Smuzhiyun
1963*4882a593Smuzhiyun {"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},
1964*4882a593Smuzhiyun {"DAC1 MIXL", "DAC1 Switch", "DAC L Mux"},
1965*4882a593Smuzhiyun {"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},
1966*4882a593Smuzhiyun {"DAC1 MIXR", "DAC1 Switch", "DAC R Mux"},
1967*4882a593Smuzhiyun
1968*4882a593Smuzhiyun {"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
1969*4882a593Smuzhiyun {"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},
1970*4882a593Smuzhiyun
1971*4882a593Smuzhiyun {"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
1972*4882a593Smuzhiyun {"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},
1973*4882a593Smuzhiyun
1974*4882a593Smuzhiyun {"DAC L1 Source", "DAC1", "DAC1 MIXL"},
1975*4882a593Smuzhiyun {"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},
1976*4882a593Smuzhiyun {"DAC R1 Source", "DAC1", "DAC1 MIXR"},
1977*4882a593Smuzhiyun {"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},
1978*4882a593Smuzhiyun
1979*4882a593Smuzhiyun {"DAC L1", NULL, "DAC L1 Source"},
1980*4882a593Smuzhiyun {"DAC R1", NULL, "DAC R1 Source"},
1981*4882a593Smuzhiyun
1982*4882a593Smuzhiyun {"DAC L1", NULL, "DAC 1 Clock"},
1983*4882a593Smuzhiyun {"DAC R1", NULL, "DAC 1 Clock"},
1984*4882a593Smuzhiyun
1985*4882a593Smuzhiyun {"HP Amp", NULL, "DAC L1"},
1986*4882a593Smuzhiyun {"HP Amp", NULL, "DAC R1"},
1987*4882a593Smuzhiyun {"HP Amp", NULL, "HP Amp L"},
1988*4882a593Smuzhiyun {"HP Amp", NULL, "HP Amp R"},
1989*4882a593Smuzhiyun {"HP Amp", NULL, "Capless"},
1990*4882a593Smuzhiyun {"HP Amp", NULL, "Charge Pump"},
1991*4882a593Smuzhiyun {"HP Amp", NULL, "CLKDET SYS"},
1992*4882a593Smuzhiyun {"HP Amp", NULL, "Vref1"},
1993*4882a593Smuzhiyun {"HPOL Playback", "Switch", "HP Amp"},
1994*4882a593Smuzhiyun {"HPOR Playback", "Switch", "HP Amp"},
1995*4882a593Smuzhiyun {"HPOL", NULL, "HPOL Playback"},
1996*4882a593Smuzhiyun {"HPOR", NULL, "HPOR Playback"},
1997*4882a593Smuzhiyun };
1998*4882a593Smuzhiyun
rt5682_set_tdm_slot(struct snd_soc_dai * dai,unsigned int tx_mask,unsigned int rx_mask,int slots,int slot_width)1999*4882a593Smuzhiyun static int rt5682_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
2000*4882a593Smuzhiyun unsigned int rx_mask, int slots, int slot_width)
2001*4882a593Smuzhiyun {
2002*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
2003*4882a593Smuzhiyun unsigned int cl, val = 0;
2004*4882a593Smuzhiyun
2005*4882a593Smuzhiyun if (tx_mask || rx_mask)
2006*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2,
2007*4882a593Smuzhiyun RT5682_TDM_EN, RT5682_TDM_EN);
2008*4882a593Smuzhiyun else
2009*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2,
2010*4882a593Smuzhiyun RT5682_TDM_EN, 0);
2011*4882a593Smuzhiyun
2012*4882a593Smuzhiyun switch (slots) {
2013*4882a593Smuzhiyun case 4:
2014*4882a593Smuzhiyun val |= RT5682_TDM_TX_CH_4;
2015*4882a593Smuzhiyun val |= RT5682_TDM_RX_CH_4;
2016*4882a593Smuzhiyun break;
2017*4882a593Smuzhiyun case 6:
2018*4882a593Smuzhiyun val |= RT5682_TDM_TX_CH_6;
2019*4882a593Smuzhiyun val |= RT5682_TDM_RX_CH_6;
2020*4882a593Smuzhiyun break;
2021*4882a593Smuzhiyun case 8:
2022*4882a593Smuzhiyun val |= RT5682_TDM_TX_CH_8;
2023*4882a593Smuzhiyun val |= RT5682_TDM_RX_CH_8;
2024*4882a593Smuzhiyun break;
2025*4882a593Smuzhiyun case 2:
2026*4882a593Smuzhiyun break;
2027*4882a593Smuzhiyun default:
2028*4882a593Smuzhiyun return -EINVAL;
2029*4882a593Smuzhiyun }
2030*4882a593Smuzhiyun
2031*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_CTRL,
2032*4882a593Smuzhiyun RT5682_TDM_TX_CH_MASK | RT5682_TDM_RX_CH_MASK, val);
2033*4882a593Smuzhiyun
2034*4882a593Smuzhiyun switch (slot_width) {
2035*4882a593Smuzhiyun case 8:
2036*4882a593Smuzhiyun if (tx_mask || rx_mask)
2037*4882a593Smuzhiyun return -EINVAL;
2038*4882a593Smuzhiyun cl = RT5682_I2S1_TX_CHL_8 | RT5682_I2S1_RX_CHL_8;
2039*4882a593Smuzhiyun break;
2040*4882a593Smuzhiyun case 16:
2041*4882a593Smuzhiyun val = RT5682_TDM_CL_16;
2042*4882a593Smuzhiyun cl = RT5682_I2S1_TX_CHL_16 | RT5682_I2S1_RX_CHL_16;
2043*4882a593Smuzhiyun break;
2044*4882a593Smuzhiyun case 20:
2045*4882a593Smuzhiyun val = RT5682_TDM_CL_20;
2046*4882a593Smuzhiyun cl = RT5682_I2S1_TX_CHL_20 | RT5682_I2S1_RX_CHL_20;
2047*4882a593Smuzhiyun break;
2048*4882a593Smuzhiyun case 24:
2049*4882a593Smuzhiyun val = RT5682_TDM_CL_24;
2050*4882a593Smuzhiyun cl = RT5682_I2S1_TX_CHL_24 | RT5682_I2S1_RX_CHL_24;
2051*4882a593Smuzhiyun break;
2052*4882a593Smuzhiyun case 32:
2053*4882a593Smuzhiyun val = RT5682_TDM_CL_32;
2054*4882a593Smuzhiyun cl = RT5682_I2S1_TX_CHL_32 | RT5682_I2S1_RX_CHL_32;
2055*4882a593Smuzhiyun break;
2056*4882a593Smuzhiyun default:
2057*4882a593Smuzhiyun return -EINVAL;
2058*4882a593Smuzhiyun }
2059*4882a593Smuzhiyun
2060*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
2061*4882a593Smuzhiyun RT5682_TDM_CL_MASK, val);
2062*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
2063*4882a593Smuzhiyun RT5682_I2S1_TX_CHL_MASK | RT5682_I2S1_RX_CHL_MASK, cl);
2064*4882a593Smuzhiyun
2065*4882a593Smuzhiyun return 0;
2066*4882a593Smuzhiyun }
2067*4882a593Smuzhiyun
rt5682_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)2068*4882a593Smuzhiyun static int rt5682_hw_params(struct snd_pcm_substream *substream,
2069*4882a593Smuzhiyun struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
2070*4882a593Smuzhiyun {
2071*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
2072*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2073*4882a593Smuzhiyun unsigned int len_1 = 0, len_2 = 0;
2074*4882a593Smuzhiyun int pre_div, frame_size;
2075*4882a593Smuzhiyun
2076*4882a593Smuzhiyun rt5682->lrck[dai->id] = params_rate(params);
2077*4882a593Smuzhiyun pre_div = rl6231_get_clk_info(rt5682->sysclk, rt5682->lrck[dai->id]);
2078*4882a593Smuzhiyun
2079*4882a593Smuzhiyun frame_size = snd_soc_params_to_frame_size(params);
2080*4882a593Smuzhiyun if (frame_size < 0) {
2081*4882a593Smuzhiyun dev_err(component->dev, "Unsupported frame size: %d\n",
2082*4882a593Smuzhiyun frame_size);
2083*4882a593Smuzhiyun return -EINVAL;
2084*4882a593Smuzhiyun }
2085*4882a593Smuzhiyun
2086*4882a593Smuzhiyun dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n",
2087*4882a593Smuzhiyun rt5682->lrck[dai->id], pre_div, dai->id);
2088*4882a593Smuzhiyun
2089*4882a593Smuzhiyun switch (params_width(params)) {
2090*4882a593Smuzhiyun case 16:
2091*4882a593Smuzhiyun break;
2092*4882a593Smuzhiyun case 20:
2093*4882a593Smuzhiyun len_1 |= RT5682_I2S1_DL_20;
2094*4882a593Smuzhiyun len_2 |= RT5682_I2S2_DL_20;
2095*4882a593Smuzhiyun break;
2096*4882a593Smuzhiyun case 24:
2097*4882a593Smuzhiyun len_1 |= RT5682_I2S1_DL_24;
2098*4882a593Smuzhiyun len_2 |= RT5682_I2S2_DL_24;
2099*4882a593Smuzhiyun break;
2100*4882a593Smuzhiyun case 32:
2101*4882a593Smuzhiyun len_1 |= RT5682_I2S1_DL_32;
2102*4882a593Smuzhiyun len_2 |= RT5682_I2S2_DL_24;
2103*4882a593Smuzhiyun break;
2104*4882a593Smuzhiyun case 8:
2105*4882a593Smuzhiyun len_1 |= RT5682_I2S2_DL_8;
2106*4882a593Smuzhiyun len_2 |= RT5682_I2S2_DL_8;
2107*4882a593Smuzhiyun break;
2108*4882a593Smuzhiyun default:
2109*4882a593Smuzhiyun return -EINVAL;
2110*4882a593Smuzhiyun }
2111*4882a593Smuzhiyun
2112*4882a593Smuzhiyun switch (dai->id) {
2113*4882a593Smuzhiyun case RT5682_AIF1:
2114*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
2115*4882a593Smuzhiyun RT5682_I2S1_DL_MASK, len_1);
2116*4882a593Smuzhiyun if (rt5682->master[RT5682_AIF1]) {
2117*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2118*4882a593Smuzhiyun RT5682_ADDA_CLK_1, RT5682_I2S_M_DIV_MASK |
2119*4882a593Smuzhiyun RT5682_I2S_CLK_SRC_MASK,
2120*4882a593Smuzhiyun pre_div << RT5682_I2S_M_DIV_SFT |
2121*4882a593Smuzhiyun (rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT);
2122*4882a593Smuzhiyun }
2123*4882a593Smuzhiyun if (params_channels(params) == 1) /* mono mode */
2124*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2125*4882a593Smuzhiyun RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK,
2126*4882a593Smuzhiyun RT5682_I2S1_MONO_EN);
2127*4882a593Smuzhiyun else
2128*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2129*4882a593Smuzhiyun RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK,
2130*4882a593Smuzhiyun RT5682_I2S1_MONO_DIS);
2131*4882a593Smuzhiyun break;
2132*4882a593Smuzhiyun case RT5682_AIF2:
2133*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_I2S2_SDP,
2134*4882a593Smuzhiyun RT5682_I2S2_DL_MASK, len_2);
2135*4882a593Smuzhiyun if (rt5682->master[RT5682_AIF2]) {
2136*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2137*4882a593Smuzhiyun RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_M_PD_MASK,
2138*4882a593Smuzhiyun pre_div << RT5682_I2S2_M_PD_SFT);
2139*4882a593Smuzhiyun }
2140*4882a593Smuzhiyun if (params_channels(params) == 1) /* mono mode */
2141*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2142*4882a593Smuzhiyun RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK,
2143*4882a593Smuzhiyun RT5682_I2S2_MONO_EN);
2144*4882a593Smuzhiyun else
2145*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2146*4882a593Smuzhiyun RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK,
2147*4882a593Smuzhiyun RT5682_I2S2_MONO_DIS);
2148*4882a593Smuzhiyun break;
2149*4882a593Smuzhiyun default:
2150*4882a593Smuzhiyun dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
2151*4882a593Smuzhiyun return -EINVAL;
2152*4882a593Smuzhiyun }
2153*4882a593Smuzhiyun
2154*4882a593Smuzhiyun return 0;
2155*4882a593Smuzhiyun }
2156*4882a593Smuzhiyun
rt5682_set_dai_fmt(struct snd_soc_dai * dai,unsigned int fmt)2157*4882a593Smuzhiyun static int rt5682_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2158*4882a593Smuzhiyun {
2159*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
2160*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2161*4882a593Smuzhiyun unsigned int reg_val = 0, tdm_ctrl = 0;
2162*4882a593Smuzhiyun
2163*4882a593Smuzhiyun switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
2164*4882a593Smuzhiyun case SND_SOC_DAIFMT_CBM_CFM:
2165*4882a593Smuzhiyun rt5682->master[dai->id] = 1;
2166*4882a593Smuzhiyun break;
2167*4882a593Smuzhiyun case SND_SOC_DAIFMT_CBS_CFS:
2168*4882a593Smuzhiyun rt5682->master[dai->id] = 0;
2169*4882a593Smuzhiyun break;
2170*4882a593Smuzhiyun default:
2171*4882a593Smuzhiyun return -EINVAL;
2172*4882a593Smuzhiyun }
2173*4882a593Smuzhiyun
2174*4882a593Smuzhiyun switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
2175*4882a593Smuzhiyun case SND_SOC_DAIFMT_NB_NF:
2176*4882a593Smuzhiyun break;
2177*4882a593Smuzhiyun case SND_SOC_DAIFMT_IB_NF:
2178*4882a593Smuzhiyun reg_val |= RT5682_I2S_BP_INV;
2179*4882a593Smuzhiyun tdm_ctrl |= RT5682_TDM_S_BP_INV;
2180*4882a593Smuzhiyun break;
2181*4882a593Smuzhiyun case SND_SOC_DAIFMT_NB_IF:
2182*4882a593Smuzhiyun if (dai->id == RT5682_AIF1)
2183*4882a593Smuzhiyun tdm_ctrl |= RT5682_TDM_S_LP_INV | RT5682_TDM_M_BP_INV;
2184*4882a593Smuzhiyun else
2185*4882a593Smuzhiyun return -EINVAL;
2186*4882a593Smuzhiyun break;
2187*4882a593Smuzhiyun case SND_SOC_DAIFMT_IB_IF:
2188*4882a593Smuzhiyun if (dai->id == RT5682_AIF1)
2189*4882a593Smuzhiyun tdm_ctrl |= RT5682_TDM_S_BP_INV | RT5682_TDM_S_LP_INV |
2190*4882a593Smuzhiyun RT5682_TDM_M_BP_INV | RT5682_TDM_M_LP_INV;
2191*4882a593Smuzhiyun else
2192*4882a593Smuzhiyun return -EINVAL;
2193*4882a593Smuzhiyun break;
2194*4882a593Smuzhiyun default:
2195*4882a593Smuzhiyun return -EINVAL;
2196*4882a593Smuzhiyun }
2197*4882a593Smuzhiyun
2198*4882a593Smuzhiyun switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
2199*4882a593Smuzhiyun case SND_SOC_DAIFMT_I2S:
2200*4882a593Smuzhiyun break;
2201*4882a593Smuzhiyun case SND_SOC_DAIFMT_LEFT_J:
2202*4882a593Smuzhiyun reg_val |= RT5682_I2S_DF_LEFT;
2203*4882a593Smuzhiyun tdm_ctrl |= RT5682_TDM_DF_LEFT;
2204*4882a593Smuzhiyun break;
2205*4882a593Smuzhiyun case SND_SOC_DAIFMT_DSP_A:
2206*4882a593Smuzhiyun reg_val |= RT5682_I2S_DF_PCM_A;
2207*4882a593Smuzhiyun tdm_ctrl |= RT5682_TDM_DF_PCM_A;
2208*4882a593Smuzhiyun break;
2209*4882a593Smuzhiyun case SND_SOC_DAIFMT_DSP_B:
2210*4882a593Smuzhiyun reg_val |= RT5682_I2S_DF_PCM_B;
2211*4882a593Smuzhiyun tdm_ctrl |= RT5682_TDM_DF_PCM_B;
2212*4882a593Smuzhiyun break;
2213*4882a593Smuzhiyun default:
2214*4882a593Smuzhiyun return -EINVAL;
2215*4882a593Smuzhiyun }
2216*4882a593Smuzhiyun
2217*4882a593Smuzhiyun switch (dai->id) {
2218*4882a593Smuzhiyun case RT5682_AIF1:
2219*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
2220*4882a593Smuzhiyun RT5682_I2S_DF_MASK, reg_val);
2221*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
2222*4882a593Smuzhiyun RT5682_TDM_MS_MASK | RT5682_TDM_S_BP_MASK |
2223*4882a593Smuzhiyun RT5682_TDM_DF_MASK | RT5682_TDM_M_BP_MASK |
2224*4882a593Smuzhiyun RT5682_TDM_M_LP_MASK | RT5682_TDM_S_LP_MASK,
2225*4882a593Smuzhiyun tdm_ctrl | rt5682->master[dai->id]);
2226*4882a593Smuzhiyun break;
2227*4882a593Smuzhiyun case RT5682_AIF2:
2228*4882a593Smuzhiyun if (rt5682->master[dai->id] == 0)
2229*4882a593Smuzhiyun reg_val |= RT5682_I2S2_MS_S;
2230*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_I2S2_SDP,
2231*4882a593Smuzhiyun RT5682_I2S2_MS_MASK | RT5682_I2S_BP_MASK |
2232*4882a593Smuzhiyun RT5682_I2S_DF_MASK, reg_val);
2233*4882a593Smuzhiyun break;
2234*4882a593Smuzhiyun default:
2235*4882a593Smuzhiyun dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
2236*4882a593Smuzhiyun return -EINVAL;
2237*4882a593Smuzhiyun }
2238*4882a593Smuzhiyun return 0;
2239*4882a593Smuzhiyun }
2240*4882a593Smuzhiyun
rt5682_set_component_sysclk(struct snd_soc_component * component,int clk_id,int source,unsigned int freq,int dir)2241*4882a593Smuzhiyun static int rt5682_set_component_sysclk(struct snd_soc_component *component,
2242*4882a593Smuzhiyun int clk_id, int source, unsigned int freq, int dir)
2243*4882a593Smuzhiyun {
2244*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2245*4882a593Smuzhiyun unsigned int reg_val = 0, src = 0;
2246*4882a593Smuzhiyun
2247*4882a593Smuzhiyun if (freq == rt5682->sysclk && clk_id == rt5682->sysclk_src)
2248*4882a593Smuzhiyun return 0;
2249*4882a593Smuzhiyun
2250*4882a593Smuzhiyun switch (clk_id) {
2251*4882a593Smuzhiyun case RT5682_SCLK_S_MCLK:
2252*4882a593Smuzhiyun reg_val |= RT5682_SCLK_SRC_MCLK;
2253*4882a593Smuzhiyun src = RT5682_CLK_SRC_MCLK;
2254*4882a593Smuzhiyun break;
2255*4882a593Smuzhiyun case RT5682_SCLK_S_PLL1:
2256*4882a593Smuzhiyun reg_val |= RT5682_SCLK_SRC_PLL1;
2257*4882a593Smuzhiyun src = RT5682_CLK_SRC_PLL1;
2258*4882a593Smuzhiyun break;
2259*4882a593Smuzhiyun case RT5682_SCLK_S_PLL2:
2260*4882a593Smuzhiyun reg_val |= RT5682_SCLK_SRC_PLL2;
2261*4882a593Smuzhiyun src = RT5682_CLK_SRC_PLL2;
2262*4882a593Smuzhiyun break;
2263*4882a593Smuzhiyun case RT5682_SCLK_S_RCCLK:
2264*4882a593Smuzhiyun reg_val |= RT5682_SCLK_SRC_RCCLK;
2265*4882a593Smuzhiyun src = RT5682_CLK_SRC_RCCLK;
2266*4882a593Smuzhiyun break;
2267*4882a593Smuzhiyun default:
2268*4882a593Smuzhiyun dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
2269*4882a593Smuzhiyun return -EINVAL;
2270*4882a593Smuzhiyun }
2271*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_GLB_CLK,
2272*4882a593Smuzhiyun RT5682_SCLK_SRC_MASK, reg_val);
2273*4882a593Smuzhiyun
2274*4882a593Smuzhiyun if (rt5682->master[RT5682_AIF2]) {
2275*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2276*4882a593Smuzhiyun RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_SRC_MASK,
2277*4882a593Smuzhiyun src << RT5682_I2S2_SRC_SFT);
2278*4882a593Smuzhiyun }
2279*4882a593Smuzhiyun
2280*4882a593Smuzhiyun rt5682->sysclk = freq;
2281*4882a593Smuzhiyun rt5682->sysclk_src = clk_id;
2282*4882a593Smuzhiyun
2283*4882a593Smuzhiyun dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n",
2284*4882a593Smuzhiyun freq, clk_id);
2285*4882a593Smuzhiyun
2286*4882a593Smuzhiyun return 0;
2287*4882a593Smuzhiyun }
2288*4882a593Smuzhiyun
rt5682_set_component_pll(struct snd_soc_component * component,int pll_id,int source,unsigned int freq_in,unsigned int freq_out)2289*4882a593Smuzhiyun static int rt5682_set_component_pll(struct snd_soc_component *component,
2290*4882a593Smuzhiyun int pll_id, int source, unsigned int freq_in,
2291*4882a593Smuzhiyun unsigned int freq_out)
2292*4882a593Smuzhiyun {
2293*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2294*4882a593Smuzhiyun struct rl6231_pll_code pll_code, pll2f_code, pll2b_code;
2295*4882a593Smuzhiyun unsigned int pll2_fout1, pll2_ps_val;
2296*4882a593Smuzhiyun int ret;
2297*4882a593Smuzhiyun
2298*4882a593Smuzhiyun if (source == rt5682->pll_src[pll_id] &&
2299*4882a593Smuzhiyun freq_in == rt5682->pll_in[pll_id] &&
2300*4882a593Smuzhiyun freq_out == rt5682->pll_out[pll_id])
2301*4882a593Smuzhiyun return 0;
2302*4882a593Smuzhiyun
2303*4882a593Smuzhiyun if (!freq_in || !freq_out) {
2304*4882a593Smuzhiyun dev_dbg(component->dev, "PLL disabled\n");
2305*4882a593Smuzhiyun
2306*4882a593Smuzhiyun rt5682->pll_in[pll_id] = 0;
2307*4882a593Smuzhiyun rt5682->pll_out[pll_id] = 0;
2308*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_GLB_CLK,
2309*4882a593Smuzhiyun RT5682_SCLK_SRC_MASK, RT5682_SCLK_SRC_MCLK);
2310*4882a593Smuzhiyun return 0;
2311*4882a593Smuzhiyun }
2312*4882a593Smuzhiyun
2313*4882a593Smuzhiyun if (pll_id == RT5682_PLL2) {
2314*4882a593Smuzhiyun switch (source) {
2315*4882a593Smuzhiyun case RT5682_PLL2_S_MCLK:
2316*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2317*4882a593Smuzhiyun RT5682_GLB_CLK, RT5682_PLL2_SRC_MASK,
2318*4882a593Smuzhiyun RT5682_PLL2_SRC_MCLK);
2319*4882a593Smuzhiyun break;
2320*4882a593Smuzhiyun default:
2321*4882a593Smuzhiyun dev_err(component->dev, "Unknown PLL2 Source %d\n",
2322*4882a593Smuzhiyun source);
2323*4882a593Smuzhiyun return -EINVAL;
2324*4882a593Smuzhiyun }
2325*4882a593Smuzhiyun
2326*4882a593Smuzhiyun /**
2327*4882a593Smuzhiyun * PLL2 concatenates 2 PLL units.
2328*4882a593Smuzhiyun * We suggest the Fout of the front PLL is 3.84MHz.
2329*4882a593Smuzhiyun */
2330*4882a593Smuzhiyun pll2_fout1 = 3840000;
2331*4882a593Smuzhiyun ret = rl6231_pll_calc(freq_in, pll2_fout1, &pll2f_code);
2332*4882a593Smuzhiyun if (ret < 0) {
2333*4882a593Smuzhiyun dev_err(component->dev, "Unsupport input clock %d\n",
2334*4882a593Smuzhiyun freq_in);
2335*4882a593Smuzhiyun return ret;
2336*4882a593Smuzhiyun }
2337*4882a593Smuzhiyun dev_dbg(component->dev, "PLL2F: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n",
2338*4882a593Smuzhiyun freq_in, pll2_fout1,
2339*4882a593Smuzhiyun pll2f_code.m_bp,
2340*4882a593Smuzhiyun (pll2f_code.m_bp ? 0 : pll2f_code.m_code),
2341*4882a593Smuzhiyun pll2f_code.n_code, pll2f_code.k_code);
2342*4882a593Smuzhiyun
2343*4882a593Smuzhiyun ret = rl6231_pll_calc(pll2_fout1, freq_out, &pll2b_code);
2344*4882a593Smuzhiyun if (ret < 0) {
2345*4882a593Smuzhiyun dev_err(component->dev, "Unsupport input clock %d\n",
2346*4882a593Smuzhiyun pll2_fout1);
2347*4882a593Smuzhiyun return ret;
2348*4882a593Smuzhiyun }
2349*4882a593Smuzhiyun dev_dbg(component->dev, "PLL2B: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n",
2350*4882a593Smuzhiyun pll2_fout1, freq_out,
2351*4882a593Smuzhiyun pll2b_code.m_bp,
2352*4882a593Smuzhiyun (pll2b_code.m_bp ? 0 : pll2b_code.m_code),
2353*4882a593Smuzhiyun pll2b_code.n_code, pll2b_code.k_code);
2354*4882a593Smuzhiyun
2355*4882a593Smuzhiyun snd_soc_component_write(component, RT5682_PLL2_CTRL_1,
2356*4882a593Smuzhiyun pll2f_code.k_code << RT5682_PLL2F_K_SFT |
2357*4882a593Smuzhiyun pll2b_code.k_code << RT5682_PLL2B_K_SFT |
2358*4882a593Smuzhiyun pll2b_code.m_code);
2359*4882a593Smuzhiyun snd_soc_component_write(component, RT5682_PLL2_CTRL_2,
2360*4882a593Smuzhiyun pll2f_code.m_code << RT5682_PLL2F_M_SFT |
2361*4882a593Smuzhiyun pll2b_code.n_code);
2362*4882a593Smuzhiyun snd_soc_component_write(component, RT5682_PLL2_CTRL_3,
2363*4882a593Smuzhiyun pll2f_code.n_code << RT5682_PLL2F_N_SFT);
2364*4882a593Smuzhiyun
2365*4882a593Smuzhiyun if (freq_out == 22579200)
2366*4882a593Smuzhiyun pll2_ps_val = 1 << RT5682_PLL2B_SEL_PS_SFT;
2367*4882a593Smuzhiyun else
2368*4882a593Smuzhiyun pll2_ps_val = 1 << RT5682_PLL2B_PS_BYP_SFT;
2369*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PLL2_CTRL_4,
2370*4882a593Smuzhiyun RT5682_PLL2B_SEL_PS_MASK | RT5682_PLL2B_PS_BYP_MASK |
2371*4882a593Smuzhiyun RT5682_PLL2B_M_BP_MASK | RT5682_PLL2F_M_BP_MASK | 0xf,
2372*4882a593Smuzhiyun pll2_ps_val |
2373*4882a593Smuzhiyun (pll2b_code.m_bp ? 1 : 0) << RT5682_PLL2B_M_BP_SFT |
2374*4882a593Smuzhiyun (pll2f_code.m_bp ? 1 : 0) << RT5682_PLL2F_M_BP_SFT |
2375*4882a593Smuzhiyun 0xf);
2376*4882a593Smuzhiyun } else {
2377*4882a593Smuzhiyun switch (source) {
2378*4882a593Smuzhiyun case RT5682_PLL1_S_MCLK:
2379*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2380*4882a593Smuzhiyun RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK,
2381*4882a593Smuzhiyun RT5682_PLL1_SRC_MCLK);
2382*4882a593Smuzhiyun break;
2383*4882a593Smuzhiyun case RT5682_PLL1_S_BCLK1:
2384*4882a593Smuzhiyun snd_soc_component_update_bits(component,
2385*4882a593Smuzhiyun RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK,
2386*4882a593Smuzhiyun RT5682_PLL1_SRC_BCLK1);
2387*4882a593Smuzhiyun break;
2388*4882a593Smuzhiyun default:
2389*4882a593Smuzhiyun dev_err(component->dev, "Unknown PLL1 Source %d\n",
2390*4882a593Smuzhiyun source);
2391*4882a593Smuzhiyun return -EINVAL;
2392*4882a593Smuzhiyun }
2393*4882a593Smuzhiyun
2394*4882a593Smuzhiyun ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
2395*4882a593Smuzhiyun if (ret < 0) {
2396*4882a593Smuzhiyun dev_err(component->dev, "Unsupport input clock %d\n",
2397*4882a593Smuzhiyun freq_in);
2398*4882a593Smuzhiyun return ret;
2399*4882a593Smuzhiyun }
2400*4882a593Smuzhiyun
2401*4882a593Smuzhiyun dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n",
2402*4882a593Smuzhiyun pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
2403*4882a593Smuzhiyun pll_code.n_code, pll_code.k_code);
2404*4882a593Smuzhiyun
2405*4882a593Smuzhiyun snd_soc_component_write(component, RT5682_PLL_CTRL_1,
2406*4882a593Smuzhiyun pll_code.n_code << RT5682_PLL_N_SFT | pll_code.k_code);
2407*4882a593Smuzhiyun snd_soc_component_write(component, RT5682_PLL_CTRL_2,
2408*4882a593Smuzhiyun (pll_code.m_bp ? 0 : pll_code.m_code) << RT5682_PLL_M_SFT |
2409*4882a593Smuzhiyun pll_code.m_bp << RT5682_PLL_M_BP_SFT | RT5682_PLL_RST);
2410*4882a593Smuzhiyun }
2411*4882a593Smuzhiyun
2412*4882a593Smuzhiyun rt5682->pll_in[pll_id] = freq_in;
2413*4882a593Smuzhiyun rt5682->pll_out[pll_id] = freq_out;
2414*4882a593Smuzhiyun rt5682->pll_src[pll_id] = source;
2415*4882a593Smuzhiyun
2416*4882a593Smuzhiyun return 0;
2417*4882a593Smuzhiyun }
2418*4882a593Smuzhiyun
rt5682_set_bclk1_ratio(struct snd_soc_dai * dai,unsigned int ratio)2419*4882a593Smuzhiyun static int rt5682_set_bclk1_ratio(struct snd_soc_dai *dai, unsigned int ratio)
2420*4882a593Smuzhiyun {
2421*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
2422*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2423*4882a593Smuzhiyun
2424*4882a593Smuzhiyun rt5682->bclk[dai->id] = ratio;
2425*4882a593Smuzhiyun
2426*4882a593Smuzhiyun switch (ratio) {
2427*4882a593Smuzhiyun case 256:
2428*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
2429*4882a593Smuzhiyun RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_256);
2430*4882a593Smuzhiyun break;
2431*4882a593Smuzhiyun case 128:
2432*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
2433*4882a593Smuzhiyun RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_128);
2434*4882a593Smuzhiyun break;
2435*4882a593Smuzhiyun case 64:
2436*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
2437*4882a593Smuzhiyun RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_64);
2438*4882a593Smuzhiyun break;
2439*4882a593Smuzhiyun case 32:
2440*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
2441*4882a593Smuzhiyun RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_32);
2442*4882a593Smuzhiyun break;
2443*4882a593Smuzhiyun default:
2444*4882a593Smuzhiyun dev_err(dai->dev, "Invalid bclk1 ratio %d\n", ratio);
2445*4882a593Smuzhiyun return -EINVAL;
2446*4882a593Smuzhiyun }
2447*4882a593Smuzhiyun
2448*4882a593Smuzhiyun return 0;
2449*4882a593Smuzhiyun }
2450*4882a593Smuzhiyun
rt5682_set_bclk2_ratio(struct snd_soc_dai * dai,unsigned int ratio)2451*4882a593Smuzhiyun static int rt5682_set_bclk2_ratio(struct snd_soc_dai *dai, unsigned int ratio)
2452*4882a593Smuzhiyun {
2453*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
2454*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2455*4882a593Smuzhiyun
2456*4882a593Smuzhiyun rt5682->bclk[dai->id] = ratio;
2457*4882a593Smuzhiyun
2458*4882a593Smuzhiyun switch (ratio) {
2459*4882a593Smuzhiyun case 64:
2460*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2,
2461*4882a593Smuzhiyun RT5682_I2S2_BCLK_MS2_MASK,
2462*4882a593Smuzhiyun RT5682_I2S2_BCLK_MS2_64);
2463*4882a593Smuzhiyun break;
2464*4882a593Smuzhiyun case 32:
2465*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2,
2466*4882a593Smuzhiyun RT5682_I2S2_BCLK_MS2_MASK,
2467*4882a593Smuzhiyun RT5682_I2S2_BCLK_MS2_32);
2468*4882a593Smuzhiyun break;
2469*4882a593Smuzhiyun default:
2470*4882a593Smuzhiyun dev_err(dai->dev, "Invalid bclk2 ratio %d\n", ratio);
2471*4882a593Smuzhiyun return -EINVAL;
2472*4882a593Smuzhiyun }
2473*4882a593Smuzhiyun
2474*4882a593Smuzhiyun return 0;
2475*4882a593Smuzhiyun }
2476*4882a593Smuzhiyun
rt5682_set_bias_level(struct snd_soc_component * component,enum snd_soc_bias_level level)2477*4882a593Smuzhiyun static int rt5682_set_bias_level(struct snd_soc_component *component,
2478*4882a593Smuzhiyun enum snd_soc_bias_level level)
2479*4882a593Smuzhiyun {
2480*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2481*4882a593Smuzhiyun
2482*4882a593Smuzhiyun switch (level) {
2483*4882a593Smuzhiyun case SND_SOC_BIAS_PREPARE:
2484*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
2485*4882a593Smuzhiyun RT5682_PWR_BG, RT5682_PWR_BG);
2486*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
2487*4882a593Smuzhiyun RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO,
2488*4882a593Smuzhiyun RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO);
2489*4882a593Smuzhiyun break;
2490*4882a593Smuzhiyun
2491*4882a593Smuzhiyun case SND_SOC_BIAS_STANDBY:
2492*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
2493*4882a593Smuzhiyun RT5682_DIG_GATE_CTRL, RT5682_DIG_GATE_CTRL);
2494*4882a593Smuzhiyun break;
2495*4882a593Smuzhiyun case SND_SOC_BIAS_OFF:
2496*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
2497*4882a593Smuzhiyun RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 0);
2498*4882a593Smuzhiyun regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
2499*4882a593Smuzhiyun RT5682_PWR_BG, 0);
2500*4882a593Smuzhiyun break;
2501*4882a593Smuzhiyun case SND_SOC_BIAS_ON:
2502*4882a593Smuzhiyun break;
2503*4882a593Smuzhiyun }
2504*4882a593Smuzhiyun
2505*4882a593Smuzhiyun return 0;
2506*4882a593Smuzhiyun }
2507*4882a593Smuzhiyun
2508*4882a593Smuzhiyun #ifdef CONFIG_COMMON_CLK
2509*4882a593Smuzhiyun #define CLK_PLL2_FIN 48000000
2510*4882a593Smuzhiyun #define CLK_48 48000
2511*4882a593Smuzhiyun #define CLK_44 44100
2512*4882a593Smuzhiyun
rt5682_clk_check(struct rt5682_priv * rt5682)2513*4882a593Smuzhiyun static bool rt5682_clk_check(struct rt5682_priv *rt5682)
2514*4882a593Smuzhiyun {
2515*4882a593Smuzhiyun if (!rt5682->master[RT5682_AIF1]) {
2516*4882a593Smuzhiyun dev_dbg(rt5682->component->dev, "sysclk/dai not set correctly\n");
2517*4882a593Smuzhiyun return false;
2518*4882a593Smuzhiyun }
2519*4882a593Smuzhiyun return true;
2520*4882a593Smuzhiyun }
2521*4882a593Smuzhiyun
rt5682_wclk_prepare(struct clk_hw * hw)2522*4882a593Smuzhiyun static int rt5682_wclk_prepare(struct clk_hw *hw)
2523*4882a593Smuzhiyun {
2524*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
2525*4882a593Smuzhiyun container_of(hw, struct rt5682_priv,
2526*4882a593Smuzhiyun dai_clks_hw[RT5682_DAI_WCLK_IDX]);
2527*4882a593Smuzhiyun struct snd_soc_component *component = rt5682->component;
2528*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm =
2529*4882a593Smuzhiyun snd_soc_component_get_dapm(component);
2530*4882a593Smuzhiyun
2531*4882a593Smuzhiyun if (!rt5682_clk_check(rt5682))
2532*4882a593Smuzhiyun return -EINVAL;
2533*4882a593Smuzhiyun
2534*4882a593Smuzhiyun snd_soc_dapm_mutex_lock(dapm);
2535*4882a593Smuzhiyun
2536*4882a593Smuzhiyun snd_soc_dapm_force_enable_pin_unlocked(dapm, "MICBIAS");
2537*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
2538*4882a593Smuzhiyun RT5682_PWR_MB, RT5682_PWR_MB);
2539*4882a593Smuzhiyun
2540*4882a593Smuzhiyun snd_soc_dapm_force_enable_pin_unlocked(dapm, "Vref2");
2541*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
2542*4882a593Smuzhiyun RT5682_PWR_VREF2 | RT5682_PWR_FV2,
2543*4882a593Smuzhiyun RT5682_PWR_VREF2);
2544*4882a593Smuzhiyun usleep_range(55000, 60000);
2545*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
2546*4882a593Smuzhiyun RT5682_PWR_FV2, RT5682_PWR_FV2);
2547*4882a593Smuzhiyun
2548*4882a593Smuzhiyun snd_soc_dapm_force_enable_pin_unlocked(dapm, "I2S1");
2549*4882a593Smuzhiyun snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2F");
2550*4882a593Smuzhiyun snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2B");
2551*4882a593Smuzhiyun snd_soc_dapm_sync_unlocked(dapm);
2552*4882a593Smuzhiyun
2553*4882a593Smuzhiyun snd_soc_dapm_mutex_unlock(dapm);
2554*4882a593Smuzhiyun
2555*4882a593Smuzhiyun return 0;
2556*4882a593Smuzhiyun }
2557*4882a593Smuzhiyun
rt5682_wclk_unprepare(struct clk_hw * hw)2558*4882a593Smuzhiyun static void rt5682_wclk_unprepare(struct clk_hw *hw)
2559*4882a593Smuzhiyun {
2560*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
2561*4882a593Smuzhiyun container_of(hw, struct rt5682_priv,
2562*4882a593Smuzhiyun dai_clks_hw[RT5682_DAI_WCLK_IDX]);
2563*4882a593Smuzhiyun struct snd_soc_component *component = rt5682->component;
2564*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm =
2565*4882a593Smuzhiyun snd_soc_component_get_dapm(component);
2566*4882a593Smuzhiyun
2567*4882a593Smuzhiyun if (!rt5682_clk_check(rt5682))
2568*4882a593Smuzhiyun return;
2569*4882a593Smuzhiyun
2570*4882a593Smuzhiyun snd_soc_dapm_mutex_lock(dapm);
2571*4882a593Smuzhiyun
2572*4882a593Smuzhiyun snd_soc_dapm_disable_pin_unlocked(dapm, "MICBIAS");
2573*4882a593Smuzhiyun snd_soc_dapm_disable_pin_unlocked(dapm, "Vref2");
2574*4882a593Smuzhiyun if (!rt5682->jack_type)
2575*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
2576*4882a593Smuzhiyun RT5682_PWR_VREF2 | RT5682_PWR_FV2 |
2577*4882a593Smuzhiyun RT5682_PWR_MB, 0);
2578*4882a593Smuzhiyun
2579*4882a593Smuzhiyun snd_soc_dapm_disable_pin_unlocked(dapm, "I2S1");
2580*4882a593Smuzhiyun snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2F");
2581*4882a593Smuzhiyun snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2B");
2582*4882a593Smuzhiyun snd_soc_dapm_sync_unlocked(dapm);
2583*4882a593Smuzhiyun
2584*4882a593Smuzhiyun snd_soc_dapm_mutex_unlock(dapm);
2585*4882a593Smuzhiyun }
2586*4882a593Smuzhiyun
rt5682_wclk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)2587*4882a593Smuzhiyun static unsigned long rt5682_wclk_recalc_rate(struct clk_hw *hw,
2588*4882a593Smuzhiyun unsigned long parent_rate)
2589*4882a593Smuzhiyun {
2590*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
2591*4882a593Smuzhiyun container_of(hw, struct rt5682_priv,
2592*4882a593Smuzhiyun dai_clks_hw[RT5682_DAI_WCLK_IDX]);
2593*4882a593Smuzhiyun struct snd_soc_component *component = rt5682->component;
2594*4882a593Smuzhiyun const char * const clk_name = clk_hw_get_name(hw);
2595*4882a593Smuzhiyun
2596*4882a593Smuzhiyun if (!rt5682_clk_check(rt5682))
2597*4882a593Smuzhiyun return 0;
2598*4882a593Smuzhiyun /*
2599*4882a593Smuzhiyun * Only accept to set wclk rate to 44.1k or 48kHz.
2600*4882a593Smuzhiyun */
2601*4882a593Smuzhiyun if (rt5682->lrck[RT5682_AIF1] != CLK_48 &&
2602*4882a593Smuzhiyun rt5682->lrck[RT5682_AIF1] != CLK_44) {
2603*4882a593Smuzhiyun dev_warn(component->dev, "%s: clk %s only support %d or %d Hz output\n",
2604*4882a593Smuzhiyun __func__, clk_name, CLK_44, CLK_48);
2605*4882a593Smuzhiyun return 0;
2606*4882a593Smuzhiyun }
2607*4882a593Smuzhiyun
2608*4882a593Smuzhiyun return rt5682->lrck[RT5682_AIF1];
2609*4882a593Smuzhiyun }
2610*4882a593Smuzhiyun
rt5682_wclk_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)2611*4882a593Smuzhiyun static long rt5682_wclk_round_rate(struct clk_hw *hw, unsigned long rate,
2612*4882a593Smuzhiyun unsigned long *parent_rate)
2613*4882a593Smuzhiyun {
2614*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
2615*4882a593Smuzhiyun container_of(hw, struct rt5682_priv,
2616*4882a593Smuzhiyun dai_clks_hw[RT5682_DAI_WCLK_IDX]);
2617*4882a593Smuzhiyun struct snd_soc_component *component = rt5682->component;
2618*4882a593Smuzhiyun const char * const clk_name = clk_hw_get_name(hw);
2619*4882a593Smuzhiyun
2620*4882a593Smuzhiyun if (!rt5682_clk_check(rt5682))
2621*4882a593Smuzhiyun return -EINVAL;
2622*4882a593Smuzhiyun /*
2623*4882a593Smuzhiyun * Only accept to set wclk rate to 44.1k or 48kHz.
2624*4882a593Smuzhiyun * It will force to 48kHz if not both.
2625*4882a593Smuzhiyun */
2626*4882a593Smuzhiyun if (rate != CLK_48 && rate != CLK_44) {
2627*4882a593Smuzhiyun dev_warn(component->dev, "%s: clk %s only support %d or %d Hz output\n",
2628*4882a593Smuzhiyun __func__, clk_name, CLK_44, CLK_48);
2629*4882a593Smuzhiyun rate = CLK_48;
2630*4882a593Smuzhiyun }
2631*4882a593Smuzhiyun
2632*4882a593Smuzhiyun return rate;
2633*4882a593Smuzhiyun }
2634*4882a593Smuzhiyun
rt5682_wclk_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)2635*4882a593Smuzhiyun static int rt5682_wclk_set_rate(struct clk_hw *hw, unsigned long rate,
2636*4882a593Smuzhiyun unsigned long parent_rate)
2637*4882a593Smuzhiyun {
2638*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
2639*4882a593Smuzhiyun container_of(hw, struct rt5682_priv,
2640*4882a593Smuzhiyun dai_clks_hw[RT5682_DAI_WCLK_IDX]);
2641*4882a593Smuzhiyun struct snd_soc_component *component = rt5682->component;
2642*4882a593Smuzhiyun struct clk *parent_clk;
2643*4882a593Smuzhiyun const char * const clk_name = clk_hw_get_name(hw);
2644*4882a593Smuzhiyun int pre_div;
2645*4882a593Smuzhiyun unsigned int clk_pll2_out;
2646*4882a593Smuzhiyun
2647*4882a593Smuzhiyun if (!rt5682_clk_check(rt5682))
2648*4882a593Smuzhiyun return -EINVAL;
2649*4882a593Smuzhiyun
2650*4882a593Smuzhiyun /*
2651*4882a593Smuzhiyun * Whether the wclk's parent clk (mclk) exists or not, please ensure
2652*4882a593Smuzhiyun * it is fixed or set to 48MHz before setting wclk rate. It's a
2653*4882a593Smuzhiyun * temporary limitation. Only accept 48MHz clk as the clk provider.
2654*4882a593Smuzhiyun *
2655*4882a593Smuzhiyun * It will set the codec anyway by assuming mclk is 48MHz.
2656*4882a593Smuzhiyun */
2657*4882a593Smuzhiyun parent_clk = clk_get_parent(hw->clk);
2658*4882a593Smuzhiyun if (!parent_clk)
2659*4882a593Smuzhiyun dev_warn(component->dev,
2660*4882a593Smuzhiyun "Parent mclk of wclk not acquired in driver. Please ensure mclk was provided as %d Hz.\n",
2661*4882a593Smuzhiyun CLK_PLL2_FIN);
2662*4882a593Smuzhiyun
2663*4882a593Smuzhiyun if (parent_rate != CLK_PLL2_FIN)
2664*4882a593Smuzhiyun dev_warn(component->dev, "clk %s only support %d Hz input\n",
2665*4882a593Smuzhiyun clk_name, CLK_PLL2_FIN);
2666*4882a593Smuzhiyun
2667*4882a593Smuzhiyun /*
2668*4882a593Smuzhiyun * To achieve the rate conversion from 48MHz to 44.1k or 48kHz,
2669*4882a593Smuzhiyun * PLL2 is needed.
2670*4882a593Smuzhiyun */
2671*4882a593Smuzhiyun clk_pll2_out = rate * 512;
2672*4882a593Smuzhiyun rt5682_set_component_pll(component, RT5682_PLL2, RT5682_PLL2_S_MCLK,
2673*4882a593Smuzhiyun CLK_PLL2_FIN, clk_pll2_out);
2674*4882a593Smuzhiyun
2675*4882a593Smuzhiyun rt5682_set_component_sysclk(component, RT5682_SCLK_S_PLL2, 0,
2676*4882a593Smuzhiyun clk_pll2_out, SND_SOC_CLOCK_IN);
2677*4882a593Smuzhiyun
2678*4882a593Smuzhiyun rt5682->lrck[RT5682_AIF1] = rate;
2679*4882a593Smuzhiyun
2680*4882a593Smuzhiyun pre_div = rl6231_get_clk_info(rt5682->sysclk, rate);
2681*4882a593Smuzhiyun
2682*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1,
2683*4882a593Smuzhiyun RT5682_I2S_M_DIV_MASK | RT5682_I2S_CLK_SRC_MASK,
2684*4882a593Smuzhiyun pre_div << RT5682_I2S_M_DIV_SFT |
2685*4882a593Smuzhiyun (rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT);
2686*4882a593Smuzhiyun
2687*4882a593Smuzhiyun return 0;
2688*4882a593Smuzhiyun }
2689*4882a593Smuzhiyun
rt5682_bclk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)2690*4882a593Smuzhiyun static unsigned long rt5682_bclk_recalc_rate(struct clk_hw *hw,
2691*4882a593Smuzhiyun unsigned long parent_rate)
2692*4882a593Smuzhiyun {
2693*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
2694*4882a593Smuzhiyun container_of(hw, struct rt5682_priv,
2695*4882a593Smuzhiyun dai_clks_hw[RT5682_DAI_BCLK_IDX]);
2696*4882a593Smuzhiyun struct snd_soc_component *component = rt5682->component;
2697*4882a593Smuzhiyun unsigned int bclks_per_wclk;
2698*4882a593Smuzhiyun
2699*4882a593Smuzhiyun bclks_per_wclk = snd_soc_component_read(component, RT5682_TDM_TCON_CTRL);
2700*4882a593Smuzhiyun
2701*4882a593Smuzhiyun switch (bclks_per_wclk & RT5682_TDM_BCLK_MS1_MASK) {
2702*4882a593Smuzhiyun case RT5682_TDM_BCLK_MS1_256:
2703*4882a593Smuzhiyun return parent_rate * 256;
2704*4882a593Smuzhiyun case RT5682_TDM_BCLK_MS1_128:
2705*4882a593Smuzhiyun return parent_rate * 128;
2706*4882a593Smuzhiyun case RT5682_TDM_BCLK_MS1_64:
2707*4882a593Smuzhiyun return parent_rate * 64;
2708*4882a593Smuzhiyun case RT5682_TDM_BCLK_MS1_32:
2709*4882a593Smuzhiyun return parent_rate * 32;
2710*4882a593Smuzhiyun default:
2711*4882a593Smuzhiyun return 0;
2712*4882a593Smuzhiyun }
2713*4882a593Smuzhiyun }
2714*4882a593Smuzhiyun
rt5682_bclk_get_factor(unsigned long rate,unsigned long parent_rate)2715*4882a593Smuzhiyun static unsigned long rt5682_bclk_get_factor(unsigned long rate,
2716*4882a593Smuzhiyun unsigned long parent_rate)
2717*4882a593Smuzhiyun {
2718*4882a593Smuzhiyun unsigned long factor;
2719*4882a593Smuzhiyun
2720*4882a593Smuzhiyun factor = rate / parent_rate;
2721*4882a593Smuzhiyun if (factor < 64)
2722*4882a593Smuzhiyun return 32;
2723*4882a593Smuzhiyun else if (factor < 128)
2724*4882a593Smuzhiyun return 64;
2725*4882a593Smuzhiyun else if (factor < 256)
2726*4882a593Smuzhiyun return 128;
2727*4882a593Smuzhiyun else
2728*4882a593Smuzhiyun return 256;
2729*4882a593Smuzhiyun }
2730*4882a593Smuzhiyun
rt5682_bclk_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)2731*4882a593Smuzhiyun static long rt5682_bclk_round_rate(struct clk_hw *hw, unsigned long rate,
2732*4882a593Smuzhiyun unsigned long *parent_rate)
2733*4882a593Smuzhiyun {
2734*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
2735*4882a593Smuzhiyun container_of(hw, struct rt5682_priv,
2736*4882a593Smuzhiyun dai_clks_hw[RT5682_DAI_BCLK_IDX]);
2737*4882a593Smuzhiyun unsigned long factor;
2738*4882a593Smuzhiyun
2739*4882a593Smuzhiyun if (!*parent_rate || !rt5682_clk_check(rt5682))
2740*4882a593Smuzhiyun return -EINVAL;
2741*4882a593Smuzhiyun
2742*4882a593Smuzhiyun /*
2743*4882a593Smuzhiyun * BCLK rates are set as a multiplier of WCLK in HW.
2744*4882a593Smuzhiyun * We don't allow changing the parent WCLK. We just do
2745*4882a593Smuzhiyun * some rounding down based on the parent WCLK rate
2746*4882a593Smuzhiyun * and find the appropriate multiplier of BCLK to
2747*4882a593Smuzhiyun * get the rounded down BCLK value.
2748*4882a593Smuzhiyun */
2749*4882a593Smuzhiyun factor = rt5682_bclk_get_factor(rate, *parent_rate);
2750*4882a593Smuzhiyun
2751*4882a593Smuzhiyun return *parent_rate * factor;
2752*4882a593Smuzhiyun }
2753*4882a593Smuzhiyun
rt5682_bclk_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)2754*4882a593Smuzhiyun static int rt5682_bclk_set_rate(struct clk_hw *hw, unsigned long rate,
2755*4882a593Smuzhiyun unsigned long parent_rate)
2756*4882a593Smuzhiyun {
2757*4882a593Smuzhiyun struct rt5682_priv *rt5682 =
2758*4882a593Smuzhiyun container_of(hw, struct rt5682_priv,
2759*4882a593Smuzhiyun dai_clks_hw[RT5682_DAI_BCLK_IDX]);
2760*4882a593Smuzhiyun struct snd_soc_component *component = rt5682->component;
2761*4882a593Smuzhiyun struct snd_soc_dai *dai = NULL;
2762*4882a593Smuzhiyun unsigned long factor;
2763*4882a593Smuzhiyun
2764*4882a593Smuzhiyun if (!rt5682_clk_check(rt5682))
2765*4882a593Smuzhiyun return -EINVAL;
2766*4882a593Smuzhiyun
2767*4882a593Smuzhiyun factor = rt5682_bclk_get_factor(rate, parent_rate);
2768*4882a593Smuzhiyun
2769*4882a593Smuzhiyun for_each_component_dais(component, dai)
2770*4882a593Smuzhiyun if (dai->id == RT5682_AIF1)
2771*4882a593Smuzhiyun break;
2772*4882a593Smuzhiyun if (!dai) {
2773*4882a593Smuzhiyun dev_err(component->dev, "dai %d not found in component\n",
2774*4882a593Smuzhiyun RT5682_AIF1);
2775*4882a593Smuzhiyun return -ENODEV;
2776*4882a593Smuzhiyun }
2777*4882a593Smuzhiyun
2778*4882a593Smuzhiyun return rt5682_set_bclk1_ratio(dai, factor);
2779*4882a593Smuzhiyun }
2780*4882a593Smuzhiyun
2781*4882a593Smuzhiyun static const struct clk_ops rt5682_dai_clk_ops[RT5682_DAI_NUM_CLKS] = {
2782*4882a593Smuzhiyun [RT5682_DAI_WCLK_IDX] = {
2783*4882a593Smuzhiyun .prepare = rt5682_wclk_prepare,
2784*4882a593Smuzhiyun .unprepare = rt5682_wclk_unprepare,
2785*4882a593Smuzhiyun .recalc_rate = rt5682_wclk_recalc_rate,
2786*4882a593Smuzhiyun .round_rate = rt5682_wclk_round_rate,
2787*4882a593Smuzhiyun .set_rate = rt5682_wclk_set_rate,
2788*4882a593Smuzhiyun },
2789*4882a593Smuzhiyun [RT5682_DAI_BCLK_IDX] = {
2790*4882a593Smuzhiyun .recalc_rate = rt5682_bclk_recalc_rate,
2791*4882a593Smuzhiyun .round_rate = rt5682_bclk_round_rate,
2792*4882a593Smuzhiyun .set_rate = rt5682_bclk_set_rate,
2793*4882a593Smuzhiyun },
2794*4882a593Smuzhiyun };
2795*4882a593Smuzhiyun
rt5682_register_dai_clks(struct snd_soc_component * component)2796*4882a593Smuzhiyun static int rt5682_register_dai_clks(struct snd_soc_component *component)
2797*4882a593Smuzhiyun {
2798*4882a593Smuzhiyun struct device *dev = component->dev;
2799*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2800*4882a593Smuzhiyun struct rt5682_platform_data *pdata = &rt5682->pdata;
2801*4882a593Smuzhiyun struct clk_hw *dai_clk_hw;
2802*4882a593Smuzhiyun int i, ret;
2803*4882a593Smuzhiyun
2804*4882a593Smuzhiyun for (i = 0; i < RT5682_DAI_NUM_CLKS; ++i) {
2805*4882a593Smuzhiyun struct clk_init_data init = { };
2806*4882a593Smuzhiyun struct clk_parent_data parent_data;
2807*4882a593Smuzhiyun const struct clk_hw *parent;
2808*4882a593Smuzhiyun
2809*4882a593Smuzhiyun dai_clk_hw = &rt5682->dai_clks_hw[i];
2810*4882a593Smuzhiyun
2811*4882a593Smuzhiyun switch (i) {
2812*4882a593Smuzhiyun case RT5682_DAI_WCLK_IDX:
2813*4882a593Smuzhiyun /* Make MCLK the parent of WCLK */
2814*4882a593Smuzhiyun if (rt5682->mclk) {
2815*4882a593Smuzhiyun parent_data = (struct clk_parent_data){
2816*4882a593Smuzhiyun .fw_name = "mclk",
2817*4882a593Smuzhiyun };
2818*4882a593Smuzhiyun init.parent_data = &parent_data;
2819*4882a593Smuzhiyun init.num_parents = 1;
2820*4882a593Smuzhiyun }
2821*4882a593Smuzhiyun break;
2822*4882a593Smuzhiyun case RT5682_DAI_BCLK_IDX:
2823*4882a593Smuzhiyun /* Make WCLK the parent of BCLK */
2824*4882a593Smuzhiyun parent = &rt5682->dai_clks_hw[RT5682_DAI_WCLK_IDX];
2825*4882a593Smuzhiyun init.parent_hws = &parent;
2826*4882a593Smuzhiyun init.num_parents = 1;
2827*4882a593Smuzhiyun break;
2828*4882a593Smuzhiyun default:
2829*4882a593Smuzhiyun dev_err(dev, "Invalid clock index\n");
2830*4882a593Smuzhiyun return -EINVAL;
2831*4882a593Smuzhiyun }
2832*4882a593Smuzhiyun
2833*4882a593Smuzhiyun init.name = pdata->dai_clk_names[i];
2834*4882a593Smuzhiyun init.ops = &rt5682_dai_clk_ops[i];
2835*4882a593Smuzhiyun init.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_GATE;
2836*4882a593Smuzhiyun dai_clk_hw->init = &init;
2837*4882a593Smuzhiyun
2838*4882a593Smuzhiyun ret = devm_clk_hw_register(dev, dai_clk_hw);
2839*4882a593Smuzhiyun if (ret) {
2840*4882a593Smuzhiyun dev_warn(dev, "Failed to register %s: %d\n",
2841*4882a593Smuzhiyun init.name, ret);
2842*4882a593Smuzhiyun return ret;
2843*4882a593Smuzhiyun }
2844*4882a593Smuzhiyun
2845*4882a593Smuzhiyun if (dev->of_node) {
2846*4882a593Smuzhiyun devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
2847*4882a593Smuzhiyun dai_clk_hw);
2848*4882a593Smuzhiyun } else {
2849*4882a593Smuzhiyun ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw,
2850*4882a593Smuzhiyun init.name,
2851*4882a593Smuzhiyun dev_name(dev));
2852*4882a593Smuzhiyun if (ret)
2853*4882a593Smuzhiyun return ret;
2854*4882a593Smuzhiyun }
2855*4882a593Smuzhiyun }
2856*4882a593Smuzhiyun
2857*4882a593Smuzhiyun return 0;
2858*4882a593Smuzhiyun }
2859*4882a593Smuzhiyun #endif /* CONFIG_COMMON_CLK */
2860*4882a593Smuzhiyun
rt5682_probe(struct snd_soc_component * component)2861*4882a593Smuzhiyun static int rt5682_probe(struct snd_soc_component *component)
2862*4882a593Smuzhiyun {
2863*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2864*4882a593Smuzhiyun struct sdw_slave *slave;
2865*4882a593Smuzhiyun unsigned long time;
2866*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm = &component->dapm;
2867*4882a593Smuzhiyun
2868*4882a593Smuzhiyun #ifdef CONFIG_COMMON_CLK
2869*4882a593Smuzhiyun int ret;
2870*4882a593Smuzhiyun #endif
2871*4882a593Smuzhiyun rt5682->component = component;
2872*4882a593Smuzhiyun
2873*4882a593Smuzhiyun if (rt5682->is_sdw) {
2874*4882a593Smuzhiyun slave = rt5682->slave;
2875*4882a593Smuzhiyun time = wait_for_completion_timeout(
2876*4882a593Smuzhiyun &slave->initialization_complete,
2877*4882a593Smuzhiyun msecs_to_jiffies(RT5682_PROBE_TIMEOUT));
2878*4882a593Smuzhiyun if (!time) {
2879*4882a593Smuzhiyun dev_err(&slave->dev, "Initialization not complete, timed out\n");
2880*4882a593Smuzhiyun return -ETIMEDOUT;
2881*4882a593Smuzhiyun }
2882*4882a593Smuzhiyun } else {
2883*4882a593Smuzhiyun #ifdef CONFIG_COMMON_CLK
2884*4882a593Smuzhiyun /* Check if MCLK provided */
2885*4882a593Smuzhiyun rt5682->mclk = devm_clk_get(component->dev, "mclk");
2886*4882a593Smuzhiyun if (IS_ERR(rt5682->mclk)) {
2887*4882a593Smuzhiyun if (PTR_ERR(rt5682->mclk) != -ENOENT) {
2888*4882a593Smuzhiyun ret = PTR_ERR(rt5682->mclk);
2889*4882a593Smuzhiyun return ret;
2890*4882a593Smuzhiyun }
2891*4882a593Smuzhiyun rt5682->mclk = NULL;
2892*4882a593Smuzhiyun }
2893*4882a593Smuzhiyun
2894*4882a593Smuzhiyun /* Register CCF DAI clock control */
2895*4882a593Smuzhiyun ret = rt5682_register_dai_clks(component);
2896*4882a593Smuzhiyun if (ret)
2897*4882a593Smuzhiyun return ret;
2898*4882a593Smuzhiyun
2899*4882a593Smuzhiyun /* Initial setup for CCF */
2900*4882a593Smuzhiyun rt5682->lrck[RT5682_AIF1] = CLK_48;
2901*4882a593Smuzhiyun #endif
2902*4882a593Smuzhiyun }
2903*4882a593Smuzhiyun
2904*4882a593Smuzhiyun snd_soc_dapm_disable_pin(dapm, "MICBIAS");
2905*4882a593Smuzhiyun snd_soc_dapm_disable_pin(dapm, "Vref2");
2906*4882a593Smuzhiyun snd_soc_dapm_sync(dapm);
2907*4882a593Smuzhiyun return 0;
2908*4882a593Smuzhiyun }
2909*4882a593Smuzhiyun
rt5682_remove(struct snd_soc_component * component)2910*4882a593Smuzhiyun static void rt5682_remove(struct snd_soc_component *component)
2911*4882a593Smuzhiyun {
2912*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2913*4882a593Smuzhiyun
2914*4882a593Smuzhiyun rt5682_reset(rt5682);
2915*4882a593Smuzhiyun }
2916*4882a593Smuzhiyun
2917*4882a593Smuzhiyun #ifdef CONFIG_PM
rt5682_suspend(struct snd_soc_component * component)2918*4882a593Smuzhiyun static int rt5682_suspend(struct snd_soc_component *component)
2919*4882a593Smuzhiyun {
2920*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2921*4882a593Smuzhiyun
2922*4882a593Smuzhiyun regcache_cache_only(rt5682->regmap, true);
2923*4882a593Smuzhiyun regcache_mark_dirty(rt5682->regmap);
2924*4882a593Smuzhiyun return 0;
2925*4882a593Smuzhiyun }
2926*4882a593Smuzhiyun
rt5682_resume(struct snd_soc_component * component)2927*4882a593Smuzhiyun static int rt5682_resume(struct snd_soc_component *component)
2928*4882a593Smuzhiyun {
2929*4882a593Smuzhiyun struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
2930*4882a593Smuzhiyun
2931*4882a593Smuzhiyun regcache_cache_only(rt5682->regmap, false);
2932*4882a593Smuzhiyun regcache_sync(rt5682->regmap);
2933*4882a593Smuzhiyun
2934*4882a593Smuzhiyun mod_delayed_work(system_power_efficient_wq,
2935*4882a593Smuzhiyun &rt5682->jack_detect_work, msecs_to_jiffies(250));
2936*4882a593Smuzhiyun
2937*4882a593Smuzhiyun return 0;
2938*4882a593Smuzhiyun }
2939*4882a593Smuzhiyun #else
2940*4882a593Smuzhiyun #define rt5682_suspend NULL
2941*4882a593Smuzhiyun #define rt5682_resume NULL
2942*4882a593Smuzhiyun #endif
2943*4882a593Smuzhiyun
2944*4882a593Smuzhiyun const struct snd_soc_dai_ops rt5682_aif1_dai_ops = {
2945*4882a593Smuzhiyun .hw_params = rt5682_hw_params,
2946*4882a593Smuzhiyun .set_fmt = rt5682_set_dai_fmt,
2947*4882a593Smuzhiyun .set_tdm_slot = rt5682_set_tdm_slot,
2948*4882a593Smuzhiyun .set_bclk_ratio = rt5682_set_bclk1_ratio,
2949*4882a593Smuzhiyun };
2950*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_aif1_dai_ops);
2951*4882a593Smuzhiyun
2952*4882a593Smuzhiyun const struct snd_soc_dai_ops rt5682_aif2_dai_ops = {
2953*4882a593Smuzhiyun .hw_params = rt5682_hw_params,
2954*4882a593Smuzhiyun .set_fmt = rt5682_set_dai_fmt,
2955*4882a593Smuzhiyun .set_bclk_ratio = rt5682_set_bclk2_ratio,
2956*4882a593Smuzhiyun };
2957*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_aif2_dai_ops);
2958*4882a593Smuzhiyun
2959*4882a593Smuzhiyun const struct snd_soc_component_driver rt5682_soc_component_dev = {
2960*4882a593Smuzhiyun .probe = rt5682_probe,
2961*4882a593Smuzhiyun .remove = rt5682_remove,
2962*4882a593Smuzhiyun .suspend = rt5682_suspend,
2963*4882a593Smuzhiyun .resume = rt5682_resume,
2964*4882a593Smuzhiyun .set_bias_level = rt5682_set_bias_level,
2965*4882a593Smuzhiyun .controls = rt5682_snd_controls,
2966*4882a593Smuzhiyun .num_controls = ARRAY_SIZE(rt5682_snd_controls),
2967*4882a593Smuzhiyun .dapm_widgets = rt5682_dapm_widgets,
2968*4882a593Smuzhiyun .num_dapm_widgets = ARRAY_SIZE(rt5682_dapm_widgets),
2969*4882a593Smuzhiyun .dapm_routes = rt5682_dapm_routes,
2970*4882a593Smuzhiyun .num_dapm_routes = ARRAY_SIZE(rt5682_dapm_routes),
2971*4882a593Smuzhiyun .set_sysclk = rt5682_set_component_sysclk,
2972*4882a593Smuzhiyun .set_pll = rt5682_set_component_pll,
2973*4882a593Smuzhiyun .set_jack = rt5682_set_jack_detect,
2974*4882a593Smuzhiyun .use_pmdown_time = 1,
2975*4882a593Smuzhiyun .endianness = 1,
2976*4882a593Smuzhiyun .non_legacy_dai_naming = 1,
2977*4882a593Smuzhiyun };
2978*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_soc_component_dev);
2979*4882a593Smuzhiyun
rt5682_parse_dt(struct rt5682_priv * rt5682,struct device * dev)2980*4882a593Smuzhiyun int rt5682_parse_dt(struct rt5682_priv *rt5682, struct device *dev)
2981*4882a593Smuzhiyun {
2982*4882a593Smuzhiyun
2983*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,dmic1-data-pin",
2984*4882a593Smuzhiyun &rt5682->pdata.dmic1_data_pin);
2985*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,dmic1-clk-pin",
2986*4882a593Smuzhiyun &rt5682->pdata.dmic1_clk_pin);
2987*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,jd-src",
2988*4882a593Smuzhiyun &rt5682->pdata.jd_src);
2989*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,btndet-delay",
2990*4882a593Smuzhiyun &rt5682->pdata.btndet_delay);
2991*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,dmic-clk-rate-hz",
2992*4882a593Smuzhiyun &rt5682->pdata.dmic_clk_rate);
2993*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,dmic-delay-ms",
2994*4882a593Smuzhiyun &rt5682->pdata.dmic_delay);
2995*4882a593Smuzhiyun
2996*4882a593Smuzhiyun rt5682->pdata.ldo1_en = of_get_named_gpio(dev->of_node,
2997*4882a593Smuzhiyun "realtek,ldo1-en-gpios", 0);
2998*4882a593Smuzhiyun
2999*4882a593Smuzhiyun if (device_property_read_string_array(dev, "clock-output-names",
3000*4882a593Smuzhiyun rt5682->pdata.dai_clk_names,
3001*4882a593Smuzhiyun RT5682_DAI_NUM_CLKS) < 0)
3002*4882a593Smuzhiyun dev_warn(dev, "Using default DAI clk names: %s, %s\n",
3003*4882a593Smuzhiyun rt5682->pdata.dai_clk_names[RT5682_DAI_WCLK_IDX],
3004*4882a593Smuzhiyun rt5682->pdata.dai_clk_names[RT5682_DAI_BCLK_IDX]);
3005*4882a593Smuzhiyun
3006*4882a593Smuzhiyun return 0;
3007*4882a593Smuzhiyun }
3008*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_parse_dt);
3009*4882a593Smuzhiyun
rt5682_calibrate(struct rt5682_priv * rt5682)3010*4882a593Smuzhiyun void rt5682_calibrate(struct rt5682_priv *rt5682)
3011*4882a593Smuzhiyun {
3012*4882a593Smuzhiyun int value, count;
3013*4882a593Smuzhiyun
3014*4882a593Smuzhiyun mutex_lock(&rt5682->calibrate_mutex);
3015*4882a593Smuzhiyun
3016*4882a593Smuzhiyun rt5682_reset(rt5682);
3017*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_I2C_CTRL, 0x000f);
3018*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xa2af);
3019*4882a593Smuzhiyun usleep_range(15000, 20000);
3020*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xf2af);
3021*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0300);
3022*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x8000);
3023*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0100);
3024*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_HP_IMP_SENS_CTRL_19, 0x3800);
3025*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x3000);
3026*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x7005);
3027*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0x686c);
3028*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0d0d);
3029*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_2, 0x0321);
3030*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_HP_LOGIC_CTRL_2, 0x0004);
3031*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00);
3032*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_3, 0x06a1);
3033*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_A_DAC1_MUX, 0x0311);
3034*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00);
3035*4882a593Smuzhiyun
3036*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0xfc00);
3037*4882a593Smuzhiyun
3038*4882a593Smuzhiyun for (count = 0; count < 60; count++) {
3039*4882a593Smuzhiyun regmap_read(rt5682->regmap, RT5682_HP_CALIB_STA_1, &value);
3040*4882a593Smuzhiyun if (!(value & 0x8000))
3041*4882a593Smuzhiyun break;
3042*4882a593Smuzhiyun
3043*4882a593Smuzhiyun usleep_range(10000, 10005);
3044*4882a593Smuzhiyun }
3045*4882a593Smuzhiyun
3046*4882a593Smuzhiyun if (count >= 60)
3047*4882a593Smuzhiyun dev_err(rt5682->component->dev, "HP Calibration Failure\n");
3048*4882a593Smuzhiyun
3049*4882a593Smuzhiyun /* restore settings */
3050*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0x002f);
3051*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0080);
3052*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x0000);
3053*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0000);
3054*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x2000);
3055*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x2005);
3056*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0xc0c4);
3057*4882a593Smuzhiyun regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0c0c);
3058*4882a593Smuzhiyun
3059*4882a593Smuzhiyun mutex_unlock(&rt5682->calibrate_mutex);
3060*4882a593Smuzhiyun }
3061*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5682_calibrate);
3062*4882a593Smuzhiyun
3063*4882a593Smuzhiyun MODULE_DESCRIPTION("ASoC RT5682 driver");
3064*4882a593Smuzhiyun MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
3065*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
3066