1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * rt5659.c -- RT5659/RT5658 ALSA SoC audio codec driver
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright 2015 Realtek Semiconductor Corp.
6*4882a593Smuzhiyun * Author: Bard Liao <bardliao@realtek.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/clk.h>
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/moduleparam.h>
12*4882a593Smuzhiyun #include <linux/init.h>
13*4882a593Smuzhiyun #include <linux/delay.h>
14*4882a593Smuzhiyun #include <linux/pm.h>
15*4882a593Smuzhiyun #include <linux/i2c.h>
16*4882a593Smuzhiyun #include <linux/platform_device.h>
17*4882a593Smuzhiyun #include <linux/spi/spi.h>
18*4882a593Smuzhiyun #include <linux/acpi.h>
19*4882a593Smuzhiyun #include <linux/gpio.h>
20*4882a593Smuzhiyun #include <linux/gpio/consumer.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/rt5659.h>
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun #include "rl6231.h"
32*4882a593Smuzhiyun #include "rt5659.h"
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun static const struct reg_default rt5659_reg[] = {
35*4882a593Smuzhiyun { 0x0000, 0x0000 },
36*4882a593Smuzhiyun { 0x0001, 0x4848 },
37*4882a593Smuzhiyun { 0x0002, 0x8080 },
38*4882a593Smuzhiyun { 0x0003, 0xc8c8 },
39*4882a593Smuzhiyun { 0x0004, 0xc80a },
40*4882a593Smuzhiyun { 0x0005, 0x0000 },
41*4882a593Smuzhiyun { 0x0006, 0x0000 },
42*4882a593Smuzhiyun { 0x0007, 0x0103 },
43*4882a593Smuzhiyun { 0x0008, 0x0080 },
44*4882a593Smuzhiyun { 0x0009, 0x0000 },
45*4882a593Smuzhiyun { 0x000a, 0x0000 },
46*4882a593Smuzhiyun { 0x000c, 0x0000 },
47*4882a593Smuzhiyun { 0x000d, 0x0000 },
48*4882a593Smuzhiyun { 0x000f, 0x0808 },
49*4882a593Smuzhiyun { 0x0010, 0x3080 },
50*4882a593Smuzhiyun { 0x0011, 0x4a00 },
51*4882a593Smuzhiyun { 0x0012, 0x4e00 },
52*4882a593Smuzhiyun { 0x0015, 0x42c1 },
53*4882a593Smuzhiyun { 0x0016, 0x0000 },
54*4882a593Smuzhiyun { 0x0018, 0x000b },
55*4882a593Smuzhiyun { 0x0019, 0xafaf },
56*4882a593Smuzhiyun { 0x001a, 0xafaf },
57*4882a593Smuzhiyun { 0x001b, 0x0011 },
58*4882a593Smuzhiyun { 0x001c, 0x2f2f },
59*4882a593Smuzhiyun { 0x001d, 0x2f2f },
60*4882a593Smuzhiyun { 0x001e, 0x2f2f },
61*4882a593Smuzhiyun { 0x001f, 0x0000 },
62*4882a593Smuzhiyun { 0x0020, 0x0000 },
63*4882a593Smuzhiyun { 0x0021, 0x0000 },
64*4882a593Smuzhiyun { 0x0022, 0x5757 },
65*4882a593Smuzhiyun { 0x0023, 0x0039 },
66*4882a593Smuzhiyun { 0x0026, 0xc060 },
67*4882a593Smuzhiyun { 0x0027, 0xd8d8 },
68*4882a593Smuzhiyun { 0x0029, 0x8080 },
69*4882a593Smuzhiyun { 0x002a, 0xaaaa },
70*4882a593Smuzhiyun { 0x002b, 0xaaaa },
71*4882a593Smuzhiyun { 0x002c, 0x00af },
72*4882a593Smuzhiyun { 0x002d, 0x0000 },
73*4882a593Smuzhiyun { 0x002f, 0x1002 },
74*4882a593Smuzhiyun { 0x0031, 0x5000 },
75*4882a593Smuzhiyun { 0x0032, 0x0000 },
76*4882a593Smuzhiyun { 0x0033, 0x0000 },
77*4882a593Smuzhiyun { 0x0034, 0x0000 },
78*4882a593Smuzhiyun { 0x0035, 0x0000 },
79*4882a593Smuzhiyun { 0x0036, 0x0000 },
80*4882a593Smuzhiyun { 0x003a, 0x0000 },
81*4882a593Smuzhiyun { 0x003b, 0x0000 },
82*4882a593Smuzhiyun { 0x003c, 0x007f },
83*4882a593Smuzhiyun { 0x003d, 0x0000 },
84*4882a593Smuzhiyun { 0x003e, 0x007f },
85*4882a593Smuzhiyun { 0x0040, 0x0808 },
86*4882a593Smuzhiyun { 0x0046, 0x001f },
87*4882a593Smuzhiyun { 0x0047, 0x001f },
88*4882a593Smuzhiyun { 0x0048, 0x0003 },
89*4882a593Smuzhiyun { 0x0049, 0xe061 },
90*4882a593Smuzhiyun { 0x004a, 0x0000 },
91*4882a593Smuzhiyun { 0x004b, 0x031f },
92*4882a593Smuzhiyun { 0x004d, 0x0000 },
93*4882a593Smuzhiyun { 0x004e, 0x001f },
94*4882a593Smuzhiyun { 0x004f, 0x0000 },
95*4882a593Smuzhiyun { 0x0050, 0x001f },
96*4882a593Smuzhiyun { 0x0052, 0xf000 },
97*4882a593Smuzhiyun { 0x0053, 0x0111 },
98*4882a593Smuzhiyun { 0x0054, 0x0064 },
99*4882a593Smuzhiyun { 0x0055, 0x0080 },
100*4882a593Smuzhiyun { 0x0056, 0xef0e },
101*4882a593Smuzhiyun { 0x0057, 0xf0f0 },
102*4882a593Smuzhiyun { 0x0058, 0xef0e },
103*4882a593Smuzhiyun { 0x0059, 0xf0f0 },
104*4882a593Smuzhiyun { 0x005a, 0xef0e },
105*4882a593Smuzhiyun { 0x005b, 0xf0f0 },
106*4882a593Smuzhiyun { 0x005c, 0xf000 },
107*4882a593Smuzhiyun { 0x005d, 0x0000 },
108*4882a593Smuzhiyun { 0x005e, 0x1f2c },
109*4882a593Smuzhiyun { 0x005f, 0x1f2c },
110*4882a593Smuzhiyun { 0x0060, 0x2717 },
111*4882a593Smuzhiyun { 0x0061, 0x0000 },
112*4882a593Smuzhiyun { 0x0062, 0x0000 },
113*4882a593Smuzhiyun { 0x0063, 0x003e },
114*4882a593Smuzhiyun { 0x0064, 0x0000 },
115*4882a593Smuzhiyun { 0x0065, 0x0000 },
116*4882a593Smuzhiyun { 0x0066, 0x0000 },
117*4882a593Smuzhiyun { 0x0067, 0x0000 },
118*4882a593Smuzhiyun { 0x006a, 0x0000 },
119*4882a593Smuzhiyun { 0x006b, 0x0000 },
120*4882a593Smuzhiyun { 0x006c, 0x0000 },
121*4882a593Smuzhiyun { 0x006e, 0x0000 },
122*4882a593Smuzhiyun { 0x006f, 0x0000 },
123*4882a593Smuzhiyun { 0x0070, 0x8000 },
124*4882a593Smuzhiyun { 0x0071, 0x8000 },
125*4882a593Smuzhiyun { 0x0072, 0x8000 },
126*4882a593Smuzhiyun { 0x0073, 0x1110 },
127*4882a593Smuzhiyun { 0x0074, 0xfe00 },
128*4882a593Smuzhiyun { 0x0075, 0x2409 },
129*4882a593Smuzhiyun { 0x0076, 0x000a },
130*4882a593Smuzhiyun { 0x0077, 0x00f0 },
131*4882a593Smuzhiyun { 0x0078, 0x0000 },
132*4882a593Smuzhiyun { 0x0079, 0x0000 },
133*4882a593Smuzhiyun { 0x007a, 0x0123 },
134*4882a593Smuzhiyun { 0x007b, 0x8003 },
135*4882a593Smuzhiyun { 0x0080, 0x0000 },
136*4882a593Smuzhiyun { 0x0081, 0x0000 },
137*4882a593Smuzhiyun { 0x0082, 0x0000 },
138*4882a593Smuzhiyun { 0x0083, 0x0000 },
139*4882a593Smuzhiyun { 0x0084, 0x0000 },
140*4882a593Smuzhiyun { 0x0085, 0x0000 },
141*4882a593Smuzhiyun { 0x0086, 0x0008 },
142*4882a593Smuzhiyun { 0x0087, 0x0000 },
143*4882a593Smuzhiyun { 0x0088, 0x0000 },
144*4882a593Smuzhiyun { 0x0089, 0x0000 },
145*4882a593Smuzhiyun { 0x008a, 0x0000 },
146*4882a593Smuzhiyun { 0x008b, 0x0000 },
147*4882a593Smuzhiyun { 0x008c, 0x0003 },
148*4882a593Smuzhiyun { 0x008e, 0x0000 },
149*4882a593Smuzhiyun { 0x008f, 0x1000 },
150*4882a593Smuzhiyun { 0x0090, 0x0646 },
151*4882a593Smuzhiyun { 0x0091, 0x0c16 },
152*4882a593Smuzhiyun { 0x0092, 0x0073 },
153*4882a593Smuzhiyun { 0x0093, 0x0000 },
154*4882a593Smuzhiyun { 0x0094, 0x0080 },
155*4882a593Smuzhiyun { 0x0097, 0x0000 },
156*4882a593Smuzhiyun { 0x0098, 0x0000 },
157*4882a593Smuzhiyun { 0x0099, 0x0000 },
158*4882a593Smuzhiyun { 0x009a, 0x0000 },
159*4882a593Smuzhiyun { 0x009b, 0x0000 },
160*4882a593Smuzhiyun { 0x009c, 0x007f },
161*4882a593Smuzhiyun { 0x009d, 0x0000 },
162*4882a593Smuzhiyun { 0x009e, 0x007f },
163*4882a593Smuzhiyun { 0x009f, 0x0000 },
164*4882a593Smuzhiyun { 0x00a0, 0x0060 },
165*4882a593Smuzhiyun { 0x00a1, 0x90a1 },
166*4882a593Smuzhiyun { 0x00ae, 0x2000 },
167*4882a593Smuzhiyun { 0x00af, 0x0000 },
168*4882a593Smuzhiyun { 0x00b0, 0x2000 },
169*4882a593Smuzhiyun { 0x00b1, 0x0000 },
170*4882a593Smuzhiyun { 0x00b2, 0x0000 },
171*4882a593Smuzhiyun { 0x00b6, 0x0000 },
172*4882a593Smuzhiyun { 0x00b7, 0x0000 },
173*4882a593Smuzhiyun { 0x00b8, 0x0000 },
174*4882a593Smuzhiyun { 0x00b9, 0x0000 },
175*4882a593Smuzhiyun { 0x00ba, 0x0000 },
176*4882a593Smuzhiyun { 0x00bb, 0x0000 },
177*4882a593Smuzhiyun { 0x00be, 0x0000 },
178*4882a593Smuzhiyun { 0x00bf, 0x0000 },
179*4882a593Smuzhiyun { 0x00c0, 0x0000 },
180*4882a593Smuzhiyun { 0x00c1, 0x0000 },
181*4882a593Smuzhiyun { 0x00c2, 0x0000 },
182*4882a593Smuzhiyun { 0x00c3, 0x0000 },
183*4882a593Smuzhiyun { 0x00c4, 0x0003 },
184*4882a593Smuzhiyun { 0x00c5, 0x0000 },
185*4882a593Smuzhiyun { 0x00cb, 0xa02f },
186*4882a593Smuzhiyun { 0x00cc, 0x0000 },
187*4882a593Smuzhiyun { 0x00cd, 0x0e02 },
188*4882a593Smuzhiyun { 0x00d6, 0x0000 },
189*4882a593Smuzhiyun { 0x00d7, 0x2244 },
190*4882a593Smuzhiyun { 0x00d9, 0x0809 },
191*4882a593Smuzhiyun { 0x00da, 0x0000 },
192*4882a593Smuzhiyun { 0x00db, 0x0008 },
193*4882a593Smuzhiyun { 0x00dc, 0x00c0 },
194*4882a593Smuzhiyun { 0x00dd, 0x6724 },
195*4882a593Smuzhiyun { 0x00de, 0x3131 },
196*4882a593Smuzhiyun { 0x00df, 0x0008 },
197*4882a593Smuzhiyun { 0x00e0, 0x4000 },
198*4882a593Smuzhiyun { 0x00e1, 0x3131 },
199*4882a593Smuzhiyun { 0x00e4, 0x400c },
200*4882a593Smuzhiyun { 0x00e5, 0x8031 },
201*4882a593Smuzhiyun { 0x00ea, 0xb320 },
202*4882a593Smuzhiyun { 0x00eb, 0x0000 },
203*4882a593Smuzhiyun { 0x00ec, 0xb300 },
204*4882a593Smuzhiyun { 0x00ed, 0x0000 },
205*4882a593Smuzhiyun { 0x00f0, 0x0000 },
206*4882a593Smuzhiyun { 0x00f1, 0x0202 },
207*4882a593Smuzhiyun { 0x00f2, 0x0ddd },
208*4882a593Smuzhiyun { 0x00f3, 0x0ddd },
209*4882a593Smuzhiyun { 0x00f4, 0x0ddd },
210*4882a593Smuzhiyun { 0x00f6, 0x0000 },
211*4882a593Smuzhiyun { 0x00f7, 0x0000 },
212*4882a593Smuzhiyun { 0x00f8, 0x0000 },
213*4882a593Smuzhiyun { 0x00f9, 0x0000 },
214*4882a593Smuzhiyun { 0x00fa, 0x8000 },
215*4882a593Smuzhiyun { 0x00fb, 0x0000 },
216*4882a593Smuzhiyun { 0x00fc, 0x0000 },
217*4882a593Smuzhiyun { 0x00fd, 0x0001 },
218*4882a593Smuzhiyun { 0x00fe, 0x10ec },
219*4882a593Smuzhiyun { 0x00ff, 0x6311 },
220*4882a593Smuzhiyun { 0x0100, 0xaaaa },
221*4882a593Smuzhiyun { 0x010a, 0xaaaa },
222*4882a593Smuzhiyun { 0x010b, 0x00a0 },
223*4882a593Smuzhiyun { 0x010c, 0xaeae },
224*4882a593Smuzhiyun { 0x010d, 0xaaaa },
225*4882a593Smuzhiyun { 0x010e, 0xaaa8 },
226*4882a593Smuzhiyun { 0x010f, 0xa0aa },
227*4882a593Smuzhiyun { 0x0110, 0xe02a },
228*4882a593Smuzhiyun { 0x0111, 0xa702 },
229*4882a593Smuzhiyun { 0x0112, 0xaaaa },
230*4882a593Smuzhiyun { 0x0113, 0x2800 },
231*4882a593Smuzhiyun { 0x0116, 0x0000 },
232*4882a593Smuzhiyun { 0x0117, 0x0f00 },
233*4882a593Smuzhiyun { 0x011a, 0x0020 },
234*4882a593Smuzhiyun { 0x011b, 0x0011 },
235*4882a593Smuzhiyun { 0x011c, 0x0150 },
236*4882a593Smuzhiyun { 0x011d, 0x0000 },
237*4882a593Smuzhiyun { 0x011e, 0x0000 },
238*4882a593Smuzhiyun { 0x011f, 0x0000 },
239*4882a593Smuzhiyun { 0x0120, 0x0000 },
240*4882a593Smuzhiyun { 0x0121, 0x009b },
241*4882a593Smuzhiyun { 0x0122, 0x5014 },
242*4882a593Smuzhiyun { 0x0123, 0x0421 },
243*4882a593Smuzhiyun { 0x0124, 0x7cea },
244*4882a593Smuzhiyun { 0x0125, 0x0420 },
245*4882a593Smuzhiyun { 0x0126, 0x5550 },
246*4882a593Smuzhiyun { 0x0132, 0x0000 },
247*4882a593Smuzhiyun { 0x0133, 0x0000 },
248*4882a593Smuzhiyun { 0x0137, 0x5055 },
249*4882a593Smuzhiyun { 0x0138, 0x3700 },
250*4882a593Smuzhiyun { 0x0139, 0x79a1 },
251*4882a593Smuzhiyun { 0x013a, 0x2020 },
252*4882a593Smuzhiyun { 0x013b, 0x2020 },
253*4882a593Smuzhiyun { 0x013c, 0x2005 },
254*4882a593Smuzhiyun { 0x013e, 0x1f00 },
255*4882a593Smuzhiyun { 0x013f, 0x0000 },
256*4882a593Smuzhiyun { 0x0145, 0x0002 },
257*4882a593Smuzhiyun { 0x0146, 0x0000 },
258*4882a593Smuzhiyun { 0x0147, 0x0000 },
259*4882a593Smuzhiyun { 0x0148, 0x0000 },
260*4882a593Smuzhiyun { 0x0150, 0x1813 },
261*4882a593Smuzhiyun { 0x0151, 0x0690 },
262*4882a593Smuzhiyun { 0x0152, 0x1c17 },
263*4882a593Smuzhiyun { 0x0153, 0x6883 },
264*4882a593Smuzhiyun { 0x0154, 0xd3ce },
265*4882a593Smuzhiyun { 0x0155, 0x352d },
266*4882a593Smuzhiyun { 0x0156, 0x00eb },
267*4882a593Smuzhiyun { 0x0157, 0x3717 },
268*4882a593Smuzhiyun { 0x0158, 0x4c6a },
269*4882a593Smuzhiyun { 0x0159, 0xe41b },
270*4882a593Smuzhiyun { 0x015a, 0x2a13 },
271*4882a593Smuzhiyun { 0x015b, 0xb600 },
272*4882a593Smuzhiyun { 0x015c, 0xc730 },
273*4882a593Smuzhiyun { 0x015d, 0x35d4 },
274*4882a593Smuzhiyun { 0x015e, 0x00bf },
275*4882a593Smuzhiyun { 0x0160, 0x0ec0 },
276*4882a593Smuzhiyun { 0x0161, 0x0020 },
277*4882a593Smuzhiyun { 0x0162, 0x0080 },
278*4882a593Smuzhiyun { 0x0163, 0x0800 },
279*4882a593Smuzhiyun { 0x0164, 0x0000 },
280*4882a593Smuzhiyun { 0x0165, 0x0000 },
281*4882a593Smuzhiyun { 0x0166, 0x0000 },
282*4882a593Smuzhiyun { 0x0167, 0x001f },
283*4882a593Smuzhiyun { 0x0170, 0x4e80 },
284*4882a593Smuzhiyun { 0x0171, 0x0020 },
285*4882a593Smuzhiyun { 0x0172, 0x0080 },
286*4882a593Smuzhiyun { 0x0173, 0x0800 },
287*4882a593Smuzhiyun { 0x0174, 0x000c },
288*4882a593Smuzhiyun { 0x0175, 0x0000 },
289*4882a593Smuzhiyun { 0x0190, 0x3300 },
290*4882a593Smuzhiyun { 0x0191, 0x2200 },
291*4882a593Smuzhiyun { 0x0192, 0x0000 },
292*4882a593Smuzhiyun { 0x01b0, 0x4b38 },
293*4882a593Smuzhiyun { 0x01b1, 0x0000 },
294*4882a593Smuzhiyun { 0x01b2, 0x0000 },
295*4882a593Smuzhiyun { 0x01b3, 0x0000 },
296*4882a593Smuzhiyun { 0x01c0, 0x0045 },
297*4882a593Smuzhiyun { 0x01c1, 0x0540 },
298*4882a593Smuzhiyun { 0x01c2, 0x0000 },
299*4882a593Smuzhiyun { 0x01c3, 0x0030 },
300*4882a593Smuzhiyun { 0x01c7, 0x0000 },
301*4882a593Smuzhiyun { 0x01c8, 0x5757 },
302*4882a593Smuzhiyun { 0x01c9, 0x5757 },
303*4882a593Smuzhiyun { 0x01ca, 0x5757 },
304*4882a593Smuzhiyun { 0x01cb, 0x5757 },
305*4882a593Smuzhiyun { 0x01cc, 0x5757 },
306*4882a593Smuzhiyun { 0x01cd, 0x5757 },
307*4882a593Smuzhiyun { 0x01ce, 0x006f },
308*4882a593Smuzhiyun { 0x01da, 0x0000 },
309*4882a593Smuzhiyun { 0x01db, 0x0000 },
310*4882a593Smuzhiyun { 0x01de, 0x7d00 },
311*4882a593Smuzhiyun { 0x01df, 0x10c0 },
312*4882a593Smuzhiyun { 0x01e0, 0x06a1 },
313*4882a593Smuzhiyun { 0x01e1, 0x0000 },
314*4882a593Smuzhiyun { 0x01e2, 0x0000 },
315*4882a593Smuzhiyun { 0x01e3, 0x0000 },
316*4882a593Smuzhiyun { 0x01e4, 0x0001 },
317*4882a593Smuzhiyun { 0x01e6, 0x0000 },
318*4882a593Smuzhiyun { 0x01e7, 0x0000 },
319*4882a593Smuzhiyun { 0x01e8, 0x0000 },
320*4882a593Smuzhiyun { 0x01ea, 0x0000 },
321*4882a593Smuzhiyun { 0x01eb, 0x0000 },
322*4882a593Smuzhiyun { 0x01ec, 0x0000 },
323*4882a593Smuzhiyun { 0x01ed, 0x0000 },
324*4882a593Smuzhiyun { 0x01ee, 0x0000 },
325*4882a593Smuzhiyun { 0x01ef, 0x0000 },
326*4882a593Smuzhiyun { 0x01f0, 0x0000 },
327*4882a593Smuzhiyun { 0x01f1, 0x0000 },
328*4882a593Smuzhiyun { 0x01f2, 0x0000 },
329*4882a593Smuzhiyun { 0x01f6, 0x1e04 },
330*4882a593Smuzhiyun { 0x01f7, 0x01a1 },
331*4882a593Smuzhiyun { 0x01f8, 0x0000 },
332*4882a593Smuzhiyun { 0x01f9, 0x0000 },
333*4882a593Smuzhiyun { 0x01fa, 0x0002 },
334*4882a593Smuzhiyun { 0x01fb, 0x0000 },
335*4882a593Smuzhiyun { 0x01fc, 0x0000 },
336*4882a593Smuzhiyun { 0x01fd, 0x0000 },
337*4882a593Smuzhiyun { 0x01fe, 0x0000 },
338*4882a593Smuzhiyun { 0x0200, 0x066c },
339*4882a593Smuzhiyun { 0x0201, 0x7fff },
340*4882a593Smuzhiyun { 0x0202, 0x7fff },
341*4882a593Smuzhiyun { 0x0203, 0x0000 },
342*4882a593Smuzhiyun { 0x0204, 0x0000 },
343*4882a593Smuzhiyun { 0x0205, 0x0000 },
344*4882a593Smuzhiyun { 0x0206, 0x0000 },
345*4882a593Smuzhiyun { 0x0207, 0x0000 },
346*4882a593Smuzhiyun { 0x0208, 0x0000 },
347*4882a593Smuzhiyun { 0x0256, 0x0000 },
348*4882a593Smuzhiyun { 0x0257, 0x0000 },
349*4882a593Smuzhiyun { 0x0258, 0x0000 },
350*4882a593Smuzhiyun { 0x0259, 0x0000 },
351*4882a593Smuzhiyun { 0x025a, 0x0000 },
352*4882a593Smuzhiyun { 0x025b, 0x3333 },
353*4882a593Smuzhiyun { 0x025c, 0x3333 },
354*4882a593Smuzhiyun { 0x025d, 0x3333 },
355*4882a593Smuzhiyun { 0x025e, 0x0000 },
356*4882a593Smuzhiyun { 0x025f, 0x0000 },
357*4882a593Smuzhiyun { 0x0260, 0x0000 },
358*4882a593Smuzhiyun { 0x0261, 0x0022 },
359*4882a593Smuzhiyun { 0x0262, 0x0300 },
360*4882a593Smuzhiyun { 0x0265, 0x1e80 },
361*4882a593Smuzhiyun { 0x0266, 0x0131 },
362*4882a593Smuzhiyun { 0x0267, 0x0003 },
363*4882a593Smuzhiyun { 0x0268, 0x0000 },
364*4882a593Smuzhiyun { 0x0269, 0x0000 },
365*4882a593Smuzhiyun { 0x026a, 0x0000 },
366*4882a593Smuzhiyun { 0x026b, 0x0000 },
367*4882a593Smuzhiyun { 0x026c, 0x0000 },
368*4882a593Smuzhiyun { 0x026d, 0x0000 },
369*4882a593Smuzhiyun { 0x026e, 0x0000 },
370*4882a593Smuzhiyun { 0x026f, 0x0000 },
371*4882a593Smuzhiyun { 0x0270, 0x0000 },
372*4882a593Smuzhiyun { 0x0271, 0x0000 },
373*4882a593Smuzhiyun { 0x0272, 0x0000 },
374*4882a593Smuzhiyun { 0x0273, 0x0000 },
375*4882a593Smuzhiyun { 0x0280, 0x0000 },
376*4882a593Smuzhiyun { 0x0281, 0x0000 },
377*4882a593Smuzhiyun { 0x0282, 0x0418 },
378*4882a593Smuzhiyun { 0x0283, 0x7fff },
379*4882a593Smuzhiyun { 0x0284, 0x7000 },
380*4882a593Smuzhiyun { 0x0290, 0x01d0 },
381*4882a593Smuzhiyun { 0x0291, 0x0100 },
382*4882a593Smuzhiyun { 0x02fa, 0x0000 },
383*4882a593Smuzhiyun { 0x02fb, 0x0000 },
384*4882a593Smuzhiyun { 0x02fc, 0x0000 },
385*4882a593Smuzhiyun { 0x0300, 0x001f },
386*4882a593Smuzhiyun { 0x0301, 0x032c },
387*4882a593Smuzhiyun { 0x0302, 0x5f21 },
388*4882a593Smuzhiyun { 0x0303, 0x4000 },
389*4882a593Smuzhiyun { 0x0304, 0x4000 },
390*4882a593Smuzhiyun { 0x0305, 0x0600 },
391*4882a593Smuzhiyun { 0x0306, 0x8000 },
392*4882a593Smuzhiyun { 0x0307, 0x0700 },
393*4882a593Smuzhiyun { 0x0308, 0x001f },
394*4882a593Smuzhiyun { 0x0309, 0x032c },
395*4882a593Smuzhiyun { 0x030a, 0x5f21 },
396*4882a593Smuzhiyun { 0x030b, 0x4000 },
397*4882a593Smuzhiyun { 0x030c, 0x4000 },
398*4882a593Smuzhiyun { 0x030d, 0x0600 },
399*4882a593Smuzhiyun { 0x030e, 0x8000 },
400*4882a593Smuzhiyun { 0x030f, 0x0700 },
401*4882a593Smuzhiyun { 0x0310, 0x4560 },
402*4882a593Smuzhiyun { 0x0311, 0xa4a8 },
403*4882a593Smuzhiyun { 0x0312, 0x7418 },
404*4882a593Smuzhiyun { 0x0313, 0x0000 },
405*4882a593Smuzhiyun { 0x0314, 0x0006 },
406*4882a593Smuzhiyun { 0x0315, 0x00ff },
407*4882a593Smuzhiyun { 0x0316, 0xc400 },
408*4882a593Smuzhiyun { 0x0317, 0x4560 },
409*4882a593Smuzhiyun { 0x0318, 0xa4a8 },
410*4882a593Smuzhiyun { 0x0319, 0x7418 },
411*4882a593Smuzhiyun { 0x031a, 0x0000 },
412*4882a593Smuzhiyun { 0x031b, 0x0006 },
413*4882a593Smuzhiyun { 0x031c, 0x00ff },
414*4882a593Smuzhiyun { 0x031d, 0xc400 },
415*4882a593Smuzhiyun { 0x0320, 0x0f20 },
416*4882a593Smuzhiyun { 0x0321, 0x8700 },
417*4882a593Smuzhiyun { 0x0322, 0x7dc2 },
418*4882a593Smuzhiyun { 0x0323, 0xa178 },
419*4882a593Smuzhiyun { 0x0324, 0x5383 },
420*4882a593Smuzhiyun { 0x0325, 0x7dc2 },
421*4882a593Smuzhiyun { 0x0326, 0xa178 },
422*4882a593Smuzhiyun { 0x0327, 0x5383 },
423*4882a593Smuzhiyun { 0x0328, 0x003e },
424*4882a593Smuzhiyun { 0x0329, 0x02c1 },
425*4882a593Smuzhiyun { 0x032a, 0xd37d },
426*4882a593Smuzhiyun { 0x0330, 0x00a6 },
427*4882a593Smuzhiyun { 0x0331, 0x04c3 },
428*4882a593Smuzhiyun { 0x0332, 0x27c8 },
429*4882a593Smuzhiyun { 0x0333, 0xbf50 },
430*4882a593Smuzhiyun { 0x0334, 0x0045 },
431*4882a593Smuzhiyun { 0x0335, 0x2007 },
432*4882a593Smuzhiyun { 0x0336, 0x7418 },
433*4882a593Smuzhiyun { 0x0337, 0x0501 },
434*4882a593Smuzhiyun { 0x0338, 0x0000 },
435*4882a593Smuzhiyun { 0x0339, 0x0010 },
436*4882a593Smuzhiyun { 0x033a, 0x1010 },
437*4882a593Smuzhiyun { 0x0340, 0x0800 },
438*4882a593Smuzhiyun { 0x0341, 0x0800 },
439*4882a593Smuzhiyun { 0x0342, 0x0800 },
440*4882a593Smuzhiyun { 0x0343, 0x0800 },
441*4882a593Smuzhiyun { 0x0344, 0x0000 },
442*4882a593Smuzhiyun { 0x0345, 0x0000 },
443*4882a593Smuzhiyun { 0x0346, 0x0000 },
444*4882a593Smuzhiyun { 0x0347, 0x0000 },
445*4882a593Smuzhiyun { 0x0348, 0x0000 },
446*4882a593Smuzhiyun { 0x0349, 0x0000 },
447*4882a593Smuzhiyun { 0x034a, 0x0000 },
448*4882a593Smuzhiyun { 0x034b, 0x0000 },
449*4882a593Smuzhiyun { 0x034c, 0x0000 },
450*4882a593Smuzhiyun { 0x034d, 0x0000 },
451*4882a593Smuzhiyun { 0x034e, 0x0000 },
452*4882a593Smuzhiyun { 0x034f, 0x0000 },
453*4882a593Smuzhiyun { 0x0350, 0x0000 },
454*4882a593Smuzhiyun { 0x0351, 0x0000 },
455*4882a593Smuzhiyun { 0x0352, 0x0000 },
456*4882a593Smuzhiyun { 0x0353, 0x0000 },
457*4882a593Smuzhiyun { 0x0354, 0x0000 },
458*4882a593Smuzhiyun { 0x0355, 0x0000 },
459*4882a593Smuzhiyun { 0x0356, 0x0000 },
460*4882a593Smuzhiyun { 0x0357, 0x0000 },
461*4882a593Smuzhiyun { 0x0358, 0x0000 },
462*4882a593Smuzhiyun { 0x0359, 0x0000 },
463*4882a593Smuzhiyun { 0x035a, 0x0000 },
464*4882a593Smuzhiyun { 0x035b, 0x0000 },
465*4882a593Smuzhiyun { 0x035c, 0x0000 },
466*4882a593Smuzhiyun { 0x035d, 0x0000 },
467*4882a593Smuzhiyun { 0x035e, 0x2000 },
468*4882a593Smuzhiyun { 0x035f, 0x0000 },
469*4882a593Smuzhiyun { 0x0360, 0x2000 },
470*4882a593Smuzhiyun { 0x0361, 0x2000 },
471*4882a593Smuzhiyun { 0x0362, 0x0000 },
472*4882a593Smuzhiyun { 0x0363, 0x2000 },
473*4882a593Smuzhiyun { 0x0364, 0x0200 },
474*4882a593Smuzhiyun { 0x0365, 0x0000 },
475*4882a593Smuzhiyun { 0x0366, 0x0000 },
476*4882a593Smuzhiyun { 0x0367, 0x0000 },
477*4882a593Smuzhiyun { 0x0368, 0x0000 },
478*4882a593Smuzhiyun { 0x0369, 0x0000 },
479*4882a593Smuzhiyun { 0x036a, 0x0000 },
480*4882a593Smuzhiyun { 0x036b, 0x0000 },
481*4882a593Smuzhiyun { 0x036c, 0x0000 },
482*4882a593Smuzhiyun { 0x036d, 0x0000 },
483*4882a593Smuzhiyun { 0x036e, 0x0200 },
484*4882a593Smuzhiyun { 0x036f, 0x0000 },
485*4882a593Smuzhiyun { 0x0370, 0x0000 },
486*4882a593Smuzhiyun { 0x0371, 0x0000 },
487*4882a593Smuzhiyun { 0x0372, 0x0000 },
488*4882a593Smuzhiyun { 0x0373, 0x0000 },
489*4882a593Smuzhiyun { 0x0374, 0x0000 },
490*4882a593Smuzhiyun { 0x0375, 0x0000 },
491*4882a593Smuzhiyun { 0x0376, 0x0000 },
492*4882a593Smuzhiyun { 0x0377, 0x0000 },
493*4882a593Smuzhiyun { 0x03d0, 0x0000 },
494*4882a593Smuzhiyun { 0x03d1, 0x0000 },
495*4882a593Smuzhiyun { 0x03d2, 0x0000 },
496*4882a593Smuzhiyun { 0x03d3, 0x0000 },
497*4882a593Smuzhiyun { 0x03d4, 0x2000 },
498*4882a593Smuzhiyun { 0x03d5, 0x2000 },
499*4882a593Smuzhiyun { 0x03d6, 0x0000 },
500*4882a593Smuzhiyun { 0x03d7, 0x0000 },
501*4882a593Smuzhiyun { 0x03d8, 0x2000 },
502*4882a593Smuzhiyun { 0x03d9, 0x2000 },
503*4882a593Smuzhiyun { 0x03da, 0x2000 },
504*4882a593Smuzhiyun { 0x03db, 0x2000 },
505*4882a593Smuzhiyun { 0x03dc, 0x0000 },
506*4882a593Smuzhiyun { 0x03dd, 0x0000 },
507*4882a593Smuzhiyun { 0x03de, 0x0000 },
508*4882a593Smuzhiyun { 0x03df, 0x2000 },
509*4882a593Smuzhiyun { 0x03e0, 0x0000 },
510*4882a593Smuzhiyun { 0x03e1, 0x0000 },
511*4882a593Smuzhiyun { 0x03e2, 0x0000 },
512*4882a593Smuzhiyun { 0x03e3, 0x0000 },
513*4882a593Smuzhiyun { 0x03e4, 0x0000 },
514*4882a593Smuzhiyun { 0x03e5, 0x0000 },
515*4882a593Smuzhiyun { 0x03e6, 0x0000 },
516*4882a593Smuzhiyun { 0x03e7, 0x0000 },
517*4882a593Smuzhiyun { 0x03e8, 0x0000 },
518*4882a593Smuzhiyun { 0x03e9, 0x0000 },
519*4882a593Smuzhiyun { 0x03ea, 0x0000 },
520*4882a593Smuzhiyun { 0x03eb, 0x0000 },
521*4882a593Smuzhiyun { 0x03ec, 0x0000 },
522*4882a593Smuzhiyun { 0x03ed, 0x0000 },
523*4882a593Smuzhiyun { 0x03ee, 0x0000 },
524*4882a593Smuzhiyun { 0x03ef, 0x0000 },
525*4882a593Smuzhiyun { 0x03f0, 0x0800 },
526*4882a593Smuzhiyun { 0x03f1, 0x0800 },
527*4882a593Smuzhiyun { 0x03f2, 0x0800 },
528*4882a593Smuzhiyun { 0x03f3, 0x0800 },
529*4882a593Smuzhiyun };
530*4882a593Smuzhiyun
rt5659_volatile_register(struct device * dev,unsigned int reg)531*4882a593Smuzhiyun static bool rt5659_volatile_register(struct device *dev, unsigned int reg)
532*4882a593Smuzhiyun {
533*4882a593Smuzhiyun switch (reg) {
534*4882a593Smuzhiyun case RT5659_RESET:
535*4882a593Smuzhiyun case RT5659_EJD_CTRL_2:
536*4882a593Smuzhiyun case RT5659_SILENCE_CTRL:
537*4882a593Smuzhiyun case RT5659_DAC2_DIG_VOL:
538*4882a593Smuzhiyun case RT5659_HP_IMP_GAIN_2:
539*4882a593Smuzhiyun case RT5659_PDM_OUT_CTRL:
540*4882a593Smuzhiyun case RT5659_PDM_DATA_CTRL_1:
541*4882a593Smuzhiyun case RT5659_PDM_DATA_CTRL_4:
542*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_1:
543*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_3:
544*4882a593Smuzhiyun case RT5659_HAPTIC_LPF_CTRL_3:
545*4882a593Smuzhiyun case RT5659_CLK_DET:
546*4882a593Smuzhiyun case RT5659_MICBIAS_1:
547*4882a593Smuzhiyun case RT5659_ASRC_11:
548*4882a593Smuzhiyun case RT5659_ADC_EQ_CTRL_1:
549*4882a593Smuzhiyun case RT5659_DAC_EQ_CTRL_1:
550*4882a593Smuzhiyun case RT5659_INT_ST_1:
551*4882a593Smuzhiyun case RT5659_INT_ST_2:
552*4882a593Smuzhiyun case RT5659_GPIO_STA:
553*4882a593Smuzhiyun case RT5659_SINE_GEN_CTRL_1:
554*4882a593Smuzhiyun case RT5659_IL_CMD_1:
555*4882a593Smuzhiyun case RT5659_4BTN_IL_CMD_1:
556*4882a593Smuzhiyun case RT5659_PSV_IL_CMD_1:
557*4882a593Smuzhiyun case RT5659_AJD1_CTRL:
558*4882a593Smuzhiyun case RT5659_AJD2_AJD3_CTRL:
559*4882a593Smuzhiyun case RT5659_JD_CTRL_3:
560*4882a593Smuzhiyun case RT5659_VENDOR_ID:
561*4882a593Smuzhiyun case RT5659_VENDOR_ID_1:
562*4882a593Smuzhiyun case RT5659_DEVICE_ID:
563*4882a593Smuzhiyun case RT5659_MEMORY_TEST:
564*4882a593Smuzhiyun case RT5659_SOFT_RAMP_DEPOP_DAC_CLK_CTRL:
565*4882a593Smuzhiyun case RT5659_VOL_TEST:
566*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_1:
567*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_5:
568*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_6:
569*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_7:
570*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_1:
571*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_5:
572*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_6:
573*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_CTRL_1:
574*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_CTRL_3:
575*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_CTRL_4:
576*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_1:
577*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_9:
578*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_1:
579*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_2:
580*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_3:
581*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_4:
582*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_5:
583*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_6:
584*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_7:
585*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_8:
586*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_9:
587*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_CTRL_1:
588*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_CTRL_3:
589*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_STA_1:
590*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_STA_2:
591*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_STA_3:
592*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_STA_4:
593*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_1:
594*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_2:
595*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_3:
596*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_4:
597*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_5:
598*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_6:
599*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_CTRL_1:
600*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_1:
601*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_2:
602*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_3:
603*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_4:
604*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_5:
605*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_6:
606*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_7:
607*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_8:
608*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_9:
609*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_10:
610*4882a593Smuzhiyun case RT5659_SPK_VDD_STA_1:
611*4882a593Smuzhiyun case RT5659_SPK_VDD_STA_2:
612*4882a593Smuzhiyun case RT5659_SPK_DC_DET_CTRL_1:
613*4882a593Smuzhiyun case RT5659_PURE_DC_DET_CTRL_1:
614*4882a593Smuzhiyun case RT5659_PURE_DC_DET_CTRL_2:
615*4882a593Smuzhiyun case RT5659_DRC1_PRIV_1:
616*4882a593Smuzhiyun case RT5659_DRC1_PRIV_4:
617*4882a593Smuzhiyun case RT5659_DRC1_PRIV_5:
618*4882a593Smuzhiyun case RT5659_DRC1_PRIV_6:
619*4882a593Smuzhiyun case RT5659_DRC1_PRIV_7:
620*4882a593Smuzhiyun case RT5659_DRC2_PRIV_1:
621*4882a593Smuzhiyun case RT5659_DRC2_PRIV_4:
622*4882a593Smuzhiyun case RT5659_DRC2_PRIV_5:
623*4882a593Smuzhiyun case RT5659_DRC2_PRIV_6:
624*4882a593Smuzhiyun case RT5659_DRC2_PRIV_7:
625*4882a593Smuzhiyun case RT5659_ALC_PGA_STA_1:
626*4882a593Smuzhiyun case RT5659_ALC_PGA_STA_2:
627*4882a593Smuzhiyun case RT5659_ALC_PGA_STA_3:
628*4882a593Smuzhiyun return true;
629*4882a593Smuzhiyun default:
630*4882a593Smuzhiyun return false;
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun }
633*4882a593Smuzhiyun
rt5659_readable_register(struct device * dev,unsigned int reg)634*4882a593Smuzhiyun static bool rt5659_readable_register(struct device *dev, unsigned int reg)
635*4882a593Smuzhiyun {
636*4882a593Smuzhiyun switch (reg) {
637*4882a593Smuzhiyun case RT5659_RESET:
638*4882a593Smuzhiyun case RT5659_SPO_VOL:
639*4882a593Smuzhiyun case RT5659_HP_VOL:
640*4882a593Smuzhiyun case RT5659_LOUT:
641*4882a593Smuzhiyun case RT5659_MONO_OUT:
642*4882a593Smuzhiyun case RT5659_HPL_GAIN:
643*4882a593Smuzhiyun case RT5659_HPR_GAIN:
644*4882a593Smuzhiyun case RT5659_MONO_GAIN:
645*4882a593Smuzhiyun case RT5659_SPDIF_CTRL_1:
646*4882a593Smuzhiyun case RT5659_SPDIF_CTRL_2:
647*4882a593Smuzhiyun case RT5659_CAL_BST_CTRL:
648*4882a593Smuzhiyun case RT5659_IN1_IN2:
649*4882a593Smuzhiyun case RT5659_IN3_IN4:
650*4882a593Smuzhiyun case RT5659_INL1_INR1_VOL:
651*4882a593Smuzhiyun case RT5659_EJD_CTRL_1:
652*4882a593Smuzhiyun case RT5659_EJD_CTRL_2:
653*4882a593Smuzhiyun case RT5659_EJD_CTRL_3:
654*4882a593Smuzhiyun case RT5659_SILENCE_CTRL:
655*4882a593Smuzhiyun case RT5659_PSV_CTRL:
656*4882a593Smuzhiyun case RT5659_SIDETONE_CTRL:
657*4882a593Smuzhiyun case RT5659_DAC1_DIG_VOL:
658*4882a593Smuzhiyun case RT5659_DAC2_DIG_VOL:
659*4882a593Smuzhiyun case RT5659_DAC_CTRL:
660*4882a593Smuzhiyun case RT5659_STO1_ADC_DIG_VOL:
661*4882a593Smuzhiyun case RT5659_MONO_ADC_DIG_VOL:
662*4882a593Smuzhiyun case RT5659_STO2_ADC_DIG_VOL:
663*4882a593Smuzhiyun case RT5659_STO1_BOOST:
664*4882a593Smuzhiyun case RT5659_MONO_BOOST:
665*4882a593Smuzhiyun case RT5659_STO2_BOOST:
666*4882a593Smuzhiyun case RT5659_HP_IMP_GAIN_1:
667*4882a593Smuzhiyun case RT5659_HP_IMP_GAIN_2:
668*4882a593Smuzhiyun case RT5659_STO1_ADC_MIXER:
669*4882a593Smuzhiyun case RT5659_MONO_ADC_MIXER:
670*4882a593Smuzhiyun case RT5659_AD_DA_MIXER:
671*4882a593Smuzhiyun case RT5659_STO_DAC_MIXER:
672*4882a593Smuzhiyun case RT5659_MONO_DAC_MIXER:
673*4882a593Smuzhiyun case RT5659_DIG_MIXER:
674*4882a593Smuzhiyun case RT5659_A_DAC_MUX:
675*4882a593Smuzhiyun case RT5659_DIG_INF23_DATA:
676*4882a593Smuzhiyun case RT5659_PDM_OUT_CTRL:
677*4882a593Smuzhiyun case RT5659_PDM_DATA_CTRL_1:
678*4882a593Smuzhiyun case RT5659_PDM_DATA_CTRL_2:
679*4882a593Smuzhiyun case RT5659_PDM_DATA_CTRL_3:
680*4882a593Smuzhiyun case RT5659_PDM_DATA_CTRL_4:
681*4882a593Smuzhiyun case RT5659_SPDIF_CTRL:
682*4882a593Smuzhiyun case RT5659_REC1_GAIN:
683*4882a593Smuzhiyun case RT5659_REC1_L1_MIXER:
684*4882a593Smuzhiyun case RT5659_REC1_L2_MIXER:
685*4882a593Smuzhiyun case RT5659_REC1_R1_MIXER:
686*4882a593Smuzhiyun case RT5659_REC1_R2_MIXER:
687*4882a593Smuzhiyun case RT5659_CAL_REC:
688*4882a593Smuzhiyun case RT5659_REC2_L1_MIXER:
689*4882a593Smuzhiyun case RT5659_REC2_L2_MIXER:
690*4882a593Smuzhiyun case RT5659_REC2_R1_MIXER:
691*4882a593Smuzhiyun case RT5659_REC2_R2_MIXER:
692*4882a593Smuzhiyun case RT5659_SPK_L_MIXER:
693*4882a593Smuzhiyun case RT5659_SPK_R_MIXER:
694*4882a593Smuzhiyun case RT5659_SPO_AMP_GAIN:
695*4882a593Smuzhiyun case RT5659_ALC_BACK_GAIN:
696*4882a593Smuzhiyun case RT5659_MONOMIX_GAIN:
697*4882a593Smuzhiyun case RT5659_MONOMIX_IN_GAIN:
698*4882a593Smuzhiyun case RT5659_OUT_L_GAIN:
699*4882a593Smuzhiyun case RT5659_OUT_L_MIXER:
700*4882a593Smuzhiyun case RT5659_OUT_R_GAIN:
701*4882a593Smuzhiyun case RT5659_OUT_R_MIXER:
702*4882a593Smuzhiyun case RT5659_LOUT_MIXER:
703*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_1:
704*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_2:
705*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_3:
706*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_4:
707*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_5:
708*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_6:
709*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_7:
710*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_8:
711*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_9:
712*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_10:
713*4882a593Smuzhiyun case RT5659_HAPTIC_GEN_CTRL_11:
714*4882a593Smuzhiyun case RT5659_HAPTIC_LPF_CTRL_1:
715*4882a593Smuzhiyun case RT5659_HAPTIC_LPF_CTRL_2:
716*4882a593Smuzhiyun case RT5659_HAPTIC_LPF_CTRL_3:
717*4882a593Smuzhiyun case RT5659_PWR_DIG_1:
718*4882a593Smuzhiyun case RT5659_PWR_DIG_2:
719*4882a593Smuzhiyun case RT5659_PWR_ANLG_1:
720*4882a593Smuzhiyun case RT5659_PWR_ANLG_2:
721*4882a593Smuzhiyun case RT5659_PWR_ANLG_3:
722*4882a593Smuzhiyun case RT5659_PWR_MIXER:
723*4882a593Smuzhiyun case RT5659_PWR_VOL:
724*4882a593Smuzhiyun case RT5659_PRIV_INDEX:
725*4882a593Smuzhiyun case RT5659_CLK_DET:
726*4882a593Smuzhiyun case RT5659_PRIV_DATA:
727*4882a593Smuzhiyun case RT5659_PRE_DIV_1:
728*4882a593Smuzhiyun case RT5659_PRE_DIV_2:
729*4882a593Smuzhiyun case RT5659_I2S1_SDP:
730*4882a593Smuzhiyun case RT5659_I2S2_SDP:
731*4882a593Smuzhiyun case RT5659_I2S3_SDP:
732*4882a593Smuzhiyun case RT5659_ADDA_CLK_1:
733*4882a593Smuzhiyun case RT5659_ADDA_CLK_2:
734*4882a593Smuzhiyun case RT5659_DMIC_CTRL_1:
735*4882a593Smuzhiyun case RT5659_DMIC_CTRL_2:
736*4882a593Smuzhiyun case RT5659_TDM_CTRL_1:
737*4882a593Smuzhiyun case RT5659_TDM_CTRL_2:
738*4882a593Smuzhiyun case RT5659_TDM_CTRL_3:
739*4882a593Smuzhiyun case RT5659_TDM_CTRL_4:
740*4882a593Smuzhiyun case RT5659_TDM_CTRL_5:
741*4882a593Smuzhiyun case RT5659_GLB_CLK:
742*4882a593Smuzhiyun case RT5659_PLL_CTRL_1:
743*4882a593Smuzhiyun case RT5659_PLL_CTRL_2:
744*4882a593Smuzhiyun case RT5659_ASRC_1:
745*4882a593Smuzhiyun case RT5659_ASRC_2:
746*4882a593Smuzhiyun case RT5659_ASRC_3:
747*4882a593Smuzhiyun case RT5659_ASRC_4:
748*4882a593Smuzhiyun case RT5659_ASRC_5:
749*4882a593Smuzhiyun case RT5659_ASRC_6:
750*4882a593Smuzhiyun case RT5659_ASRC_7:
751*4882a593Smuzhiyun case RT5659_ASRC_8:
752*4882a593Smuzhiyun case RT5659_ASRC_9:
753*4882a593Smuzhiyun case RT5659_ASRC_10:
754*4882a593Smuzhiyun case RT5659_DEPOP_1:
755*4882a593Smuzhiyun case RT5659_DEPOP_2:
756*4882a593Smuzhiyun case RT5659_DEPOP_3:
757*4882a593Smuzhiyun case RT5659_HP_CHARGE_PUMP_1:
758*4882a593Smuzhiyun case RT5659_HP_CHARGE_PUMP_2:
759*4882a593Smuzhiyun case RT5659_MICBIAS_1:
760*4882a593Smuzhiyun case RT5659_MICBIAS_2:
761*4882a593Smuzhiyun case RT5659_ASRC_11:
762*4882a593Smuzhiyun case RT5659_ASRC_12:
763*4882a593Smuzhiyun case RT5659_ASRC_13:
764*4882a593Smuzhiyun case RT5659_REC_M1_M2_GAIN_CTRL:
765*4882a593Smuzhiyun case RT5659_RC_CLK_CTRL:
766*4882a593Smuzhiyun case RT5659_CLASSD_CTRL_1:
767*4882a593Smuzhiyun case RT5659_CLASSD_CTRL_2:
768*4882a593Smuzhiyun case RT5659_ADC_EQ_CTRL_1:
769*4882a593Smuzhiyun case RT5659_ADC_EQ_CTRL_2:
770*4882a593Smuzhiyun case RT5659_DAC_EQ_CTRL_1:
771*4882a593Smuzhiyun case RT5659_DAC_EQ_CTRL_2:
772*4882a593Smuzhiyun case RT5659_DAC_EQ_CTRL_3:
773*4882a593Smuzhiyun case RT5659_IRQ_CTRL_1:
774*4882a593Smuzhiyun case RT5659_IRQ_CTRL_2:
775*4882a593Smuzhiyun case RT5659_IRQ_CTRL_3:
776*4882a593Smuzhiyun case RT5659_IRQ_CTRL_4:
777*4882a593Smuzhiyun case RT5659_IRQ_CTRL_5:
778*4882a593Smuzhiyun case RT5659_IRQ_CTRL_6:
779*4882a593Smuzhiyun case RT5659_INT_ST_1:
780*4882a593Smuzhiyun case RT5659_INT_ST_2:
781*4882a593Smuzhiyun case RT5659_GPIO_CTRL_1:
782*4882a593Smuzhiyun case RT5659_GPIO_CTRL_2:
783*4882a593Smuzhiyun case RT5659_GPIO_CTRL_3:
784*4882a593Smuzhiyun case RT5659_GPIO_CTRL_4:
785*4882a593Smuzhiyun case RT5659_GPIO_CTRL_5:
786*4882a593Smuzhiyun case RT5659_GPIO_STA:
787*4882a593Smuzhiyun case RT5659_SINE_GEN_CTRL_1:
788*4882a593Smuzhiyun case RT5659_SINE_GEN_CTRL_2:
789*4882a593Smuzhiyun case RT5659_SINE_GEN_CTRL_3:
790*4882a593Smuzhiyun case RT5659_HP_AMP_DET_CTRL_1:
791*4882a593Smuzhiyun case RT5659_HP_AMP_DET_CTRL_2:
792*4882a593Smuzhiyun case RT5659_SV_ZCD_1:
793*4882a593Smuzhiyun case RT5659_SV_ZCD_2:
794*4882a593Smuzhiyun case RT5659_IL_CMD_1:
795*4882a593Smuzhiyun case RT5659_IL_CMD_2:
796*4882a593Smuzhiyun case RT5659_IL_CMD_3:
797*4882a593Smuzhiyun case RT5659_IL_CMD_4:
798*4882a593Smuzhiyun case RT5659_4BTN_IL_CMD_1:
799*4882a593Smuzhiyun case RT5659_4BTN_IL_CMD_2:
800*4882a593Smuzhiyun case RT5659_4BTN_IL_CMD_3:
801*4882a593Smuzhiyun case RT5659_PSV_IL_CMD_1:
802*4882a593Smuzhiyun case RT5659_PSV_IL_CMD_2:
803*4882a593Smuzhiyun case RT5659_ADC_STO1_HP_CTRL_1:
804*4882a593Smuzhiyun case RT5659_ADC_STO1_HP_CTRL_2:
805*4882a593Smuzhiyun case RT5659_ADC_MONO_HP_CTRL_1:
806*4882a593Smuzhiyun case RT5659_ADC_MONO_HP_CTRL_2:
807*4882a593Smuzhiyun case RT5659_AJD1_CTRL:
808*4882a593Smuzhiyun case RT5659_AJD2_AJD3_CTRL:
809*4882a593Smuzhiyun case RT5659_JD1_THD:
810*4882a593Smuzhiyun case RT5659_JD2_THD:
811*4882a593Smuzhiyun case RT5659_JD3_THD:
812*4882a593Smuzhiyun case RT5659_JD_CTRL_1:
813*4882a593Smuzhiyun case RT5659_JD_CTRL_2:
814*4882a593Smuzhiyun case RT5659_JD_CTRL_3:
815*4882a593Smuzhiyun case RT5659_JD_CTRL_4:
816*4882a593Smuzhiyun case RT5659_DIG_MISC:
817*4882a593Smuzhiyun case RT5659_DUMMY_2:
818*4882a593Smuzhiyun case RT5659_DUMMY_3:
819*4882a593Smuzhiyun case RT5659_VENDOR_ID:
820*4882a593Smuzhiyun case RT5659_VENDOR_ID_1:
821*4882a593Smuzhiyun case RT5659_DEVICE_ID:
822*4882a593Smuzhiyun case RT5659_DAC_ADC_DIG_VOL:
823*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_1:
824*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_2:
825*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_3:
826*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_4:
827*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_5:
828*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_6:
829*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_7:
830*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_8:
831*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_9:
832*4882a593Smuzhiyun case RT5659_BIAS_CUR_CTRL_10:
833*4882a593Smuzhiyun case RT5659_MEMORY_TEST:
834*4882a593Smuzhiyun case RT5659_VREF_REC_OP_FB_CAP_CTRL:
835*4882a593Smuzhiyun case RT5659_CLASSD_0:
836*4882a593Smuzhiyun case RT5659_CLASSD_1:
837*4882a593Smuzhiyun case RT5659_CLASSD_2:
838*4882a593Smuzhiyun case RT5659_CLASSD_3:
839*4882a593Smuzhiyun case RT5659_CLASSD_4:
840*4882a593Smuzhiyun case RT5659_CLASSD_5:
841*4882a593Smuzhiyun case RT5659_CLASSD_6:
842*4882a593Smuzhiyun case RT5659_CLASSD_7:
843*4882a593Smuzhiyun case RT5659_CLASSD_8:
844*4882a593Smuzhiyun case RT5659_CLASSD_9:
845*4882a593Smuzhiyun case RT5659_CLASSD_10:
846*4882a593Smuzhiyun case RT5659_CHARGE_PUMP_1:
847*4882a593Smuzhiyun case RT5659_CHARGE_PUMP_2:
848*4882a593Smuzhiyun case RT5659_DIG_IN_CTRL_1:
849*4882a593Smuzhiyun case RT5659_DIG_IN_CTRL_2:
850*4882a593Smuzhiyun case RT5659_PAD_DRIVING_CTRL:
851*4882a593Smuzhiyun case RT5659_SOFT_RAMP_DEPOP:
852*4882a593Smuzhiyun case RT5659_PLL:
853*4882a593Smuzhiyun case RT5659_CHOP_DAC:
854*4882a593Smuzhiyun case RT5659_CHOP_ADC:
855*4882a593Smuzhiyun case RT5659_CALIB_ADC_CTRL:
856*4882a593Smuzhiyun case RT5659_SOFT_RAMP_DEPOP_DAC_CLK_CTRL:
857*4882a593Smuzhiyun case RT5659_VOL_TEST:
858*4882a593Smuzhiyun case RT5659_TEST_MODE_CTRL_1:
859*4882a593Smuzhiyun case RT5659_TEST_MODE_CTRL_2:
860*4882a593Smuzhiyun case RT5659_TEST_MODE_CTRL_3:
861*4882a593Smuzhiyun case RT5659_TEST_MODE_CTRL_4:
862*4882a593Smuzhiyun case RT5659_BASSBACK_CTRL:
863*4882a593Smuzhiyun case RT5659_MP3_PLUS_CTRL_1:
864*4882a593Smuzhiyun case RT5659_MP3_PLUS_CTRL_2:
865*4882a593Smuzhiyun case RT5659_MP3_HPF_A1:
866*4882a593Smuzhiyun case RT5659_MP3_HPF_A2:
867*4882a593Smuzhiyun case RT5659_MP3_HPF_H0:
868*4882a593Smuzhiyun case RT5659_MP3_LPF_H0:
869*4882a593Smuzhiyun case RT5659_3D_SPK_CTRL:
870*4882a593Smuzhiyun case RT5659_3D_SPK_COEF_1:
871*4882a593Smuzhiyun case RT5659_3D_SPK_COEF_2:
872*4882a593Smuzhiyun case RT5659_3D_SPK_COEF_3:
873*4882a593Smuzhiyun case RT5659_3D_SPK_COEF_4:
874*4882a593Smuzhiyun case RT5659_3D_SPK_COEF_5:
875*4882a593Smuzhiyun case RT5659_3D_SPK_COEF_6:
876*4882a593Smuzhiyun case RT5659_3D_SPK_COEF_7:
877*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_1:
878*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_2:
879*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_3:
880*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_4:
881*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_5:
882*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_6:
883*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_7:
884*4882a593Smuzhiyun case RT5659_STO_NG2_CTRL_8:
885*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_1:
886*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_2:
887*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_3:
888*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_4:
889*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_5:
890*4882a593Smuzhiyun case RT5659_MONO_NG2_CTRL_6:
891*4882a593Smuzhiyun case RT5659_MID_HP_AMP_DET:
892*4882a593Smuzhiyun case RT5659_LOW_HP_AMP_DET:
893*4882a593Smuzhiyun case RT5659_LDO_CTRL:
894*4882a593Smuzhiyun case RT5659_HP_DECROSS_CTRL_1:
895*4882a593Smuzhiyun case RT5659_HP_DECROSS_CTRL_2:
896*4882a593Smuzhiyun case RT5659_HP_DECROSS_CTRL_3:
897*4882a593Smuzhiyun case RT5659_HP_DECROSS_CTRL_4:
898*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_CTRL_1:
899*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_CTRL_2:
900*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_CTRL_3:
901*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_CTRL_4:
902*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_MAP_1:
903*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_MAP_2:
904*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_MAP_3:
905*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_MAP_4:
906*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_MAP_5:
907*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_MAP_6:
908*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_MAP_7:
909*4882a593Smuzhiyun case RT5659_HP_IMP_SENS_MAP_8:
910*4882a593Smuzhiyun case RT5659_HP_LOGIC_CTRL_1:
911*4882a593Smuzhiyun case RT5659_HP_LOGIC_CTRL_2:
912*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_1:
913*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_2:
914*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_3:
915*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_4:
916*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_5:
917*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_6:
918*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_7:
919*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_9:
920*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_10:
921*4882a593Smuzhiyun case RT5659_HP_CALIB_CTRL_11:
922*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_1:
923*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_2:
924*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_3:
925*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_4:
926*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_5:
927*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_6:
928*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_7:
929*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_8:
930*4882a593Smuzhiyun case RT5659_HP_CALIB_STA_9:
931*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_CTRL_1:
932*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_CTRL_2:
933*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_CTRL_3:
934*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_CTRL_4:
935*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_CTRL_5:
936*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_STA_1:
937*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_STA_2:
938*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_STA_3:
939*4882a593Smuzhiyun case RT5659_MONO_AMP_CALIB_STA_4:
940*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_CTRL_1:
941*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_CTRL_2:
942*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_CTRL_3:
943*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_1:
944*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_2:
945*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_3:
946*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_4:
947*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_5:
948*4882a593Smuzhiyun case RT5659_SPK_PWR_LMT_STA_6:
949*4882a593Smuzhiyun case RT5659_FLEX_SPK_BST_CTRL_1:
950*4882a593Smuzhiyun case RT5659_FLEX_SPK_BST_CTRL_2:
951*4882a593Smuzhiyun case RT5659_FLEX_SPK_BST_CTRL_3:
952*4882a593Smuzhiyun case RT5659_FLEX_SPK_BST_CTRL_4:
953*4882a593Smuzhiyun case RT5659_SPK_EX_LMT_CTRL_1:
954*4882a593Smuzhiyun case RT5659_SPK_EX_LMT_CTRL_2:
955*4882a593Smuzhiyun case RT5659_SPK_EX_LMT_CTRL_3:
956*4882a593Smuzhiyun case RT5659_SPK_EX_LMT_CTRL_4:
957*4882a593Smuzhiyun case RT5659_SPK_EX_LMT_CTRL_5:
958*4882a593Smuzhiyun case RT5659_SPK_EX_LMT_CTRL_6:
959*4882a593Smuzhiyun case RT5659_SPK_EX_LMT_CTRL_7:
960*4882a593Smuzhiyun case RT5659_ADJ_HPF_CTRL_1:
961*4882a593Smuzhiyun case RT5659_ADJ_HPF_CTRL_2:
962*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_CTRL_1:
963*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_CTRL_2:
964*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_CTRL_3:
965*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_CTRL_4:
966*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_CTRL_5:
967*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_1:
968*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_2:
969*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_3:
970*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_4:
971*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_5:
972*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_6:
973*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_7:
974*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_8:
975*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_9:
976*4882a593Smuzhiyun case RT5659_SPK_DC_CAILB_STA_10:
977*4882a593Smuzhiyun case RT5659_SPK_VDD_STA_1:
978*4882a593Smuzhiyun case RT5659_SPK_VDD_STA_2:
979*4882a593Smuzhiyun case RT5659_SPK_DC_DET_CTRL_1:
980*4882a593Smuzhiyun case RT5659_SPK_DC_DET_CTRL_2:
981*4882a593Smuzhiyun case RT5659_SPK_DC_DET_CTRL_3:
982*4882a593Smuzhiyun case RT5659_PURE_DC_DET_CTRL_1:
983*4882a593Smuzhiyun case RT5659_PURE_DC_DET_CTRL_2:
984*4882a593Smuzhiyun case RT5659_DUMMY_4:
985*4882a593Smuzhiyun case RT5659_DUMMY_5:
986*4882a593Smuzhiyun case RT5659_DUMMY_6:
987*4882a593Smuzhiyun case RT5659_DRC1_CTRL_1:
988*4882a593Smuzhiyun case RT5659_DRC1_CTRL_2:
989*4882a593Smuzhiyun case RT5659_DRC1_CTRL_3:
990*4882a593Smuzhiyun case RT5659_DRC1_CTRL_4:
991*4882a593Smuzhiyun case RT5659_DRC1_CTRL_5:
992*4882a593Smuzhiyun case RT5659_DRC1_CTRL_6:
993*4882a593Smuzhiyun case RT5659_DRC1_HARD_LMT_CTRL_1:
994*4882a593Smuzhiyun case RT5659_DRC1_HARD_LMT_CTRL_2:
995*4882a593Smuzhiyun case RT5659_DRC2_CTRL_1:
996*4882a593Smuzhiyun case RT5659_DRC2_CTRL_2:
997*4882a593Smuzhiyun case RT5659_DRC2_CTRL_3:
998*4882a593Smuzhiyun case RT5659_DRC2_CTRL_4:
999*4882a593Smuzhiyun case RT5659_DRC2_CTRL_5:
1000*4882a593Smuzhiyun case RT5659_DRC2_CTRL_6:
1001*4882a593Smuzhiyun case RT5659_DRC2_HARD_LMT_CTRL_1:
1002*4882a593Smuzhiyun case RT5659_DRC2_HARD_LMT_CTRL_2:
1003*4882a593Smuzhiyun case RT5659_DRC1_PRIV_1:
1004*4882a593Smuzhiyun case RT5659_DRC1_PRIV_2:
1005*4882a593Smuzhiyun case RT5659_DRC1_PRIV_3:
1006*4882a593Smuzhiyun case RT5659_DRC1_PRIV_4:
1007*4882a593Smuzhiyun case RT5659_DRC1_PRIV_5:
1008*4882a593Smuzhiyun case RT5659_DRC1_PRIV_6:
1009*4882a593Smuzhiyun case RT5659_DRC1_PRIV_7:
1010*4882a593Smuzhiyun case RT5659_DRC2_PRIV_1:
1011*4882a593Smuzhiyun case RT5659_DRC2_PRIV_2:
1012*4882a593Smuzhiyun case RT5659_DRC2_PRIV_3:
1013*4882a593Smuzhiyun case RT5659_DRC2_PRIV_4:
1014*4882a593Smuzhiyun case RT5659_DRC2_PRIV_5:
1015*4882a593Smuzhiyun case RT5659_DRC2_PRIV_6:
1016*4882a593Smuzhiyun case RT5659_DRC2_PRIV_7:
1017*4882a593Smuzhiyun case RT5659_MULTI_DRC_CTRL:
1018*4882a593Smuzhiyun case RT5659_CROSS_OVER_1:
1019*4882a593Smuzhiyun case RT5659_CROSS_OVER_2:
1020*4882a593Smuzhiyun case RT5659_CROSS_OVER_3:
1021*4882a593Smuzhiyun case RT5659_CROSS_OVER_4:
1022*4882a593Smuzhiyun case RT5659_CROSS_OVER_5:
1023*4882a593Smuzhiyun case RT5659_CROSS_OVER_6:
1024*4882a593Smuzhiyun case RT5659_CROSS_OVER_7:
1025*4882a593Smuzhiyun case RT5659_CROSS_OVER_8:
1026*4882a593Smuzhiyun case RT5659_CROSS_OVER_9:
1027*4882a593Smuzhiyun case RT5659_CROSS_OVER_10:
1028*4882a593Smuzhiyun case RT5659_ALC_PGA_CTRL_1:
1029*4882a593Smuzhiyun case RT5659_ALC_PGA_CTRL_2:
1030*4882a593Smuzhiyun case RT5659_ALC_PGA_CTRL_3:
1031*4882a593Smuzhiyun case RT5659_ALC_PGA_CTRL_4:
1032*4882a593Smuzhiyun case RT5659_ALC_PGA_CTRL_5:
1033*4882a593Smuzhiyun case RT5659_ALC_PGA_CTRL_6:
1034*4882a593Smuzhiyun case RT5659_ALC_PGA_CTRL_7:
1035*4882a593Smuzhiyun case RT5659_ALC_PGA_CTRL_8:
1036*4882a593Smuzhiyun case RT5659_ALC_PGA_STA_1:
1037*4882a593Smuzhiyun case RT5659_ALC_PGA_STA_2:
1038*4882a593Smuzhiyun case RT5659_ALC_PGA_STA_3:
1039*4882a593Smuzhiyun case RT5659_DAC_L_EQ_PRE_VOL:
1040*4882a593Smuzhiyun case RT5659_DAC_R_EQ_PRE_VOL:
1041*4882a593Smuzhiyun case RT5659_DAC_L_EQ_POST_VOL:
1042*4882a593Smuzhiyun case RT5659_DAC_R_EQ_POST_VOL:
1043*4882a593Smuzhiyun case RT5659_DAC_L_EQ_LPF1_A1:
1044*4882a593Smuzhiyun case RT5659_DAC_L_EQ_LPF1_H0:
1045*4882a593Smuzhiyun case RT5659_DAC_R_EQ_LPF1_A1:
1046*4882a593Smuzhiyun case RT5659_DAC_R_EQ_LPF1_H0:
1047*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF2_A1:
1048*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF2_A2:
1049*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF2_H0:
1050*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF2_A1:
1051*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF2_A2:
1052*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF2_H0:
1053*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF3_A1:
1054*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF3_A2:
1055*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF3_H0:
1056*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF3_A1:
1057*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF3_A2:
1058*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF3_H0:
1059*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF4_A1:
1060*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF4_A2:
1061*4882a593Smuzhiyun case RT5659_DAC_L_EQ_BPF4_H0:
1062*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF4_A1:
1063*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF4_A2:
1064*4882a593Smuzhiyun case RT5659_DAC_R_EQ_BPF4_H0:
1065*4882a593Smuzhiyun case RT5659_DAC_L_EQ_HPF1_A1:
1066*4882a593Smuzhiyun case RT5659_DAC_L_EQ_HPF1_H0:
1067*4882a593Smuzhiyun case RT5659_DAC_R_EQ_HPF1_A1:
1068*4882a593Smuzhiyun case RT5659_DAC_R_EQ_HPF1_H0:
1069*4882a593Smuzhiyun case RT5659_DAC_L_EQ_HPF2_A1:
1070*4882a593Smuzhiyun case RT5659_DAC_L_EQ_HPF2_A2:
1071*4882a593Smuzhiyun case RT5659_DAC_L_EQ_HPF2_H0:
1072*4882a593Smuzhiyun case RT5659_DAC_R_EQ_HPF2_A1:
1073*4882a593Smuzhiyun case RT5659_DAC_R_EQ_HPF2_A2:
1074*4882a593Smuzhiyun case RT5659_DAC_R_EQ_HPF2_H0:
1075*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_H0_1:
1076*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_H0_2:
1077*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_B1_1:
1078*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_B1_2:
1079*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_B2_1:
1080*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_B2_2:
1081*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_A1_1:
1082*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_A1_2:
1083*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_A2_1:
1084*4882a593Smuzhiyun case RT5659_DAC_L_BI_EQ_BPF1_A2_2:
1085*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_H0_1:
1086*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_H0_2:
1087*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_B1_1:
1088*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_B1_2:
1089*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_B2_1:
1090*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_B2_2:
1091*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_A1_1:
1092*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_A1_2:
1093*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_A2_1:
1094*4882a593Smuzhiyun case RT5659_DAC_R_BI_EQ_BPF1_A2_2:
1095*4882a593Smuzhiyun case RT5659_ADC_L_EQ_LPF1_A1:
1096*4882a593Smuzhiyun case RT5659_ADC_R_EQ_LPF1_A1:
1097*4882a593Smuzhiyun case RT5659_ADC_L_EQ_LPF1_H0:
1098*4882a593Smuzhiyun case RT5659_ADC_R_EQ_LPF1_H0:
1099*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF1_A1:
1100*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF1_A1:
1101*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF1_A2:
1102*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF1_A2:
1103*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF1_H0:
1104*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF1_H0:
1105*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF2_A1:
1106*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF2_A1:
1107*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF2_A2:
1108*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF2_A2:
1109*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF2_H0:
1110*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF2_H0:
1111*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF3_A1:
1112*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF3_A1:
1113*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF3_A2:
1114*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF3_A2:
1115*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF3_H0:
1116*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF3_H0:
1117*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF4_A1:
1118*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF4_A1:
1119*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF4_A2:
1120*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF4_A2:
1121*4882a593Smuzhiyun case RT5659_ADC_L_EQ_BPF4_H0:
1122*4882a593Smuzhiyun case RT5659_ADC_R_EQ_BPF4_H0:
1123*4882a593Smuzhiyun case RT5659_ADC_L_EQ_HPF1_A1:
1124*4882a593Smuzhiyun case RT5659_ADC_R_EQ_HPF1_A1:
1125*4882a593Smuzhiyun case RT5659_ADC_L_EQ_HPF1_H0:
1126*4882a593Smuzhiyun case RT5659_ADC_R_EQ_HPF1_H0:
1127*4882a593Smuzhiyun case RT5659_ADC_L_EQ_PRE_VOL:
1128*4882a593Smuzhiyun case RT5659_ADC_R_EQ_PRE_VOL:
1129*4882a593Smuzhiyun case RT5659_ADC_L_EQ_POST_VOL:
1130*4882a593Smuzhiyun case RT5659_ADC_R_EQ_POST_VOL:
1131*4882a593Smuzhiyun return true;
1132*4882a593Smuzhiyun default:
1133*4882a593Smuzhiyun return false;
1134*4882a593Smuzhiyun }
1135*4882a593Smuzhiyun }
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -2325, 75, 0);
1138*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
1139*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
1140*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
1141*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
1142*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
1143*4882a593Smuzhiyun static const DECLARE_TLV_DB_SCALE(in_bst_tlv, -1200, 75, 0);
1144*4882a593Smuzhiyun
1145*4882a593Smuzhiyun /* Interface data select */
1146*4882a593Smuzhiyun static const char * const rt5659_data_select[] = {
1147*4882a593Smuzhiyun "L/R", "R/L", "L/L", "R/R"
1148*4882a593Smuzhiyun };
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5659_if1_01_adc_enum,
1151*4882a593Smuzhiyun RT5659_TDM_CTRL_2, RT5659_DS_ADC_SLOT01_SFT, rt5659_data_select);
1152*4882a593Smuzhiyun
1153*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5659_if1_23_adc_enum,
1154*4882a593Smuzhiyun RT5659_TDM_CTRL_2, RT5659_DS_ADC_SLOT23_SFT, rt5659_data_select);
1155*4882a593Smuzhiyun
1156*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5659_if1_45_adc_enum,
1157*4882a593Smuzhiyun RT5659_TDM_CTRL_2, RT5659_DS_ADC_SLOT45_SFT, rt5659_data_select);
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5659_if1_67_adc_enum,
1160*4882a593Smuzhiyun RT5659_TDM_CTRL_2, RT5659_DS_ADC_SLOT67_SFT, rt5659_data_select);
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5659_if2_dac_enum,
1163*4882a593Smuzhiyun RT5659_DIG_INF23_DATA, RT5659_IF2_DAC_SEL_SFT, rt5659_data_select);
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5659_if2_adc_enum,
1166*4882a593Smuzhiyun RT5659_DIG_INF23_DATA, RT5659_IF2_ADC_SEL_SFT, rt5659_data_select);
1167*4882a593Smuzhiyun
1168*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5659_if3_dac_enum,
1169*4882a593Smuzhiyun RT5659_DIG_INF23_DATA, RT5659_IF3_DAC_SEL_SFT, rt5659_data_select);
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(rt5659_if3_adc_enum,
1172*4882a593Smuzhiyun RT5659_DIG_INF23_DATA, RT5659_IF3_ADC_SEL_SFT, rt5659_data_select);
1173*4882a593Smuzhiyun
1174*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if1_01_adc_swap_mux =
1175*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 01 ADC Swap Source", rt5659_if1_01_adc_enum);
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if1_23_adc_swap_mux =
1178*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 23 ADC1 Swap Source", rt5659_if1_23_adc_enum);
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if1_45_adc_swap_mux =
1181*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 45 ADC1 Swap Source", rt5659_if1_45_adc_enum);
1182*4882a593Smuzhiyun
1183*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if1_67_adc_swap_mux =
1184*4882a593Smuzhiyun SOC_DAPM_ENUM("IF1 67 ADC1 Swap Source", rt5659_if1_67_adc_enum);
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if2_dac_swap_mux =
1187*4882a593Smuzhiyun SOC_DAPM_ENUM("IF2 DAC Swap Source", rt5659_if2_dac_enum);
1188*4882a593Smuzhiyun
1189*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if2_adc_swap_mux =
1190*4882a593Smuzhiyun SOC_DAPM_ENUM("IF2 ADC Swap Source", rt5659_if2_adc_enum);
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if3_dac_swap_mux =
1193*4882a593Smuzhiyun SOC_DAPM_ENUM("IF3 DAC Swap Source", rt5659_if3_dac_enum);
1194*4882a593Smuzhiyun
1195*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if3_adc_swap_mux =
1196*4882a593Smuzhiyun SOC_DAPM_ENUM("IF3 ADC Swap Source", rt5659_if3_adc_enum);
1197*4882a593Smuzhiyun
rt5659_hp_vol_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1198*4882a593Smuzhiyun static int rt5659_hp_vol_put(struct snd_kcontrol *kcontrol,
1199*4882a593Smuzhiyun struct snd_ctl_elem_value *ucontrol)
1200*4882a593Smuzhiyun {
1201*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1202*4882a593Smuzhiyun int ret = snd_soc_put_volsw(kcontrol, ucontrol);
1203*4882a593Smuzhiyun
1204*4882a593Smuzhiyun if (snd_soc_component_read(component, RT5659_STO_NG2_CTRL_1) & RT5659_NG2_EN) {
1205*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_STO_NG2_CTRL_1,
1206*4882a593Smuzhiyun RT5659_NG2_EN_MASK, RT5659_NG2_DIS);
1207*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_STO_NG2_CTRL_1,
1208*4882a593Smuzhiyun RT5659_NG2_EN_MASK, RT5659_NG2_EN);
1209*4882a593Smuzhiyun }
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyun return ret;
1212*4882a593Smuzhiyun }
1213*4882a593Smuzhiyun
rt5659_enable_push_button_irq(struct snd_soc_component * component,bool enable)1214*4882a593Smuzhiyun static void rt5659_enable_push_button_irq(struct snd_soc_component *component,
1215*4882a593Smuzhiyun bool enable)
1216*4882a593Smuzhiyun {
1217*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1218*4882a593Smuzhiyun
1219*4882a593Smuzhiyun if (enable) {
1220*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_4BTN_IL_CMD_1, 0x000b);
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun /* MICBIAS1 and Mic Det Power for button detect*/
1223*4882a593Smuzhiyun snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1");
1224*4882a593Smuzhiyun snd_soc_dapm_force_enable_pin(dapm,
1225*4882a593Smuzhiyun "Mic Det Power");
1226*4882a593Smuzhiyun snd_soc_dapm_sync(dapm);
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_PWR_ANLG_2,
1229*4882a593Smuzhiyun RT5659_PWR_MB1, RT5659_PWR_MB1);
1230*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_PWR_VOL,
1231*4882a593Smuzhiyun RT5659_PWR_MIC_DET, RT5659_PWR_MIC_DET);
1232*4882a593Smuzhiyun
1233*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_IRQ_CTRL_2,
1234*4882a593Smuzhiyun RT5659_IL_IRQ_MASK, RT5659_IL_IRQ_EN);
1235*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_4BTN_IL_CMD_2,
1236*4882a593Smuzhiyun RT5659_4BTN_IL_MASK, RT5659_4BTN_IL_EN);
1237*4882a593Smuzhiyun } else {
1238*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_4BTN_IL_CMD_2,
1239*4882a593Smuzhiyun RT5659_4BTN_IL_MASK, RT5659_4BTN_IL_DIS);
1240*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_IRQ_CTRL_2,
1241*4882a593Smuzhiyun RT5659_IL_IRQ_MASK, RT5659_IL_IRQ_DIS);
1242*4882a593Smuzhiyun /* MICBIAS1 and Mic Det Power for button detect*/
1243*4882a593Smuzhiyun snd_soc_dapm_disable_pin(dapm, "MICBIAS1");
1244*4882a593Smuzhiyun snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
1245*4882a593Smuzhiyun snd_soc_dapm_sync(dapm);
1246*4882a593Smuzhiyun }
1247*4882a593Smuzhiyun }
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun /**
1250*4882a593Smuzhiyun * rt5659_headset_detect - Detect headset.
1251*4882a593Smuzhiyun * @component: SoC audio component device.
1252*4882a593Smuzhiyun * @jack_insert: Jack insert or not.
1253*4882a593Smuzhiyun *
1254*4882a593Smuzhiyun * Detect whether is headset or not when jack inserted.
1255*4882a593Smuzhiyun *
1256*4882a593Smuzhiyun * Returns detect status.
1257*4882a593Smuzhiyun */
1258*4882a593Smuzhiyun
rt5659_headset_detect(struct snd_soc_component * component,int jack_insert)1259*4882a593Smuzhiyun static int rt5659_headset_detect(struct snd_soc_component *component, int jack_insert)
1260*4882a593Smuzhiyun {
1261*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1262*4882a593Smuzhiyun int val, i = 0, sleep_time[5] = {300, 150, 100, 50, 30};
1263*4882a593Smuzhiyun int reg_63;
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
1266*4882a593Smuzhiyun
1267*4882a593Smuzhiyun if (jack_insert) {
1268*4882a593Smuzhiyun snd_soc_dapm_force_enable_pin(dapm,
1269*4882a593Smuzhiyun "Mic Det Power");
1270*4882a593Smuzhiyun snd_soc_dapm_sync(dapm);
1271*4882a593Smuzhiyun reg_63 = snd_soc_component_read(component, RT5659_PWR_ANLG_1);
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_PWR_ANLG_1,
1274*4882a593Smuzhiyun RT5659_PWR_VREF2 | RT5659_PWR_MB,
1275*4882a593Smuzhiyun RT5659_PWR_VREF2 | RT5659_PWR_MB);
1276*4882a593Smuzhiyun msleep(20);
1277*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_PWR_ANLG_1,
1278*4882a593Smuzhiyun RT5659_PWR_FV2, RT5659_PWR_FV2);
1279*4882a593Smuzhiyun
1280*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_EJD_CTRL_2, 0x4160);
1281*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_EJD_CTRL_1,
1282*4882a593Smuzhiyun 0x20, 0x0);
1283*4882a593Smuzhiyun msleep(20);
1284*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_EJD_CTRL_1,
1285*4882a593Smuzhiyun 0x20, 0x20);
1286*4882a593Smuzhiyun
1287*4882a593Smuzhiyun while (i < 5) {
1288*4882a593Smuzhiyun msleep(sleep_time[i]);
1289*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5659_EJD_CTRL_2) & 0x0003;
1290*4882a593Smuzhiyun i++;
1291*4882a593Smuzhiyun if (val == 0x1 || val == 0x2 || val == 0x3)
1292*4882a593Smuzhiyun break;
1293*4882a593Smuzhiyun }
1294*4882a593Smuzhiyun
1295*4882a593Smuzhiyun switch (val) {
1296*4882a593Smuzhiyun case 1:
1297*4882a593Smuzhiyun rt5659->jack_type = SND_JACK_HEADSET;
1298*4882a593Smuzhiyun rt5659_enable_push_button_irq(component, true);
1299*4882a593Smuzhiyun break;
1300*4882a593Smuzhiyun default:
1301*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_PWR_ANLG_1, reg_63);
1302*4882a593Smuzhiyun rt5659->jack_type = SND_JACK_HEADPHONE;
1303*4882a593Smuzhiyun snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
1304*4882a593Smuzhiyun snd_soc_dapm_sync(dapm);
1305*4882a593Smuzhiyun break;
1306*4882a593Smuzhiyun }
1307*4882a593Smuzhiyun } else {
1308*4882a593Smuzhiyun snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
1309*4882a593Smuzhiyun snd_soc_dapm_sync(dapm);
1310*4882a593Smuzhiyun if (rt5659->jack_type == SND_JACK_HEADSET)
1311*4882a593Smuzhiyun rt5659_enable_push_button_irq(component, false);
1312*4882a593Smuzhiyun rt5659->jack_type = 0;
1313*4882a593Smuzhiyun }
1314*4882a593Smuzhiyun
1315*4882a593Smuzhiyun dev_dbg(component->dev, "jack_type = %d\n", rt5659->jack_type);
1316*4882a593Smuzhiyun return rt5659->jack_type;
1317*4882a593Smuzhiyun }
1318*4882a593Smuzhiyun
rt5659_button_detect(struct snd_soc_component * component)1319*4882a593Smuzhiyun static int rt5659_button_detect(struct snd_soc_component *component)
1320*4882a593Smuzhiyun {
1321*4882a593Smuzhiyun int btn_type, val;
1322*4882a593Smuzhiyun
1323*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5659_4BTN_IL_CMD_1);
1324*4882a593Smuzhiyun btn_type = val & 0xfff0;
1325*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_4BTN_IL_CMD_1, val);
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun return btn_type;
1328*4882a593Smuzhiyun }
1329*4882a593Smuzhiyun
rt5659_irq(int irq,void * data)1330*4882a593Smuzhiyun static irqreturn_t rt5659_irq(int irq, void *data)
1331*4882a593Smuzhiyun {
1332*4882a593Smuzhiyun struct rt5659_priv *rt5659 = data;
1333*4882a593Smuzhiyun
1334*4882a593Smuzhiyun queue_delayed_work(system_power_efficient_wq,
1335*4882a593Smuzhiyun &rt5659->jack_detect_work, msecs_to_jiffies(250));
1336*4882a593Smuzhiyun
1337*4882a593Smuzhiyun return IRQ_HANDLED;
1338*4882a593Smuzhiyun }
1339*4882a593Smuzhiyun
rt5659_set_jack_detect(struct snd_soc_component * component,struct snd_soc_jack * hs_jack)1340*4882a593Smuzhiyun int rt5659_set_jack_detect(struct snd_soc_component *component,
1341*4882a593Smuzhiyun struct snd_soc_jack *hs_jack)
1342*4882a593Smuzhiyun {
1343*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
1344*4882a593Smuzhiyun
1345*4882a593Smuzhiyun rt5659->hs_jack = hs_jack;
1346*4882a593Smuzhiyun
1347*4882a593Smuzhiyun rt5659_irq(0, rt5659);
1348*4882a593Smuzhiyun
1349*4882a593Smuzhiyun return 0;
1350*4882a593Smuzhiyun }
1351*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rt5659_set_jack_detect);
1352*4882a593Smuzhiyun
rt5659_jack_detect_work(struct work_struct * work)1353*4882a593Smuzhiyun static void rt5659_jack_detect_work(struct work_struct *work)
1354*4882a593Smuzhiyun {
1355*4882a593Smuzhiyun struct rt5659_priv *rt5659 =
1356*4882a593Smuzhiyun container_of(work, struct rt5659_priv, jack_detect_work.work);
1357*4882a593Smuzhiyun int val, btn_type, report = 0;
1358*4882a593Smuzhiyun
1359*4882a593Smuzhiyun if (!rt5659->component)
1360*4882a593Smuzhiyun return;
1361*4882a593Smuzhiyun
1362*4882a593Smuzhiyun val = snd_soc_component_read(rt5659->component, RT5659_INT_ST_1) & 0x0080;
1363*4882a593Smuzhiyun if (!val) {
1364*4882a593Smuzhiyun /* jack in */
1365*4882a593Smuzhiyun if (rt5659->jack_type == 0) {
1366*4882a593Smuzhiyun /* jack was out, report jack type */
1367*4882a593Smuzhiyun report = rt5659_headset_detect(rt5659->component, 1);
1368*4882a593Smuzhiyun } else {
1369*4882a593Smuzhiyun /* jack is already in, report button event */
1370*4882a593Smuzhiyun report = SND_JACK_HEADSET;
1371*4882a593Smuzhiyun btn_type = rt5659_button_detect(rt5659->component);
1372*4882a593Smuzhiyun /**
1373*4882a593Smuzhiyun * rt5659 can report three kinds of button behavior,
1374*4882a593Smuzhiyun * one click, double click and hold. However,
1375*4882a593Smuzhiyun * currently we will report button pressed/released
1376*4882a593Smuzhiyun * event. So all the three button behaviors are
1377*4882a593Smuzhiyun * treated as button pressed.
1378*4882a593Smuzhiyun */
1379*4882a593Smuzhiyun switch (btn_type) {
1380*4882a593Smuzhiyun case 0x8000:
1381*4882a593Smuzhiyun case 0x4000:
1382*4882a593Smuzhiyun case 0x2000:
1383*4882a593Smuzhiyun report |= SND_JACK_BTN_0;
1384*4882a593Smuzhiyun break;
1385*4882a593Smuzhiyun case 0x1000:
1386*4882a593Smuzhiyun case 0x0800:
1387*4882a593Smuzhiyun case 0x0400:
1388*4882a593Smuzhiyun report |= SND_JACK_BTN_1;
1389*4882a593Smuzhiyun break;
1390*4882a593Smuzhiyun case 0x0200:
1391*4882a593Smuzhiyun case 0x0100:
1392*4882a593Smuzhiyun case 0x0080:
1393*4882a593Smuzhiyun report |= SND_JACK_BTN_2;
1394*4882a593Smuzhiyun break;
1395*4882a593Smuzhiyun case 0x0040:
1396*4882a593Smuzhiyun case 0x0020:
1397*4882a593Smuzhiyun case 0x0010:
1398*4882a593Smuzhiyun report |= SND_JACK_BTN_3;
1399*4882a593Smuzhiyun break;
1400*4882a593Smuzhiyun case 0x0000: /* unpressed */
1401*4882a593Smuzhiyun break;
1402*4882a593Smuzhiyun default:
1403*4882a593Smuzhiyun btn_type = 0;
1404*4882a593Smuzhiyun dev_err(rt5659->component->dev,
1405*4882a593Smuzhiyun "Unexpected button code 0x%04x\n",
1406*4882a593Smuzhiyun btn_type);
1407*4882a593Smuzhiyun break;
1408*4882a593Smuzhiyun }
1409*4882a593Smuzhiyun
1410*4882a593Smuzhiyun /* button release or spurious interrput*/
1411*4882a593Smuzhiyun if (btn_type == 0)
1412*4882a593Smuzhiyun report = rt5659->jack_type;
1413*4882a593Smuzhiyun }
1414*4882a593Smuzhiyun } else {
1415*4882a593Smuzhiyun /* jack out */
1416*4882a593Smuzhiyun report = rt5659_headset_detect(rt5659->component, 0);
1417*4882a593Smuzhiyun }
1418*4882a593Smuzhiyun
1419*4882a593Smuzhiyun snd_soc_jack_report(rt5659->hs_jack, report, SND_JACK_HEADSET |
1420*4882a593Smuzhiyun SND_JACK_BTN_0 | SND_JACK_BTN_1 |
1421*4882a593Smuzhiyun SND_JACK_BTN_2 | SND_JACK_BTN_3);
1422*4882a593Smuzhiyun }
1423*4882a593Smuzhiyun
rt5659_jack_detect_intel_hd_header(struct work_struct * work)1424*4882a593Smuzhiyun static void rt5659_jack_detect_intel_hd_header(struct work_struct *work)
1425*4882a593Smuzhiyun {
1426*4882a593Smuzhiyun struct rt5659_priv *rt5659 =
1427*4882a593Smuzhiyun container_of(work, struct rt5659_priv, jack_detect_work.work);
1428*4882a593Smuzhiyun unsigned int value;
1429*4882a593Smuzhiyun bool hp_flag, mic_flag;
1430*4882a593Smuzhiyun
1431*4882a593Smuzhiyun if (!rt5659->hs_jack)
1432*4882a593Smuzhiyun return;
1433*4882a593Smuzhiyun
1434*4882a593Smuzhiyun /* headphone jack */
1435*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_GPIO_STA, &value);
1436*4882a593Smuzhiyun hp_flag = (!(value & 0x8)) ? true : false;
1437*4882a593Smuzhiyun
1438*4882a593Smuzhiyun if (hp_flag != rt5659->hda_hp_plugged) {
1439*4882a593Smuzhiyun rt5659->hda_hp_plugged = hp_flag;
1440*4882a593Smuzhiyun
1441*4882a593Smuzhiyun if (hp_flag) {
1442*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_1,
1443*4882a593Smuzhiyun 0x10, 0x0);
1444*4882a593Smuzhiyun rt5659->jack_type |= SND_JACK_HEADPHONE;
1445*4882a593Smuzhiyun } else {
1446*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_1,
1447*4882a593Smuzhiyun 0x10, 0x10);
1448*4882a593Smuzhiyun rt5659->jack_type = rt5659->jack_type &
1449*4882a593Smuzhiyun (~SND_JACK_HEADPHONE);
1450*4882a593Smuzhiyun }
1451*4882a593Smuzhiyun
1452*4882a593Smuzhiyun snd_soc_jack_report(rt5659->hs_jack, rt5659->jack_type,
1453*4882a593Smuzhiyun SND_JACK_HEADPHONE);
1454*4882a593Smuzhiyun }
1455*4882a593Smuzhiyun
1456*4882a593Smuzhiyun /* mic jack */
1457*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_4BTN_IL_CMD_1, &value);
1458*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_4BTN_IL_CMD_1, value);
1459*4882a593Smuzhiyun mic_flag = (value & 0x2000) ? true : false;
1460*4882a593Smuzhiyun
1461*4882a593Smuzhiyun if (mic_flag != rt5659->hda_mic_plugged) {
1462*4882a593Smuzhiyun rt5659->hda_mic_plugged = mic_flag;
1463*4882a593Smuzhiyun if (mic_flag) {
1464*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2,
1465*4882a593Smuzhiyun 0x2, 0x2);
1466*4882a593Smuzhiyun rt5659->jack_type |= SND_JACK_MICROPHONE;
1467*4882a593Smuzhiyun } else {
1468*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2,
1469*4882a593Smuzhiyun 0x2, 0x0);
1470*4882a593Smuzhiyun rt5659->jack_type = rt5659->jack_type
1471*4882a593Smuzhiyun & (~SND_JACK_MICROPHONE);
1472*4882a593Smuzhiyun }
1473*4882a593Smuzhiyun
1474*4882a593Smuzhiyun snd_soc_jack_report(rt5659->hs_jack, rt5659->jack_type,
1475*4882a593Smuzhiyun SND_JACK_MICROPHONE);
1476*4882a593Smuzhiyun }
1477*4882a593Smuzhiyun }
1478*4882a593Smuzhiyun
1479*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_snd_controls[] = {
1480*4882a593Smuzhiyun /* Speaker Output Volume */
1481*4882a593Smuzhiyun SOC_DOUBLE_TLV("Speaker Playback Volume", RT5659_SPO_VOL,
1482*4882a593Smuzhiyun RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 39, 1, out_vol_tlv),
1483*4882a593Smuzhiyun
1484*4882a593Smuzhiyun /* Headphone Output Volume */
1485*4882a593Smuzhiyun SOC_DOUBLE_R_EXT_TLV("Headphone Playback Volume", RT5659_HPL_GAIN,
1486*4882a593Smuzhiyun RT5659_HPR_GAIN, RT5659_G_HP_SFT, 31, 1, snd_soc_get_volsw,
1487*4882a593Smuzhiyun rt5659_hp_vol_put, hp_vol_tlv),
1488*4882a593Smuzhiyun
1489*4882a593Smuzhiyun /* Mono Output Volume */
1490*4882a593Smuzhiyun SOC_SINGLE_TLV("Mono Playback Volume", RT5659_MONO_OUT,
1491*4882a593Smuzhiyun RT5659_L_VOL_SFT, 39, 1, out_vol_tlv),
1492*4882a593Smuzhiyun
1493*4882a593Smuzhiyun /* Output Volume */
1494*4882a593Smuzhiyun SOC_DOUBLE_TLV("OUT Playback Volume", RT5659_LOUT,
1495*4882a593Smuzhiyun RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 39, 1, out_vol_tlv),
1496*4882a593Smuzhiyun
1497*4882a593Smuzhiyun /* DAC Digital Volume */
1498*4882a593Smuzhiyun SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5659_DAC1_DIG_VOL,
1499*4882a593Smuzhiyun RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 175, 0, dac_vol_tlv),
1500*4882a593Smuzhiyun SOC_DOUBLE("DAC1 Playback Switch", RT5659_AD_DA_MIXER,
1501*4882a593Smuzhiyun RT5659_M_DAC1_L_SFT, RT5659_M_DAC1_R_SFT, 1, 1),
1502*4882a593Smuzhiyun
1503*4882a593Smuzhiyun SOC_DOUBLE_TLV("DAC2 Playback Volume", RT5659_DAC2_DIG_VOL,
1504*4882a593Smuzhiyun RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 175, 0, dac_vol_tlv),
1505*4882a593Smuzhiyun SOC_DOUBLE("DAC2 Playback Switch", RT5659_DAC_CTRL,
1506*4882a593Smuzhiyun RT5659_M_DAC2_L_VOL_SFT, RT5659_M_DAC2_R_VOL_SFT, 1, 1),
1507*4882a593Smuzhiyun
1508*4882a593Smuzhiyun /* IN1/IN2/IN3/IN4 Volume */
1509*4882a593Smuzhiyun SOC_SINGLE_TLV("IN1 Boost Volume", RT5659_IN1_IN2,
1510*4882a593Smuzhiyun RT5659_BST1_SFT, 69, 0, in_bst_tlv),
1511*4882a593Smuzhiyun SOC_SINGLE_TLV("IN2 Boost Volume", RT5659_IN1_IN2,
1512*4882a593Smuzhiyun RT5659_BST2_SFT, 69, 0, in_bst_tlv),
1513*4882a593Smuzhiyun SOC_SINGLE_TLV("IN3 Boost Volume", RT5659_IN3_IN4,
1514*4882a593Smuzhiyun RT5659_BST3_SFT, 69, 0, in_bst_tlv),
1515*4882a593Smuzhiyun SOC_SINGLE_TLV("IN4 Boost Volume", RT5659_IN3_IN4,
1516*4882a593Smuzhiyun RT5659_BST4_SFT, 69, 0, in_bst_tlv),
1517*4882a593Smuzhiyun
1518*4882a593Smuzhiyun /* INL/INR Volume Control */
1519*4882a593Smuzhiyun SOC_DOUBLE_TLV("IN Capture Volume", RT5659_INL1_INR1_VOL,
1520*4882a593Smuzhiyun RT5659_INL_VOL_SFT, RT5659_INR_VOL_SFT, 31, 1, in_vol_tlv),
1521*4882a593Smuzhiyun
1522*4882a593Smuzhiyun /* ADC Digital Volume Control */
1523*4882a593Smuzhiyun SOC_DOUBLE("STO1 ADC Capture Switch", RT5659_STO1_ADC_DIG_VOL,
1524*4882a593Smuzhiyun RT5659_L_MUTE_SFT, RT5659_R_MUTE_SFT, 1, 1),
1525*4882a593Smuzhiyun SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5659_STO1_ADC_DIG_VOL,
1526*4882a593Smuzhiyun RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 127, 0, adc_vol_tlv),
1527*4882a593Smuzhiyun SOC_DOUBLE("Mono ADC Capture Switch", RT5659_MONO_ADC_DIG_VOL,
1528*4882a593Smuzhiyun RT5659_L_MUTE_SFT, RT5659_R_MUTE_SFT, 1, 1),
1529*4882a593Smuzhiyun SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5659_MONO_ADC_DIG_VOL,
1530*4882a593Smuzhiyun RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 127, 0, adc_vol_tlv),
1531*4882a593Smuzhiyun SOC_DOUBLE("STO2 ADC Capture Switch", RT5659_STO2_ADC_DIG_VOL,
1532*4882a593Smuzhiyun RT5659_L_MUTE_SFT, RT5659_R_MUTE_SFT, 1, 1),
1533*4882a593Smuzhiyun SOC_DOUBLE_TLV("STO2 ADC Capture Volume", RT5659_STO2_ADC_DIG_VOL,
1534*4882a593Smuzhiyun RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 127, 0, adc_vol_tlv),
1535*4882a593Smuzhiyun
1536*4882a593Smuzhiyun /* ADC Boost Volume Control */
1537*4882a593Smuzhiyun SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5659_STO1_BOOST,
1538*4882a593Smuzhiyun RT5659_STO1_ADC_L_BST_SFT, RT5659_STO1_ADC_R_BST_SFT,
1539*4882a593Smuzhiyun 3, 0, adc_bst_tlv),
1540*4882a593Smuzhiyun
1541*4882a593Smuzhiyun SOC_DOUBLE_TLV("Mono ADC Boost Gain Volume", RT5659_MONO_BOOST,
1542*4882a593Smuzhiyun RT5659_MONO_ADC_L_BST_SFT, RT5659_MONO_ADC_R_BST_SFT,
1543*4882a593Smuzhiyun 3, 0, adc_bst_tlv),
1544*4882a593Smuzhiyun
1545*4882a593Smuzhiyun SOC_DOUBLE_TLV("STO2 ADC Boost Gain Volume", RT5659_STO2_BOOST,
1546*4882a593Smuzhiyun RT5659_STO2_ADC_L_BST_SFT, RT5659_STO2_ADC_R_BST_SFT,
1547*4882a593Smuzhiyun 3, 0, adc_bst_tlv),
1548*4882a593Smuzhiyun
1549*4882a593Smuzhiyun SOC_SINGLE("DAC IF1 DAC1 L Data Switch", RT5659_TDM_CTRL_4, 12, 7, 0),
1550*4882a593Smuzhiyun SOC_SINGLE("DAC IF1 DAC1 R Data Switch", RT5659_TDM_CTRL_4, 8, 7, 0),
1551*4882a593Smuzhiyun SOC_SINGLE("DAC IF1 DAC2 L Data Switch", RT5659_TDM_CTRL_4, 4, 7, 0),
1552*4882a593Smuzhiyun SOC_SINGLE("DAC IF1 DAC2 R Data Switch", RT5659_TDM_CTRL_4, 0, 7, 0),
1553*4882a593Smuzhiyun };
1554*4882a593Smuzhiyun
1555*4882a593Smuzhiyun /**
1556*4882a593Smuzhiyun * set_dmic_clk - Set parameter of dmic.
1557*4882a593Smuzhiyun *
1558*4882a593Smuzhiyun * @w: DAPM widget.
1559*4882a593Smuzhiyun * @kcontrol: The kcontrol of this widget.
1560*4882a593Smuzhiyun * @event: Event id.
1561*4882a593Smuzhiyun *
1562*4882a593Smuzhiyun * Choose dmic clock between 1MHz and 3MHz.
1563*4882a593Smuzhiyun * It is better for clock to approximate 3MHz.
1564*4882a593Smuzhiyun */
set_dmic_clk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1565*4882a593Smuzhiyun static int set_dmic_clk(struct snd_soc_dapm_widget *w,
1566*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1567*4882a593Smuzhiyun {
1568*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1569*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
1570*4882a593Smuzhiyun int pd, idx;
1571*4882a593Smuzhiyun
1572*4882a593Smuzhiyun pd = rl6231_get_pre_div(rt5659->regmap,
1573*4882a593Smuzhiyun RT5659_ADDA_CLK_1, RT5659_I2S_PD1_SFT);
1574*4882a593Smuzhiyun idx = rl6231_calc_dmic_clk(rt5659->sysclk / pd);
1575*4882a593Smuzhiyun
1576*4882a593Smuzhiyun if (idx < 0)
1577*4882a593Smuzhiyun dev_err(component->dev, "Failed to set DMIC clock\n");
1578*4882a593Smuzhiyun else {
1579*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_DMIC_CTRL_1,
1580*4882a593Smuzhiyun RT5659_DMIC_CLK_MASK, idx << RT5659_DMIC_CLK_SFT);
1581*4882a593Smuzhiyun }
1582*4882a593Smuzhiyun return idx;
1583*4882a593Smuzhiyun }
1584*4882a593Smuzhiyun
set_adc1_clk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1585*4882a593Smuzhiyun static int set_adc1_clk(struct snd_soc_dapm_widget *w,
1586*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1587*4882a593Smuzhiyun {
1588*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1589*4882a593Smuzhiyun
1590*4882a593Smuzhiyun switch (event) {
1591*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMU:
1592*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_CHOP_ADC,
1593*4882a593Smuzhiyun RT5659_CKXEN_ADC1_MASK | RT5659_CKGEN_ADC1_MASK,
1594*4882a593Smuzhiyun RT5659_CKXEN_ADC1_MASK | RT5659_CKGEN_ADC1_MASK);
1595*4882a593Smuzhiyun break;
1596*4882a593Smuzhiyun
1597*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMD:
1598*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_CHOP_ADC,
1599*4882a593Smuzhiyun RT5659_CKXEN_ADC1_MASK | RT5659_CKGEN_ADC1_MASK, 0);
1600*4882a593Smuzhiyun break;
1601*4882a593Smuzhiyun
1602*4882a593Smuzhiyun default:
1603*4882a593Smuzhiyun return 0;
1604*4882a593Smuzhiyun }
1605*4882a593Smuzhiyun
1606*4882a593Smuzhiyun return 0;
1607*4882a593Smuzhiyun
1608*4882a593Smuzhiyun }
1609*4882a593Smuzhiyun
set_adc2_clk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1610*4882a593Smuzhiyun static int set_adc2_clk(struct snd_soc_dapm_widget *w,
1611*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1612*4882a593Smuzhiyun {
1613*4882a593Smuzhiyun struct snd_soc_component *component =
1614*4882a593Smuzhiyun snd_soc_dapm_to_component(w->dapm);
1615*4882a593Smuzhiyun
1616*4882a593Smuzhiyun switch (event) {
1617*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMU:
1618*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_CHOP_ADC,
1619*4882a593Smuzhiyun RT5659_CKXEN_ADC2_MASK | RT5659_CKGEN_ADC2_MASK,
1620*4882a593Smuzhiyun RT5659_CKXEN_ADC2_MASK | RT5659_CKGEN_ADC2_MASK);
1621*4882a593Smuzhiyun break;
1622*4882a593Smuzhiyun
1623*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMD:
1624*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_CHOP_ADC,
1625*4882a593Smuzhiyun RT5659_CKXEN_ADC2_MASK | RT5659_CKGEN_ADC2_MASK, 0);
1626*4882a593Smuzhiyun break;
1627*4882a593Smuzhiyun
1628*4882a593Smuzhiyun default:
1629*4882a593Smuzhiyun return 0;
1630*4882a593Smuzhiyun }
1631*4882a593Smuzhiyun
1632*4882a593Smuzhiyun return 0;
1633*4882a593Smuzhiyun
1634*4882a593Smuzhiyun }
1635*4882a593Smuzhiyun
rt5659_charge_pump_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1636*4882a593Smuzhiyun static int rt5659_charge_pump_event(struct snd_soc_dapm_widget *w,
1637*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
1638*4882a593Smuzhiyun {
1639*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1640*4882a593Smuzhiyun
1641*4882a593Smuzhiyun switch (event) {
1642*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMU:
1643*4882a593Smuzhiyun /* Depop */
1644*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_DEPOP_1, 0x0009);
1645*4882a593Smuzhiyun break;
1646*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMD:
1647*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_HP_CHARGE_PUMP_1, 0x0c16);
1648*4882a593Smuzhiyun break;
1649*4882a593Smuzhiyun default:
1650*4882a593Smuzhiyun return 0;
1651*4882a593Smuzhiyun }
1652*4882a593Smuzhiyun
1653*4882a593Smuzhiyun return 0;
1654*4882a593Smuzhiyun }
1655*4882a593Smuzhiyun
is_sys_clk_from_pll(struct snd_soc_dapm_widget * w,struct snd_soc_dapm_widget * sink)1656*4882a593Smuzhiyun static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *w,
1657*4882a593Smuzhiyun struct snd_soc_dapm_widget *sink)
1658*4882a593Smuzhiyun {
1659*4882a593Smuzhiyun unsigned int val;
1660*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1661*4882a593Smuzhiyun
1662*4882a593Smuzhiyun val = snd_soc_component_read(component, RT5659_GLB_CLK);
1663*4882a593Smuzhiyun val &= RT5659_SCLK_SRC_MASK;
1664*4882a593Smuzhiyun if (val == RT5659_SCLK_SRC_PLL1)
1665*4882a593Smuzhiyun return 1;
1666*4882a593Smuzhiyun else
1667*4882a593Smuzhiyun return 0;
1668*4882a593Smuzhiyun }
1669*4882a593Smuzhiyun
is_using_asrc(struct snd_soc_dapm_widget * w,struct snd_soc_dapm_widget * sink)1670*4882a593Smuzhiyun static int is_using_asrc(struct snd_soc_dapm_widget *w,
1671*4882a593Smuzhiyun struct snd_soc_dapm_widget *sink)
1672*4882a593Smuzhiyun {
1673*4882a593Smuzhiyun unsigned int reg, shift, val;
1674*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1675*4882a593Smuzhiyun
1676*4882a593Smuzhiyun switch (w->shift) {
1677*4882a593Smuzhiyun case RT5659_ADC_MONO_R_ASRC_SFT:
1678*4882a593Smuzhiyun reg = RT5659_ASRC_3;
1679*4882a593Smuzhiyun shift = RT5659_AD_MONO_R_T_SFT;
1680*4882a593Smuzhiyun break;
1681*4882a593Smuzhiyun case RT5659_ADC_MONO_L_ASRC_SFT:
1682*4882a593Smuzhiyun reg = RT5659_ASRC_3;
1683*4882a593Smuzhiyun shift = RT5659_AD_MONO_L_T_SFT;
1684*4882a593Smuzhiyun break;
1685*4882a593Smuzhiyun case RT5659_ADC_STO1_ASRC_SFT:
1686*4882a593Smuzhiyun reg = RT5659_ASRC_2;
1687*4882a593Smuzhiyun shift = RT5659_AD_STO1_T_SFT;
1688*4882a593Smuzhiyun break;
1689*4882a593Smuzhiyun case RT5659_DAC_MONO_R_ASRC_SFT:
1690*4882a593Smuzhiyun reg = RT5659_ASRC_2;
1691*4882a593Smuzhiyun shift = RT5659_DA_MONO_R_T_SFT;
1692*4882a593Smuzhiyun break;
1693*4882a593Smuzhiyun case RT5659_DAC_MONO_L_ASRC_SFT:
1694*4882a593Smuzhiyun reg = RT5659_ASRC_2;
1695*4882a593Smuzhiyun shift = RT5659_DA_MONO_L_T_SFT;
1696*4882a593Smuzhiyun break;
1697*4882a593Smuzhiyun case RT5659_DAC_STO_ASRC_SFT:
1698*4882a593Smuzhiyun reg = RT5659_ASRC_2;
1699*4882a593Smuzhiyun shift = RT5659_DA_STO_T_SFT;
1700*4882a593Smuzhiyun break;
1701*4882a593Smuzhiyun default:
1702*4882a593Smuzhiyun return 0;
1703*4882a593Smuzhiyun }
1704*4882a593Smuzhiyun
1705*4882a593Smuzhiyun val = (snd_soc_component_read(component, reg) >> shift) & 0xf;
1706*4882a593Smuzhiyun switch (val) {
1707*4882a593Smuzhiyun case 1:
1708*4882a593Smuzhiyun case 2:
1709*4882a593Smuzhiyun case 3:
1710*4882a593Smuzhiyun /* I2S_Pre_Div1 should be 1 in asrc mode */
1711*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1,
1712*4882a593Smuzhiyun RT5659_I2S_PD1_MASK, RT5659_I2S_PD1_2);
1713*4882a593Smuzhiyun return 1;
1714*4882a593Smuzhiyun default:
1715*4882a593Smuzhiyun return 0;
1716*4882a593Smuzhiyun }
1717*4882a593Smuzhiyun
1718*4882a593Smuzhiyun }
1719*4882a593Smuzhiyun
1720*4882a593Smuzhiyun /* Digital Mixer */
1721*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_sto1_adc_l_mix[] = {
1722*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC1 Switch", RT5659_STO1_ADC_MIXER,
1723*4882a593Smuzhiyun RT5659_M_STO1_ADC_L1_SFT, 1, 1),
1724*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC2 Switch", RT5659_STO1_ADC_MIXER,
1725*4882a593Smuzhiyun RT5659_M_STO1_ADC_L2_SFT, 1, 1),
1726*4882a593Smuzhiyun };
1727*4882a593Smuzhiyun
1728*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_sto1_adc_r_mix[] = {
1729*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC1 Switch", RT5659_STO1_ADC_MIXER,
1730*4882a593Smuzhiyun RT5659_M_STO1_ADC_R1_SFT, 1, 1),
1731*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC2 Switch", RT5659_STO1_ADC_MIXER,
1732*4882a593Smuzhiyun RT5659_M_STO1_ADC_R2_SFT, 1, 1),
1733*4882a593Smuzhiyun };
1734*4882a593Smuzhiyun
1735*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_adc_l_mix[] = {
1736*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC1 Switch", RT5659_MONO_ADC_MIXER,
1737*4882a593Smuzhiyun RT5659_M_MONO_ADC_L1_SFT, 1, 1),
1738*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC2 Switch", RT5659_MONO_ADC_MIXER,
1739*4882a593Smuzhiyun RT5659_M_MONO_ADC_L2_SFT, 1, 1),
1740*4882a593Smuzhiyun };
1741*4882a593Smuzhiyun
1742*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_adc_r_mix[] = {
1743*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC1 Switch", RT5659_MONO_ADC_MIXER,
1744*4882a593Smuzhiyun RT5659_M_MONO_ADC_R1_SFT, 1, 1),
1745*4882a593Smuzhiyun SOC_DAPM_SINGLE("ADC2 Switch", RT5659_MONO_ADC_MIXER,
1746*4882a593Smuzhiyun RT5659_M_MONO_ADC_R2_SFT, 1, 1),
1747*4882a593Smuzhiyun };
1748*4882a593Smuzhiyun
1749*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_dac_l_mix[] = {
1750*4882a593Smuzhiyun SOC_DAPM_SINGLE("Stereo ADC Switch", RT5659_AD_DA_MIXER,
1751*4882a593Smuzhiyun RT5659_M_ADCMIX_L_SFT, 1, 1),
1752*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC1 Switch", RT5659_AD_DA_MIXER,
1753*4882a593Smuzhiyun RT5659_M_DAC1_L_SFT, 1, 1),
1754*4882a593Smuzhiyun };
1755*4882a593Smuzhiyun
1756*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_dac_r_mix[] = {
1757*4882a593Smuzhiyun SOC_DAPM_SINGLE("Stereo ADC Switch", RT5659_AD_DA_MIXER,
1758*4882a593Smuzhiyun RT5659_M_ADCMIX_R_SFT, 1, 1),
1759*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC1 Switch", RT5659_AD_DA_MIXER,
1760*4882a593Smuzhiyun RT5659_M_DAC1_R_SFT, 1, 1),
1761*4882a593Smuzhiyun };
1762*4882a593Smuzhiyun
1763*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_sto_dac_l_mix[] = {
1764*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L1 Switch", RT5659_STO_DAC_MIXER,
1765*4882a593Smuzhiyun RT5659_M_DAC_L1_STO_L_SFT, 1, 1),
1766*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R1 Switch", RT5659_STO_DAC_MIXER,
1767*4882a593Smuzhiyun RT5659_M_DAC_R1_STO_L_SFT, 1, 1),
1768*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_STO_DAC_MIXER,
1769*4882a593Smuzhiyun RT5659_M_DAC_L2_STO_L_SFT, 1, 1),
1770*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_STO_DAC_MIXER,
1771*4882a593Smuzhiyun RT5659_M_DAC_R2_STO_L_SFT, 1, 1),
1772*4882a593Smuzhiyun };
1773*4882a593Smuzhiyun
1774*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_sto_dac_r_mix[] = {
1775*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L1 Switch", RT5659_STO_DAC_MIXER,
1776*4882a593Smuzhiyun RT5659_M_DAC_L1_STO_R_SFT, 1, 1),
1777*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R1 Switch", RT5659_STO_DAC_MIXER,
1778*4882a593Smuzhiyun RT5659_M_DAC_R1_STO_R_SFT, 1, 1),
1779*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_STO_DAC_MIXER,
1780*4882a593Smuzhiyun RT5659_M_DAC_L2_STO_R_SFT, 1, 1),
1781*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_STO_DAC_MIXER,
1782*4882a593Smuzhiyun RT5659_M_DAC_R2_STO_R_SFT, 1, 1),
1783*4882a593Smuzhiyun };
1784*4882a593Smuzhiyun
1785*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_dac_l_mix[] = {
1786*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L1 Switch", RT5659_MONO_DAC_MIXER,
1787*4882a593Smuzhiyun RT5659_M_DAC_L1_MONO_L_SFT, 1, 1),
1788*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R1 Switch", RT5659_MONO_DAC_MIXER,
1789*4882a593Smuzhiyun RT5659_M_DAC_R1_MONO_L_SFT, 1, 1),
1790*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_MONO_DAC_MIXER,
1791*4882a593Smuzhiyun RT5659_M_DAC_L2_MONO_L_SFT, 1, 1),
1792*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_MONO_DAC_MIXER,
1793*4882a593Smuzhiyun RT5659_M_DAC_R2_MONO_L_SFT, 1, 1),
1794*4882a593Smuzhiyun };
1795*4882a593Smuzhiyun
1796*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_dac_r_mix[] = {
1797*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L1 Switch", RT5659_MONO_DAC_MIXER,
1798*4882a593Smuzhiyun RT5659_M_DAC_L1_MONO_R_SFT, 1, 1),
1799*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R1 Switch", RT5659_MONO_DAC_MIXER,
1800*4882a593Smuzhiyun RT5659_M_DAC_R1_MONO_R_SFT, 1, 1),
1801*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_MONO_DAC_MIXER,
1802*4882a593Smuzhiyun RT5659_M_DAC_L2_MONO_R_SFT, 1, 1),
1803*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_MONO_DAC_MIXER,
1804*4882a593Smuzhiyun RT5659_M_DAC_R2_MONO_R_SFT, 1, 1),
1805*4882a593Smuzhiyun };
1806*4882a593Smuzhiyun
1807*4882a593Smuzhiyun /* Analog Input Mixer */
1808*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_rec1_l_mix[] = {
1809*4882a593Smuzhiyun SOC_DAPM_SINGLE("SPKVOLL Switch", RT5659_REC1_L2_MIXER,
1810*4882a593Smuzhiyun RT5659_M_SPKVOLL_RM1_L_SFT, 1, 1),
1811*4882a593Smuzhiyun SOC_DAPM_SINGLE("INL Switch", RT5659_REC1_L2_MIXER,
1812*4882a593Smuzhiyun RT5659_M_INL_RM1_L_SFT, 1, 1),
1813*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST4 Switch", RT5659_REC1_L2_MIXER,
1814*4882a593Smuzhiyun RT5659_M_BST4_RM1_L_SFT, 1, 1),
1815*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_REC1_L2_MIXER,
1816*4882a593Smuzhiyun RT5659_M_BST3_RM1_L_SFT, 1, 1),
1817*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST2 Switch", RT5659_REC1_L2_MIXER,
1818*4882a593Smuzhiyun RT5659_M_BST2_RM1_L_SFT, 1, 1),
1819*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST1 Switch", RT5659_REC1_L2_MIXER,
1820*4882a593Smuzhiyun RT5659_M_BST1_RM1_L_SFT, 1, 1),
1821*4882a593Smuzhiyun };
1822*4882a593Smuzhiyun
1823*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_rec1_r_mix[] = {
1824*4882a593Smuzhiyun SOC_DAPM_SINGLE("HPOVOLR Switch", RT5659_REC1_L2_MIXER,
1825*4882a593Smuzhiyun RT5659_M_HPOVOLR_RM1_R_SFT, 1, 1),
1826*4882a593Smuzhiyun SOC_DAPM_SINGLE("INR Switch", RT5659_REC1_R2_MIXER,
1827*4882a593Smuzhiyun RT5659_M_INR_RM1_R_SFT, 1, 1),
1828*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST4 Switch", RT5659_REC1_R2_MIXER,
1829*4882a593Smuzhiyun RT5659_M_BST4_RM1_R_SFT, 1, 1),
1830*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_REC1_R2_MIXER,
1831*4882a593Smuzhiyun RT5659_M_BST3_RM1_R_SFT, 1, 1),
1832*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST2 Switch", RT5659_REC1_R2_MIXER,
1833*4882a593Smuzhiyun RT5659_M_BST2_RM1_R_SFT, 1, 1),
1834*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST1 Switch", RT5659_REC1_R2_MIXER,
1835*4882a593Smuzhiyun RT5659_M_BST1_RM1_R_SFT, 1, 1),
1836*4882a593Smuzhiyun };
1837*4882a593Smuzhiyun
1838*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_rec2_l_mix[] = {
1839*4882a593Smuzhiyun SOC_DAPM_SINGLE("SPKVOLL Switch", RT5659_REC2_L2_MIXER,
1840*4882a593Smuzhiyun RT5659_M_SPKVOL_RM2_L_SFT, 1, 1),
1841*4882a593Smuzhiyun SOC_DAPM_SINGLE("OUTVOLL Switch", RT5659_REC2_L2_MIXER,
1842*4882a593Smuzhiyun RT5659_M_OUTVOLL_RM2_L_SFT, 1, 1),
1843*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST4 Switch", RT5659_REC2_L2_MIXER,
1844*4882a593Smuzhiyun RT5659_M_BST4_RM2_L_SFT, 1, 1),
1845*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_REC2_L2_MIXER,
1846*4882a593Smuzhiyun RT5659_M_BST3_RM2_L_SFT, 1, 1),
1847*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST2 Switch", RT5659_REC2_L2_MIXER,
1848*4882a593Smuzhiyun RT5659_M_BST2_RM2_L_SFT, 1, 1),
1849*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST1 Switch", RT5659_REC2_L2_MIXER,
1850*4882a593Smuzhiyun RT5659_M_BST1_RM2_L_SFT, 1, 1),
1851*4882a593Smuzhiyun };
1852*4882a593Smuzhiyun
1853*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_rec2_r_mix[] = {
1854*4882a593Smuzhiyun SOC_DAPM_SINGLE("MONOVOL Switch", RT5659_REC2_R2_MIXER,
1855*4882a593Smuzhiyun RT5659_M_MONOVOL_RM2_R_SFT, 1, 1),
1856*4882a593Smuzhiyun SOC_DAPM_SINGLE("OUTVOLR Switch", RT5659_REC2_R2_MIXER,
1857*4882a593Smuzhiyun RT5659_M_OUTVOLR_RM2_R_SFT, 1, 1),
1858*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST4 Switch", RT5659_REC2_R2_MIXER,
1859*4882a593Smuzhiyun RT5659_M_BST4_RM2_R_SFT, 1, 1),
1860*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_REC2_R2_MIXER,
1861*4882a593Smuzhiyun RT5659_M_BST3_RM2_R_SFT, 1, 1),
1862*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST2 Switch", RT5659_REC2_R2_MIXER,
1863*4882a593Smuzhiyun RT5659_M_BST2_RM2_R_SFT, 1, 1),
1864*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST1 Switch", RT5659_REC2_R2_MIXER,
1865*4882a593Smuzhiyun RT5659_M_BST1_RM2_R_SFT, 1, 1),
1866*4882a593Smuzhiyun };
1867*4882a593Smuzhiyun
1868*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_spk_l_mix[] = {
1869*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_SPK_L_MIXER,
1870*4882a593Smuzhiyun RT5659_M_DAC_L2_SM_L_SFT, 1, 1),
1871*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST1 Switch", RT5659_SPK_L_MIXER,
1872*4882a593Smuzhiyun RT5659_M_BST1_SM_L_SFT, 1, 1),
1873*4882a593Smuzhiyun SOC_DAPM_SINGLE("INL Switch", RT5659_SPK_L_MIXER,
1874*4882a593Smuzhiyun RT5659_M_IN_L_SM_L_SFT, 1, 1),
1875*4882a593Smuzhiyun SOC_DAPM_SINGLE("INR Switch", RT5659_SPK_L_MIXER,
1876*4882a593Smuzhiyun RT5659_M_IN_R_SM_L_SFT, 1, 1),
1877*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_SPK_L_MIXER,
1878*4882a593Smuzhiyun RT5659_M_BST3_SM_L_SFT, 1, 1),
1879*4882a593Smuzhiyun };
1880*4882a593Smuzhiyun
1881*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_spk_r_mix[] = {
1882*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_SPK_R_MIXER,
1883*4882a593Smuzhiyun RT5659_M_DAC_R2_SM_R_SFT, 1, 1),
1884*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST4 Switch", RT5659_SPK_R_MIXER,
1885*4882a593Smuzhiyun RT5659_M_BST4_SM_R_SFT, 1, 1),
1886*4882a593Smuzhiyun SOC_DAPM_SINGLE("INL Switch", RT5659_SPK_R_MIXER,
1887*4882a593Smuzhiyun RT5659_M_IN_L_SM_R_SFT, 1, 1),
1888*4882a593Smuzhiyun SOC_DAPM_SINGLE("INR Switch", RT5659_SPK_R_MIXER,
1889*4882a593Smuzhiyun RT5659_M_IN_R_SM_R_SFT, 1, 1),
1890*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_SPK_R_MIXER,
1891*4882a593Smuzhiyun RT5659_M_BST3_SM_R_SFT, 1, 1),
1892*4882a593Smuzhiyun };
1893*4882a593Smuzhiyun
1894*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_monovol_mix[] = {
1895*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_MONOMIX_IN_GAIN,
1896*4882a593Smuzhiyun RT5659_M_DAC_L2_MM_SFT, 1, 1),
1897*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_MONOMIX_IN_GAIN,
1898*4882a593Smuzhiyun RT5659_M_DAC_R2_MM_SFT, 1, 1),
1899*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST1 Switch", RT5659_MONOMIX_IN_GAIN,
1900*4882a593Smuzhiyun RT5659_M_BST1_MM_SFT, 1, 1),
1901*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST2 Switch", RT5659_MONOMIX_IN_GAIN,
1902*4882a593Smuzhiyun RT5659_M_BST2_MM_SFT, 1, 1),
1903*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_MONOMIX_IN_GAIN,
1904*4882a593Smuzhiyun RT5659_M_BST3_MM_SFT, 1, 1),
1905*4882a593Smuzhiyun };
1906*4882a593Smuzhiyun
1907*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_out_l_mix[] = {
1908*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_OUT_L_MIXER,
1909*4882a593Smuzhiyun RT5659_M_DAC_L2_OM_L_SFT, 1, 1),
1910*4882a593Smuzhiyun SOC_DAPM_SINGLE("INL Switch", RT5659_OUT_L_MIXER,
1911*4882a593Smuzhiyun RT5659_M_IN_L_OM_L_SFT, 1, 1),
1912*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST1 Switch", RT5659_OUT_L_MIXER,
1913*4882a593Smuzhiyun RT5659_M_BST1_OM_L_SFT, 1, 1),
1914*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST2 Switch", RT5659_OUT_L_MIXER,
1915*4882a593Smuzhiyun RT5659_M_BST2_OM_L_SFT, 1, 1),
1916*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_OUT_L_MIXER,
1917*4882a593Smuzhiyun RT5659_M_BST3_OM_L_SFT, 1, 1),
1918*4882a593Smuzhiyun };
1919*4882a593Smuzhiyun
1920*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_out_r_mix[] = {
1921*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_OUT_R_MIXER,
1922*4882a593Smuzhiyun RT5659_M_DAC_R2_OM_R_SFT, 1, 1),
1923*4882a593Smuzhiyun SOC_DAPM_SINGLE("INR Switch", RT5659_OUT_R_MIXER,
1924*4882a593Smuzhiyun RT5659_M_IN_R_OM_R_SFT, 1, 1),
1925*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST2 Switch", RT5659_OUT_R_MIXER,
1926*4882a593Smuzhiyun RT5659_M_BST2_OM_R_SFT, 1, 1),
1927*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST3 Switch", RT5659_OUT_R_MIXER,
1928*4882a593Smuzhiyun RT5659_M_BST3_OM_R_SFT, 1, 1),
1929*4882a593Smuzhiyun SOC_DAPM_SINGLE("BST4 Switch", RT5659_OUT_R_MIXER,
1930*4882a593Smuzhiyun RT5659_M_BST4_OM_R_SFT, 1, 1),
1931*4882a593Smuzhiyun };
1932*4882a593Smuzhiyun
1933*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_spo_l_mix[] = {
1934*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_SPO_AMP_GAIN,
1935*4882a593Smuzhiyun RT5659_M_DAC_L2_SPKOMIX_SFT, 1, 0),
1936*4882a593Smuzhiyun SOC_DAPM_SINGLE("SPKVOL L Switch", RT5659_SPO_AMP_GAIN,
1937*4882a593Smuzhiyun RT5659_M_SPKVOLL_SPKOMIX_SFT, 1, 0),
1938*4882a593Smuzhiyun };
1939*4882a593Smuzhiyun
1940*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_spo_r_mix[] = {
1941*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_SPO_AMP_GAIN,
1942*4882a593Smuzhiyun RT5659_M_DAC_R2_SPKOMIX_SFT, 1, 0),
1943*4882a593Smuzhiyun SOC_DAPM_SINGLE("SPKVOL R Switch", RT5659_SPO_AMP_GAIN,
1944*4882a593Smuzhiyun RT5659_M_SPKVOLR_SPKOMIX_SFT, 1, 0),
1945*4882a593Smuzhiyun };
1946*4882a593Smuzhiyun
1947*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_mix[] = {
1948*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_MONOMIX_IN_GAIN,
1949*4882a593Smuzhiyun RT5659_M_DAC_L2_MA_SFT, 1, 1),
1950*4882a593Smuzhiyun SOC_DAPM_SINGLE("MONOVOL Switch", RT5659_MONOMIX_IN_GAIN,
1951*4882a593Smuzhiyun RT5659_M_MONOVOL_MA_SFT, 1, 1),
1952*4882a593Smuzhiyun };
1953*4882a593Smuzhiyun
1954*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_lout_l_mix[] = {
1955*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_LOUT_MIXER,
1956*4882a593Smuzhiyun RT5659_M_DAC_L2_LM_SFT, 1, 1),
1957*4882a593Smuzhiyun SOC_DAPM_SINGLE("OUTVOL L Switch", RT5659_LOUT_MIXER,
1958*4882a593Smuzhiyun RT5659_M_OV_L_LM_SFT, 1, 1),
1959*4882a593Smuzhiyun };
1960*4882a593Smuzhiyun
1961*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_lout_r_mix[] = {
1962*4882a593Smuzhiyun SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_LOUT_MIXER,
1963*4882a593Smuzhiyun RT5659_M_DAC_R2_LM_SFT, 1, 1),
1964*4882a593Smuzhiyun SOC_DAPM_SINGLE("OUTVOL R Switch", RT5659_LOUT_MIXER,
1965*4882a593Smuzhiyun RT5659_M_OV_R_LM_SFT, 1, 1),
1966*4882a593Smuzhiyun };
1967*4882a593Smuzhiyun
1968*4882a593Smuzhiyun /*DAC L2, DAC R2*/
1969*4882a593Smuzhiyun /*MX-1B [6:4], MX-1B [2:0]*/
1970*4882a593Smuzhiyun static const char * const rt5659_dac2_src[] = {
1971*4882a593Smuzhiyun "IF1 DAC2", "IF2 DAC", "IF3 DAC", "Mono ADC MIX"
1972*4882a593Smuzhiyun };
1973*4882a593Smuzhiyun
1974*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1975*4882a593Smuzhiyun rt5659_dac_l2_enum, RT5659_DAC_CTRL,
1976*4882a593Smuzhiyun RT5659_DAC_L2_SEL_SFT, rt5659_dac2_src);
1977*4882a593Smuzhiyun
1978*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_dac_l2_mux =
1979*4882a593Smuzhiyun SOC_DAPM_ENUM("DAC L2 Source", rt5659_dac_l2_enum);
1980*4882a593Smuzhiyun
1981*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1982*4882a593Smuzhiyun rt5659_dac_r2_enum, RT5659_DAC_CTRL,
1983*4882a593Smuzhiyun RT5659_DAC_R2_SEL_SFT, rt5659_dac2_src);
1984*4882a593Smuzhiyun
1985*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_dac_r2_mux =
1986*4882a593Smuzhiyun SOC_DAPM_ENUM("DAC R2 Source", rt5659_dac_r2_enum);
1987*4882a593Smuzhiyun
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun /* STO1 ADC1 Source */
1990*4882a593Smuzhiyun /* MX-26 [13] */
1991*4882a593Smuzhiyun static const char * const rt5659_sto1_adc1_src[] = {
1992*4882a593Smuzhiyun "DAC MIX", "ADC"
1993*4882a593Smuzhiyun };
1994*4882a593Smuzhiyun
1995*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
1996*4882a593Smuzhiyun rt5659_sto1_adc1_enum, RT5659_STO1_ADC_MIXER,
1997*4882a593Smuzhiyun RT5659_STO1_ADC1_SRC_SFT, rt5659_sto1_adc1_src);
1998*4882a593Smuzhiyun
1999*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_sto1_adc1_mux =
2000*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADC1 Source", rt5659_sto1_adc1_enum);
2001*4882a593Smuzhiyun
2002*4882a593Smuzhiyun /* STO1 ADC Source */
2003*4882a593Smuzhiyun /* MX-26 [12] */
2004*4882a593Smuzhiyun static const char * const rt5659_sto1_adc_src[] = {
2005*4882a593Smuzhiyun "ADC1", "ADC2"
2006*4882a593Smuzhiyun };
2007*4882a593Smuzhiyun
2008*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2009*4882a593Smuzhiyun rt5659_sto1_adc_enum, RT5659_STO1_ADC_MIXER,
2010*4882a593Smuzhiyun RT5659_STO1_ADC_SRC_SFT, rt5659_sto1_adc_src);
2011*4882a593Smuzhiyun
2012*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_sto1_adc_mux =
2013*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADC Source", rt5659_sto1_adc_enum);
2014*4882a593Smuzhiyun
2015*4882a593Smuzhiyun /* STO1 ADC2 Source */
2016*4882a593Smuzhiyun /* MX-26 [11] */
2017*4882a593Smuzhiyun static const char * const rt5659_sto1_adc2_src[] = {
2018*4882a593Smuzhiyun "DAC MIX", "DMIC"
2019*4882a593Smuzhiyun };
2020*4882a593Smuzhiyun
2021*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2022*4882a593Smuzhiyun rt5659_sto1_adc2_enum, RT5659_STO1_ADC_MIXER,
2023*4882a593Smuzhiyun RT5659_STO1_ADC2_SRC_SFT, rt5659_sto1_adc2_src);
2024*4882a593Smuzhiyun
2025*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_sto1_adc2_mux =
2026*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 ADC2 Source", rt5659_sto1_adc2_enum);
2027*4882a593Smuzhiyun
2028*4882a593Smuzhiyun /* STO1 DMIC Source */
2029*4882a593Smuzhiyun /* MX-26 [8] */
2030*4882a593Smuzhiyun static const char * const rt5659_sto1_dmic_src[] = {
2031*4882a593Smuzhiyun "DMIC1", "DMIC2"
2032*4882a593Smuzhiyun };
2033*4882a593Smuzhiyun
2034*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2035*4882a593Smuzhiyun rt5659_sto1_dmic_enum, RT5659_STO1_ADC_MIXER,
2036*4882a593Smuzhiyun RT5659_STO1_DMIC_SRC_SFT, rt5659_sto1_dmic_src);
2037*4882a593Smuzhiyun
2038*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_sto1_dmic_mux =
2039*4882a593Smuzhiyun SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5659_sto1_dmic_enum);
2040*4882a593Smuzhiyun
2041*4882a593Smuzhiyun
2042*4882a593Smuzhiyun /* MONO ADC L2 Source */
2043*4882a593Smuzhiyun /* MX-27 [12] */
2044*4882a593Smuzhiyun static const char * const rt5659_mono_adc_l2_src[] = {
2045*4882a593Smuzhiyun "Mono DAC MIXL", "DMIC"
2046*4882a593Smuzhiyun };
2047*4882a593Smuzhiyun
2048*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2049*4882a593Smuzhiyun rt5659_mono_adc_l2_enum, RT5659_MONO_ADC_MIXER,
2050*4882a593Smuzhiyun RT5659_MONO_ADC_L2_SRC_SFT, rt5659_mono_adc_l2_src);
2051*4882a593Smuzhiyun
2052*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_adc_l2_mux =
2053*4882a593Smuzhiyun SOC_DAPM_ENUM("Mono ADC L2 Source", rt5659_mono_adc_l2_enum);
2054*4882a593Smuzhiyun
2055*4882a593Smuzhiyun
2056*4882a593Smuzhiyun /* MONO ADC L1 Source */
2057*4882a593Smuzhiyun /* MX-27 [11] */
2058*4882a593Smuzhiyun static const char * const rt5659_mono_adc_l1_src[] = {
2059*4882a593Smuzhiyun "Mono DAC MIXL", "ADC"
2060*4882a593Smuzhiyun };
2061*4882a593Smuzhiyun
2062*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2063*4882a593Smuzhiyun rt5659_mono_adc_l1_enum, RT5659_MONO_ADC_MIXER,
2064*4882a593Smuzhiyun RT5659_MONO_ADC_L1_SRC_SFT, rt5659_mono_adc_l1_src);
2065*4882a593Smuzhiyun
2066*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_adc_l1_mux =
2067*4882a593Smuzhiyun SOC_DAPM_ENUM("Mono ADC L1 Source", rt5659_mono_adc_l1_enum);
2068*4882a593Smuzhiyun
2069*4882a593Smuzhiyun /* MONO ADC L Source, MONO ADC R Source*/
2070*4882a593Smuzhiyun /* MX-27 [10:9], MX-27 [2:1] */
2071*4882a593Smuzhiyun static const char * const rt5659_mono_adc_src[] = {
2072*4882a593Smuzhiyun "ADC1 L", "ADC1 R", "ADC2 L", "ADC2 R"
2073*4882a593Smuzhiyun };
2074*4882a593Smuzhiyun
2075*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2076*4882a593Smuzhiyun rt5659_mono_adc_l_enum, RT5659_MONO_ADC_MIXER,
2077*4882a593Smuzhiyun RT5659_MONO_ADC_L_SRC_SFT, rt5659_mono_adc_src);
2078*4882a593Smuzhiyun
2079*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_adc_l_mux =
2080*4882a593Smuzhiyun SOC_DAPM_ENUM("Mono ADC L Source", rt5659_mono_adc_l_enum);
2081*4882a593Smuzhiyun
2082*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2083*4882a593Smuzhiyun rt5659_mono_adcr_enum, RT5659_MONO_ADC_MIXER,
2084*4882a593Smuzhiyun RT5659_MONO_ADC_R_SRC_SFT, rt5659_mono_adc_src);
2085*4882a593Smuzhiyun
2086*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_adc_r_mux =
2087*4882a593Smuzhiyun SOC_DAPM_ENUM("Mono ADC R Source", rt5659_mono_adcr_enum);
2088*4882a593Smuzhiyun
2089*4882a593Smuzhiyun /* MONO DMIC L Source */
2090*4882a593Smuzhiyun /* MX-27 [8] */
2091*4882a593Smuzhiyun static const char * const rt5659_mono_dmic_l_src[] = {
2092*4882a593Smuzhiyun "DMIC1 L", "DMIC2 L"
2093*4882a593Smuzhiyun };
2094*4882a593Smuzhiyun
2095*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2096*4882a593Smuzhiyun rt5659_mono_dmic_l_enum, RT5659_MONO_ADC_MIXER,
2097*4882a593Smuzhiyun RT5659_MONO_DMIC_L_SRC_SFT, rt5659_mono_dmic_l_src);
2098*4882a593Smuzhiyun
2099*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_dmic_l_mux =
2100*4882a593Smuzhiyun SOC_DAPM_ENUM("Mono DMIC L Source", rt5659_mono_dmic_l_enum);
2101*4882a593Smuzhiyun
2102*4882a593Smuzhiyun /* MONO ADC R2 Source */
2103*4882a593Smuzhiyun /* MX-27 [4] */
2104*4882a593Smuzhiyun static const char * const rt5659_mono_adc_r2_src[] = {
2105*4882a593Smuzhiyun "Mono DAC MIXR", "DMIC"
2106*4882a593Smuzhiyun };
2107*4882a593Smuzhiyun
2108*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2109*4882a593Smuzhiyun rt5659_mono_adc_r2_enum, RT5659_MONO_ADC_MIXER,
2110*4882a593Smuzhiyun RT5659_MONO_ADC_R2_SRC_SFT, rt5659_mono_adc_r2_src);
2111*4882a593Smuzhiyun
2112*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_adc_r2_mux =
2113*4882a593Smuzhiyun SOC_DAPM_ENUM("Mono ADC R2 Source", rt5659_mono_adc_r2_enum);
2114*4882a593Smuzhiyun
2115*4882a593Smuzhiyun /* MONO ADC R1 Source */
2116*4882a593Smuzhiyun /* MX-27 [3] */
2117*4882a593Smuzhiyun static const char * const rt5659_mono_adc_r1_src[] = {
2118*4882a593Smuzhiyun "Mono DAC MIXR", "ADC"
2119*4882a593Smuzhiyun };
2120*4882a593Smuzhiyun
2121*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2122*4882a593Smuzhiyun rt5659_mono_adc_r1_enum, RT5659_MONO_ADC_MIXER,
2123*4882a593Smuzhiyun RT5659_MONO_ADC_R1_SRC_SFT, rt5659_mono_adc_r1_src);
2124*4882a593Smuzhiyun
2125*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_adc_r1_mux =
2126*4882a593Smuzhiyun SOC_DAPM_ENUM("Mono ADC R1 Source", rt5659_mono_adc_r1_enum);
2127*4882a593Smuzhiyun
2128*4882a593Smuzhiyun /* MONO DMIC R Source */
2129*4882a593Smuzhiyun /* MX-27 [0] */
2130*4882a593Smuzhiyun static const char * const rt5659_mono_dmic_r_src[] = {
2131*4882a593Smuzhiyun "DMIC1 R", "DMIC2 R"
2132*4882a593Smuzhiyun };
2133*4882a593Smuzhiyun
2134*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2135*4882a593Smuzhiyun rt5659_mono_dmic_r_enum, RT5659_MONO_ADC_MIXER,
2136*4882a593Smuzhiyun RT5659_MONO_DMIC_R_SRC_SFT, rt5659_mono_dmic_r_src);
2137*4882a593Smuzhiyun
2138*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_mono_dmic_r_mux =
2139*4882a593Smuzhiyun SOC_DAPM_ENUM("Mono DMIC R Source", rt5659_mono_dmic_r_enum);
2140*4882a593Smuzhiyun
2141*4882a593Smuzhiyun
2142*4882a593Smuzhiyun /* DAC R1 Source, DAC L1 Source*/
2143*4882a593Smuzhiyun /* MX-29 [11:10], MX-29 [9:8]*/
2144*4882a593Smuzhiyun static const char * const rt5659_dac1_src[] = {
2145*4882a593Smuzhiyun "IF1 DAC1", "IF2 DAC", "IF3 DAC"
2146*4882a593Smuzhiyun };
2147*4882a593Smuzhiyun
2148*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2149*4882a593Smuzhiyun rt5659_dac_r1_enum, RT5659_AD_DA_MIXER,
2150*4882a593Smuzhiyun RT5659_DAC1_R_SEL_SFT, rt5659_dac1_src);
2151*4882a593Smuzhiyun
2152*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_dac_r1_mux =
2153*4882a593Smuzhiyun SOC_DAPM_ENUM("DAC R1 Source", rt5659_dac_r1_enum);
2154*4882a593Smuzhiyun
2155*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2156*4882a593Smuzhiyun rt5659_dac_l1_enum, RT5659_AD_DA_MIXER,
2157*4882a593Smuzhiyun RT5659_DAC1_L_SEL_SFT, rt5659_dac1_src);
2158*4882a593Smuzhiyun
2159*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_dac_l1_mux =
2160*4882a593Smuzhiyun SOC_DAPM_ENUM("DAC L1 Source", rt5659_dac_l1_enum);
2161*4882a593Smuzhiyun
2162*4882a593Smuzhiyun /* DAC Digital Mixer L Source, DAC Digital Mixer R Source*/
2163*4882a593Smuzhiyun /* MX-2C [6], MX-2C [4]*/
2164*4882a593Smuzhiyun static const char * const rt5659_dig_dac_mix_src[] = {
2165*4882a593Smuzhiyun "Stereo DAC Mixer", "Mono DAC Mixer"
2166*4882a593Smuzhiyun };
2167*4882a593Smuzhiyun
2168*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2169*4882a593Smuzhiyun rt5659_dig_dac_mixl_enum, RT5659_DIG_MIXER,
2170*4882a593Smuzhiyun RT5659_DAC_MIX_L_SFT, rt5659_dig_dac_mix_src);
2171*4882a593Smuzhiyun
2172*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_dig_dac_mixl_mux =
2173*4882a593Smuzhiyun SOC_DAPM_ENUM("DAC Digital Mixer L Source", rt5659_dig_dac_mixl_enum);
2174*4882a593Smuzhiyun
2175*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2176*4882a593Smuzhiyun rt5659_dig_dac_mixr_enum, RT5659_DIG_MIXER,
2177*4882a593Smuzhiyun RT5659_DAC_MIX_R_SFT, rt5659_dig_dac_mix_src);
2178*4882a593Smuzhiyun
2179*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_dig_dac_mixr_mux =
2180*4882a593Smuzhiyun SOC_DAPM_ENUM("DAC Digital Mixer R Source", rt5659_dig_dac_mixr_enum);
2181*4882a593Smuzhiyun
2182*4882a593Smuzhiyun /* Analog DAC L1 Source, Analog DAC R1 Source*/
2183*4882a593Smuzhiyun /* MX-2D [3], MX-2D [2]*/
2184*4882a593Smuzhiyun static const char * const rt5659_alg_dac1_src[] = {
2185*4882a593Smuzhiyun "DAC", "Stereo DAC Mixer"
2186*4882a593Smuzhiyun };
2187*4882a593Smuzhiyun
2188*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2189*4882a593Smuzhiyun rt5659_alg_dac_l1_enum, RT5659_A_DAC_MUX,
2190*4882a593Smuzhiyun RT5659_A_DACL1_SFT, rt5659_alg_dac1_src);
2191*4882a593Smuzhiyun
2192*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_alg_dac_l1_mux =
2193*4882a593Smuzhiyun SOC_DAPM_ENUM("Analog DACL1 Source", rt5659_alg_dac_l1_enum);
2194*4882a593Smuzhiyun
2195*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2196*4882a593Smuzhiyun rt5659_alg_dac_r1_enum, RT5659_A_DAC_MUX,
2197*4882a593Smuzhiyun RT5659_A_DACR1_SFT, rt5659_alg_dac1_src);
2198*4882a593Smuzhiyun
2199*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_alg_dac_r1_mux =
2200*4882a593Smuzhiyun SOC_DAPM_ENUM("Analog DACR1 Source", rt5659_alg_dac_r1_enum);
2201*4882a593Smuzhiyun
2202*4882a593Smuzhiyun /* Analog DAC LR Source, Analog DAC R2 Source*/
2203*4882a593Smuzhiyun /* MX-2D [1], MX-2D [0]*/
2204*4882a593Smuzhiyun static const char * const rt5659_alg_dac2_src[] = {
2205*4882a593Smuzhiyun "Stereo DAC Mixer", "Mono DAC Mixer"
2206*4882a593Smuzhiyun };
2207*4882a593Smuzhiyun
2208*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2209*4882a593Smuzhiyun rt5659_alg_dac_l2_enum, RT5659_A_DAC_MUX,
2210*4882a593Smuzhiyun RT5659_A_DACL2_SFT, rt5659_alg_dac2_src);
2211*4882a593Smuzhiyun
2212*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_alg_dac_l2_mux =
2213*4882a593Smuzhiyun SOC_DAPM_ENUM("Analog DAC L2 Source", rt5659_alg_dac_l2_enum);
2214*4882a593Smuzhiyun
2215*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2216*4882a593Smuzhiyun rt5659_alg_dac_r2_enum, RT5659_A_DAC_MUX,
2217*4882a593Smuzhiyun RT5659_A_DACR2_SFT, rt5659_alg_dac2_src);
2218*4882a593Smuzhiyun
2219*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_alg_dac_r2_mux =
2220*4882a593Smuzhiyun SOC_DAPM_ENUM("Analog DAC R2 Source", rt5659_alg_dac_r2_enum);
2221*4882a593Smuzhiyun
2222*4882a593Smuzhiyun /* Interface2 ADC Data Input*/
2223*4882a593Smuzhiyun /* MX-2F [13:12] */
2224*4882a593Smuzhiyun static const char * const rt5659_if2_adc_in_src[] = {
2225*4882a593Smuzhiyun "IF_ADC1", "IF_ADC2", "DAC_REF", "IF_ADC3"
2226*4882a593Smuzhiyun };
2227*4882a593Smuzhiyun
2228*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2229*4882a593Smuzhiyun rt5659_if2_adc_in_enum, RT5659_DIG_INF23_DATA,
2230*4882a593Smuzhiyun RT5659_IF2_ADC_IN_SFT, rt5659_if2_adc_in_src);
2231*4882a593Smuzhiyun
2232*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if2_adc_in_mux =
2233*4882a593Smuzhiyun SOC_DAPM_ENUM("IF2 ADC IN Source", rt5659_if2_adc_in_enum);
2234*4882a593Smuzhiyun
2235*4882a593Smuzhiyun /* Interface3 ADC Data Input*/
2236*4882a593Smuzhiyun /* MX-2F [1:0] */
2237*4882a593Smuzhiyun static const char * const rt5659_if3_adc_in_src[] = {
2238*4882a593Smuzhiyun "IF_ADC1", "IF_ADC2", "DAC_REF", "Stereo2_ADC_L/R"
2239*4882a593Smuzhiyun };
2240*4882a593Smuzhiyun
2241*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2242*4882a593Smuzhiyun rt5659_if3_adc_in_enum, RT5659_DIG_INF23_DATA,
2243*4882a593Smuzhiyun RT5659_IF3_ADC_IN_SFT, rt5659_if3_adc_in_src);
2244*4882a593Smuzhiyun
2245*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_if3_adc_in_mux =
2246*4882a593Smuzhiyun SOC_DAPM_ENUM("IF3 ADC IN Source", rt5659_if3_adc_in_enum);
2247*4882a593Smuzhiyun
2248*4882a593Smuzhiyun /* PDM 1 L/R*/
2249*4882a593Smuzhiyun /* MX-31 [15] [13] */
2250*4882a593Smuzhiyun static const char * const rt5659_pdm_src[] = {
2251*4882a593Smuzhiyun "Mono DAC", "Stereo DAC"
2252*4882a593Smuzhiyun };
2253*4882a593Smuzhiyun
2254*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2255*4882a593Smuzhiyun rt5659_pdm_l_enum, RT5659_PDM_OUT_CTRL,
2256*4882a593Smuzhiyun RT5659_PDM1_L_SFT, rt5659_pdm_src);
2257*4882a593Smuzhiyun
2258*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_pdm_l_mux =
2259*4882a593Smuzhiyun SOC_DAPM_ENUM("PDM L Source", rt5659_pdm_l_enum);
2260*4882a593Smuzhiyun
2261*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2262*4882a593Smuzhiyun rt5659_pdm_r_enum, RT5659_PDM_OUT_CTRL,
2263*4882a593Smuzhiyun RT5659_PDM1_R_SFT, rt5659_pdm_src);
2264*4882a593Smuzhiyun
2265*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_pdm_r_mux =
2266*4882a593Smuzhiyun SOC_DAPM_ENUM("PDM R Source", rt5659_pdm_r_enum);
2267*4882a593Smuzhiyun
2268*4882a593Smuzhiyun /* SPDIF Output source*/
2269*4882a593Smuzhiyun /* MX-36 [1:0] */
2270*4882a593Smuzhiyun static const char * const rt5659_spdif_src[] = {
2271*4882a593Smuzhiyun "IF1_DAC1", "IF1_DAC2", "IF2_DAC", "IF3_DAC"
2272*4882a593Smuzhiyun };
2273*4882a593Smuzhiyun
2274*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2275*4882a593Smuzhiyun rt5659_spdif_enum, RT5659_SPDIF_CTRL,
2276*4882a593Smuzhiyun RT5659_SPDIF_SEL_SFT, rt5659_spdif_src);
2277*4882a593Smuzhiyun
2278*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_spdif_mux =
2279*4882a593Smuzhiyun SOC_DAPM_ENUM("SPDIF Source", rt5659_spdif_enum);
2280*4882a593Smuzhiyun
2281*4882a593Smuzhiyun /* I2S1 TDM ADCDAT Source */
2282*4882a593Smuzhiyun /* MX-78[4:0] */
2283*4882a593Smuzhiyun static const char * const rt5659_rx_adc_data_src[] = {
2284*4882a593Smuzhiyun "AD1:AD2:DAC:NUL", "AD1:AD2:NUL:DAC", "AD1:DAC:AD2:NUL",
2285*4882a593Smuzhiyun "AD1:DAC:NUL:AD2", "AD1:NUL:DAC:AD2", "AD1:NUL:AD2:DAC",
2286*4882a593Smuzhiyun "AD2:AD1:DAC:NUL", "AD2:AD1:NUL:DAC", "AD2:DAC:AD1:NUL",
2287*4882a593Smuzhiyun "AD2:DAC:NUL:AD1", "AD2:NUL:DAC:AD1", "AD1:NUL:AD1:DAC",
2288*4882a593Smuzhiyun "DAC:AD1:AD2:NUL", "DAC:AD1:NUL:AD2", "DAC:AD2:AD1:NUL",
2289*4882a593Smuzhiyun "DAC:AD2:NUL:AD1", "DAC:NUL:DAC:AD2", "DAC:NUL:AD2:DAC",
2290*4882a593Smuzhiyun "NUL:AD1:AD2:DAC", "NUL:AD1:DAC:AD2", "NUL:AD2:AD1:DAC",
2291*4882a593Smuzhiyun "NUL:AD2:DAC:AD1", "NUL:DAC:DAC:AD2", "NUL:DAC:AD2:DAC"
2292*4882a593Smuzhiyun };
2293*4882a593Smuzhiyun
2294*4882a593Smuzhiyun static SOC_ENUM_SINGLE_DECL(
2295*4882a593Smuzhiyun rt5659_rx_adc_data_enum, RT5659_TDM_CTRL_2,
2296*4882a593Smuzhiyun RT5659_ADCDAT_SRC_SFT, rt5659_rx_adc_data_src);
2297*4882a593Smuzhiyun
2298*4882a593Smuzhiyun static const struct snd_kcontrol_new rt5659_rx_adc_dac_mux =
2299*4882a593Smuzhiyun SOC_DAPM_ENUM("TDM ADCDAT Source", rt5659_rx_adc_data_enum);
2300*4882a593Smuzhiyun
2301*4882a593Smuzhiyun /* Out Volume Switch */
2302*4882a593Smuzhiyun static const struct snd_kcontrol_new spkvol_l_switch =
2303*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_SPO_VOL, RT5659_VOL_L_SFT, 1, 1);
2304*4882a593Smuzhiyun
2305*4882a593Smuzhiyun static const struct snd_kcontrol_new spkvol_r_switch =
2306*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_SPO_VOL, RT5659_VOL_R_SFT, 1, 1);
2307*4882a593Smuzhiyun
2308*4882a593Smuzhiyun static const struct snd_kcontrol_new monovol_switch =
2309*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_MONO_OUT, RT5659_VOL_L_SFT, 1, 1);
2310*4882a593Smuzhiyun
2311*4882a593Smuzhiyun static const struct snd_kcontrol_new outvol_l_switch =
2312*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_LOUT, RT5659_VOL_L_SFT, 1, 1);
2313*4882a593Smuzhiyun
2314*4882a593Smuzhiyun static const struct snd_kcontrol_new outvol_r_switch =
2315*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_LOUT, RT5659_VOL_R_SFT, 1, 1);
2316*4882a593Smuzhiyun
2317*4882a593Smuzhiyun /* Out Switch */
2318*4882a593Smuzhiyun static const struct snd_kcontrol_new spo_switch =
2319*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_CLASSD_2, RT5659_M_RF_DIG_SFT, 1, 1);
2320*4882a593Smuzhiyun
2321*4882a593Smuzhiyun static const struct snd_kcontrol_new mono_switch =
2322*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_MONO_OUT, RT5659_L_MUTE_SFT, 1, 1);
2323*4882a593Smuzhiyun
2324*4882a593Smuzhiyun static const struct snd_kcontrol_new hpo_l_switch =
2325*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_HP_VOL, RT5659_L_MUTE_SFT, 1, 1);
2326*4882a593Smuzhiyun
2327*4882a593Smuzhiyun static const struct snd_kcontrol_new hpo_r_switch =
2328*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_HP_VOL, RT5659_R_MUTE_SFT, 1, 1);
2329*4882a593Smuzhiyun
2330*4882a593Smuzhiyun static const struct snd_kcontrol_new lout_l_switch =
2331*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_LOUT, RT5659_L_MUTE_SFT, 1, 1);
2332*4882a593Smuzhiyun
2333*4882a593Smuzhiyun static const struct snd_kcontrol_new lout_r_switch =
2334*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_LOUT, RT5659_R_MUTE_SFT, 1, 1);
2335*4882a593Smuzhiyun
2336*4882a593Smuzhiyun static const struct snd_kcontrol_new pdm_l_switch =
2337*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_PDM_OUT_CTRL, RT5659_M_PDM1_L_SFT, 1,
2338*4882a593Smuzhiyun 1);
2339*4882a593Smuzhiyun
2340*4882a593Smuzhiyun static const struct snd_kcontrol_new pdm_r_switch =
2341*4882a593Smuzhiyun SOC_DAPM_SINGLE("Switch", RT5659_PDM_OUT_CTRL, RT5659_M_PDM1_R_SFT, 1,
2342*4882a593Smuzhiyun 1);
2343*4882a593Smuzhiyun
rt5659_spk_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)2344*4882a593Smuzhiyun static int rt5659_spk_event(struct snd_soc_dapm_widget *w,
2345*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
2346*4882a593Smuzhiyun {
2347*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
2348*4882a593Smuzhiyun
2349*4882a593Smuzhiyun switch (event) {
2350*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMU:
2351*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_CLASSD_CTRL_1,
2352*4882a593Smuzhiyun RT5659_POW_CLSD_DB_MASK, RT5659_POW_CLSD_DB_EN);
2353*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_CLASSD_2,
2354*4882a593Smuzhiyun RT5659_M_RI_DIG, RT5659_M_RI_DIG);
2355*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_CLASSD_1, 0x0803);
2356*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_SPK_DC_CAILB_CTRL_3, 0x0000);
2357*4882a593Smuzhiyun break;
2358*4882a593Smuzhiyun
2359*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMD:
2360*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_CLASSD_1, 0x0011);
2361*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_CLASSD_2,
2362*4882a593Smuzhiyun RT5659_M_RI_DIG, 0x0);
2363*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_SPK_DC_CAILB_CTRL_3, 0x0003);
2364*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_CLASSD_CTRL_1,
2365*4882a593Smuzhiyun RT5659_POW_CLSD_DB_MASK, RT5659_POW_CLSD_DB_DIS);
2366*4882a593Smuzhiyun break;
2367*4882a593Smuzhiyun
2368*4882a593Smuzhiyun default:
2369*4882a593Smuzhiyun return 0;
2370*4882a593Smuzhiyun }
2371*4882a593Smuzhiyun
2372*4882a593Smuzhiyun return 0;
2373*4882a593Smuzhiyun
2374*4882a593Smuzhiyun }
2375*4882a593Smuzhiyun
rt5659_mono_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)2376*4882a593Smuzhiyun static int rt5659_mono_event(struct snd_soc_dapm_widget *w,
2377*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
2378*4882a593Smuzhiyun {
2379*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
2380*4882a593Smuzhiyun
2381*4882a593Smuzhiyun switch (event) {
2382*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMU:
2383*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e00);
2384*4882a593Smuzhiyun break;
2385*4882a593Smuzhiyun
2386*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMD:
2387*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e04);
2388*4882a593Smuzhiyun break;
2389*4882a593Smuzhiyun
2390*4882a593Smuzhiyun default:
2391*4882a593Smuzhiyun return 0;
2392*4882a593Smuzhiyun }
2393*4882a593Smuzhiyun
2394*4882a593Smuzhiyun return 0;
2395*4882a593Smuzhiyun
2396*4882a593Smuzhiyun }
2397*4882a593Smuzhiyun
rt5659_hp_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)2398*4882a593Smuzhiyun static int rt5659_hp_event(struct snd_soc_dapm_widget *w,
2399*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
2400*4882a593Smuzhiyun {
2401*4882a593Smuzhiyun struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
2402*4882a593Smuzhiyun
2403*4882a593Smuzhiyun switch (event) {
2404*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMU:
2405*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_HP_CHARGE_PUMP_1, 0x0e1e);
2406*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_DEPOP_1, 0x0010, 0x0010);
2407*4882a593Smuzhiyun break;
2408*4882a593Smuzhiyun
2409*4882a593Smuzhiyun case SND_SOC_DAPM_PRE_PMD:
2410*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_DEPOP_1, 0x0000);
2411*4882a593Smuzhiyun break;
2412*4882a593Smuzhiyun
2413*4882a593Smuzhiyun default:
2414*4882a593Smuzhiyun return 0;
2415*4882a593Smuzhiyun }
2416*4882a593Smuzhiyun
2417*4882a593Smuzhiyun return 0;
2418*4882a593Smuzhiyun }
2419*4882a593Smuzhiyun
set_dmic_power(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)2420*4882a593Smuzhiyun static int set_dmic_power(struct snd_soc_dapm_widget *w,
2421*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, int event)
2422*4882a593Smuzhiyun {
2423*4882a593Smuzhiyun switch (event) {
2424*4882a593Smuzhiyun case SND_SOC_DAPM_POST_PMU:
2425*4882a593Smuzhiyun /*Add delay to avoid pop noise*/
2426*4882a593Smuzhiyun msleep(450);
2427*4882a593Smuzhiyun break;
2428*4882a593Smuzhiyun
2429*4882a593Smuzhiyun default:
2430*4882a593Smuzhiyun return 0;
2431*4882a593Smuzhiyun }
2432*4882a593Smuzhiyun
2433*4882a593Smuzhiyun return 0;
2434*4882a593Smuzhiyun }
2435*4882a593Smuzhiyun
2436*4882a593Smuzhiyun static const struct snd_soc_dapm_widget rt5659_particular_dapm_widgets[] = {
2437*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("LDO2", RT5659_PWR_ANLG_3, RT5659_PWR_LDO2_BIT, 0,
2438*4882a593Smuzhiyun NULL, 0),
2439*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5659_PWR_ANLG_2, RT5659_PWR_MB1_BIT,
2440*4882a593Smuzhiyun 0, NULL, 0),
2441*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5659_PWR_VOL,
2442*4882a593Smuzhiyun RT5659_PWR_MIC_DET_BIT, 0, NULL, 0),
2443*4882a593Smuzhiyun };
2444*4882a593Smuzhiyun
2445*4882a593Smuzhiyun static const struct snd_soc_dapm_widget rt5659_dapm_widgets[] = {
2446*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("PLL", RT5659_PWR_ANLG_3, RT5659_PWR_PLL_BIT, 0,
2447*4882a593Smuzhiyun NULL, 0),
2448*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("Mono Vref", RT5659_PWR_ANLG_1,
2449*4882a593Smuzhiyun RT5659_PWR_VREF3_BIT, 0, NULL, 0),
2450*4882a593Smuzhiyun
2451*4882a593Smuzhiyun /* ASRC */
2452*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5659_ASRC_1,
2453*4882a593Smuzhiyun RT5659_I2S1_ASRC_SFT, 0, NULL, 0),
2454*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5659_ASRC_1,
2455*4882a593Smuzhiyun RT5659_I2S2_ASRC_SFT, 0, NULL, 0),
2456*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5659_ASRC_1,
2457*4882a593Smuzhiyun RT5659_I2S3_ASRC_SFT, 0, NULL, 0),
2458*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5659_ASRC_1,
2459*4882a593Smuzhiyun RT5659_DAC_STO_ASRC_SFT, 0, NULL, 0),
2460*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DAC Mono L ASRC", 1, RT5659_ASRC_1,
2461*4882a593Smuzhiyun RT5659_DAC_MONO_L_ASRC_SFT, 0, NULL, 0),
2462*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DAC Mono R ASRC", 1, RT5659_ASRC_1,
2463*4882a593Smuzhiyun RT5659_DAC_MONO_R_ASRC_SFT, 0, NULL, 0),
2464*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5659_ASRC_1,
2465*4882a593Smuzhiyun RT5659_ADC_STO1_ASRC_SFT, 0, NULL, 0),
2466*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("ADC Mono L ASRC", 1, RT5659_ASRC_1,
2467*4882a593Smuzhiyun RT5659_ADC_MONO_L_ASRC_SFT, 0, NULL, 0),
2468*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("ADC Mono R ASRC", 1, RT5659_ASRC_1,
2469*4882a593Smuzhiyun RT5659_ADC_MONO_R_ASRC_SFT, 0, NULL, 0),
2470*4882a593Smuzhiyun
2471*4882a593Smuzhiyun /* Input Side */
2472*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5659_PWR_ANLG_2, RT5659_PWR_MB2_BIT,
2473*4882a593Smuzhiyun 0, NULL, 0),
2474*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("MICBIAS3", RT5659_PWR_ANLG_2, RT5659_PWR_MB3_BIT,
2475*4882a593Smuzhiyun 0, NULL, 0),
2476*4882a593Smuzhiyun
2477*4882a593Smuzhiyun /* Input Lines */
2478*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("DMIC L1"),
2479*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("DMIC R1"),
2480*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("DMIC L2"),
2481*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("DMIC R2"),
2482*4882a593Smuzhiyun
2483*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN1P"),
2484*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN1N"),
2485*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN2P"),
2486*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN2N"),
2487*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN3P"),
2488*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN3N"),
2489*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN4P"),
2490*4882a593Smuzhiyun SND_SOC_DAPM_INPUT("IN4N"),
2491*4882a593Smuzhiyun
2492*4882a593Smuzhiyun SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2493*4882a593Smuzhiyun SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2494*4882a593Smuzhiyun
2495*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
2496*4882a593Smuzhiyun set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
2497*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5659_DMIC_CTRL_1,
2498*4882a593Smuzhiyun RT5659_DMIC_1_EN_SFT, 0, set_dmic_power, SND_SOC_DAPM_POST_PMU),
2499*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5659_DMIC_CTRL_1,
2500*4882a593Smuzhiyun RT5659_DMIC_2_EN_SFT, 0, set_dmic_power, SND_SOC_DAPM_POST_PMU),
2501*4882a593Smuzhiyun
2502*4882a593Smuzhiyun /* Boost */
2503*4882a593Smuzhiyun SND_SOC_DAPM_PGA("BST1", RT5659_PWR_ANLG_2,
2504*4882a593Smuzhiyun RT5659_PWR_BST1_P_BIT, 0, NULL, 0),
2505*4882a593Smuzhiyun SND_SOC_DAPM_PGA("BST2", RT5659_PWR_ANLG_2,
2506*4882a593Smuzhiyun RT5659_PWR_BST2_P_BIT, 0, NULL, 0),
2507*4882a593Smuzhiyun SND_SOC_DAPM_PGA("BST3", RT5659_PWR_ANLG_2,
2508*4882a593Smuzhiyun RT5659_PWR_BST3_P_BIT, 0, NULL, 0),
2509*4882a593Smuzhiyun SND_SOC_DAPM_PGA("BST4", RT5659_PWR_ANLG_2,
2510*4882a593Smuzhiyun RT5659_PWR_BST4_P_BIT, 0, NULL, 0),
2511*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("BST1 Power", RT5659_PWR_ANLG_2,
2512*4882a593Smuzhiyun RT5659_PWR_BST1_BIT, 0, NULL, 0),
2513*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("BST2 Power", RT5659_PWR_ANLG_2,
2514*4882a593Smuzhiyun RT5659_PWR_BST2_BIT, 0, NULL, 0),
2515*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("BST3 Power", RT5659_PWR_ANLG_2,
2516*4882a593Smuzhiyun RT5659_PWR_BST3_BIT, 0, NULL, 0),
2517*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("BST4 Power", RT5659_PWR_ANLG_2,
2518*4882a593Smuzhiyun RT5659_PWR_BST4_BIT, 0, NULL, 0),
2519*4882a593Smuzhiyun
2520*4882a593Smuzhiyun
2521*4882a593Smuzhiyun /* Input Volume */
2522*4882a593Smuzhiyun SND_SOC_DAPM_PGA("INL VOL", RT5659_PWR_VOL, RT5659_PWR_IN_L_BIT,
2523*4882a593Smuzhiyun 0, NULL, 0),
2524*4882a593Smuzhiyun SND_SOC_DAPM_PGA("INR VOL", RT5659_PWR_VOL, RT5659_PWR_IN_R_BIT,
2525*4882a593Smuzhiyun 0, NULL, 0),
2526*4882a593Smuzhiyun
2527*4882a593Smuzhiyun /* REC Mixer */
2528*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("RECMIX1L", RT5659_PWR_MIXER, RT5659_PWR_RM1_L_BIT,
2529*4882a593Smuzhiyun 0, rt5659_rec1_l_mix, ARRAY_SIZE(rt5659_rec1_l_mix)),
2530*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("RECMIX1R", RT5659_PWR_MIXER, RT5659_PWR_RM1_R_BIT,
2531*4882a593Smuzhiyun 0, rt5659_rec1_r_mix, ARRAY_SIZE(rt5659_rec1_r_mix)),
2532*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("RECMIX2L", RT5659_PWR_MIXER, RT5659_PWR_RM2_L_BIT,
2533*4882a593Smuzhiyun 0, rt5659_rec2_l_mix, ARRAY_SIZE(rt5659_rec2_l_mix)),
2534*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("RECMIX2R", RT5659_PWR_MIXER, RT5659_PWR_RM2_R_BIT,
2535*4882a593Smuzhiyun 0, rt5659_rec2_r_mix, ARRAY_SIZE(rt5659_rec2_r_mix)),
2536*4882a593Smuzhiyun
2537*4882a593Smuzhiyun /* ADCs */
2538*4882a593Smuzhiyun SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),
2539*4882a593Smuzhiyun SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),
2540*4882a593Smuzhiyun SND_SOC_DAPM_ADC("ADC2 L", NULL, SND_SOC_NOPM, 0, 0),
2541*4882a593Smuzhiyun SND_SOC_DAPM_ADC("ADC2 R", NULL, SND_SOC_NOPM, 0, 0),
2542*4882a593Smuzhiyun
2543*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5659_PWR_DIG_1,
2544*4882a593Smuzhiyun RT5659_PWR_ADC_L1_BIT, 0, NULL, 0),
2545*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5659_PWR_DIG_1,
2546*4882a593Smuzhiyun RT5659_PWR_ADC_R1_BIT, 0, NULL, 0),
2547*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC2 L Power", RT5659_PWR_DIG_1,
2548*4882a593Smuzhiyun RT5659_PWR_ADC_L2_BIT, 0, NULL, 0),
2549*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC2 R Power", RT5659_PWR_DIG_1,
2550*4882a593Smuzhiyun RT5659_PWR_ADC_R2_BIT, 0, NULL, 0),
2551*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC1 clock", SND_SOC_NOPM, 0, 0, set_adc1_clk,
2552*4882a593Smuzhiyun SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2553*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC2 clock", SND_SOC_NOPM, 0, 0, set_adc2_clk,
2554*4882a593Smuzhiyun SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2555*4882a593Smuzhiyun
2556*4882a593Smuzhiyun /* ADC Mux */
2557*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 DMIC L Mux", SND_SOC_NOPM, 0, 0,
2558*4882a593Smuzhiyun &rt5659_sto1_dmic_mux),
2559*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 DMIC R Mux", SND_SOC_NOPM, 0, 0,
2560*4882a593Smuzhiyun &rt5659_sto1_dmic_mux),
2561*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2562*4882a593Smuzhiyun &rt5659_sto1_adc1_mux),
2563*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2564*4882a593Smuzhiyun &rt5659_sto1_adc1_mux),
2565*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2566*4882a593Smuzhiyun &rt5659_sto1_adc2_mux),
2567*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2568*4882a593Smuzhiyun &rt5659_sto1_adc2_mux),
2569*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,
2570*4882a593Smuzhiyun &rt5659_sto1_adc_mux),
2571*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,
2572*4882a593Smuzhiyun &rt5659_sto1_adc_mux),
2573*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2574*4882a593Smuzhiyun &rt5659_mono_adc_l2_mux),
2575*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2576*4882a593Smuzhiyun &rt5659_mono_adc_r2_mux),
2577*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2578*4882a593Smuzhiyun &rt5659_mono_adc_l1_mux),
2579*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2580*4882a593Smuzhiyun &rt5659_mono_adc_r1_mux),
2581*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
2582*4882a593Smuzhiyun &rt5659_mono_dmic_l_mux),
2583*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
2584*4882a593Smuzhiyun &rt5659_mono_dmic_r_mux),
2585*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Mono ADC L Mux", SND_SOC_NOPM, 0, 0,
2586*4882a593Smuzhiyun &rt5659_mono_adc_l_mux),
2587*4882a593Smuzhiyun SND_SOC_DAPM_MUX("Mono ADC R Mux", SND_SOC_NOPM, 0, 0,
2588*4882a593Smuzhiyun &rt5659_mono_adc_r_mux),
2589*4882a593Smuzhiyun /* ADC Mixer */
2590*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5659_PWR_DIG_2,
2591*4882a593Smuzhiyun RT5659_PWR_ADC_S1F_BIT, 0, NULL, 0),
2592*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC Stereo2 Filter", RT5659_PWR_DIG_2,
2593*4882a593Smuzhiyun RT5659_PWR_ADC_S2F_BIT, 0, NULL, 0),
2594*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", SND_SOC_NOPM,
2595*4882a593Smuzhiyun 0, 0, rt5659_sto1_adc_l_mix,
2596*4882a593Smuzhiyun ARRAY_SIZE(rt5659_sto1_adc_l_mix)),
2597*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", SND_SOC_NOPM,
2598*4882a593Smuzhiyun 0, 0, rt5659_sto1_adc_r_mix,
2599*4882a593Smuzhiyun ARRAY_SIZE(rt5659_sto1_adc_r_mix)),
2600*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC Mono Left Filter", RT5659_PWR_DIG_2,
2601*4882a593Smuzhiyun RT5659_PWR_ADC_MF_L_BIT, 0, NULL, 0),
2602*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Mono ADC MIXL", RT5659_MONO_ADC_DIG_VOL,
2603*4882a593Smuzhiyun RT5659_L_MUTE_SFT, 1, rt5659_mono_adc_l_mix,
2604*4882a593Smuzhiyun ARRAY_SIZE(rt5659_mono_adc_l_mix)),
2605*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("ADC Mono Right Filter", RT5659_PWR_DIG_2,
2606*4882a593Smuzhiyun RT5659_PWR_ADC_MF_R_BIT, 0, NULL, 0),
2607*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Mono ADC MIXR", RT5659_MONO_ADC_DIG_VOL,
2608*4882a593Smuzhiyun RT5659_R_MUTE_SFT, 1, rt5659_mono_adc_r_mix,
2609*4882a593Smuzhiyun ARRAY_SIZE(rt5659_mono_adc_r_mix)),
2610*4882a593Smuzhiyun
2611*4882a593Smuzhiyun /* ADC PGA */
2612*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2613*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2614*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
2615*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2616*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2617*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
2618*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
2619*4882a593Smuzhiyun SND_SOC_DAPM_PGA("Stereo2 ADC LR", SND_SOC_NOPM, 0, 0, NULL, 0),
2620*4882a593Smuzhiyun
2621*4882a593Smuzhiyun SND_SOC_DAPM_PGA("Stereo1 ADC Volume L", RT5659_STO1_ADC_DIG_VOL,
2622*4882a593Smuzhiyun RT5659_L_MUTE_SFT, 1, NULL, 0),
2623*4882a593Smuzhiyun SND_SOC_DAPM_PGA("Stereo1 ADC Volume R", RT5659_STO1_ADC_DIG_VOL,
2624*4882a593Smuzhiyun RT5659_R_MUTE_SFT, 1, NULL, 0),
2625*4882a593Smuzhiyun
2626*4882a593Smuzhiyun /* Digital Interface */
2627*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("I2S1", RT5659_PWR_DIG_1, RT5659_PWR_I2S1_BIT,
2628*4882a593Smuzhiyun 0, NULL, 0),
2629*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2630*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2631*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
2632*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
2633*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC2 L", SND_SOC_NOPM, 0, 0, NULL, 0),
2634*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 DAC2 R", SND_SOC_NOPM, 0, 0, NULL, 0),
2635*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2636*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2637*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2638*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("I2S2", RT5659_PWR_DIG_1, RT5659_PWR_I2S2_BIT, 0,
2639*4882a593Smuzhiyun NULL, 0),
2640*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF2 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2641*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF2 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2642*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF2 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2643*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2644*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF2 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2645*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF2 ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2646*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("I2S3", RT5659_PWR_DIG_1, RT5659_PWR_I2S3_BIT, 0,
2647*4882a593Smuzhiyun NULL, 0),
2648*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF3 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2649*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF3 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2650*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF3 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2651*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF3 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2652*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF3 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2653*4882a593Smuzhiyun SND_SOC_DAPM_PGA("IF3 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2654*4882a593Smuzhiyun
2655*4882a593Smuzhiyun /* Digital Interface Select */
2656*4882a593Smuzhiyun SND_SOC_DAPM_PGA("TDM AD1:AD2:DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2657*4882a593Smuzhiyun SND_SOC_DAPM_PGA("TDM AD2:DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2658*4882a593Smuzhiyun SND_SOC_DAPM_MUX("TDM Data Mux", SND_SOC_NOPM, 0, 0,
2659*4882a593Smuzhiyun &rt5659_rx_adc_dac_mux),
2660*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM, 0, 0,
2661*4882a593Smuzhiyun &rt5659_if2_adc_in_mux),
2662*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF3 ADC Mux", SND_SOC_NOPM, 0, 0,
2663*4882a593Smuzhiyun &rt5659_if3_adc_in_mux),
2664*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2665*4882a593Smuzhiyun &rt5659_if1_01_adc_swap_mux),
2666*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2667*4882a593Smuzhiyun &rt5659_if1_23_adc_swap_mux),
2668*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2669*4882a593Smuzhiyun &rt5659_if1_45_adc_swap_mux),
2670*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2671*4882a593Smuzhiyun &rt5659_if1_67_adc_swap_mux),
2672*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF2 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
2673*4882a593Smuzhiyun &rt5659_if2_dac_swap_mux),
2674*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2675*4882a593Smuzhiyun &rt5659_if2_adc_swap_mux),
2676*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF3 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
2677*4882a593Smuzhiyun &rt5659_if3_dac_swap_mux),
2678*4882a593Smuzhiyun SND_SOC_DAPM_MUX("IF3 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2679*4882a593Smuzhiyun &rt5659_if3_adc_swap_mux),
2680*4882a593Smuzhiyun
2681*4882a593Smuzhiyun /* Audio Interface */
2682*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
2683*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
2684*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
2685*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
2686*4882a593Smuzhiyun SND_SOC_DAPM_AIF_IN("AIF3RX", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0),
2687*4882a593Smuzhiyun SND_SOC_DAPM_AIF_OUT("AIF3TX", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0),
2688*4882a593Smuzhiyun
2689*4882a593Smuzhiyun /* Output Side */
2690*4882a593Smuzhiyun /* DAC mixer before sound effect */
2691*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
2692*4882a593Smuzhiyun rt5659_dac_l_mix, ARRAY_SIZE(rt5659_dac_l_mix)),
2693*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
2694*4882a593Smuzhiyun rt5659_dac_r_mix, ARRAY_SIZE(rt5659_dac_r_mix)),
2695*4882a593Smuzhiyun
2696*4882a593Smuzhiyun /* DAC channel Mux */
2697*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC L1 Mux", SND_SOC_NOPM, 0, 0, &rt5659_dac_l1_mux),
2698*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC R1 Mux", SND_SOC_NOPM, 0, 0, &rt5659_dac_r1_mux),
2699*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, &rt5659_dac_l2_mux),
2700*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, &rt5659_dac_r2_mux),
2701*4882a593Smuzhiyun
2702*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0,
2703*4882a593Smuzhiyun &rt5659_alg_dac_l1_mux),
2704*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0,
2705*4882a593Smuzhiyun &rt5659_alg_dac_r1_mux),
2706*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC L2 Source", SND_SOC_NOPM, 0, 0,
2707*4882a593Smuzhiyun &rt5659_alg_dac_l2_mux),
2708*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC R2 Source", SND_SOC_NOPM, 0, 0,
2709*4882a593Smuzhiyun &rt5659_alg_dac_r2_mux),
2710*4882a593Smuzhiyun
2711*4882a593Smuzhiyun /* DAC Mixer */
2712*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5659_PWR_DIG_2,
2713*4882a593Smuzhiyun RT5659_PWR_DAC_S1F_BIT, 0, NULL, 0),
2714*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DAC Mono Left Filter", RT5659_PWR_DIG_2,
2715*4882a593Smuzhiyun RT5659_PWR_DAC_MF_L_BIT, 0, NULL, 0),
2716*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DAC Mono Right Filter", RT5659_PWR_DIG_2,
2717*4882a593Smuzhiyun RT5659_PWR_DAC_MF_R_BIT, 0, NULL, 0),
2718*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
2719*4882a593Smuzhiyun rt5659_sto_dac_l_mix, ARRAY_SIZE(rt5659_sto_dac_l_mix)),
2720*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
2721*4882a593Smuzhiyun rt5659_sto_dac_r_mix, ARRAY_SIZE(rt5659_sto_dac_r_mix)),
2722*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
2723*4882a593Smuzhiyun rt5659_mono_dac_l_mix, ARRAY_SIZE(rt5659_mono_dac_l_mix)),
2724*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
2725*4882a593Smuzhiyun rt5659_mono_dac_r_mix, ARRAY_SIZE(rt5659_mono_dac_r_mix)),
2726*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC MIXL", SND_SOC_NOPM, 0, 0,
2727*4882a593Smuzhiyun &rt5659_dig_dac_mixl_mux),
2728*4882a593Smuzhiyun SND_SOC_DAPM_MUX("DAC MIXR", SND_SOC_NOPM, 0, 0,
2729*4882a593Smuzhiyun &rt5659_dig_dac_mixr_mux),
2730*4882a593Smuzhiyun
2731*4882a593Smuzhiyun /* DACs */
2732*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DAC L1 Power", 1, RT5659_PWR_DIG_1,
2733*4882a593Smuzhiyun RT5659_PWR_DAC_L1_BIT, 0, NULL, 0),
2734*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY_S("DAC R1 Power", 1, RT5659_PWR_DIG_1,
2735*4882a593Smuzhiyun RT5659_PWR_DAC_R1_BIT, 0, NULL, 0),
2736*4882a593Smuzhiyun SND_SOC_DAPM_DAC("DAC L1", NULL, SND_SOC_NOPM, 0, 0),
2737*4882a593Smuzhiyun SND_SOC_DAPM_DAC("DAC R1", NULL, SND_SOC_NOPM, 0, 0),
2738*4882a593Smuzhiyun
2739*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DAC L2 Power", RT5659_PWR_DIG_1,
2740*4882a593Smuzhiyun RT5659_PWR_DAC_L2_BIT, 0, NULL, 0),
2741*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("DAC R2 Power", RT5659_PWR_DIG_1,
2742*4882a593Smuzhiyun RT5659_PWR_DAC_R2_BIT, 0, NULL, 0),
2743*4882a593Smuzhiyun SND_SOC_DAPM_DAC("DAC L2", NULL, SND_SOC_NOPM, 0, 0),
2744*4882a593Smuzhiyun SND_SOC_DAPM_DAC("DAC R2", NULL, SND_SOC_NOPM, 0, 0),
2745*4882a593Smuzhiyun SND_SOC_DAPM_PGA("DAC_REF", SND_SOC_NOPM, 0, 0, NULL, 0),
2746*4882a593Smuzhiyun
2747*4882a593Smuzhiyun /* OUT Mixer */
2748*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("SPK MIXL", RT5659_PWR_MIXER, RT5659_PWR_SM_L_BIT,
2749*4882a593Smuzhiyun 0, rt5659_spk_l_mix, ARRAY_SIZE(rt5659_spk_l_mix)),
2750*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("SPK MIXR", RT5659_PWR_MIXER, RT5659_PWR_SM_R_BIT,
2751*4882a593Smuzhiyun 0, rt5659_spk_r_mix, ARRAY_SIZE(rt5659_spk_r_mix)),
2752*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("MONOVOL MIX", RT5659_PWR_MIXER, RT5659_PWR_MM_BIT,
2753*4882a593Smuzhiyun 0, rt5659_monovol_mix, ARRAY_SIZE(rt5659_monovol_mix)),
2754*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("OUT MIXL", RT5659_PWR_MIXER, RT5659_PWR_OM_L_BIT,
2755*4882a593Smuzhiyun 0, rt5659_out_l_mix, ARRAY_SIZE(rt5659_out_l_mix)),
2756*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("OUT MIXR", RT5659_PWR_MIXER, RT5659_PWR_OM_R_BIT,
2757*4882a593Smuzhiyun 0, rt5659_out_r_mix, ARRAY_SIZE(rt5659_out_r_mix)),
2758*4882a593Smuzhiyun
2759*4882a593Smuzhiyun /* Output Volume */
2760*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("SPKVOL L", RT5659_PWR_VOL, RT5659_PWR_SV_L_BIT, 0,
2761*4882a593Smuzhiyun &spkvol_l_switch),
2762*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("SPKVOL R", RT5659_PWR_VOL, RT5659_PWR_SV_R_BIT, 0,
2763*4882a593Smuzhiyun &spkvol_r_switch),
2764*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("MONOVOL", RT5659_PWR_VOL, RT5659_PWR_MV_BIT, 0,
2765*4882a593Smuzhiyun &monovol_switch),
2766*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("OUTVOL L", RT5659_PWR_VOL, RT5659_PWR_OV_L_BIT, 0,
2767*4882a593Smuzhiyun &outvol_l_switch),
2768*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("OUTVOL R", RT5659_PWR_VOL, RT5659_PWR_OV_R_BIT, 0,
2769*4882a593Smuzhiyun &outvol_r_switch),
2770*4882a593Smuzhiyun
2771*4882a593Smuzhiyun /* SPO/MONO/HPO/LOUT */
2772*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("SPO L MIX", SND_SOC_NOPM, 0, 0, rt5659_spo_l_mix,
2773*4882a593Smuzhiyun ARRAY_SIZE(rt5659_spo_l_mix)),
2774*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("SPO R MIX", SND_SOC_NOPM, 0, 0, rt5659_spo_r_mix,
2775*4882a593Smuzhiyun ARRAY_SIZE(rt5659_spo_r_mix)),
2776*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("Mono MIX", SND_SOC_NOPM, 0, 0, rt5659_mono_mix,
2777*4882a593Smuzhiyun ARRAY_SIZE(rt5659_mono_mix)),
2778*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("LOUT L MIX", SND_SOC_NOPM, 0, 0, rt5659_lout_l_mix,
2779*4882a593Smuzhiyun ARRAY_SIZE(rt5659_lout_l_mix)),
2780*4882a593Smuzhiyun SND_SOC_DAPM_MIXER("LOUT R MIX", SND_SOC_NOPM, 0, 0, rt5659_lout_r_mix,
2781*4882a593Smuzhiyun ARRAY_SIZE(rt5659_lout_r_mix)),
2782*4882a593Smuzhiyun
2783*4882a593Smuzhiyun SND_SOC_DAPM_PGA_S("SPK Amp", 1, RT5659_PWR_DIG_1, RT5659_PWR_CLS_D_BIT,
2784*4882a593Smuzhiyun 0, rt5659_spk_event, SND_SOC_DAPM_POST_PMD |
2785*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU),
2786*4882a593Smuzhiyun SND_SOC_DAPM_PGA_S("Mono Amp", 1, RT5659_PWR_ANLG_1, RT5659_PWR_MA_BIT,
2787*4882a593Smuzhiyun 0, rt5659_mono_event, SND_SOC_DAPM_POST_PMD |
2788*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMU),
2789*4882a593Smuzhiyun SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5659_hp_event,
2790*4882a593Smuzhiyun SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
2791*4882a593Smuzhiyun SND_SOC_DAPM_PGA_S("LOUT Amp", 1, RT5659_PWR_ANLG_1, RT5659_PWR_LM_BIT,
2792*4882a593Smuzhiyun 0, NULL, 0),
2793*4882a593Smuzhiyun
2794*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("Charge Pump", SND_SOC_NOPM, 0, 0,
2795*4882a593Smuzhiyun rt5659_charge_pump_event, SND_SOC_DAPM_PRE_PMU |
2796*4882a593Smuzhiyun SND_SOC_DAPM_POST_PMD),
2797*4882a593Smuzhiyun
2798*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("SPO Playback", SND_SOC_NOPM, 0, 0, &spo_switch),
2799*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("Mono Playback", SND_SOC_NOPM, 0, 0,
2800*4882a593Smuzhiyun &mono_switch),
2801*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("HPO L Playback", SND_SOC_NOPM, 0, 0,
2802*4882a593Smuzhiyun &hpo_l_switch),
2803*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("HPO R Playback", SND_SOC_NOPM, 0, 0,
2804*4882a593Smuzhiyun &hpo_r_switch),
2805*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("LOUT L Playback", SND_SOC_NOPM, 0, 0,
2806*4882a593Smuzhiyun &lout_l_switch),
2807*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("LOUT R Playback", SND_SOC_NOPM, 0, 0,
2808*4882a593Smuzhiyun &lout_r_switch),
2809*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("PDM L Playback", SND_SOC_NOPM, 0, 0,
2810*4882a593Smuzhiyun &pdm_l_switch),
2811*4882a593Smuzhiyun SND_SOC_DAPM_SWITCH("PDM R Playback", SND_SOC_NOPM, 0, 0,
2812*4882a593Smuzhiyun &pdm_r_switch),
2813*4882a593Smuzhiyun
2814*4882a593Smuzhiyun /* PDM */
2815*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("PDM Power", RT5659_PWR_DIG_2,
2816*4882a593Smuzhiyun RT5659_PWR_PDM1_BIT, 0, NULL, 0),
2817*4882a593Smuzhiyun SND_SOC_DAPM_MUX("PDM L Mux", RT5659_PDM_OUT_CTRL,
2818*4882a593Smuzhiyun RT5659_M_PDM1_L_SFT, 1, &rt5659_pdm_l_mux),
2819*4882a593Smuzhiyun SND_SOC_DAPM_MUX("PDM R Mux", RT5659_PDM_OUT_CTRL,
2820*4882a593Smuzhiyun RT5659_M_PDM1_R_SFT, 1, &rt5659_pdm_r_mux),
2821*4882a593Smuzhiyun
2822*4882a593Smuzhiyun /* SPDIF */
2823*4882a593Smuzhiyun SND_SOC_DAPM_MUX("SPDIF Mux", SND_SOC_NOPM, 0, 0, &rt5659_spdif_mux),
2824*4882a593Smuzhiyun
2825*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("SYS CLK DET", RT5659_CLK_DET, 3, 0, NULL, 0),
2826*4882a593Smuzhiyun SND_SOC_DAPM_SUPPLY("CLKDET", RT5659_CLK_DET, 0, 0, NULL, 0),
2827*4882a593Smuzhiyun
2828*4882a593Smuzhiyun /* Output Lines */
2829*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("HPOL"),
2830*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("HPOR"),
2831*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPOL"),
2832*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPOR"),
2833*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("LOUTL"),
2834*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("LOUTR"),
2835*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("MONOOUT"),
2836*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("PDML"),
2837*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("PDMR"),
2838*4882a593Smuzhiyun SND_SOC_DAPM_OUTPUT("SPDIF"),
2839*4882a593Smuzhiyun };
2840*4882a593Smuzhiyun
2841*4882a593Smuzhiyun static const struct snd_soc_dapm_route rt5659_dapm_routes[] = {
2842*4882a593Smuzhiyun /*PLL*/
2843*4882a593Smuzhiyun { "ADC Stereo1 Filter", NULL, "PLL", is_sys_clk_from_pll },
2844*4882a593Smuzhiyun { "ADC Stereo2 Filter", NULL, "PLL", is_sys_clk_from_pll },
2845*4882a593Smuzhiyun { "ADC Mono Left Filter", NULL, "PLL", is_sys_clk_from_pll },
2846*4882a593Smuzhiyun { "ADC Mono Right Filter", NULL, "PLL", is_sys_clk_from_pll },
2847*4882a593Smuzhiyun { "DAC Stereo1 Filter", NULL, "PLL", is_sys_clk_from_pll },
2848*4882a593Smuzhiyun { "DAC Mono Left Filter", NULL, "PLL", is_sys_clk_from_pll },
2849*4882a593Smuzhiyun { "DAC Mono Right Filter", NULL, "PLL", is_sys_clk_from_pll },
2850*4882a593Smuzhiyun
2851*4882a593Smuzhiyun /*ASRC*/
2852*4882a593Smuzhiyun { "ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc },
2853*4882a593Smuzhiyun { "ADC Mono Left Filter", NULL, "ADC Mono L ASRC", is_using_asrc },
2854*4882a593Smuzhiyun { "ADC Mono Right Filter", NULL, "ADC Mono R ASRC", is_using_asrc },
2855*4882a593Smuzhiyun { "DAC Mono Left Filter", NULL, "DAC Mono L ASRC", is_using_asrc },
2856*4882a593Smuzhiyun { "DAC Mono Right Filter", NULL, "DAC Mono R ASRC", is_using_asrc },
2857*4882a593Smuzhiyun { "DAC Stereo1 Filter", NULL, "DAC STO ASRC", is_using_asrc },
2858*4882a593Smuzhiyun
2859*4882a593Smuzhiyun { "SYS CLK DET", NULL, "CLKDET" },
2860*4882a593Smuzhiyun
2861*4882a593Smuzhiyun { "I2S1", NULL, "I2S1 ASRC" },
2862*4882a593Smuzhiyun { "I2S2", NULL, "I2S2 ASRC" },
2863*4882a593Smuzhiyun { "I2S3", NULL, "I2S3 ASRC" },
2864*4882a593Smuzhiyun
2865*4882a593Smuzhiyun { "DMIC1", NULL, "DMIC L1" },
2866*4882a593Smuzhiyun { "DMIC1", NULL, "DMIC R1" },
2867*4882a593Smuzhiyun { "DMIC2", NULL, "DMIC L2" },
2868*4882a593Smuzhiyun { "DMIC2", NULL, "DMIC R2" },
2869*4882a593Smuzhiyun
2870*4882a593Smuzhiyun { "BST1", NULL, "IN1P" },
2871*4882a593Smuzhiyun { "BST1", NULL, "IN1N" },
2872*4882a593Smuzhiyun { "BST1", NULL, "BST1 Power" },
2873*4882a593Smuzhiyun { "BST2", NULL, "IN2P" },
2874*4882a593Smuzhiyun { "BST2", NULL, "IN2N" },
2875*4882a593Smuzhiyun { "BST2", NULL, "BST2 Power" },
2876*4882a593Smuzhiyun { "BST3", NULL, "IN3P" },
2877*4882a593Smuzhiyun { "BST3", NULL, "IN3N" },
2878*4882a593Smuzhiyun { "BST3", NULL, "BST3 Power" },
2879*4882a593Smuzhiyun { "BST4", NULL, "IN4P" },
2880*4882a593Smuzhiyun { "BST4", NULL, "IN4N" },
2881*4882a593Smuzhiyun { "BST4", NULL, "BST4 Power" },
2882*4882a593Smuzhiyun
2883*4882a593Smuzhiyun { "INL VOL", NULL, "IN2P" },
2884*4882a593Smuzhiyun { "INR VOL", NULL, "IN2N" },
2885*4882a593Smuzhiyun
2886*4882a593Smuzhiyun { "RECMIX1L", "SPKVOLL Switch", "SPKVOL L" },
2887*4882a593Smuzhiyun { "RECMIX1L", "INL Switch", "INL VOL" },
2888*4882a593Smuzhiyun { "RECMIX1L", "BST4 Switch", "BST4" },
2889*4882a593Smuzhiyun { "RECMIX1L", "BST3 Switch", "BST3" },
2890*4882a593Smuzhiyun { "RECMIX1L", "BST2 Switch", "BST2" },
2891*4882a593Smuzhiyun { "RECMIX1L", "BST1 Switch", "BST1" },
2892*4882a593Smuzhiyun
2893*4882a593Smuzhiyun { "RECMIX1R", "HPOVOLR Switch", "HPO R Playback" },
2894*4882a593Smuzhiyun { "RECMIX1R", "INR Switch", "INR VOL" },
2895*4882a593Smuzhiyun { "RECMIX1R", "BST4 Switch", "BST4" },
2896*4882a593Smuzhiyun { "RECMIX1R", "BST3 Switch", "BST3" },
2897*4882a593Smuzhiyun { "RECMIX1R", "BST2 Switch", "BST2" },
2898*4882a593Smuzhiyun { "RECMIX1R", "BST1 Switch", "BST1" },
2899*4882a593Smuzhiyun
2900*4882a593Smuzhiyun { "RECMIX2L", "SPKVOLL Switch", "SPKVOL L" },
2901*4882a593Smuzhiyun { "RECMIX2L", "OUTVOLL Switch", "OUTVOL L" },
2902*4882a593Smuzhiyun { "RECMIX2L", "BST4 Switch", "BST4" },
2903*4882a593Smuzhiyun { "RECMIX2L", "BST3 Switch", "BST3" },
2904*4882a593Smuzhiyun { "RECMIX2L", "BST2 Switch", "BST2" },
2905*4882a593Smuzhiyun { "RECMIX2L", "BST1 Switch", "BST1" },
2906*4882a593Smuzhiyun
2907*4882a593Smuzhiyun { "RECMIX2R", "MONOVOL Switch", "MONOVOL" },
2908*4882a593Smuzhiyun { "RECMIX2R", "OUTVOLR Switch", "OUTVOL R" },
2909*4882a593Smuzhiyun { "RECMIX2R", "BST4 Switch", "BST4" },
2910*4882a593Smuzhiyun { "RECMIX2R", "BST3 Switch", "BST3" },
2911*4882a593Smuzhiyun { "RECMIX2R", "BST2 Switch", "BST2" },
2912*4882a593Smuzhiyun { "RECMIX2R", "BST1 Switch", "BST1" },
2913*4882a593Smuzhiyun
2914*4882a593Smuzhiyun { "ADC1 L", NULL, "RECMIX1L" },
2915*4882a593Smuzhiyun { "ADC1 L", NULL, "ADC1 L Power" },
2916*4882a593Smuzhiyun { "ADC1 L", NULL, "ADC1 clock" },
2917*4882a593Smuzhiyun { "ADC1 R", NULL, "RECMIX1R" },
2918*4882a593Smuzhiyun { "ADC1 R", NULL, "ADC1 R Power" },
2919*4882a593Smuzhiyun { "ADC1 R", NULL, "ADC1 clock" },
2920*4882a593Smuzhiyun
2921*4882a593Smuzhiyun { "ADC2 L", NULL, "RECMIX2L" },
2922*4882a593Smuzhiyun { "ADC2 L", NULL, "ADC2 L Power" },
2923*4882a593Smuzhiyun { "ADC2 L", NULL, "ADC2 clock" },
2924*4882a593Smuzhiyun { "ADC2 R", NULL, "RECMIX2R" },
2925*4882a593Smuzhiyun { "ADC2 R", NULL, "ADC2 R Power" },
2926*4882a593Smuzhiyun { "ADC2 R", NULL, "ADC2 clock" },
2927*4882a593Smuzhiyun
2928*4882a593Smuzhiyun { "DMIC L1", NULL, "DMIC CLK" },
2929*4882a593Smuzhiyun { "DMIC L1", NULL, "DMIC1 Power" },
2930*4882a593Smuzhiyun { "DMIC R1", NULL, "DMIC CLK" },
2931*4882a593Smuzhiyun { "DMIC R1", NULL, "DMIC1 Power" },
2932*4882a593Smuzhiyun { "DMIC L2", NULL, "DMIC CLK" },
2933*4882a593Smuzhiyun { "DMIC L2", NULL, "DMIC2 Power" },
2934*4882a593Smuzhiyun { "DMIC R2", NULL, "DMIC CLK" },
2935*4882a593Smuzhiyun { "DMIC R2", NULL, "DMIC2 Power" },
2936*4882a593Smuzhiyun
2937*4882a593Smuzhiyun { "Stereo1 DMIC L Mux", "DMIC1", "DMIC L1" },
2938*4882a593Smuzhiyun { "Stereo1 DMIC L Mux", "DMIC2", "DMIC L2" },
2939*4882a593Smuzhiyun
2940*4882a593Smuzhiyun { "Stereo1 DMIC R Mux", "DMIC1", "DMIC R1" },
2941*4882a593Smuzhiyun { "Stereo1 DMIC R Mux", "DMIC2", "DMIC R2" },
2942*4882a593Smuzhiyun
2943*4882a593Smuzhiyun { "Mono DMIC L Mux", "DMIC1 L", "DMIC L1" },
2944*4882a593Smuzhiyun { "Mono DMIC L Mux", "DMIC2 L", "DMIC L2" },
2945*4882a593Smuzhiyun
2946*4882a593Smuzhiyun { "Mono DMIC R Mux", "DMIC1 R", "DMIC R1" },
2947*4882a593Smuzhiyun { "Mono DMIC R Mux", "DMIC2 R", "DMIC R2" },
2948*4882a593Smuzhiyun
2949*4882a593Smuzhiyun { "Stereo1 ADC L Mux", "ADC1", "ADC1 L" },
2950*4882a593Smuzhiyun { "Stereo1 ADC L Mux", "ADC2", "ADC2 L" },
2951*4882a593Smuzhiyun { "Stereo1 ADC R Mux", "ADC1", "ADC1 R" },
2952*4882a593Smuzhiyun { "Stereo1 ADC R Mux", "ADC2", "ADC2 R" },
2953*4882a593Smuzhiyun
2954*4882a593Smuzhiyun { "Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux" },
2955*4882a593Smuzhiyun { "Stereo1 ADC L1 Mux", "DAC MIX", "DAC MIXL" },
2956*4882a593Smuzhiyun { "Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC L Mux" },
2957*4882a593Smuzhiyun { "Stereo1 ADC L2 Mux", "DAC MIX", "DAC MIXL" },
2958*4882a593Smuzhiyun
2959*4882a593Smuzhiyun { "Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux" },
2960*4882a593Smuzhiyun { "Stereo1 ADC R1 Mux", "DAC MIX", "DAC MIXR" },
2961*4882a593Smuzhiyun { "Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC R Mux" },
2962*4882a593Smuzhiyun { "Stereo1 ADC R2 Mux", "DAC MIX", "DAC MIXR" },
2963*4882a593Smuzhiyun
2964*4882a593Smuzhiyun { "Mono ADC L Mux", "ADC1 L", "ADC1 L" },
2965*4882a593Smuzhiyun { "Mono ADC L Mux", "ADC1 R", "ADC1 R" },
2966*4882a593Smuzhiyun { "Mono ADC L Mux", "ADC2 L", "ADC2 L" },
2967*4882a593Smuzhiyun { "Mono ADC L Mux", "ADC2 R", "ADC2 R" },
2968*4882a593Smuzhiyun
2969*4882a593Smuzhiyun { "Mono ADC R Mux", "ADC1 L", "ADC1 L" },
2970*4882a593Smuzhiyun { "Mono ADC R Mux", "ADC1 R", "ADC1 R" },
2971*4882a593Smuzhiyun { "Mono ADC R Mux", "ADC2 L", "ADC2 L" },
2972*4882a593Smuzhiyun { "Mono ADC R Mux", "ADC2 R", "ADC2 R" },
2973*4882a593Smuzhiyun
2974*4882a593Smuzhiyun { "Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux" },
2975*4882a593Smuzhiyun { "Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
2976*4882a593Smuzhiyun { "Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
2977*4882a593Smuzhiyun { "Mono ADC L1 Mux", "ADC", "Mono ADC L Mux" },
2978*4882a593Smuzhiyun
2979*4882a593Smuzhiyun { "Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
2980*4882a593Smuzhiyun { "Mono ADC R1 Mux", "ADC", "Mono ADC R Mux" },
2981*4882a593Smuzhiyun { "Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux" },
2982*4882a593Smuzhiyun { "Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
2983*4882a593Smuzhiyun
2984*4882a593Smuzhiyun { "Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux" },
2985*4882a593Smuzhiyun { "Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux" },
2986*4882a593Smuzhiyun { "Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter" },
2987*4882a593Smuzhiyun
2988*4882a593Smuzhiyun { "Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux" },
2989*4882a593Smuzhiyun { "Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux" },
2990*4882a593Smuzhiyun { "Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter" },
2991*4882a593Smuzhiyun
2992*4882a593Smuzhiyun { "Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux" },
2993*4882a593Smuzhiyun { "Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux" },
2994*4882a593Smuzhiyun { "Mono ADC MIXL", NULL, "ADC Mono Left Filter" },
2995*4882a593Smuzhiyun
2996*4882a593Smuzhiyun { "Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux" },
2997*4882a593Smuzhiyun { "Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux" },
2998*4882a593Smuzhiyun { "Mono ADC MIXR", NULL, "ADC Mono Right Filter" },
2999*4882a593Smuzhiyun
3000*4882a593Smuzhiyun { "Stereo1 ADC Volume L", NULL, "Stereo1 ADC MIXL" },
3001*4882a593Smuzhiyun { "Stereo1 ADC Volume R", NULL, "Stereo1 ADC MIXR" },
3002*4882a593Smuzhiyun
3003*4882a593Smuzhiyun { "IF_ADC1", NULL, "Stereo1 ADC Volume L" },
3004*4882a593Smuzhiyun { "IF_ADC1", NULL, "Stereo1 ADC Volume R" },
3005*4882a593Smuzhiyun { "IF_ADC2", NULL, "Mono ADC MIXL" },
3006*4882a593Smuzhiyun { "IF_ADC2", NULL, "Mono ADC MIXR" },
3007*4882a593Smuzhiyun
3008*4882a593Smuzhiyun { "TDM AD1:AD2:DAC", NULL, "IF_ADC1" },
3009*4882a593Smuzhiyun { "TDM AD1:AD2:DAC", NULL, "IF_ADC2" },
3010*4882a593Smuzhiyun { "TDM AD1:AD2:DAC", NULL, "DAC_REF" },
3011*4882a593Smuzhiyun { "TDM AD2:DAC", NULL, "IF_ADC2" },
3012*4882a593Smuzhiyun { "TDM AD2:DAC", NULL, "DAC_REF" },
3013*4882a593Smuzhiyun { "TDM Data Mux", "AD1:AD2:DAC:NUL", "TDM AD1:AD2:DAC" },
3014*4882a593Smuzhiyun { "TDM Data Mux", "AD1:AD2:NUL:DAC", "TDM AD1:AD2:DAC" },
3015*4882a593Smuzhiyun { "TDM Data Mux", "AD1:DAC:AD2:NUL", "TDM AD1:AD2:DAC" },
3016*4882a593Smuzhiyun { "TDM Data Mux", "AD1:DAC:NUL:AD2", "TDM AD1:AD2:DAC" },
3017*4882a593Smuzhiyun { "TDM Data Mux", "AD1:NUL:DAC:AD2", "TDM AD1:AD2:DAC" },
3018*4882a593Smuzhiyun { "TDM Data Mux", "AD1:NUL:AD2:DAC", "TDM AD1:AD2:DAC" },
3019*4882a593Smuzhiyun { "TDM Data Mux", "AD2:AD1:DAC:NUL", "TDM AD1:AD2:DAC" },
3020*4882a593Smuzhiyun { "TDM Data Mux", "AD2:AD1:NUL:DAC", "TDM AD1:AD2:DAC" },
3021*4882a593Smuzhiyun { "TDM Data Mux", "AD2:DAC:AD1:NUL", "TDM AD1:AD2:DAC" },
3022*4882a593Smuzhiyun { "TDM Data Mux", "AD2:DAC:NUL:AD1", "TDM AD1:AD2:DAC" },
3023*4882a593Smuzhiyun { "TDM Data Mux", "AD2:NUL:DAC:AD1", "TDM AD1:AD2:DAC" },
3024*4882a593Smuzhiyun { "TDM Data Mux", "AD1:NUL:AD1:DAC", "TDM AD1:AD2:DAC" },
3025*4882a593Smuzhiyun { "TDM Data Mux", "DAC:AD1:AD2:NUL", "TDM AD1:AD2:DAC" },
3026*4882a593Smuzhiyun { "TDM Data Mux", "DAC:AD1:NUL:AD2", "TDM AD1:AD2:DAC" },
3027*4882a593Smuzhiyun { "TDM Data Mux", "DAC:AD2:AD1:NUL", "TDM AD1:AD2:DAC" },
3028*4882a593Smuzhiyun { "TDM Data Mux", "DAC:AD2:NUL:AD1", "TDM AD1:AD2:DAC" },
3029*4882a593Smuzhiyun { "TDM Data Mux", "DAC:NUL:DAC:AD2", "TDM AD2:DAC" },
3030*4882a593Smuzhiyun { "TDM Data Mux", "DAC:NUL:AD2:DAC", "TDM AD2:DAC" },
3031*4882a593Smuzhiyun { "TDM Data Mux", "NUL:AD1:AD2:DAC", "TDM AD1:AD2:DAC" },
3032*4882a593Smuzhiyun { "TDM Data Mux", "NUL:AD1:DAC:AD2", "TDM AD1:AD2:DAC" },
3033*4882a593Smuzhiyun { "TDM Data Mux", "NUL:AD2:AD1:DAC", "TDM AD1:AD2:DAC" },
3034*4882a593Smuzhiyun { "TDM Data Mux", "NUL:AD2:DAC:AD1", "TDM AD1:AD2:DAC" },
3035*4882a593Smuzhiyun { "TDM Data Mux", "NUL:DAC:DAC:AD2", "TDM AD2:DAC" },
3036*4882a593Smuzhiyun { "TDM Data Mux", "NUL:DAC:AD2:DAC", "TDM AD2:DAC" },
3037*4882a593Smuzhiyun { "IF1 01 ADC Swap Mux", "L/R", "TDM Data Mux" },
3038*4882a593Smuzhiyun { "IF1 01 ADC Swap Mux", "R/L", "TDM Data Mux" },
3039*4882a593Smuzhiyun { "IF1 01 ADC Swap Mux", "L/L", "TDM Data Mux" },
3040*4882a593Smuzhiyun { "IF1 01 ADC Swap Mux", "R/R", "TDM Data Mux" },
3041*4882a593Smuzhiyun { "IF1 23 ADC Swap Mux", "L/R", "TDM Data Mux" },
3042*4882a593Smuzhiyun { "IF1 23 ADC Swap Mux", "R/L", "TDM Data Mux" },
3043*4882a593Smuzhiyun { "IF1 23 ADC Swap Mux", "L/L", "TDM Data Mux" },
3044*4882a593Smuzhiyun { "IF1 23 ADC Swap Mux", "R/R", "TDM Data Mux" },
3045*4882a593Smuzhiyun { "IF1 45 ADC Swap Mux", "L/R", "TDM Data Mux" },
3046*4882a593Smuzhiyun { "IF1 45 ADC Swap Mux", "R/L", "TDM Data Mux" },
3047*4882a593Smuzhiyun { "IF1 45 ADC Swap Mux", "L/L", "TDM Data Mux" },
3048*4882a593Smuzhiyun { "IF1 45 ADC Swap Mux", "R/R", "TDM Data Mux" },
3049*4882a593Smuzhiyun { "IF1 67 ADC Swap Mux", "L/R", "TDM Data Mux" },
3050*4882a593Smuzhiyun { "IF1 67 ADC Swap Mux", "R/L", "TDM Data Mux" },
3051*4882a593Smuzhiyun { "IF1 67 ADC Swap Mux", "L/L", "TDM Data Mux" },
3052*4882a593Smuzhiyun { "IF1 67 ADC Swap Mux", "R/R", "TDM Data Mux" },
3053*4882a593Smuzhiyun { "IF1 ADC", NULL, "IF1 01 ADC Swap Mux" },
3054*4882a593Smuzhiyun { "IF1 ADC", NULL, "IF1 23 ADC Swap Mux" },
3055*4882a593Smuzhiyun { "IF1 ADC", NULL, "IF1 45 ADC Swap Mux" },
3056*4882a593Smuzhiyun { "IF1 ADC", NULL, "IF1 67 ADC Swap Mux" },
3057*4882a593Smuzhiyun { "IF1 ADC", NULL, "I2S1" },
3058*4882a593Smuzhiyun
3059*4882a593Smuzhiyun { "IF2 ADC Mux", "IF_ADC1", "IF_ADC1" },
3060*4882a593Smuzhiyun { "IF2 ADC Mux", "IF_ADC2", "IF_ADC2" },
3061*4882a593Smuzhiyun { "IF2 ADC Mux", "IF_ADC3", "IF_ADC3" },
3062*4882a593Smuzhiyun { "IF2 ADC Mux", "DAC_REF", "DAC_REF" },
3063*4882a593Smuzhiyun { "IF2 ADC", NULL, "IF2 ADC Mux"},
3064*4882a593Smuzhiyun { "IF2 ADC", NULL, "I2S2" },
3065*4882a593Smuzhiyun
3066*4882a593Smuzhiyun { "IF3 ADC Mux", "IF_ADC1", "IF_ADC1" },
3067*4882a593Smuzhiyun { "IF3 ADC Mux", "IF_ADC2", "IF_ADC2" },
3068*4882a593Smuzhiyun { "IF3 ADC Mux", "Stereo2_ADC_L/R", "Stereo2 ADC LR" },
3069*4882a593Smuzhiyun { "IF3 ADC Mux", "DAC_REF", "DAC_REF" },
3070*4882a593Smuzhiyun { "IF3 ADC", NULL, "IF3 ADC Mux"},
3071*4882a593Smuzhiyun { "IF3 ADC", NULL, "I2S3" },
3072*4882a593Smuzhiyun
3073*4882a593Smuzhiyun { "AIF1TX", NULL, "IF1 ADC" },
3074*4882a593Smuzhiyun { "IF2 ADC Swap Mux", "L/R", "IF2 ADC" },
3075*4882a593Smuzhiyun { "IF2 ADC Swap Mux", "R/L", "IF2 ADC" },
3076*4882a593Smuzhiyun { "IF2 ADC Swap Mux", "L/L", "IF2 ADC" },
3077*4882a593Smuzhiyun { "IF2 ADC Swap Mux", "R/R", "IF2 ADC" },
3078*4882a593Smuzhiyun { "AIF2TX", NULL, "IF2 ADC Swap Mux" },
3079*4882a593Smuzhiyun { "IF3 ADC Swap Mux", "L/R", "IF3 ADC" },
3080*4882a593Smuzhiyun { "IF3 ADC Swap Mux", "R/L", "IF3 ADC" },
3081*4882a593Smuzhiyun { "IF3 ADC Swap Mux", "L/L", "IF3 ADC" },
3082*4882a593Smuzhiyun { "IF3 ADC Swap Mux", "R/R", "IF3 ADC" },
3083*4882a593Smuzhiyun { "AIF3TX", NULL, "IF3 ADC Swap Mux" },
3084*4882a593Smuzhiyun
3085*4882a593Smuzhiyun { "IF1 DAC1", NULL, "AIF1RX" },
3086*4882a593Smuzhiyun { "IF1 DAC2", NULL, "AIF1RX" },
3087*4882a593Smuzhiyun { "IF2 DAC Swap Mux", "L/R", "AIF2RX" },
3088*4882a593Smuzhiyun { "IF2 DAC Swap Mux", "R/L", "AIF2RX" },
3089*4882a593Smuzhiyun { "IF2 DAC Swap Mux", "L/L", "AIF2RX" },
3090*4882a593Smuzhiyun { "IF2 DAC Swap Mux", "R/R", "AIF2RX" },
3091*4882a593Smuzhiyun { "IF2 DAC", NULL, "IF2 DAC Swap Mux" },
3092*4882a593Smuzhiyun { "IF3 DAC Swap Mux", "L/R", "AIF3RX" },
3093*4882a593Smuzhiyun { "IF3 DAC Swap Mux", "R/L", "AIF3RX" },
3094*4882a593Smuzhiyun { "IF3 DAC Swap Mux", "L/L", "AIF3RX" },
3095*4882a593Smuzhiyun { "IF3 DAC Swap Mux", "R/R", "AIF3RX" },
3096*4882a593Smuzhiyun { "IF3 DAC", NULL, "IF3 DAC Swap Mux" },
3097*4882a593Smuzhiyun
3098*4882a593Smuzhiyun { "IF1 DAC1", NULL, "I2S1" },
3099*4882a593Smuzhiyun { "IF1 DAC2", NULL, "I2S1" },
3100*4882a593Smuzhiyun { "IF2 DAC", NULL, "I2S2" },
3101*4882a593Smuzhiyun { "IF3 DAC", NULL, "I2S3" },
3102*4882a593Smuzhiyun
3103*4882a593Smuzhiyun { "IF1 DAC2 L", NULL, "IF1 DAC2" },
3104*4882a593Smuzhiyun { "IF1 DAC2 R", NULL, "IF1 DAC2" },
3105*4882a593Smuzhiyun { "IF1 DAC1 L", NULL, "IF1 DAC1" },
3106*4882a593Smuzhiyun { "IF1 DAC1 R", NULL, "IF1 DAC1" },
3107*4882a593Smuzhiyun { "IF2 DAC L", NULL, "IF2 DAC" },
3108*4882a593Smuzhiyun { "IF2 DAC R", NULL, "IF2 DAC" },
3109*4882a593Smuzhiyun { "IF3 DAC L", NULL, "IF3 DAC" },
3110*4882a593Smuzhiyun { "IF3 DAC R", NULL, "IF3 DAC" },
3111*4882a593Smuzhiyun
3112*4882a593Smuzhiyun { "DAC L1 Mux", "IF1 DAC1", "IF1 DAC1 L" },
3113*4882a593Smuzhiyun { "DAC L1 Mux", "IF2 DAC", "IF2 DAC L" },
3114*4882a593Smuzhiyun { "DAC L1 Mux", "IF3 DAC", "IF3 DAC L" },
3115*4882a593Smuzhiyun { "DAC L1 Mux", NULL, "DAC Stereo1 Filter" },
3116*4882a593Smuzhiyun
3117*4882a593Smuzhiyun { "DAC R1 Mux", "IF1 DAC1", "IF1 DAC1 R" },
3118*4882a593Smuzhiyun { "DAC R1 Mux", "IF2 DAC", "IF2 DAC R" },
3119*4882a593Smuzhiyun { "DAC R1 Mux", "IF3 DAC", "IF3 DAC R" },
3120*4882a593Smuzhiyun { "DAC R1 Mux", NULL, "DAC Stereo1 Filter" },
3121*4882a593Smuzhiyun
3122*4882a593Smuzhiyun { "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC Volume L" },
3123*4882a593Smuzhiyun { "DAC1 MIXL", "DAC1 Switch", "DAC L1 Mux" },
3124*4882a593Smuzhiyun { "DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC Volume R" },
3125*4882a593Smuzhiyun { "DAC1 MIXR", "DAC1 Switch", "DAC R1 Mux" },
3126*4882a593Smuzhiyun
3127*4882a593Smuzhiyun { "DAC_REF", NULL, "DAC1 MIXL" },
3128*4882a593Smuzhiyun { "DAC_REF", NULL, "DAC1 MIXR" },
3129*4882a593Smuzhiyun
3130*4882a593Smuzhiyun { "DAC L2 Mux", "IF1 DAC2", "IF1 DAC2 L" },
3131*4882a593Smuzhiyun { "DAC L2 Mux", "IF2 DAC", "IF2 DAC L" },
3132*4882a593Smuzhiyun { "DAC L2 Mux", "IF3 DAC", "IF3 DAC L" },
3133*4882a593Smuzhiyun { "DAC L2 Mux", "Mono ADC MIX", "Mono ADC MIXL" },
3134*4882a593Smuzhiyun { "DAC L2 Mux", NULL, "DAC Mono Left Filter" },
3135*4882a593Smuzhiyun
3136*4882a593Smuzhiyun { "DAC R2 Mux", "IF1 DAC2", "IF1 DAC2 R" },
3137*4882a593Smuzhiyun { "DAC R2 Mux", "IF2 DAC", "IF2 DAC R" },
3138*4882a593Smuzhiyun { "DAC R2 Mux", "IF3 DAC", "IF3 DAC R" },
3139*4882a593Smuzhiyun { "DAC R2 Mux", "Mono ADC MIX", "Mono ADC MIXR" },
3140*4882a593Smuzhiyun { "DAC R2 Mux", NULL, "DAC Mono Right Filter" },
3141*4882a593Smuzhiyun
3142*4882a593Smuzhiyun { "Stereo DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
3143*4882a593Smuzhiyun { "Stereo DAC MIXL", "DAC R1 Switch", "DAC1 MIXR" },
3144*4882a593Smuzhiyun { "Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Mux" },
3145*4882a593Smuzhiyun { "Stereo DAC MIXL", "DAC R2 Switch", "DAC R2 Mux" },
3146*4882a593Smuzhiyun
3147*4882a593Smuzhiyun { "Stereo DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
3148*4882a593Smuzhiyun { "Stereo DAC MIXR", "DAC L1 Switch", "DAC1 MIXL" },
3149*4882a593Smuzhiyun { "Stereo DAC MIXR", "DAC L2 Switch", "DAC L2 Mux" },
3150*4882a593Smuzhiyun { "Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Mux" },
3151*4882a593Smuzhiyun
3152*4882a593Smuzhiyun { "Mono DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
3153*4882a593Smuzhiyun { "Mono DAC MIXL", "DAC R1 Switch", "DAC1 MIXR" },
3154*4882a593Smuzhiyun { "Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Mux" },
3155*4882a593Smuzhiyun { "Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Mux" },
3156*4882a593Smuzhiyun { "Mono DAC MIXR", "DAC L1 Switch", "DAC1 MIXL" },
3157*4882a593Smuzhiyun { "Mono DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
3158*4882a593Smuzhiyun { "Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Mux" },
3159*4882a593Smuzhiyun { "Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Mux" },
3160*4882a593Smuzhiyun
3161*4882a593Smuzhiyun { "DAC MIXL", "Stereo DAC Mixer", "Stereo DAC MIXL" },
3162*4882a593Smuzhiyun { "DAC MIXL", "Mono DAC Mixer", "Mono DAC MIXL" },
3163*4882a593Smuzhiyun { "DAC MIXR", "Stereo DAC Mixer", "Stereo DAC MIXR" },
3164*4882a593Smuzhiyun { "DAC MIXR", "Mono DAC Mixer", "Mono DAC MIXR" },
3165*4882a593Smuzhiyun
3166*4882a593Smuzhiyun { "DAC L1 Source", NULL, "DAC L1 Power" },
3167*4882a593Smuzhiyun { "DAC L1 Source", "DAC", "DAC1 MIXL" },
3168*4882a593Smuzhiyun { "DAC L1 Source", "Stereo DAC Mixer", "Stereo DAC MIXL" },
3169*4882a593Smuzhiyun { "DAC R1 Source", NULL, "DAC R1 Power" },
3170*4882a593Smuzhiyun { "DAC R1 Source", "DAC", "DAC1 MIXR" },
3171*4882a593Smuzhiyun { "DAC R1 Source", "Stereo DAC Mixer", "Stereo DAC MIXR" },
3172*4882a593Smuzhiyun { "DAC L2 Source", "Stereo DAC Mixer", "Stereo DAC MIXL" },
3173*4882a593Smuzhiyun { "DAC L2 Source", "Mono DAC Mixer", "Mono DAC MIXL" },
3174*4882a593Smuzhiyun { "DAC L2 Source", NULL, "DAC L2 Power" },
3175*4882a593Smuzhiyun { "DAC R2 Source", "Stereo DAC Mixer", "Stereo DAC MIXR" },
3176*4882a593Smuzhiyun { "DAC R2 Source", "Mono DAC Mixer", "Mono DAC MIXR" },
3177*4882a593Smuzhiyun { "DAC R2 Source", NULL, "DAC R2 Power" },
3178*4882a593Smuzhiyun
3179*4882a593Smuzhiyun { "DAC L1", NULL, "DAC L1 Source" },
3180*4882a593Smuzhiyun { "DAC R1", NULL, "DAC R1 Source" },
3181*4882a593Smuzhiyun { "DAC L2", NULL, "DAC L2 Source" },
3182*4882a593Smuzhiyun { "DAC R2", NULL, "DAC R2 Source" },
3183*4882a593Smuzhiyun
3184*4882a593Smuzhiyun { "SPK MIXL", "DAC L2 Switch", "DAC L2" },
3185*4882a593Smuzhiyun { "SPK MIXL", "BST1 Switch", "BST1" },
3186*4882a593Smuzhiyun { "SPK MIXL", "INL Switch", "INL VOL" },
3187*4882a593Smuzhiyun { "SPK MIXL", "INR Switch", "INR VOL" },
3188*4882a593Smuzhiyun { "SPK MIXL", "BST3 Switch", "BST3" },
3189*4882a593Smuzhiyun { "SPK MIXR", "DAC R2 Switch", "DAC R2" },
3190*4882a593Smuzhiyun { "SPK MIXR", "BST4 Switch", "BST4" },
3191*4882a593Smuzhiyun { "SPK MIXR", "INL Switch", "INL VOL" },
3192*4882a593Smuzhiyun { "SPK MIXR", "INR Switch", "INR VOL" },
3193*4882a593Smuzhiyun { "SPK MIXR", "BST3 Switch", "BST3" },
3194*4882a593Smuzhiyun
3195*4882a593Smuzhiyun { "MONOVOL MIX", "DAC L2 Switch", "DAC L2" },
3196*4882a593Smuzhiyun { "MONOVOL MIX", "DAC R2 Switch", "DAC R2" },
3197*4882a593Smuzhiyun { "MONOVOL MIX", "BST1 Switch", "BST1" },
3198*4882a593Smuzhiyun { "MONOVOL MIX", "BST2 Switch", "BST2" },
3199*4882a593Smuzhiyun { "MONOVOL MIX", "BST3 Switch", "BST3" },
3200*4882a593Smuzhiyun
3201*4882a593Smuzhiyun { "OUT MIXL", "DAC L2 Switch", "DAC L2" },
3202*4882a593Smuzhiyun { "OUT MIXL", "INL Switch", "INL VOL" },
3203*4882a593Smuzhiyun { "OUT MIXL", "BST1 Switch", "BST1" },
3204*4882a593Smuzhiyun { "OUT MIXL", "BST2 Switch", "BST2" },
3205*4882a593Smuzhiyun { "OUT MIXL", "BST3 Switch", "BST3" },
3206*4882a593Smuzhiyun { "OUT MIXR", "DAC R2 Switch", "DAC R2" },
3207*4882a593Smuzhiyun { "OUT MIXR", "INR Switch", "INR VOL" },
3208*4882a593Smuzhiyun { "OUT MIXR", "BST2 Switch", "BST2" },
3209*4882a593Smuzhiyun { "OUT MIXR", "BST3 Switch", "BST3" },
3210*4882a593Smuzhiyun { "OUT MIXR", "BST4 Switch", "BST4" },
3211*4882a593Smuzhiyun
3212*4882a593Smuzhiyun { "SPKVOL L", "Switch", "SPK MIXL" },
3213*4882a593Smuzhiyun { "SPKVOL R", "Switch", "SPK MIXR" },
3214*4882a593Smuzhiyun { "SPO L MIX", "DAC L2 Switch", "DAC L2" },
3215*4882a593Smuzhiyun { "SPO L MIX", "SPKVOL L Switch", "SPKVOL L" },
3216*4882a593Smuzhiyun { "SPO R MIX", "DAC R2 Switch", "DAC R2" },
3217*4882a593Smuzhiyun { "SPO R MIX", "SPKVOL R Switch", "SPKVOL R" },
3218*4882a593Smuzhiyun { "SPK Amp", NULL, "SPO L MIX" },
3219*4882a593Smuzhiyun { "SPK Amp", NULL, "SPO R MIX" },
3220*4882a593Smuzhiyun { "SPK Amp", NULL, "SYS CLK DET" },
3221*4882a593Smuzhiyun { "SPO Playback", "Switch", "SPK Amp" },
3222*4882a593Smuzhiyun { "SPOL", NULL, "SPO Playback" },
3223*4882a593Smuzhiyun { "SPOR", NULL, "SPO Playback" },
3224*4882a593Smuzhiyun
3225*4882a593Smuzhiyun { "MONOVOL", "Switch", "MONOVOL MIX" },
3226*4882a593Smuzhiyun { "Mono MIX", "DAC L2 Switch", "DAC L2" },
3227*4882a593Smuzhiyun { "Mono MIX", "MONOVOL Switch", "MONOVOL" },
3228*4882a593Smuzhiyun { "Mono Amp", NULL, "Mono MIX" },
3229*4882a593Smuzhiyun { "Mono Amp", NULL, "Mono Vref" },
3230*4882a593Smuzhiyun { "Mono Amp", NULL, "SYS CLK DET" },
3231*4882a593Smuzhiyun { "Mono Playback", "Switch", "Mono Amp" },
3232*4882a593Smuzhiyun { "MONOOUT", NULL, "Mono Playback" },
3233*4882a593Smuzhiyun
3234*4882a593Smuzhiyun { "HP Amp", NULL, "DAC L1" },
3235*4882a593Smuzhiyun { "HP Amp", NULL, "DAC R1" },
3236*4882a593Smuzhiyun { "HP Amp", NULL, "Charge Pump" },
3237*4882a593Smuzhiyun { "HP Amp", NULL, "SYS CLK DET" },
3238*4882a593Smuzhiyun { "HPO L Playback", "Switch", "HP Amp"},
3239*4882a593Smuzhiyun { "HPO R Playback", "Switch", "HP Amp"},
3240*4882a593Smuzhiyun { "HPOL", NULL, "HPO L Playback" },
3241*4882a593Smuzhiyun { "HPOR", NULL, "HPO R Playback" },
3242*4882a593Smuzhiyun
3243*4882a593Smuzhiyun { "OUTVOL L", "Switch", "OUT MIXL" },
3244*4882a593Smuzhiyun { "OUTVOL R", "Switch", "OUT MIXR" },
3245*4882a593Smuzhiyun { "LOUT L MIX", "DAC L2 Switch", "DAC L2" },
3246*4882a593Smuzhiyun { "LOUT L MIX", "OUTVOL L Switch", "OUTVOL L" },
3247*4882a593Smuzhiyun { "LOUT R MIX", "DAC R2 Switch", "DAC R2" },
3248*4882a593Smuzhiyun { "LOUT R MIX", "OUTVOL R Switch", "OUTVOL R" },
3249*4882a593Smuzhiyun { "LOUT Amp", NULL, "LOUT L MIX" },
3250*4882a593Smuzhiyun { "LOUT Amp", NULL, "LOUT R MIX" },
3251*4882a593Smuzhiyun { "LOUT Amp", NULL, "Charge Pump" },
3252*4882a593Smuzhiyun { "LOUT Amp", NULL, "SYS CLK DET" },
3253*4882a593Smuzhiyun { "LOUT L Playback", "Switch", "LOUT Amp" },
3254*4882a593Smuzhiyun { "LOUT R Playback", "Switch", "LOUT Amp" },
3255*4882a593Smuzhiyun { "LOUTL", NULL, "LOUT L Playback" },
3256*4882a593Smuzhiyun { "LOUTR", NULL, "LOUT R Playback" },
3257*4882a593Smuzhiyun
3258*4882a593Smuzhiyun { "PDM L Mux", "Mono DAC", "Mono DAC MIXL" },
3259*4882a593Smuzhiyun { "PDM L Mux", "Stereo DAC", "Stereo DAC MIXL" },
3260*4882a593Smuzhiyun { "PDM L Mux", NULL, "PDM Power" },
3261*4882a593Smuzhiyun { "PDM R Mux", "Mono DAC", "Mono DAC MIXR" },
3262*4882a593Smuzhiyun { "PDM R Mux", "Stereo DAC", "Stereo DAC MIXR" },
3263*4882a593Smuzhiyun { "PDM R Mux", NULL, "PDM Power" },
3264*4882a593Smuzhiyun { "PDM L Playback", "Switch", "PDM L Mux" },
3265*4882a593Smuzhiyun { "PDM R Playback", "Switch", "PDM R Mux" },
3266*4882a593Smuzhiyun { "PDML", NULL, "PDM L Playback" },
3267*4882a593Smuzhiyun { "PDMR", NULL, "PDM R Playback" },
3268*4882a593Smuzhiyun
3269*4882a593Smuzhiyun { "SPDIF Mux", "IF3_DAC", "IF3 DAC" },
3270*4882a593Smuzhiyun { "SPDIF Mux", "IF2_DAC", "IF2 DAC" },
3271*4882a593Smuzhiyun { "SPDIF Mux", "IF1_DAC2", "IF1 DAC2" },
3272*4882a593Smuzhiyun { "SPDIF Mux", "IF1_DAC1", "IF1 DAC1" },
3273*4882a593Smuzhiyun { "SPDIF", NULL, "SPDIF Mux" },
3274*4882a593Smuzhiyun };
3275*4882a593Smuzhiyun
rt5659_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)3276*4882a593Smuzhiyun static int rt5659_hw_params(struct snd_pcm_substream *substream,
3277*4882a593Smuzhiyun struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
3278*4882a593Smuzhiyun {
3279*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
3280*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3281*4882a593Smuzhiyun unsigned int val_len = 0, val_clk, mask_clk;
3282*4882a593Smuzhiyun int pre_div, frame_size;
3283*4882a593Smuzhiyun
3284*4882a593Smuzhiyun rt5659->lrck[dai->id] = params_rate(params);
3285*4882a593Smuzhiyun pre_div = rl6231_get_clk_info(rt5659->sysclk, rt5659->lrck[dai->id]);
3286*4882a593Smuzhiyun if (pre_div < 0) {
3287*4882a593Smuzhiyun dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n",
3288*4882a593Smuzhiyun rt5659->lrck[dai->id], dai->id);
3289*4882a593Smuzhiyun return -EINVAL;
3290*4882a593Smuzhiyun }
3291*4882a593Smuzhiyun frame_size = snd_soc_params_to_frame_size(params);
3292*4882a593Smuzhiyun if (frame_size < 0) {
3293*4882a593Smuzhiyun dev_err(component->dev, "Unsupported frame size: %d\n", frame_size);
3294*4882a593Smuzhiyun return -EINVAL;
3295*4882a593Smuzhiyun }
3296*4882a593Smuzhiyun
3297*4882a593Smuzhiyun dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n",
3298*4882a593Smuzhiyun rt5659->lrck[dai->id], pre_div, dai->id);
3299*4882a593Smuzhiyun
3300*4882a593Smuzhiyun switch (params_width(params)) {
3301*4882a593Smuzhiyun case 16:
3302*4882a593Smuzhiyun break;
3303*4882a593Smuzhiyun case 20:
3304*4882a593Smuzhiyun val_len |= RT5659_I2S_DL_20;
3305*4882a593Smuzhiyun break;
3306*4882a593Smuzhiyun case 24:
3307*4882a593Smuzhiyun val_len |= RT5659_I2S_DL_24;
3308*4882a593Smuzhiyun break;
3309*4882a593Smuzhiyun case 8:
3310*4882a593Smuzhiyun val_len |= RT5659_I2S_DL_8;
3311*4882a593Smuzhiyun break;
3312*4882a593Smuzhiyun default:
3313*4882a593Smuzhiyun return -EINVAL;
3314*4882a593Smuzhiyun }
3315*4882a593Smuzhiyun
3316*4882a593Smuzhiyun switch (dai->id) {
3317*4882a593Smuzhiyun case RT5659_AIF1:
3318*4882a593Smuzhiyun mask_clk = RT5659_I2S_PD1_MASK;
3319*4882a593Smuzhiyun val_clk = pre_div << RT5659_I2S_PD1_SFT;
3320*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_I2S1_SDP,
3321*4882a593Smuzhiyun RT5659_I2S_DL_MASK, val_len);
3322*4882a593Smuzhiyun break;
3323*4882a593Smuzhiyun case RT5659_AIF2:
3324*4882a593Smuzhiyun mask_clk = RT5659_I2S_PD2_MASK;
3325*4882a593Smuzhiyun val_clk = pre_div << RT5659_I2S_PD2_SFT;
3326*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_I2S2_SDP,
3327*4882a593Smuzhiyun RT5659_I2S_DL_MASK, val_len);
3328*4882a593Smuzhiyun break;
3329*4882a593Smuzhiyun case RT5659_AIF3:
3330*4882a593Smuzhiyun mask_clk = RT5659_I2S_PD3_MASK;
3331*4882a593Smuzhiyun val_clk = pre_div << RT5659_I2S_PD3_SFT;
3332*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_I2S3_SDP,
3333*4882a593Smuzhiyun RT5659_I2S_DL_MASK, val_len);
3334*4882a593Smuzhiyun break;
3335*4882a593Smuzhiyun default:
3336*4882a593Smuzhiyun dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
3337*4882a593Smuzhiyun return -EINVAL;
3338*4882a593Smuzhiyun }
3339*4882a593Smuzhiyun
3340*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1, mask_clk, val_clk);
3341*4882a593Smuzhiyun
3342*4882a593Smuzhiyun switch (rt5659->lrck[dai->id]) {
3343*4882a593Smuzhiyun case 192000:
3344*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1,
3345*4882a593Smuzhiyun RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_32);
3346*4882a593Smuzhiyun break;
3347*4882a593Smuzhiyun case 96000:
3348*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1,
3349*4882a593Smuzhiyun RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_64);
3350*4882a593Smuzhiyun break;
3351*4882a593Smuzhiyun default:
3352*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1,
3353*4882a593Smuzhiyun RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_128);
3354*4882a593Smuzhiyun break;
3355*4882a593Smuzhiyun }
3356*4882a593Smuzhiyun
3357*4882a593Smuzhiyun return 0;
3358*4882a593Smuzhiyun }
3359*4882a593Smuzhiyun
rt5659_set_dai_fmt(struct snd_soc_dai * dai,unsigned int fmt)3360*4882a593Smuzhiyun static int rt5659_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
3361*4882a593Smuzhiyun {
3362*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
3363*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3364*4882a593Smuzhiyun unsigned int reg_val = 0;
3365*4882a593Smuzhiyun
3366*4882a593Smuzhiyun switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
3367*4882a593Smuzhiyun case SND_SOC_DAIFMT_CBM_CFM:
3368*4882a593Smuzhiyun rt5659->master[dai->id] = 1;
3369*4882a593Smuzhiyun break;
3370*4882a593Smuzhiyun case SND_SOC_DAIFMT_CBS_CFS:
3371*4882a593Smuzhiyun reg_val |= RT5659_I2S_MS_S;
3372*4882a593Smuzhiyun rt5659->master[dai->id] = 0;
3373*4882a593Smuzhiyun break;
3374*4882a593Smuzhiyun default:
3375*4882a593Smuzhiyun return -EINVAL;
3376*4882a593Smuzhiyun }
3377*4882a593Smuzhiyun
3378*4882a593Smuzhiyun switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
3379*4882a593Smuzhiyun case SND_SOC_DAIFMT_NB_NF:
3380*4882a593Smuzhiyun break;
3381*4882a593Smuzhiyun case SND_SOC_DAIFMT_IB_NF:
3382*4882a593Smuzhiyun reg_val |= RT5659_I2S_BP_INV;
3383*4882a593Smuzhiyun break;
3384*4882a593Smuzhiyun default:
3385*4882a593Smuzhiyun return -EINVAL;
3386*4882a593Smuzhiyun }
3387*4882a593Smuzhiyun
3388*4882a593Smuzhiyun switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
3389*4882a593Smuzhiyun case SND_SOC_DAIFMT_I2S:
3390*4882a593Smuzhiyun break;
3391*4882a593Smuzhiyun case SND_SOC_DAIFMT_LEFT_J:
3392*4882a593Smuzhiyun reg_val |= RT5659_I2S_DF_LEFT;
3393*4882a593Smuzhiyun break;
3394*4882a593Smuzhiyun case SND_SOC_DAIFMT_DSP_A:
3395*4882a593Smuzhiyun reg_val |= RT5659_I2S_DF_PCM_A;
3396*4882a593Smuzhiyun break;
3397*4882a593Smuzhiyun case SND_SOC_DAIFMT_DSP_B:
3398*4882a593Smuzhiyun reg_val |= RT5659_I2S_DF_PCM_B;
3399*4882a593Smuzhiyun break;
3400*4882a593Smuzhiyun default:
3401*4882a593Smuzhiyun return -EINVAL;
3402*4882a593Smuzhiyun }
3403*4882a593Smuzhiyun
3404*4882a593Smuzhiyun switch (dai->id) {
3405*4882a593Smuzhiyun case RT5659_AIF1:
3406*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_I2S1_SDP,
3407*4882a593Smuzhiyun RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK |
3408*4882a593Smuzhiyun RT5659_I2S_DF_MASK, reg_val);
3409*4882a593Smuzhiyun break;
3410*4882a593Smuzhiyun case RT5659_AIF2:
3411*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_I2S2_SDP,
3412*4882a593Smuzhiyun RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK |
3413*4882a593Smuzhiyun RT5659_I2S_DF_MASK, reg_val);
3414*4882a593Smuzhiyun break;
3415*4882a593Smuzhiyun case RT5659_AIF3:
3416*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_I2S3_SDP,
3417*4882a593Smuzhiyun RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK |
3418*4882a593Smuzhiyun RT5659_I2S_DF_MASK, reg_val);
3419*4882a593Smuzhiyun break;
3420*4882a593Smuzhiyun default:
3421*4882a593Smuzhiyun dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
3422*4882a593Smuzhiyun return -EINVAL;
3423*4882a593Smuzhiyun }
3424*4882a593Smuzhiyun return 0;
3425*4882a593Smuzhiyun }
3426*4882a593Smuzhiyun
rt5659_set_component_sysclk(struct snd_soc_component * component,int clk_id,int source,unsigned int freq,int dir)3427*4882a593Smuzhiyun static int rt5659_set_component_sysclk(struct snd_soc_component *component, int clk_id,
3428*4882a593Smuzhiyun int source, unsigned int freq, int dir)
3429*4882a593Smuzhiyun {
3430*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3431*4882a593Smuzhiyun unsigned int reg_val = 0;
3432*4882a593Smuzhiyun int ret;
3433*4882a593Smuzhiyun
3434*4882a593Smuzhiyun if (freq == rt5659->sysclk && clk_id == rt5659->sysclk_src)
3435*4882a593Smuzhiyun return 0;
3436*4882a593Smuzhiyun
3437*4882a593Smuzhiyun switch (clk_id) {
3438*4882a593Smuzhiyun case RT5659_SCLK_S_MCLK:
3439*4882a593Smuzhiyun ret = clk_set_rate(rt5659->mclk, freq);
3440*4882a593Smuzhiyun if (ret)
3441*4882a593Smuzhiyun return ret;
3442*4882a593Smuzhiyun
3443*4882a593Smuzhiyun reg_val |= RT5659_SCLK_SRC_MCLK;
3444*4882a593Smuzhiyun break;
3445*4882a593Smuzhiyun case RT5659_SCLK_S_PLL1:
3446*4882a593Smuzhiyun reg_val |= RT5659_SCLK_SRC_PLL1;
3447*4882a593Smuzhiyun break;
3448*4882a593Smuzhiyun case RT5659_SCLK_S_RCCLK:
3449*4882a593Smuzhiyun reg_val |= RT5659_SCLK_SRC_RCCLK;
3450*4882a593Smuzhiyun break;
3451*4882a593Smuzhiyun default:
3452*4882a593Smuzhiyun dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
3453*4882a593Smuzhiyun return -EINVAL;
3454*4882a593Smuzhiyun }
3455*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_GLB_CLK,
3456*4882a593Smuzhiyun RT5659_SCLK_SRC_MASK, reg_val);
3457*4882a593Smuzhiyun rt5659->sysclk = freq;
3458*4882a593Smuzhiyun rt5659->sysclk_src = clk_id;
3459*4882a593Smuzhiyun
3460*4882a593Smuzhiyun dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n",
3461*4882a593Smuzhiyun freq, clk_id);
3462*4882a593Smuzhiyun
3463*4882a593Smuzhiyun return 0;
3464*4882a593Smuzhiyun }
3465*4882a593Smuzhiyun
rt5659_set_component_pll(struct snd_soc_component * component,int pll_id,int source,unsigned int freq_in,unsigned int freq_out)3466*4882a593Smuzhiyun static int rt5659_set_component_pll(struct snd_soc_component *component, int pll_id,
3467*4882a593Smuzhiyun int source, unsigned int freq_in,
3468*4882a593Smuzhiyun unsigned int freq_out)
3469*4882a593Smuzhiyun {
3470*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3471*4882a593Smuzhiyun struct rl6231_pll_code pll_code;
3472*4882a593Smuzhiyun int ret;
3473*4882a593Smuzhiyun
3474*4882a593Smuzhiyun if (source == rt5659->pll_src && freq_in == rt5659->pll_in &&
3475*4882a593Smuzhiyun freq_out == rt5659->pll_out)
3476*4882a593Smuzhiyun return 0;
3477*4882a593Smuzhiyun
3478*4882a593Smuzhiyun if (!freq_in || !freq_out) {
3479*4882a593Smuzhiyun dev_dbg(component->dev, "PLL disabled\n");
3480*4882a593Smuzhiyun
3481*4882a593Smuzhiyun rt5659->pll_in = 0;
3482*4882a593Smuzhiyun rt5659->pll_out = 0;
3483*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_GLB_CLK,
3484*4882a593Smuzhiyun RT5659_SCLK_SRC_MASK, RT5659_SCLK_SRC_MCLK);
3485*4882a593Smuzhiyun return 0;
3486*4882a593Smuzhiyun }
3487*4882a593Smuzhiyun
3488*4882a593Smuzhiyun switch (source) {
3489*4882a593Smuzhiyun case RT5659_PLL1_S_MCLK:
3490*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_GLB_CLK,
3491*4882a593Smuzhiyun RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_MCLK);
3492*4882a593Smuzhiyun break;
3493*4882a593Smuzhiyun case RT5659_PLL1_S_BCLK1:
3494*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_GLB_CLK,
3495*4882a593Smuzhiyun RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK1);
3496*4882a593Smuzhiyun break;
3497*4882a593Smuzhiyun case RT5659_PLL1_S_BCLK2:
3498*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_GLB_CLK,
3499*4882a593Smuzhiyun RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK2);
3500*4882a593Smuzhiyun break;
3501*4882a593Smuzhiyun case RT5659_PLL1_S_BCLK3:
3502*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_GLB_CLK,
3503*4882a593Smuzhiyun RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK3);
3504*4882a593Smuzhiyun break;
3505*4882a593Smuzhiyun default:
3506*4882a593Smuzhiyun dev_err(component->dev, "Unknown PLL source %d\n", source);
3507*4882a593Smuzhiyun return -EINVAL;
3508*4882a593Smuzhiyun }
3509*4882a593Smuzhiyun
3510*4882a593Smuzhiyun ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
3511*4882a593Smuzhiyun if (ret < 0) {
3512*4882a593Smuzhiyun dev_err(component->dev, "Unsupport input clock %d\n", freq_in);
3513*4882a593Smuzhiyun return ret;
3514*4882a593Smuzhiyun }
3515*4882a593Smuzhiyun
3516*4882a593Smuzhiyun dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n",
3517*4882a593Smuzhiyun pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
3518*4882a593Smuzhiyun pll_code.n_code, pll_code.k_code);
3519*4882a593Smuzhiyun
3520*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_PLL_CTRL_1,
3521*4882a593Smuzhiyun pll_code.n_code << RT5659_PLL_N_SFT | pll_code.k_code);
3522*4882a593Smuzhiyun snd_soc_component_write(component, RT5659_PLL_CTRL_2,
3523*4882a593Smuzhiyun (pll_code.m_bp ? 0 : pll_code.m_code) << RT5659_PLL_M_SFT |
3524*4882a593Smuzhiyun pll_code.m_bp << RT5659_PLL_M_BP_SFT);
3525*4882a593Smuzhiyun
3526*4882a593Smuzhiyun rt5659->pll_in = freq_in;
3527*4882a593Smuzhiyun rt5659->pll_out = freq_out;
3528*4882a593Smuzhiyun rt5659->pll_src = source;
3529*4882a593Smuzhiyun
3530*4882a593Smuzhiyun return 0;
3531*4882a593Smuzhiyun }
3532*4882a593Smuzhiyun
rt5659_set_tdm_slot(struct snd_soc_dai * dai,unsigned int tx_mask,unsigned int rx_mask,int slots,int slot_width)3533*4882a593Smuzhiyun static int rt5659_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
3534*4882a593Smuzhiyun unsigned int rx_mask, int slots, int slot_width)
3535*4882a593Smuzhiyun {
3536*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
3537*4882a593Smuzhiyun unsigned int val = 0;
3538*4882a593Smuzhiyun
3539*4882a593Smuzhiyun if (rx_mask || tx_mask)
3540*4882a593Smuzhiyun val |= (1 << 15);
3541*4882a593Smuzhiyun
3542*4882a593Smuzhiyun switch (slots) {
3543*4882a593Smuzhiyun case 4:
3544*4882a593Smuzhiyun val |= (1 << 10);
3545*4882a593Smuzhiyun val |= (1 << 8);
3546*4882a593Smuzhiyun break;
3547*4882a593Smuzhiyun case 6:
3548*4882a593Smuzhiyun val |= (2 << 10);
3549*4882a593Smuzhiyun val |= (2 << 8);
3550*4882a593Smuzhiyun break;
3551*4882a593Smuzhiyun case 8:
3552*4882a593Smuzhiyun val |= (3 << 10);
3553*4882a593Smuzhiyun val |= (3 << 8);
3554*4882a593Smuzhiyun break;
3555*4882a593Smuzhiyun case 2:
3556*4882a593Smuzhiyun break;
3557*4882a593Smuzhiyun default:
3558*4882a593Smuzhiyun return -EINVAL;
3559*4882a593Smuzhiyun }
3560*4882a593Smuzhiyun
3561*4882a593Smuzhiyun switch (slot_width) {
3562*4882a593Smuzhiyun case 20:
3563*4882a593Smuzhiyun val |= (1 << 6);
3564*4882a593Smuzhiyun val |= (1 << 4);
3565*4882a593Smuzhiyun break;
3566*4882a593Smuzhiyun case 24:
3567*4882a593Smuzhiyun val |= (2 << 6);
3568*4882a593Smuzhiyun val |= (2 << 4);
3569*4882a593Smuzhiyun break;
3570*4882a593Smuzhiyun case 32:
3571*4882a593Smuzhiyun val |= (3 << 6);
3572*4882a593Smuzhiyun val |= (3 << 4);
3573*4882a593Smuzhiyun break;
3574*4882a593Smuzhiyun case 16:
3575*4882a593Smuzhiyun break;
3576*4882a593Smuzhiyun default:
3577*4882a593Smuzhiyun return -EINVAL;
3578*4882a593Smuzhiyun }
3579*4882a593Smuzhiyun
3580*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_TDM_CTRL_1, 0x8ff0, val);
3581*4882a593Smuzhiyun
3582*4882a593Smuzhiyun return 0;
3583*4882a593Smuzhiyun }
3584*4882a593Smuzhiyun
rt5659_set_bclk_ratio(struct snd_soc_dai * dai,unsigned int ratio)3585*4882a593Smuzhiyun static int rt5659_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
3586*4882a593Smuzhiyun {
3587*4882a593Smuzhiyun struct snd_soc_component *component = dai->component;
3588*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3589*4882a593Smuzhiyun
3590*4882a593Smuzhiyun dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio);
3591*4882a593Smuzhiyun
3592*4882a593Smuzhiyun rt5659->bclk[dai->id] = ratio;
3593*4882a593Smuzhiyun
3594*4882a593Smuzhiyun if (ratio == 64) {
3595*4882a593Smuzhiyun switch (dai->id) {
3596*4882a593Smuzhiyun case RT5659_AIF2:
3597*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1,
3598*4882a593Smuzhiyun RT5659_I2S_BCLK_MS2_MASK,
3599*4882a593Smuzhiyun RT5659_I2S_BCLK_MS2_64);
3600*4882a593Smuzhiyun break;
3601*4882a593Smuzhiyun case RT5659_AIF3:
3602*4882a593Smuzhiyun snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1,
3603*4882a593Smuzhiyun RT5659_I2S_BCLK_MS3_MASK,
3604*4882a593Smuzhiyun RT5659_I2S_BCLK_MS3_64);
3605*4882a593Smuzhiyun break;
3606*4882a593Smuzhiyun }
3607*4882a593Smuzhiyun }
3608*4882a593Smuzhiyun
3609*4882a593Smuzhiyun return 0;
3610*4882a593Smuzhiyun }
3611*4882a593Smuzhiyun
rt5659_set_bias_level(struct snd_soc_component * component,enum snd_soc_bias_level level)3612*4882a593Smuzhiyun static int rt5659_set_bias_level(struct snd_soc_component *component,
3613*4882a593Smuzhiyun enum snd_soc_bias_level level)
3614*4882a593Smuzhiyun {
3615*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
3616*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3617*4882a593Smuzhiyun int ret;
3618*4882a593Smuzhiyun
3619*4882a593Smuzhiyun switch (level) {
3620*4882a593Smuzhiyun case SND_SOC_BIAS_PREPARE:
3621*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_DIG_MISC,
3622*4882a593Smuzhiyun RT5659_DIG_GATE_CTRL, RT5659_DIG_GATE_CTRL);
3623*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_DIG_1,
3624*4882a593Smuzhiyun RT5659_PWR_LDO, RT5659_PWR_LDO);
3625*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
3626*4882a593Smuzhiyun RT5659_PWR_MB | RT5659_PWR_VREF1 | RT5659_PWR_VREF2,
3627*4882a593Smuzhiyun RT5659_PWR_MB | RT5659_PWR_VREF1 | RT5659_PWR_VREF2);
3628*4882a593Smuzhiyun msleep(20);
3629*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
3630*4882a593Smuzhiyun RT5659_PWR_FV1 | RT5659_PWR_FV2,
3631*4882a593Smuzhiyun RT5659_PWR_FV1 | RT5659_PWR_FV2);
3632*4882a593Smuzhiyun break;
3633*4882a593Smuzhiyun
3634*4882a593Smuzhiyun case SND_SOC_BIAS_STANDBY:
3635*4882a593Smuzhiyun if (dapm->bias_level == SND_SOC_BIAS_OFF) {
3636*4882a593Smuzhiyun ret = clk_prepare_enable(rt5659->mclk);
3637*4882a593Smuzhiyun if (ret) {
3638*4882a593Smuzhiyun dev_err(component->dev,
3639*4882a593Smuzhiyun "failed to enable MCLK: %d\n", ret);
3640*4882a593Smuzhiyun return ret;
3641*4882a593Smuzhiyun }
3642*4882a593Smuzhiyun }
3643*4882a593Smuzhiyun break;
3644*4882a593Smuzhiyun
3645*4882a593Smuzhiyun case SND_SOC_BIAS_OFF:
3646*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_DIG_1,
3647*4882a593Smuzhiyun RT5659_PWR_LDO, 0);
3648*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
3649*4882a593Smuzhiyun RT5659_PWR_MB | RT5659_PWR_VREF1 | RT5659_PWR_VREF2
3650*4882a593Smuzhiyun | RT5659_PWR_FV1 | RT5659_PWR_FV2,
3651*4882a593Smuzhiyun RT5659_PWR_MB | RT5659_PWR_VREF2);
3652*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_DIG_MISC,
3653*4882a593Smuzhiyun RT5659_DIG_GATE_CTRL, 0);
3654*4882a593Smuzhiyun clk_disable_unprepare(rt5659->mclk);
3655*4882a593Smuzhiyun break;
3656*4882a593Smuzhiyun
3657*4882a593Smuzhiyun default:
3658*4882a593Smuzhiyun break;
3659*4882a593Smuzhiyun }
3660*4882a593Smuzhiyun
3661*4882a593Smuzhiyun return 0;
3662*4882a593Smuzhiyun }
3663*4882a593Smuzhiyun
rt5659_probe(struct snd_soc_component * component)3664*4882a593Smuzhiyun static int rt5659_probe(struct snd_soc_component *component)
3665*4882a593Smuzhiyun {
3666*4882a593Smuzhiyun struct snd_soc_dapm_context *dapm =
3667*4882a593Smuzhiyun snd_soc_component_get_dapm(component);
3668*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3669*4882a593Smuzhiyun
3670*4882a593Smuzhiyun rt5659->component = component;
3671*4882a593Smuzhiyun
3672*4882a593Smuzhiyun switch (rt5659->pdata.jd_src) {
3673*4882a593Smuzhiyun case RT5659_JD_HDA_HEADER:
3674*4882a593Smuzhiyun break;
3675*4882a593Smuzhiyun
3676*4882a593Smuzhiyun default:
3677*4882a593Smuzhiyun snd_soc_dapm_new_controls(dapm,
3678*4882a593Smuzhiyun rt5659_particular_dapm_widgets,
3679*4882a593Smuzhiyun ARRAY_SIZE(rt5659_particular_dapm_widgets));
3680*4882a593Smuzhiyun break;
3681*4882a593Smuzhiyun }
3682*4882a593Smuzhiyun
3683*4882a593Smuzhiyun return 0;
3684*4882a593Smuzhiyun }
3685*4882a593Smuzhiyun
rt5659_remove(struct snd_soc_component * component)3686*4882a593Smuzhiyun static void rt5659_remove(struct snd_soc_component *component)
3687*4882a593Smuzhiyun {
3688*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3689*4882a593Smuzhiyun
3690*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_RESET, 0);
3691*4882a593Smuzhiyun }
3692*4882a593Smuzhiyun
3693*4882a593Smuzhiyun #ifdef CONFIG_PM
rt5659_suspend(struct snd_soc_component * component)3694*4882a593Smuzhiyun static int rt5659_suspend(struct snd_soc_component *component)
3695*4882a593Smuzhiyun {
3696*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3697*4882a593Smuzhiyun
3698*4882a593Smuzhiyun regcache_cache_only(rt5659->regmap, true);
3699*4882a593Smuzhiyun regcache_mark_dirty(rt5659->regmap);
3700*4882a593Smuzhiyun return 0;
3701*4882a593Smuzhiyun }
3702*4882a593Smuzhiyun
rt5659_resume(struct snd_soc_component * component)3703*4882a593Smuzhiyun static int rt5659_resume(struct snd_soc_component *component)
3704*4882a593Smuzhiyun {
3705*4882a593Smuzhiyun struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
3706*4882a593Smuzhiyun
3707*4882a593Smuzhiyun regcache_cache_only(rt5659->regmap, false);
3708*4882a593Smuzhiyun regcache_sync(rt5659->regmap);
3709*4882a593Smuzhiyun
3710*4882a593Smuzhiyun return 0;
3711*4882a593Smuzhiyun }
3712*4882a593Smuzhiyun #else
3713*4882a593Smuzhiyun #define rt5659_suspend NULL
3714*4882a593Smuzhiyun #define rt5659_resume NULL
3715*4882a593Smuzhiyun #endif
3716*4882a593Smuzhiyun
3717*4882a593Smuzhiyun #define RT5659_STEREO_RATES SNDRV_PCM_RATE_8000_192000
3718*4882a593Smuzhiyun #define RT5659_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
3719*4882a593Smuzhiyun SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
3720*4882a593Smuzhiyun
3721*4882a593Smuzhiyun static const struct snd_soc_dai_ops rt5659_aif_dai_ops = {
3722*4882a593Smuzhiyun .hw_params = rt5659_hw_params,
3723*4882a593Smuzhiyun .set_fmt = rt5659_set_dai_fmt,
3724*4882a593Smuzhiyun .set_tdm_slot = rt5659_set_tdm_slot,
3725*4882a593Smuzhiyun .set_bclk_ratio = rt5659_set_bclk_ratio,
3726*4882a593Smuzhiyun };
3727*4882a593Smuzhiyun
3728*4882a593Smuzhiyun static struct snd_soc_dai_driver rt5659_dai[] = {
3729*4882a593Smuzhiyun {
3730*4882a593Smuzhiyun .name = "rt5659-aif1",
3731*4882a593Smuzhiyun .id = RT5659_AIF1,
3732*4882a593Smuzhiyun .playback = {
3733*4882a593Smuzhiyun .stream_name = "AIF1 Playback",
3734*4882a593Smuzhiyun .channels_min = 1,
3735*4882a593Smuzhiyun .channels_max = 2,
3736*4882a593Smuzhiyun .rates = RT5659_STEREO_RATES,
3737*4882a593Smuzhiyun .formats = RT5659_FORMATS,
3738*4882a593Smuzhiyun },
3739*4882a593Smuzhiyun .capture = {
3740*4882a593Smuzhiyun .stream_name = "AIF1 Capture",
3741*4882a593Smuzhiyun .channels_min = 1,
3742*4882a593Smuzhiyun .channels_max = 2,
3743*4882a593Smuzhiyun .rates = RT5659_STEREO_RATES,
3744*4882a593Smuzhiyun .formats = RT5659_FORMATS,
3745*4882a593Smuzhiyun },
3746*4882a593Smuzhiyun .ops = &rt5659_aif_dai_ops,
3747*4882a593Smuzhiyun },
3748*4882a593Smuzhiyun {
3749*4882a593Smuzhiyun .name = "rt5659-aif2",
3750*4882a593Smuzhiyun .id = RT5659_AIF2,
3751*4882a593Smuzhiyun .playback = {
3752*4882a593Smuzhiyun .stream_name = "AIF2 Playback",
3753*4882a593Smuzhiyun .channels_min = 1,
3754*4882a593Smuzhiyun .channels_max = 2,
3755*4882a593Smuzhiyun .rates = RT5659_STEREO_RATES,
3756*4882a593Smuzhiyun .formats = RT5659_FORMATS,
3757*4882a593Smuzhiyun },
3758*4882a593Smuzhiyun .capture = {
3759*4882a593Smuzhiyun .stream_name = "AIF2 Capture",
3760*4882a593Smuzhiyun .channels_min = 1,
3761*4882a593Smuzhiyun .channels_max = 2,
3762*4882a593Smuzhiyun .rates = RT5659_STEREO_RATES,
3763*4882a593Smuzhiyun .formats = RT5659_FORMATS,
3764*4882a593Smuzhiyun },
3765*4882a593Smuzhiyun .ops = &rt5659_aif_dai_ops,
3766*4882a593Smuzhiyun },
3767*4882a593Smuzhiyun {
3768*4882a593Smuzhiyun .name = "rt5659-aif3",
3769*4882a593Smuzhiyun .id = RT5659_AIF3,
3770*4882a593Smuzhiyun .playback = {
3771*4882a593Smuzhiyun .stream_name = "AIF3 Playback",
3772*4882a593Smuzhiyun .channels_min = 1,
3773*4882a593Smuzhiyun .channels_max = 2,
3774*4882a593Smuzhiyun .rates = RT5659_STEREO_RATES,
3775*4882a593Smuzhiyun .formats = RT5659_FORMATS,
3776*4882a593Smuzhiyun },
3777*4882a593Smuzhiyun .capture = {
3778*4882a593Smuzhiyun .stream_name = "AIF3 Capture",
3779*4882a593Smuzhiyun .channels_min = 1,
3780*4882a593Smuzhiyun .channels_max = 2,
3781*4882a593Smuzhiyun .rates = RT5659_STEREO_RATES,
3782*4882a593Smuzhiyun .formats = RT5659_FORMATS,
3783*4882a593Smuzhiyun },
3784*4882a593Smuzhiyun .ops = &rt5659_aif_dai_ops,
3785*4882a593Smuzhiyun },
3786*4882a593Smuzhiyun };
3787*4882a593Smuzhiyun
3788*4882a593Smuzhiyun static const struct snd_soc_component_driver soc_component_dev_rt5659 = {
3789*4882a593Smuzhiyun .probe = rt5659_probe,
3790*4882a593Smuzhiyun .remove = rt5659_remove,
3791*4882a593Smuzhiyun .suspend = rt5659_suspend,
3792*4882a593Smuzhiyun .resume = rt5659_resume,
3793*4882a593Smuzhiyun .set_bias_level = rt5659_set_bias_level,
3794*4882a593Smuzhiyun .controls = rt5659_snd_controls,
3795*4882a593Smuzhiyun .num_controls = ARRAY_SIZE(rt5659_snd_controls),
3796*4882a593Smuzhiyun .dapm_widgets = rt5659_dapm_widgets,
3797*4882a593Smuzhiyun .num_dapm_widgets = ARRAY_SIZE(rt5659_dapm_widgets),
3798*4882a593Smuzhiyun .dapm_routes = rt5659_dapm_routes,
3799*4882a593Smuzhiyun .num_dapm_routes = ARRAY_SIZE(rt5659_dapm_routes),
3800*4882a593Smuzhiyun .set_sysclk = rt5659_set_component_sysclk,
3801*4882a593Smuzhiyun .set_pll = rt5659_set_component_pll,
3802*4882a593Smuzhiyun .use_pmdown_time = 1,
3803*4882a593Smuzhiyun .endianness = 1,
3804*4882a593Smuzhiyun .non_legacy_dai_naming = 1,
3805*4882a593Smuzhiyun };
3806*4882a593Smuzhiyun
3807*4882a593Smuzhiyun
3808*4882a593Smuzhiyun static const struct regmap_config rt5659_regmap = {
3809*4882a593Smuzhiyun .reg_bits = 16,
3810*4882a593Smuzhiyun .val_bits = 16,
3811*4882a593Smuzhiyun .max_register = 0x0400,
3812*4882a593Smuzhiyun .volatile_reg = rt5659_volatile_register,
3813*4882a593Smuzhiyun .readable_reg = rt5659_readable_register,
3814*4882a593Smuzhiyun .cache_type = REGCACHE_RBTREE,
3815*4882a593Smuzhiyun .reg_defaults = rt5659_reg,
3816*4882a593Smuzhiyun .num_reg_defaults = ARRAY_SIZE(rt5659_reg),
3817*4882a593Smuzhiyun };
3818*4882a593Smuzhiyun
3819*4882a593Smuzhiyun static const struct i2c_device_id rt5659_i2c_id[] = {
3820*4882a593Smuzhiyun { "rt5658", 0 },
3821*4882a593Smuzhiyun { "rt5659", 0 },
3822*4882a593Smuzhiyun { }
3823*4882a593Smuzhiyun };
3824*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, rt5659_i2c_id);
3825*4882a593Smuzhiyun
rt5659_parse_dt(struct rt5659_priv * rt5659,struct device * dev)3826*4882a593Smuzhiyun static int rt5659_parse_dt(struct rt5659_priv *rt5659, struct device *dev)
3827*4882a593Smuzhiyun {
3828*4882a593Smuzhiyun rt5659->pdata.in1_diff = device_property_read_bool(dev,
3829*4882a593Smuzhiyun "realtek,in1-differential");
3830*4882a593Smuzhiyun rt5659->pdata.in3_diff = device_property_read_bool(dev,
3831*4882a593Smuzhiyun "realtek,in3-differential");
3832*4882a593Smuzhiyun rt5659->pdata.in4_diff = device_property_read_bool(dev,
3833*4882a593Smuzhiyun "realtek,in4-differential");
3834*4882a593Smuzhiyun
3835*4882a593Smuzhiyun
3836*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,dmic1-data-pin",
3837*4882a593Smuzhiyun &rt5659->pdata.dmic1_data_pin);
3838*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,dmic2-data-pin",
3839*4882a593Smuzhiyun &rt5659->pdata.dmic2_data_pin);
3840*4882a593Smuzhiyun device_property_read_u32(dev, "realtek,jd-src",
3841*4882a593Smuzhiyun &rt5659->pdata.jd_src);
3842*4882a593Smuzhiyun
3843*4882a593Smuzhiyun return 0;
3844*4882a593Smuzhiyun }
3845*4882a593Smuzhiyun
rt5659_calibrate(struct rt5659_priv * rt5659)3846*4882a593Smuzhiyun static void rt5659_calibrate(struct rt5659_priv *rt5659)
3847*4882a593Smuzhiyun {
3848*4882a593Smuzhiyun int value, count;
3849*4882a593Smuzhiyun
3850*4882a593Smuzhiyun /* Calibrate HPO Start */
3851*4882a593Smuzhiyun /* Fine tune HP Performance */
3852*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_BIAS_CUR_CTRL_8, 0xa502);
3853*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CHOP_DAC, 0x3030);
3854*4882a593Smuzhiyun
3855*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PRE_DIV_1, 0xef00);
3856*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PRE_DIV_2, 0xeffc);
3857*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MICBIAS_2, 0x0280);
3858*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_DIG_MISC, 0x0001);
3859*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_GLB_CLK, 0x8000);
3860*4882a593Smuzhiyun
3861*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_ANLG_1, 0xaa7e);
3862*4882a593Smuzhiyun msleep(60);
3863*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_ANLG_1, 0xfe7e);
3864*4882a593Smuzhiyun msleep(50);
3865*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_ANLG_3, 0x0004);
3866*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_DIG_2, 0x0400);
3867*4882a593Smuzhiyun msleep(50);
3868*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_DIG_1, 0x0080);
3869*4882a593Smuzhiyun usleep_range(10000, 10005);
3870*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_DEPOP_1, 0x0009);
3871*4882a593Smuzhiyun msleep(50);
3872*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_DIG_1, 0x0f80);
3873*4882a593Smuzhiyun msleep(50);
3874*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CHARGE_PUMP_1, 0x0e16);
3875*4882a593Smuzhiyun msleep(50);
3876*4882a593Smuzhiyun
3877*4882a593Smuzhiyun /* Enalbe K ADC Power And Clock */
3878*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CAL_REC, 0x0505);
3879*4882a593Smuzhiyun msleep(50);
3880*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_ANLG_3, 0x0184);
3881*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CALIB_ADC_CTRL, 0x3c05);
3882*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x20c1);
3883*4882a593Smuzhiyun
3884*4882a593Smuzhiyun /* K Headphone */
3885*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x2cc1);
3886*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, 0x5100);
3887*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_7, 0x0014);
3888*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, 0xd100);
3889*4882a593Smuzhiyun msleep(60);
3890*4882a593Smuzhiyun
3891*4882a593Smuzhiyun /* Manual K ADC Offset */
3892*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x2cc1);
3893*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, 0x4900);
3894*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_7, 0x0016);
3895*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_HP_CALIB_CTRL_1,
3896*4882a593Smuzhiyun 0x8000, 0x8000);
3897*4882a593Smuzhiyun
3898*4882a593Smuzhiyun count = 0;
3899*4882a593Smuzhiyun while (true) {
3900*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, &value);
3901*4882a593Smuzhiyun if (value & 0x8000)
3902*4882a593Smuzhiyun usleep_range(10000, 10005);
3903*4882a593Smuzhiyun else
3904*4882a593Smuzhiyun break;
3905*4882a593Smuzhiyun
3906*4882a593Smuzhiyun if (count > 30) {
3907*4882a593Smuzhiyun dev_err(rt5659->component->dev,
3908*4882a593Smuzhiyun "HP Calibration 1 Failure\n");
3909*4882a593Smuzhiyun return;
3910*4882a593Smuzhiyun }
3911*4882a593Smuzhiyun
3912*4882a593Smuzhiyun count++;
3913*4882a593Smuzhiyun }
3914*4882a593Smuzhiyun
3915*4882a593Smuzhiyun /* Manual K Internal Path Offset */
3916*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x2cc1);
3917*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_VOL, 0x0000);
3918*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, 0x4500);
3919*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_7, 0x001f);
3920*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_HP_CALIB_CTRL_1,
3921*4882a593Smuzhiyun 0x8000, 0x8000);
3922*4882a593Smuzhiyun
3923*4882a593Smuzhiyun count = 0;
3924*4882a593Smuzhiyun while (true) {
3925*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, &value);
3926*4882a593Smuzhiyun if (value & 0x8000)
3927*4882a593Smuzhiyun usleep_range(10000, 10005);
3928*4882a593Smuzhiyun else
3929*4882a593Smuzhiyun break;
3930*4882a593Smuzhiyun
3931*4882a593Smuzhiyun if (count > 85) {
3932*4882a593Smuzhiyun dev_err(rt5659->component->dev,
3933*4882a593Smuzhiyun "HP Calibration 2 Failure\n");
3934*4882a593Smuzhiyun return;
3935*4882a593Smuzhiyun }
3936*4882a593Smuzhiyun
3937*4882a593Smuzhiyun count++;
3938*4882a593Smuzhiyun }
3939*4882a593Smuzhiyun
3940*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_7, 0x0000);
3941*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x20c0);
3942*4882a593Smuzhiyun /* Calibrate HPO End */
3943*4882a593Smuzhiyun
3944*4882a593Smuzhiyun /* Calibrate SPO Start */
3945*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_0, 0x2021);
3946*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_CTRL_1, 0x0260);
3947*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_MIXER, 0x3000);
3948*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_VOL, 0xc000);
3949*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_A_DAC_MUX, 0x000c);
3950*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_DIG_MISC, 0x8000);
3951*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_SPO_VOL, 0x0808);
3952*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_SPK_L_MIXER, 0x001e);
3953*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_SPK_R_MIXER, 0x001e);
3954*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_1, 0x0803);
3955*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_2, 0x0554);
3956*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_SPO_AMP_GAIN, 0x1103);
3957*4882a593Smuzhiyun
3958*4882a593Smuzhiyun /* Enalbe K ADC Power And Clock */
3959*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CAL_REC, 0x0909);
3960*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x0001,
3961*4882a593Smuzhiyun 0x0001);
3962*4882a593Smuzhiyun
3963*4882a593Smuzhiyun /* Start Calibration */
3964*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_3, 0x0000);
3965*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_0, 0x0021);
3966*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_1, 0x3e80);
3967*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_1,
3968*4882a593Smuzhiyun 0x8000, 0x8000);
3969*4882a593Smuzhiyun
3970*4882a593Smuzhiyun count = 0;
3971*4882a593Smuzhiyun while (true) {
3972*4882a593Smuzhiyun regmap_read(rt5659->regmap,
3973*4882a593Smuzhiyun RT5659_SPK_DC_CAILB_CTRL_1, &value);
3974*4882a593Smuzhiyun if (value & 0x8000)
3975*4882a593Smuzhiyun usleep_range(10000, 10005);
3976*4882a593Smuzhiyun else
3977*4882a593Smuzhiyun break;
3978*4882a593Smuzhiyun
3979*4882a593Smuzhiyun if (count > 10) {
3980*4882a593Smuzhiyun dev_err(rt5659->component->dev,
3981*4882a593Smuzhiyun "SPK Calibration Failure\n");
3982*4882a593Smuzhiyun return;
3983*4882a593Smuzhiyun }
3984*4882a593Smuzhiyun
3985*4882a593Smuzhiyun count++;
3986*4882a593Smuzhiyun }
3987*4882a593Smuzhiyun /* Calibrate SPO End */
3988*4882a593Smuzhiyun
3989*4882a593Smuzhiyun /* Calibrate MONO Start */
3990*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_DIG_MISC, 0x0000);
3991*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MONOMIX_IN_GAIN, 0x021f);
3992*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MONO_OUT, 0x480a);
3993*4882a593Smuzhiyun /* MONO NG2 GAIN 5dB */
3994*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MONO_GAIN, 0x0003);
3995*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MONO_NG2_CTRL_5, 0x0009);
3996*4882a593Smuzhiyun
3997*4882a593Smuzhiyun /* Start Calibration */
3998*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_3, 0x000f);
3999*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e00);
4000*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_MONO_AMP_CALIB_CTRL_1,
4001*4882a593Smuzhiyun 0x8000, 0x8000);
4002*4882a593Smuzhiyun
4003*4882a593Smuzhiyun count = 0;
4004*4882a593Smuzhiyun while (true) {
4005*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_MONO_AMP_CALIB_CTRL_1,
4006*4882a593Smuzhiyun &value);
4007*4882a593Smuzhiyun if (value & 0x8000)
4008*4882a593Smuzhiyun usleep_range(10000, 10005);
4009*4882a593Smuzhiyun else
4010*4882a593Smuzhiyun break;
4011*4882a593Smuzhiyun
4012*4882a593Smuzhiyun if (count > 35) {
4013*4882a593Smuzhiyun dev_err(rt5659->component->dev,
4014*4882a593Smuzhiyun "Mono Calibration Failure\n");
4015*4882a593Smuzhiyun return;
4016*4882a593Smuzhiyun }
4017*4882a593Smuzhiyun
4018*4882a593Smuzhiyun count++;
4019*4882a593Smuzhiyun }
4020*4882a593Smuzhiyun
4021*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_3, 0x0003);
4022*4882a593Smuzhiyun /* Calibrate MONO End */
4023*4882a593Smuzhiyun
4024*4882a593Smuzhiyun /* Power Off */
4025*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CAL_REC, 0x0808);
4026*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_ANLG_3, 0x0000);
4027*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CALIB_ADC_CTRL, 0x2005);
4028*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x20c0);
4029*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_DEPOP_1, 0x0000);
4030*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_1, 0x0011);
4031*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_2, 0x0150);
4032*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_ANLG_1, 0xfe3e);
4033*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MONO_OUT, 0xc80a);
4034*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e04);
4035*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_MIXER, 0x0000);
4036*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_VOL, 0x0000);
4037*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_DIG_1, 0x0000);
4038*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_DIG_2, 0x0000);
4039*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_ANLG_1, 0x003e);
4040*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_CTRL_1, 0x0060);
4041*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_CLASSD_0, 0x2021);
4042*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_GLB_CLK, 0x0000);
4043*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_MICBIAS_2, 0x0080);
4044*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_VOL, 0x8080);
4045*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_HP_CHARGE_PUMP_1, 0x0c16);
4046*4882a593Smuzhiyun }
4047*4882a593Smuzhiyun
rt5659_intel_hd_header_probe_setup(struct rt5659_priv * rt5659)4048*4882a593Smuzhiyun static void rt5659_intel_hd_header_probe_setup(struct rt5659_priv *rt5659)
4049*4882a593Smuzhiyun {
4050*4882a593Smuzhiyun int value;
4051*4882a593Smuzhiyun
4052*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_GPIO_STA, &value);
4053*4882a593Smuzhiyun if (!(value & 0x8)) {
4054*4882a593Smuzhiyun rt5659->hda_hp_plugged = true;
4055*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_1,
4056*4882a593Smuzhiyun 0x10, 0x0);
4057*4882a593Smuzhiyun } else {
4058*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_1,
4059*4882a593Smuzhiyun 0x10, 0x10);
4060*4882a593Smuzhiyun }
4061*4882a593Smuzhiyun
4062*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
4063*4882a593Smuzhiyun RT5659_PWR_VREF2 | RT5659_PWR_MB,
4064*4882a593Smuzhiyun RT5659_PWR_VREF2 | RT5659_PWR_MB);
4065*4882a593Smuzhiyun msleep(20);
4066*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
4067*4882a593Smuzhiyun RT5659_PWR_FV2, RT5659_PWR_FV2);
4068*4882a593Smuzhiyun
4069*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_3, RT5659_PWR_LDO2,
4070*4882a593Smuzhiyun RT5659_PWR_LDO2);
4071*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_2, RT5659_PWR_MB1,
4072*4882a593Smuzhiyun RT5659_PWR_MB1);
4073*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_VOL, RT5659_PWR_MIC_DET,
4074*4882a593Smuzhiyun RT5659_PWR_MIC_DET);
4075*4882a593Smuzhiyun msleep(20);
4076*4882a593Smuzhiyun
4077*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_4BTN_IL_CMD_2,
4078*4882a593Smuzhiyun RT5659_4BTN_IL_MASK, RT5659_4BTN_IL_EN);
4079*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_4BTN_IL_CMD_1, &value);
4080*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_4BTN_IL_CMD_1, value);
4081*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_4BTN_IL_CMD_1, &value);
4082*4882a593Smuzhiyun
4083*4882a593Smuzhiyun if (value & 0x2000) {
4084*4882a593Smuzhiyun rt5659->hda_mic_plugged = true;
4085*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2,
4086*4882a593Smuzhiyun 0x2, 0x2);
4087*4882a593Smuzhiyun } else {
4088*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2,
4089*4882a593Smuzhiyun 0x2, 0x0);
4090*4882a593Smuzhiyun }
4091*4882a593Smuzhiyun
4092*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2,
4093*4882a593Smuzhiyun RT5659_IL_IRQ_MASK, RT5659_IL_IRQ_EN);
4094*4882a593Smuzhiyun }
4095*4882a593Smuzhiyun
rt5659_i2c_probe(struct i2c_client * i2c,const struct i2c_device_id * id)4096*4882a593Smuzhiyun static int rt5659_i2c_probe(struct i2c_client *i2c,
4097*4882a593Smuzhiyun const struct i2c_device_id *id)
4098*4882a593Smuzhiyun {
4099*4882a593Smuzhiyun struct rt5659_platform_data *pdata = dev_get_platdata(&i2c->dev);
4100*4882a593Smuzhiyun struct rt5659_priv *rt5659;
4101*4882a593Smuzhiyun int ret;
4102*4882a593Smuzhiyun unsigned int val;
4103*4882a593Smuzhiyun
4104*4882a593Smuzhiyun rt5659 = devm_kzalloc(&i2c->dev, sizeof(struct rt5659_priv),
4105*4882a593Smuzhiyun GFP_KERNEL);
4106*4882a593Smuzhiyun
4107*4882a593Smuzhiyun if (rt5659 == NULL)
4108*4882a593Smuzhiyun return -ENOMEM;
4109*4882a593Smuzhiyun
4110*4882a593Smuzhiyun i2c_set_clientdata(i2c, rt5659);
4111*4882a593Smuzhiyun
4112*4882a593Smuzhiyun if (pdata)
4113*4882a593Smuzhiyun rt5659->pdata = *pdata;
4114*4882a593Smuzhiyun else
4115*4882a593Smuzhiyun rt5659_parse_dt(rt5659, &i2c->dev);
4116*4882a593Smuzhiyun
4117*4882a593Smuzhiyun rt5659->gpiod_ldo1_en = devm_gpiod_get_optional(&i2c->dev, "ldo1-en",
4118*4882a593Smuzhiyun GPIOD_OUT_HIGH);
4119*4882a593Smuzhiyun if (IS_ERR(rt5659->gpiod_ldo1_en))
4120*4882a593Smuzhiyun dev_warn(&i2c->dev, "Request ldo1-en GPIO failed\n");
4121*4882a593Smuzhiyun
4122*4882a593Smuzhiyun rt5659->gpiod_reset = devm_gpiod_get_optional(&i2c->dev, "reset",
4123*4882a593Smuzhiyun GPIOD_OUT_HIGH);
4124*4882a593Smuzhiyun
4125*4882a593Smuzhiyun /* Sleep for 300 ms miniumum */
4126*4882a593Smuzhiyun msleep(300);
4127*4882a593Smuzhiyun
4128*4882a593Smuzhiyun rt5659->regmap = devm_regmap_init_i2c(i2c, &rt5659_regmap);
4129*4882a593Smuzhiyun if (IS_ERR(rt5659->regmap)) {
4130*4882a593Smuzhiyun ret = PTR_ERR(rt5659->regmap);
4131*4882a593Smuzhiyun dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
4132*4882a593Smuzhiyun ret);
4133*4882a593Smuzhiyun return ret;
4134*4882a593Smuzhiyun }
4135*4882a593Smuzhiyun
4136*4882a593Smuzhiyun regmap_read(rt5659->regmap, RT5659_DEVICE_ID, &val);
4137*4882a593Smuzhiyun if (val != DEVICE_ID) {
4138*4882a593Smuzhiyun dev_err(&i2c->dev,
4139*4882a593Smuzhiyun "Device with ID register %x is not rt5659\n", val);
4140*4882a593Smuzhiyun return -ENODEV;
4141*4882a593Smuzhiyun }
4142*4882a593Smuzhiyun
4143*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_RESET, 0);
4144*4882a593Smuzhiyun
4145*4882a593Smuzhiyun /* Check if MCLK provided */
4146*4882a593Smuzhiyun rt5659->mclk = devm_clk_get(&i2c->dev, "mclk");
4147*4882a593Smuzhiyun if (IS_ERR(rt5659->mclk)) {
4148*4882a593Smuzhiyun if (PTR_ERR(rt5659->mclk) != -ENOENT)
4149*4882a593Smuzhiyun return PTR_ERR(rt5659->mclk);
4150*4882a593Smuzhiyun /* Otherwise mark the mclk pointer to NULL */
4151*4882a593Smuzhiyun rt5659->mclk = NULL;
4152*4882a593Smuzhiyun }
4153*4882a593Smuzhiyun
4154*4882a593Smuzhiyun rt5659_calibrate(rt5659);
4155*4882a593Smuzhiyun
4156*4882a593Smuzhiyun /* line in diff mode*/
4157*4882a593Smuzhiyun if (rt5659->pdata.in1_diff)
4158*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IN1_IN2,
4159*4882a593Smuzhiyun RT5659_IN1_DF_MASK, RT5659_IN1_DF_MASK);
4160*4882a593Smuzhiyun if (rt5659->pdata.in3_diff)
4161*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IN3_IN4,
4162*4882a593Smuzhiyun RT5659_IN3_DF_MASK, RT5659_IN3_DF_MASK);
4163*4882a593Smuzhiyun if (rt5659->pdata.in4_diff)
4164*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_IN3_IN4,
4165*4882a593Smuzhiyun RT5659_IN4_DF_MASK, RT5659_IN4_DF_MASK);
4166*4882a593Smuzhiyun
4167*4882a593Smuzhiyun /* DMIC pin*/
4168*4882a593Smuzhiyun if (rt5659->pdata.dmic1_data_pin != RT5659_DMIC1_NULL ||
4169*4882a593Smuzhiyun rt5659->pdata.dmic2_data_pin != RT5659_DMIC2_NULL) {
4170*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4171*4882a593Smuzhiyun RT5659_GP2_PIN_MASK, RT5659_GP2_PIN_DMIC1_SCL);
4172*4882a593Smuzhiyun
4173*4882a593Smuzhiyun switch (rt5659->pdata.dmic1_data_pin) {
4174*4882a593Smuzhiyun case RT5659_DMIC1_DATA_IN2N:
4175*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4176*4882a593Smuzhiyun RT5659_DMIC_1_DP_MASK, RT5659_DMIC_1_DP_IN2N);
4177*4882a593Smuzhiyun break;
4178*4882a593Smuzhiyun
4179*4882a593Smuzhiyun case RT5659_DMIC1_DATA_GPIO5:
4180*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap,
4181*4882a593Smuzhiyun RT5659_GPIO_CTRL_3,
4182*4882a593Smuzhiyun RT5659_I2S2_PIN_MASK,
4183*4882a593Smuzhiyun RT5659_I2S2_PIN_GPIO);
4184*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4185*4882a593Smuzhiyun RT5659_DMIC_1_DP_MASK, RT5659_DMIC_1_DP_GPIO5);
4186*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4187*4882a593Smuzhiyun RT5659_GP5_PIN_MASK, RT5659_GP5_PIN_DMIC1_SDA);
4188*4882a593Smuzhiyun break;
4189*4882a593Smuzhiyun
4190*4882a593Smuzhiyun case RT5659_DMIC1_DATA_GPIO9:
4191*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4192*4882a593Smuzhiyun RT5659_DMIC_1_DP_MASK, RT5659_DMIC_1_DP_GPIO9);
4193*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4194*4882a593Smuzhiyun RT5659_GP9_PIN_MASK, RT5659_GP9_PIN_DMIC1_SDA);
4195*4882a593Smuzhiyun break;
4196*4882a593Smuzhiyun
4197*4882a593Smuzhiyun case RT5659_DMIC1_DATA_GPIO11:
4198*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4199*4882a593Smuzhiyun RT5659_DMIC_1_DP_MASK, RT5659_DMIC_1_DP_GPIO11);
4200*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4201*4882a593Smuzhiyun RT5659_GP11_PIN_MASK,
4202*4882a593Smuzhiyun RT5659_GP11_PIN_DMIC1_SDA);
4203*4882a593Smuzhiyun break;
4204*4882a593Smuzhiyun
4205*4882a593Smuzhiyun default:
4206*4882a593Smuzhiyun dev_dbg(&i2c->dev, "no DMIC1\n");
4207*4882a593Smuzhiyun break;
4208*4882a593Smuzhiyun }
4209*4882a593Smuzhiyun
4210*4882a593Smuzhiyun switch (rt5659->pdata.dmic2_data_pin) {
4211*4882a593Smuzhiyun case RT5659_DMIC2_DATA_IN2P:
4212*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap,
4213*4882a593Smuzhiyun RT5659_DMIC_CTRL_1,
4214*4882a593Smuzhiyun RT5659_DMIC_2_DP_MASK,
4215*4882a593Smuzhiyun RT5659_DMIC_2_DP_IN2P);
4216*4882a593Smuzhiyun break;
4217*4882a593Smuzhiyun
4218*4882a593Smuzhiyun case RT5659_DMIC2_DATA_GPIO6:
4219*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap,
4220*4882a593Smuzhiyun RT5659_DMIC_CTRL_1,
4221*4882a593Smuzhiyun RT5659_DMIC_2_DP_MASK,
4222*4882a593Smuzhiyun RT5659_DMIC_2_DP_GPIO6);
4223*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap,
4224*4882a593Smuzhiyun RT5659_GPIO_CTRL_1,
4225*4882a593Smuzhiyun RT5659_GP6_PIN_MASK,
4226*4882a593Smuzhiyun RT5659_GP6_PIN_DMIC2_SDA);
4227*4882a593Smuzhiyun break;
4228*4882a593Smuzhiyun
4229*4882a593Smuzhiyun case RT5659_DMIC2_DATA_GPIO10:
4230*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap,
4231*4882a593Smuzhiyun RT5659_DMIC_CTRL_1,
4232*4882a593Smuzhiyun RT5659_DMIC_2_DP_MASK,
4233*4882a593Smuzhiyun RT5659_DMIC_2_DP_GPIO10);
4234*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap,
4235*4882a593Smuzhiyun RT5659_GPIO_CTRL_1,
4236*4882a593Smuzhiyun RT5659_GP10_PIN_MASK,
4237*4882a593Smuzhiyun RT5659_GP10_PIN_DMIC2_SDA);
4238*4882a593Smuzhiyun break;
4239*4882a593Smuzhiyun
4240*4882a593Smuzhiyun case RT5659_DMIC2_DATA_GPIO12:
4241*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap,
4242*4882a593Smuzhiyun RT5659_DMIC_CTRL_1,
4243*4882a593Smuzhiyun RT5659_DMIC_2_DP_MASK,
4244*4882a593Smuzhiyun RT5659_DMIC_2_DP_GPIO12);
4245*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap,
4246*4882a593Smuzhiyun RT5659_GPIO_CTRL_1,
4247*4882a593Smuzhiyun RT5659_GP12_PIN_MASK,
4248*4882a593Smuzhiyun RT5659_GP12_PIN_DMIC2_SDA);
4249*4882a593Smuzhiyun break;
4250*4882a593Smuzhiyun
4251*4882a593Smuzhiyun default:
4252*4882a593Smuzhiyun dev_dbg(&i2c->dev, "no DMIC2\n");
4253*4882a593Smuzhiyun break;
4254*4882a593Smuzhiyun
4255*4882a593Smuzhiyun }
4256*4882a593Smuzhiyun } else {
4257*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4258*4882a593Smuzhiyun RT5659_GP2_PIN_MASK | RT5659_GP5_PIN_MASK |
4259*4882a593Smuzhiyun RT5659_GP9_PIN_MASK | RT5659_GP11_PIN_MASK |
4260*4882a593Smuzhiyun RT5659_GP6_PIN_MASK | RT5659_GP10_PIN_MASK |
4261*4882a593Smuzhiyun RT5659_GP12_PIN_MASK,
4262*4882a593Smuzhiyun RT5659_GP2_PIN_GPIO2 | RT5659_GP5_PIN_GPIO5 |
4263*4882a593Smuzhiyun RT5659_GP9_PIN_GPIO9 | RT5659_GP11_PIN_GPIO11 |
4264*4882a593Smuzhiyun RT5659_GP6_PIN_GPIO6 | RT5659_GP10_PIN_GPIO10 |
4265*4882a593Smuzhiyun RT5659_GP12_PIN_GPIO12);
4266*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4267*4882a593Smuzhiyun RT5659_DMIC_1_DP_MASK | RT5659_DMIC_2_DP_MASK,
4268*4882a593Smuzhiyun RT5659_DMIC_1_DP_IN2N | RT5659_DMIC_2_DP_IN2P);
4269*4882a593Smuzhiyun }
4270*4882a593Smuzhiyun
4271*4882a593Smuzhiyun switch (rt5659->pdata.jd_src) {
4272*4882a593Smuzhiyun case RT5659_JD3:
4273*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_EJD_CTRL_1, 0xa880);
4274*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_RC_CLK_CTRL, 0x9000);
4275*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_GPIO_CTRL_1, 0xc800);
4276*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
4277*4882a593Smuzhiyun RT5659_PWR_MB, RT5659_PWR_MB);
4278*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_PWR_ANLG_2, 0x0001);
4279*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_IRQ_CTRL_2, 0x0040);
4280*4882a593Smuzhiyun INIT_DELAYED_WORK(&rt5659->jack_detect_work,
4281*4882a593Smuzhiyun rt5659_jack_detect_work);
4282*4882a593Smuzhiyun break;
4283*4882a593Smuzhiyun case RT5659_JD_HDA_HEADER:
4284*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_GPIO_CTRL_3, 0x8000);
4285*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_RC_CLK_CTRL, 0x0900);
4286*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_EJD_CTRL_1, 0x70c0);
4287*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_JD_CTRL_1, 0x2000);
4288*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_IRQ_CTRL_1, 0x0040);
4289*4882a593Smuzhiyun INIT_DELAYED_WORK(&rt5659->jack_detect_work,
4290*4882a593Smuzhiyun rt5659_jack_detect_intel_hd_header);
4291*4882a593Smuzhiyun rt5659_intel_hd_header_probe_setup(rt5659);
4292*4882a593Smuzhiyun break;
4293*4882a593Smuzhiyun default:
4294*4882a593Smuzhiyun break;
4295*4882a593Smuzhiyun }
4296*4882a593Smuzhiyun
4297*4882a593Smuzhiyun if (i2c->irq) {
4298*4882a593Smuzhiyun ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL,
4299*4882a593Smuzhiyun rt5659_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
4300*4882a593Smuzhiyun | IRQF_ONESHOT, "rt5659", rt5659);
4301*4882a593Smuzhiyun if (ret)
4302*4882a593Smuzhiyun dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret);
4303*4882a593Smuzhiyun
4304*4882a593Smuzhiyun /* Enable IRQ output for GPIO1 pin any way */
4305*4882a593Smuzhiyun regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4306*4882a593Smuzhiyun RT5659_GP1_PIN_MASK, RT5659_GP1_PIN_IRQ);
4307*4882a593Smuzhiyun }
4308*4882a593Smuzhiyun
4309*4882a593Smuzhiyun return devm_snd_soc_register_component(&i2c->dev,
4310*4882a593Smuzhiyun &soc_component_dev_rt5659,
4311*4882a593Smuzhiyun rt5659_dai, ARRAY_SIZE(rt5659_dai));
4312*4882a593Smuzhiyun }
4313*4882a593Smuzhiyun
rt5659_i2c_shutdown(struct i2c_client * client)4314*4882a593Smuzhiyun static void rt5659_i2c_shutdown(struct i2c_client *client)
4315*4882a593Smuzhiyun {
4316*4882a593Smuzhiyun struct rt5659_priv *rt5659 = i2c_get_clientdata(client);
4317*4882a593Smuzhiyun
4318*4882a593Smuzhiyun regmap_write(rt5659->regmap, RT5659_RESET, 0);
4319*4882a593Smuzhiyun }
4320*4882a593Smuzhiyun
4321*4882a593Smuzhiyun #ifdef CONFIG_OF
4322*4882a593Smuzhiyun static const struct of_device_id rt5659_of_match[] = {
4323*4882a593Smuzhiyun { .compatible = "realtek,rt5658", },
4324*4882a593Smuzhiyun { .compatible = "realtek,rt5659", },
4325*4882a593Smuzhiyun { },
4326*4882a593Smuzhiyun };
4327*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, rt5659_of_match);
4328*4882a593Smuzhiyun #endif
4329*4882a593Smuzhiyun
4330*4882a593Smuzhiyun #ifdef CONFIG_ACPI
4331*4882a593Smuzhiyun static const struct acpi_device_id rt5659_acpi_match[] = {
4332*4882a593Smuzhiyun { "10EC5658", 0, },
4333*4882a593Smuzhiyun { "10EC5659", 0, },
4334*4882a593Smuzhiyun { },
4335*4882a593Smuzhiyun };
4336*4882a593Smuzhiyun MODULE_DEVICE_TABLE(acpi, rt5659_acpi_match);
4337*4882a593Smuzhiyun #endif
4338*4882a593Smuzhiyun
4339*4882a593Smuzhiyun static struct i2c_driver rt5659_i2c_driver = {
4340*4882a593Smuzhiyun .driver = {
4341*4882a593Smuzhiyun .name = "rt5659",
4342*4882a593Smuzhiyun .of_match_table = of_match_ptr(rt5659_of_match),
4343*4882a593Smuzhiyun .acpi_match_table = ACPI_PTR(rt5659_acpi_match),
4344*4882a593Smuzhiyun },
4345*4882a593Smuzhiyun .probe = rt5659_i2c_probe,
4346*4882a593Smuzhiyun .shutdown = rt5659_i2c_shutdown,
4347*4882a593Smuzhiyun .id_table = rt5659_i2c_id,
4348*4882a593Smuzhiyun };
4349*4882a593Smuzhiyun module_i2c_driver(rt5659_i2c_driver);
4350*4882a593Smuzhiyun
4351*4882a593Smuzhiyun MODULE_DESCRIPTION("ASoC RT5659 driver");
4352*4882a593Smuzhiyun MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
4353*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
4354