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