xref: /openbmc/linux/sound/soc/codecs/rt5665.c (revision 8ec35236)
1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
233ada14aSBard Liao /*
333ada14aSBard Liao  * rt5665.c  --  RT5665/RT5658 ALSA SoC audio codec driver
433ada14aSBard Liao  *
533ada14aSBard Liao  * Copyright 2016 Realtek Semiconductor Corp.
633ada14aSBard Liao  * Author: Bard Liao <bardliao@realtek.com>
733ada14aSBard Liao  */
833ada14aSBard Liao 
933ada14aSBard Liao #include <linux/module.h>
1033ada14aSBard Liao #include <linux/moduleparam.h>
1133ada14aSBard Liao #include <linux/init.h>
1233ada14aSBard Liao #include <linux/delay.h>
1333ada14aSBard Liao #include <linux/pm.h>
1433ada14aSBard Liao #include <linux/i2c.h>
1533ada14aSBard Liao #include <linux/platform_device.h>
1633ada14aSBard Liao #include <linux/spi/spi.h>
1733ada14aSBard Liao #include <linux/acpi.h>
1833ada14aSBard Liao #include <linux/gpio.h>
1933ada14aSBard Liao #include <linux/of_gpio.h>
2033ada14aSBard Liao #include <linux/regulator/consumer.h>
2133ada14aSBard Liao #include <linux/mutex.h>
2233ada14aSBard Liao #include <sound/core.h>
2333ada14aSBard Liao #include <sound/pcm.h>
2433ada14aSBard Liao #include <sound/pcm_params.h>
2533ada14aSBard Liao #include <sound/jack.h>
2633ada14aSBard Liao #include <sound/soc.h>
2733ada14aSBard Liao #include <sound/soc-dapm.h>
2833ada14aSBard Liao #include <sound/initval.h>
2933ada14aSBard Liao #include <sound/tlv.h>
3033ada14aSBard Liao #include <sound/rt5665.h>
3133ada14aSBard Liao 
3233ada14aSBard Liao #include "rl6231.h"
3333ada14aSBard Liao #include "rt5665.h"
3433ada14aSBard Liao 
3533ada14aSBard Liao #define RT5665_NUM_SUPPLIES 3
3633ada14aSBard Liao 
3733ada14aSBard Liao static const char *rt5665_supply_names[RT5665_NUM_SUPPLIES] = {
3833ada14aSBard Liao 	"AVDD",
3933ada14aSBard Liao 	"MICVDD",
4033ada14aSBard Liao 	"VBAT",
4133ada14aSBard Liao };
4233ada14aSBard Liao 
4333ada14aSBard Liao struct rt5665_priv {
44fab70c27SKuninori Morimoto 	struct snd_soc_component *component;
4533ada14aSBard Liao 	struct rt5665_platform_data pdata;
4633ada14aSBard Liao 	struct regmap *regmap;
4733ada14aSBard Liao 	struct gpio_desc *gpiod_ldo1_en;
4833ada14aSBard Liao 	struct gpio_desc *gpiod_reset;
4933ada14aSBard Liao 	struct snd_soc_jack *hs_jack;
5033ada14aSBard Liao 	struct regulator_bulk_data supplies[RT5665_NUM_SUPPLIES];
5133ada14aSBard Liao 	struct delayed_work jack_detect_work;
5233ada14aSBard Liao 	struct delayed_work calibrate_work;
5333ada14aSBard Liao 	struct delayed_work jd_check_work;
5433ada14aSBard Liao 	struct mutex calibrate_mutex;
5533ada14aSBard Liao 
5633ada14aSBard Liao 	int sysclk;
5733ada14aSBard Liao 	int sysclk_src;
5833ada14aSBard Liao 	int lrck[RT5665_AIFS];
5933ada14aSBard Liao 	int bclk[RT5665_AIFS];
6033ada14aSBard Liao 	int master[RT5665_AIFS];
6133ada14aSBard Liao 	int id;
6233ada14aSBard Liao 
6333ada14aSBard Liao 	int pll_src;
6433ada14aSBard Liao 	int pll_in;
6533ada14aSBard Liao 	int pll_out;
6633ada14aSBard Liao 
6733ada14aSBard Liao 	int jack_type;
6833ada14aSBard Liao 	int irq_work_delay_time;
6933ada14aSBard Liao 	unsigned int sar_adc_value;
70b059ca72SBard Liao 	bool calibration_done;
7133ada14aSBard Liao };
7233ada14aSBard Liao 
7333ada14aSBard Liao static const struct reg_default rt5665_reg[] = {
7433ada14aSBard Liao 	{0x0000, 0x0000},
7533ada14aSBard Liao 	{0x0001, 0xc8c8},
7633ada14aSBard Liao 	{0x0002, 0x8080},
7733ada14aSBard Liao 	{0x0003, 0x8000},
7833ada14aSBard Liao 	{0x0004, 0xc80a},
7933ada14aSBard Liao 	{0x0005, 0x0000},
8033ada14aSBard Liao 	{0x0006, 0x0000},
8133ada14aSBard Liao 	{0x0007, 0x0000},
8233ada14aSBard Liao 	{0x000a, 0x0000},
8333ada14aSBard Liao 	{0x000b, 0x0000},
8433ada14aSBard Liao 	{0x000c, 0x0000},
8533ada14aSBard Liao 	{0x000d, 0x0000},
8633ada14aSBard Liao 	{0x000f, 0x0808},
8733ada14aSBard Liao 	{0x0010, 0x4040},
8833ada14aSBard Liao 	{0x0011, 0x0000},
8933ada14aSBard Liao 	{0x0012, 0x1404},
9033ada14aSBard Liao 	{0x0013, 0x1000},
9133ada14aSBard Liao 	{0x0014, 0xa00a},
9233ada14aSBard Liao 	{0x0015, 0x0404},
9333ada14aSBard Liao 	{0x0016, 0x0404},
9433ada14aSBard Liao 	{0x0017, 0x0011},
9533ada14aSBard Liao 	{0x0018, 0xafaf},
9633ada14aSBard Liao 	{0x0019, 0xafaf},
9733ada14aSBard Liao 	{0x001a, 0xafaf},
9833ada14aSBard Liao 	{0x001b, 0x0011},
9933ada14aSBard Liao 	{0x001c, 0x2f2f},
10033ada14aSBard Liao 	{0x001d, 0x2f2f},
10133ada14aSBard Liao 	{0x001e, 0x2f2f},
10233ada14aSBard Liao 	{0x001f, 0x0000},
10333ada14aSBard Liao 	{0x0020, 0x0000},
10433ada14aSBard Liao 	{0x0021, 0x0000},
10533ada14aSBard Liao 	{0x0022, 0x5757},
10633ada14aSBard Liao 	{0x0023, 0x0039},
10733ada14aSBard Liao 	{0x0026, 0xc0c0},
10833ada14aSBard Liao 	{0x0027, 0xc0c0},
10933ada14aSBard Liao 	{0x0028, 0xc0c0},
11033ada14aSBard Liao 	{0x0029, 0x8080},
11133ada14aSBard Liao 	{0x002a, 0xaaaa},
11233ada14aSBard Liao 	{0x002b, 0xaaaa},
11333ada14aSBard Liao 	{0x002c, 0xaba8},
11433ada14aSBard Liao 	{0x002d, 0x0000},
11533ada14aSBard Liao 	{0x002e, 0x0000},
11633ada14aSBard Liao 	{0x002f, 0x0000},
11733ada14aSBard Liao 	{0x0030, 0x0000},
11833ada14aSBard Liao 	{0x0031, 0x5000},
11933ada14aSBard Liao 	{0x0032, 0x0000},
12033ada14aSBard Liao 	{0x0033, 0x0000},
12133ada14aSBard Liao 	{0x0034, 0x0000},
12233ada14aSBard Liao 	{0x0035, 0x0000},
12333ada14aSBard Liao 	{0x003a, 0x0000},
12433ada14aSBard Liao 	{0x003b, 0x0000},
12533ada14aSBard Liao 	{0x003c, 0x00ff},
12633ada14aSBard Liao 	{0x003d, 0x0000},
12733ada14aSBard Liao 	{0x003e, 0x00ff},
12833ada14aSBard Liao 	{0x003f, 0x0000},
12933ada14aSBard Liao 	{0x0040, 0x0000},
13033ada14aSBard Liao 	{0x0041, 0x00ff},
13133ada14aSBard Liao 	{0x0042, 0x0000},
13233ada14aSBard Liao 	{0x0043, 0x00ff},
13333ada14aSBard Liao 	{0x0044, 0x0c0c},
13433ada14aSBard Liao 	{0x0049, 0xc00b},
13533ada14aSBard Liao 	{0x004a, 0x0000},
13633ada14aSBard Liao 	{0x004b, 0x031f},
13733ada14aSBard Liao 	{0x004d, 0x0000},
13833ada14aSBard Liao 	{0x004e, 0x001f},
13933ada14aSBard Liao 	{0x004f, 0x0000},
14033ada14aSBard Liao 	{0x0050, 0x001f},
14133ada14aSBard Liao 	{0x0052, 0xf000},
14233ada14aSBard Liao 	{0x0061, 0x0000},
14333ada14aSBard Liao 	{0x0062, 0x0000},
14433ada14aSBard Liao 	{0x0063, 0x003e},
14533ada14aSBard Liao 	{0x0064, 0x0000},
14633ada14aSBard Liao 	{0x0065, 0x0000},
14733ada14aSBard Liao 	{0x0066, 0x003f},
14833ada14aSBard Liao 	{0x0067, 0x0000},
14933ada14aSBard Liao 	{0x006b, 0x0000},
15033ada14aSBard Liao 	{0x006d, 0xff00},
15133ada14aSBard Liao 	{0x006e, 0x2808},
15233ada14aSBard Liao 	{0x006f, 0x000a},
15333ada14aSBard Liao 	{0x0070, 0x8000},
15433ada14aSBard Liao 	{0x0071, 0x8000},
15533ada14aSBard Liao 	{0x0072, 0x8000},
15633ada14aSBard Liao 	{0x0073, 0x7000},
15733ada14aSBard Liao 	{0x0074, 0x7770},
15833ada14aSBard Liao 	{0x0075, 0x0002},
15933ada14aSBard Liao 	{0x0076, 0x0001},
16033ada14aSBard Liao 	{0x0078, 0x00f0},
16133ada14aSBard Liao 	{0x0079, 0x0000},
16233ada14aSBard Liao 	{0x007a, 0x0000},
16333ada14aSBard Liao 	{0x007b, 0x0000},
16433ada14aSBard Liao 	{0x007c, 0x0000},
16533ada14aSBard Liao 	{0x007d, 0x0123},
16633ada14aSBard Liao 	{0x007e, 0x4500},
16733ada14aSBard Liao 	{0x007f, 0x8003},
16833ada14aSBard Liao 	{0x0080, 0x0000},
16933ada14aSBard Liao 	{0x0081, 0x0000},
17033ada14aSBard Liao 	{0x0082, 0x0000},
17133ada14aSBard Liao 	{0x0083, 0x0000},
17233ada14aSBard Liao 	{0x0084, 0x0000},
17333ada14aSBard Liao 	{0x0085, 0x0000},
17433ada14aSBard Liao 	{0x0086, 0x0008},
17533ada14aSBard Liao 	{0x0087, 0x0000},
17633ada14aSBard Liao 	{0x0088, 0x0000},
17733ada14aSBard Liao 	{0x0089, 0x0000},
17833ada14aSBard Liao 	{0x008a, 0x0000},
17933ada14aSBard Liao 	{0x008b, 0x0000},
18033ada14aSBard Liao 	{0x008c, 0x0003},
18133ada14aSBard Liao 	{0x008e, 0x0060},
18233ada14aSBard Liao 	{0x008f, 0x1000},
18333ada14aSBard Liao 	{0x0091, 0x0c26},
18433ada14aSBard Liao 	{0x0092, 0x0073},
18533ada14aSBard Liao 	{0x0093, 0x0000},
18633ada14aSBard Liao 	{0x0094, 0x0080},
18733ada14aSBard Liao 	{0x0098, 0x0000},
18833ada14aSBard Liao 	{0x0099, 0x0000},
18933ada14aSBard Liao 	{0x009a, 0x0007},
19033ada14aSBard Liao 	{0x009f, 0x0000},
19133ada14aSBard Liao 	{0x00a0, 0x0000},
19233ada14aSBard Liao 	{0x00a1, 0x0002},
19333ada14aSBard Liao 	{0x00a2, 0x0001},
19433ada14aSBard Liao 	{0x00a3, 0x0002},
19533ada14aSBard Liao 	{0x00a4, 0x0001},
19633ada14aSBard Liao 	{0x00ae, 0x2040},
19733ada14aSBard Liao 	{0x00af, 0x0000},
19833ada14aSBard Liao 	{0x00b6, 0x0000},
19933ada14aSBard Liao 	{0x00b7, 0x0000},
20033ada14aSBard Liao 	{0x00b8, 0x0000},
20133ada14aSBard Liao 	{0x00b9, 0x0000},
20233ada14aSBard Liao 	{0x00ba, 0x0002},
20333ada14aSBard Liao 	{0x00bb, 0x0000},
20433ada14aSBard Liao 	{0x00be, 0x0000},
20533ada14aSBard Liao 	{0x00c0, 0x0000},
20633ada14aSBard Liao 	{0x00c1, 0x0aaa},
20733ada14aSBard Liao 	{0x00c2, 0xaa80},
20833ada14aSBard Liao 	{0x00c3, 0x0003},
20933ada14aSBard Liao 	{0x00c4, 0x0000},
21033ada14aSBard Liao 	{0x00d0, 0x0000},
21133ada14aSBard Liao 	{0x00d1, 0x2244},
21233ada14aSBard Liao 	{0x00d3, 0x3300},
21333ada14aSBard Liao 	{0x00d4, 0x2200},
21433ada14aSBard Liao 	{0x00d9, 0x0809},
21533ada14aSBard Liao 	{0x00da, 0x0000},
21633ada14aSBard Liao 	{0x00db, 0x0008},
21733ada14aSBard Liao 	{0x00dc, 0x00c0},
21833ada14aSBard Liao 	{0x00dd, 0x6724},
21933ada14aSBard Liao 	{0x00de, 0x3131},
22033ada14aSBard Liao 	{0x00df, 0x0008},
22133ada14aSBard Liao 	{0x00e0, 0x4000},
22233ada14aSBard Liao 	{0x00e1, 0x3131},
22333ada14aSBard Liao 	{0x00e2, 0x600c},
22433ada14aSBard Liao 	{0x00ea, 0xb320},
22533ada14aSBard Liao 	{0x00eb, 0x0000},
22633ada14aSBard Liao 	{0x00ec, 0xb300},
22733ada14aSBard Liao 	{0x00ed, 0x0000},
22833ada14aSBard Liao 	{0x00ee, 0xb320},
22933ada14aSBard Liao 	{0x00ef, 0x0000},
23033ada14aSBard Liao 	{0x00f0, 0x0201},
23133ada14aSBard Liao 	{0x00f1, 0x0ddd},
23233ada14aSBard Liao 	{0x00f2, 0x0ddd},
23333ada14aSBard Liao 	{0x00f6, 0x0000},
23433ada14aSBard Liao 	{0x00f7, 0x0000},
23533ada14aSBard Liao 	{0x00f8, 0x0000},
23633ada14aSBard Liao 	{0x00fa, 0x0000},
23733ada14aSBard Liao 	{0x00fb, 0x0000},
23833ada14aSBard Liao 	{0x00fc, 0x0000},
23933ada14aSBard Liao 	{0x00fd, 0x0000},
24033ada14aSBard Liao 	{0x00fe, 0x10ec},
24133ada14aSBard Liao 	{0x00ff, 0x6451},
24233ada14aSBard Liao 	{0x0100, 0xaaaa},
24333ada14aSBard Liao 	{0x0101, 0x000a},
24433ada14aSBard Liao 	{0x010a, 0xaaaa},
24533ada14aSBard Liao 	{0x010b, 0xa0a0},
24633ada14aSBard Liao 	{0x010c, 0xaeae},
24733ada14aSBard Liao 	{0x010d, 0xaaaa},
24833ada14aSBard Liao 	{0x010e, 0xaaaa},
24933ada14aSBard Liao 	{0x010f, 0xaaaa},
25033ada14aSBard Liao 	{0x0110, 0xe002},
25133ada14aSBard Liao 	{0x0111, 0xa402},
25233ada14aSBard Liao 	{0x0112, 0xaaaa},
25333ada14aSBard Liao 	{0x0113, 0x2000},
25433ada14aSBard Liao 	{0x0117, 0x0f00},
25533ada14aSBard Liao 	{0x0125, 0x0410},
25633ada14aSBard Liao 	{0x0132, 0x0000},
25733ada14aSBard Liao 	{0x0133, 0x0000},
25833ada14aSBard Liao 	{0x0137, 0x5540},
25933ada14aSBard Liao 	{0x0138, 0x3700},
26033ada14aSBard Liao 	{0x0139, 0x79a1},
26133ada14aSBard Liao 	{0x013a, 0x2020},
26233ada14aSBard Liao 	{0x013b, 0x2020},
26333ada14aSBard Liao 	{0x013c, 0x2005},
26433ada14aSBard Liao 	{0x013f, 0x0000},
26533ada14aSBard Liao 	{0x0145, 0x0002},
26633ada14aSBard Liao 	{0x0146, 0x0000},
26733ada14aSBard Liao 	{0x0147, 0x0000},
26833ada14aSBard Liao 	{0x0148, 0x0000},
26933ada14aSBard Liao 	{0x0150, 0x0000},
27033ada14aSBard Liao 	{0x0160, 0x4eff},
27133ada14aSBard Liao 	{0x0161, 0x0080},
27233ada14aSBard Liao 	{0x0162, 0x0200},
27333ada14aSBard Liao 	{0x0163, 0x0800},
27433ada14aSBard Liao 	{0x0164, 0x0000},
27533ada14aSBard Liao 	{0x0165, 0x0000},
27633ada14aSBard Liao 	{0x0166, 0x0000},
27733ada14aSBard Liao 	{0x0167, 0x000f},
27833ada14aSBard Liao 	{0x0170, 0x4e87},
27933ada14aSBard Liao 	{0x0171, 0x0080},
28033ada14aSBard Liao 	{0x0172, 0x0200},
28133ada14aSBard Liao 	{0x0173, 0x0800},
28233ada14aSBard Liao 	{0x0174, 0x00ff},
28333ada14aSBard Liao 	{0x0175, 0x0000},
28433ada14aSBard Liao 	{0x0190, 0x413d},
28533ada14aSBard Liao 	{0x0191, 0x4139},
28633ada14aSBard Liao 	{0x0192, 0x4135},
28733ada14aSBard Liao 	{0x0193, 0x413d},
28833ada14aSBard Liao 	{0x0194, 0x0000},
28933ada14aSBard Liao 	{0x0195, 0x0000},
29033ada14aSBard Liao 	{0x0196, 0x0000},
29133ada14aSBard Liao 	{0x0197, 0x0000},
29233ada14aSBard Liao 	{0x0198, 0x0000},
29333ada14aSBard Liao 	{0x0199, 0x0000},
29433ada14aSBard Liao 	{0x01a0, 0x1e64},
29533ada14aSBard Liao 	{0x01a1, 0x06a3},
29633ada14aSBard Liao 	{0x01a2, 0x0000},
29733ada14aSBard Liao 	{0x01a3, 0x0000},
29833ada14aSBard Liao 	{0x01a4, 0x0000},
29933ada14aSBard Liao 	{0x01a5, 0x0000},
30033ada14aSBard Liao 	{0x01a6, 0x0000},
30133ada14aSBard Liao 	{0x01a7, 0x8000},
30233ada14aSBard Liao 	{0x01a8, 0x0000},
30333ada14aSBard Liao 	{0x01a9, 0x0000},
30433ada14aSBard Liao 	{0x01aa, 0x0000},
30533ada14aSBard Liao 	{0x01ab, 0x0000},
30633ada14aSBard Liao 	{0x01b5, 0x0000},
30733ada14aSBard Liao 	{0x01b6, 0x01c3},
30833ada14aSBard Liao 	{0x01b7, 0x02a0},
30933ada14aSBard Liao 	{0x01b8, 0x03e9},
31033ada14aSBard Liao 	{0x01b9, 0x1389},
31133ada14aSBard Liao 	{0x01ba, 0xc351},
31233ada14aSBard Liao 	{0x01bb, 0x0009},
31333ada14aSBard Liao 	{0x01bc, 0x0018},
31433ada14aSBard Liao 	{0x01bd, 0x002a},
31533ada14aSBard Liao 	{0x01be, 0x004c},
31633ada14aSBard Liao 	{0x01bf, 0x0097},
31733ada14aSBard Liao 	{0x01c0, 0x433d},
31833ada14aSBard Liao 	{0x01c1, 0x0000},
31933ada14aSBard Liao 	{0x01c2, 0x0000},
32033ada14aSBard Liao 	{0x01c3, 0x0000},
32133ada14aSBard Liao 	{0x01c4, 0x0000},
32233ada14aSBard Liao 	{0x01c5, 0x0000},
32333ada14aSBard Liao 	{0x01c6, 0x0000},
32433ada14aSBard Liao 	{0x01c7, 0x0000},
32533ada14aSBard Liao 	{0x01c8, 0x40af},
32633ada14aSBard Liao 	{0x01c9, 0x0702},
32733ada14aSBard Liao 	{0x01ca, 0x0000},
32833ada14aSBard Liao 	{0x01cb, 0x0000},
32933ada14aSBard Liao 	{0x01cc, 0x5757},
33033ada14aSBard Liao 	{0x01cd, 0x5757},
33133ada14aSBard Liao 	{0x01ce, 0x5757},
33233ada14aSBard Liao 	{0x01cf, 0x5757},
33333ada14aSBard Liao 	{0x01d0, 0x5757},
33433ada14aSBard Liao 	{0x01d1, 0x5757},
33533ada14aSBard Liao 	{0x01d2, 0x5757},
33633ada14aSBard Liao 	{0x01d3, 0x5757},
33733ada14aSBard Liao 	{0x01d4, 0x5757},
33833ada14aSBard Liao 	{0x01d5, 0x5757},
33933ada14aSBard Liao 	{0x01d6, 0x003c},
34033ada14aSBard Liao 	{0x01da, 0x0000},
34133ada14aSBard Liao 	{0x01db, 0x0000},
34233ada14aSBard Liao 	{0x01dc, 0x0000},
34333ada14aSBard Liao 	{0x01de, 0x7c00},
34433ada14aSBard Liao 	{0x01df, 0x0320},
34533ada14aSBard Liao 	{0x01e0, 0x06a1},
34633ada14aSBard Liao 	{0x01e1, 0x0000},
34733ada14aSBard Liao 	{0x01e2, 0x0000},
34833ada14aSBard Liao 	{0x01e3, 0x0000},
34933ada14aSBard Liao 	{0x01e4, 0x0000},
35033ada14aSBard Liao 	{0x01e6, 0x0001},
35133ada14aSBard Liao 	{0x01e7, 0x0000},
35233ada14aSBard Liao 	{0x01e8, 0x0000},
35333ada14aSBard Liao 	{0x01ea, 0xbf3f},
35433ada14aSBard Liao 	{0x01eb, 0x0000},
35533ada14aSBard Liao 	{0x01ec, 0x0000},
35633ada14aSBard Liao 	{0x01ed, 0x0000},
35733ada14aSBard Liao 	{0x01ee, 0x0000},
35833ada14aSBard Liao 	{0x01ef, 0x0000},
35933ada14aSBard Liao 	{0x01f0, 0x0000},
36033ada14aSBard Liao 	{0x01f1, 0x0000},
36133ada14aSBard Liao 	{0x01f2, 0x0000},
36233ada14aSBard Liao 	{0x01f3, 0x0000},
36333ada14aSBard Liao 	{0x01f4, 0x0000},
36433ada14aSBard Liao 	{0x0200, 0x0000},
36533ada14aSBard Liao 	{0x0201, 0x0000},
36633ada14aSBard Liao 	{0x0202, 0x0000},
36733ada14aSBard Liao 	{0x0203, 0x0000},
36833ada14aSBard Liao 	{0x0204, 0x0000},
36933ada14aSBard Liao 	{0x0205, 0x0000},
37033ada14aSBard Liao 	{0x0206, 0x0000},
37133ada14aSBard Liao 	{0x0207, 0x0000},
37233ada14aSBard Liao 	{0x0208, 0x0000},
37333ada14aSBard Liao 	{0x0210, 0x60b1},
37433ada14aSBard Liao 	{0x0211, 0xa005},
37533ada14aSBard Liao 	{0x0212, 0x024c},
37633ada14aSBard Liao 	{0x0213, 0xf7ff},
37733ada14aSBard Liao 	{0x0214, 0x024c},
37833ada14aSBard Liao 	{0x0215, 0x0102},
37933ada14aSBard Liao 	{0x0216, 0x00a3},
38033ada14aSBard Liao 	{0x0217, 0x0048},
38133ada14aSBard Liao 	{0x0218, 0xa2c0},
38233ada14aSBard Liao 	{0x0219, 0x0400},
38333ada14aSBard Liao 	{0x021a, 0x00c8},
38433ada14aSBard Liao 	{0x021b, 0x00c0},
38533ada14aSBard Liao 	{0x02ff, 0x0110},
38633ada14aSBard Liao 	{0x0300, 0x001f},
38733ada14aSBard Liao 	{0x0301, 0x032c},
38833ada14aSBard Liao 	{0x0302, 0x5f21},
38933ada14aSBard Liao 	{0x0303, 0x4000},
39033ada14aSBard Liao 	{0x0304, 0x4000},
39133ada14aSBard Liao 	{0x0305, 0x06d5},
39233ada14aSBard Liao 	{0x0306, 0x8000},
39333ada14aSBard Liao 	{0x0307, 0x0700},
39433ada14aSBard Liao 	{0x0310, 0x4560},
39533ada14aSBard Liao 	{0x0311, 0xa4a8},
39633ada14aSBard Liao 	{0x0312, 0x7418},
39733ada14aSBard Liao 	{0x0313, 0x0000},
39833ada14aSBard Liao 	{0x0314, 0x0006},
39933ada14aSBard Liao 	{0x0315, 0xffff},
40033ada14aSBard Liao 	{0x0316, 0xc400},
40133ada14aSBard Liao 	{0x0317, 0x0000},
40233ada14aSBard Liao 	{0x0330, 0x00a6},
40333ada14aSBard Liao 	{0x0331, 0x04c3},
40433ada14aSBard Liao 	{0x0332, 0x27c8},
40533ada14aSBard Liao 	{0x0333, 0xbf50},
40633ada14aSBard Liao 	{0x0334, 0x0045},
40733ada14aSBard Liao 	{0x0335, 0x0007},
40833ada14aSBard Liao 	{0x0336, 0x7418},
40933ada14aSBard Liao 	{0x0337, 0x0501},
41033ada14aSBard Liao 	{0x0338, 0x0000},
41133ada14aSBard Liao 	{0x0339, 0x0010},
41233ada14aSBard Liao 	{0x033a, 0x1010},
41333ada14aSBard Liao 	{0x03c0, 0x7e00},
41433ada14aSBard Liao 	{0x03c1, 0x8000},
41533ada14aSBard Liao 	{0x03c2, 0x8000},
41633ada14aSBard Liao 	{0x03c3, 0x8000},
41733ada14aSBard Liao 	{0x03c4, 0x8000},
41833ada14aSBard Liao 	{0x03c5, 0x8000},
41933ada14aSBard Liao 	{0x03c6, 0x8000},
42033ada14aSBard Liao 	{0x03c7, 0x8000},
42133ada14aSBard Liao 	{0x03c8, 0x8000},
42233ada14aSBard Liao 	{0x03c9, 0x8000},
42333ada14aSBard Liao 	{0x03ca, 0x8000},
42433ada14aSBard Liao 	{0x03cb, 0x8000},
42533ada14aSBard Liao 	{0x03cc, 0x8000},
42633ada14aSBard Liao 	{0x03d0, 0x0000},
42733ada14aSBard Liao 	{0x03d1, 0x0000},
42833ada14aSBard Liao 	{0x03d2, 0x0000},
42933ada14aSBard Liao 	{0x03d3, 0x0000},
43033ada14aSBard Liao 	{0x03d4, 0x2000},
43133ada14aSBard Liao 	{0x03d5, 0x2000},
43233ada14aSBard Liao 	{0x03d6, 0x0000},
43333ada14aSBard Liao 	{0x03d7, 0x0000},
43433ada14aSBard Liao 	{0x03d8, 0x2000},
43533ada14aSBard Liao 	{0x03d9, 0x2000},
43633ada14aSBard Liao 	{0x03da, 0x2000},
43733ada14aSBard Liao 	{0x03db, 0x2000},
43833ada14aSBard Liao 	{0x03dc, 0x0000},
43933ada14aSBard Liao 	{0x03dd, 0x0000},
44033ada14aSBard Liao 	{0x03de, 0x0000},
44133ada14aSBard Liao 	{0x03df, 0x2000},
44233ada14aSBard Liao 	{0x03e0, 0x0000},
44333ada14aSBard Liao 	{0x03e1, 0x0000},
44433ada14aSBard Liao 	{0x03e2, 0x0000},
44533ada14aSBard Liao 	{0x03e3, 0x0000},
44633ada14aSBard Liao 	{0x03e4, 0x0000},
44733ada14aSBard Liao 	{0x03e5, 0x0000},
44833ada14aSBard Liao 	{0x03e6, 0x0000},
44933ada14aSBard Liao 	{0x03e7, 0x0000},
45033ada14aSBard Liao 	{0x03e8, 0x0000},
45133ada14aSBard Liao 	{0x03e9, 0x0000},
45233ada14aSBard Liao 	{0x03ea, 0x0000},
45333ada14aSBard Liao 	{0x03eb, 0x0000},
45433ada14aSBard Liao 	{0x03ec, 0x0000},
45533ada14aSBard Liao 	{0x03ed, 0x0000},
45633ada14aSBard Liao 	{0x03ee, 0x0000},
45733ada14aSBard Liao 	{0x03ef, 0x0000},
45833ada14aSBard Liao 	{0x03f0, 0x0800},
45933ada14aSBard Liao 	{0x03f1, 0x0800},
46033ada14aSBard Liao 	{0x03f2, 0x0800},
46133ada14aSBard Liao 	{0x03f3, 0x0800},
46233ada14aSBard Liao };
46333ada14aSBard Liao 
46433ada14aSBard Liao static bool rt5665_volatile_register(struct device *dev, unsigned int reg)
46533ada14aSBard Liao {
46633ada14aSBard Liao 	switch (reg) {
46733ada14aSBard Liao 	case RT5665_RESET:
46833ada14aSBard Liao 	case RT5665_EJD_CTRL_2:
46933ada14aSBard Liao 	case RT5665_GPIO_STA:
47033ada14aSBard Liao 	case RT5665_INT_ST_1:
47133ada14aSBard Liao 	case RT5665_IL_CMD_1:
47233ada14aSBard Liao 	case RT5665_4BTN_IL_CMD_1:
47333ada14aSBard Liao 	case RT5665_PSV_IL_CMD_1:
47433ada14aSBard Liao 	case RT5665_AJD1_CTRL:
47533ada14aSBard Liao 	case RT5665_JD_CTRL_3:
47633ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_1:
47733ada14aSBard Liao 	case RT5665_SAR_IL_CMD_4:
47833ada14aSBard Liao 	case RT5665_DEVICE_ID:
47933ada14aSBard Liao 	case RT5665_STO1_DAC_SIL_DET ... RT5665_STO2_DAC_SIL_DET:
48033ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_STA1 ... RT5665_MONO_AMP_CALIB_STA6:
48133ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_12 ... RT5665_HP_IMP_SENS_CTRL_15:
48233ada14aSBard Liao 	case RT5665_HP_CALIB_STA_1 ... RT5665_HP_CALIB_STA_11:
48333ada14aSBard Liao 		return true;
48433ada14aSBard Liao 	default:
48533ada14aSBard Liao 		return false;
48633ada14aSBard Liao 	}
48733ada14aSBard Liao }
48833ada14aSBard Liao 
48933ada14aSBard Liao static bool rt5665_readable_register(struct device *dev, unsigned int reg)
49033ada14aSBard Liao {
49133ada14aSBard Liao 	switch (reg) {
49233ada14aSBard Liao 	case RT5665_RESET:
49333ada14aSBard Liao 	case RT5665_VENDOR_ID:
49433ada14aSBard Liao 	case RT5665_VENDOR_ID_1:
49533ada14aSBard Liao 	case RT5665_DEVICE_ID:
49633ada14aSBard Liao 	case RT5665_LOUT:
49733ada14aSBard Liao 	case RT5665_HP_CTRL_1:
49833ada14aSBard Liao 	case RT5665_HP_CTRL_2:
49933ada14aSBard Liao 	case RT5665_MONO_OUT:
50033ada14aSBard Liao 	case RT5665_HPL_GAIN:
50133ada14aSBard Liao 	case RT5665_HPR_GAIN:
50233ada14aSBard Liao 	case RT5665_MONO_GAIN:
50333ada14aSBard Liao 	case RT5665_CAL_BST_CTRL:
50433ada14aSBard Liao 	case RT5665_CBJ_BST_CTRL:
50533ada14aSBard Liao 	case RT5665_IN1_IN2:
50633ada14aSBard Liao 	case RT5665_IN3_IN4:
50733ada14aSBard Liao 	case RT5665_INL1_INR1_VOL:
50833ada14aSBard Liao 	case RT5665_EJD_CTRL_1:
50933ada14aSBard Liao 	case RT5665_EJD_CTRL_2:
51033ada14aSBard Liao 	case RT5665_EJD_CTRL_3:
51133ada14aSBard Liao 	case RT5665_EJD_CTRL_4:
51233ada14aSBard Liao 	case RT5665_EJD_CTRL_5:
51333ada14aSBard Liao 	case RT5665_EJD_CTRL_6:
51433ada14aSBard Liao 	case RT5665_EJD_CTRL_7:
51533ada14aSBard Liao 	case RT5665_DAC2_CTRL:
51633ada14aSBard Liao 	case RT5665_DAC2_DIG_VOL:
51733ada14aSBard Liao 	case RT5665_DAC1_DIG_VOL:
51833ada14aSBard Liao 	case RT5665_DAC3_DIG_VOL:
51933ada14aSBard Liao 	case RT5665_DAC3_CTRL:
52033ada14aSBard Liao 	case RT5665_STO1_ADC_DIG_VOL:
52133ada14aSBard Liao 	case RT5665_MONO_ADC_DIG_VOL:
52233ada14aSBard Liao 	case RT5665_STO2_ADC_DIG_VOL:
52333ada14aSBard Liao 	case RT5665_STO1_ADC_BOOST:
52433ada14aSBard Liao 	case RT5665_MONO_ADC_BOOST:
52533ada14aSBard Liao 	case RT5665_STO2_ADC_BOOST:
52633ada14aSBard Liao 	case RT5665_HP_IMP_GAIN_1:
52733ada14aSBard Liao 	case RT5665_HP_IMP_GAIN_2:
52833ada14aSBard Liao 	case RT5665_STO1_ADC_MIXER:
52933ada14aSBard Liao 	case RT5665_MONO_ADC_MIXER:
53033ada14aSBard Liao 	case RT5665_STO2_ADC_MIXER:
53133ada14aSBard Liao 	case RT5665_AD_DA_MIXER:
53233ada14aSBard Liao 	case RT5665_STO1_DAC_MIXER:
53333ada14aSBard Liao 	case RT5665_MONO_DAC_MIXER:
53433ada14aSBard Liao 	case RT5665_STO2_DAC_MIXER:
53533ada14aSBard Liao 	case RT5665_A_DAC1_MUX:
53633ada14aSBard Liao 	case RT5665_A_DAC2_MUX:
53733ada14aSBard Liao 	case RT5665_DIG_INF2_DATA:
53833ada14aSBard Liao 	case RT5665_DIG_INF3_DATA:
53933ada14aSBard Liao 	case RT5665_PDM_OUT_CTRL:
54033ada14aSBard Liao 	case RT5665_PDM_DATA_CTRL_1:
54133ada14aSBard Liao 	case RT5665_PDM_DATA_CTRL_2:
54233ada14aSBard Liao 	case RT5665_PDM_DATA_CTRL_3:
54333ada14aSBard Liao 	case RT5665_PDM_DATA_CTRL_4:
54433ada14aSBard Liao 	case RT5665_REC1_GAIN:
54533ada14aSBard Liao 	case RT5665_REC1_L1_MIXER:
54633ada14aSBard Liao 	case RT5665_REC1_L2_MIXER:
54733ada14aSBard Liao 	case RT5665_REC1_R1_MIXER:
54833ada14aSBard Liao 	case RT5665_REC1_R2_MIXER:
54933ada14aSBard Liao 	case RT5665_REC2_GAIN:
55033ada14aSBard Liao 	case RT5665_REC2_L1_MIXER:
55133ada14aSBard Liao 	case RT5665_REC2_L2_MIXER:
55233ada14aSBard Liao 	case RT5665_REC2_R1_MIXER:
55333ada14aSBard Liao 	case RT5665_REC2_R2_MIXER:
55433ada14aSBard Liao 	case RT5665_CAL_REC:
55533ada14aSBard Liao 	case RT5665_ALC_BACK_GAIN:
55633ada14aSBard Liao 	case RT5665_MONOMIX_GAIN:
55733ada14aSBard Liao 	case RT5665_MONOMIX_IN_GAIN:
55833ada14aSBard Liao 	case RT5665_OUT_L_GAIN:
55933ada14aSBard Liao 	case RT5665_OUT_L_MIXER:
56033ada14aSBard Liao 	case RT5665_OUT_R_GAIN:
56133ada14aSBard Liao 	case RT5665_OUT_R_MIXER:
56233ada14aSBard Liao 	case RT5665_LOUT_MIXER:
56333ada14aSBard Liao 	case RT5665_PWR_DIG_1:
56433ada14aSBard Liao 	case RT5665_PWR_DIG_2:
56533ada14aSBard Liao 	case RT5665_PWR_ANLG_1:
56633ada14aSBard Liao 	case RT5665_PWR_ANLG_2:
56733ada14aSBard Liao 	case RT5665_PWR_ANLG_3:
56833ada14aSBard Liao 	case RT5665_PWR_MIXER:
56933ada14aSBard Liao 	case RT5665_PWR_VOL:
57033ada14aSBard Liao 	case RT5665_CLK_DET:
57133ada14aSBard Liao 	case RT5665_HPF_CTRL1:
57233ada14aSBard Liao 	case RT5665_DMIC_CTRL_1:
57333ada14aSBard Liao 	case RT5665_DMIC_CTRL_2:
57433ada14aSBard Liao 	case RT5665_I2S1_SDP:
57533ada14aSBard Liao 	case RT5665_I2S2_SDP:
57633ada14aSBard Liao 	case RT5665_I2S3_SDP:
57733ada14aSBard Liao 	case RT5665_ADDA_CLK_1:
57833ada14aSBard Liao 	case RT5665_ADDA_CLK_2:
57933ada14aSBard Liao 	case RT5665_I2S1_F_DIV_CTRL_1:
58033ada14aSBard Liao 	case RT5665_I2S1_F_DIV_CTRL_2:
58133ada14aSBard Liao 	case RT5665_TDM_CTRL_1:
58233ada14aSBard Liao 	case RT5665_TDM_CTRL_2:
58333ada14aSBard Liao 	case RT5665_TDM_CTRL_3:
58433ada14aSBard Liao 	case RT5665_TDM_CTRL_4:
58533ada14aSBard Liao 	case RT5665_TDM_CTRL_5:
58633ada14aSBard Liao 	case RT5665_TDM_CTRL_6:
58733ada14aSBard Liao 	case RT5665_TDM_CTRL_7:
58833ada14aSBard Liao 	case RT5665_TDM_CTRL_8:
58933ada14aSBard Liao 	case RT5665_GLB_CLK:
59033ada14aSBard Liao 	case RT5665_PLL_CTRL_1:
59133ada14aSBard Liao 	case RT5665_PLL_CTRL_2:
59233ada14aSBard Liao 	case RT5665_ASRC_1:
59333ada14aSBard Liao 	case RT5665_ASRC_2:
59433ada14aSBard Liao 	case RT5665_ASRC_3:
59533ada14aSBard Liao 	case RT5665_ASRC_4:
59633ada14aSBard Liao 	case RT5665_ASRC_5:
59733ada14aSBard Liao 	case RT5665_ASRC_6:
59833ada14aSBard Liao 	case RT5665_ASRC_7:
59933ada14aSBard Liao 	case RT5665_ASRC_8:
60033ada14aSBard Liao 	case RT5665_ASRC_9:
60133ada14aSBard Liao 	case RT5665_ASRC_10:
60233ada14aSBard Liao 	case RT5665_DEPOP_1:
60333ada14aSBard Liao 	case RT5665_DEPOP_2:
60433ada14aSBard Liao 	case RT5665_HP_CHARGE_PUMP_1:
60533ada14aSBard Liao 	case RT5665_HP_CHARGE_PUMP_2:
60633ada14aSBard Liao 	case RT5665_MICBIAS_1:
60733ada14aSBard Liao 	case RT5665_MICBIAS_2:
60833ada14aSBard Liao 	case RT5665_ASRC_12:
60933ada14aSBard Liao 	case RT5665_ASRC_13:
61033ada14aSBard Liao 	case RT5665_ASRC_14:
61133ada14aSBard Liao 	case RT5665_RC_CLK_CTRL:
61233ada14aSBard Liao 	case RT5665_I2S_M_CLK_CTRL_1:
61333ada14aSBard Liao 	case RT5665_I2S2_F_DIV_CTRL_1:
61433ada14aSBard Liao 	case RT5665_I2S2_F_DIV_CTRL_2:
61533ada14aSBard Liao 	case RT5665_I2S3_F_DIV_CTRL_1:
61633ada14aSBard Liao 	case RT5665_I2S3_F_DIV_CTRL_2:
61733ada14aSBard Liao 	case RT5665_EQ_CTRL_1:
61833ada14aSBard Liao 	case RT5665_EQ_CTRL_2:
61933ada14aSBard Liao 	case RT5665_IRQ_CTRL_1:
62033ada14aSBard Liao 	case RT5665_IRQ_CTRL_2:
62133ada14aSBard Liao 	case RT5665_IRQ_CTRL_3:
62233ada14aSBard Liao 	case RT5665_IRQ_CTRL_4:
62333ada14aSBard Liao 	case RT5665_IRQ_CTRL_5:
62433ada14aSBard Liao 	case RT5665_IRQ_CTRL_6:
62533ada14aSBard Liao 	case RT5665_INT_ST_1:
62633ada14aSBard Liao 	case RT5665_GPIO_CTRL_1:
62733ada14aSBard Liao 	case RT5665_GPIO_CTRL_2:
62833ada14aSBard Liao 	case RT5665_GPIO_CTRL_3:
62933ada14aSBard Liao 	case RT5665_GPIO_CTRL_4:
63033ada14aSBard Liao 	case RT5665_GPIO_STA:
63133ada14aSBard Liao 	case RT5665_HP_AMP_DET_CTRL_1:
63233ada14aSBard Liao 	case RT5665_HP_AMP_DET_CTRL_2:
63333ada14aSBard Liao 	case RT5665_MID_HP_AMP_DET:
63433ada14aSBard Liao 	case RT5665_LOW_HP_AMP_DET:
63533ada14aSBard Liao 	case RT5665_SV_ZCD_1:
63633ada14aSBard Liao 	case RT5665_SV_ZCD_2:
63733ada14aSBard Liao 	case RT5665_IL_CMD_1:
63833ada14aSBard Liao 	case RT5665_IL_CMD_2:
63933ada14aSBard Liao 	case RT5665_IL_CMD_3:
64033ada14aSBard Liao 	case RT5665_IL_CMD_4:
64133ada14aSBard Liao 	case RT5665_4BTN_IL_CMD_1:
64233ada14aSBard Liao 	case RT5665_4BTN_IL_CMD_2:
64333ada14aSBard Liao 	case RT5665_4BTN_IL_CMD_3:
64433ada14aSBard Liao 	case RT5665_PSV_IL_CMD_1:
64533ada14aSBard Liao 	case RT5665_ADC_STO1_HP_CTRL_1:
64633ada14aSBard Liao 	case RT5665_ADC_STO1_HP_CTRL_2:
64733ada14aSBard Liao 	case RT5665_ADC_MONO_HP_CTRL_1:
64833ada14aSBard Liao 	case RT5665_ADC_MONO_HP_CTRL_2:
64933ada14aSBard Liao 	case RT5665_ADC_STO2_HP_CTRL_1:
65033ada14aSBard Liao 	case RT5665_ADC_STO2_HP_CTRL_2:
65133ada14aSBard Liao 	case RT5665_AJD1_CTRL:
65233ada14aSBard Liao 	case RT5665_JD1_THD:
65333ada14aSBard Liao 	case RT5665_JD2_THD:
65433ada14aSBard Liao 	case RT5665_JD_CTRL_1:
65533ada14aSBard Liao 	case RT5665_JD_CTRL_2:
65633ada14aSBard Liao 	case RT5665_JD_CTRL_3:
65733ada14aSBard Liao 	case RT5665_DIG_MISC:
65833ada14aSBard Liao 	case RT5665_DUMMY_2:
65933ada14aSBard Liao 	case RT5665_DUMMY_3:
66033ada14aSBard Liao 	case RT5665_DAC_ADC_DIG_VOL1:
66133ada14aSBard Liao 	case RT5665_DAC_ADC_DIG_VOL2:
66233ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_1:
66333ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_2:
66433ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_3:
66533ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_4:
66633ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_5:
66733ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_6:
66833ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_7:
66933ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_8:
67033ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_9:
67133ada14aSBard Liao 	case RT5665_BIAS_CUR_CTRL_10:
67233ada14aSBard Liao 	case RT5665_VREF_REC_OP_FB_CAP_CTRL:
67333ada14aSBard Liao 	case RT5665_CHARGE_PUMP_1:
67433ada14aSBard Liao 	case RT5665_DIG_IN_CTRL_1:
67533ada14aSBard Liao 	case RT5665_DIG_IN_CTRL_2:
67633ada14aSBard Liao 	case RT5665_PAD_DRIVING_CTRL:
67733ada14aSBard Liao 	case RT5665_SOFT_RAMP_DEPOP:
67833ada14aSBard Liao 	case RT5665_PLL:
67933ada14aSBard Liao 	case RT5665_CHOP_DAC:
68033ada14aSBard Liao 	case RT5665_CHOP_ADC:
68133ada14aSBard Liao 	case RT5665_CALIB_ADC_CTRL:
68233ada14aSBard Liao 	case RT5665_VOL_TEST:
68333ada14aSBard Liao 	case RT5665_TEST_MODE_CTRL_1:
68433ada14aSBard Liao 	case RT5665_TEST_MODE_CTRL_2:
68533ada14aSBard Liao 	case RT5665_TEST_MODE_CTRL_3:
68633ada14aSBard Liao 	case RT5665_TEST_MODE_CTRL_4:
68733ada14aSBard Liao 	case RT5665_BASSBACK_CTRL:
68833ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_1:
68933ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_2:
69033ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_3:
69133ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_4:
69233ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_5:
69333ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_6:
69433ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_7:
69533ada14aSBard Liao 	case RT5665_STO_NG2_CTRL_8:
69633ada14aSBard Liao 	case RT5665_MONO_NG2_CTRL_1:
69733ada14aSBard Liao 	case RT5665_MONO_NG2_CTRL_2:
69833ada14aSBard Liao 	case RT5665_MONO_NG2_CTRL_3:
69933ada14aSBard Liao 	case RT5665_MONO_NG2_CTRL_4:
70033ada14aSBard Liao 	case RT5665_MONO_NG2_CTRL_5:
70133ada14aSBard Liao 	case RT5665_MONO_NG2_CTRL_6:
70233ada14aSBard Liao 	case RT5665_STO1_DAC_SIL_DET:
70333ada14aSBard Liao 	case RT5665_MONOL_DAC_SIL_DET:
70433ada14aSBard Liao 	case RT5665_MONOR_DAC_SIL_DET:
70533ada14aSBard Liao 	case RT5665_STO2_DAC_SIL_DET:
70633ada14aSBard Liao 	case RT5665_SIL_PSV_CTRL1:
70733ada14aSBard Liao 	case RT5665_SIL_PSV_CTRL2:
70833ada14aSBard Liao 	case RT5665_SIL_PSV_CTRL3:
70933ada14aSBard Liao 	case RT5665_SIL_PSV_CTRL4:
71033ada14aSBard Liao 	case RT5665_SIL_PSV_CTRL5:
71133ada14aSBard Liao 	case RT5665_SIL_PSV_CTRL6:
71233ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_CTRL_1:
71333ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_CTRL_2:
71433ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_CTRL_3:
71533ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_CTRL_4:
71633ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_CTRL_5:
71733ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_CTRL_6:
71833ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_CTRL_7:
71933ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_STA1:
72033ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_STA2:
72133ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_STA3:
72233ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_STA4:
72333ada14aSBard Liao 	case RT5665_MONO_AMP_CALIB_STA6:
72433ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_01:
72533ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_02:
72633ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_03:
72733ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_04:
72833ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_05:
72933ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_06:
73033ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_07:
73133ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_08:
73233ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_09:
73333ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_10:
73433ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_11:
73533ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_12:
73633ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_13:
73733ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_14:
73833ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_15:
73933ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_16:
74033ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_17:
74133ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_18:
74233ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_19:
74333ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_20:
74433ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_21:
74533ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_22:
74633ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_23:
74733ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_24:
74833ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_25:
74933ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_26:
75033ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_27:
75133ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_28:
75233ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_29:
75333ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_30:
75433ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_31:
75533ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_32:
75633ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_33:
75733ada14aSBard Liao 	case RT5665_HP_IMP_SENS_CTRL_34:
75833ada14aSBard Liao 	case RT5665_HP_LOGIC_CTRL_1:
75933ada14aSBard Liao 	case RT5665_HP_LOGIC_CTRL_2:
76033ada14aSBard Liao 	case RT5665_HP_LOGIC_CTRL_3:
76133ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_1:
76233ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_2:
76333ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_3:
76433ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_4:
76533ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_5:
76633ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_6:
76733ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_7:
76833ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_9:
76933ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_10:
77033ada14aSBard Liao 	case RT5665_HP_CALIB_CTRL_11:
77133ada14aSBard Liao 	case RT5665_HP_CALIB_STA_1:
77233ada14aSBard Liao 	case RT5665_HP_CALIB_STA_2:
77333ada14aSBard Liao 	case RT5665_HP_CALIB_STA_3:
77433ada14aSBard Liao 	case RT5665_HP_CALIB_STA_4:
77533ada14aSBard Liao 	case RT5665_HP_CALIB_STA_5:
77633ada14aSBard Liao 	case RT5665_HP_CALIB_STA_6:
77733ada14aSBard Liao 	case RT5665_HP_CALIB_STA_7:
77833ada14aSBard Liao 	case RT5665_HP_CALIB_STA_8:
77933ada14aSBard Liao 	case RT5665_HP_CALIB_STA_9:
78033ada14aSBard Liao 	case RT5665_HP_CALIB_STA_10:
78133ada14aSBard Liao 	case RT5665_HP_CALIB_STA_11:
78233ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL1:
78333ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL2:
78433ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL3:
78533ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL4:
78633ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL5:
78733ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL6:
78833ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL7:
78933ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL8:
79033ada14aSBard Liao 	case RT5665_PGM_TAB_CTRL9:
79133ada14aSBard Liao 	case RT5665_SAR_IL_CMD_1:
79233ada14aSBard Liao 	case RT5665_SAR_IL_CMD_2:
79333ada14aSBard Liao 	case RT5665_SAR_IL_CMD_3:
79433ada14aSBard Liao 	case RT5665_SAR_IL_CMD_4:
79533ada14aSBard Liao 	case RT5665_SAR_IL_CMD_5:
79633ada14aSBard Liao 	case RT5665_SAR_IL_CMD_6:
79733ada14aSBard Liao 	case RT5665_SAR_IL_CMD_7:
79833ada14aSBard Liao 	case RT5665_SAR_IL_CMD_8:
79933ada14aSBard Liao 	case RT5665_SAR_IL_CMD_9:
80033ada14aSBard Liao 	case RT5665_SAR_IL_CMD_10:
80133ada14aSBard Liao 	case RT5665_SAR_IL_CMD_11:
80233ada14aSBard Liao 	case RT5665_SAR_IL_CMD_12:
80333ada14aSBard Liao 	case RT5665_DRC1_CTRL_0:
80433ada14aSBard Liao 	case RT5665_DRC1_CTRL_1:
80533ada14aSBard Liao 	case RT5665_DRC1_CTRL_2:
80633ada14aSBard Liao 	case RT5665_DRC1_CTRL_3:
80733ada14aSBard Liao 	case RT5665_DRC1_CTRL_4:
80833ada14aSBard Liao 	case RT5665_DRC1_CTRL_5:
80933ada14aSBard Liao 	case RT5665_DRC1_CTRL_6:
81033ada14aSBard Liao 	case RT5665_DRC1_HARD_LMT_CTRL_1:
81133ada14aSBard Liao 	case RT5665_DRC1_HARD_LMT_CTRL_2:
81233ada14aSBard Liao 	case RT5665_DRC1_PRIV_1:
81333ada14aSBard Liao 	case RT5665_DRC1_PRIV_2:
81433ada14aSBard Liao 	case RT5665_DRC1_PRIV_3:
81533ada14aSBard Liao 	case RT5665_DRC1_PRIV_4:
81633ada14aSBard Liao 	case RT5665_DRC1_PRIV_5:
81733ada14aSBard Liao 	case RT5665_DRC1_PRIV_6:
81833ada14aSBard Liao 	case RT5665_DRC1_PRIV_7:
81933ada14aSBard Liao 	case RT5665_DRC1_PRIV_8:
82033ada14aSBard Liao 	case RT5665_ALC_PGA_CTRL_1:
82133ada14aSBard Liao 	case RT5665_ALC_PGA_CTRL_2:
82233ada14aSBard Liao 	case RT5665_ALC_PGA_CTRL_3:
82333ada14aSBard Liao 	case RT5665_ALC_PGA_CTRL_4:
82433ada14aSBard Liao 	case RT5665_ALC_PGA_CTRL_5:
82533ada14aSBard Liao 	case RT5665_ALC_PGA_CTRL_6:
82633ada14aSBard Liao 	case RT5665_ALC_PGA_CTRL_7:
82733ada14aSBard Liao 	case RT5665_ALC_PGA_CTRL_8:
82833ada14aSBard Liao 	case RT5665_ALC_PGA_STA_1:
82933ada14aSBard Liao 	case RT5665_ALC_PGA_STA_2:
83033ada14aSBard Liao 	case RT5665_ALC_PGA_STA_3:
83133ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL1:
83233ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL2:
83333ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL3:
83433ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL4:
83533ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL5:
83633ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL6:
83733ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL7:
83833ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL8:
83933ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL9:
84033ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL10:
84133ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL11:
84233ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL12:
84333ada14aSBard Liao 	case RT5665_EQ_AUTO_RCV_CTRL13:
84433ada14aSBard Liao 	case RT5665_ADC_L_EQ_LPF1_A1:
84533ada14aSBard Liao 	case RT5665_R_EQ_LPF1_A1:
84633ada14aSBard Liao 	case RT5665_L_EQ_LPF1_H0:
84733ada14aSBard Liao 	case RT5665_R_EQ_LPF1_H0:
84833ada14aSBard Liao 	case RT5665_L_EQ_BPF1_A1:
84933ada14aSBard Liao 	case RT5665_R_EQ_BPF1_A1:
85033ada14aSBard Liao 	case RT5665_L_EQ_BPF1_A2:
85133ada14aSBard Liao 	case RT5665_R_EQ_BPF1_A2:
85233ada14aSBard Liao 	case RT5665_L_EQ_BPF1_H0:
85333ada14aSBard Liao 	case RT5665_R_EQ_BPF1_H0:
85433ada14aSBard Liao 	case RT5665_L_EQ_BPF2_A1:
85533ada14aSBard Liao 	case RT5665_R_EQ_BPF2_A1:
85633ada14aSBard Liao 	case RT5665_L_EQ_BPF2_A2:
85733ada14aSBard Liao 	case RT5665_R_EQ_BPF2_A2:
85833ada14aSBard Liao 	case RT5665_L_EQ_BPF2_H0:
85933ada14aSBard Liao 	case RT5665_R_EQ_BPF2_H0:
86033ada14aSBard Liao 	case RT5665_L_EQ_BPF3_A1:
86133ada14aSBard Liao 	case RT5665_R_EQ_BPF3_A1:
86233ada14aSBard Liao 	case RT5665_L_EQ_BPF3_A2:
86333ada14aSBard Liao 	case RT5665_R_EQ_BPF3_A2:
86433ada14aSBard Liao 	case RT5665_L_EQ_BPF3_H0:
86533ada14aSBard Liao 	case RT5665_R_EQ_BPF3_H0:
86633ada14aSBard Liao 	case RT5665_L_EQ_BPF4_A1:
86733ada14aSBard Liao 	case RT5665_R_EQ_BPF4_A1:
86833ada14aSBard Liao 	case RT5665_L_EQ_BPF4_A2:
86933ada14aSBard Liao 	case RT5665_R_EQ_BPF4_A2:
87033ada14aSBard Liao 	case RT5665_L_EQ_BPF4_H0:
87133ada14aSBard Liao 	case RT5665_R_EQ_BPF4_H0:
87233ada14aSBard Liao 	case RT5665_L_EQ_HPF1_A1:
87333ada14aSBard Liao 	case RT5665_R_EQ_HPF1_A1:
87433ada14aSBard Liao 	case RT5665_L_EQ_HPF1_H0:
87533ada14aSBard Liao 	case RT5665_R_EQ_HPF1_H0:
87633ada14aSBard Liao 	case RT5665_L_EQ_PRE_VOL:
87733ada14aSBard Liao 	case RT5665_R_EQ_PRE_VOL:
87833ada14aSBard Liao 	case RT5665_L_EQ_POST_VOL:
87933ada14aSBard Liao 	case RT5665_R_EQ_POST_VOL:
88033ada14aSBard Liao 	case RT5665_SCAN_MODE_CTRL:
88133ada14aSBard Liao 	case RT5665_I2C_MODE:
88233ada14aSBard Liao 		return true;
88333ada14aSBard Liao 	default:
88433ada14aSBard Liao 		return false;
88533ada14aSBard Liao 	}
88633ada14aSBard Liao }
88733ada14aSBard Liao 
88833ada14aSBard Liao static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -2250, 150, 0);
88933ada14aSBard Liao static const DECLARE_TLV_DB_SCALE(mono_vol_tlv, -1400, 150, 0);
89033ada14aSBard Liao static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
89133ada14aSBard Liao static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
89233ada14aSBard Liao static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
89333ada14aSBard Liao static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
89433ada14aSBard Liao static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
89533ada14aSBard Liao static const DECLARE_TLV_DB_SCALE(in_bst_tlv, -1200, 75, 0);
89633ada14aSBard Liao 
89733ada14aSBard Liao /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
89833ada14aSBard Liao static const DECLARE_TLV_DB_RANGE(bst_tlv,
89933ada14aSBard Liao 	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
90033ada14aSBard Liao 	1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
90133ada14aSBard Liao 	2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
90233ada14aSBard Liao 	3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
90333ada14aSBard Liao 	6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
90433ada14aSBard Liao 	7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
90533ada14aSBard Liao 	8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
90633ada14aSBard Liao );
90733ada14aSBard Liao 
90833ada14aSBard Liao /* Interface data select */
90933ada14aSBard Liao static const char * const rt5665_data_select[] = {
91033ada14aSBard Liao 	"L/R", "R/L", "L/L", "R/R"
91133ada14aSBard Liao };
91233ada14aSBard Liao 
91327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if1_1_01_adc_enum,
91433ada14aSBard Liao 	RT5665_TDM_CTRL_2, RT5665_I2S1_1_DS_ADC_SLOT01_SFT, rt5665_data_select);
91533ada14aSBard Liao 
91627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if1_1_23_adc_enum,
91733ada14aSBard Liao 	RT5665_TDM_CTRL_2, RT5665_I2S1_1_DS_ADC_SLOT23_SFT, rt5665_data_select);
91833ada14aSBard Liao 
91927a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if1_1_45_adc_enum,
92033ada14aSBard Liao 	RT5665_TDM_CTRL_2, RT5665_I2S1_1_DS_ADC_SLOT45_SFT, rt5665_data_select);
92133ada14aSBard Liao 
92227a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if1_1_67_adc_enum,
92333ada14aSBard Liao 	RT5665_TDM_CTRL_2, RT5665_I2S1_1_DS_ADC_SLOT67_SFT, rt5665_data_select);
92433ada14aSBard Liao 
92527a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if1_2_01_adc_enum,
92633ada14aSBard Liao 	RT5665_TDM_CTRL_2, RT5665_I2S1_2_DS_ADC_SLOT01_SFT, rt5665_data_select);
92733ada14aSBard Liao 
92827a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if1_2_23_adc_enum,
92933ada14aSBard Liao 	RT5665_TDM_CTRL_2, RT5665_I2S1_2_DS_ADC_SLOT23_SFT, rt5665_data_select);
93033ada14aSBard Liao 
93127a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if1_2_45_adc_enum,
93233ada14aSBard Liao 	RT5665_TDM_CTRL_2, RT5665_I2S1_2_DS_ADC_SLOT45_SFT, rt5665_data_select);
93333ada14aSBard Liao 
93427a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if1_2_67_adc_enum,
93533ada14aSBard Liao 	RT5665_TDM_CTRL_2, RT5665_I2S1_2_DS_ADC_SLOT67_SFT, rt5665_data_select);
93633ada14aSBard Liao 
93727a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if2_1_dac_enum,
93833ada14aSBard Liao 	RT5665_DIG_INF2_DATA, RT5665_IF2_1_DAC_SEL_SFT, rt5665_data_select);
93933ada14aSBard Liao 
94027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if2_1_adc_enum,
94133ada14aSBard Liao 	RT5665_DIG_INF2_DATA, RT5665_IF2_1_ADC_SEL_SFT, rt5665_data_select);
94233ada14aSBard Liao 
94327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if2_2_dac_enum,
94433ada14aSBard Liao 	RT5665_DIG_INF2_DATA, RT5665_IF2_2_DAC_SEL_SFT, rt5665_data_select);
94533ada14aSBard Liao 
94627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if2_2_adc_enum,
94733ada14aSBard Liao 	RT5665_DIG_INF2_DATA, RT5665_IF2_2_ADC_SEL_SFT, rt5665_data_select);
94833ada14aSBard Liao 
94927a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if3_dac_enum,
95033ada14aSBard Liao 	RT5665_DIG_INF3_DATA, RT5665_IF3_DAC_SEL_SFT, rt5665_data_select);
95133ada14aSBard Liao 
95227a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(rt5665_if3_adc_enum,
95333ada14aSBard Liao 	RT5665_DIG_INF3_DATA, RT5665_IF3_ADC_SEL_SFT, rt5665_data_select);
95433ada14aSBard Liao 
95533ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_1_01_adc_swap_mux =
95633ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_1 01 ADC Swap Mux", rt5665_if1_1_01_adc_enum);
95733ada14aSBard Liao 
95833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_1_23_adc_swap_mux =
95933ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_1 23 ADC Swap Mux", rt5665_if1_1_23_adc_enum);
96033ada14aSBard Liao 
96133ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_1_45_adc_swap_mux =
96233ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_1 45 ADC Swap Mux", rt5665_if1_1_45_adc_enum);
96333ada14aSBard Liao 
96433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_1_67_adc_swap_mux =
96533ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_1 67 ADC Swap Mux", rt5665_if1_1_67_adc_enum);
96633ada14aSBard Liao 
96733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_2_01_adc_swap_mux =
96833ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_2 01 ADC Swap Mux", rt5665_if1_2_01_adc_enum);
96933ada14aSBard Liao 
97033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_2_23_adc_swap_mux =
97133ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_2 23 ADC1 Swap Mux", rt5665_if1_2_23_adc_enum);
97233ada14aSBard Liao 
97333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_2_45_adc_swap_mux =
97433ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_2 45 ADC1 Swap Mux", rt5665_if1_2_45_adc_enum);
97533ada14aSBard Liao 
97633ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_2_67_adc_swap_mux =
97733ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_2 67 ADC1 Swap Mux", rt5665_if1_2_67_adc_enum);
97833ada14aSBard Liao 
97933ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if2_1_dac_swap_mux =
98033ada14aSBard Liao 	SOC_DAPM_ENUM("IF2_1 DAC Swap Source", rt5665_if2_1_dac_enum);
98133ada14aSBard Liao 
98233ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if2_1_adc_swap_mux =
98333ada14aSBard Liao 	SOC_DAPM_ENUM("IF2_1 ADC Swap Source", rt5665_if2_1_adc_enum);
98433ada14aSBard Liao 
98533ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if2_2_dac_swap_mux =
98633ada14aSBard Liao 	SOC_DAPM_ENUM("IF2_2 DAC Swap Source", rt5665_if2_2_dac_enum);
98733ada14aSBard Liao 
98833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if2_2_adc_swap_mux =
98933ada14aSBard Liao 	SOC_DAPM_ENUM("IF2_2 ADC Swap Source", rt5665_if2_2_adc_enum);
99033ada14aSBard Liao 
99133ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if3_dac_swap_mux =
99233ada14aSBard Liao 	SOC_DAPM_ENUM("IF3 DAC Swap Source", rt5665_if3_dac_enum);
99333ada14aSBard Liao 
99433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if3_adc_swap_mux =
99533ada14aSBard Liao 	SOC_DAPM_ENUM("IF3 ADC Swap Source", rt5665_if3_adc_enum);
99633ada14aSBard Liao 
99733ada14aSBard Liao static int rt5665_hp_vol_put(struct snd_kcontrol *kcontrol,
99833ada14aSBard Liao 		struct snd_ctl_elem_value *ucontrol)
99933ada14aSBard Liao {
1000fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
100133ada14aSBard Liao 	int ret = snd_soc_put_volsw(kcontrol, ucontrol);
100233ada14aSBard Liao 
1003467a2553SKuninori Morimoto 	if (snd_soc_component_read(component, RT5665_STO_NG2_CTRL_1) & RT5665_NG2_EN) {
1004fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_STO_NG2_CTRL_1,
100533ada14aSBard Liao 			RT5665_NG2_EN_MASK, RT5665_NG2_DIS);
1006fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_STO_NG2_CTRL_1,
100733ada14aSBard Liao 			RT5665_NG2_EN_MASK, RT5665_NG2_EN);
100833ada14aSBard Liao 	}
100933ada14aSBard Liao 
101033ada14aSBard Liao 	return ret;
101133ada14aSBard Liao }
101233ada14aSBard Liao 
101333ada14aSBard Liao static int rt5665_mono_vol_put(struct snd_kcontrol *kcontrol,
101433ada14aSBard Liao 		struct snd_ctl_elem_value *ucontrol)
101533ada14aSBard Liao {
1016fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
101733ada14aSBard Liao 	int ret = snd_soc_put_volsw(kcontrol, ucontrol);
101833ada14aSBard Liao 
1019467a2553SKuninori Morimoto 	if (snd_soc_component_read(component, RT5665_MONO_NG2_CTRL_1) & RT5665_NG2_EN) {
1020fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_NG2_CTRL_1,
102133ada14aSBard Liao 			RT5665_NG2_EN_MASK, RT5665_NG2_DIS);
1022fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_NG2_CTRL_1,
102333ada14aSBard Liao 			RT5665_NG2_EN_MASK, RT5665_NG2_EN);
102433ada14aSBard Liao 	}
102533ada14aSBard Liao 
102633ada14aSBard Liao 	return ret;
102733ada14aSBard Liao }
102833ada14aSBard Liao 
102933ada14aSBard Liao /**
103033ada14aSBard Liao  * rt5665_sel_asrc_clk_src - select ASRC clock source for a set of filters
1031fab70c27SKuninori Morimoto  * @component: SoC audio component device.
103233ada14aSBard Liao  * @filter_mask: mask of filters.
103333ada14aSBard Liao  * @clk_src: clock source
103433ada14aSBard Liao  *
103533ada14aSBard Liao  * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5665 can
103633ada14aSBard Liao  * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
103733ada14aSBard Liao  * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
103833ada14aSBard Liao  * ASRC function will track i2s clock and generate a corresponding system clock
103933ada14aSBard Liao  * for codec. This function provides an API to select the clock source for a
104033ada14aSBard Liao  * set of filters specified by the mask. And the codec driver will turn on ASRC
104133ada14aSBard Liao  * for these filters if ASRC is selected as their clock source.
104233ada14aSBard Liao  */
1043fab70c27SKuninori Morimoto int rt5665_sel_asrc_clk_src(struct snd_soc_component *component,
104433ada14aSBard Liao 		unsigned int filter_mask, unsigned int clk_src)
104533ada14aSBard Liao {
104633ada14aSBard Liao 	unsigned int asrc2_mask = 0;
104733ada14aSBard Liao 	unsigned int asrc2_value = 0;
104833ada14aSBard Liao 	unsigned int asrc3_mask = 0;
104933ada14aSBard Liao 	unsigned int asrc3_value = 0;
105033ada14aSBard Liao 
105133ada14aSBard Liao 	switch (clk_src) {
105233ada14aSBard Liao 	case RT5665_CLK_SEL_SYS:
105333ada14aSBard Liao 	case RT5665_CLK_SEL_I2S1_ASRC:
105433ada14aSBard Liao 	case RT5665_CLK_SEL_I2S2_ASRC:
105533ada14aSBard Liao 	case RT5665_CLK_SEL_I2S3_ASRC:
105633ada14aSBard Liao 	case RT5665_CLK_SEL_SYS2:
105733ada14aSBard Liao 	case RT5665_CLK_SEL_SYS3:
105833ada14aSBard Liao 	case RT5665_CLK_SEL_SYS4:
105933ada14aSBard Liao 		break;
106033ada14aSBard Liao 
106133ada14aSBard Liao 	default:
106233ada14aSBard Liao 		return -EINVAL;
106333ada14aSBard Liao 	}
106433ada14aSBard Liao 
106533ada14aSBard Liao 	if (filter_mask & RT5665_DA_STEREO1_FILTER) {
106633ada14aSBard Liao 		asrc2_mask |= RT5665_DA_STO1_CLK_SEL_MASK;
106733ada14aSBard Liao 		asrc2_value = (asrc2_value & ~RT5665_DA_STO1_CLK_SEL_MASK)
106833ada14aSBard Liao 			| (clk_src << RT5665_DA_STO1_CLK_SEL_SFT);
106933ada14aSBard Liao 	}
107033ada14aSBard Liao 
107133ada14aSBard Liao 	if (filter_mask & RT5665_DA_STEREO2_FILTER) {
107233ada14aSBard Liao 		asrc2_mask |= RT5665_DA_STO2_CLK_SEL_MASK;
107333ada14aSBard Liao 		asrc2_value = (asrc2_value & ~RT5665_DA_STO2_CLK_SEL_MASK)
107433ada14aSBard Liao 			| (clk_src << RT5665_DA_STO2_CLK_SEL_SFT);
107533ada14aSBard Liao 	}
107633ada14aSBard Liao 
107733ada14aSBard Liao 	if (filter_mask & RT5665_DA_MONO_L_FILTER) {
107833ada14aSBard Liao 		asrc2_mask |= RT5665_DA_MONOL_CLK_SEL_MASK;
107933ada14aSBard Liao 		asrc2_value = (asrc2_value & ~RT5665_DA_MONOL_CLK_SEL_MASK)
108033ada14aSBard Liao 			| (clk_src << RT5665_DA_MONOL_CLK_SEL_SFT);
108133ada14aSBard Liao 	}
108233ada14aSBard Liao 
108333ada14aSBard Liao 	if (filter_mask & RT5665_DA_MONO_R_FILTER) {
108433ada14aSBard Liao 		asrc2_mask |= RT5665_DA_MONOR_CLK_SEL_MASK;
108533ada14aSBard Liao 		asrc2_value = (asrc2_value & ~RT5665_DA_MONOR_CLK_SEL_MASK)
108633ada14aSBard Liao 			| (clk_src << RT5665_DA_MONOR_CLK_SEL_SFT);
108733ada14aSBard Liao 	}
108833ada14aSBard Liao 
108933ada14aSBard Liao 	if (filter_mask & RT5665_AD_STEREO1_FILTER) {
109033ada14aSBard Liao 		asrc3_mask |= RT5665_AD_STO1_CLK_SEL_MASK;
109133ada14aSBard Liao 		asrc3_value = (asrc2_value & ~RT5665_AD_STO1_CLK_SEL_MASK)
109233ada14aSBard Liao 			| (clk_src << RT5665_AD_STO1_CLK_SEL_SFT);
109333ada14aSBard Liao 	}
109433ada14aSBard Liao 
109533ada14aSBard Liao 	if (filter_mask & RT5665_AD_STEREO2_FILTER) {
109633ada14aSBard Liao 		asrc3_mask |= RT5665_AD_STO2_CLK_SEL_MASK;
109733ada14aSBard Liao 		asrc3_value = (asrc2_value & ~RT5665_AD_STO2_CLK_SEL_MASK)
109833ada14aSBard Liao 			| (clk_src << RT5665_AD_STO2_CLK_SEL_SFT);
109933ada14aSBard Liao 	}
110033ada14aSBard Liao 
110133ada14aSBard Liao 	if (filter_mask & RT5665_AD_MONO_L_FILTER) {
110233ada14aSBard Liao 		asrc3_mask |= RT5665_AD_MONOL_CLK_SEL_MASK;
110333ada14aSBard Liao 		asrc3_value = (asrc3_value & ~RT5665_AD_MONOL_CLK_SEL_MASK)
110433ada14aSBard Liao 			| (clk_src << RT5665_AD_MONOL_CLK_SEL_SFT);
110533ada14aSBard Liao 	}
110633ada14aSBard Liao 
110733ada14aSBard Liao 	if (filter_mask & RT5665_AD_MONO_R_FILTER)  {
110833ada14aSBard Liao 		asrc3_mask |= RT5665_AD_MONOR_CLK_SEL_MASK;
110933ada14aSBard Liao 		asrc3_value = (asrc3_value & ~RT5665_AD_MONOR_CLK_SEL_MASK)
111033ada14aSBard Liao 			| (clk_src << RT5665_AD_MONOR_CLK_SEL_SFT);
111133ada14aSBard Liao 	}
111233ada14aSBard Liao 
111333ada14aSBard Liao 	if (asrc2_mask)
1114fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_ASRC_2,
111533ada14aSBard Liao 			asrc2_mask, asrc2_value);
111633ada14aSBard Liao 
111733ada14aSBard Liao 	if (asrc3_mask)
1118fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_ASRC_3,
111933ada14aSBard Liao 			asrc3_mask, asrc3_value);
112033ada14aSBard Liao 
112133ada14aSBard Liao 	return 0;
112233ada14aSBard Liao }
112333ada14aSBard Liao EXPORT_SYMBOL_GPL(rt5665_sel_asrc_clk_src);
112433ada14aSBard Liao 
1125fab70c27SKuninori Morimoto static int rt5665_button_detect(struct snd_soc_component *component)
112633ada14aSBard Liao {
112733ada14aSBard Liao 	int btn_type, val;
112833ada14aSBard Liao 
1129467a2553SKuninori Morimoto 	val = snd_soc_component_read(component, RT5665_4BTN_IL_CMD_1);
113033ada14aSBard Liao 	btn_type = val & 0xfff0;
1131fab70c27SKuninori Morimoto 	snd_soc_component_write(component, RT5665_4BTN_IL_CMD_1, val);
113233ada14aSBard Liao 
113333ada14aSBard Liao 	return btn_type;
113433ada14aSBard Liao }
113533ada14aSBard Liao 
1136fab70c27SKuninori Morimoto static void rt5665_enable_push_button_irq(struct snd_soc_component *component,
113733ada14aSBard Liao 	bool enable)
113833ada14aSBard Liao {
113933ada14aSBard Liao 	if (enable) {
1140fab70c27SKuninori Morimoto 		snd_soc_component_write(component, RT5665_4BTN_IL_CMD_1, 0x0003);
1141fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_SAR_IL_CMD_9, 0x1, 0x1);
1142fab70c27SKuninori Morimoto 		snd_soc_component_write(component, RT5665_IL_CMD_1, 0x0048);
1143fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_4BTN_IL_CMD_2,
114433ada14aSBard Liao 				RT5665_4BTN_IL_MASK | RT5665_4BTN_IL_RST_MASK,
114533ada14aSBard Liao 				RT5665_4BTN_IL_EN | RT5665_4BTN_IL_NOR);
1146fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_IRQ_CTRL_3,
114733ada14aSBard Liao 				RT5665_IL_IRQ_MASK, RT5665_IL_IRQ_EN);
114833ada14aSBard Liao 	} else {
1149fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_IRQ_CTRL_3,
115033ada14aSBard Liao 				RT5665_IL_IRQ_MASK, RT5665_IL_IRQ_DIS);
1151fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_4BTN_IL_CMD_2,
115233ada14aSBard Liao 				RT5665_4BTN_IL_MASK, RT5665_4BTN_IL_DIS);
1153fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_4BTN_IL_CMD_2,
115433ada14aSBard Liao 				RT5665_4BTN_IL_RST_MASK, RT5665_4BTN_IL_RST);
115533ada14aSBard Liao 	}
115633ada14aSBard Liao }
115733ada14aSBard Liao 
115833ada14aSBard Liao /**
115933ada14aSBard Liao  * rt5665_headset_detect - Detect headset.
1160fab70c27SKuninori Morimoto  * @component: SoC audio component device.
116133ada14aSBard Liao  * @jack_insert: Jack insert or not.
116233ada14aSBard Liao  *
116333ada14aSBard Liao  * Detect whether is headset or not when jack inserted.
116433ada14aSBard Liao  *
116533ada14aSBard Liao  * Returns detect status.
116633ada14aSBard Liao  */
1167fab70c27SKuninori Morimoto static int rt5665_headset_detect(struct snd_soc_component *component, int jack_insert)
116833ada14aSBard Liao {
1169fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
1170fab70c27SKuninori Morimoto 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
117133ada14aSBard Liao 	unsigned int sar_hs_type, val;
117233ada14aSBard Liao 
117333ada14aSBard Liao 	if (jack_insert) {
117433ada14aSBard Liao 		snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1");
117533ada14aSBard Liao 		snd_soc_dapm_sync(dapm);
117633ada14aSBard Liao 
117733ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_MICBIAS_2, 0x100,
117833ada14aSBard Liao 			0x100);
117933ada14aSBard Liao 
118033ada14aSBard Liao 		regmap_read(rt5665->regmap, RT5665_GPIO_STA, &val);
118133ada14aSBard Liao 		if (val & 0x4) {
118233ada14aSBard Liao 			regmap_update_bits(rt5665->regmap, RT5665_EJD_CTRL_1,
118333ada14aSBard Liao 				0x100, 0);
118433ada14aSBard Liao 
118533ada14aSBard Liao 			regmap_read(rt5665->regmap, RT5665_GPIO_STA, &val);
118633ada14aSBard Liao 			while (val & 0x4) {
118733ada14aSBard Liao 				usleep_range(10000, 15000);
118833ada14aSBard Liao 				regmap_read(rt5665->regmap, RT5665_GPIO_STA,
118933ada14aSBard Liao 					&val);
119033ada14aSBard Liao 			}
119133ada14aSBard Liao 		}
119233ada14aSBard Liao 
119333ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_EJD_CTRL_1,
119439841944SBard Liao 			0x1a0, 0x120);
119533ada14aSBard Liao 		regmap_write(rt5665->regmap, RT5665_EJD_CTRL_3, 0x3424);
119639841944SBard Liao 		regmap_write(rt5665->regmap, RT5665_IL_CMD_1, 0x0048);
119733ada14aSBard Liao 		regmap_write(rt5665->regmap, RT5665_SAR_IL_CMD_1, 0xa291);
119833ada14aSBard Liao 
119939841944SBard Liao 		usleep_range(10000, 15000);
120039841944SBard Liao 
1201467a2553SKuninori Morimoto 		rt5665->sar_adc_value = snd_soc_component_read(rt5665->component,
120233ada14aSBard Liao 			RT5665_SAR_IL_CMD_4) & 0x7ff;
120333ada14aSBard Liao 
120433ada14aSBard Liao 		sar_hs_type = rt5665->pdata.sar_hs_type ?
120533ada14aSBard Liao 			rt5665->pdata.sar_hs_type : 729;
120633ada14aSBard Liao 
120733ada14aSBard Liao 		if (rt5665->sar_adc_value > sar_hs_type) {
120833ada14aSBard Liao 			rt5665->jack_type = SND_JACK_HEADSET;
1209fab70c27SKuninori Morimoto 			rt5665_enable_push_button_irq(component, true);
121033ada14aSBard Liao 			} else {
121133ada14aSBard Liao 			rt5665->jack_type = SND_JACK_HEADPHONE;
121233ada14aSBard Liao 			regmap_write(rt5665->regmap, RT5665_SAR_IL_CMD_1,
121333ada14aSBard Liao 				0x2291);
121433ada14aSBard Liao 			regmap_update_bits(rt5665->regmap, RT5665_MICBIAS_2,
121533ada14aSBard Liao 				0x100, 0);
121633ada14aSBard Liao 			snd_soc_dapm_disable_pin(dapm, "MICBIAS1");
121733ada14aSBard Liao 			snd_soc_dapm_sync(dapm);
121833ada14aSBard Liao 		}
121933ada14aSBard Liao 	} else {
122033ada14aSBard Liao 		regmap_write(rt5665->regmap, RT5665_SAR_IL_CMD_1, 0x2291);
122133ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_MICBIAS_2, 0x100, 0);
122233ada14aSBard Liao 		snd_soc_dapm_disable_pin(dapm, "MICBIAS1");
122333ada14aSBard Liao 		snd_soc_dapm_sync(dapm);
122433ada14aSBard Liao 		if (rt5665->jack_type == SND_JACK_HEADSET)
1225fab70c27SKuninori Morimoto 			rt5665_enable_push_button_irq(component, false);
122633ada14aSBard Liao 		rt5665->jack_type = 0;
122733ada14aSBard Liao 	}
122833ada14aSBard Liao 
1229fab70c27SKuninori Morimoto 	dev_dbg(component->dev, "jack_type = %d\n", rt5665->jack_type);
123033ada14aSBard Liao 	return rt5665->jack_type;
123133ada14aSBard Liao }
123233ada14aSBard Liao 
123333ada14aSBard Liao static irqreturn_t rt5665_irq(int irq, void *data)
123433ada14aSBard Liao {
123533ada14aSBard Liao 	struct rt5665_priv *rt5665 = data;
123633ada14aSBard Liao 
123733ada14aSBard Liao 	mod_delayed_work(system_power_efficient_wq,
123833ada14aSBard Liao 			   &rt5665->jack_detect_work, msecs_to_jiffies(250));
123933ada14aSBard Liao 
124033ada14aSBard Liao 	return IRQ_HANDLED;
124133ada14aSBard Liao }
124233ada14aSBard Liao 
124333ada14aSBard Liao static void rt5665_jd_check_handler(struct work_struct *work)
124433ada14aSBard Liao {
124533ada14aSBard Liao 	struct rt5665_priv *rt5665 = container_of(work, struct rt5665_priv,
1246f1994a9cSBard Liao 		jd_check_work.work);
124733ada14aSBard Liao 
1248467a2553SKuninori Morimoto 	if (snd_soc_component_read(rt5665->component, RT5665_AJD1_CTRL) & 0x0010) {
124933ada14aSBard Liao 		/* jack out */
1250fab70c27SKuninori Morimoto 		rt5665->jack_type = rt5665_headset_detect(rt5665->component, 0);
125133ada14aSBard Liao 
125233ada14aSBard Liao 		snd_soc_jack_report(rt5665->hs_jack, rt5665->jack_type,
125333ada14aSBard Liao 				SND_JACK_HEADSET |
125433ada14aSBard Liao 				SND_JACK_BTN_0 | SND_JACK_BTN_1 |
125533ada14aSBard Liao 				SND_JACK_BTN_2 | SND_JACK_BTN_3);
125633ada14aSBard Liao 	} else {
125733ada14aSBard Liao 		schedule_delayed_work(&rt5665->jd_check_work, 500);
125833ada14aSBard Liao 	}
125933ada14aSBard Liao }
126033ada14aSBard Liao 
1261fab70c27SKuninori Morimoto static int rt5665_set_jack_detect(struct snd_soc_component *component,
126297c415a6SBard Liao 	struct snd_soc_jack *hs_jack, void *data)
126333ada14aSBard Liao {
1264fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
126533ada14aSBard Liao 
126633ada14aSBard Liao 	switch (rt5665->pdata.jd_src) {
126733ada14aSBard Liao 	case RT5665_JD1:
126833ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_1,
126933ada14aSBard Liao 			RT5665_GP1_PIN_MASK, RT5665_GP1_PIN_IRQ);
127033ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_RC_CLK_CTRL,
127133ada14aSBard Liao 				0xc000, 0xc000);
127233ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_2,
127333ada14aSBard Liao 			RT5665_PWR_JD1, RT5665_PWR_JD1);
127433ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_IRQ_CTRL_1, 0x8, 0x8);
127533ada14aSBard Liao 		break;
127633ada14aSBard Liao 
127733ada14aSBard Liao 	case RT5665_JD_NULL:
127833ada14aSBard Liao 		break;
127933ada14aSBard Liao 
128033ada14aSBard Liao 	default:
1281fab70c27SKuninori Morimoto 		dev_warn(component->dev, "Wrong JD source\n");
128233ada14aSBard Liao 		break;
128333ada14aSBard Liao 	}
128433ada14aSBard Liao 
128533ada14aSBard Liao 	rt5665->hs_jack = hs_jack;
128633ada14aSBard Liao 
128733ada14aSBard Liao 	return 0;
128833ada14aSBard Liao }
128933ada14aSBard Liao 
129033ada14aSBard Liao static void rt5665_jack_detect_handler(struct work_struct *work)
129133ada14aSBard Liao {
129233ada14aSBard Liao 	struct rt5665_priv *rt5665 =
129333ada14aSBard Liao 		container_of(work, struct rt5665_priv, jack_detect_work.work);
129433ada14aSBard Liao 	int val, btn_type;
129533ada14aSBard Liao 
1296fab70c27SKuninori Morimoto 	while (!rt5665->component) {
129733ada14aSBard Liao 		pr_debug("%s codec = null\n", __func__);
129833ada14aSBard Liao 		usleep_range(10000, 15000);
129933ada14aSBard Liao 	}
130033ada14aSBard Liao 
1301*8ec35236SKuninori Morimoto 	while (!snd_soc_card_is_instantiated(rt5665->component->card)) {
130233ada14aSBard Liao 		pr_debug("%s\n", __func__);
130333ada14aSBard Liao 		usleep_range(10000, 15000);
130433ada14aSBard Liao 	}
130533ada14aSBard Liao 
1306b059ca72SBard Liao 	while (!rt5665->calibration_done) {
1307b059ca72SBard Liao 		pr_debug("%s calibration not ready\n", __func__);
1308b059ca72SBard Liao 		usleep_range(10000, 15000);
1309b059ca72SBard Liao 	}
1310b059ca72SBard Liao 
131133ada14aSBard Liao 	mutex_lock(&rt5665->calibrate_mutex);
131233ada14aSBard Liao 
1313467a2553SKuninori Morimoto 	val = snd_soc_component_read(rt5665->component, RT5665_AJD1_CTRL) & 0x0010;
131433ada14aSBard Liao 	if (!val) {
131533ada14aSBard Liao 		/* jack in */
131633ada14aSBard Liao 		if (rt5665->jack_type == 0) {
131733ada14aSBard Liao 			/* jack was out, report jack type */
131833ada14aSBard Liao 			rt5665->jack_type =
1319fab70c27SKuninori Morimoto 				rt5665_headset_detect(rt5665->component, 1);
132033ada14aSBard Liao 		} else {
132133ada14aSBard Liao 			/* jack is already in, report button event */
132233ada14aSBard Liao 			rt5665->jack_type = SND_JACK_HEADSET;
1323fab70c27SKuninori Morimoto 			btn_type = rt5665_button_detect(rt5665->component);
132433ada14aSBard Liao 			/**
132533ada14aSBard Liao 			 * rt5665 can report three kinds of button behavior,
132633ada14aSBard Liao 			 * one click, double click and hold. However,
132733ada14aSBard Liao 			 * currently we will report button pressed/released
132833ada14aSBard Liao 			 * event. So all the three button behaviors are
132933ada14aSBard Liao 			 * treated as button pressed.
133033ada14aSBard Liao 			 */
133133ada14aSBard Liao 			switch (btn_type) {
133233ada14aSBard Liao 			case 0x8000:
133333ada14aSBard Liao 			case 0x4000:
133433ada14aSBard Liao 			case 0x2000:
133533ada14aSBard Liao 				rt5665->jack_type |= SND_JACK_BTN_0;
133633ada14aSBard Liao 				break;
133733ada14aSBard Liao 			case 0x1000:
133833ada14aSBard Liao 			case 0x0800:
133933ada14aSBard Liao 			case 0x0400:
134033ada14aSBard Liao 				rt5665->jack_type |= SND_JACK_BTN_1;
134133ada14aSBard Liao 				break;
134233ada14aSBard Liao 			case 0x0200:
134333ada14aSBard Liao 			case 0x0100:
134433ada14aSBard Liao 			case 0x0080:
134533ada14aSBard Liao 				rt5665->jack_type |= SND_JACK_BTN_2;
134633ada14aSBard Liao 				break;
134733ada14aSBard Liao 			case 0x0040:
134833ada14aSBard Liao 			case 0x0020:
134933ada14aSBard Liao 			case 0x0010:
135033ada14aSBard Liao 				rt5665->jack_type |= SND_JACK_BTN_3;
135133ada14aSBard Liao 				break;
135233ada14aSBard Liao 			case 0x0000: /* unpressed */
135333ada14aSBard Liao 				break;
135433ada14aSBard Liao 			default:
135533ada14aSBard Liao 				btn_type = 0;
1356fab70c27SKuninori Morimoto 				dev_err(rt5665->component->dev,
135733ada14aSBard Liao 					"Unexpected button code 0x%04x\n",
135833ada14aSBard Liao 					btn_type);
135933ada14aSBard Liao 				break;
136033ada14aSBard Liao 			}
136133ada14aSBard Liao 		}
136233ada14aSBard Liao 	} else {
136333ada14aSBard Liao 		/* jack out */
1364fab70c27SKuninori Morimoto 		rt5665->jack_type = rt5665_headset_detect(rt5665->component, 0);
136533ada14aSBard Liao 	}
136633ada14aSBard Liao 
136733ada14aSBard Liao 	snd_soc_jack_report(rt5665->hs_jack, rt5665->jack_type,
136833ada14aSBard Liao 			SND_JACK_HEADSET |
136933ada14aSBard Liao 			    SND_JACK_BTN_0 | SND_JACK_BTN_1 |
137033ada14aSBard Liao 			    SND_JACK_BTN_2 | SND_JACK_BTN_3);
137133ada14aSBard Liao 
137233ada14aSBard Liao 	if (rt5665->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |
137333ada14aSBard Liao 		SND_JACK_BTN_2 | SND_JACK_BTN_3))
137433ada14aSBard Liao 		schedule_delayed_work(&rt5665->jd_check_work, 0);
137533ada14aSBard Liao 	else
137633ada14aSBard Liao 		cancel_delayed_work_sync(&rt5665->jd_check_work);
137733ada14aSBard Liao 
137833ada14aSBard Liao 	mutex_unlock(&rt5665->calibrate_mutex);
137933ada14aSBard Liao }
138033ada14aSBard Liao 
13818bfa4268SBard Liao static const char * const rt5665_clk_sync[] = {
13828bfa4268SBard Liao 	"I2S1_1", "I2S1_2", "I2S2", "I2S3", "IF2 Slave", "IF3 Slave"
13838bfa4268SBard Liao };
13848bfa4268SBard Liao 
13858bfa4268SBard Liao static const struct soc_enum rt5665_enum[] = {
13868bfa4268SBard Liao 	SOC_ENUM_SINGLE(RT5665_I2S1_SDP, 11, 5, rt5665_clk_sync),
13878bfa4268SBard Liao 	SOC_ENUM_SINGLE(RT5665_I2S2_SDP, 11, 5, rt5665_clk_sync),
13888bfa4268SBard Liao 	SOC_ENUM_SINGLE(RT5665_I2S3_SDP, 11, 5, rt5665_clk_sync),
13898bfa4268SBard Liao };
13908bfa4268SBard Liao 
139133ada14aSBard Liao static const struct snd_kcontrol_new rt5665_snd_controls[] = {
139233ada14aSBard Liao 	/* Headphone Output Volume */
139333ada14aSBard Liao 	SOC_DOUBLE_R_EXT_TLV("Headphone Playback Volume", RT5665_HPL_GAIN,
139433ada14aSBard Liao 		RT5665_HPR_GAIN, RT5665_G_HP_SFT, 15, 1, snd_soc_get_volsw,
139533ada14aSBard Liao 		rt5665_hp_vol_put, hp_vol_tlv),
139633ada14aSBard Liao 
139733ada14aSBard Liao 	/* Mono Output Volume */
139833ada14aSBard Liao 	SOC_SINGLE_EXT_TLV("Mono Playback Volume", RT5665_MONO_GAIN,
139933ada14aSBard Liao 		RT5665_L_VOL_SFT, 15, 1, snd_soc_get_volsw,
140033ada14aSBard Liao 		rt5665_mono_vol_put, mono_vol_tlv),
140133ada14aSBard Liao 
1402b833786bSBard Liao 	SOC_SINGLE_TLV("MONOVOL Playback Volume", RT5665_MONO_OUT,
1403b833786bSBard Liao 		RT5665_L_VOL_SFT, 39, 1, out_vol_tlv),
1404b833786bSBard Liao 
140533ada14aSBard Liao 	/* Output Volume */
140633ada14aSBard Liao 	SOC_DOUBLE_TLV("OUT Playback Volume", RT5665_LOUT, RT5665_L_VOL_SFT,
140733ada14aSBard Liao 		RT5665_R_VOL_SFT, 39, 1, out_vol_tlv),
140833ada14aSBard Liao 
140933ada14aSBard Liao 	/* DAC Digital Volume */
141033ada14aSBard Liao 	SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5665_DAC1_DIG_VOL,
141133ada14aSBard Liao 		RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 175, 0, dac_vol_tlv),
141233ada14aSBard Liao 	SOC_DOUBLE_TLV("DAC2 Playback Volume", RT5665_DAC2_DIG_VOL,
141333ada14aSBard Liao 		RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 175, 0, dac_vol_tlv),
141433ada14aSBard Liao 	SOC_DOUBLE("DAC2 Playback Switch", RT5665_DAC2_CTRL,
141533ada14aSBard Liao 		RT5665_M_DAC2_L_VOL_SFT, RT5665_M_DAC2_R_VOL_SFT, 1, 1),
141633ada14aSBard Liao 
141733ada14aSBard Liao 	/* IN1/IN2/IN3/IN4 Volume */
141833ada14aSBard Liao 	SOC_SINGLE_TLV("IN1 Boost Volume", RT5665_IN1_IN2,
141933ada14aSBard Liao 		RT5665_BST1_SFT, 69, 0, in_bst_tlv),
142033ada14aSBard Liao 	SOC_SINGLE_TLV("IN2 Boost Volume", RT5665_IN1_IN2,
142133ada14aSBard Liao 		RT5665_BST2_SFT, 69, 0, in_bst_tlv),
142233ada14aSBard Liao 	SOC_SINGLE_TLV("IN3 Boost Volume", RT5665_IN3_IN4,
142333ada14aSBard Liao 		RT5665_BST3_SFT, 69, 0, in_bst_tlv),
142433ada14aSBard Liao 	SOC_SINGLE_TLV("IN4 Boost Volume", RT5665_IN3_IN4,
142533ada14aSBard Liao 		RT5665_BST4_SFT, 69, 0, in_bst_tlv),
142633ada14aSBard Liao 	SOC_SINGLE_TLV("CBJ Boost Volume", RT5665_CBJ_BST_CTRL,
142733ada14aSBard Liao 		RT5665_BST_CBJ_SFT, 8, 0, bst_tlv),
142833ada14aSBard Liao 
142933ada14aSBard Liao 	/* INL/INR Volume Control */
143033ada14aSBard Liao 	SOC_DOUBLE_TLV("IN Capture Volume", RT5665_INL1_INR1_VOL,
143133ada14aSBard Liao 		RT5665_INL_VOL_SFT, RT5665_INR_VOL_SFT, 31, 1, in_vol_tlv),
143233ada14aSBard Liao 
143333ada14aSBard Liao 	/* ADC Digital Volume Control */
143433ada14aSBard Liao 	SOC_DOUBLE("STO1 ADC Capture Switch", RT5665_STO1_ADC_DIG_VOL,
143533ada14aSBard Liao 		RT5665_L_MUTE_SFT, RT5665_R_MUTE_SFT, 1, 1),
143633ada14aSBard Liao 	SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5665_STO1_ADC_DIG_VOL,
143733ada14aSBard Liao 		RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 127, 0, adc_vol_tlv),
143833ada14aSBard Liao 	SOC_DOUBLE("Mono ADC Capture Switch", RT5665_MONO_ADC_DIG_VOL,
143933ada14aSBard Liao 		RT5665_L_MUTE_SFT, RT5665_R_MUTE_SFT, 1, 1),
144033ada14aSBard Liao 	SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5665_MONO_ADC_DIG_VOL,
144133ada14aSBard Liao 		RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 127, 0, adc_vol_tlv),
144233ada14aSBard Liao 	SOC_DOUBLE("STO2 ADC Capture Switch", RT5665_STO2_ADC_DIG_VOL,
144333ada14aSBard Liao 		RT5665_L_MUTE_SFT, RT5665_R_MUTE_SFT, 1, 1),
144433ada14aSBard Liao 	SOC_DOUBLE_TLV("STO2 ADC Capture Volume", RT5665_STO2_ADC_DIG_VOL,
144533ada14aSBard Liao 		RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 127, 0, adc_vol_tlv),
144633ada14aSBard Liao 
144733ada14aSBard Liao 	/* ADC Boost Volume Control */
144833ada14aSBard Liao 	SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5665_STO1_ADC_BOOST,
144933ada14aSBard Liao 		RT5665_STO1_ADC_L_BST_SFT, RT5665_STO1_ADC_R_BST_SFT,
145033ada14aSBard Liao 		3, 0, adc_bst_tlv),
145133ada14aSBard Liao 
145233ada14aSBard Liao 	SOC_DOUBLE_TLV("Mono ADC Boost Gain Volume", RT5665_MONO_ADC_BOOST,
145333ada14aSBard Liao 		RT5665_MONO_ADC_L_BST_SFT, RT5665_MONO_ADC_R_BST_SFT,
145433ada14aSBard Liao 		3, 0, adc_bst_tlv),
145533ada14aSBard Liao 
145633ada14aSBard Liao 	SOC_DOUBLE_TLV("STO2 ADC Boost Gain Volume", RT5665_STO2_ADC_BOOST,
145733ada14aSBard Liao 		RT5665_STO2_ADC_L_BST_SFT, RT5665_STO2_ADC_R_BST_SFT,
145833ada14aSBard Liao 		3, 0, adc_bst_tlv),
14598bfa4268SBard Liao 
14608bfa4268SBard Liao 	/* I2S3 CLK Source */
14618bfa4268SBard Liao 	SOC_ENUM("I2S1 Master Clk Sel", rt5665_enum[0]),
14628bfa4268SBard Liao 	SOC_ENUM("I2S2 Master Clk Sel", rt5665_enum[1]),
14638bfa4268SBard Liao 	SOC_ENUM("I2S3 Master Clk Sel", rt5665_enum[2]),
146433ada14aSBard Liao };
146533ada14aSBard Liao 
146633ada14aSBard Liao /**
146733ada14aSBard Liao  * set_dmic_clk - Set parameter of dmic.
146833ada14aSBard Liao  *
146933ada14aSBard Liao  * @w: DAPM widget.
147033ada14aSBard Liao  * @kcontrol: The kcontrol of this widget.
147133ada14aSBard Liao  * @event: Event id.
147233ada14aSBard Liao  *
147333ada14aSBard Liao  * Choose dmic clock between 1MHz and 3MHz.
147433ada14aSBard Liao  * It is better for clock to approximate 3MHz.
147533ada14aSBard Liao  */
147633ada14aSBard Liao static int set_dmic_clk(struct snd_soc_dapm_widget *w,
147733ada14aSBard Liao 	struct snd_kcontrol *kcontrol, int event)
147833ada14aSBard Liao {
1479fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1480fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
1481590eb2f4SColin Ian King 	int pd, idx;
148233ada14aSBard Liao 
148333ada14aSBard Liao 	pd = rl6231_get_pre_div(rt5665->regmap,
148433ada14aSBard Liao 		RT5665_ADDA_CLK_1, RT5665_I2S_PD1_SFT);
148533ada14aSBard Liao 	idx = rl6231_calc_dmic_clk(rt5665->sysclk / pd);
148633ada14aSBard Liao 
148733ada14aSBard Liao 	if (idx < 0)
1488fab70c27SKuninori Morimoto 		dev_err(component->dev, "Failed to set DMIC clock\n");
148933ada14aSBard Liao 	else {
1490fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_DMIC_CTRL_1,
149133ada14aSBard Liao 			RT5665_DMIC_CLK_MASK, idx << RT5665_DMIC_CLK_SFT);
149233ada14aSBard Liao 	}
149333ada14aSBard Liao 	return idx;
149433ada14aSBard Liao }
149533ada14aSBard Liao 
149633ada14aSBard Liao static int rt5665_charge_pump_event(struct snd_soc_dapm_widget *w,
149733ada14aSBard Liao 	struct snd_kcontrol *kcontrol, int event)
149833ada14aSBard Liao {
1499fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
150033ada14aSBard Liao 
150133ada14aSBard Liao 	switch (event) {
150233ada14aSBard Liao 	case SND_SOC_DAPM_PRE_PMU:
1503fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_HP_CHARGE_PUMP_1,
150433ada14aSBard Liao 			RT5665_PM_HP_MASK | RT5665_OSW_L_MASK,
150533ada14aSBard Liao 			RT5665_PM_HP_HV | RT5665_OSW_L_EN);
150633ada14aSBard Liao 		break;
150733ada14aSBard Liao 	case SND_SOC_DAPM_POST_PMD:
1508fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_HP_CHARGE_PUMP_1,
150933ada14aSBard Liao 			RT5665_PM_HP_MASK | RT5665_OSW_L_MASK,
151033ada14aSBard Liao 			RT5665_PM_HP_LV | RT5665_OSW_L_DIS);
151133ada14aSBard Liao 		break;
151233ada14aSBard Liao 	default:
151333ada14aSBard Liao 		return 0;
151433ada14aSBard Liao 	}
151533ada14aSBard Liao 
151633ada14aSBard Liao 	return 0;
151733ada14aSBard Liao }
151833ada14aSBard Liao 
151933ada14aSBard Liao static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *w,
152033ada14aSBard Liao 			 struct snd_soc_dapm_widget *sink)
152133ada14aSBard Liao {
152233ada14aSBard Liao 	unsigned int val;
1523fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
152433ada14aSBard Liao 
1525467a2553SKuninori Morimoto 	val = snd_soc_component_read(component, RT5665_GLB_CLK);
152633ada14aSBard Liao 	val &= RT5665_SCLK_SRC_MASK;
152733ada14aSBard Liao 	if (val == RT5665_SCLK_SRC_PLL1)
152833ada14aSBard Liao 		return 1;
152933ada14aSBard Liao 	else
153033ada14aSBard Liao 		return 0;
153133ada14aSBard Liao }
153233ada14aSBard Liao 
153333ada14aSBard Liao static int is_using_asrc(struct snd_soc_dapm_widget *w,
153433ada14aSBard Liao 			 struct snd_soc_dapm_widget *sink)
153533ada14aSBard Liao {
153633ada14aSBard Liao 	unsigned int reg, shift, val;
1537fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
153833ada14aSBard Liao 
153933ada14aSBard Liao 	switch (w->shift) {
154033ada14aSBard Liao 	case RT5665_ADC_MONO_R_ASRC_SFT:
154133ada14aSBard Liao 		reg = RT5665_ASRC_3;
154233ada14aSBard Liao 		shift = RT5665_AD_MONOR_CLK_SEL_SFT;
154333ada14aSBard Liao 		break;
154433ada14aSBard Liao 	case RT5665_ADC_MONO_L_ASRC_SFT:
154533ada14aSBard Liao 		reg = RT5665_ASRC_3;
154633ada14aSBard Liao 		shift = RT5665_AD_MONOL_CLK_SEL_SFT;
154733ada14aSBard Liao 		break;
154833ada14aSBard Liao 	case RT5665_ADC_STO1_ASRC_SFT:
154933ada14aSBard Liao 		reg = RT5665_ASRC_3;
155033ada14aSBard Liao 		shift = RT5665_AD_STO1_CLK_SEL_SFT;
155133ada14aSBard Liao 		break;
155233ada14aSBard Liao 	case RT5665_ADC_STO2_ASRC_SFT:
155333ada14aSBard Liao 		reg = RT5665_ASRC_3;
155433ada14aSBard Liao 		shift = RT5665_AD_STO2_CLK_SEL_SFT;
155533ada14aSBard Liao 		break;
155633ada14aSBard Liao 	case RT5665_DAC_MONO_R_ASRC_SFT:
155733ada14aSBard Liao 		reg = RT5665_ASRC_2;
155833ada14aSBard Liao 		shift = RT5665_DA_MONOR_CLK_SEL_SFT;
155933ada14aSBard Liao 		break;
156033ada14aSBard Liao 	case RT5665_DAC_MONO_L_ASRC_SFT:
156133ada14aSBard Liao 		reg = RT5665_ASRC_2;
156233ada14aSBard Liao 		shift = RT5665_DA_MONOL_CLK_SEL_SFT;
156333ada14aSBard Liao 		break;
156433ada14aSBard Liao 	case RT5665_DAC_STO1_ASRC_SFT:
156533ada14aSBard Liao 		reg = RT5665_ASRC_2;
156633ada14aSBard Liao 		shift = RT5665_DA_STO1_CLK_SEL_SFT;
156733ada14aSBard Liao 		break;
156833ada14aSBard Liao 	case RT5665_DAC_STO2_ASRC_SFT:
156933ada14aSBard Liao 		reg = RT5665_ASRC_2;
157033ada14aSBard Liao 		shift = RT5665_DA_STO2_CLK_SEL_SFT;
157133ada14aSBard Liao 		break;
157233ada14aSBard Liao 	default:
157333ada14aSBard Liao 		return 0;
157433ada14aSBard Liao 	}
157533ada14aSBard Liao 
1576467a2553SKuninori Morimoto 	val = (snd_soc_component_read(component, reg) >> shift) & 0xf;
157733ada14aSBard Liao 	switch (val) {
157833ada14aSBard Liao 	case RT5665_CLK_SEL_I2S1_ASRC:
157933ada14aSBard Liao 	case RT5665_CLK_SEL_I2S2_ASRC:
158033ada14aSBard Liao 	case RT5665_CLK_SEL_I2S3_ASRC:
158133ada14aSBard Liao 		/* I2S_Pre_Div1 should be 1 in asrc mode */
1582fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_ADDA_CLK_1,
158333ada14aSBard Liao 			RT5665_I2S_PD1_MASK, RT5665_I2S_PD1_2);
158433ada14aSBard Liao 		return 1;
158533ada14aSBard Liao 	default:
158633ada14aSBard Liao 		return 0;
158733ada14aSBard Liao 	}
158833ada14aSBard Liao 
158933ada14aSBard Liao }
159033ada14aSBard Liao 
159133ada14aSBard Liao /* Digital Mixer */
159233ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_adc_l_mix[] = {
159333ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5665_STO1_ADC_MIXER,
159433ada14aSBard Liao 			RT5665_M_STO1_ADC_L1_SFT, 1, 1),
159533ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5665_STO1_ADC_MIXER,
159633ada14aSBard Liao 			RT5665_M_STO1_ADC_L2_SFT, 1, 1),
159733ada14aSBard Liao };
159833ada14aSBard Liao 
159933ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_adc_r_mix[] = {
160033ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5665_STO1_ADC_MIXER,
160133ada14aSBard Liao 			RT5665_M_STO1_ADC_R1_SFT, 1, 1),
160233ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5665_STO1_ADC_MIXER,
160333ada14aSBard Liao 			RT5665_M_STO1_ADC_R2_SFT, 1, 1),
160433ada14aSBard Liao };
160533ada14aSBard Liao 
160633ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_adc_l_mix[] = {
160733ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5665_STO2_ADC_MIXER,
160833ada14aSBard Liao 			RT5665_M_STO2_ADC_L1_SFT, 1, 1),
160933ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5665_STO2_ADC_MIXER,
161033ada14aSBard Liao 			RT5665_M_STO2_ADC_L2_SFT, 1, 1),
161133ada14aSBard Liao };
161233ada14aSBard Liao 
161333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_adc_r_mix[] = {
161433ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5665_STO2_ADC_MIXER,
161533ada14aSBard Liao 			RT5665_M_STO2_ADC_R1_SFT, 1, 1),
161633ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5665_STO2_ADC_MIXER,
161733ada14aSBard Liao 			RT5665_M_STO2_ADC_R2_SFT, 1, 1),
161833ada14aSBard Liao };
161933ada14aSBard Liao 
162033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_adc_l_mix[] = {
162133ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5665_MONO_ADC_MIXER,
162233ada14aSBard Liao 			RT5665_M_MONO_ADC_L1_SFT, 1, 1),
162333ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5665_MONO_ADC_MIXER,
162433ada14aSBard Liao 			RT5665_M_MONO_ADC_L2_SFT, 1, 1),
162533ada14aSBard Liao };
162633ada14aSBard Liao 
162733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_adc_r_mix[] = {
162833ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5665_MONO_ADC_MIXER,
162933ada14aSBard Liao 			RT5665_M_MONO_ADC_R1_SFT, 1, 1),
163033ada14aSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5665_MONO_ADC_MIXER,
163133ada14aSBard Liao 			RT5665_M_MONO_ADC_R2_SFT, 1, 1),
163233ada14aSBard Liao };
163333ada14aSBard Liao 
163433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dac_l_mix[] = {
163533ada14aSBard Liao 	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5665_AD_DA_MIXER,
163633ada14aSBard Liao 			RT5665_M_ADCMIX_L_SFT, 1, 1),
163733ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5665_AD_DA_MIXER,
163833ada14aSBard Liao 			RT5665_M_DAC1_L_SFT, 1, 1),
163933ada14aSBard Liao };
164033ada14aSBard Liao 
164133ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dac_r_mix[] = {
164233ada14aSBard Liao 	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5665_AD_DA_MIXER,
164333ada14aSBard Liao 			RT5665_M_ADCMIX_R_SFT, 1, 1),
164433ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5665_AD_DA_MIXER,
164533ada14aSBard Liao 			RT5665_M_DAC1_R_SFT, 1, 1),
164633ada14aSBard Liao };
164733ada14aSBard Liao 
164833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_dac_l_mix[] = {
164933ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_STO1_DAC_MIXER,
165033ada14aSBard Liao 			RT5665_M_DAC_L1_STO_L_SFT, 1, 1),
165133ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_STO1_DAC_MIXER,
165233ada14aSBard Liao 			RT5665_M_DAC_R1_STO_L_SFT, 1, 1),
165333ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_STO1_DAC_MIXER,
165433ada14aSBard Liao 			RT5665_M_DAC_L2_STO_L_SFT, 1, 1),
165533ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_STO1_DAC_MIXER,
165633ada14aSBard Liao 			RT5665_M_DAC_R2_STO_L_SFT, 1, 1),
165733ada14aSBard Liao };
165833ada14aSBard Liao 
165933ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_dac_r_mix[] = {
166033ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_STO1_DAC_MIXER,
166133ada14aSBard Liao 			RT5665_M_DAC_L1_STO_R_SFT, 1, 1),
166233ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_STO1_DAC_MIXER,
166333ada14aSBard Liao 			RT5665_M_DAC_R1_STO_R_SFT, 1, 1),
166433ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_STO1_DAC_MIXER,
166533ada14aSBard Liao 			RT5665_M_DAC_L2_STO_R_SFT, 1, 1),
166633ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_STO1_DAC_MIXER,
166733ada14aSBard Liao 			RT5665_M_DAC_R2_STO_R_SFT, 1, 1),
166833ada14aSBard Liao };
166933ada14aSBard Liao 
167033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_dac_l_mix[] = {
167133ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_STO2_DAC_MIXER,
167233ada14aSBard Liao 			RT5665_M_DAC_L1_STO2_L_SFT, 1, 1),
167333ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_STO2_DAC_MIXER,
167433ada14aSBard Liao 			RT5665_M_DAC_L2_STO2_L_SFT, 1, 1),
167533ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L3 Switch", RT5665_STO2_DAC_MIXER,
167633ada14aSBard Liao 			RT5665_M_DAC_L3_STO2_L_SFT, 1, 1),
167733ada14aSBard Liao };
167833ada14aSBard Liao 
167933ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_dac_r_mix[] = {
168033ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_STO2_DAC_MIXER,
168133ada14aSBard Liao 			RT5665_M_DAC_R1_STO2_R_SFT, 1, 1),
168233ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_STO2_DAC_MIXER,
168333ada14aSBard Liao 			RT5665_M_DAC_R2_STO2_R_SFT, 1, 1),
168433ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R3 Switch", RT5665_STO2_DAC_MIXER,
168533ada14aSBard Liao 			RT5665_M_DAC_R3_STO2_R_SFT, 1, 1),
168633ada14aSBard Liao };
168733ada14aSBard Liao 
168833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_dac_l_mix[] = {
168933ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_MONO_DAC_MIXER,
169033ada14aSBard Liao 			RT5665_M_DAC_L1_MONO_L_SFT, 1, 1),
169133ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_MONO_DAC_MIXER,
169233ada14aSBard Liao 			RT5665_M_DAC_R1_MONO_L_SFT, 1, 1),
169333ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_MONO_DAC_MIXER,
169433ada14aSBard Liao 			RT5665_M_DAC_L2_MONO_L_SFT, 1, 1),
169533ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_MONO_DAC_MIXER,
169633ada14aSBard Liao 			RT5665_M_DAC_R2_MONO_L_SFT, 1, 1),
169733ada14aSBard Liao };
169833ada14aSBard Liao 
169933ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_dac_r_mix[] = {
170033ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_MONO_DAC_MIXER,
170133ada14aSBard Liao 			RT5665_M_DAC_L1_MONO_R_SFT, 1, 1),
170233ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_MONO_DAC_MIXER,
170333ada14aSBard Liao 			RT5665_M_DAC_R1_MONO_R_SFT, 1, 1),
170433ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_MONO_DAC_MIXER,
170533ada14aSBard Liao 			RT5665_M_DAC_L2_MONO_R_SFT, 1, 1),
170633ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_MONO_DAC_MIXER,
170733ada14aSBard Liao 			RT5665_M_DAC_R2_MONO_R_SFT, 1, 1),
170833ada14aSBard Liao };
170933ada14aSBard Liao 
171033ada14aSBard Liao /* Analog Input Mixer */
171133ada14aSBard Liao static const struct snd_kcontrol_new rt5665_rec1_l_mix[] = {
171233ada14aSBard Liao 	SOC_DAPM_SINGLE("CBJ Switch", RT5665_REC1_L2_MIXER,
171333ada14aSBard Liao 			RT5665_M_CBJ_RM1_L_SFT, 1, 1),
171433ada14aSBard Liao 	SOC_DAPM_SINGLE("INL Switch", RT5665_REC1_L2_MIXER,
171533ada14aSBard Liao 			RT5665_M_INL_RM1_L_SFT, 1, 1),
171633ada14aSBard Liao 	SOC_DAPM_SINGLE("INR Switch", RT5665_REC1_L2_MIXER,
171733ada14aSBard Liao 			RT5665_M_INR_RM1_L_SFT, 1, 1),
171833ada14aSBard Liao 	SOC_DAPM_SINGLE("BST4 Switch", RT5665_REC1_L2_MIXER,
171933ada14aSBard Liao 			RT5665_M_BST4_RM1_L_SFT, 1, 1),
172033ada14aSBard Liao 	SOC_DAPM_SINGLE("BST3 Switch", RT5665_REC1_L2_MIXER,
172133ada14aSBard Liao 			RT5665_M_BST3_RM1_L_SFT, 1, 1),
172233ada14aSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5665_REC1_L2_MIXER,
172333ada14aSBard Liao 			RT5665_M_BST2_RM1_L_SFT, 1, 1),
172433ada14aSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5665_REC1_L2_MIXER,
172533ada14aSBard Liao 			RT5665_M_BST1_RM1_L_SFT, 1, 1),
172633ada14aSBard Liao };
172733ada14aSBard Liao 
172833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_rec1_r_mix[] = {
172933ada14aSBard Liao 	SOC_DAPM_SINGLE("MONOVOL Switch", RT5665_REC1_R2_MIXER,
173033ada14aSBard Liao 			RT5665_M_AEC_REF_RM1_R_SFT, 1, 1),
173133ada14aSBard Liao 	SOC_DAPM_SINGLE("INR Switch", RT5665_REC1_R2_MIXER,
173233ada14aSBard Liao 			RT5665_M_INR_RM1_R_SFT, 1, 1),
173333ada14aSBard Liao 	SOC_DAPM_SINGLE("BST4 Switch", RT5665_REC1_R2_MIXER,
173433ada14aSBard Liao 			RT5665_M_BST4_RM1_R_SFT, 1, 1),
173533ada14aSBard Liao 	SOC_DAPM_SINGLE("BST3 Switch", RT5665_REC1_R2_MIXER,
173633ada14aSBard Liao 			RT5665_M_BST3_RM1_R_SFT, 1, 1),
173733ada14aSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5665_REC1_R2_MIXER,
173833ada14aSBard Liao 			RT5665_M_BST2_RM1_R_SFT, 1, 1),
173933ada14aSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5665_REC1_R2_MIXER,
174033ada14aSBard Liao 			RT5665_M_BST1_RM1_R_SFT, 1, 1),
174133ada14aSBard Liao };
174233ada14aSBard Liao 
174333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_rec2_l_mix[] = {
174433ada14aSBard Liao 	SOC_DAPM_SINGLE("INL Switch", RT5665_REC2_L2_MIXER,
174533ada14aSBard Liao 			RT5665_M_INL_RM2_L_SFT, 1, 1),
174633ada14aSBard Liao 	SOC_DAPM_SINGLE("INR Switch", RT5665_REC2_L2_MIXER,
174733ada14aSBard Liao 			RT5665_M_INR_RM2_L_SFT, 1, 1),
174833ada14aSBard Liao 	SOC_DAPM_SINGLE("CBJ Switch", RT5665_REC2_L2_MIXER,
174933ada14aSBard Liao 			RT5665_M_CBJ_RM2_L_SFT, 1, 1),
175033ada14aSBard Liao 	SOC_DAPM_SINGLE("BST4 Switch", RT5665_REC2_L2_MIXER,
175133ada14aSBard Liao 			RT5665_M_BST4_RM2_L_SFT, 1, 1),
175233ada14aSBard Liao 	SOC_DAPM_SINGLE("BST3 Switch", RT5665_REC2_L2_MIXER,
175333ada14aSBard Liao 			RT5665_M_BST3_RM2_L_SFT, 1, 1),
175433ada14aSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5665_REC2_L2_MIXER,
175533ada14aSBard Liao 			RT5665_M_BST2_RM2_L_SFT, 1, 1),
175633ada14aSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5665_REC2_L2_MIXER,
175733ada14aSBard Liao 			RT5665_M_BST1_RM2_L_SFT, 1, 1),
175833ada14aSBard Liao };
175933ada14aSBard Liao 
176033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_rec2_r_mix[] = {
176133ada14aSBard Liao 	SOC_DAPM_SINGLE("MONOVOL Switch", RT5665_REC2_R2_MIXER,
176233ada14aSBard Liao 			RT5665_M_MONOVOL_RM2_R_SFT, 1, 1),
176333ada14aSBard Liao 	SOC_DAPM_SINGLE("INL Switch", RT5665_REC2_R2_MIXER,
176433ada14aSBard Liao 			RT5665_M_INL_RM2_R_SFT, 1, 1),
176533ada14aSBard Liao 	SOC_DAPM_SINGLE("INR Switch", RT5665_REC2_R2_MIXER,
176633ada14aSBard Liao 			RT5665_M_INR_RM2_R_SFT, 1, 1),
176733ada14aSBard Liao 	SOC_DAPM_SINGLE("BST4 Switch", RT5665_REC2_R2_MIXER,
176833ada14aSBard Liao 			RT5665_M_BST4_RM2_R_SFT, 1, 1),
176933ada14aSBard Liao 	SOC_DAPM_SINGLE("BST3 Switch", RT5665_REC2_R2_MIXER,
177033ada14aSBard Liao 			RT5665_M_BST3_RM2_R_SFT, 1, 1),
177133ada14aSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5665_REC2_R2_MIXER,
177233ada14aSBard Liao 			RT5665_M_BST2_RM2_R_SFT, 1, 1),
177333ada14aSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5665_REC2_R2_MIXER,
177433ada14aSBard Liao 			RT5665_M_BST1_RM2_R_SFT, 1, 1),
177533ada14aSBard Liao };
177633ada14aSBard Liao 
177733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_monovol_mix[] = {
177833ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_MONOMIX_IN_GAIN,
177933ada14aSBard Liao 			RT5665_M_DAC_L2_MM_SFT, 1, 1),
178033ada14aSBard Liao 	SOC_DAPM_SINGLE("RECMIX2L Switch", RT5665_MONOMIX_IN_GAIN,
178133ada14aSBard Liao 			RT5665_M_RECMIC2L_MM_SFT, 1, 1),
178233ada14aSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5665_MONOMIX_IN_GAIN,
178333ada14aSBard Liao 			RT5665_M_BST1_MM_SFT, 1, 1),
178433ada14aSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5665_MONOMIX_IN_GAIN,
178533ada14aSBard Liao 			RT5665_M_BST2_MM_SFT, 1, 1),
178633ada14aSBard Liao 	SOC_DAPM_SINGLE("BST3 Switch", RT5665_MONOMIX_IN_GAIN,
178733ada14aSBard Liao 			RT5665_M_BST3_MM_SFT, 1, 1),
178833ada14aSBard Liao };
178933ada14aSBard Liao 
179033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_out_l_mix[] = {
179133ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_OUT_L_MIXER,
179233ada14aSBard Liao 			RT5665_M_DAC_L2_OM_L_SFT, 1, 1),
179333ada14aSBard Liao 	SOC_DAPM_SINGLE("INL Switch", RT5665_OUT_L_MIXER,
179433ada14aSBard Liao 			RT5665_M_IN_L_OM_L_SFT, 1, 1),
179533ada14aSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5665_OUT_L_MIXER,
179633ada14aSBard Liao 			RT5665_M_BST1_OM_L_SFT, 1, 1),
179733ada14aSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5665_OUT_L_MIXER,
179833ada14aSBard Liao 			RT5665_M_BST2_OM_L_SFT, 1, 1),
179933ada14aSBard Liao 	SOC_DAPM_SINGLE("BST3 Switch", RT5665_OUT_L_MIXER,
180033ada14aSBard Liao 			RT5665_M_BST3_OM_L_SFT, 1, 1),
180133ada14aSBard Liao };
180233ada14aSBard Liao 
180333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_out_r_mix[] = {
180433ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_OUT_R_MIXER,
180533ada14aSBard Liao 			RT5665_M_DAC_R2_OM_R_SFT, 1, 1),
180633ada14aSBard Liao 	SOC_DAPM_SINGLE("INR Switch", RT5665_OUT_R_MIXER,
180733ada14aSBard Liao 			RT5665_M_IN_R_OM_R_SFT, 1, 1),
180833ada14aSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5665_OUT_R_MIXER,
180933ada14aSBard Liao 			RT5665_M_BST2_OM_R_SFT, 1, 1),
181033ada14aSBard Liao 	SOC_DAPM_SINGLE("BST3 Switch", RT5665_OUT_R_MIXER,
181133ada14aSBard Liao 			RT5665_M_BST3_OM_R_SFT, 1, 1),
181233ada14aSBard Liao 	SOC_DAPM_SINGLE("BST4 Switch", RT5665_OUT_R_MIXER,
181333ada14aSBard Liao 			RT5665_M_BST4_OM_R_SFT, 1, 1),
181433ada14aSBard Liao };
181533ada14aSBard Liao 
181633ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_mix[] = {
181733ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_MONOMIX_IN_GAIN,
181833ada14aSBard Liao 			RT5665_M_DAC_L2_MA_SFT, 1, 1),
181933ada14aSBard Liao 	SOC_DAPM_SINGLE("MONOVOL Switch", RT5665_MONOMIX_IN_GAIN,
182033ada14aSBard Liao 			RT5665_M_MONOVOL_MA_SFT, 1, 1),
182133ada14aSBard Liao };
182233ada14aSBard Liao 
182333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_lout_l_mix[] = {
182433ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_LOUT_MIXER,
182533ada14aSBard Liao 			RT5665_M_DAC_L2_LM_SFT, 1, 1),
182633ada14aSBard Liao 	SOC_DAPM_SINGLE("OUTVOL L Switch", RT5665_LOUT_MIXER,
182733ada14aSBard Liao 			RT5665_M_OV_L_LM_SFT, 1, 1),
182833ada14aSBard Liao };
182933ada14aSBard Liao 
183033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_lout_r_mix[] = {
183133ada14aSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_LOUT_MIXER,
183233ada14aSBard Liao 			RT5665_M_DAC_R2_LM_SFT, 1, 1),
183333ada14aSBard Liao 	SOC_DAPM_SINGLE("OUTVOL R Switch", RT5665_LOUT_MIXER,
183433ada14aSBard Liao 			RT5665_M_OV_R_LM_SFT, 1, 1),
183533ada14aSBard Liao };
183633ada14aSBard Liao 
183733ada14aSBard Liao /*DAC L2, DAC R2*/
183833ada14aSBard Liao /*MX-17 [6:4], MX-17 [2:0]*/
183933ada14aSBard Liao static const char * const rt5665_dac2_src[] = {
184033ada14aSBard Liao 	"IF1 DAC2", "IF2_1 DAC", "IF2_2 DAC", "IF3 DAC", "Mono ADC MIX"
184133ada14aSBard Liao };
184233ada14aSBard Liao 
184327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
184433ada14aSBard Liao 	rt5665_dac_l2_enum, RT5665_DAC2_CTRL,
184533ada14aSBard Liao 	RT5665_DAC_L2_SEL_SFT, rt5665_dac2_src);
184633ada14aSBard Liao 
184733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dac_l2_mux =
184833ada14aSBard Liao 	SOC_DAPM_ENUM("Digital DAC L2 Source", rt5665_dac_l2_enum);
184933ada14aSBard Liao 
185027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
185133ada14aSBard Liao 	rt5665_dac_r2_enum, RT5665_DAC2_CTRL,
185233ada14aSBard Liao 	RT5665_DAC_R2_SEL_SFT, rt5665_dac2_src);
185333ada14aSBard Liao 
185433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dac_r2_mux =
185533ada14aSBard Liao 	SOC_DAPM_ENUM("Digital DAC R2 Source", rt5665_dac_r2_enum);
185633ada14aSBard Liao 
185733ada14aSBard Liao /*DAC L3, DAC R3*/
185833ada14aSBard Liao /*MX-1B [6:4], MX-1B [2:0]*/
185933ada14aSBard Liao static const char * const rt5665_dac3_src[] = {
186033ada14aSBard Liao 	"IF1 DAC2", "IF2_1 DAC", "IF2_2 DAC", "IF3 DAC", "STO2 ADC MIX"
186133ada14aSBard Liao };
186233ada14aSBard Liao 
186327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
186433ada14aSBard Liao 	rt5665_dac_l3_enum, RT5665_DAC3_CTRL,
186533ada14aSBard Liao 	RT5665_DAC_L3_SEL_SFT, rt5665_dac3_src);
186633ada14aSBard Liao 
186733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dac_l3_mux =
186833ada14aSBard Liao 	SOC_DAPM_ENUM("Digital DAC L3 Source", rt5665_dac_l3_enum);
186933ada14aSBard Liao 
187027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
187133ada14aSBard Liao 	rt5665_dac_r3_enum, RT5665_DAC3_CTRL,
187233ada14aSBard Liao 	RT5665_DAC_R3_SEL_SFT, rt5665_dac3_src);
187333ada14aSBard Liao 
187433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dac_r3_mux =
187533ada14aSBard Liao 	SOC_DAPM_ENUM("Digital DAC R3 Source", rt5665_dac_r3_enum);
187633ada14aSBard Liao 
187733ada14aSBard Liao /* STO1 ADC1 Source */
187833ada14aSBard Liao /* MX-26 [13] [5] */
187933ada14aSBard Liao static const char * const rt5665_sto1_adc1_src[] = {
188033ada14aSBard Liao 	"DD Mux", "ADC"
188133ada14aSBard Liao };
188233ada14aSBard Liao 
188327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
188433ada14aSBard Liao 	rt5665_sto1_adc1l_enum, RT5665_STO1_ADC_MIXER,
188533ada14aSBard Liao 	RT5665_STO1_ADC1L_SRC_SFT, rt5665_sto1_adc1_src);
188633ada14aSBard Liao 
188733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_adc1l_mux =
188833ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5665_sto1_adc1l_enum);
188933ada14aSBard Liao 
189027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
189133ada14aSBard Liao 	rt5665_sto1_adc1r_enum, RT5665_STO1_ADC_MIXER,
189233ada14aSBard Liao 	RT5665_STO1_ADC1R_SRC_SFT, rt5665_sto1_adc1_src);
189333ada14aSBard Liao 
189433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_adc1r_mux =
189533ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5665_sto1_adc1r_enum);
189633ada14aSBard Liao 
189733ada14aSBard Liao /* STO1 ADC Source */
189833ada14aSBard Liao /* MX-26 [11:10] [3:2] */
189933ada14aSBard Liao static const char * const rt5665_sto1_adc_src[] = {
190033ada14aSBard Liao 	"ADC1 L", "ADC1 R", "ADC2 L", "ADC2 R"
190133ada14aSBard Liao };
190233ada14aSBard Liao 
190327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
190433ada14aSBard Liao 	rt5665_sto1_adcl_enum, RT5665_STO1_ADC_MIXER,
190533ada14aSBard Liao 	RT5665_STO1_ADCL_SRC_SFT, rt5665_sto1_adc_src);
190633ada14aSBard Liao 
190733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_adcl_mux =
190833ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5665_sto1_adcl_enum);
190933ada14aSBard Liao 
191027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
191133ada14aSBard Liao 	rt5665_sto1_adcr_enum, RT5665_STO1_ADC_MIXER,
191233ada14aSBard Liao 	RT5665_STO1_ADCR_SRC_SFT, rt5665_sto1_adc_src);
191333ada14aSBard Liao 
191433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_adcr_mux =
191533ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5665_sto1_adcr_enum);
191633ada14aSBard Liao 
191733ada14aSBard Liao /* STO1 ADC2 Source */
191833ada14aSBard Liao /* MX-26 [12] [4] */
191933ada14aSBard Liao static const char * const rt5665_sto1_adc2_src[] = {
192033ada14aSBard Liao 	"DAC MIX", "DMIC"
192133ada14aSBard Liao };
192233ada14aSBard Liao 
192327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
192433ada14aSBard Liao 	rt5665_sto1_adc2l_enum, RT5665_STO1_ADC_MIXER,
192533ada14aSBard Liao 	RT5665_STO1_ADC2L_SRC_SFT, rt5665_sto1_adc2_src);
192633ada14aSBard Liao 
192733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_adc2l_mux =
192833ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5665_sto1_adc2l_enum);
192933ada14aSBard Liao 
193027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
193133ada14aSBard Liao 	rt5665_sto1_adc2r_enum, RT5665_STO1_ADC_MIXER,
193233ada14aSBard Liao 	RT5665_STO1_ADC2R_SRC_SFT, rt5665_sto1_adc2_src);
193333ada14aSBard Liao 
193433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_adc2r_mux =
193533ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5665_sto1_adc2r_enum);
193633ada14aSBard Liao 
193733ada14aSBard Liao /* STO1 DMIC Source */
193833ada14aSBard Liao /* MX-26 [8] */
193933ada14aSBard Liao static const char * const rt5665_sto1_dmic_src[] = {
194033ada14aSBard Liao 	"DMIC1", "DMIC2"
194133ada14aSBard Liao };
194233ada14aSBard Liao 
194327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
194433ada14aSBard Liao 	rt5665_sto1_dmic_enum, RT5665_STO1_ADC_MIXER,
194533ada14aSBard Liao 	RT5665_STO1_DMIC_SRC_SFT, rt5665_sto1_dmic_src);
194633ada14aSBard Liao 
194733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_dmic_mux =
194833ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 DMIC Mux", rt5665_sto1_dmic_enum);
194933ada14aSBard Liao 
195033ada14aSBard Liao /* MX-26 [9] */
195133ada14aSBard Liao static const char * const rt5665_sto1_dd_l_src[] = {
195233ada14aSBard Liao 	"STO2 DAC", "MONO DAC"
195333ada14aSBard Liao };
195433ada14aSBard Liao 
195527a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
195633ada14aSBard Liao 	rt5665_sto1_dd_l_enum, RT5665_STO1_ADC_MIXER,
195733ada14aSBard Liao 	RT5665_STO1_DD_L_SRC_SFT, rt5665_sto1_dd_l_src);
195833ada14aSBard Liao 
195933ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_dd_l_mux =
196033ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 DD L Source", rt5665_sto1_dd_l_enum);
196133ada14aSBard Liao 
196233ada14aSBard Liao /* MX-26 [1:0] */
196333ada14aSBard Liao static const char * const rt5665_sto1_dd_r_src[] = {
196433ada14aSBard Liao 	"STO2 DAC", "MONO DAC", "AEC REF"
196533ada14aSBard Liao };
196633ada14aSBard Liao 
196727a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
196833ada14aSBard Liao 	rt5665_sto1_dd_r_enum, RT5665_STO1_ADC_MIXER,
196933ada14aSBard Liao 	RT5665_STO1_DD_R_SRC_SFT, rt5665_sto1_dd_r_src);
197033ada14aSBard Liao 
197133ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto1_dd_r_mux =
197233ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo1 DD R Source", rt5665_sto1_dd_r_enum);
197333ada14aSBard Liao 
197433ada14aSBard Liao /* MONO ADC L2 Source */
197533ada14aSBard Liao /* MX-27 [12] */
197633ada14aSBard Liao static const char * const rt5665_mono_adc_l2_src[] = {
197733ada14aSBard Liao 	"DAC MIXL", "DMIC"
197833ada14aSBard Liao };
197933ada14aSBard Liao 
198027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
198133ada14aSBard Liao 	rt5665_mono_adc_l2_enum, RT5665_MONO_ADC_MIXER,
198233ada14aSBard Liao 	RT5665_MONO_ADC_L2_SRC_SFT, rt5665_mono_adc_l2_src);
198333ada14aSBard Liao 
198433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_adc_l2_mux =
198533ada14aSBard Liao 	SOC_DAPM_ENUM("Mono ADC L2 Source", rt5665_mono_adc_l2_enum);
198633ada14aSBard Liao 
198733ada14aSBard Liao 
198833ada14aSBard Liao /* MONO ADC L1 Source */
198933ada14aSBard Liao /* MX-27 [13] */
199033ada14aSBard Liao static const char * const rt5665_mono_adc_l1_src[] = {
199133ada14aSBard Liao 	"DD Mux", "ADC"
199233ada14aSBard Liao };
199333ada14aSBard Liao 
199427a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
199533ada14aSBard Liao 	rt5665_mono_adc_l1_enum, RT5665_MONO_ADC_MIXER,
199633ada14aSBard Liao 	RT5665_MONO_ADC_L1_SRC_SFT, rt5665_mono_adc_l1_src);
199733ada14aSBard Liao 
199833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_adc_l1_mux =
199933ada14aSBard Liao 	SOC_DAPM_ENUM("Mono ADC L1 Source", rt5665_mono_adc_l1_enum);
200033ada14aSBard Liao 
200133ada14aSBard Liao /* MX-27 [9][1]*/
200233ada14aSBard Liao static const char * const rt5665_mono_dd_src[] = {
200333ada14aSBard Liao 	"STO2 DAC", "MONO DAC"
200433ada14aSBard Liao };
200533ada14aSBard Liao 
200627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
200733ada14aSBard Liao 	rt5665_mono_dd_l_enum, RT5665_MONO_ADC_MIXER,
200833ada14aSBard Liao 	RT5665_MONO_DD_L_SRC_SFT, rt5665_mono_dd_src);
200933ada14aSBard Liao 
201033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_dd_l_mux =
201133ada14aSBard Liao 	SOC_DAPM_ENUM("Mono DD L Source", rt5665_mono_dd_l_enum);
201233ada14aSBard Liao 
201327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
201433ada14aSBard Liao 	rt5665_mono_dd_r_enum, RT5665_MONO_ADC_MIXER,
201533ada14aSBard Liao 	RT5665_MONO_DD_R_SRC_SFT, rt5665_mono_dd_src);
201633ada14aSBard Liao 
201733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_dd_r_mux =
201833ada14aSBard Liao 	SOC_DAPM_ENUM("Mono DD R Source", rt5665_mono_dd_r_enum);
201933ada14aSBard Liao 
202033ada14aSBard Liao /* MONO ADC L Source, MONO ADC R Source*/
202133ada14aSBard Liao /* MX-27 [11:10], MX-27 [3:2] */
202233ada14aSBard Liao static const char * const rt5665_mono_adc_src[] = {
202333ada14aSBard Liao 	"ADC1 L", "ADC1 R", "ADC2 L", "ADC2 R"
202433ada14aSBard Liao };
202533ada14aSBard Liao 
202627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
202733ada14aSBard Liao 	rt5665_mono_adc_l_enum, RT5665_MONO_ADC_MIXER,
202833ada14aSBard Liao 	RT5665_MONO_ADC_L_SRC_SFT, rt5665_mono_adc_src);
202933ada14aSBard Liao 
203033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_adc_l_mux =
203133ada14aSBard Liao 	SOC_DAPM_ENUM("Mono ADC L Source", rt5665_mono_adc_l_enum);
203233ada14aSBard Liao 
203327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
203433ada14aSBard Liao 	rt5665_mono_adcr_enum, RT5665_MONO_ADC_MIXER,
203533ada14aSBard Liao 	RT5665_MONO_ADC_R_SRC_SFT, rt5665_mono_adc_src);
203633ada14aSBard Liao 
203733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_adc_r_mux =
203833ada14aSBard Liao 	SOC_DAPM_ENUM("Mono ADC R Source", rt5665_mono_adcr_enum);
203933ada14aSBard Liao 
204033ada14aSBard Liao /* MONO DMIC L Source */
204133ada14aSBard Liao /* MX-27 [8] */
204233ada14aSBard Liao static const char * const rt5665_mono_dmic_l_src[] = {
204333ada14aSBard Liao 	"DMIC1 L", "DMIC2 L"
204433ada14aSBard Liao };
204533ada14aSBard Liao 
204627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
204733ada14aSBard Liao 	rt5665_mono_dmic_l_enum, RT5665_MONO_ADC_MIXER,
204833ada14aSBard Liao 	RT5665_MONO_DMIC_L_SRC_SFT, rt5665_mono_dmic_l_src);
204933ada14aSBard Liao 
205033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_dmic_l_mux =
205133ada14aSBard Liao 	SOC_DAPM_ENUM("Mono DMIC L Source", rt5665_mono_dmic_l_enum);
205233ada14aSBard Liao 
205333ada14aSBard Liao /* MONO ADC R2 Source */
205433ada14aSBard Liao /* MX-27 [4] */
205533ada14aSBard Liao static const char * const rt5665_mono_adc_r2_src[] = {
205633ada14aSBard Liao 	"DAC MIXR", "DMIC"
205733ada14aSBard Liao };
205833ada14aSBard Liao 
205927a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
206033ada14aSBard Liao 	rt5665_mono_adc_r2_enum, RT5665_MONO_ADC_MIXER,
206133ada14aSBard Liao 	RT5665_MONO_ADC_R2_SRC_SFT, rt5665_mono_adc_r2_src);
206233ada14aSBard Liao 
206333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_adc_r2_mux =
206433ada14aSBard Liao 	SOC_DAPM_ENUM("Mono ADC R2 Source", rt5665_mono_adc_r2_enum);
206533ada14aSBard Liao 
206633ada14aSBard Liao /* MONO ADC R1 Source */
206733ada14aSBard Liao /* MX-27 [5] */
206833ada14aSBard Liao static const char * const rt5665_mono_adc_r1_src[] = {
206933ada14aSBard Liao 	"DD Mux", "ADC"
207033ada14aSBard Liao };
207133ada14aSBard Liao 
207227a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
207333ada14aSBard Liao 	rt5665_mono_adc_r1_enum, RT5665_MONO_ADC_MIXER,
207433ada14aSBard Liao 	RT5665_MONO_ADC_R1_SRC_SFT, rt5665_mono_adc_r1_src);
207533ada14aSBard Liao 
207633ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_adc_r1_mux =
207733ada14aSBard Liao 	SOC_DAPM_ENUM("Mono ADC R1 Source", rt5665_mono_adc_r1_enum);
207833ada14aSBard Liao 
207933ada14aSBard Liao /* MONO DMIC R Source */
208033ada14aSBard Liao /* MX-27 [0] */
208133ada14aSBard Liao static const char * const rt5665_mono_dmic_r_src[] = {
208233ada14aSBard Liao 	"DMIC1 R", "DMIC2 R"
208333ada14aSBard Liao };
208433ada14aSBard Liao 
208527a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
208633ada14aSBard Liao 	rt5665_mono_dmic_r_enum, RT5665_MONO_ADC_MIXER,
208733ada14aSBard Liao 	RT5665_MONO_DMIC_R_SRC_SFT, rt5665_mono_dmic_r_src);
208833ada14aSBard Liao 
208933ada14aSBard Liao static const struct snd_kcontrol_new rt5665_mono_dmic_r_mux =
209033ada14aSBard Liao 	SOC_DAPM_ENUM("Mono DMIC R Source", rt5665_mono_dmic_r_enum);
209133ada14aSBard Liao 
209233ada14aSBard Liao 
209333ada14aSBard Liao /* STO2 ADC1 Source */
209433ada14aSBard Liao /* MX-28 [13] [5] */
209533ada14aSBard Liao static const char * const rt5665_sto2_adc1_src[] = {
209633ada14aSBard Liao 	"DD Mux", "ADC"
209733ada14aSBard Liao };
209833ada14aSBard Liao 
209927a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
210033ada14aSBard Liao 	rt5665_sto2_adc1l_enum, RT5665_STO2_ADC_MIXER,
210133ada14aSBard Liao 	RT5665_STO2_ADC1L_SRC_SFT, rt5665_sto2_adc1_src);
210233ada14aSBard Liao 
210333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_adc1l_mux =
210433ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC1L Source", rt5665_sto2_adc1l_enum);
210533ada14aSBard Liao 
210627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
210733ada14aSBard Liao 	rt5665_sto2_adc1r_enum, RT5665_STO2_ADC_MIXER,
210833ada14aSBard Liao 	RT5665_STO2_ADC1R_SRC_SFT, rt5665_sto2_adc1_src);
210933ada14aSBard Liao 
211033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_adc1r_mux =
211133ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC1L Source", rt5665_sto2_adc1r_enum);
211233ada14aSBard Liao 
211333ada14aSBard Liao /* STO2 ADC Source */
211433ada14aSBard Liao /* MX-28 [11:10] [3:2] */
211533ada14aSBard Liao static const char * const rt5665_sto2_adc_src[] = {
211633ada14aSBard Liao 	"ADC1 L", "ADC1 R", "ADC2 L"
211733ada14aSBard Liao };
211833ada14aSBard Liao 
211927a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
212033ada14aSBard Liao 	rt5665_sto2_adcl_enum, RT5665_STO2_ADC_MIXER,
212133ada14aSBard Liao 	RT5665_STO2_ADCL_SRC_SFT, rt5665_sto2_adc_src);
212233ada14aSBard Liao 
212333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_adcl_mux =
212433ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADCL Source", rt5665_sto2_adcl_enum);
212533ada14aSBard Liao 
212627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
212733ada14aSBard Liao 	rt5665_sto2_adcr_enum, RT5665_STO2_ADC_MIXER,
212833ada14aSBard Liao 	RT5665_STO2_ADCR_SRC_SFT, rt5665_sto2_adc_src);
212933ada14aSBard Liao 
213033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_adcr_mux =
213133ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADCR Source", rt5665_sto2_adcr_enum);
213233ada14aSBard Liao 
213333ada14aSBard Liao /* STO2 ADC2 Source */
213433ada14aSBard Liao /* MX-28 [12] [4] */
213533ada14aSBard Liao static const char * const rt5665_sto2_adc2_src[] = {
213633ada14aSBard Liao 	"DAC MIX", "DMIC"
213733ada14aSBard Liao };
213833ada14aSBard Liao 
213927a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
214033ada14aSBard Liao 	rt5665_sto2_adc2l_enum, RT5665_STO2_ADC_MIXER,
214133ada14aSBard Liao 	RT5665_STO2_ADC2L_SRC_SFT, rt5665_sto2_adc2_src);
214233ada14aSBard Liao 
214333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_adc2l_mux =
214433ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC2L Source", rt5665_sto2_adc2l_enum);
214533ada14aSBard Liao 
214627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
214733ada14aSBard Liao 	rt5665_sto2_adc2r_enum, RT5665_STO2_ADC_MIXER,
214833ada14aSBard Liao 	RT5665_STO2_ADC2R_SRC_SFT, rt5665_sto2_adc2_src);
214933ada14aSBard Liao 
215033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_adc2r_mux =
215133ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC2R Source", rt5665_sto2_adc2r_enum);
215233ada14aSBard Liao 
215333ada14aSBard Liao /* STO2 DMIC Source */
215433ada14aSBard Liao /* MX-28 [8] */
215533ada14aSBard Liao static const char * const rt5665_sto2_dmic_src[] = {
215633ada14aSBard Liao 	"DMIC1", "DMIC2"
215733ada14aSBard Liao };
215833ada14aSBard Liao 
215927a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
216033ada14aSBard Liao 	rt5665_sto2_dmic_enum, RT5665_STO2_ADC_MIXER,
216133ada14aSBard Liao 	RT5665_STO2_DMIC_SRC_SFT, rt5665_sto2_dmic_src);
216233ada14aSBard Liao 
216333ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_dmic_mux =
216433ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 DMIC Source", rt5665_sto2_dmic_enum);
216533ada14aSBard Liao 
216633ada14aSBard Liao /* MX-28 [9] */
216733ada14aSBard Liao static const char * const rt5665_sto2_dd_l_src[] = {
216833ada14aSBard Liao 	"STO2 DAC", "MONO DAC"
216933ada14aSBard Liao };
217033ada14aSBard Liao 
217127a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
217233ada14aSBard Liao 	rt5665_sto2_dd_l_enum, RT5665_STO2_ADC_MIXER,
217333ada14aSBard Liao 	RT5665_STO2_DD_L_SRC_SFT, rt5665_sto2_dd_l_src);
217433ada14aSBard Liao 
217533ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_dd_l_mux =
217633ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 DD L Source", rt5665_sto2_dd_l_enum);
217733ada14aSBard Liao 
217833ada14aSBard Liao /* MX-28 [1] */
217933ada14aSBard Liao static const char * const rt5665_sto2_dd_r_src[] = {
218033ada14aSBard Liao 	"STO2 DAC", "MONO DAC"
218133ada14aSBard Liao };
218233ada14aSBard Liao 
218327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
218433ada14aSBard Liao 	rt5665_sto2_dd_r_enum, RT5665_STO2_ADC_MIXER,
218533ada14aSBard Liao 	RT5665_STO2_DD_R_SRC_SFT, rt5665_sto2_dd_r_src);
218633ada14aSBard Liao 
218733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_sto2_dd_r_mux =
218833ada14aSBard Liao 	SOC_DAPM_ENUM("Stereo2 DD R Source", rt5665_sto2_dd_r_enum);
218933ada14aSBard Liao 
219033ada14aSBard Liao /* DAC R1 Source, DAC L1 Source*/
219133ada14aSBard Liao /* MX-29 [11:10], MX-29 [9:8]*/
219233ada14aSBard Liao static const char * const rt5665_dac1_src[] = {
219333ada14aSBard Liao 	"IF1 DAC1", "IF2_1 DAC", "IF2_2 DAC", "IF3 DAC"
219433ada14aSBard Liao };
219533ada14aSBard Liao 
219627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
219733ada14aSBard Liao 	rt5665_dac_r1_enum, RT5665_AD_DA_MIXER,
219833ada14aSBard Liao 	RT5665_DAC1_R_SEL_SFT, rt5665_dac1_src);
219933ada14aSBard Liao 
220033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dac_r1_mux =
220133ada14aSBard Liao 	SOC_DAPM_ENUM("DAC R1 Source", rt5665_dac_r1_enum);
220233ada14aSBard Liao 
220327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
220433ada14aSBard Liao 	rt5665_dac_l1_enum, RT5665_AD_DA_MIXER,
220533ada14aSBard Liao 	RT5665_DAC1_L_SEL_SFT, rt5665_dac1_src);
220633ada14aSBard Liao 
220733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dac_l1_mux =
220833ada14aSBard Liao 	SOC_DAPM_ENUM("DAC L1 Source", rt5665_dac_l1_enum);
220933ada14aSBard Liao 
221033ada14aSBard Liao /* DAC Digital Mixer L Source, DAC Digital Mixer R Source*/
221133ada14aSBard Liao /* MX-2D [13:12], MX-2D [9:8]*/
221233ada14aSBard Liao static const char * const rt5665_dig_dac_mix_src[] = {
221333ada14aSBard Liao 	"Stereo1 DAC Mixer", "Stereo2 DAC Mixer", "Mono DAC Mixer"
221433ada14aSBard Liao };
221533ada14aSBard Liao 
221627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
221733ada14aSBard Liao 	rt5665_dig_dac_mixl_enum, RT5665_A_DAC1_MUX,
221833ada14aSBard Liao 	RT5665_DAC_MIX_L_SFT, rt5665_dig_dac_mix_src);
221933ada14aSBard Liao 
222033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dig_dac_mixl_mux =
222133ada14aSBard Liao 	SOC_DAPM_ENUM("DAC Digital Mixer L Source", rt5665_dig_dac_mixl_enum);
222233ada14aSBard Liao 
222327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
222433ada14aSBard Liao 	rt5665_dig_dac_mixr_enum, RT5665_A_DAC1_MUX,
222533ada14aSBard Liao 	RT5665_DAC_MIX_R_SFT, rt5665_dig_dac_mix_src);
222633ada14aSBard Liao 
222733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_dig_dac_mixr_mux =
222833ada14aSBard Liao 	SOC_DAPM_ENUM("DAC Digital Mixer R Source", rt5665_dig_dac_mixr_enum);
222933ada14aSBard Liao 
223033ada14aSBard Liao /* Analog DAC L1 Source, Analog DAC R1 Source*/
223133ada14aSBard Liao /* MX-2D [5:4], MX-2D [1:0]*/
223233ada14aSBard Liao static const char * const rt5665_alg_dac1_src[] = {
223333ada14aSBard Liao 	"Stereo1 DAC Mixer", "DAC1", "DMIC1"
223433ada14aSBard Liao };
223533ada14aSBard Liao 
223627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
223733ada14aSBard Liao 	rt5665_alg_dac_l1_enum, RT5665_A_DAC1_MUX,
223833ada14aSBard Liao 	RT5665_A_DACL1_SFT, rt5665_alg_dac1_src);
223933ada14aSBard Liao 
224033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_alg_dac_l1_mux =
224133ada14aSBard Liao 	SOC_DAPM_ENUM("Analog DAC L1 Source", rt5665_alg_dac_l1_enum);
224233ada14aSBard Liao 
224327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
224433ada14aSBard Liao 	rt5665_alg_dac_r1_enum, RT5665_A_DAC1_MUX,
224533ada14aSBard Liao 	RT5665_A_DACR1_SFT, rt5665_alg_dac1_src);
224633ada14aSBard Liao 
224733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_alg_dac_r1_mux =
224833ada14aSBard Liao 	SOC_DAPM_ENUM("Analog DAC R1 Source", rt5665_alg_dac_r1_enum);
224933ada14aSBard Liao 
225033ada14aSBard Liao /* Analog DAC LR Source, Analog DAC R2 Source*/
225133ada14aSBard Liao /* MX-2E [5:4], MX-2E [0]*/
225233ada14aSBard Liao static const char * const rt5665_alg_dac2_src[] = {
225333ada14aSBard Liao 	"Mono DAC Mixer", "DAC2"
225433ada14aSBard Liao };
225533ada14aSBard Liao 
225627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
225733ada14aSBard Liao 	rt5665_alg_dac_l2_enum, RT5665_A_DAC2_MUX,
225833ada14aSBard Liao 	RT5665_A_DACL2_SFT, rt5665_alg_dac2_src);
225933ada14aSBard Liao 
226033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_alg_dac_l2_mux =
226133ada14aSBard Liao 	SOC_DAPM_ENUM("Analog DAC L2 Source", rt5665_alg_dac_l2_enum);
226233ada14aSBard Liao 
226327a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
226433ada14aSBard Liao 	rt5665_alg_dac_r2_enum, RT5665_A_DAC2_MUX,
226533ada14aSBard Liao 	RT5665_A_DACR2_SFT, rt5665_alg_dac2_src);
226633ada14aSBard Liao 
226733ada14aSBard Liao static const struct snd_kcontrol_new rt5665_alg_dac_r2_mux =
226833ada14aSBard Liao 	SOC_DAPM_ENUM("Analog DAC R2 Source", rt5665_alg_dac_r2_enum);
226933ada14aSBard Liao 
227033ada14aSBard Liao /* Interface2 ADC Data Input*/
227133ada14aSBard Liao /* MX-2F [14:12] */
227233ada14aSBard Liao static const char * const rt5665_if2_1_adc_in_src[] = {
227333ada14aSBard Liao 	"STO1 ADC", "STO2 ADC", "MONO ADC", "IF1 DAC1",
227433ada14aSBard Liao 	"IF1 DAC2", "IF2_2 DAC", "IF3 DAC", "DAC1 MIX"
227533ada14aSBard Liao };
227633ada14aSBard Liao 
227727a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
227833ada14aSBard Liao 	rt5665_if2_1_adc_in_enum, RT5665_DIG_INF2_DATA,
227983749abaSBard Liao 	RT5665_IF2_1_ADC_IN_SFT, rt5665_if2_1_adc_in_src);
228033ada14aSBard Liao 
228133ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if2_1_adc_in_mux =
228233ada14aSBard Liao 	SOC_DAPM_ENUM("IF2_1 ADC IN Source", rt5665_if2_1_adc_in_enum);
228333ada14aSBard Liao 
228433ada14aSBard Liao /* MX-2F [6:4] */
228533ada14aSBard Liao static const char * const rt5665_if2_2_adc_in_src[] = {
228633ada14aSBard Liao 	"STO1 ADC", "STO2 ADC", "MONO ADC", "IF1 DAC1",
228733ada14aSBard Liao 	"IF1 DAC2", "IF2_1 DAC", "IF3 DAC", "DAC1 MIX"
228833ada14aSBard Liao };
228933ada14aSBard Liao 
229027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
229133ada14aSBard Liao 	rt5665_if2_2_adc_in_enum, RT5665_DIG_INF2_DATA,
229233ada14aSBard Liao 	RT5665_IF2_2_ADC_IN_SFT, rt5665_if2_2_adc_in_src);
229333ada14aSBard Liao 
229433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if2_2_adc_in_mux =
229533ada14aSBard Liao 	SOC_DAPM_ENUM("IF2_1 ADC IN Source", rt5665_if2_2_adc_in_enum);
229633ada14aSBard Liao 
229733ada14aSBard Liao /* Interface3 ADC Data Input*/
229833ada14aSBard Liao /* MX-30 [6:4] */
229933ada14aSBard Liao static const char * const rt5665_if3_adc_in_src[] = {
230033ada14aSBard Liao 	"STO1 ADC", "STO2 ADC", "MONO ADC", "IF1 DAC1",
230133ada14aSBard Liao 	"IF1 DAC2", "IF2_1 DAC", "IF2_2 DAC", "DAC1 MIX"
230233ada14aSBard Liao };
230333ada14aSBard Liao 
230427a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
230533ada14aSBard Liao 	rt5665_if3_adc_in_enum, RT5665_DIG_INF3_DATA,
230633ada14aSBard Liao 	RT5665_IF3_ADC_IN_SFT, rt5665_if3_adc_in_src);
230733ada14aSBard Liao 
230833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if3_adc_in_mux =
230933ada14aSBard Liao 	SOC_DAPM_ENUM("IF3 ADC IN Source", rt5665_if3_adc_in_enum);
231033ada14aSBard Liao 
231133ada14aSBard Liao /* PDM 1 L/R*/
231233ada14aSBard Liao /* MX-31 [11:10] [9:8] */
231333ada14aSBard Liao static const char * const rt5665_pdm_src[] = {
231433ada14aSBard Liao 	"Stereo1 DAC", "Stereo2 DAC", "Mono DAC"
231533ada14aSBard Liao };
231633ada14aSBard Liao 
231727a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
231833ada14aSBard Liao 	rt5665_pdm_l_enum, RT5665_PDM_OUT_CTRL,
231933ada14aSBard Liao 	RT5665_PDM1_L_SFT, rt5665_pdm_src);
232033ada14aSBard Liao 
232133ada14aSBard Liao static const struct snd_kcontrol_new rt5665_pdm_l_mux =
232233ada14aSBard Liao 	SOC_DAPM_ENUM("PDM L Source", rt5665_pdm_l_enum);
232333ada14aSBard Liao 
232427a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
232533ada14aSBard Liao 	rt5665_pdm_r_enum, RT5665_PDM_OUT_CTRL,
232633ada14aSBard Liao 	RT5665_PDM1_R_SFT, rt5665_pdm_src);
232733ada14aSBard Liao 
232833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_pdm_r_mux =
232933ada14aSBard Liao 	SOC_DAPM_ENUM("PDM R Source", rt5665_pdm_r_enum);
233033ada14aSBard Liao 
233133ada14aSBard Liao 
233233ada14aSBard Liao /* I2S1 TDM ADCDAT Source */
233333ada14aSBard Liao /* MX-7a[10] */
233433ada14aSBard Liao static const char * const rt5665_if1_1_adc1_data_src[] = {
233533ada14aSBard Liao 	"STO1 ADC", "IF2_1 DAC",
233633ada14aSBard Liao };
233733ada14aSBard Liao 
233827a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
233933ada14aSBard Liao 	rt5665_if1_1_adc1_data_enum, RT5665_TDM_CTRL_3,
234033ada14aSBard Liao 	RT5665_IF1_ADC1_SEL_SFT, rt5665_if1_1_adc1_data_src);
234133ada14aSBard Liao 
234233ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_1_adc1_mux =
234333ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_1 ADC1 Source", rt5665_if1_1_adc1_data_enum);
234433ada14aSBard Liao 
234533ada14aSBard Liao /* MX-7a[9] */
234633ada14aSBard Liao static const char * const rt5665_if1_1_adc2_data_src[] = {
234733ada14aSBard Liao 	"STO2 ADC", "IF2_2 DAC",
234833ada14aSBard Liao };
234933ada14aSBard Liao 
235027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
235133ada14aSBard Liao 	rt5665_if1_1_adc2_data_enum, RT5665_TDM_CTRL_3,
235233ada14aSBard Liao 	RT5665_IF1_ADC2_SEL_SFT, rt5665_if1_1_adc2_data_src);
235333ada14aSBard Liao 
235433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_1_adc2_mux =
235533ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_1 ADC2 Source", rt5665_if1_1_adc2_data_enum);
235633ada14aSBard Liao 
235733ada14aSBard Liao /* MX-7a[8] */
235833ada14aSBard Liao static const char * const rt5665_if1_1_adc3_data_src[] = {
235933ada14aSBard Liao 	"MONO ADC", "IF3 DAC",
236033ada14aSBard Liao };
236133ada14aSBard Liao 
236227a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
236333ada14aSBard Liao 	rt5665_if1_1_adc3_data_enum, RT5665_TDM_CTRL_3,
236433ada14aSBard Liao 	RT5665_IF1_ADC3_SEL_SFT, rt5665_if1_1_adc3_data_src);
236533ada14aSBard Liao 
236633ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_1_adc3_mux =
236733ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_1 ADC3 Source", rt5665_if1_1_adc3_data_enum);
236833ada14aSBard Liao 
236933ada14aSBard Liao /* MX-7b[10] */
237033ada14aSBard Liao static const char * const rt5665_if1_2_adc1_data_src[] = {
237133ada14aSBard Liao 	"STO1 ADC", "IF1 DAC",
237233ada14aSBard Liao };
237333ada14aSBard Liao 
237427a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
237533ada14aSBard Liao 	rt5665_if1_2_adc1_data_enum, RT5665_TDM_CTRL_4,
237633ada14aSBard Liao 	RT5665_IF1_ADC1_SEL_SFT, rt5665_if1_2_adc1_data_src);
237733ada14aSBard Liao 
237833ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_2_adc1_mux =
237933ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_2 ADC1 Source", rt5665_if1_2_adc1_data_enum);
238033ada14aSBard Liao 
238133ada14aSBard Liao /* MX-7b[9] */
238233ada14aSBard Liao static const char * const rt5665_if1_2_adc2_data_src[] = {
238333ada14aSBard Liao 	"STO2 ADC", "IF2_1 DAC",
238433ada14aSBard Liao };
238533ada14aSBard Liao 
238627a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
238733ada14aSBard Liao 	rt5665_if1_2_adc2_data_enum, RT5665_TDM_CTRL_4,
238833ada14aSBard Liao 	RT5665_IF1_ADC2_SEL_SFT, rt5665_if1_2_adc2_data_src);
238933ada14aSBard Liao 
239033ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_2_adc2_mux =
239133ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_2 ADC2 Source", rt5665_if1_2_adc2_data_enum);
239233ada14aSBard Liao 
239333ada14aSBard Liao /* MX-7b[8] */
239433ada14aSBard Liao static const char * const rt5665_if1_2_adc3_data_src[] = {
239533ada14aSBard Liao 	"MONO ADC", "IF2_2 DAC",
239633ada14aSBard Liao };
239733ada14aSBard Liao 
239827a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
239933ada14aSBard Liao 	rt5665_if1_2_adc3_data_enum, RT5665_TDM_CTRL_4,
240033ada14aSBard Liao 	RT5665_IF1_ADC3_SEL_SFT, rt5665_if1_2_adc3_data_src);
240133ada14aSBard Liao 
240233ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_2_adc3_mux =
240333ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_2 ADC3 Source", rt5665_if1_2_adc3_data_enum);
240433ada14aSBard Liao 
240533ada14aSBard Liao /* MX-7b[7] */
240633ada14aSBard Liao static const char * const rt5665_if1_2_adc4_data_src[] = {
240733ada14aSBard Liao 	"DAC1", "IF3 DAC",
240833ada14aSBard Liao };
240933ada14aSBard Liao 
241027a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
241133ada14aSBard Liao 	rt5665_if1_2_adc4_data_enum, RT5665_TDM_CTRL_4,
241233ada14aSBard Liao 	RT5665_IF1_ADC4_SEL_SFT, rt5665_if1_2_adc4_data_src);
241333ada14aSBard Liao 
241433ada14aSBard Liao static const struct snd_kcontrol_new rt5665_if1_2_adc4_mux =
241533ada14aSBard Liao 	SOC_DAPM_ENUM("IF1_2 ADC4 Source", rt5665_if1_2_adc4_data_enum);
241633ada14aSBard Liao 
241733ada14aSBard Liao /* MX-7a[4:0] MX-7b[4:0] */
241833ada14aSBard Liao static const char * const rt5665_tdm_adc_data_src[] = {
241933ada14aSBard Liao 	"1234", "1243", "1324",	"1342", "1432", "1423",
242033ada14aSBard Liao 	"2134", "2143", "2314",	"2341", "2431", "2413",
242133ada14aSBard Liao 	"3124", "3142", "3214", "3241", "3412", "3421",
242233ada14aSBard Liao 	"4123", "4132", "4213", "4231", "4312", "4321"
242333ada14aSBard Liao };
242433ada14aSBard Liao 
242527a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
242633ada14aSBard Liao 	rt5665_tdm1_adc_data_enum, RT5665_TDM_CTRL_3,
242733ada14aSBard Liao 	RT5665_TDM_ADC_SEL_SFT, rt5665_tdm_adc_data_src);
242833ada14aSBard Liao 
242933ada14aSBard Liao static const struct snd_kcontrol_new rt5665_tdm1_adc_mux =
243033ada14aSBard Liao 	SOC_DAPM_ENUM("TDM1 ADC Mux", rt5665_tdm1_adc_data_enum);
243133ada14aSBard Liao 
243227a655c4SArnd Bergmann static SOC_ENUM_SINGLE_DECL(
243333ada14aSBard Liao 	rt5665_tdm2_adc_data_enum, RT5665_TDM_CTRL_4,
243433ada14aSBard Liao 	RT5665_TDM_ADC_SEL_SFT, rt5665_tdm_adc_data_src);
243533ada14aSBard Liao 
243633ada14aSBard Liao static const struct snd_kcontrol_new rt5665_tdm2_adc_mux =
243733ada14aSBard Liao 	SOC_DAPM_ENUM("TDM2 ADCDAT Source", rt5665_tdm2_adc_data_enum);
243833ada14aSBard Liao 
243933ada14aSBard Liao /* Out Volume Switch */
244033ada14aSBard Liao static const struct snd_kcontrol_new monovol_switch =
244133ada14aSBard Liao 	SOC_DAPM_SINGLE("Switch", RT5665_MONO_OUT, RT5665_VOL_L_SFT, 1, 1);
244233ada14aSBard Liao 
244333ada14aSBard Liao static const struct snd_kcontrol_new outvol_l_switch =
244433ada14aSBard Liao 	SOC_DAPM_SINGLE("Switch", RT5665_LOUT, RT5665_VOL_L_SFT, 1, 1);
244533ada14aSBard Liao 
244633ada14aSBard Liao static const struct snd_kcontrol_new outvol_r_switch =
244733ada14aSBard Liao 	SOC_DAPM_SINGLE("Switch", RT5665_LOUT, RT5665_VOL_R_SFT, 1, 1);
244833ada14aSBard Liao 
244933ada14aSBard Liao /* Out Switch */
245033ada14aSBard Liao static const struct snd_kcontrol_new mono_switch =
245133ada14aSBard Liao 	SOC_DAPM_SINGLE("Switch", RT5665_MONO_OUT, RT5665_L_MUTE_SFT, 1, 1);
245233ada14aSBard Liao 
245333ada14aSBard Liao static const struct snd_kcontrol_new hpo_switch =
245433ada14aSBard Liao 	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5665_HP_CTRL_2,
245533ada14aSBard Liao 					RT5665_VOL_L_SFT, 1, 0);
245633ada14aSBard Liao 
245733ada14aSBard Liao static const struct snd_kcontrol_new lout_l_switch =
245833ada14aSBard Liao 	SOC_DAPM_SINGLE("Switch", RT5665_LOUT, RT5665_L_MUTE_SFT, 1, 1);
245933ada14aSBard Liao 
246033ada14aSBard Liao static const struct snd_kcontrol_new lout_r_switch =
246133ada14aSBard Liao 	SOC_DAPM_SINGLE("Switch", RT5665_LOUT, RT5665_R_MUTE_SFT, 1, 1);
246233ada14aSBard Liao 
246333ada14aSBard Liao static const struct snd_kcontrol_new pdm_l_switch =
246433ada14aSBard Liao 	SOC_DAPM_SINGLE("Switch", RT5665_PDM_OUT_CTRL,
246533ada14aSBard Liao 			RT5665_M_PDM1_L_SFT, 1,	1);
246633ada14aSBard Liao 
246733ada14aSBard Liao static const struct snd_kcontrol_new pdm_r_switch =
246833ada14aSBard Liao 	SOC_DAPM_SINGLE("Switch", RT5665_PDM_OUT_CTRL,
246933ada14aSBard Liao 			RT5665_M_PDM1_R_SFT, 1,	1);
247033ada14aSBard Liao 
247133ada14aSBard Liao static int rt5665_mono_event(struct snd_soc_dapm_widget *w,
247233ada14aSBard Liao 	struct snd_kcontrol *kcontrol, int event)
247333ada14aSBard Liao {
2474fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
247533ada14aSBard Liao 
247633ada14aSBard Liao 	switch (event) {
247733ada14aSBard Liao 	case SND_SOC_DAPM_PRE_PMU:
2478fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_NG2_CTRL_1,
247933ada14aSBard Liao 			RT5665_NG2_EN_MASK, RT5665_NG2_EN);
2480fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_AMP_CALIB_CTRL_1, 0x40,
248133ada14aSBard Liao 			0x0);
2482fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_OUT, 0x10, 0x10);
2483fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_OUT, 0x20, 0x20);
248433ada14aSBard Liao 		break;
248533ada14aSBard Liao 
248633ada14aSBard Liao 	case SND_SOC_DAPM_POST_PMD:
2487fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_OUT, 0x20, 0);
2488fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_OUT, 0x10, 0);
2489fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_AMP_CALIB_CTRL_1, 0x40,
249033ada14aSBard Liao 			0x40);
2491fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_MONO_NG2_CTRL_1,
249233ada14aSBard Liao 			RT5665_NG2_EN_MASK, RT5665_NG2_DIS);
249333ada14aSBard Liao 		break;
249433ada14aSBard Liao 
249533ada14aSBard Liao 	default:
249633ada14aSBard Liao 		return 0;
249733ada14aSBard Liao 	}
249833ada14aSBard Liao 
249933ada14aSBard Liao 	return 0;
250033ada14aSBard Liao 
250133ada14aSBard Liao }
250233ada14aSBard Liao 
250333ada14aSBard Liao static int rt5665_hp_event(struct snd_soc_dapm_widget *w,
250433ada14aSBard Liao 	struct snd_kcontrol *kcontrol, int event)
250533ada14aSBard Liao {
2506fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
250733ada14aSBard Liao 
250833ada14aSBard Liao 	switch (event) {
250933ada14aSBard Liao 	case SND_SOC_DAPM_PRE_PMU:
2510fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_STO_NG2_CTRL_1,
251133ada14aSBard Liao 			RT5665_NG2_EN_MASK, RT5665_NG2_EN);
2512fab70c27SKuninori Morimoto 		snd_soc_component_write(component, RT5665_HP_LOGIC_CTRL_2, 0x0003);
251333ada14aSBard Liao 		break;
251433ada14aSBard Liao 
251533ada14aSBard Liao 	case SND_SOC_DAPM_POST_PMD:
2516fab70c27SKuninori Morimoto 		snd_soc_component_write(component, RT5665_HP_LOGIC_CTRL_2, 0x0002);
2517fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_STO_NG2_CTRL_1,
251833ada14aSBard Liao 			RT5665_NG2_EN_MASK, RT5665_NG2_DIS);
251933ada14aSBard Liao 		break;
252033ada14aSBard Liao 
252133ada14aSBard Liao 	default:
252233ada14aSBard Liao 		return 0;
252333ada14aSBard Liao 	}
252433ada14aSBard Liao 
252533ada14aSBard Liao 	return 0;
252633ada14aSBard Liao 
252733ada14aSBard Liao }
252833ada14aSBard Liao 
252933ada14aSBard Liao static int rt5665_lout_event(struct snd_soc_dapm_widget *w,
253033ada14aSBard Liao 	struct snd_kcontrol *kcontrol, int event)
253133ada14aSBard Liao {
2532fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
253333ada14aSBard Liao 
253433ada14aSBard Liao 	switch (event) {
253533ada14aSBard Liao 	case SND_SOC_DAPM_POST_PMU:
2536fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_DEPOP_1,
253733ada14aSBard Liao 			RT5665_PUMP_EN, RT5665_PUMP_EN);
253833ada14aSBard Liao 		break;
253933ada14aSBard Liao 
254033ada14aSBard Liao 	case SND_SOC_DAPM_PRE_PMD:
2541fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_DEPOP_1,
254233ada14aSBard Liao 			RT5665_PUMP_EN, 0);
254333ada14aSBard Liao 		break;
254433ada14aSBard Liao 
254533ada14aSBard Liao 	default:
254633ada14aSBard Liao 		return 0;
254733ada14aSBard Liao 	}
254833ada14aSBard Liao 
254933ada14aSBard Liao 	return 0;
255033ada14aSBard Liao 
255133ada14aSBard Liao }
255233ada14aSBard Liao 
255333ada14aSBard Liao static int set_dmic_power(struct snd_soc_dapm_widget *w,
255433ada14aSBard Liao 	struct snd_kcontrol *kcontrol, int event)
255533ada14aSBard Liao {
255633ada14aSBard Liao 	switch (event) {
255733ada14aSBard Liao 	case SND_SOC_DAPM_POST_PMU:
255833ada14aSBard Liao 		/*Add delay to avoid pop noise*/
255933ada14aSBard Liao 		msleep(150);
256033ada14aSBard Liao 		break;
256133ada14aSBard Liao 
256233ada14aSBard Liao 	default:
256333ada14aSBard Liao 		return 0;
256433ada14aSBard Liao 	}
256533ada14aSBard Liao 
256633ada14aSBard Liao 	return 0;
256733ada14aSBard Liao }
256833ada14aSBard Liao 
2569f90aa354SChristophe JAILLET static int rt5665_set_verf(struct snd_soc_dapm_widget *w,
257033ada14aSBard Liao 	struct snd_kcontrol *kcontrol, int event)
257133ada14aSBard Liao {
2572fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
257333ada14aSBard Liao 
257433ada14aSBard Liao 	switch (event) {
257533ada14aSBard Liao 	case SND_SOC_DAPM_PRE_PMU:
257633ada14aSBard Liao 		switch (w->shift) {
257733ada14aSBard Liao 		case RT5665_PWR_VREF1_BIT:
2578fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1,
257933ada14aSBard Liao 				RT5665_PWR_FV1, 0);
258033ada14aSBard Liao 			break;
258133ada14aSBard Liao 
258233ada14aSBard Liao 		case RT5665_PWR_VREF2_BIT:
2583fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1,
258433ada14aSBard Liao 				RT5665_PWR_FV2, 0);
258533ada14aSBard Liao 			break;
258633ada14aSBard Liao 
258733ada14aSBard Liao 		case RT5665_PWR_VREF3_BIT:
2588fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1,
258933ada14aSBard Liao 				RT5665_PWR_FV3, 0);
259033ada14aSBard Liao 			break;
259133ada14aSBard Liao 
259233ada14aSBard Liao 		default:
259333ada14aSBard Liao 			break;
259433ada14aSBard Liao 		}
259533ada14aSBard Liao 		break;
259633ada14aSBard Liao 
259733ada14aSBard Liao 	case SND_SOC_DAPM_POST_PMU:
259833ada14aSBard Liao 		usleep_range(15000, 20000);
259933ada14aSBard Liao 		switch (w->shift) {
260033ada14aSBard Liao 		case RT5665_PWR_VREF1_BIT:
2601fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1,
260233ada14aSBard Liao 				RT5665_PWR_FV1, RT5665_PWR_FV1);
260333ada14aSBard Liao 			break;
260433ada14aSBard Liao 
260533ada14aSBard Liao 		case RT5665_PWR_VREF2_BIT:
2606fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1,
260733ada14aSBard Liao 				RT5665_PWR_FV2, RT5665_PWR_FV2);
260833ada14aSBard Liao 			break;
260933ada14aSBard Liao 
261033ada14aSBard Liao 		case RT5665_PWR_VREF3_BIT:
2611fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1,
261233ada14aSBard Liao 				RT5665_PWR_FV3, RT5665_PWR_FV3);
261333ada14aSBard Liao 			break;
261433ada14aSBard Liao 
261533ada14aSBard Liao 		default:
261633ada14aSBard Liao 			break;
261733ada14aSBard Liao 		}
261833ada14aSBard Liao 		break;
261933ada14aSBard Liao 
262033ada14aSBard Liao 	default:
262133ada14aSBard Liao 		return 0;
262233ada14aSBard Liao 	}
262333ada14aSBard Liao 
262433ada14aSBard Liao 	return 0;
262533ada14aSBard Liao }
262633ada14aSBard Liao 
26279b5d3865SBard Liao static int rt5665_i2s_pin_event(struct snd_soc_dapm_widget *w,
26289b5d3865SBard Liao 	struct snd_kcontrol *kcontrol, int event)
26299b5d3865SBard Liao {
2630fab70c27SKuninori Morimoto 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
2631b98ae9adSGeert Uytterhoeven 	unsigned int val1, val2, mask1 = 0, mask2 = 0;
26329b5d3865SBard Liao 
26339b5d3865SBard Liao 	switch (w->shift) {
26349b5d3865SBard Liao 	case RT5665_PWR_I2S2_1_BIT:
26359b5d3865SBard Liao 		mask1 = RT5665_GP2_PIN_MASK | RT5665_GP3_PIN_MASK |
26369b5d3865SBard Liao 			RT5665_GP4_PIN_MASK | RT5665_GP5_PIN_MASK;
26379b5d3865SBard Liao 		val1 = RT5665_GP2_PIN_BCLK2 | RT5665_GP3_PIN_LRCK2 |
26389b5d3865SBard Liao 			RT5665_GP4_PIN_DACDAT2_1 | RT5665_GP5_PIN_ADCDAT2_1;
26399b5d3865SBard Liao 		break;
26409b5d3865SBard Liao 	case RT5665_PWR_I2S2_2_BIT:
26419b5d3865SBard Liao 		mask1 = RT5665_GP2_PIN_MASK | RT5665_GP3_PIN_MASK |
26429b5d3865SBard Liao 			RT5665_GP8_PIN_MASK;
26439b5d3865SBard Liao 		val1 = RT5665_GP2_PIN_BCLK2 | RT5665_GP3_PIN_LRCK2 |
26449b5d3865SBard Liao 			RT5665_GP8_PIN_DACDAT2_2;
26459b5d3865SBard Liao 		mask2 = RT5665_GP9_PIN_MASK;
26469b5d3865SBard Liao 		val2 = RT5665_GP9_PIN_ADCDAT2_2;
26479b5d3865SBard Liao 		break;
26489b5d3865SBard Liao 	case RT5665_PWR_I2S3_BIT:
26499b5d3865SBard Liao 		mask1 = RT5665_GP6_PIN_MASK | RT5665_GP7_PIN_MASK |
26509b5d3865SBard Liao 			RT5665_GP8_PIN_MASK;
26519b5d3865SBard Liao 		val1 = RT5665_GP6_PIN_BCLK3 | RT5665_GP7_PIN_LRCK3 |
26529b5d3865SBard Liao 			RT5665_GP8_PIN_DACDAT3;
26539b5d3865SBard Liao 		mask2 = RT5665_GP9_PIN_MASK;
26549b5d3865SBard Liao 		val2 = RT5665_GP9_PIN_ADCDAT3;
26559b5d3865SBard Liao 		break;
26569b5d3865SBard Liao 	}
26579b5d3865SBard Liao 	switch (event) {
26589b5d3865SBard Liao 	case SND_SOC_DAPM_PRE_PMU:
2659b98ae9adSGeert Uytterhoeven 		if (mask1)
2660fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_GPIO_CTRL_1,
2661b98ae9adSGeert Uytterhoeven 					    mask1, val1);
26629b5d3865SBard Liao 		if (mask2)
2663fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_GPIO_CTRL_2,
26649b5d3865SBard Liao 					    mask2, val2);
26659b5d3865SBard Liao 		break;
26669b5d3865SBard Liao 	case SND_SOC_DAPM_POST_PMD:
2667b98ae9adSGeert Uytterhoeven 		if (mask1)
2668fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_GPIO_CTRL_1,
2669b98ae9adSGeert Uytterhoeven 					    mask1, 0);
26709b5d3865SBard Liao 		if (mask2)
2671fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_GPIO_CTRL_2,
26729b5d3865SBard Liao 					    mask2, 0);
26739b5d3865SBard Liao 		break;
26749b5d3865SBard Liao 	default:
26759b5d3865SBard Liao 		return 0;
26769b5d3865SBard Liao 	}
26779b5d3865SBard Liao 
26789b5d3865SBard Liao 	return 0;
26799b5d3865SBard Liao }
268033ada14aSBard Liao 
268133ada14aSBard Liao static const struct snd_soc_dapm_widget rt5665_dapm_widgets[] = {
268233ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("LDO2", RT5665_PWR_ANLG_3, RT5665_PWR_LDO2_BIT, 0,
268333ada14aSBard Liao 		NULL, 0),
268433ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("PLL", RT5665_PWR_ANLG_3, RT5665_PWR_PLL_BIT, 0,
268533ada14aSBard Liao 		NULL, 0),
268633ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5665_PWR_VOL,
268733ada14aSBard Liao 		RT5665_PWR_MIC_DET_BIT, 0, NULL, 0),
268833ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("Vref1", RT5665_PWR_ANLG_1, RT5665_PWR_VREF1_BIT, 0,
2689f90aa354SChristophe JAILLET 		rt5665_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
269033ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("Vref2", RT5665_PWR_ANLG_1, RT5665_PWR_VREF2_BIT, 0,
2691f90aa354SChristophe JAILLET 		rt5665_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
269233ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("Vref3", RT5665_PWR_ANLG_1, RT5665_PWR_VREF3_BIT, 0,
2693f90aa354SChristophe JAILLET 		rt5665_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
269433ada14aSBard Liao 
269533ada14aSBard Liao 	/* ASRC */
269633ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5665_ASRC_1,
269733ada14aSBard Liao 		RT5665_I2S1_ASRC_SFT, 0, NULL, 0),
269833ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5665_ASRC_1,
269933ada14aSBard Liao 		RT5665_I2S2_ASRC_SFT, 0, NULL, 0),
270033ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5665_ASRC_1,
270133ada14aSBard Liao 		RT5665_I2S3_ASRC_SFT, 0, NULL, 0),
270233ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5665_ASRC_1,
270333ada14aSBard Liao 		RT5665_DAC_STO1_ASRC_SFT, 0, NULL, 0),
270433ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC STO2 ASRC", 1, RT5665_ASRC_1,
270533ada14aSBard Liao 		RT5665_DAC_STO2_ASRC_SFT, 0, NULL, 0),
270633ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC Mono L ASRC", 1, RT5665_ASRC_1,
270733ada14aSBard Liao 		RT5665_DAC_MONO_L_ASRC_SFT, 0, NULL, 0),
270833ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC Mono R ASRC", 1, RT5665_ASRC_1,
270933ada14aSBard Liao 		RT5665_DAC_MONO_R_ASRC_SFT, 0, NULL, 0),
271033ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5665_ASRC_1,
271133ada14aSBard Liao 		RT5665_ADC_STO1_ASRC_SFT, 0, NULL, 0),
271230b7d88dSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5665_ASRC_1,
271330b7d88dSBard Liao 		RT5665_ADC_STO2_ASRC_SFT, 0, NULL, 0),
271433ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC Mono L ASRC", 1, RT5665_ASRC_1,
271533ada14aSBard Liao 		RT5665_ADC_MONO_L_ASRC_SFT, 0, NULL, 0),
271633ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC Mono R ASRC", 1, RT5665_ASRC_1,
271733ada14aSBard Liao 		RT5665_ADC_MONO_R_ASRC_SFT, 0, NULL, 0),
271833ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5665_ASRC_1,
271933ada14aSBard Liao 		RT5665_DMIC_STO1_ASRC_SFT, 0, NULL, 0),
272033ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DMIC STO2 ASRC", 1, RT5665_ASRC_1,
272133ada14aSBard Liao 		RT5665_DMIC_STO2_ASRC_SFT, 0, NULL, 0),
272233ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5665_ASRC_1,
272333ada14aSBard Liao 		RT5665_DMIC_MONO_L_ASRC_SFT, 0, NULL, 0),
272433ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5665_ASRC_1,
272533ada14aSBard Liao 		RT5665_DMIC_MONO_R_ASRC_SFT, 0, NULL, 0),
272633ada14aSBard Liao 
272733ada14aSBard Liao 	/* Input Side */
272833ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5665_PWR_ANLG_2, RT5665_PWR_MB1_BIT,
272933ada14aSBard Liao 		0, NULL, 0),
273033ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5665_PWR_ANLG_2, RT5665_PWR_MB2_BIT,
273133ada14aSBard Liao 		0, NULL, 0),
273233ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("MICBIAS3", RT5665_PWR_ANLG_2, RT5665_PWR_MB3_BIT,
273333ada14aSBard Liao 		0, NULL, 0),
273433ada14aSBard Liao 
273533ada14aSBard Liao 	/* Input Lines */
273633ada14aSBard Liao 	SND_SOC_DAPM_INPUT("DMIC L1"),
273733ada14aSBard Liao 	SND_SOC_DAPM_INPUT("DMIC R1"),
273833ada14aSBard Liao 	SND_SOC_DAPM_INPUT("DMIC L2"),
273933ada14aSBard Liao 	SND_SOC_DAPM_INPUT("DMIC R2"),
274033ada14aSBard Liao 
274133ada14aSBard Liao 	SND_SOC_DAPM_INPUT("IN1P"),
274233ada14aSBard Liao 	SND_SOC_DAPM_INPUT("IN1N"),
274333ada14aSBard Liao 	SND_SOC_DAPM_INPUT("IN2P"),
274433ada14aSBard Liao 	SND_SOC_DAPM_INPUT("IN2N"),
274533ada14aSBard Liao 	SND_SOC_DAPM_INPUT("IN3P"),
274633ada14aSBard Liao 	SND_SOC_DAPM_INPUT("IN3N"),
274733ada14aSBard Liao 	SND_SOC_DAPM_INPUT("IN4P"),
274833ada14aSBard Liao 	SND_SOC_DAPM_INPUT("IN4N"),
274933ada14aSBard Liao 
275033ada14aSBard Liao 	SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
275133ada14aSBard Liao 	SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
275233ada14aSBard Liao 
275333ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
275433ada14aSBard Liao 		set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
275533ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5665_DMIC_CTRL_1,
275633ada14aSBard Liao 		RT5665_DMIC_1_EN_SFT, 0, set_dmic_power, SND_SOC_DAPM_POST_PMU),
275733ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5665_DMIC_CTRL_1,
275833ada14aSBard Liao 		RT5665_DMIC_2_EN_SFT, 0, set_dmic_power, SND_SOC_DAPM_POST_PMU),
275933ada14aSBard Liao 
276033ada14aSBard Liao 	/* Boost */
276133ada14aSBard Liao 	SND_SOC_DAPM_PGA("BST1", SND_SOC_NOPM,
276233ada14aSBard Liao 		0, 0, NULL, 0),
276333ada14aSBard Liao 	SND_SOC_DAPM_PGA("BST2", SND_SOC_NOPM,
276433ada14aSBard Liao 		0, 0, NULL, 0),
276533ada14aSBard Liao 	SND_SOC_DAPM_PGA("BST3", SND_SOC_NOPM,
276633ada14aSBard Liao 		0, 0, NULL, 0),
276733ada14aSBard Liao 	SND_SOC_DAPM_PGA("BST4", SND_SOC_NOPM,
276833ada14aSBard Liao 		0, 0, NULL, 0),
276933ada14aSBard Liao 	SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM,
277033ada14aSBard Liao 		0, 0, NULL, 0),
277133ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("BST1 Power", RT5665_PWR_ANLG_2,
277233ada14aSBard Liao 		RT5665_PWR_BST1_BIT, 0, NULL, 0),
277333ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("BST2 Power", RT5665_PWR_ANLG_2,
277433ada14aSBard Liao 		RT5665_PWR_BST2_BIT, 0, NULL, 0),
277533ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("BST3 Power", RT5665_PWR_ANLG_2,
277633ada14aSBard Liao 		RT5665_PWR_BST3_BIT, 0, NULL, 0),
277733ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("BST4 Power", RT5665_PWR_ANLG_2,
277833ada14aSBard Liao 		RT5665_PWR_BST4_BIT, 0, NULL, 0),
277933ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("BST1P Power", RT5665_PWR_ANLG_2,
278033ada14aSBard Liao 		RT5665_PWR_BST1_P_BIT, 0, NULL, 0),
278133ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("BST2P Power", RT5665_PWR_ANLG_2,
278233ada14aSBard Liao 		RT5665_PWR_BST2_P_BIT, 0, NULL, 0),
278333ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("BST3P Power", RT5665_PWR_ANLG_2,
278433ada14aSBard Liao 		RT5665_PWR_BST3_P_BIT, 0, NULL, 0),
278533ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("BST4P Power", RT5665_PWR_ANLG_2,
278633ada14aSBard Liao 		RT5665_PWR_BST4_P_BIT, 0, NULL, 0),
278733ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("CBJ Power", RT5665_PWR_ANLG_3,
278833ada14aSBard Liao 		RT5665_PWR_CBJ_BIT, 0, NULL, 0),
278933ada14aSBard Liao 
279033ada14aSBard Liao 
279133ada14aSBard Liao 	/* Input Volume */
279233ada14aSBard Liao 	SND_SOC_DAPM_PGA("INL VOL", RT5665_PWR_VOL, RT5665_PWR_IN_L_BIT,
279333ada14aSBard Liao 		0, NULL, 0),
279433ada14aSBard Liao 	SND_SOC_DAPM_PGA("INR VOL", RT5665_PWR_VOL, RT5665_PWR_IN_R_BIT,
279533ada14aSBard Liao 		0, NULL, 0),
279633ada14aSBard Liao 
279733ada14aSBard Liao 	/* REC Mixer */
279833ada14aSBard Liao 	SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5665_rec1_l_mix,
279933ada14aSBard Liao 		ARRAY_SIZE(rt5665_rec1_l_mix)),
280033ada14aSBard Liao 	SND_SOC_DAPM_MIXER("RECMIX1R", SND_SOC_NOPM, 0, 0, rt5665_rec1_r_mix,
280133ada14aSBard Liao 		ARRAY_SIZE(rt5665_rec1_r_mix)),
280233ada14aSBard Liao 	SND_SOC_DAPM_MIXER("RECMIX2L", SND_SOC_NOPM, 0, 0, rt5665_rec2_l_mix,
280333ada14aSBard Liao 		ARRAY_SIZE(rt5665_rec2_l_mix)),
280433ada14aSBard Liao 	SND_SOC_DAPM_MIXER("RECMIX2R", SND_SOC_NOPM, 0, 0, rt5665_rec2_r_mix,
280533ada14aSBard Liao 		ARRAY_SIZE(rt5665_rec2_r_mix)),
280633ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5665_PWR_ANLG_2,
280733ada14aSBard Liao 		RT5665_PWR_RM1_L_BIT, 0, NULL, 0),
280833ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("RECMIX1R Power", RT5665_PWR_ANLG_2,
280933ada14aSBard Liao 		RT5665_PWR_RM1_R_BIT, 0, NULL, 0),
281033ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("RECMIX2L Power", RT5665_PWR_MIXER,
281133ada14aSBard Liao 		RT5665_PWR_RM2_L_BIT, 0, NULL, 0),
281233ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("RECMIX2R Power", RT5665_PWR_MIXER,
281333ada14aSBard Liao 		RT5665_PWR_RM2_R_BIT, 0, NULL, 0),
281433ada14aSBard Liao 
281533ada14aSBard Liao 	/* ADCs */
281633ada14aSBard Liao 	SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),
281733ada14aSBard Liao 	SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),
281833ada14aSBard Liao 	SND_SOC_DAPM_ADC("ADC2 L", NULL, SND_SOC_NOPM, 0, 0),
281933ada14aSBard Liao 	SND_SOC_DAPM_ADC("ADC2 R", NULL, SND_SOC_NOPM, 0, 0),
282033ada14aSBard Liao 
282133ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5665_PWR_DIG_1,
282233ada14aSBard Liao 		RT5665_PWR_ADC_L1_BIT, 0, NULL, 0),
282333ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5665_PWR_DIG_1,
282433ada14aSBard Liao 		RT5665_PWR_ADC_R1_BIT, 0, NULL, 0),
282533ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC2 L Power", RT5665_PWR_DIG_1,
282633ada14aSBard Liao 		RT5665_PWR_ADC_L2_BIT, 0, NULL, 0),
282733ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC2 R Power", RT5665_PWR_DIG_1,
282833ada14aSBard Liao 		RT5665_PWR_ADC_R2_BIT, 0, NULL, 0),
282933ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5665_CHOP_ADC,
283033ada14aSBard Liao 		RT5665_CKGEN_ADC1_SFT, 0, NULL, 0),
283133ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC2 clock", RT5665_CHOP_ADC,
283233ada14aSBard Liao 		RT5665_CKGEN_ADC2_SFT, 0, NULL, 0),
283333ada14aSBard Liao 
283433ada14aSBard Liao 	/* ADC Mux */
283533ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 DMIC L Mux", SND_SOC_NOPM, 0, 0,
283633ada14aSBard Liao 		&rt5665_sto1_dmic_mux),
283733ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 DMIC R Mux", SND_SOC_NOPM, 0, 0,
283833ada14aSBard Liao 		&rt5665_sto1_dmic_mux),
283933ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
284033ada14aSBard Liao 		&rt5665_sto1_adc1l_mux),
284133ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
284233ada14aSBard Liao 		&rt5665_sto1_adc1r_mux),
284333ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
284433ada14aSBard Liao 		&rt5665_sto1_adc2l_mux),
284533ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
284633ada14aSBard Liao 		&rt5665_sto1_adc2r_mux),
284733ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,
284833ada14aSBard Liao 		&rt5665_sto1_adcl_mux),
284933ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,
285033ada14aSBard Liao 		&rt5665_sto1_adcr_mux),
285133ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 DD L Mux", SND_SOC_NOPM, 0, 0,
285233ada14aSBard Liao 		&rt5665_sto1_dd_l_mux),
285333ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 DD R Mux", SND_SOC_NOPM, 0, 0,
285433ada14aSBard Liao 		&rt5665_sto1_dd_r_mux),
285533ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
285633ada14aSBard Liao 		&rt5665_mono_adc_l2_mux),
285733ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
285833ada14aSBard Liao 		&rt5665_mono_adc_r2_mux),
285933ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
286033ada14aSBard Liao 		&rt5665_mono_adc_l1_mux),
286133ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
286233ada14aSBard Liao 		&rt5665_mono_adc_r1_mux),
286333ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
286433ada14aSBard Liao 		&rt5665_mono_dmic_l_mux),
286533ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
286633ada14aSBard Liao 		&rt5665_mono_dmic_r_mux),
286733ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC L Mux", SND_SOC_NOPM, 0, 0,
286833ada14aSBard Liao 		&rt5665_mono_adc_l_mux),
286933ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC R Mux", SND_SOC_NOPM, 0, 0,
287033ada14aSBard Liao 		&rt5665_mono_adc_r_mux),
287133ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono DD L Mux", SND_SOC_NOPM, 0, 0,
287233ada14aSBard Liao 		&rt5665_mono_dd_l_mux),
287333ada14aSBard Liao 	SND_SOC_DAPM_MUX("Mono DD R Mux", SND_SOC_NOPM, 0, 0,
287433ada14aSBard Liao 		&rt5665_mono_dd_r_mux),
287533ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 DMIC L Mux", SND_SOC_NOPM, 0, 0,
287633ada14aSBard Liao 		&rt5665_sto2_dmic_mux),
287733ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 DMIC R Mux", SND_SOC_NOPM, 0, 0,
287833ada14aSBard Liao 		&rt5665_sto2_dmic_mux),
287933ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
288033ada14aSBard Liao 		&rt5665_sto2_adc1l_mux),
288133ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
288233ada14aSBard Liao 		&rt5665_sto2_adc1r_mux),
288333ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
288433ada14aSBard Liao 		&rt5665_sto2_adc2l_mux),
288533ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
288633ada14aSBard Liao 		&rt5665_sto2_adc2r_mux),
288733ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC L Mux", SND_SOC_NOPM, 0, 0,
288833ada14aSBard Liao 		&rt5665_sto2_adcl_mux),
288933ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC R Mux", SND_SOC_NOPM, 0, 0,
289033ada14aSBard Liao 		&rt5665_sto2_adcr_mux),
289133ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 DD L Mux", SND_SOC_NOPM, 0, 0,
289233ada14aSBard Liao 		&rt5665_sto2_dd_l_mux),
289333ada14aSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 DD R Mux", SND_SOC_NOPM, 0, 0,
289433ada14aSBard Liao 		&rt5665_sto2_dd_r_mux),
289533ada14aSBard Liao 	/* ADC Mixer */
289633ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5665_PWR_DIG_2,
289733ada14aSBard Liao 		RT5665_PWR_ADC_S1F_BIT, 0, NULL, 0),
289833ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Stereo2 Filter", RT5665_PWR_DIG_2,
289933ada14aSBard Liao 		RT5665_PWR_ADC_S2F_BIT, 0, NULL, 0),
290033ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", RT5665_STO1_ADC_DIG_VOL,
290133ada14aSBard Liao 		RT5665_L_MUTE_SFT, 1, rt5665_sto1_adc_l_mix,
290233ada14aSBard Liao 		ARRAY_SIZE(rt5665_sto1_adc_l_mix)),
290333ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5665_STO1_ADC_DIG_VOL,
290433ada14aSBard Liao 		RT5665_R_MUTE_SFT, 1, rt5665_sto1_adc_r_mix,
290533ada14aSBard Liao 		ARRAY_SIZE(rt5665_sto1_adc_r_mix)),
290633ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Stereo2 ADC MIXL", RT5665_STO2_ADC_DIG_VOL,
290733ada14aSBard Liao 		RT5665_L_MUTE_SFT, 1, rt5665_sto2_adc_l_mix,
290833ada14aSBard Liao 		ARRAY_SIZE(rt5665_sto2_adc_l_mix)),
290933ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Stereo2 ADC MIXR", RT5665_STO2_ADC_DIG_VOL,
291033ada14aSBard Liao 		RT5665_R_MUTE_SFT, 1, rt5665_sto2_adc_r_mix,
291133ada14aSBard Liao 		ARRAY_SIZE(rt5665_sto2_adc_r_mix)),
291233ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Mono Left Filter", RT5665_PWR_DIG_2,
291333ada14aSBard Liao 		RT5665_PWR_ADC_MF_L_BIT, 0, NULL, 0),
291433ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Mono ADC MIXL", RT5665_MONO_ADC_DIG_VOL,
291533ada14aSBard Liao 		RT5665_L_MUTE_SFT, 1, rt5665_mono_adc_l_mix,
291633ada14aSBard Liao 		ARRAY_SIZE(rt5665_mono_adc_l_mix)),
291733ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Mono Right Filter", RT5665_PWR_DIG_2,
291833ada14aSBard Liao 		RT5665_PWR_ADC_MF_R_BIT, 0, NULL, 0),
291933ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Mono ADC MIXR", RT5665_MONO_ADC_DIG_VOL,
292033ada14aSBard Liao 		RT5665_R_MUTE_SFT, 1, rt5665_mono_adc_r_mix,
292133ada14aSBard Liao 		ARRAY_SIZE(rt5665_mono_adc_r_mix)),
292233ada14aSBard Liao 
292333ada14aSBard Liao 	/* ADC PGA */
292433ada14aSBard Liao 	SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
292533ada14aSBard Liao 	SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
292633ada14aSBard Liao 	SND_SOC_DAPM_PGA("Mono ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
292733ada14aSBard Liao 
292833ada14aSBard Liao 	/* Digital Interface */
292933ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S1_1", RT5665_PWR_DIG_1, RT5665_PWR_I2S1_1_BIT,
293033ada14aSBard Liao 		0, NULL, 0),
293133ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S1_2", RT5665_PWR_DIG_1, RT5665_PWR_I2S1_2_BIT,
293233ada14aSBard Liao 		0, NULL, 0),
293333ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S2_1", RT5665_PWR_DIG_1, RT5665_PWR_I2S2_1_BIT,
29349b5d3865SBard Liao 		0, rt5665_i2s_pin_event, SND_SOC_DAPM_PRE_PMU |
29359b5d3865SBard Liao 		SND_SOC_DAPM_POST_PMD),
293633ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S2_2", RT5665_PWR_DIG_1, RT5665_PWR_I2S2_2_BIT,
29379b5d3865SBard Liao 		0, rt5665_i2s_pin_event, SND_SOC_DAPM_PRE_PMU |
29389b5d3865SBard Liao 		SND_SOC_DAPM_POST_PMD),
293933ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S3", RT5665_PWR_DIG_1, RT5665_PWR_I2S3_BIT,
29409b5d3865SBard Liao 		0, rt5665_i2s_pin_event, SND_SOC_DAPM_PRE_PMU |
29419b5d3865SBard Liao 		SND_SOC_DAPM_POST_PMD),
294233ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
294333ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
294433ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
294533ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
294633ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
294733ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC2 L", SND_SOC_NOPM, 0, 0, NULL, 0),
294833ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC2 R", SND_SOC_NOPM, 0, 0, NULL, 0),
294933ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC3 L", SND_SOC_NOPM, 0, 0, NULL, 0),
295033ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC3 R", SND_SOC_NOPM, 0, 0, NULL, 0),
295133ada14aSBard Liao 
295233ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF2_1 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
295333ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF2_2 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
295433ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF2_1 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
295533ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF2_1 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
295633ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF2_2 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
295733ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF2_2 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
295833ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF2_1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
295933ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF2_2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
296033ada14aSBard Liao 
296133ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF3 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
296233ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF3 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
296333ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF3 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
296433ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF3 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
296533ada14aSBard Liao 
296633ada14aSBard Liao 	/* Digital Interface Select */
296733ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1_ADC1 Mux", SND_SOC_NOPM, 0, 0,
296833ada14aSBard Liao 		&rt5665_if1_1_adc1_mux),
296933ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1_ADC2 Mux", SND_SOC_NOPM, 0, 0,
297033ada14aSBard Liao 		&rt5665_if1_1_adc2_mux),
297133ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1_ADC3 Mux", SND_SOC_NOPM, 0, 0,
297233ada14aSBard Liao 		&rt5665_if1_1_adc3_mux),
297333ada14aSBard Liao 	SND_SOC_DAPM_PGA("IF1_1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
297433ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2_ADC1 Mux", SND_SOC_NOPM, 0, 0,
297533ada14aSBard Liao 		&rt5665_if1_2_adc1_mux),
297633ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2_ADC2 Mux", SND_SOC_NOPM, 0, 0,
297733ada14aSBard Liao 		&rt5665_if1_2_adc2_mux),
297833ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2_ADC3 Mux", SND_SOC_NOPM, 0, 0,
297933ada14aSBard Liao 		&rt5665_if1_2_adc3_mux),
298033ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2_ADC4 Mux", SND_SOC_NOPM, 0, 0,
298133ada14aSBard Liao 		&rt5665_if1_2_adc4_mux),
298233ada14aSBard Liao 	SND_SOC_DAPM_MUX("TDM1 slot 01 Data Mux", SND_SOC_NOPM, 0, 0,
298333ada14aSBard Liao 		&rt5665_tdm1_adc_mux),
298433ada14aSBard Liao 	SND_SOC_DAPM_MUX("TDM1 slot 23 Data Mux", SND_SOC_NOPM, 0, 0,
298533ada14aSBard Liao 		&rt5665_tdm1_adc_mux),
298633ada14aSBard Liao 	SND_SOC_DAPM_MUX("TDM1 slot 45 Data Mux", SND_SOC_NOPM, 0, 0,
298733ada14aSBard Liao 		&rt5665_tdm1_adc_mux),
298833ada14aSBard Liao 	SND_SOC_DAPM_MUX("TDM1 slot 67 Data Mux", SND_SOC_NOPM, 0, 0,
298933ada14aSBard Liao 		&rt5665_tdm1_adc_mux),
299033ada14aSBard Liao 	SND_SOC_DAPM_MUX("TDM2 slot 01 Data Mux", SND_SOC_NOPM, 0, 0,
299133ada14aSBard Liao 		&rt5665_tdm2_adc_mux),
299233ada14aSBard Liao 	SND_SOC_DAPM_MUX("TDM2 slot 23 Data Mux", SND_SOC_NOPM, 0, 0,
299333ada14aSBard Liao 		&rt5665_tdm2_adc_mux),
299433ada14aSBard Liao 	SND_SOC_DAPM_MUX("TDM2 slot 45 Data Mux", SND_SOC_NOPM, 0, 0,
299533ada14aSBard Liao 		&rt5665_tdm2_adc_mux),
299633ada14aSBard Liao 	SND_SOC_DAPM_MUX("TDM2 slot 67 Data Mux", SND_SOC_NOPM, 0, 0,
299733ada14aSBard Liao 		&rt5665_tdm2_adc_mux),
299833ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF2_1 ADC Mux", SND_SOC_NOPM, 0, 0,
299933ada14aSBard Liao 		&rt5665_if2_1_adc_in_mux),
300033ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF2_2 ADC Mux", SND_SOC_NOPM, 0, 0,
300133ada14aSBard Liao 		&rt5665_if2_2_adc_in_mux),
300233ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF3 ADC Mux", SND_SOC_NOPM, 0, 0,
300333ada14aSBard Liao 		&rt5665_if3_adc_in_mux),
300433ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1 0 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
300533ada14aSBard Liao 			&rt5665_if1_1_01_adc_swap_mux),
300633ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1 1 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
300733ada14aSBard Liao 			&rt5665_if1_1_01_adc_swap_mux),
300833ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1 2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
300933ada14aSBard Liao 			&rt5665_if1_1_23_adc_swap_mux),
301033ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1 3 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
301133ada14aSBard Liao 			&rt5665_if1_1_23_adc_swap_mux),
301233ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1 4 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
301333ada14aSBard Liao 			&rt5665_if1_1_45_adc_swap_mux),
301433ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1 5 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
301533ada14aSBard Liao 			&rt5665_if1_1_45_adc_swap_mux),
301633ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1 6 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
301733ada14aSBard Liao 			&rt5665_if1_1_67_adc_swap_mux),
301833ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_1 7 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
301933ada14aSBard Liao 			&rt5665_if1_1_67_adc_swap_mux),
302033ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2 0 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
302133ada14aSBard Liao 			&rt5665_if1_2_01_adc_swap_mux),
302233ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2 1 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
302333ada14aSBard Liao 			&rt5665_if1_2_01_adc_swap_mux),
302433ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2 2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
302533ada14aSBard Liao 			&rt5665_if1_2_23_adc_swap_mux),
302633ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2 3 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
302733ada14aSBard Liao 			&rt5665_if1_2_23_adc_swap_mux),
302833ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2 4 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
302933ada14aSBard Liao 			&rt5665_if1_2_45_adc_swap_mux),
303033ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2 5 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
303133ada14aSBard Liao 			&rt5665_if1_2_45_adc_swap_mux),
303233ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2 6 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
303333ada14aSBard Liao 			&rt5665_if1_2_67_adc_swap_mux),
303433ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF1_2 7 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
303533ada14aSBard Liao 			&rt5665_if1_2_67_adc_swap_mux),
303633ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF2_1 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
303733ada14aSBard Liao 			&rt5665_if2_1_dac_swap_mux),
303833ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF2_1 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
303933ada14aSBard Liao 			&rt5665_if2_1_adc_swap_mux),
304033ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF2_2 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
304133ada14aSBard Liao 			&rt5665_if2_2_dac_swap_mux),
304233ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF2_2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
304333ada14aSBard Liao 			&rt5665_if2_2_adc_swap_mux),
304433ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF3 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
304533ada14aSBard Liao 			&rt5665_if3_dac_swap_mux),
304633ada14aSBard Liao 	SND_SOC_DAPM_MUX("IF3 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
304733ada14aSBard Liao 			&rt5665_if3_adc_swap_mux),
304833ada14aSBard Liao 
304933ada14aSBard Liao 	/* Audio Interface */
305033ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 0", "AIF1_1 Capture",
305133ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
305233ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 1", "AIF1_1 Capture",
305333ada14aSBard Liao 				1, SND_SOC_NOPM, 0, 0),
305433ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 2", "AIF1_1 Capture",
305533ada14aSBard Liao 				2, SND_SOC_NOPM, 0, 0),
305633ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 3", "AIF1_1 Capture",
305733ada14aSBard Liao 				3, SND_SOC_NOPM, 0, 0),
305833ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 4", "AIF1_1 Capture",
305933ada14aSBard Liao 				4, SND_SOC_NOPM, 0, 0),
306033ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 5", "AIF1_1 Capture",
306133ada14aSBard Liao 				5, SND_SOC_NOPM, 0, 0),
306233ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 6", "AIF1_1 Capture",
306333ada14aSBard Liao 				6, SND_SOC_NOPM, 0, 0),
306433ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 7", "AIF1_1 Capture",
306533ada14aSBard Liao 				7, SND_SOC_NOPM, 0, 0),
306633ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 0", "AIF1_2 Capture",
306733ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
306833ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 1", "AIF1_2 Capture",
306933ada14aSBard Liao 				1, SND_SOC_NOPM, 0, 0),
307033ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 2", "AIF1_2 Capture",
307133ada14aSBard Liao 				2, SND_SOC_NOPM, 0, 0),
307233ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 3", "AIF1_2 Capture",
307333ada14aSBard Liao 				3, SND_SOC_NOPM, 0, 0),
307433ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 4", "AIF1_2 Capture",
307533ada14aSBard Liao 				4, SND_SOC_NOPM, 0, 0),
307633ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 5", "AIF1_2 Capture",
307733ada14aSBard Liao 				5, SND_SOC_NOPM, 0, 0),
307833ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 6", "AIF1_2 Capture",
307933ada14aSBard Liao 				6, SND_SOC_NOPM, 0, 0),
308033ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 7", "AIF1_2 Capture",
308133ada14aSBard Liao 				7, SND_SOC_NOPM, 0, 0),
308233ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF2_1TX", "AIF2_1 Capture",
308333ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
308433ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF2_2TX", "AIF2_2 Capture",
308533ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
308633ada14aSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF3TX", "AIF3 Capture",
308733ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
308833ada14aSBard Liao 	SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback",
308933ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
309033ada14aSBard Liao 	SND_SOC_DAPM_AIF_IN("AIF2_1RX", "AIF2_1 Playback",
309133ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
309233ada14aSBard Liao 	SND_SOC_DAPM_AIF_IN("AIF2_2RX", "AIF2_2 Playback",
309333ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
309433ada14aSBard Liao 	SND_SOC_DAPM_AIF_IN("AIF3RX", "AIF3 Playback",
309533ada14aSBard Liao 				0, SND_SOC_NOPM, 0, 0),
309633ada14aSBard Liao 
309733ada14aSBard Liao 	/* Output Side */
309833ada14aSBard Liao 	/* DAC mixer before sound effect  */
309933ada14aSBard Liao 	SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
310033ada14aSBard Liao 		rt5665_dac_l_mix, ARRAY_SIZE(rt5665_dac_l_mix)),
310133ada14aSBard Liao 	SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
310233ada14aSBard Liao 		rt5665_dac_r_mix, ARRAY_SIZE(rt5665_dac_r_mix)),
310333ada14aSBard Liao 
310433ada14aSBard Liao 	/* DAC channel Mux */
310533ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC L1 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_l1_mux),
310633ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC R1 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_r1_mux),
310733ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_l2_mux),
310833ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_r2_mux),
310933ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC L3 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_l3_mux),
311033ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC R3 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_r3_mux),
311133ada14aSBard Liao 
311233ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0,
311333ada14aSBard Liao 		&rt5665_alg_dac_l1_mux),
311433ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0,
311533ada14aSBard Liao 		&rt5665_alg_dac_r1_mux),
311633ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC L2 Source", SND_SOC_NOPM, 0, 0,
311733ada14aSBard Liao 		&rt5665_alg_dac_l2_mux),
311833ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC R2 Source", SND_SOC_NOPM, 0, 0,
311933ada14aSBard Liao 		&rt5665_alg_dac_r2_mux),
312033ada14aSBard Liao 
312133ada14aSBard Liao 	/* DAC Mixer */
312233ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5665_PWR_DIG_2,
312333ada14aSBard Liao 		RT5665_PWR_DAC_S1F_BIT, 0, NULL, 0),
312433ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC Stereo2 Filter", RT5665_PWR_DIG_2,
312533ada14aSBard Liao 		RT5665_PWR_DAC_S2F_BIT, 0, NULL, 0),
312633ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC Mono Left Filter", RT5665_PWR_DIG_2,
312733ada14aSBard Liao 		RT5665_PWR_DAC_MF_L_BIT, 0, NULL, 0),
312833ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC Mono Right Filter", RT5665_PWR_DIG_2,
312933ada14aSBard Liao 		RT5665_PWR_DAC_MF_R_BIT, 0, NULL, 0),
313033ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0,
313133ada14aSBard Liao 		rt5665_sto1_dac_l_mix, ARRAY_SIZE(rt5665_sto1_dac_l_mix)),
313233ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0,
313333ada14aSBard Liao 		rt5665_sto1_dac_r_mix, ARRAY_SIZE(rt5665_sto1_dac_r_mix)),
313433ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Stereo2 DAC MIXL", SND_SOC_NOPM, 0, 0,
313533ada14aSBard Liao 		rt5665_sto2_dac_l_mix, ARRAY_SIZE(rt5665_sto2_dac_l_mix)),
313633ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Stereo2 DAC MIXR", SND_SOC_NOPM, 0, 0,
313733ada14aSBard Liao 		rt5665_sto2_dac_r_mix, ARRAY_SIZE(rt5665_sto2_dac_r_mix)),
313833ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
313933ada14aSBard Liao 		rt5665_mono_dac_l_mix, ARRAY_SIZE(rt5665_mono_dac_l_mix)),
314033ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
314133ada14aSBard Liao 		rt5665_mono_dac_r_mix, ARRAY_SIZE(rt5665_mono_dac_r_mix)),
314233ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC MIXL", SND_SOC_NOPM, 0, 0,
314333ada14aSBard Liao 		&rt5665_dig_dac_mixl_mux),
314433ada14aSBard Liao 	SND_SOC_DAPM_MUX("DAC MIXR", SND_SOC_NOPM, 0, 0,
314533ada14aSBard Liao 		&rt5665_dig_dac_mixr_mux),
314633ada14aSBard Liao 
314733ada14aSBard Liao 	/* DACs */
314833ada14aSBard Liao 	SND_SOC_DAPM_DAC("DAC L1", NULL, SND_SOC_NOPM, 0, 0),
314933ada14aSBard Liao 	SND_SOC_DAPM_DAC("DAC R1", NULL, SND_SOC_NOPM, 0, 0),
315033ada14aSBard Liao 
315133ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC L2 Power", RT5665_PWR_DIG_1,
315233ada14aSBard Liao 		RT5665_PWR_DAC_L2_BIT, 0, NULL, 0),
315333ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC R2 Power", RT5665_PWR_DIG_1,
315433ada14aSBard Liao 		RT5665_PWR_DAC_R2_BIT, 0, NULL, 0),
315533ada14aSBard Liao 	SND_SOC_DAPM_DAC("DAC L2", NULL, SND_SOC_NOPM, 0, 0),
315633ada14aSBard Liao 	SND_SOC_DAPM_DAC("DAC R2", NULL, SND_SOC_NOPM, 0, 0),
315733ada14aSBard Liao 	SND_SOC_DAPM_PGA("DAC1 MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
315833ada14aSBard Liao 
315933ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC 1 Clock", 1, RT5665_CHOP_DAC,
316033ada14aSBard Liao 		RT5665_CKGEN_DAC1_SFT, 0, NULL, 0),
316133ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC 2 Clock", 1, RT5665_CHOP_DAC,
316233ada14aSBard Liao 		RT5665_CKGEN_DAC2_SFT, 0, NULL, 0),
316333ada14aSBard Liao 
316433ada14aSBard Liao 	/* OUT Mixer */
316533ada14aSBard Liao 	SND_SOC_DAPM_MIXER("MONOVOL MIX", RT5665_PWR_MIXER, RT5665_PWR_MM_BIT,
316633ada14aSBard Liao 		0, rt5665_monovol_mix, ARRAY_SIZE(rt5665_monovol_mix)),
316733ada14aSBard Liao 	SND_SOC_DAPM_MIXER("OUT MIXL", RT5665_PWR_MIXER, RT5665_PWR_OM_L_BIT,
316833ada14aSBard Liao 		0, rt5665_out_l_mix, ARRAY_SIZE(rt5665_out_l_mix)),
316933ada14aSBard Liao 	SND_SOC_DAPM_MIXER("OUT MIXR", RT5665_PWR_MIXER, RT5665_PWR_OM_R_BIT,
317033ada14aSBard Liao 		0, rt5665_out_r_mix, ARRAY_SIZE(rt5665_out_r_mix)),
317133ada14aSBard Liao 
317233ada14aSBard Liao 	/* Output Volume */
317333ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("MONOVOL", RT5665_PWR_VOL, RT5665_PWR_MV_BIT, 0,
317433ada14aSBard Liao 		&monovol_switch),
317533ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("OUTVOL L", RT5665_PWR_VOL, RT5665_PWR_OV_L_BIT, 0,
317633ada14aSBard Liao 		&outvol_l_switch),
317733ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("OUTVOL R", RT5665_PWR_VOL, RT5665_PWR_OV_R_BIT, 0,
317833ada14aSBard Liao 		&outvol_r_switch),
317933ada14aSBard Liao 
318033ada14aSBard Liao 	/* MONO/HPO/LOUT */
318133ada14aSBard Liao 	SND_SOC_DAPM_MIXER("Mono MIX", SND_SOC_NOPM, 0,	0, rt5665_mono_mix,
318233ada14aSBard Liao 		ARRAY_SIZE(rt5665_mono_mix)),
318333ada14aSBard Liao 	SND_SOC_DAPM_MIXER("LOUT L MIX", SND_SOC_NOPM, 0, 0, rt5665_lout_l_mix,
318433ada14aSBard Liao 		ARRAY_SIZE(rt5665_lout_l_mix)),
318533ada14aSBard Liao 	SND_SOC_DAPM_MIXER("LOUT R MIX", SND_SOC_NOPM, 0, 0, rt5665_lout_r_mix,
318633ada14aSBard Liao 		ARRAY_SIZE(rt5665_lout_r_mix)),
318733ada14aSBard Liao 	SND_SOC_DAPM_PGA_S("Mono Amp", 1, RT5665_PWR_ANLG_1, RT5665_PWR_MA_BIT,
318833ada14aSBard Liao 		0, rt5665_mono_event, SND_SOC_DAPM_POST_PMD |
318933ada14aSBard Liao 		SND_SOC_DAPM_PRE_PMU),
319033ada14aSBard Liao 	SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5665_hp_event,
319133ada14aSBard Liao 		SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU),
319233ada14aSBard Liao 	SND_SOC_DAPM_PGA_S("LOUT Amp", 1, RT5665_PWR_ANLG_1,
319333ada14aSBard Liao 		RT5665_PWR_LM_BIT, 0, rt5665_lout_event,
319433ada14aSBard Liao 		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
319533ada14aSBard Liao 		SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU),
319633ada14aSBard Liao 
319733ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("Charge Pump", SND_SOC_NOPM, 0, 0,
319833ada14aSBard Liao 		rt5665_charge_pump_event, SND_SOC_DAPM_PRE_PMU |
319933ada14aSBard Liao 		SND_SOC_DAPM_POST_PMD),
320033ada14aSBard Liao 
320133ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("Mono Playback", SND_SOC_NOPM, 0, 0,
320233ada14aSBard Liao 		&mono_switch),
320333ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("HPO Playback", SND_SOC_NOPM, 0, 0,
320433ada14aSBard Liao 		&hpo_switch),
320533ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("LOUT L Playback", SND_SOC_NOPM, 0, 0,
320633ada14aSBard Liao 		&lout_l_switch),
320733ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("LOUT R Playback", SND_SOC_NOPM, 0, 0,
320833ada14aSBard Liao 		&lout_r_switch),
320933ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("PDM L Playback", SND_SOC_NOPM, 0, 0,
321033ada14aSBard Liao 		&pdm_l_switch),
321133ada14aSBard Liao 	SND_SOC_DAPM_SWITCH("PDM R Playback", SND_SOC_NOPM, 0, 0,
321233ada14aSBard Liao 		&pdm_r_switch),
321333ada14aSBard Liao 
321433ada14aSBard Liao 	/* PDM */
321533ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("PDM Power", RT5665_PWR_DIG_2,
321633ada14aSBard Liao 		RT5665_PWR_PDM1_BIT, 0, NULL, 0),
321733ada14aSBard Liao 	SND_SOC_DAPM_MUX("PDM L Mux", SND_SOC_NOPM,
321833ada14aSBard Liao 		0, 1, &rt5665_pdm_l_mux),
321933ada14aSBard Liao 	SND_SOC_DAPM_MUX("PDM R Mux", SND_SOC_NOPM,
322033ada14aSBard Liao 		0, 1, &rt5665_pdm_r_mux),
322133ada14aSBard Liao 
322233ada14aSBard Liao 	/* CLK DET */
322333ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5665_CLK_DET, RT5665_SYS_CLK_DET,
322433ada14aSBard Liao 		0, NULL, 0),
322533ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET HP", RT5665_CLK_DET, RT5665_HP_CLK_DET,
322633ada14aSBard Liao 		0, NULL, 0),
322733ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET MONO", RT5665_CLK_DET, RT5665_MONO_CLK_DET,
322833ada14aSBard Liao 		0, NULL, 0),
322933ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET LOUT", RT5665_CLK_DET, RT5665_LOUT_CLK_DET,
323033ada14aSBard Liao 		0, NULL, 0),
323133ada14aSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET", RT5665_CLK_DET, RT5665_POW_CLK_DET,
323233ada14aSBard Liao 		0, NULL, 0),
323333ada14aSBard Liao 
323433ada14aSBard Liao 	/* Output Lines */
323533ada14aSBard Liao 	SND_SOC_DAPM_OUTPUT("HPOL"),
323633ada14aSBard Liao 	SND_SOC_DAPM_OUTPUT("HPOR"),
323733ada14aSBard Liao 	SND_SOC_DAPM_OUTPUT("LOUTL"),
323833ada14aSBard Liao 	SND_SOC_DAPM_OUTPUT("LOUTR"),
323933ada14aSBard Liao 	SND_SOC_DAPM_OUTPUT("MONOOUT"),
324033ada14aSBard Liao 	SND_SOC_DAPM_OUTPUT("PDML"),
324133ada14aSBard Liao 	SND_SOC_DAPM_OUTPUT("PDMR"),
324233ada14aSBard Liao };
324333ada14aSBard Liao 
324433ada14aSBard Liao static const struct snd_soc_dapm_route rt5665_dapm_routes[] = {
324533ada14aSBard Liao 	/*PLL*/
324633ada14aSBard Liao 	{"ADC Stereo1 Filter", NULL, "PLL", is_sys_clk_from_pll},
324733ada14aSBard Liao 	{"ADC Stereo2 Filter", NULL, "PLL", is_sys_clk_from_pll},
324833ada14aSBard Liao 	{"ADC Mono Left Filter", NULL, "PLL", is_sys_clk_from_pll},
324933ada14aSBard Liao 	{"ADC Mono Right Filter", NULL, "PLL", is_sys_clk_from_pll},
325033ada14aSBard Liao 	{"DAC Stereo1 Filter", NULL, "PLL", is_sys_clk_from_pll},
325133ada14aSBard Liao 	{"DAC Stereo2 Filter", NULL, "PLL", is_sys_clk_from_pll},
325233ada14aSBard Liao 	{"DAC Mono Left Filter", NULL, "PLL", is_sys_clk_from_pll},
325333ada14aSBard Liao 	{"DAC Mono Right Filter", NULL, "PLL", is_sys_clk_from_pll},
325433ada14aSBard Liao 
325533ada14aSBard Liao 	/*ASRC*/
325633ada14aSBard Liao 	{"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc},
325730b7d88dSBard Liao 	{"ADC Stereo2 Filter", NULL, "ADC STO2 ASRC", is_using_asrc},
325833ada14aSBard Liao 	{"ADC Mono Left Filter", NULL, "ADC Mono L ASRC", is_using_asrc},
325933ada14aSBard Liao 	{"ADC Mono Right Filter", NULL, "ADC Mono R ASRC", is_using_asrc},
326033ada14aSBard Liao 	{"DAC Mono Left Filter", NULL, "DAC Mono L ASRC", is_using_asrc},
326133ada14aSBard Liao 	{"DAC Mono Right Filter", NULL, "DAC Mono R ASRC", is_using_asrc},
326233ada14aSBard Liao 	{"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},
326333ada14aSBard Liao 	{"DAC Stereo2 Filter", NULL, "DAC STO2 ASRC", is_using_asrc},
326409b50c37SBard Liao 	{"I2S1 ASRC", NULL, "CLKDET"},
326509b50c37SBard Liao 	{"I2S2 ASRC", NULL, "CLKDET"},
326609b50c37SBard Liao 	{"I2S3 ASRC", NULL, "CLKDET"},
326733ada14aSBard Liao 
326833ada14aSBard Liao 	/*Vref*/
326933ada14aSBard Liao 	{"Mic Det Power", NULL, "Vref2"},
327033ada14aSBard Liao 	{"MICBIAS1", NULL, "Vref1"},
327133ada14aSBard Liao 	{"MICBIAS1", NULL, "Vref2"},
327233ada14aSBard Liao 	{"MICBIAS2", NULL, "Vref1"},
327333ada14aSBard Liao 	{"MICBIAS2", NULL, "Vref2"},
327433ada14aSBard Liao 	{"MICBIAS3", NULL, "Vref1"},
327533ada14aSBard Liao 	{"MICBIAS3", NULL, "Vref2"},
327633ada14aSBard Liao 
327733ada14aSBard Liao 	{"Stereo1 DMIC L Mux", NULL, "DMIC STO1 ASRC"},
327833ada14aSBard Liao 	{"Stereo1 DMIC R Mux", NULL, "DMIC STO1 ASRC"},
327933ada14aSBard Liao 	{"Stereo2 DMIC L Mux", NULL, "DMIC STO2 ASRC"},
328033ada14aSBard Liao 	{"Stereo2 DMIC R Mux", NULL, "DMIC STO2 ASRC"},
328133ada14aSBard Liao 	{"Mono DMIC L Mux", NULL, "DMIC MONO L ASRC"},
328233ada14aSBard Liao 	{"Mono DMIC R Mux", NULL, "DMIC MONO R ASRC"},
328333ada14aSBard Liao 
328433ada14aSBard Liao 	{"I2S1_1", NULL, "I2S1 ASRC"},
328533ada14aSBard Liao 	{"I2S1_2", NULL, "I2S1 ASRC"},
328633ada14aSBard Liao 	{"I2S2_1", NULL, "I2S2 ASRC"},
328733ada14aSBard Liao 	{"I2S2_2", NULL, "I2S2 ASRC"},
328833ada14aSBard Liao 	{"I2S3", NULL, "I2S3 ASRC"},
328933ada14aSBard Liao 
329033ada14aSBard Liao 	{"CLKDET SYS", NULL, "CLKDET"},
329133ada14aSBard Liao 	{"CLKDET HP", NULL, "CLKDET"},
329233ada14aSBard Liao 	{"CLKDET MONO", NULL, "CLKDET"},
329333ada14aSBard Liao 	{"CLKDET LOUT", NULL, "CLKDET"},
329433ada14aSBard Liao 
329533ada14aSBard Liao 	{"IN1P", NULL, "LDO2"},
329633ada14aSBard Liao 	{"IN2P", NULL, "LDO2"},
329733ada14aSBard Liao 	{"IN3P", NULL, "LDO2"},
329833ada14aSBard Liao 	{"IN4P", NULL, "LDO2"},
329933ada14aSBard Liao 
330033ada14aSBard Liao 	{"DMIC1", NULL, "DMIC L1"},
330133ada14aSBard Liao 	{"DMIC1", NULL, "DMIC R1"},
330233ada14aSBard Liao 	{"DMIC2", NULL, "DMIC L2"},
330333ada14aSBard Liao 	{"DMIC2", NULL, "DMIC R2"},
330433ada14aSBard Liao 
330533ada14aSBard Liao 	{"BST1", NULL, "IN1P"},
330633ada14aSBard Liao 	{"BST1", NULL, "IN1N"},
330733ada14aSBard Liao 	{"BST1", NULL, "BST1 Power"},
330833ada14aSBard Liao 	{"BST1", NULL, "BST1P Power"},
330933ada14aSBard Liao 	{"BST2", NULL, "IN2P"},
331033ada14aSBard Liao 	{"BST2", NULL, "IN2N"},
331133ada14aSBard Liao 	{"BST2", NULL, "BST2 Power"},
331233ada14aSBard Liao 	{"BST2", NULL, "BST2P Power"},
331333ada14aSBard Liao 	{"BST3", NULL, "IN3P"},
331433ada14aSBard Liao 	{"BST3", NULL, "IN3N"},
331533ada14aSBard Liao 	{"BST3", NULL, "BST3 Power"},
331633ada14aSBard Liao 	{"BST3", NULL, "BST3P Power"},
331733ada14aSBard Liao 	{"BST4", NULL, "IN4P"},
331833ada14aSBard Liao 	{"BST4", NULL, "IN4N"},
331933ada14aSBard Liao 	{"BST4", NULL, "BST4 Power"},
332033ada14aSBard Liao 	{"BST4", NULL, "BST4P Power"},
332133ada14aSBard Liao 	{"BST1 CBJ", NULL, "IN1P"},
332233ada14aSBard Liao 	{"BST1 CBJ", NULL, "IN1N"},
332333ada14aSBard Liao 	{"BST1 CBJ", NULL, "CBJ Power"},
332433ada14aSBard Liao 	{"CBJ Power", NULL, "Vref2"},
332533ada14aSBard Liao 
332633ada14aSBard Liao 	{"INL VOL", NULL, "IN3P"},
332733ada14aSBard Liao 	{"INR VOL", NULL, "IN3N"},
332833ada14aSBard Liao 
332933ada14aSBard Liao 	{"RECMIX1L", "CBJ Switch", "BST1 CBJ"},
333033ada14aSBard Liao 	{"RECMIX1L", "INL Switch", "INL VOL"},
333133ada14aSBard Liao 	{"RECMIX1L", "INR Switch", "INR VOL"},
333233ada14aSBard Liao 	{"RECMIX1L", "BST4 Switch", "BST4"},
333333ada14aSBard Liao 	{"RECMIX1L", "BST3 Switch", "BST3"},
333433ada14aSBard Liao 	{"RECMIX1L", "BST2 Switch", "BST2"},
333533ada14aSBard Liao 	{"RECMIX1L", "BST1 Switch", "BST1"},
333633ada14aSBard Liao 	{"RECMIX1L", NULL, "RECMIX1L Power"},
333733ada14aSBard Liao 
333833ada14aSBard Liao 	{"RECMIX1R", "MONOVOL Switch", "MONOVOL"},
333933ada14aSBard Liao 	{"RECMIX1R", "INR Switch", "INR VOL"},
334033ada14aSBard Liao 	{"RECMIX1R", "BST4 Switch", "BST4"},
334133ada14aSBard Liao 	{"RECMIX1R", "BST3 Switch", "BST3"},
334233ada14aSBard Liao 	{"RECMIX1R", "BST2 Switch", "BST2"},
334333ada14aSBard Liao 	{"RECMIX1R", "BST1 Switch", "BST1"},
334433ada14aSBard Liao 	{"RECMIX1R", NULL, "RECMIX1R Power"},
334533ada14aSBard Liao 
334633ada14aSBard Liao 	{"RECMIX2L", "CBJ Switch", "BST1 CBJ"},
334733ada14aSBard Liao 	{"RECMIX2L", "INL Switch", "INL VOL"},
334833ada14aSBard Liao 	{"RECMIX2L", "INR Switch", "INR VOL"},
334933ada14aSBard Liao 	{"RECMIX2L", "BST4 Switch", "BST4"},
335033ada14aSBard Liao 	{"RECMIX2L", "BST3 Switch", "BST3"},
335133ada14aSBard Liao 	{"RECMIX2L", "BST2 Switch", "BST2"},
335233ada14aSBard Liao 	{"RECMIX2L", "BST1 Switch", "BST1"},
335333ada14aSBard Liao 	{"RECMIX2L", NULL, "RECMIX2L Power"},
335433ada14aSBard Liao 
335533ada14aSBard Liao 	{"RECMIX2R", "MONOVOL Switch", "MONOVOL"},
335633ada14aSBard Liao 	{"RECMIX2R", "INL Switch", "INL VOL"},
335733ada14aSBard Liao 	{"RECMIX2R", "INR Switch", "INR VOL"},
335833ada14aSBard Liao 	{"RECMIX2R", "BST4 Switch", "BST4"},
335933ada14aSBard Liao 	{"RECMIX2R", "BST3 Switch", "BST3"},
336033ada14aSBard Liao 	{"RECMIX2R", "BST2 Switch", "BST2"},
336133ada14aSBard Liao 	{"RECMIX2R", "BST1 Switch", "BST1"},
336233ada14aSBard Liao 	{"RECMIX2R", NULL, "RECMIX2R Power"},
336333ada14aSBard Liao 
336433ada14aSBard Liao 	{"ADC1 L", NULL, "RECMIX1L"},
336533ada14aSBard Liao 	{"ADC1 L", NULL, "ADC1 L Power"},
336633ada14aSBard Liao 	{"ADC1 L", NULL, "ADC1 clock"},
336733ada14aSBard Liao 	{"ADC1 R", NULL, "RECMIX1R"},
336833ada14aSBard Liao 	{"ADC1 R", NULL, "ADC1 R Power"},
336933ada14aSBard Liao 	{"ADC1 R", NULL, "ADC1 clock"},
337033ada14aSBard Liao 
337133ada14aSBard Liao 	{"ADC2 L", NULL, "RECMIX2L"},
337233ada14aSBard Liao 	{"ADC2 L", NULL, "ADC2 L Power"},
337333ada14aSBard Liao 	{"ADC2 L", NULL, "ADC2 clock"},
337433ada14aSBard Liao 	{"ADC2 R", NULL, "RECMIX2R"},
337533ada14aSBard Liao 	{"ADC2 R", NULL, "ADC2 R Power"},
337633ada14aSBard Liao 	{"ADC2 R", NULL, "ADC2 clock"},
337733ada14aSBard Liao 
337833ada14aSBard Liao 	{"DMIC L1", NULL, "DMIC CLK"},
337933ada14aSBard Liao 	{"DMIC L1", NULL, "DMIC1 Power"},
338033ada14aSBard Liao 	{"DMIC R1", NULL, "DMIC CLK"},
338133ada14aSBard Liao 	{"DMIC R1", NULL, "DMIC1 Power"},
338233ada14aSBard Liao 	{"DMIC L2", NULL, "DMIC CLK"},
338333ada14aSBard Liao 	{"DMIC L2", NULL, "DMIC2 Power"},
338433ada14aSBard Liao 	{"DMIC R2", NULL, "DMIC CLK"},
338533ada14aSBard Liao 	{"DMIC R2", NULL, "DMIC2 Power"},
338633ada14aSBard Liao 
338733ada14aSBard Liao 	{"Stereo1 DMIC L Mux", "DMIC1", "DMIC L1"},
338833ada14aSBard Liao 	{"Stereo1 DMIC L Mux", "DMIC2", "DMIC L2"},
338933ada14aSBard Liao 
339033ada14aSBard Liao 	{"Stereo1 DMIC R Mux", "DMIC1", "DMIC R1"},
339133ada14aSBard Liao 	{"Stereo1 DMIC R Mux", "DMIC2", "DMIC R2"},
339233ada14aSBard Liao 
339333ada14aSBard Liao 	{"Mono DMIC L Mux", "DMIC1 L", "DMIC L1"},
339433ada14aSBard Liao 	{"Mono DMIC L Mux", "DMIC2 L", "DMIC L2"},
339533ada14aSBard Liao 
339633ada14aSBard Liao 	{"Mono DMIC R Mux", "DMIC1 R", "DMIC R1"},
339733ada14aSBard Liao 	{"Mono DMIC R Mux", "DMIC2 R", "DMIC R2"},
339833ada14aSBard Liao 
339933ada14aSBard Liao 	{"Stereo2 DMIC L Mux", "DMIC1", "DMIC L1"},
340033ada14aSBard Liao 	{"Stereo2 DMIC L Mux", "DMIC2", "DMIC L2"},
340133ada14aSBard Liao 
340233ada14aSBard Liao 	{"Stereo2 DMIC R Mux", "DMIC1", "DMIC R1"},
340333ada14aSBard Liao 	{"Stereo2 DMIC R Mux", "DMIC2", "DMIC R2"},
340433ada14aSBard Liao 
340533ada14aSBard Liao 	{"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"},
340633ada14aSBard Liao 	{"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"},
340733ada14aSBard Liao 	{"Stereo1 ADC L Mux", "ADC2 L", "ADC2 L"},
340833ada14aSBard Liao 	{"Stereo1 ADC L Mux", "ADC2 R", "ADC2 R"},
340933ada14aSBard Liao 	{"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"},
341033ada14aSBard Liao 	{"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"},
341133ada14aSBard Liao 	{"Stereo1 ADC R Mux", "ADC2 L", "ADC2 L"},
341233ada14aSBard Liao 	{"Stereo1 ADC R Mux", "ADC2 R", "ADC2 R"},
341333ada14aSBard Liao 
341433ada14aSBard Liao 	{"Stereo1 DD L Mux", "STO2 DAC", "Stereo2 DAC MIXL"},
341533ada14aSBard Liao 	{"Stereo1 DD L Mux", "MONO DAC", "Mono DAC MIXL"},
341633ada14aSBard Liao 
341733ada14aSBard Liao 	{"Stereo1 DD R Mux", "STO2 DAC", "Stereo2 DAC MIXR"},
341833ada14aSBard Liao 	{"Stereo1 DD R Mux", "MONO DAC", "Mono DAC MIXR"},
341933ada14aSBard Liao 
342033ada14aSBard Liao 	{"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"},
342133ada14aSBard Liao 	{"Stereo1 ADC L1 Mux", "DD Mux", "Stereo1 DD L Mux"},
342233ada14aSBard Liao 	{"Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC L Mux"},
342333ada14aSBard Liao 	{"Stereo1 ADC L2 Mux", "DAC MIX", "DAC MIXL"},
342433ada14aSBard Liao 
342533ada14aSBard Liao 	{"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"},
342633ada14aSBard Liao 	{"Stereo1 ADC R1 Mux", "DD Mux", "Stereo1 DD R Mux"},
342733ada14aSBard Liao 	{"Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC R Mux"},
342833ada14aSBard Liao 	{"Stereo1 ADC R2 Mux", "DAC MIX", "DAC MIXR"},
342933ada14aSBard Liao 
343033ada14aSBard Liao 	{"Mono ADC L Mux", "ADC1 L", "ADC1 L"},
343133ada14aSBard Liao 	{"Mono ADC L Mux", "ADC1 R", "ADC1 R"},
343233ada14aSBard Liao 	{"Mono ADC L Mux", "ADC2 L", "ADC2 L"},
343333ada14aSBard Liao 	{"Mono ADC L Mux", "ADC2 R", "ADC2 R"},
343433ada14aSBard Liao 
343533ada14aSBard Liao 	{"Mono ADC R Mux", "ADC1 L", "ADC1 L"},
343633ada14aSBard Liao 	{"Mono ADC R Mux", "ADC1 R", "ADC1 R"},
343733ada14aSBard Liao 	{"Mono ADC R Mux", "ADC2 L", "ADC2 L"},
343833ada14aSBard Liao 	{"Mono ADC R Mux", "ADC2 R", "ADC2 R"},
343933ada14aSBard Liao 
344033ada14aSBard Liao 	{"Mono DD L Mux", "STO2 DAC", "Stereo2 DAC MIXL"},
344133ada14aSBard Liao 	{"Mono DD L Mux", "MONO DAC", "Mono DAC MIXL"},
344233ada14aSBard Liao 
344333ada14aSBard Liao 	{"Mono DD R Mux", "STO2 DAC", "Stereo2 DAC MIXR"},
344433ada14aSBard Liao 	{"Mono DD R Mux", "MONO DAC", "Mono DAC MIXR"},
344533ada14aSBard Liao 
344633ada14aSBard Liao 	{"Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux"},
344733ada14aSBard Liao 	{"Mono ADC L2 Mux", "DAC MIXL", "DAC MIXL"},
344833ada14aSBard Liao 	{"Mono ADC L1 Mux", "DD Mux", "Mono DD L Mux"},
344933ada14aSBard Liao 	{"Mono ADC L1 Mux", "ADC",  "Mono ADC L Mux"},
345033ada14aSBard Liao 
345133ada14aSBard Liao 	{"Mono ADC R1 Mux", "DD Mux", "Mono DD R Mux"},
345233ada14aSBard Liao 	{"Mono ADC R1 Mux", "ADC", "Mono ADC R Mux"},
345333ada14aSBard Liao 	{"Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux"},
345433ada14aSBard Liao 	{"Mono ADC R2 Mux", "DAC MIXR", "DAC MIXR"},
345533ada14aSBard Liao 
345633ada14aSBard Liao 	{"Stereo2 ADC L Mux", "ADC1 L", "ADC1 L"},
345733ada14aSBard Liao 	{"Stereo2 ADC L Mux", "ADC2 L", "ADC2 L"},
345833ada14aSBard Liao 	{"Stereo2 ADC L Mux", "ADC1 R", "ADC1 R"},
345933ada14aSBard Liao 	{"Stereo2 ADC R Mux", "ADC1 L", "ADC1 L"},
346033ada14aSBard Liao 	{"Stereo2 ADC R Mux", "ADC2 L", "ADC2 L"},
346133ada14aSBard Liao 	{"Stereo2 ADC R Mux", "ADC1 R", "ADC1 R"},
346233ada14aSBard Liao 
346333ada14aSBard Liao 	{"Stereo2 DD L Mux", "STO2 DAC", "Stereo2 DAC MIXL"},
346433ada14aSBard Liao 	{"Stereo2 DD L Mux", "MONO DAC", "Mono DAC MIXL"},
346533ada14aSBard Liao 
346633ada14aSBard Liao 	{"Stereo2 DD R Mux", "STO2 DAC", "Stereo2 DAC MIXR"},
346733ada14aSBard Liao 	{"Stereo2 DD R Mux", "MONO DAC", "Mono DAC MIXR"},
346833ada14aSBard Liao 
346933ada14aSBard Liao 	{"Stereo2 ADC L1 Mux", "ADC", "Stereo2 ADC L Mux"},
347033ada14aSBard Liao 	{"Stereo2 ADC L1 Mux", "DD Mux", "Stereo2 DD L Mux"},
347133ada14aSBard Liao 	{"Stereo2 ADC L2 Mux", "DMIC", "Stereo2 DMIC L Mux"},
347233ada14aSBard Liao 	{"Stereo2 ADC L2 Mux", "DAC MIX", "DAC MIXL"},
347333ada14aSBard Liao 
347433ada14aSBard Liao 	{"Stereo2 ADC R1 Mux", "ADC", "Stereo2 ADC R Mux"},
347533ada14aSBard Liao 	{"Stereo2 ADC R1 Mux", "DD Mux", "Stereo2 DD R Mux"},
347633ada14aSBard Liao 	{"Stereo2 ADC R2 Mux", "DMIC", "Stereo2 DMIC R Mux"},
347733ada14aSBard Liao 	{"Stereo2 ADC R2 Mux", "DAC MIX", "DAC MIXR"},
347833ada14aSBard Liao 
347933ada14aSBard Liao 	{"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"},
348033ada14aSBard Liao 	{"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"},
348133ada14aSBard Liao 	{"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"},
348233ada14aSBard Liao 
348333ada14aSBard Liao 	{"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"},
348433ada14aSBard Liao 	{"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"},
348533ada14aSBard Liao 	{"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"},
348633ada14aSBard Liao 
348733ada14aSBard Liao 	{"Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux"},
348833ada14aSBard Liao 	{"Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux"},
348933ada14aSBard Liao 	{"Mono ADC MIXL", NULL, "ADC Mono Left Filter"},
349033ada14aSBard Liao 
349133ada14aSBard Liao 	{"Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux"},
349233ada14aSBard Liao 	{"Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux"},
349333ada14aSBard Liao 	{"Mono ADC MIXR", NULL, "ADC Mono Right Filter"},
349433ada14aSBard Liao 
349533ada14aSBard Liao 	{"Stereo2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC L1 Mux"},
349633ada14aSBard Liao 	{"Stereo2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC L2 Mux"},
349733ada14aSBard Liao 	{"Stereo2 ADC MIXL", NULL, "ADC Stereo2 Filter"},
349833ada14aSBard Liao 
349933ada14aSBard Liao 	{"Stereo2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC R1 Mux"},
350033ada14aSBard Liao 	{"Stereo2 ADC MIXR", "ADC2 Switch", "Stereo2 ADC R2 Mux"},
350133ada14aSBard Liao 	{"Stereo2 ADC MIXR", NULL, "ADC Stereo2 Filter"},
350233ada14aSBard Liao 
350333ada14aSBard Liao 	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"},
350433ada14aSBard Liao 	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"},
350533ada14aSBard Liao 	{"Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXL"},
350633ada14aSBard Liao 	{"Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXR"},
350733ada14aSBard Liao 	{"Mono ADC MIX", NULL, "Mono ADC MIXL"},
350833ada14aSBard Liao 	{"Mono ADC MIX", NULL, "Mono ADC MIXR"},
350933ada14aSBard Liao 
351033ada14aSBard Liao 	{"IF1_1_ADC1 Mux", "STO1 ADC", "Stereo1 ADC MIX"},
351133ada14aSBard Liao 	{"IF1_1_ADC1 Mux", "IF2_1 DAC", "IF2_1 DAC"},
351233ada14aSBard Liao 	{"IF1_1_ADC2 Mux", "STO2 ADC", "Stereo2 ADC MIX"},
351333ada14aSBard Liao 	{"IF1_1_ADC2 Mux", "IF2_2 DAC", "IF2_2 DAC"},
351433ada14aSBard Liao 	{"IF1_1_ADC3 Mux", "MONO ADC", "Mono ADC MIX"},
351533ada14aSBard Liao 	{"IF1_1_ADC3 Mux", "IF3 DAC", "IF3 DAC"},
351633ada14aSBard Liao 	{"IF1_1_ADC4", NULL, "DAC1 MIX"},
351733ada14aSBard Liao 
351833ada14aSBard Liao 	{"IF1_2_ADC1 Mux", "STO1 ADC", "Stereo1 ADC MIX"},
351933ada14aSBard Liao 	{"IF1_2_ADC1 Mux", "IF1 DAC", "IF1 DAC1"},
352033ada14aSBard Liao 	{"IF1_2_ADC2 Mux", "STO2 ADC", "Stereo2 ADC MIX"},
352133ada14aSBard Liao 	{"IF1_2_ADC2 Mux", "IF2_1 DAC", "IF2_1 DAC"},
352233ada14aSBard Liao 	{"IF1_2_ADC3 Mux", "MONO ADC", "Mono ADC MIX"},
352333ada14aSBard Liao 	{"IF1_2_ADC3 Mux", "IF2_2 DAC", "IF2_2 DAC"},
352433ada14aSBard Liao 	{"IF1_2_ADC4 Mux", "DAC1", "DAC1 MIX"},
352533ada14aSBard Liao 	{"IF1_2_ADC4 Mux", "IF3 DAC", "IF3 DAC"},
352633ada14aSBard Liao 
352733ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "1234", "IF1_1_ADC1 Mux"},
352833ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "1243", "IF1_1_ADC1 Mux"},
352933ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "1324", "IF1_1_ADC1 Mux"},
353033ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "1342", "IF1_1_ADC1 Mux"},
353133ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "1432", "IF1_1_ADC1 Mux"},
353233ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "1423", "IF1_1_ADC1 Mux"},
353333ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "2134", "IF1_1_ADC2 Mux"},
353433ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "2143", "IF1_1_ADC2 Mux"},
353533ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "2314", "IF1_1_ADC2 Mux"},
353633ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "2341", "IF1_1_ADC2 Mux"},
353733ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "2431", "IF1_1_ADC2 Mux"},
353833ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "2413", "IF1_1_ADC2 Mux"},
353933ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "3124", "IF1_1_ADC3 Mux"},
354033ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "3142", "IF1_1_ADC3 Mux"},
354133ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "3214", "IF1_1_ADC3 Mux"},
354233ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "3241", "IF1_1_ADC3 Mux"},
354333ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "3412", "IF1_1_ADC3 Mux"},
354433ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "3421", "IF1_1_ADC3 Mux"},
354533ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "4123", "IF1_1_ADC4"},
354633ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "4132", "IF1_1_ADC4"},
354733ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "4213", "IF1_1_ADC4"},
354833ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "4231", "IF1_1_ADC4"},
354933ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "4312", "IF1_1_ADC4"},
355033ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", "4321", "IF1_1_ADC4"},
355133ada14aSBard Liao 	{"TDM1 slot 01 Data Mux", NULL, "I2S1_1"},
355233ada14aSBard Liao 
355333ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "1234", "IF1_1_ADC2 Mux"},
355433ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "1243", "IF1_1_ADC2 Mux"},
355533ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "1324", "IF1_1_ADC3 Mux"},
355633ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "1342", "IF1_1_ADC3 Mux"},
355733ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "1432", "IF1_1_ADC4"},
355833ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "1423", "IF1_1_ADC4"},
355933ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "2134", "IF1_1_ADC1 Mux"},
356033ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "2143", "IF1_1_ADC1 Mux"},
356133ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "2314", "IF1_1_ADC3 Mux"},
356233ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "2341", "IF1_1_ADC3 Mux"},
356333ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "2431", "IF1_1_ADC4"},
356433ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "2413", "IF1_1_ADC4"},
356533ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "3124", "IF1_1_ADC1 Mux"},
356633ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "3142", "IF1_1_ADC1 Mux"},
356733ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "3214", "IF1_1_ADC2 Mux"},
356833ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "3241", "IF1_1_ADC2 Mux"},
356933ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "3412", "IF1_1_ADC4"},
357033ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "3421", "IF1_1_ADC4"},
357133ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "4123", "IF1_1_ADC1 Mux"},
357233ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "4132", "IF1_1_ADC1 Mux"},
357333ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "4213", "IF1_1_ADC2 Mux"},
357433ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "4231", "IF1_1_ADC2 Mux"},
357533ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "4312", "IF1_1_ADC3 Mux"},
357633ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", "4321", "IF1_1_ADC3 Mux"},
357733ada14aSBard Liao 	{"TDM1 slot 23 Data Mux", NULL, "I2S1_1"},
357833ada14aSBard Liao 
357933ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "1234", "IF1_1_ADC3 Mux"},
358033ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "1243", "IF1_1_ADC4"},
358133ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "1324", "IF1_1_ADC2 Mux"},
358233ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "1342", "IF1_1_ADC4"},
358333ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "1432", "IF1_1_ADC3 Mux"},
358433ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "1423", "IF1_1_ADC2 Mux"},
358533ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "2134", "IF1_1_ADC3 Mux"},
358633ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "2143", "IF1_1_ADC4"},
358733ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "2314", "IF1_1_ADC1 Mux"},
358833ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "2341", "IF1_1_ADC4"},
358933ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "2431", "IF1_1_ADC3 Mux"},
359033ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "2413", "IF1_1_ADC1 Mux"},
359133ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "3124", "IF1_1_ADC2 Mux"},
359233ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "3142", "IF1_1_ADC4"},
359333ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "3214", "IF1_1_ADC1 Mux"},
359433ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "3241", "IF1_1_ADC4"},
359533ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "3412", "IF1_1_ADC1 Mux"},
359633ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "3421", "IF1_1_ADC2 Mux"},
359733ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "4123", "IF1_1_ADC2 Mux"},
359833ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "4132", "IF1_1_ADC3 Mux"},
359933ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "4213", "IF1_1_ADC1 Mux"},
360033ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "4231", "IF1_1_ADC3 Mux"},
360133ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "4312", "IF1_1_ADC1 Mux"},
360233ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", "4321", "IF1_1_ADC2 Mux"},
360333ada14aSBard Liao 	{"TDM1 slot 45 Data Mux", NULL, "I2S1_1"},
360433ada14aSBard Liao 
360533ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "1234", "IF1_1_ADC4"},
360633ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "1243", "IF1_1_ADC3 Mux"},
360733ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "1324", "IF1_1_ADC4"},
360833ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "1342", "IF1_1_ADC2 Mux"},
360933ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "1432", "IF1_1_ADC2 Mux"},
361033ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "1423", "IF1_1_ADC3 Mux"},
361133ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "2134", "IF1_1_ADC4"},
361233ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "2143", "IF1_1_ADC3 Mux"},
361333ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "2314", "IF1_1_ADC4"},
361433ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "2341", "IF1_1_ADC1 Mux"},
361533ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "2431", "IF1_1_ADC1 Mux"},
361633ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "2413", "IF1_1_ADC3 Mux"},
361733ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "3124", "IF1_1_ADC4"},
361833ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "3142", "IF1_1_ADC2 Mux"},
361933ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "3214", "IF1_1_ADC4"},
362033ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "3241", "IF1_1_ADC1 Mux"},
362133ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "3412", "IF1_1_ADC2 Mux"},
362233ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "3421", "IF1_1_ADC1 Mux"},
362333ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "4123", "IF1_1_ADC3 Mux"},
362433ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "4132", "IF1_1_ADC2 Mux"},
362533ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "4213", "IF1_1_ADC3 Mux"},
362633ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "4231", "IF1_1_ADC1 Mux"},
362733ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "4312", "IF1_1_ADC2 Mux"},
362833ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", "4321", "IF1_1_ADC1 Mux"},
362933ada14aSBard Liao 	{"TDM1 slot 67 Data Mux", NULL, "I2S1_1"},
363033ada14aSBard Liao 
363133ada14aSBard Liao 
363233ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "1234", "IF1_2_ADC1 Mux"},
363333ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "1243", "IF1_2_ADC1 Mux"},
363433ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "1324", "IF1_2_ADC1 Mux"},
363533ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "1342", "IF1_2_ADC1 Mux"},
363633ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "1432", "IF1_2_ADC1 Mux"},
363733ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "1423", "IF1_2_ADC1 Mux"},
363833ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "2134", "IF1_2_ADC2 Mux"},
363933ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "2143", "IF1_2_ADC2 Mux"},
364033ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "2314", "IF1_2_ADC2 Mux"},
364133ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "2341", "IF1_2_ADC2 Mux"},
364233ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "2431", "IF1_2_ADC2 Mux"},
364333ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "2413", "IF1_2_ADC2 Mux"},
364433ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "3124", "IF1_2_ADC3 Mux"},
364533ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "3142", "IF1_2_ADC3 Mux"},
364633ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "3214", "IF1_2_ADC3 Mux"},
364733ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "3241", "IF1_2_ADC3 Mux"},
364833ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "3412", "IF1_2_ADC3 Mux"},
364933ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "3421", "IF1_2_ADC3 Mux"},
365033ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "4123", "IF1_2_ADC4 Mux"},
365133ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "4132", "IF1_2_ADC4 Mux"},
365233ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "4213", "IF1_2_ADC4 Mux"},
365333ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "4231", "IF1_2_ADC4 Mux"},
365433ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "4312", "IF1_2_ADC4 Mux"},
365533ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", "4321", "IF1_2_ADC4 Mux"},
365633ada14aSBard Liao 	{"TDM2 slot 01 Data Mux", NULL, "I2S1_2"},
365733ada14aSBard Liao 
365833ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "1234", "IF1_2_ADC2 Mux"},
365933ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "1243", "IF1_2_ADC2 Mux"},
366033ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "1324", "IF1_2_ADC3 Mux"},
366133ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "1342", "IF1_2_ADC3 Mux"},
366233ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "1432", "IF1_2_ADC4 Mux"},
366333ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "1423", "IF1_2_ADC4 Mux"},
366433ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "2134", "IF1_2_ADC1 Mux"},
366533ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "2143", "IF1_2_ADC1 Mux"},
366633ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "2314", "IF1_2_ADC3 Mux"},
366733ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "2341", "IF1_2_ADC3 Mux"},
366833ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "2431", "IF1_2_ADC4 Mux"},
366933ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "2413", "IF1_2_ADC4 Mux"},
367033ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "3124", "IF1_2_ADC1 Mux"},
367133ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "3142", "IF1_2_ADC1 Mux"},
367233ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "3214", "IF1_2_ADC2 Mux"},
367333ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "3241", "IF1_2_ADC2 Mux"},
367433ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "3412", "IF1_2_ADC4 Mux"},
367533ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "3421", "IF1_2_ADC4 Mux"},
367633ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "4123", "IF1_2_ADC1 Mux"},
367733ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "4132", "IF1_2_ADC1 Mux"},
367833ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "4213", "IF1_2_ADC2 Mux"},
367933ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "4231", "IF1_2_ADC2 Mux"},
368033ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "4312", "IF1_2_ADC3 Mux"},
368133ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", "4321", "IF1_2_ADC3 Mux"},
368233ada14aSBard Liao 	{"TDM2 slot 23 Data Mux", NULL, "I2S1_2"},
368333ada14aSBard Liao 
368433ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "1234", "IF1_2_ADC3 Mux"},
368533ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "1243", "IF1_2_ADC4 Mux"},
368633ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "1324", "IF1_2_ADC2 Mux"},
368733ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "1342", "IF1_2_ADC4 Mux"},
368833ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "1432", "IF1_2_ADC3 Mux"},
368933ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "1423", "IF1_2_ADC2 Mux"},
369033ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "2134", "IF1_2_ADC3 Mux"},
369133ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "2143", "IF1_2_ADC4 Mux"},
369233ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "2314", "IF1_2_ADC1 Mux"},
369333ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "2341", "IF1_2_ADC4 Mux"},
369433ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "2431", "IF1_2_ADC3 Mux"},
369533ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "2413", "IF1_2_ADC1 Mux"},
369633ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "3124", "IF1_2_ADC2 Mux"},
369733ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "3142", "IF1_2_ADC4 Mux"},
369833ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "3214", "IF1_2_ADC1 Mux"},
369933ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "3241", "IF1_2_ADC4 Mux"},
370033ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "3412", "IF1_2_ADC1 Mux"},
370133ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "3421", "IF1_2_ADC2 Mux"},
370233ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "4123", "IF1_2_ADC2 Mux"},
370333ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "4132", "IF1_2_ADC3 Mux"},
370433ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "4213", "IF1_2_ADC1 Mux"},
370533ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "4231", "IF1_2_ADC3 Mux"},
370633ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "4312", "IF1_2_ADC1 Mux"},
370733ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", "4321", "IF1_2_ADC2 Mux"},
370833ada14aSBard Liao 	{"TDM2 slot 45 Data Mux", NULL, "I2S1_2"},
370933ada14aSBard Liao 
371033ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "1234", "IF1_2_ADC4 Mux"},
371133ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "1243", "IF1_2_ADC3 Mux"},
371233ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "1324", "IF1_2_ADC4 Mux"},
371333ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "1342", "IF1_2_ADC2 Mux"},
371433ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "1432", "IF1_2_ADC2 Mux"},
371533ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "1423", "IF1_2_ADC3 Mux"},
371633ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "2134", "IF1_2_ADC4 Mux"},
371733ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "2143", "IF1_2_ADC3 Mux"},
371833ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "2314", "IF1_2_ADC4 Mux"},
371933ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "2341", "IF1_2_ADC1 Mux"},
372033ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "2431", "IF1_2_ADC1 Mux"},
372133ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "2413", "IF1_2_ADC3 Mux"},
372233ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "3124", "IF1_2_ADC4 Mux"},
372333ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "3142", "IF1_2_ADC2 Mux"},
372433ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "3214", "IF1_2_ADC4 Mux"},
372533ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "3241", "IF1_2_ADC1 Mux"},
372633ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "3412", "IF1_2_ADC2 Mux"},
372733ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "3421", "IF1_2_ADC1 Mux"},
372833ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "4123", "IF1_2_ADC3 Mux"},
372933ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "4132", "IF1_2_ADC2 Mux"},
373033ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "4213", "IF1_2_ADC3 Mux"},
373133ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "4231", "IF1_2_ADC1 Mux"},
373233ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "4312", "IF1_2_ADC2 Mux"},
373333ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", "4321", "IF1_2_ADC1 Mux"},
373433ada14aSBard Liao 	{"TDM2 slot 67 Data Mux", NULL, "I2S1_2"},
373533ada14aSBard Liao 
373633ada14aSBard Liao 	{"IF1_1 0 ADC Swap Mux", "L/R", "TDM1 slot 01 Data Mux"},
373733ada14aSBard Liao 	{"IF1_1 0 ADC Swap Mux", "L/L", "TDM1 slot 01 Data Mux"},
373833ada14aSBard Liao 	{"IF1_1 1 ADC Swap Mux", "R/L", "TDM1 slot 01 Data Mux"},
373933ada14aSBard Liao 	{"IF1_1 1 ADC Swap Mux", "R/R", "TDM1 slot 01 Data Mux"},
374033ada14aSBard Liao 	{"IF1_1 2 ADC Swap Mux", "L/R", "TDM1 slot 23 Data Mux"},
374133ada14aSBard Liao 	{"IF1_1 2 ADC Swap Mux", "R/L", "TDM1 slot 23 Data Mux"},
374233ada14aSBard Liao 	{"IF1_1 3 ADC Swap Mux", "L/L", "TDM1 slot 23 Data Mux"},
374333ada14aSBard Liao 	{"IF1_1 3 ADC Swap Mux", "R/R", "TDM1 slot 23 Data Mux"},
374433ada14aSBard Liao 	{"IF1_1 4 ADC Swap Mux", "L/R", "TDM1 slot 45 Data Mux"},
374533ada14aSBard Liao 	{"IF1_1 4 ADC Swap Mux", "R/L", "TDM1 slot 45 Data Mux"},
374633ada14aSBard Liao 	{"IF1_1 5 ADC Swap Mux", "L/L", "TDM1 slot 45 Data Mux"},
374733ada14aSBard Liao 	{"IF1_1 5 ADC Swap Mux", "R/R", "TDM1 slot 45 Data Mux"},
374833ada14aSBard Liao 	{"IF1_1 6 ADC Swap Mux", "L/R", "TDM1 slot 67 Data Mux"},
374933ada14aSBard Liao 	{"IF1_1 6 ADC Swap Mux", "R/L", "TDM1 slot 67 Data Mux"},
375033ada14aSBard Liao 	{"IF1_1 7 ADC Swap Mux", "L/L", "TDM1 slot 67 Data Mux"},
375133ada14aSBard Liao 	{"IF1_1 7 ADC Swap Mux", "R/R", "TDM1 slot 67 Data Mux"},
375233ada14aSBard Liao 	{"IF1_2 0 ADC Swap Mux", "L/R", "TDM2 slot 01 Data Mux"},
375333ada14aSBard Liao 	{"IF1_2 0 ADC Swap Mux", "R/L", "TDM2 slot 01 Data Mux"},
375433ada14aSBard Liao 	{"IF1_2 1 ADC Swap Mux", "L/L", "TDM2 slot 01 Data Mux"},
375533ada14aSBard Liao 	{"IF1_2 1 ADC Swap Mux", "R/R", "TDM2 slot 01 Data Mux"},
375633ada14aSBard Liao 	{"IF1_2 2 ADC Swap Mux", "L/R", "TDM2 slot 23 Data Mux"},
375733ada14aSBard Liao 	{"IF1_2 2 ADC Swap Mux", "R/L", "TDM2 slot 23 Data Mux"},
375833ada14aSBard Liao 	{"IF1_2 3 ADC Swap Mux", "L/L", "TDM2 slot 23 Data Mux"},
375933ada14aSBard Liao 	{"IF1_2 3 ADC Swap Mux", "R/R", "TDM2 slot 23 Data Mux"},
376033ada14aSBard Liao 	{"IF1_2 4 ADC Swap Mux", "L/R", "TDM2 slot 45 Data Mux"},
376133ada14aSBard Liao 	{"IF1_2 4 ADC Swap Mux", "R/L", "TDM2 slot 45 Data Mux"},
376233ada14aSBard Liao 	{"IF1_2 5 ADC Swap Mux", "L/L", "TDM2 slot 45 Data Mux"},
376333ada14aSBard Liao 	{"IF1_2 5 ADC Swap Mux", "R/R", "TDM2 slot 45 Data Mux"},
376433ada14aSBard Liao 	{"IF1_2 6 ADC Swap Mux", "L/R", "TDM2 slot 67 Data Mux"},
376533ada14aSBard Liao 	{"IF1_2 6 ADC Swap Mux", "R/L", "TDM2 slot 67 Data Mux"},
376633ada14aSBard Liao 	{"IF1_2 7 ADC Swap Mux", "L/L", "TDM2 slot 67 Data Mux"},
376733ada14aSBard Liao 	{"IF1_2 7 ADC Swap Mux", "R/R", "TDM2 slot 67 Data Mux"},
376833ada14aSBard Liao 
376933ada14aSBard Liao 	{"IF2_1 ADC Mux", "STO1 ADC", "Stereo1 ADC MIX"},
377033ada14aSBard Liao 	{"IF2_1 ADC Mux", "STO2 ADC", "Stereo2 ADC MIX"},
377133ada14aSBard Liao 	{"IF2_1 ADC Mux", "MONO ADC", "Mono ADC MIX"},
377233ada14aSBard Liao 	{"IF2_1 ADC Mux", "IF1 DAC1", "IF1 DAC1"},
377333ada14aSBard Liao 	{"IF2_1 ADC Mux", "IF1 DAC2", "IF1 DAC2"},
377433ada14aSBard Liao 	{"IF2_1 ADC Mux", "IF2_2 DAC", "IF2_2 DAC"},
377533ada14aSBard Liao 	{"IF2_1 ADC Mux", "IF3 DAC", "IF3 DAC"},
377633ada14aSBard Liao 	{"IF2_1 ADC Mux", "DAC1 MIX", "DAC1 MIX"},
377733ada14aSBard Liao 	{"IF2_1 ADC", NULL, "IF2_1 ADC Mux"},
377833ada14aSBard Liao 	{"IF2_1 ADC", NULL, "I2S2_1"},
377933ada14aSBard Liao 
378033ada14aSBard Liao 	{"IF2_2 ADC Mux", "STO1 ADC", "Stereo1 ADC MIX"},
378133ada14aSBard Liao 	{"IF2_2 ADC Mux", "STO2 ADC", "Stereo2 ADC MIX"},
378233ada14aSBard Liao 	{"IF2_2 ADC Mux", "MONO ADC", "Mono ADC MIX"},
378333ada14aSBard Liao 	{"IF2_2 ADC Mux", "IF1 DAC1", "IF1 DAC1"},
378433ada14aSBard Liao 	{"IF2_2 ADC Mux", "IF1 DAC2", "IF1 DAC2"},
378533ada14aSBard Liao 	{"IF2_2 ADC Mux", "IF2_1 DAC", "IF2_1 DAC"},
378633ada14aSBard Liao 	{"IF2_2 ADC Mux", "IF3 DAC", "IF3 DAC"},
378733ada14aSBard Liao 	{"IF2_2 ADC Mux", "DAC1 MIX", "DAC1 MIX"},
378833ada14aSBard Liao 	{"IF2_2 ADC", NULL, "IF2_2 ADC Mux"},
378933ada14aSBard Liao 	{"IF2_2 ADC", NULL, "I2S2_2"},
379033ada14aSBard Liao 
379133ada14aSBard Liao 	{"IF3 ADC Mux", "STO1 ADC", "Stereo1 ADC MIX"},
379233ada14aSBard Liao 	{"IF3 ADC Mux", "STO2 ADC", "Stereo2 ADC MIX"},
379333ada14aSBard Liao 	{"IF3 ADC Mux", "MONO ADC", "Mono ADC MIX"},
379433ada14aSBard Liao 	{"IF3 ADC Mux", "IF1 DAC1", "IF1 DAC1"},
379533ada14aSBard Liao 	{"IF3 ADC Mux", "IF1 DAC2", "IF1 DAC2"},
379633ada14aSBard Liao 	{"IF3 ADC Mux", "IF2_1 DAC", "IF2_1 DAC"},
379733ada14aSBard Liao 	{"IF3 ADC Mux", "IF2_2 DAC", "IF2_2 DAC"},
379833ada14aSBard Liao 	{"IF3 ADC Mux", "DAC1 MIX", "DAC1 MIX"},
379933ada14aSBard Liao 	{"IF3 ADC", NULL, "IF3 ADC Mux"},
380033ada14aSBard Liao 	{"IF3 ADC", NULL, "I2S3"},
380133ada14aSBard Liao 
380233ada14aSBard Liao 	{"AIF1_1TX slot 0", NULL, "IF1_1 0 ADC Swap Mux"},
380333ada14aSBard Liao 	{"AIF1_1TX slot 1", NULL, "IF1_1 1 ADC Swap Mux"},
380433ada14aSBard Liao 	{"AIF1_1TX slot 2", NULL, "IF1_1 2 ADC Swap Mux"},
380533ada14aSBard Liao 	{"AIF1_1TX slot 3", NULL, "IF1_1 3 ADC Swap Mux"},
380633ada14aSBard Liao 	{"AIF1_1TX slot 4", NULL, "IF1_1 4 ADC Swap Mux"},
380733ada14aSBard Liao 	{"AIF1_1TX slot 5", NULL, "IF1_1 5 ADC Swap Mux"},
380833ada14aSBard Liao 	{"AIF1_1TX slot 6", NULL, "IF1_1 6 ADC Swap Mux"},
380933ada14aSBard Liao 	{"AIF1_1TX slot 7", NULL, "IF1_1 7 ADC Swap Mux"},
381033ada14aSBard Liao 	{"AIF1_2TX slot 0", NULL, "IF1_2 0 ADC Swap Mux"},
381133ada14aSBard Liao 	{"AIF1_2TX slot 1", NULL, "IF1_2 1 ADC Swap Mux"},
381233ada14aSBard Liao 	{"AIF1_2TX slot 2", NULL, "IF1_2 2 ADC Swap Mux"},
381333ada14aSBard Liao 	{"AIF1_2TX slot 3", NULL, "IF1_2 3 ADC Swap Mux"},
381433ada14aSBard Liao 	{"AIF1_2TX slot 4", NULL, "IF1_2 4 ADC Swap Mux"},
381533ada14aSBard Liao 	{"AIF1_2TX slot 5", NULL, "IF1_2 5 ADC Swap Mux"},
381633ada14aSBard Liao 	{"AIF1_2TX slot 6", NULL, "IF1_2 6 ADC Swap Mux"},
381733ada14aSBard Liao 	{"AIF1_2TX slot 7", NULL, "IF1_2 7 ADC Swap Mux"},
381833ada14aSBard Liao 	{"IF2_1 ADC Swap Mux", "L/R", "IF2_1 ADC"},
381933ada14aSBard Liao 	{"IF2_1 ADC Swap Mux", "R/L", "IF2_1 ADC"},
382033ada14aSBard Liao 	{"IF2_1 ADC Swap Mux", "L/L", "IF2_1 ADC"},
382133ada14aSBard Liao 	{"IF2_1 ADC Swap Mux", "R/R", "IF2_1 ADC"},
382233ada14aSBard Liao 	{"AIF2_1TX", NULL, "IF2_1 ADC Swap Mux"},
382333ada14aSBard Liao 	{"IF2_2 ADC Swap Mux", "L/R", "IF2_2 ADC"},
382433ada14aSBard Liao 	{"IF2_2 ADC Swap Mux", "R/L", "IF2_2 ADC"},
382533ada14aSBard Liao 	{"IF2_2 ADC Swap Mux", "L/L", "IF2_2 ADC"},
382633ada14aSBard Liao 	{"IF2_2 ADC Swap Mux", "R/R", "IF2_2 ADC"},
382733ada14aSBard Liao 	{"AIF2_2TX", NULL, "IF2_2 ADC Swap Mux"},
382833ada14aSBard Liao 	{"IF3 ADC Swap Mux", "L/R", "IF3 ADC"},
382933ada14aSBard Liao 	{"IF3 ADC Swap Mux", "R/L", "IF3 ADC"},
383033ada14aSBard Liao 	{"IF3 ADC Swap Mux", "L/L", "IF3 ADC"},
383133ada14aSBard Liao 	{"IF3 ADC Swap Mux", "R/R", "IF3 ADC"},
383233ada14aSBard Liao 	{"AIF3TX", NULL, "IF3 ADC Swap Mux"},
383333ada14aSBard Liao 
383433ada14aSBard Liao 	{"IF1 DAC1", NULL, "AIF1RX"},
383533ada14aSBard Liao 	{"IF1 DAC2", NULL, "AIF1RX"},
383633ada14aSBard Liao 	{"IF1 DAC3", NULL, "AIF1RX"},
383733ada14aSBard Liao 	{"IF2_1 DAC Swap Mux", "L/R", "AIF2_1RX"},
383833ada14aSBard Liao 	{"IF2_1 DAC Swap Mux", "R/L", "AIF2_1RX"},
383933ada14aSBard Liao 	{"IF2_1 DAC Swap Mux", "L/L", "AIF2_1RX"},
384033ada14aSBard Liao 	{"IF2_1 DAC Swap Mux", "R/R", "AIF2_1RX"},
384133ada14aSBard Liao 	{"IF2_2 DAC Swap Mux", "L/R", "AIF2_2RX"},
384233ada14aSBard Liao 	{"IF2_2 DAC Swap Mux", "R/L", "AIF2_2RX"},
384333ada14aSBard Liao 	{"IF2_2 DAC Swap Mux", "L/L", "AIF2_2RX"},
384433ada14aSBard Liao 	{"IF2_2 DAC Swap Mux", "R/R", "AIF2_2RX"},
384533ada14aSBard Liao 	{"IF2_1 DAC", NULL, "IF2_1 DAC Swap Mux"},
384633ada14aSBard Liao 	{"IF2_2 DAC", NULL, "IF2_2 DAC Swap Mux"},
384733ada14aSBard Liao 	{"IF3 DAC Swap Mux", "L/R", "AIF3RX"},
384833ada14aSBard Liao 	{"IF3 DAC Swap Mux", "R/L", "AIF3RX"},
384933ada14aSBard Liao 	{"IF3 DAC Swap Mux", "L/L", "AIF3RX"},
385033ada14aSBard Liao 	{"IF3 DAC Swap Mux", "R/R", "AIF3RX"},
385133ada14aSBard Liao 	{"IF3 DAC", NULL, "IF3 DAC Swap Mux"},
385233ada14aSBard Liao 
385333ada14aSBard Liao 	{"IF1 DAC1", NULL, "I2S1_1"},
385433ada14aSBard Liao 	{"IF1 DAC2", NULL, "I2S1_1"},
385533ada14aSBard Liao 	{"IF1 DAC3", NULL, "I2S1_1"},
385633ada14aSBard Liao 	{"IF2_1 DAC", NULL, "I2S2_1"},
385733ada14aSBard Liao 	{"IF2_2 DAC", NULL, "I2S2_2"},
385833ada14aSBard Liao 	{"IF3 DAC", NULL, "I2S3"},
385933ada14aSBard Liao 
386033ada14aSBard Liao 	{"IF1 DAC1 L", NULL, "IF1 DAC1"},
386133ada14aSBard Liao 	{"IF1 DAC1 R", NULL, "IF1 DAC1"},
386233ada14aSBard Liao 	{"IF1 DAC2 L", NULL, "IF1 DAC2"},
386333ada14aSBard Liao 	{"IF1 DAC2 R", NULL, "IF1 DAC2"},
386433ada14aSBard Liao 	{"IF1 DAC3 L", NULL, "IF1 DAC3"},
386533ada14aSBard Liao 	{"IF1 DAC3 R", NULL, "IF1 DAC3"},
386633ada14aSBard Liao 	{"IF2_1 DAC L", NULL, "IF2_1 DAC"},
386733ada14aSBard Liao 	{"IF2_1 DAC R", NULL, "IF2_1 DAC"},
386833ada14aSBard Liao 	{"IF2_2 DAC L", NULL, "IF2_2 DAC"},
386933ada14aSBard Liao 	{"IF2_2 DAC R", NULL, "IF2_2 DAC"},
387033ada14aSBard Liao 	{"IF3 DAC L", NULL, "IF3 DAC"},
387133ada14aSBard Liao 	{"IF3 DAC R", NULL, "IF3 DAC"},
387233ada14aSBard Liao 
387333ada14aSBard Liao 	{"DAC L1 Mux", "IF1 DAC1", "IF1 DAC1 L"},
387433ada14aSBard Liao 	{"DAC L1 Mux", "IF2_1 DAC", "IF2_1 DAC L"},
387533ada14aSBard Liao 	{"DAC L1 Mux", "IF2_2 DAC", "IF2_2 DAC L"},
387633ada14aSBard Liao 	{"DAC L1 Mux", "IF3 DAC", "IF3 DAC L"},
387733ada14aSBard Liao 	{"DAC L1 Mux", NULL, "DAC Stereo1 Filter"},
387833ada14aSBard Liao 
387933ada14aSBard Liao 	{"DAC R1 Mux", "IF1 DAC1", "IF1 DAC1 R"},
388033ada14aSBard Liao 	{"DAC R1 Mux", "IF2_1 DAC", "IF2_1 DAC R"},
388133ada14aSBard Liao 	{"DAC R1 Mux", "IF2_2 DAC", "IF2_2 DAC R"},
388233ada14aSBard Liao 	{"DAC R1 Mux", "IF3 DAC", "IF3 DAC R"},
388333ada14aSBard Liao 	{"DAC R1 Mux", NULL, "DAC Stereo1 Filter"},
388433ada14aSBard Liao 
388533ada14aSBard Liao 	{"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},
388633ada14aSBard Liao 	{"DAC1 MIXL", "DAC1 Switch", "DAC L1 Mux"},
388733ada14aSBard Liao 	{"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},
388833ada14aSBard Liao 	{"DAC1 MIXR", "DAC1 Switch", "DAC R1 Mux"},
388933ada14aSBard Liao 
389033ada14aSBard Liao 	{"DAC1 MIX", NULL, "DAC1 MIXL"},
389133ada14aSBard Liao 	{"DAC1 MIX", NULL, "DAC1 MIXR"},
389233ada14aSBard Liao 
389333ada14aSBard Liao 	{"DAC L2 Mux", "IF1 DAC2", "IF1 DAC2 L"},
389433ada14aSBard Liao 	{"DAC L2 Mux", "IF2_1 DAC", "IF2_1 DAC L"},
389533ada14aSBard Liao 	{"DAC L2 Mux", "IF2_2 DAC", "IF2_2 DAC L"},
389633ada14aSBard Liao 	{"DAC L2 Mux", "IF3 DAC", "IF3 DAC L"},
389733ada14aSBard Liao 	{"DAC L2 Mux", "Mono ADC MIX", "Mono ADC MIXL"},
389833ada14aSBard Liao 	{"DAC L2 Mux", NULL, "DAC Mono Left Filter"},
389933ada14aSBard Liao 
390033ada14aSBard Liao 	{"DAC R2 Mux", "IF1 DAC2", "IF1 DAC2 R"},
390133ada14aSBard Liao 	{"DAC R2 Mux", "IF2_1 DAC", "IF2_1 DAC R"},
390233ada14aSBard Liao 	{"DAC R2 Mux", "IF2_2 DAC", "IF2_2 DAC R"},
390333ada14aSBard Liao 	{"DAC R2 Mux", "IF3 DAC", "IF3 DAC R"},
390433ada14aSBard Liao 	{"DAC R2 Mux", "Mono ADC MIX", "Mono ADC MIXR"},
390533ada14aSBard Liao 	{"DAC R2 Mux", NULL, "DAC Mono Right Filter"},
390633ada14aSBard Liao 
390733ada14aSBard Liao 	{"DAC L3 Mux", "IF1 DAC2", "IF1 DAC2 L"},
390833ada14aSBard Liao 	{"DAC L3 Mux", "IF2_1 DAC", "IF2_1 DAC L"},
390933ada14aSBard Liao 	{"DAC L3 Mux", "IF2_2 DAC", "IF2_2 DAC L"},
391033ada14aSBard Liao 	{"DAC L3 Mux", "IF3 DAC", "IF3 DAC L"},
391133ada14aSBard Liao 	{"DAC L3 Mux", "STO2 ADC MIX", "Stereo2 ADC MIXL"},
391233ada14aSBard Liao 	{"DAC L3 Mux", NULL, "DAC Stereo2 Filter"},
391333ada14aSBard Liao 
391433ada14aSBard Liao 	{"DAC R3 Mux", "IF1 DAC2", "IF1 DAC2 R"},
391533ada14aSBard Liao 	{"DAC R3 Mux", "IF2_1 DAC", "IF2_1 DAC R"},
391633ada14aSBard Liao 	{"DAC R3 Mux", "IF2_2 DAC", "IF2_2 DAC R"},
391733ada14aSBard Liao 	{"DAC R3 Mux", "IF3 DAC", "IF3 DAC R"},
391833ada14aSBard Liao 	{"DAC R3 Mux", "STO2 ADC MIX", "Stereo2 ADC MIXR"},
391933ada14aSBard Liao 	{"DAC R3 Mux", NULL, "DAC Stereo2 Filter"},
392033ada14aSBard Liao 
392133ada14aSBard Liao 	{"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
392233ada14aSBard Liao 	{"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},
392333ada14aSBard Liao 	{"Stereo1 DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
392433ada14aSBard Liao 	{"Stereo1 DAC MIXL", "DAC R2 Switch", "DAC R2 Mux"},
392533ada14aSBard Liao 
392633ada14aSBard Liao 	{"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
392733ada14aSBard Liao 	{"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},
392833ada14aSBard Liao 	{"Stereo1 DAC MIXR", "DAC L2 Switch", "DAC L2 Mux"},
392933ada14aSBard Liao 	{"Stereo1 DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
393033ada14aSBard Liao 
393133ada14aSBard Liao 	{"Stereo2 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
393233ada14aSBard Liao 	{"Stereo2 DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
393333ada14aSBard Liao 	{"Stereo2 DAC MIXL", "DAC L3 Switch", "DAC L3 Mux"},
393433ada14aSBard Liao 
393533ada14aSBard Liao 	{"Stereo2 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
393633ada14aSBard Liao 	{"Stereo2 DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
393733ada14aSBard Liao 	{"Stereo2 DAC MIXR", "DAC R3 Switch", "DAC R3 Mux"},
393833ada14aSBard Liao 
393933ada14aSBard Liao 	{"Mono DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
394033ada14aSBard Liao 	{"Mono DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},
394133ada14aSBard Liao 	{"Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
394233ada14aSBard Liao 	{"Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Mux"},
394333ada14aSBard Liao 	{"Mono DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},
394433ada14aSBard Liao 	{"Mono DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
394533ada14aSBard Liao 	{"Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Mux"},
394633ada14aSBard Liao 	{"Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
394733ada14aSBard Liao 
394833ada14aSBard Liao 	{"DAC MIXL", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},
394933ada14aSBard Liao 	{"DAC MIXL", "Stereo2 DAC Mixer", "Stereo2 DAC MIXL"},
395033ada14aSBard Liao 	{"DAC MIXL", "Mono DAC Mixer", "Mono DAC MIXL"},
395133ada14aSBard Liao 	{"DAC MIXR", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},
395233ada14aSBard Liao 	{"DAC MIXR", "Stereo2 DAC Mixer", "Stereo2 DAC MIXR"},
395333ada14aSBard Liao 	{"DAC MIXR", "Mono DAC Mixer", "Mono DAC MIXR"},
395433ada14aSBard Liao 
395533ada14aSBard Liao 	{"DAC L1 Source", "DAC1", "DAC1 MIXL"},
395633ada14aSBard Liao 	{"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},
395733ada14aSBard Liao 	{"DAC L1 Source", "DMIC1", "DMIC L1"},
395833ada14aSBard Liao 	{"DAC R1 Source", "DAC1", "DAC1 MIXR"},
395933ada14aSBard Liao 	{"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},
396033ada14aSBard Liao 	{"DAC R1 Source", "DMIC1", "DMIC R1"},
396133ada14aSBard Liao 
396233ada14aSBard Liao 	{"DAC L2 Source", "DAC2", "DAC L2 Mux"},
396333ada14aSBard Liao 	{"DAC L2 Source", "Mono DAC Mixer", "Mono DAC MIXL"},
396433ada14aSBard Liao 	{"DAC L2 Source", NULL, "DAC L2 Power"},
396533ada14aSBard Liao 	{"DAC R2 Source", "DAC2", "DAC R2 Mux"},
396633ada14aSBard Liao 	{"DAC R2 Source", "Mono DAC Mixer", "Mono DAC MIXR"},
396733ada14aSBard Liao 	{"DAC R2 Source", NULL, "DAC R2 Power"},
396833ada14aSBard Liao 
396933ada14aSBard Liao 	{"DAC L1", NULL, "DAC L1 Source"},
397033ada14aSBard Liao 	{"DAC R1", NULL, "DAC R1 Source"},
397133ada14aSBard Liao 	{"DAC L2", NULL, "DAC L2 Source"},
397233ada14aSBard Liao 	{"DAC R2", NULL, "DAC R2 Source"},
397333ada14aSBard Liao 
397433ada14aSBard Liao 	{"DAC L1", NULL, "DAC 1 Clock"},
397533ada14aSBard Liao 	{"DAC R1", NULL, "DAC 1 Clock"},
397633ada14aSBard Liao 	{"DAC L2", NULL, "DAC 2 Clock"},
397733ada14aSBard Liao 	{"DAC R2", NULL, "DAC 2 Clock"},
397833ada14aSBard Liao 
397933ada14aSBard Liao 	{"MONOVOL MIX", "DAC L2 Switch", "DAC L2"},
398033ada14aSBard Liao 	{"MONOVOL MIX", "RECMIX2L Switch", "RECMIX2L"},
398133ada14aSBard Liao 	{"MONOVOL MIX", "BST1 Switch", "BST1"},
398233ada14aSBard Liao 	{"MONOVOL MIX", "BST2 Switch", "BST2"},
398333ada14aSBard Liao 	{"MONOVOL MIX", "BST3 Switch", "BST3"},
398433ada14aSBard Liao 
398533ada14aSBard Liao 	{"OUT MIXL", "DAC L2 Switch", "DAC L2"},
398633ada14aSBard Liao 	{"OUT MIXL", "INL Switch", "INL VOL"},
398733ada14aSBard Liao 	{"OUT MIXL", "BST1 Switch", "BST1"},
398833ada14aSBard Liao 	{"OUT MIXL", "BST2 Switch", "BST2"},
398933ada14aSBard Liao 	{"OUT MIXL", "BST3 Switch", "BST3"},
399033ada14aSBard Liao 	{"OUT MIXR", "DAC R2 Switch", "DAC R2"},
399133ada14aSBard Liao 	{"OUT MIXR", "INR Switch", "INR VOL"},
399233ada14aSBard Liao 	{"OUT MIXR", "BST2 Switch", "BST2"},
399333ada14aSBard Liao 	{"OUT MIXR", "BST3 Switch", "BST3"},
399433ada14aSBard Liao 	{"OUT MIXR", "BST4 Switch", "BST4"},
399533ada14aSBard Liao 
399633ada14aSBard Liao 	{"MONOVOL", "Switch", "MONOVOL MIX"},
399733ada14aSBard Liao 	{"Mono MIX", "DAC L2 Switch", "DAC L2"},
399833ada14aSBard Liao 	{"Mono MIX", "MONOVOL Switch", "MONOVOL"},
399933ada14aSBard Liao 	{"Mono Amp", NULL, "Mono MIX"},
400033ada14aSBard Liao 	{"Mono Amp", NULL, "Vref2"},
40018f365313SBard Liao 	{"Mono Amp", NULL, "Vref3"},
400233ada14aSBard Liao 	{"Mono Amp", NULL, "CLKDET SYS"},
400333ada14aSBard Liao 	{"Mono Amp", NULL, "CLKDET MONO"},
400433ada14aSBard Liao 	{"Mono Playback", "Switch", "Mono Amp"},
400533ada14aSBard Liao 	{"MONOOUT", NULL, "Mono Playback"},
400633ada14aSBard Liao 
400733ada14aSBard Liao 	{"HP Amp", NULL, "DAC L1"},
400833ada14aSBard Liao 	{"HP Amp", NULL, "DAC R1"},
400933ada14aSBard Liao 	{"HP Amp", NULL, "Charge Pump"},
401033ada14aSBard Liao 	{"HP Amp", NULL, "CLKDET SYS"},
401133ada14aSBard Liao 	{"HP Amp", NULL, "CLKDET HP"},
401233ada14aSBard Liao 	{"HP Amp", NULL, "CBJ Power"},
401333ada14aSBard Liao 	{"HP Amp", NULL, "Vref2"},
401433ada14aSBard Liao 	{"HPO Playback", "Switch", "HP Amp"},
401533ada14aSBard Liao 	{"HPOL", NULL, "HPO Playback"},
401633ada14aSBard Liao 	{"HPOR", NULL, "HPO Playback"},
401733ada14aSBard Liao 
401833ada14aSBard Liao 	{"OUTVOL L", "Switch", "OUT MIXL"},
401933ada14aSBard Liao 	{"OUTVOL R", "Switch", "OUT MIXR"},
402033ada14aSBard Liao 	{"LOUT L MIX", "DAC L2 Switch", "DAC L2"},
402133ada14aSBard Liao 	{"LOUT L MIX", "OUTVOL L Switch", "OUTVOL L"},
402233ada14aSBard Liao 	{"LOUT R MIX", "DAC R2 Switch", "DAC R2"},
402333ada14aSBard Liao 	{"LOUT R MIX", "OUTVOL R Switch", "OUTVOL R"},
402433ada14aSBard Liao 	{"LOUT Amp", NULL, "LOUT L MIX"},
402533ada14aSBard Liao 	{"LOUT Amp", NULL, "LOUT R MIX"},
402633ada14aSBard Liao 	{"LOUT Amp", NULL, "Vref1"},
402733ada14aSBard Liao 	{"LOUT Amp", NULL, "Vref2"},
402833ada14aSBard Liao 	{"LOUT Amp", NULL, "CLKDET SYS"},
402933ada14aSBard Liao 	{"LOUT Amp", NULL, "CLKDET LOUT"},
403033ada14aSBard Liao 	{"LOUT L Playback", "Switch", "LOUT Amp"},
403133ada14aSBard Liao 	{"LOUT R Playback", "Switch", "LOUT Amp"},
403233ada14aSBard Liao 	{"LOUTL", NULL, "LOUT L Playback"},
403333ada14aSBard Liao 	{"LOUTR", NULL, "LOUT R Playback"},
403433ada14aSBard Liao 
403533ada14aSBard Liao 	{"PDM L Mux", "Mono DAC", "Mono DAC MIXL"},
403633ada14aSBard Liao 	{"PDM L Mux", "Stereo1 DAC", "Stereo1 DAC MIXL"},
403733ada14aSBard Liao 	{"PDM L Mux", "Stereo2 DAC", "Stereo2 DAC MIXL"},
403833ada14aSBard Liao 	{"PDM L Mux", NULL, "PDM Power"},
403933ada14aSBard Liao 	{"PDM R Mux", "Mono DAC", "Mono DAC MIXR"},
404033ada14aSBard Liao 	{"PDM R Mux", "Stereo1 DAC", "Stereo1 DAC MIXR"},
404133ada14aSBard Liao 	{"PDM R Mux", "Stereo2 DAC", "Stereo2 DAC MIXR"},
404233ada14aSBard Liao 	{"PDM R Mux", NULL, "PDM Power"},
404333ada14aSBard Liao 	{"PDM L Playback", "Switch", "PDM L Mux"},
404433ada14aSBard Liao 	{"PDM R Playback", "Switch", "PDM R Mux"},
404533ada14aSBard Liao 	{"PDML", NULL, "PDM L Playback"},
404633ada14aSBard Liao 	{"PDMR", NULL, "PDM R Playback"},
404733ada14aSBard Liao };
404833ada14aSBard Liao 
4049948059ddSBard Liao static int rt5665_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
4050948059ddSBard Liao 			unsigned int rx_mask, int slots, int slot_width)
4051948059ddSBard Liao {
4052fab70c27SKuninori Morimoto 	struct snd_soc_component *component = dai->component;
4053948059ddSBard Liao 	unsigned int val = 0;
4054948059ddSBard Liao 
4055948059ddSBard Liao 	if (rx_mask || tx_mask)
4056948059ddSBard Liao 		val |= RT5665_I2S1_MODE_TDM;
4057948059ddSBard Liao 
4058948059ddSBard Liao 	switch (slots) {
4059948059ddSBard Liao 	case 4:
4060948059ddSBard Liao 		val |= RT5665_TDM_IN_CH_4;
4061948059ddSBard Liao 		val |= RT5665_TDM_OUT_CH_4;
4062948059ddSBard Liao 		break;
4063948059ddSBard Liao 	case 6:
4064948059ddSBard Liao 		val |= RT5665_TDM_IN_CH_6;
4065948059ddSBard Liao 		val |= RT5665_TDM_OUT_CH_6;
4066948059ddSBard Liao 		break;
4067948059ddSBard Liao 	case 8:
4068948059ddSBard Liao 		val |= RT5665_TDM_IN_CH_8;
4069948059ddSBard Liao 		val |= RT5665_TDM_OUT_CH_8;
4070948059ddSBard Liao 		break;
4071948059ddSBard Liao 	case 2:
4072948059ddSBard Liao 		break;
4073948059ddSBard Liao 	default:
4074948059ddSBard Liao 		return -EINVAL;
4075948059ddSBard Liao 	}
4076948059ddSBard Liao 
4077948059ddSBard Liao 	switch (slot_width) {
4078948059ddSBard Liao 	case 20:
4079948059ddSBard Liao 		val |= RT5665_TDM_IN_LEN_20;
4080948059ddSBard Liao 		val |= RT5665_TDM_OUT_LEN_20;
4081948059ddSBard Liao 		break;
4082948059ddSBard Liao 	case 24:
4083948059ddSBard Liao 		val |= RT5665_TDM_IN_LEN_24;
4084948059ddSBard Liao 		val |= RT5665_TDM_OUT_LEN_24;
4085948059ddSBard Liao 		break;
4086948059ddSBard Liao 	case 32:
4087948059ddSBard Liao 		val |= RT5665_TDM_IN_LEN_32;
4088948059ddSBard Liao 		val |= RT5665_TDM_OUT_LEN_32;
4089948059ddSBard Liao 		break;
4090948059ddSBard Liao 	case 16:
4091948059ddSBard Liao 		break;
4092948059ddSBard Liao 	default:
4093948059ddSBard Liao 		return -EINVAL;
4094948059ddSBard Liao 	}
4095948059ddSBard Liao 
4096fab70c27SKuninori Morimoto 	snd_soc_component_update_bits(component, RT5665_TDM_CTRL_1,
4097948059ddSBard Liao 		RT5665_I2S1_MODE_MASK | RT5665_TDM_IN_CH_MASK |
4098948059ddSBard Liao 		RT5665_TDM_OUT_CH_MASK | RT5665_TDM_IN_LEN_MASK |
4099948059ddSBard Liao 		RT5665_TDM_OUT_LEN_MASK, val);
4100948059ddSBard Liao 
4101948059ddSBard Liao 	return 0;
4102948059ddSBard Liao }
4103948059ddSBard Liao 
4104948059ddSBard Liao 
410533ada14aSBard Liao static int rt5665_hw_params(struct snd_pcm_substream *substream,
410633ada14aSBard Liao 	struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
410733ada14aSBard Liao {
4108fab70c27SKuninori Morimoto 	struct snd_soc_component *component = dai->component;
4109fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
411017febfa6SBard Liao 	unsigned int val_len = 0, val_clk, reg_clk, mask_clk, val_bits = 0x0100;
411133ada14aSBard Liao 	int pre_div, frame_size;
411233ada14aSBard Liao 
411333ada14aSBard Liao 	rt5665->lrck[dai->id] = params_rate(params);
411433ada14aSBard Liao 	pre_div = rl6231_get_clk_info(rt5665->sysclk, rt5665->lrck[dai->id]);
411533ada14aSBard Liao 	if (pre_div < 0) {
4116fab70c27SKuninori Morimoto 		dev_warn(component->dev, "Force using PLL");
4117fab70c27SKuninori Morimoto 		snd_soc_component_set_pll(component, 0, RT5665_PLL1_S_MCLK,
4118fa05899cSBard Liao 			rt5665->sysclk,	rt5665->lrck[dai->id] * 512);
4119fab70c27SKuninori Morimoto 		snd_soc_component_set_sysclk(component, RT5665_SCLK_S_PLL1, 0,
4120fa05899cSBard Liao 			rt5665->lrck[dai->id] * 512, 0);
4121fa05899cSBard Liao 		pre_div = 1;
412233ada14aSBard Liao 	}
412333ada14aSBard Liao 	frame_size = snd_soc_params_to_frame_size(params);
412433ada14aSBard Liao 	if (frame_size < 0) {
4125fab70c27SKuninori Morimoto 		dev_err(component->dev, "Unsupported frame size: %d\n", frame_size);
412633ada14aSBard Liao 		return -EINVAL;
412733ada14aSBard Liao 	}
412833ada14aSBard Liao 
412933ada14aSBard Liao 	dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n",
413033ada14aSBard Liao 				rt5665->lrck[dai->id], pre_div, dai->id);
413133ada14aSBard Liao 
413233ada14aSBard Liao 	switch (params_width(params)) {
413333ada14aSBard Liao 	case 16:
413433ada14aSBard Liao 		val_bits = 0x0100;
413533ada14aSBard Liao 		break;
413633ada14aSBard Liao 	case 20:
413733ada14aSBard Liao 		val_len |= RT5665_I2S_DL_20;
413833ada14aSBard Liao 		val_bits = 0x1300;
413933ada14aSBard Liao 		break;
414033ada14aSBard Liao 	case 24:
414133ada14aSBard Liao 		val_len |= RT5665_I2S_DL_24;
414233ada14aSBard Liao 		val_bits = 0x2500;
414333ada14aSBard Liao 		break;
414433ada14aSBard Liao 	case 8:
414533ada14aSBard Liao 		val_len |= RT5665_I2S_DL_8;
414633ada14aSBard Liao 		break;
414733ada14aSBard Liao 	default:
414833ada14aSBard Liao 		return -EINVAL;
414933ada14aSBard Liao 	}
415033ada14aSBard Liao 
415133ada14aSBard Liao 	switch (dai->id) {
415233ada14aSBard Liao 	case RT5665_AIF1_1:
415333ada14aSBard Liao 	case RT5665_AIF1_2:
4154948059ddSBard Liao 		if (params_channels(params) > 2)
4155948059ddSBard Liao 			rt5665_set_tdm_slot(dai, 0xf, 0xf,
4156948059ddSBard Liao 				params_channels(params), params_width(params));
415717febfa6SBard Liao 		reg_clk = RT5665_ADDA_CLK_1;
415833ada14aSBard Liao 		mask_clk = RT5665_I2S_PD1_MASK;
415933ada14aSBard Liao 		val_clk = pre_div << RT5665_I2S_PD1_SFT;
4160fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S1_SDP,
416133ada14aSBard Liao 			RT5665_I2S_DL_MASK, val_len);
416233ada14aSBard Liao 		break;
416333ada14aSBard Liao 	case RT5665_AIF2_1:
416433ada14aSBard Liao 	case RT5665_AIF2_2:
416517febfa6SBard Liao 		reg_clk = RT5665_ADDA_CLK_2;
416633ada14aSBard Liao 		mask_clk = RT5665_I2S_PD2_MASK;
416733ada14aSBard Liao 		val_clk = pre_div << RT5665_I2S_PD2_SFT;
4168fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S2_SDP,
416933ada14aSBard Liao 			RT5665_I2S_DL_MASK, val_len);
417033ada14aSBard Liao 		break;
417133ada14aSBard Liao 	case RT5665_AIF3:
417217febfa6SBard Liao 		reg_clk = RT5665_ADDA_CLK_2;
417333ada14aSBard Liao 		mask_clk = RT5665_I2S_PD3_MASK;
417433ada14aSBard Liao 		val_clk = pre_div << RT5665_I2S_PD3_SFT;
4175fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S3_SDP,
417633ada14aSBard Liao 			RT5665_I2S_DL_MASK, val_len);
417733ada14aSBard Liao 		break;
417833ada14aSBard Liao 	default:
4179fab70c27SKuninori Morimoto 		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
418033ada14aSBard Liao 		return -EINVAL;
418133ada14aSBard Liao 	}
418233ada14aSBard Liao 
4183fab70c27SKuninori Morimoto 	snd_soc_component_update_bits(component, reg_clk, mask_clk, val_clk);
4184fab70c27SKuninori Morimoto 	snd_soc_component_update_bits(component, RT5665_STO1_DAC_SIL_DET, 0x3700, val_bits);
418533ada14aSBard Liao 
418633ada14aSBard Liao 	switch (rt5665->lrck[dai->id]) {
418733ada14aSBard Liao 	case 192000:
4188fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_ADDA_CLK_1,
418933ada14aSBard Liao 			RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK,
419033ada14aSBard Liao 			RT5665_DAC_OSR_32 | RT5665_ADC_OSR_32);
419133ada14aSBard Liao 		break;
419233ada14aSBard Liao 	case 96000:
4193fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_ADDA_CLK_1,
419433ada14aSBard Liao 			RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK,
419533ada14aSBard Liao 			RT5665_DAC_OSR_64 | RT5665_ADC_OSR_64);
419633ada14aSBard Liao 		break;
419733ada14aSBard Liao 	default:
4198fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_ADDA_CLK_1,
419933ada14aSBard Liao 			RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK,
420033ada14aSBard Liao 			RT5665_DAC_OSR_128 | RT5665_ADC_OSR_128);
420133ada14aSBard Liao 		break;
420233ada14aSBard Liao 	}
420333ada14aSBard Liao 
420401dfb1ecSBard Liao 	if (rt5665->master[RT5665_AIF2_1] || rt5665->master[RT5665_AIF2_2]) {
4205fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S_M_CLK_CTRL_1,
420601dfb1ecSBard Liao 			RT5665_I2S2_M_PD_MASK, pre_div << RT5665_I2S2_M_PD_SFT);
420701dfb1ecSBard Liao 	}
420801dfb1ecSBard Liao 	if (rt5665->master[RT5665_AIF3]) {
4209fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S_M_CLK_CTRL_1,
421001dfb1ecSBard Liao 			RT5665_I2S3_M_PD_MASK, pre_div << RT5665_I2S3_M_PD_SFT);
421101dfb1ecSBard Liao 	}
421201dfb1ecSBard Liao 
421333ada14aSBard Liao 	return 0;
421433ada14aSBard Liao }
421533ada14aSBard Liao 
421633ada14aSBard Liao static int rt5665_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
421733ada14aSBard Liao {
4218fab70c27SKuninori Morimoto 	struct snd_soc_component *component = dai->component;
4219fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
422033ada14aSBard Liao 	unsigned int reg_val = 0;
422133ada14aSBard Liao 
422233ada14aSBard Liao 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
422333ada14aSBard Liao 	case SND_SOC_DAIFMT_CBM_CFM:
422433ada14aSBard Liao 		rt5665->master[dai->id] = 1;
422533ada14aSBard Liao 		break;
422633ada14aSBard Liao 	case SND_SOC_DAIFMT_CBS_CFS:
422733ada14aSBard Liao 		reg_val |= RT5665_I2S_MS_S;
422833ada14aSBard Liao 		rt5665->master[dai->id] = 0;
422933ada14aSBard Liao 		break;
423033ada14aSBard Liao 	default:
423133ada14aSBard Liao 		return -EINVAL;
423233ada14aSBard Liao 	}
423333ada14aSBard Liao 
423433ada14aSBard Liao 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
423533ada14aSBard Liao 	case SND_SOC_DAIFMT_NB_NF:
423633ada14aSBard Liao 		break;
423733ada14aSBard Liao 	case SND_SOC_DAIFMT_IB_NF:
423833ada14aSBard Liao 		reg_val |= RT5665_I2S_BP_INV;
423933ada14aSBard Liao 		break;
424033ada14aSBard Liao 	default:
424133ada14aSBard Liao 		return -EINVAL;
424233ada14aSBard Liao 	}
424333ada14aSBard Liao 
424433ada14aSBard Liao 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
424533ada14aSBard Liao 	case SND_SOC_DAIFMT_I2S:
424633ada14aSBard Liao 		break;
424733ada14aSBard Liao 	case SND_SOC_DAIFMT_LEFT_J:
424833ada14aSBard Liao 		reg_val |= RT5665_I2S_DF_LEFT;
424933ada14aSBard Liao 		break;
425033ada14aSBard Liao 	case SND_SOC_DAIFMT_DSP_A:
425133ada14aSBard Liao 		reg_val |= RT5665_I2S_DF_PCM_A;
425233ada14aSBard Liao 		break;
425333ada14aSBard Liao 	case SND_SOC_DAIFMT_DSP_B:
425433ada14aSBard Liao 		reg_val |= RT5665_I2S_DF_PCM_B;
425533ada14aSBard Liao 		break;
425633ada14aSBard Liao 	default:
425733ada14aSBard Liao 		return -EINVAL;
425833ada14aSBard Liao 	}
425933ada14aSBard Liao 
426033ada14aSBard Liao 	switch (dai->id) {
426133ada14aSBard Liao 	case RT5665_AIF1_1:
426233ada14aSBard Liao 	case RT5665_AIF1_2:
4263fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S1_SDP,
426433ada14aSBard Liao 			RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK |
426533ada14aSBard Liao 			RT5665_I2S_DF_MASK, reg_val);
426633ada14aSBard Liao 		break;
426733ada14aSBard Liao 	case RT5665_AIF2_1:
426833ada14aSBard Liao 	case RT5665_AIF2_2:
4269fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S2_SDP,
427033ada14aSBard Liao 			RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK |
427133ada14aSBard Liao 			RT5665_I2S_DF_MASK, reg_val);
427233ada14aSBard Liao 		break;
427333ada14aSBard Liao 	case RT5665_AIF3:
4274fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S3_SDP,
427533ada14aSBard Liao 			RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK |
427633ada14aSBard Liao 			RT5665_I2S_DF_MASK, reg_val);
427733ada14aSBard Liao 		break;
427833ada14aSBard Liao 	default:
4279fab70c27SKuninori Morimoto 		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
428033ada14aSBard Liao 		return -EINVAL;
428133ada14aSBard Liao 	}
428233ada14aSBard Liao 	return 0;
428333ada14aSBard Liao }
428433ada14aSBard Liao 
4285fab70c27SKuninori Morimoto static int rt5665_set_component_sysclk(struct snd_soc_component *component, int clk_id,
428628d2ca39SBard Liao 				   int source, unsigned int freq, int dir)
428733ada14aSBard Liao {
4288fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
428901dfb1ecSBard Liao 	unsigned int reg_val = 0, src = 0;
429033ada14aSBard Liao 
429133ada14aSBard Liao 	if (freq == rt5665->sysclk && clk_id == rt5665->sysclk_src)
429233ada14aSBard Liao 		return 0;
429333ada14aSBard Liao 
429433ada14aSBard Liao 	switch (clk_id) {
429533ada14aSBard Liao 	case RT5665_SCLK_S_MCLK:
429633ada14aSBard Liao 		reg_val |= RT5665_SCLK_SRC_MCLK;
429701dfb1ecSBard Liao 		src = RT5665_CLK_SRC_MCLK;
429833ada14aSBard Liao 		break;
429933ada14aSBard Liao 	case RT5665_SCLK_S_PLL1:
430033ada14aSBard Liao 		reg_val |= RT5665_SCLK_SRC_PLL1;
430101dfb1ecSBard Liao 		src = RT5665_CLK_SRC_PLL1;
430233ada14aSBard Liao 		break;
430333ada14aSBard Liao 	case RT5665_SCLK_S_RCCLK:
430433ada14aSBard Liao 		reg_val |= RT5665_SCLK_SRC_RCCLK;
430501dfb1ecSBard Liao 		src = RT5665_CLK_SRC_RCCLK;
430633ada14aSBard Liao 		break;
430733ada14aSBard Liao 	default:
4308fab70c27SKuninori Morimoto 		dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
430933ada14aSBard Liao 		return -EINVAL;
431033ada14aSBard Liao 	}
4311fab70c27SKuninori Morimoto 	snd_soc_component_update_bits(component, RT5665_GLB_CLK,
431233ada14aSBard Liao 		RT5665_SCLK_SRC_MASK, reg_val);
431301dfb1ecSBard Liao 
431401dfb1ecSBard Liao 	if (rt5665->master[RT5665_AIF2_1] || rt5665->master[RT5665_AIF2_2]) {
4315fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S_M_CLK_CTRL_1,
431601dfb1ecSBard Liao 			RT5665_I2S2_SRC_MASK, src << RT5665_I2S2_SRC_SFT);
431701dfb1ecSBard Liao 	}
431801dfb1ecSBard Liao 	if (rt5665->master[RT5665_AIF3]) {
4319fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_I2S_M_CLK_CTRL_1,
432001dfb1ecSBard Liao 			RT5665_I2S3_SRC_MASK, src << RT5665_I2S3_SRC_SFT);
432101dfb1ecSBard Liao 	}
432201dfb1ecSBard Liao 
432333ada14aSBard Liao 	rt5665->sysclk = freq;
432433ada14aSBard Liao 	rt5665->sysclk_src = clk_id;
432533ada14aSBard Liao 
4326fab70c27SKuninori Morimoto 	dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
432733ada14aSBard Liao 
432833ada14aSBard Liao 	return 0;
432933ada14aSBard Liao }
433033ada14aSBard Liao 
4331fab70c27SKuninori Morimoto static int rt5665_set_component_pll(struct snd_soc_component *component, int pll_id,
4332ccd00d59SBard Liao 				int source, unsigned int freq_in,
4333ccd00d59SBard Liao 				unsigned int freq_out)
433433ada14aSBard Liao {
4335fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
433633ada14aSBard Liao 	struct rl6231_pll_code pll_code;
433733ada14aSBard Liao 	int ret;
433833ada14aSBard Liao 
4339ccd00d59SBard Liao 	if (source == rt5665->pll_src && freq_in == rt5665->pll_in &&
434033ada14aSBard Liao 	    freq_out == rt5665->pll_out)
434133ada14aSBard Liao 		return 0;
434233ada14aSBard Liao 
434333ada14aSBard Liao 	if (!freq_in || !freq_out) {
4344fab70c27SKuninori Morimoto 		dev_dbg(component->dev, "PLL disabled\n");
434533ada14aSBard Liao 
434633ada14aSBard Liao 		rt5665->pll_in = 0;
434733ada14aSBard Liao 		rt5665->pll_out = 0;
4348fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_GLB_CLK,
434933ada14aSBard Liao 			RT5665_SCLK_SRC_MASK, RT5665_SCLK_SRC_MCLK);
435033ada14aSBard Liao 		return 0;
435133ada14aSBard Liao 	}
435233ada14aSBard Liao 
4353ccd00d59SBard Liao 	switch (source) {
435433ada14aSBard Liao 	case RT5665_PLL1_S_MCLK:
4355fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_GLB_CLK,
435633ada14aSBard Liao 			RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_MCLK);
435733ada14aSBard Liao 		break;
435833ada14aSBard Liao 	case RT5665_PLL1_S_BCLK1:
4359fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_GLB_CLK,
436033ada14aSBard Liao 				RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK1);
436133ada14aSBard Liao 		break;
436233ada14aSBard Liao 	case RT5665_PLL1_S_BCLK2:
4363fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_GLB_CLK,
436433ada14aSBard Liao 				RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK2);
436533ada14aSBard Liao 		break;
436633ada14aSBard Liao 	case RT5665_PLL1_S_BCLK3:
4367fab70c27SKuninori Morimoto 		snd_soc_component_update_bits(component, RT5665_GLB_CLK,
436833ada14aSBard Liao 				RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK3);
436933ada14aSBard Liao 		break;
437033ada14aSBard Liao 	default:
4371fab70c27SKuninori Morimoto 		dev_err(component->dev, "Unknown PLL Source %d\n", source);
437233ada14aSBard Liao 		return -EINVAL;
437333ada14aSBard Liao 	}
437433ada14aSBard Liao 
437533ada14aSBard Liao 	ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
437633ada14aSBard Liao 	if (ret < 0) {
4377a4db95b2SColin Ian King 		dev_err(component->dev, "Unsupported input clock %d\n", freq_in);
437833ada14aSBard Liao 		return ret;
437933ada14aSBard Liao 	}
438033ada14aSBard Liao 
4381fab70c27SKuninori Morimoto 	dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n",
438233ada14aSBard Liao 		pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
438333ada14aSBard Liao 		pll_code.n_code, pll_code.k_code);
438433ada14aSBard Liao 
4385fab70c27SKuninori Morimoto 	snd_soc_component_write(component, RT5665_PLL_CTRL_1,
438633ada14aSBard Liao 		pll_code.n_code << RT5665_PLL_N_SFT | pll_code.k_code);
4387fab70c27SKuninori Morimoto 	snd_soc_component_write(component, RT5665_PLL_CTRL_2,
438817d78e93SPierre-Louis Bossart 		((pll_code.m_bp ? 0 : pll_code.m_code) << RT5665_PLL_M_SFT) |
438917d78e93SPierre-Louis Bossart 		(pll_code.m_bp << RT5665_PLL_M_BP_SFT));
439033ada14aSBard Liao 
439133ada14aSBard Liao 	rt5665->pll_in = freq_in;
439233ada14aSBard Liao 	rt5665->pll_out = freq_out;
4393ccd00d59SBard Liao 	rt5665->pll_src = source;
439433ada14aSBard Liao 
439533ada14aSBard Liao 	return 0;
439633ada14aSBard Liao }
439733ada14aSBard Liao 
439833ada14aSBard Liao static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
439933ada14aSBard Liao {
4400fab70c27SKuninori Morimoto 	struct snd_soc_component *component = dai->component;
4401fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
440233ada14aSBard Liao 
4403fab70c27SKuninori Morimoto 	dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio);
440433ada14aSBard Liao 
440533ada14aSBard Liao 	rt5665->bclk[dai->id] = ratio;
440633ada14aSBard Liao 
440733ada14aSBard Liao 	if (ratio == 64) {
440833ada14aSBard Liao 		switch (dai->id) {
440933ada14aSBard Liao 		case RT5665_AIF2_1:
441033ada14aSBard Liao 		case RT5665_AIF2_2:
4411fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_ADDA_CLK_2,
441233ada14aSBard Liao 				RT5665_I2S_BCLK_MS2_MASK,
441333ada14aSBard Liao 				RT5665_I2S_BCLK_MS2_64);
441433ada14aSBard Liao 			break;
441533ada14aSBard Liao 		case RT5665_AIF3:
4416fab70c27SKuninori Morimoto 			snd_soc_component_update_bits(component, RT5665_ADDA_CLK_2,
441733ada14aSBard Liao 				RT5665_I2S_BCLK_MS3_MASK,
441833ada14aSBard Liao 				RT5665_I2S_BCLK_MS3_64);
441933ada14aSBard Liao 			break;
442033ada14aSBard Liao 		}
442133ada14aSBard Liao 	}
442233ada14aSBard Liao 
442333ada14aSBard Liao 	return 0;
442433ada14aSBard Liao }
442533ada14aSBard Liao 
4426fab70c27SKuninori Morimoto static int rt5665_set_bias_level(struct snd_soc_component *component,
442733ada14aSBard Liao 			enum snd_soc_bias_level level)
442833ada14aSBard Liao {
4429fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
443033ada14aSBard Liao 
443133ada14aSBard Liao 	switch (level) {
443233ada14aSBard Liao 	case SND_SOC_BIAS_PREPARE:
443333ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_DIG_MISC,
443433ada14aSBard Liao 			RT5665_DIG_GATE_CTRL, RT5665_DIG_GATE_CTRL);
443533ada14aSBard Liao 		break;
443633ada14aSBard Liao 
443733ada14aSBard Liao 	case SND_SOC_BIAS_STANDBY:
443833ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_PWR_DIG_1,
443933ada14aSBard Liao 			RT5665_PWR_LDO,	RT5665_PWR_LDO);
444033ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_1,
444133ada14aSBard Liao 			RT5665_PWR_MB, RT5665_PWR_MB);
444233ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_DIG_MISC,
444333ada14aSBard Liao 			RT5665_DIG_GATE_CTRL, 0);
444433ada14aSBard Liao 		break;
444533ada14aSBard Liao 	case SND_SOC_BIAS_OFF:
444633ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_PWR_DIG_1,
444733ada14aSBard Liao 			RT5665_PWR_LDO, 0);
444833ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_1,
444933ada14aSBard Liao 			RT5665_PWR_MB, 0);
445033ada14aSBard Liao 		break;
445133ada14aSBard Liao 
445233ada14aSBard Liao 	default:
445333ada14aSBard Liao 		break;
445433ada14aSBard Liao 	}
445533ada14aSBard Liao 
445633ada14aSBard Liao 	return 0;
445733ada14aSBard Liao }
445833ada14aSBard Liao 
4459fab70c27SKuninori Morimoto static int rt5665_probe(struct snd_soc_component *component)
446033ada14aSBard Liao {
4461fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
446233ada14aSBard Liao 
4463fab70c27SKuninori Morimoto 	rt5665->component = component;
446433ada14aSBard Liao 
446533ada14aSBard Liao 	schedule_delayed_work(&rt5665->calibrate_work, msecs_to_jiffies(100));
446633ada14aSBard Liao 
446733ada14aSBard Liao 	return 0;
446833ada14aSBard Liao }
446933ada14aSBard Liao 
4470fab70c27SKuninori Morimoto static void rt5665_remove(struct snd_soc_component *component)
447133ada14aSBard Liao {
4472fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
447333ada14aSBard Liao 
447433ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_RESET, 0);
447533ada14aSBard Liao }
447633ada14aSBard Liao 
447733ada14aSBard Liao #ifdef CONFIG_PM
4478fab70c27SKuninori Morimoto static int rt5665_suspend(struct snd_soc_component *component)
447933ada14aSBard Liao {
4480fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
448133ada14aSBard Liao 
448233ada14aSBard Liao 	regcache_cache_only(rt5665->regmap, true);
448333ada14aSBard Liao 	regcache_mark_dirty(rt5665->regmap);
448433ada14aSBard Liao 	return 0;
448533ada14aSBard Liao }
448633ada14aSBard Liao 
4487fab70c27SKuninori Morimoto static int rt5665_resume(struct snd_soc_component *component)
448833ada14aSBard Liao {
4489fab70c27SKuninori Morimoto 	struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component);
449033ada14aSBard Liao 
449133ada14aSBard Liao 	regcache_cache_only(rt5665->regmap, false);
449233ada14aSBard Liao 	regcache_sync(rt5665->regmap);
449333ada14aSBard Liao 
449433ada14aSBard Liao 	return 0;
449533ada14aSBard Liao }
449633ada14aSBard Liao #else
449733ada14aSBard Liao #define rt5665_suspend NULL
449833ada14aSBard Liao #define rt5665_resume NULL
449933ada14aSBard Liao #endif
450033ada14aSBard Liao 
450133ada14aSBard Liao #define RT5665_STEREO_RATES SNDRV_PCM_RATE_8000_192000
450233ada14aSBard Liao #define RT5665_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
450333ada14aSBard Liao 		SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
450433ada14aSBard Liao 
450533ada14aSBard Liao static const struct snd_soc_dai_ops rt5665_aif_dai_ops = {
450633ada14aSBard Liao 	.hw_params = rt5665_hw_params,
450733ada14aSBard Liao 	.set_fmt = rt5665_set_dai_fmt,
450833ada14aSBard Liao 	.set_tdm_slot = rt5665_set_tdm_slot,
450933ada14aSBard Liao 	.set_bclk_ratio = rt5665_set_bclk_ratio,
451033ada14aSBard Liao };
451133ada14aSBard Liao 
451233ada14aSBard Liao static struct snd_soc_dai_driver rt5665_dai[] = {
451333ada14aSBard Liao 	{
451433ada14aSBard Liao 		.name = "rt5665-aif1_1",
451533ada14aSBard Liao 		.id = RT5665_AIF1_1,
451633ada14aSBard Liao 		.playback = {
451733ada14aSBard Liao 			.stream_name = "AIF1 Playback",
451833ada14aSBard Liao 			.channels_min = 1,
451933ada14aSBard Liao 			.channels_max = 8,
452033ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
452133ada14aSBard Liao 			.formats = RT5665_FORMATS,
452233ada14aSBard Liao 		},
452333ada14aSBard Liao 		.capture = {
452433ada14aSBard Liao 			.stream_name = "AIF1_1 Capture",
452533ada14aSBard Liao 			.channels_min = 1,
452633ada14aSBard Liao 			.channels_max = 8,
452733ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
452833ada14aSBard Liao 			.formats = RT5665_FORMATS,
452933ada14aSBard Liao 		},
453033ada14aSBard Liao 		.ops = &rt5665_aif_dai_ops,
453133ada14aSBard Liao 	},
453233ada14aSBard Liao 	{
453333ada14aSBard Liao 		.name = "rt5665-aif1_2",
453433ada14aSBard Liao 		.id = RT5665_AIF1_2,
453533ada14aSBard Liao 		.capture = {
453633ada14aSBard Liao 			.stream_name = "AIF1_2 Capture",
453733ada14aSBard Liao 			.channels_min = 1,
453833ada14aSBard Liao 			.channels_max = 8,
453933ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
454033ada14aSBard Liao 			.formats = RT5665_FORMATS,
454133ada14aSBard Liao 		},
454233ada14aSBard Liao 		.ops = &rt5665_aif_dai_ops,
454333ada14aSBard Liao 	},
454433ada14aSBard Liao 	{
454533ada14aSBard Liao 		.name = "rt5665-aif2_1",
454633ada14aSBard Liao 		.id = RT5665_AIF2_1,
454733ada14aSBard Liao 		.playback = {
454833ada14aSBard Liao 			.stream_name = "AIF2_1 Playback",
454933ada14aSBard Liao 			.channels_min = 1,
455033ada14aSBard Liao 			.channels_max = 2,
455133ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
455233ada14aSBard Liao 			.formats = RT5665_FORMATS,
455333ada14aSBard Liao 		},
455433ada14aSBard Liao 		.capture = {
455533ada14aSBard Liao 			.stream_name = "AIF2_1 Capture",
455633ada14aSBard Liao 			.channels_min = 1,
455733ada14aSBard Liao 			.channels_max = 2,
455833ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
455933ada14aSBard Liao 			.formats = RT5665_FORMATS,
456033ada14aSBard Liao 		},
456133ada14aSBard Liao 		.ops = &rt5665_aif_dai_ops,
456233ada14aSBard Liao 	},
456333ada14aSBard Liao 	{
456433ada14aSBard Liao 		.name = "rt5665-aif2_2",
456533ada14aSBard Liao 		.id = RT5665_AIF2_2,
456633ada14aSBard Liao 		.playback = {
456733ada14aSBard Liao 			.stream_name = "AIF2_2 Playback",
456833ada14aSBard Liao 			.channels_min = 1,
456933ada14aSBard Liao 			.channels_max = 2,
457033ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
457133ada14aSBard Liao 			.formats = RT5665_FORMATS,
457233ada14aSBard Liao 		},
457333ada14aSBard Liao 		.capture = {
457433ada14aSBard Liao 			.stream_name = "AIF2_2 Capture",
457533ada14aSBard Liao 			.channels_min = 1,
457633ada14aSBard Liao 			.channels_max = 2,
457733ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
457833ada14aSBard Liao 			.formats = RT5665_FORMATS,
457933ada14aSBard Liao 		},
458033ada14aSBard Liao 		.ops = &rt5665_aif_dai_ops,
458133ada14aSBard Liao 	},
458233ada14aSBard Liao 	{
458333ada14aSBard Liao 		.name = "rt5665-aif3",
458433ada14aSBard Liao 		.id = RT5665_AIF3,
458533ada14aSBard Liao 		.playback = {
458633ada14aSBard Liao 			.stream_name = "AIF3 Playback",
458733ada14aSBard Liao 			.channels_min = 1,
458833ada14aSBard Liao 			.channels_max = 2,
458933ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
459033ada14aSBard Liao 			.formats = RT5665_FORMATS,
459133ada14aSBard Liao 		},
459233ada14aSBard Liao 		.capture = {
459333ada14aSBard Liao 			.stream_name = "AIF3 Capture",
459433ada14aSBard Liao 			.channels_min = 1,
459533ada14aSBard Liao 			.channels_max = 2,
459633ada14aSBard Liao 			.rates = RT5665_STEREO_RATES,
459733ada14aSBard Liao 			.formats = RT5665_FORMATS,
459833ada14aSBard Liao 		},
459933ada14aSBard Liao 		.ops = &rt5665_aif_dai_ops,
460033ada14aSBard Liao 	},
460133ada14aSBard Liao };
460233ada14aSBard Liao 
4603fab70c27SKuninori Morimoto static const struct snd_soc_component_driver soc_component_dev_rt5665 = {
460433ada14aSBard Liao 	.probe			= rt5665_probe,
460533ada14aSBard Liao 	.remove			= rt5665_remove,
460633ada14aSBard Liao 	.suspend		= rt5665_suspend,
460733ada14aSBard Liao 	.resume			= rt5665_resume,
460833ada14aSBard Liao 	.set_bias_level		= rt5665_set_bias_level,
460933ada14aSBard Liao 	.controls		= rt5665_snd_controls,
461033ada14aSBard Liao 	.num_controls		= ARRAY_SIZE(rt5665_snd_controls),
461133ada14aSBard Liao 	.dapm_widgets		= rt5665_dapm_widgets,
461233ada14aSBard Liao 	.num_dapm_widgets	= ARRAY_SIZE(rt5665_dapm_widgets),
461333ada14aSBard Liao 	.dapm_routes		= rt5665_dapm_routes,
461433ada14aSBard Liao 	.num_dapm_routes	= ARRAY_SIZE(rt5665_dapm_routes),
4615fab70c27SKuninori Morimoto 	.set_sysclk		= rt5665_set_component_sysclk,
4616fab70c27SKuninori Morimoto 	.set_pll		= rt5665_set_component_pll,
461797c415a6SBard Liao 	.set_jack		= rt5665_set_jack_detect,
4618fab70c27SKuninori Morimoto 	.use_pmdown_time	= 1,
4619fab70c27SKuninori Morimoto 	.endianness		= 1,
462033ada14aSBard Liao };
462133ada14aSBard Liao 
462233ada14aSBard Liao 
462333ada14aSBard Liao static const struct regmap_config rt5665_regmap = {
462433ada14aSBard Liao 	.reg_bits = 16,
462533ada14aSBard Liao 	.val_bits = 16,
462633ada14aSBard Liao 	.max_register = 0x0400,
462733ada14aSBard Liao 	.volatile_reg = rt5665_volatile_register,
462833ada14aSBard Liao 	.readable_reg = rt5665_readable_register,
462933ada14aSBard Liao 	.cache_type = REGCACHE_RBTREE,
463033ada14aSBard Liao 	.reg_defaults = rt5665_reg,
463133ada14aSBard Liao 	.num_reg_defaults = ARRAY_SIZE(rt5665_reg),
46321c96a2f6SDavid Frey 	.use_single_read = true,
46331c96a2f6SDavid Frey 	.use_single_write = true,
463433ada14aSBard Liao };
463533ada14aSBard Liao 
463633ada14aSBard Liao static const struct i2c_device_id rt5665_i2c_id[] = {
463733ada14aSBard Liao 	{"rt5665", 0},
463833ada14aSBard Liao 	{}
463933ada14aSBard Liao };
464033ada14aSBard Liao MODULE_DEVICE_TABLE(i2c, rt5665_i2c_id);
464133ada14aSBard Liao 
464233ada14aSBard Liao static int rt5665_parse_dt(struct rt5665_priv *rt5665, struct device *dev)
464333ada14aSBard Liao {
464433ada14aSBard Liao 	rt5665->pdata.in1_diff = of_property_read_bool(dev->of_node,
464533ada14aSBard Liao 					"realtek,in1-differential");
464633ada14aSBard Liao 	rt5665->pdata.in2_diff = of_property_read_bool(dev->of_node,
464733ada14aSBard Liao 					"realtek,in2-differential");
464833ada14aSBard Liao 	rt5665->pdata.in3_diff = of_property_read_bool(dev->of_node,
464933ada14aSBard Liao 					"realtek,in3-differential");
465033ada14aSBard Liao 	rt5665->pdata.in4_diff = of_property_read_bool(dev->of_node,
465133ada14aSBard Liao 					"realtek,in4-differential");
465233ada14aSBard Liao 
465333ada14aSBard Liao 	of_property_read_u32(dev->of_node, "realtek,dmic1-data-pin",
465433ada14aSBard Liao 		&rt5665->pdata.dmic1_data_pin);
465533ada14aSBard Liao 	of_property_read_u32(dev->of_node, "realtek,dmic2-data-pin",
465633ada14aSBard Liao 		&rt5665->pdata.dmic2_data_pin);
465733ada14aSBard Liao 	of_property_read_u32(dev->of_node, "realtek,jd-src",
465833ada14aSBard Liao 		&rt5665->pdata.jd_src);
465933ada14aSBard Liao 
466033ada14aSBard Liao 	rt5665->pdata.ldo1_en = of_get_named_gpio(dev->of_node,
466133ada14aSBard Liao 		"realtek,ldo1-en-gpios", 0);
466233ada14aSBard Liao 
466333ada14aSBard Liao 	return 0;
466433ada14aSBard Liao }
466533ada14aSBard Liao 
466633ada14aSBard Liao static void rt5665_calibrate(struct rt5665_priv *rt5665)
466733ada14aSBard Liao {
466833ada14aSBard Liao 	int value, count;
466933ada14aSBard Liao 
467033ada14aSBard Liao 	mutex_lock(&rt5665->calibrate_mutex);
467133ada14aSBard Liao 
467233ada14aSBard Liao 	regcache_cache_bypass(rt5665->regmap, true);
467333ada14aSBard Liao 
467433ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_RESET, 0);
467533ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_BIAS_CUR_CTRL_8, 0xa602);
467633ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_HP_CHARGE_PUMP_1, 0x0c26);
467733ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_MONOMIX_IN_GAIN, 0x021f);
467833ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_MONO_OUT, 0x480a);
467933ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_PWR_MIXER, 0x083f);
468033ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_PWR_DIG_1, 0x0180);
468133ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_EJD_CTRL_1, 0x4040);
468233ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_HP_LOGIC_CTRL_2, 0x0000);
468333ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_DIG_MISC, 0x0001);
468433ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_MICBIAS_2, 0x0380);
468533ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_GLB_CLK, 0x8000);
468633ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_ADDA_CLK_1, 0x1000);
468733ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_CHOP_DAC, 0x3030);
468833ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_CALIB_ADC_CTRL, 0x3c05);
468933ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_PWR_ANLG_1, 0xaa3e);
469033ada14aSBard Liao 	usleep_range(15000, 20000);
469133ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_PWR_ANLG_1, 0xfe7e);
469233ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_HP_CALIB_CTRL_2, 0x0321);
469333ada14aSBard Liao 
469433ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_HP_CALIB_CTRL_1, 0xfc00);
469533ada14aSBard Liao 	count = 0;
469633ada14aSBard Liao 	while (true) {
469733ada14aSBard Liao 		regmap_read(rt5665->regmap, RT5665_HP_CALIB_STA_1, &value);
469833ada14aSBard Liao 		if (value & 0x8000)
469933ada14aSBard Liao 			usleep_range(10000, 10005);
470033ada14aSBard Liao 		else
470133ada14aSBard Liao 			break;
470233ada14aSBard Liao 
470333ada14aSBard Liao 		if (count > 60) {
470433ada14aSBard Liao 			pr_err("HP Calibration Failure\n");
470533ada14aSBard Liao 			regmap_write(rt5665->regmap, RT5665_RESET, 0);
470633ada14aSBard Liao 			regcache_cache_bypass(rt5665->regmap, false);
47070c95666fSAxel Lin 			goto out_unlock;
470833ada14aSBard Liao 		}
470933ada14aSBard Liao 
471033ada14aSBard Liao 		count++;
471133ada14aSBard Liao 	}
471233ada14aSBard Liao 
471333ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_MONO_AMP_CALIB_CTRL_1, 0x9e24);
471433ada14aSBard Liao 	count = 0;
471533ada14aSBard Liao 	while (true) {
471633ada14aSBard Liao 		regmap_read(rt5665->regmap, RT5665_MONO_AMP_CALIB_STA1, &value);
471733ada14aSBard Liao 		if (value & 0x8000)
471833ada14aSBard Liao 			usleep_range(10000, 10005);
471933ada14aSBard Liao 		else
472033ada14aSBard Liao 			break;
472133ada14aSBard Liao 
472233ada14aSBard Liao 		if (count > 60) {
472333ada14aSBard Liao 			pr_err("MONO Calibration Failure\n");
472433ada14aSBard Liao 			regmap_write(rt5665->regmap, RT5665_RESET, 0);
472533ada14aSBard Liao 			regcache_cache_bypass(rt5665->regmap, false);
47260c95666fSAxel Lin 			goto out_unlock;
472733ada14aSBard Liao 		}
472833ada14aSBard Liao 
472933ada14aSBard Liao 		count++;
473033ada14aSBard Liao 	}
473133ada14aSBard Liao 
473233ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_RESET, 0);
473333ada14aSBard Liao 	regcache_cache_bypass(rt5665->regmap, false);
473433ada14aSBard Liao 
473533ada14aSBard Liao 	regcache_mark_dirty(rt5665->regmap);
473633ada14aSBard Liao 	regcache_sync(rt5665->regmap);
473733ada14aSBard Liao 
473833ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_BIAS_CUR_CTRL_8, 0xa602);
473933ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_ASRC_8, 0x0120);
474033ada14aSBard Liao 
47410c95666fSAxel Lin out_unlock:
4742b059ca72SBard Liao 	rt5665->calibration_done = true;
474333ada14aSBard Liao 	mutex_unlock(&rt5665->calibrate_mutex);
474433ada14aSBard Liao }
474533ada14aSBard Liao 
474633ada14aSBard Liao static void rt5665_calibrate_handler(struct work_struct *work)
474733ada14aSBard Liao {
474833ada14aSBard Liao 	struct rt5665_priv *rt5665 = container_of(work, struct rt5665_priv,
474933ada14aSBard Liao 		calibrate_work.work);
475033ada14aSBard Liao 
4751*8ec35236SKuninori Morimoto 	while (!snd_soc_card_is_instantiated(rt5665->component->card)) {
475233ada14aSBard Liao 		pr_debug("%s\n", __func__);
475333ada14aSBard Liao 		usleep_range(10000, 15000);
475433ada14aSBard Liao 	}
475533ada14aSBard Liao 
475633ada14aSBard Liao 	rt5665_calibrate(rt5665);
475733ada14aSBard Liao }
475833ada14aSBard Liao 
475935b88858SStephen Kitt static int rt5665_i2c_probe(struct i2c_client *i2c)
476033ada14aSBard Liao {
476133ada14aSBard Liao 	struct rt5665_platform_data *pdata = dev_get_platdata(&i2c->dev);
476233ada14aSBard Liao 	struct rt5665_priv *rt5665;
476333ada14aSBard Liao 	int i, ret;
476433ada14aSBard Liao 	unsigned int val;
476533ada14aSBard Liao 
476633ada14aSBard Liao 	rt5665 = devm_kzalloc(&i2c->dev, sizeof(struct rt5665_priv),
476733ada14aSBard Liao 		GFP_KERNEL);
476833ada14aSBard Liao 
476933ada14aSBard Liao 	if (rt5665 == NULL)
477033ada14aSBard Liao 		return -ENOMEM;
477133ada14aSBard Liao 
477233ada14aSBard Liao 	i2c_set_clientdata(i2c, rt5665);
477333ada14aSBard Liao 
477433ada14aSBard Liao 	if (pdata)
477533ada14aSBard Liao 		rt5665->pdata = *pdata;
477633ada14aSBard Liao 	else
477733ada14aSBard Liao 		rt5665_parse_dt(rt5665, &i2c->dev);
477833ada14aSBard Liao 
477933ada14aSBard Liao 	for (i = 0; i < ARRAY_SIZE(rt5665->supplies); i++)
478033ada14aSBard Liao 		rt5665->supplies[i].supply = rt5665_supply_names[i];
478133ada14aSBard Liao 
478233ada14aSBard Liao 	ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(rt5665->supplies),
478333ada14aSBard Liao 				      rt5665->supplies);
478433ada14aSBard Liao 	if (ret != 0) {
478533ada14aSBard Liao 		dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
478633ada14aSBard Liao 		return ret;
478733ada14aSBard Liao 	}
478833ada14aSBard Liao 
478933ada14aSBard Liao 	ret = regulator_bulk_enable(ARRAY_SIZE(rt5665->supplies),
479033ada14aSBard Liao 				    rt5665->supplies);
479133ada14aSBard Liao 	if (ret != 0) {
479233ada14aSBard Liao 		dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
479333ada14aSBard Liao 		return ret;
479433ada14aSBard Liao 	}
479533ada14aSBard Liao 
479633ada14aSBard Liao 	if (gpio_is_valid(rt5665->pdata.ldo1_en)) {
4797f2826c1fSAxel Lin 		if (devm_gpio_request_one(&i2c->dev, rt5665->pdata.ldo1_en,
4798f2826c1fSAxel Lin 					  GPIOF_OUT_INIT_HIGH, "rt5665"))
479933ada14aSBard Liao 			dev_err(&i2c->dev, "Fail gpio_request gpio_ldo\n");
480033ada14aSBard Liao 	}
480133ada14aSBard Liao 
480233ada14aSBard Liao 	/* Sleep for 300 ms miniumum */
480333ada14aSBard Liao 	usleep_range(300000, 350000);
480433ada14aSBard Liao 
480533ada14aSBard Liao 	rt5665->regmap = devm_regmap_init_i2c(i2c, &rt5665_regmap);
480633ada14aSBard Liao 	if (IS_ERR(rt5665->regmap)) {
480733ada14aSBard Liao 		ret = PTR_ERR(rt5665->regmap);
480833ada14aSBard Liao 		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
480933ada14aSBard Liao 			ret);
481033ada14aSBard Liao 		return ret;
481133ada14aSBard Liao 	}
481233ada14aSBard Liao 
481333ada14aSBard Liao 	regmap_read(rt5665->regmap, RT5665_DEVICE_ID, &val);
481433ada14aSBard Liao 	if (val != DEVICE_ID) {
481533ada14aSBard Liao 		dev_err(&i2c->dev,
481633ada14aSBard Liao 			"Device with ID register %x is not rt5665\n", val);
481733ada14aSBard Liao 		return -ENODEV;
481833ada14aSBard Liao 	}
481933ada14aSBard Liao 
482033ada14aSBard Liao 	regmap_read(rt5665->regmap, RT5665_RESET, &val);
482133ada14aSBard Liao 	switch (val) {
482233ada14aSBard Liao 	case 0x0:
482333ada14aSBard Liao 		rt5665->id = CODEC_5666;
482433ada14aSBard Liao 		break;
482533ada14aSBard Liao 	case 0x3:
482633ada14aSBard Liao 	default:
482733ada14aSBard Liao 		rt5665->id = CODEC_5665;
482833ada14aSBard Liao 		break;
482933ada14aSBard Liao 	}
483033ada14aSBard Liao 
483133ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_RESET, 0);
483233ada14aSBard Liao 
483333ada14aSBard Liao 	/* line in diff mode*/
483433ada14aSBard Liao 	if (rt5665->pdata.in1_diff)
483533ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_IN1_IN2,
483633ada14aSBard Liao 			RT5665_IN1_DF_MASK, RT5665_IN1_DF_MASK);
483733ada14aSBard Liao 	if (rt5665->pdata.in2_diff)
483833ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_IN1_IN2,
483933ada14aSBard Liao 			RT5665_IN2_DF_MASK, RT5665_IN2_DF_MASK);
484033ada14aSBard Liao 	if (rt5665->pdata.in3_diff)
484133ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_IN3_IN4,
484233ada14aSBard Liao 			RT5665_IN3_DF_MASK, RT5665_IN3_DF_MASK);
484333ada14aSBard Liao 	if (rt5665->pdata.in4_diff)
484433ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_IN3_IN4,
484533ada14aSBard Liao 			RT5665_IN4_DF_MASK, RT5665_IN4_DF_MASK);
484633ada14aSBard Liao 
484733ada14aSBard Liao 	/* DMIC pin*/
484833ada14aSBard Liao 	if (rt5665->pdata.dmic1_data_pin != RT5665_DMIC1_NULL ||
484933ada14aSBard Liao 		rt5665->pdata.dmic2_data_pin != RT5665_DMIC2_NULL) {
485033ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_2,
485133ada14aSBard Liao 			RT5665_GP9_PIN_MASK, RT5665_GP9_PIN_DMIC1_SCL);
485233ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_1,
485333ada14aSBard Liao 				RT5665_GP8_PIN_MASK, RT5665_GP8_PIN_DMIC2_SCL);
485433ada14aSBard Liao 		switch (rt5665->pdata.dmic1_data_pin) {
485533ada14aSBard Liao 		case RT5665_DMIC1_DATA_IN2N:
485633ada14aSBard Liao 			regmap_update_bits(rt5665->regmap, RT5665_DMIC_CTRL_1,
485733ada14aSBard Liao 				RT5665_DMIC_1_DP_MASK, RT5665_DMIC_1_DP_IN2N);
485833ada14aSBard Liao 			break;
485933ada14aSBard Liao 
486033ada14aSBard Liao 		case RT5665_DMIC1_DATA_GPIO4:
486133ada14aSBard Liao 			regmap_update_bits(rt5665->regmap, RT5665_DMIC_CTRL_1,
486233ada14aSBard Liao 				RT5665_DMIC_1_DP_MASK, RT5665_DMIC_1_DP_GPIO4);
486333ada14aSBard Liao 			regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_1,
486433ada14aSBard Liao 				RT5665_GP4_PIN_MASK, RT5665_GP4_PIN_DMIC1_SDA);
486533ada14aSBard Liao 			break;
486633ada14aSBard Liao 
486733ada14aSBard Liao 		default:
486833ada14aSBard Liao 			dev_dbg(&i2c->dev, "no DMIC1\n");
486933ada14aSBard Liao 			break;
487033ada14aSBard Liao 		}
487133ada14aSBard Liao 
487233ada14aSBard Liao 		switch (rt5665->pdata.dmic2_data_pin) {
487333ada14aSBard Liao 		case RT5665_DMIC2_DATA_IN2P:
487433ada14aSBard Liao 			regmap_update_bits(rt5665->regmap, RT5665_DMIC_CTRL_1,
487533ada14aSBard Liao 				RT5665_DMIC_2_DP_MASK, RT5665_DMIC_2_DP_IN2P);
487633ada14aSBard Liao 			break;
487733ada14aSBard Liao 
487833ada14aSBard Liao 		case RT5665_DMIC2_DATA_GPIO5:
487933ada14aSBard Liao 			regmap_update_bits(rt5665->regmap,
488033ada14aSBard Liao 				RT5665_DMIC_CTRL_1,
488133ada14aSBard Liao 				RT5665_DMIC_2_DP_MASK,
488233ada14aSBard Liao 				RT5665_DMIC_2_DP_GPIO5);
488333ada14aSBard Liao 			regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_1,
488433ada14aSBard Liao 				RT5665_GP5_PIN_MASK, RT5665_GP5_PIN_DMIC2_SDA);
488533ada14aSBard Liao 			break;
488633ada14aSBard Liao 
488733ada14aSBard Liao 		default:
488833ada14aSBard Liao 			dev_dbg(&i2c->dev, "no DMIC2\n");
488933ada14aSBard Liao 			break;
489033ada14aSBard Liao 
489133ada14aSBard Liao 		}
489233ada14aSBard Liao 	}
489333ada14aSBard Liao 
489433ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_HP_LOGIC_CTRL_2, 0x0002);
489533ada14aSBard Liao 	regmap_update_bits(rt5665->regmap, RT5665_EJD_CTRL_1,
489639841944SBard Liao 		0xf000 | RT5665_VREF_POW_MASK, 0xe000 | RT5665_VREF_POW_REG);
489733ada14aSBard Liao 	/* Work around for pow_pump */
489833ada14aSBard Liao 	regmap_update_bits(rt5665->regmap, RT5665_STO1_DAC_SIL_DET,
489933ada14aSBard Liao 		RT5665_DEB_STO_DAC_MASK, RT5665_DEB_80_MS);
490033ada14aSBard Liao 
490133ada14aSBard Liao 	regmap_update_bits(rt5665->regmap, RT5665_HP_CHARGE_PUMP_1,
490233ada14aSBard Liao 		RT5665_PM_HP_MASK, RT5665_PM_HP_HV);
490333ada14aSBard Liao 
490433ada14aSBard Liao 	/* Set GPIO4,8 as input for combo jack */
490533ada14aSBard Liao 	if (rt5665->id == CODEC_5666) {
490633ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_2,
490733ada14aSBard Liao 			RT5665_GP4_PF_MASK, RT5665_GP4_PF_IN);
490833ada14aSBard Liao 		regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_3,
490933ada14aSBard Liao 			RT5665_GP8_PF_MASK, RT5665_GP8_PF_IN);
491033ada14aSBard Liao 	}
491133ada14aSBard Liao 
491233ada14aSBard Liao 	/* Enhance performance*/
491333ada14aSBard Liao 	regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_1,
491433ada14aSBard Liao 		RT5665_HP_DRIVER_MASK | RT5665_LDO1_DVO_MASK,
4915593dd5d9SBard Liao 		RT5665_HP_DRIVER_5X | RT5665_LDO1_DVO_12);
491633ada14aSBard Liao 
491733ada14aSBard Liao 	INIT_DELAYED_WORK(&rt5665->jack_detect_work,
491833ada14aSBard Liao 				rt5665_jack_detect_handler);
491933ada14aSBard Liao 	INIT_DELAYED_WORK(&rt5665->calibrate_work,
492033ada14aSBard Liao 				rt5665_calibrate_handler);
492133ada14aSBard Liao 	INIT_DELAYED_WORK(&rt5665->jd_check_work,
492233ada14aSBard Liao 				rt5665_jd_check_handler);
492333ada14aSBard Liao 
492433ada14aSBard Liao 	mutex_init(&rt5665->calibrate_mutex);
492533ada14aSBard Liao 
492633ada14aSBard Liao 	if (i2c->irq) {
492733ada14aSBard Liao 		ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL,
492833ada14aSBard Liao 			rt5665_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
492933ada14aSBard Liao 			| IRQF_ONESHOT, "rt5665", rt5665);
493033ada14aSBard Liao 		if (ret)
493133ada14aSBard Liao 			dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret);
493233ada14aSBard Liao 
493333ada14aSBard Liao 	}
493433ada14aSBard Liao 
4935fab70c27SKuninori Morimoto 	return devm_snd_soc_register_component(&i2c->dev,
4936fab70c27SKuninori Morimoto 			&soc_component_dev_rt5665,
493733ada14aSBard Liao 			rt5665_dai, ARRAY_SIZE(rt5665_dai));
493833ada14aSBard Liao }
493933ada14aSBard Liao 
494033ada14aSBard Liao static void rt5665_i2c_shutdown(struct i2c_client *client)
494133ada14aSBard Liao {
494233ada14aSBard Liao 	struct rt5665_priv *rt5665 = i2c_get_clientdata(client);
494333ada14aSBard Liao 
494433ada14aSBard Liao 	regmap_write(rt5665->regmap, RT5665_RESET, 0);
494533ada14aSBard Liao }
494633ada14aSBard Liao 
494733ada14aSBard Liao #ifdef CONFIG_OF
494833ada14aSBard Liao static const struct of_device_id rt5665_of_match[] = {
494933ada14aSBard Liao 	{.compatible = "realtek,rt5665"},
495033ada14aSBard Liao 	{.compatible = "realtek,rt5666"},
495133ada14aSBard Liao 	{},
495233ada14aSBard Liao };
495333ada14aSBard Liao MODULE_DEVICE_TABLE(of, rt5665_of_match);
495433ada14aSBard Liao #endif
495533ada14aSBard Liao 
495633ada14aSBard Liao #ifdef CONFIG_ACPI
4957abfedab1SArvind Yadav static const struct acpi_device_id rt5665_acpi_match[] = {
495833ada14aSBard Liao 	{"10EC5665", 0,},
495933ada14aSBard Liao 	{"10EC5666", 0,},
496033ada14aSBard Liao 	{},
496133ada14aSBard Liao };
496233ada14aSBard Liao MODULE_DEVICE_TABLE(acpi, rt5665_acpi_match);
496333ada14aSBard Liao #endif
496433ada14aSBard Liao 
496518fe7869SWei Yongjun static struct i2c_driver rt5665_i2c_driver = {
496633ada14aSBard Liao 	.driver = {
496733ada14aSBard Liao 		.name = "rt5665",
496833ada14aSBard Liao 		.of_match_table = of_match_ptr(rt5665_of_match),
496933ada14aSBard Liao 		.acpi_match_table = ACPI_PTR(rt5665_acpi_match),
497033ada14aSBard Liao 	},
497135b88858SStephen Kitt 	.probe_new = rt5665_i2c_probe,
497233ada14aSBard Liao 	.shutdown = rt5665_i2c_shutdown,
497333ada14aSBard Liao 	.id_table = rt5665_i2c_id,
497433ada14aSBard Liao };
497533ada14aSBard Liao module_i2c_driver(rt5665_i2c_driver);
497633ada14aSBard Liao 
497733ada14aSBard Liao MODULE_DESCRIPTION("ASoC RT5665 driver");
497833ada14aSBard Liao MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
497933ada14aSBard Liao MODULE_LICENSE("GPL v2");
4980