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