xref: /openbmc/linux/sound/soc/codecs/rt5682.c (revision 34d6f206a88c2651d216bd3487ac956a40b2ba8e)
1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2a50067d4SArnd Bergmann //
3a50067d4SArnd Bergmann // rt5682.c  --  RT5682 ALSA SoC audio component driver
4a50067d4SArnd Bergmann //
5a50067d4SArnd Bergmann // Copyright 2018 Realtek Semiconductor Corp.
6a50067d4SArnd Bergmann // Author: Bard Liao <bardliao@realtek.com>
7a50067d4SArnd Bergmann //
80ddce71cSBard Liao 
90ddce71cSBard Liao #include <linux/module.h>
100ddce71cSBard Liao #include <linux/moduleparam.h>
110ddce71cSBard Liao #include <linux/init.h>
120ddce71cSBard Liao #include <linux/delay.h>
130ddce71cSBard Liao #include <linux/pm.h>
1403f6fc6dSOder Chiou #include <linux/pm_runtime.h>
150ddce71cSBard Liao #include <linux/platform_device.h>
160ddce71cSBard Liao #include <linux/spi/spi.h>
170ddce71cSBard Liao #include <linux/acpi.h>
18ed117017SLinus Walleij #include <linux/gpio/consumer.h>
190ddce71cSBard Liao #include <linux/mutex.h>
200ddce71cSBard Liao #include <sound/core.h>
210ddce71cSBard Liao #include <sound/pcm.h>
220ddce71cSBard Liao #include <sound/pcm_params.h>
230ddce71cSBard Liao #include <sound/jack.h>
240ddce71cSBard Liao #include <sound/soc.h>
250ddce71cSBard Liao #include <sound/soc-dapm.h>
260ddce71cSBard Liao #include <sound/initval.h>
270ddce71cSBard Liao #include <sound/tlv.h>
280ddce71cSBard Liao #include <sound/rt5682.h>
290ddce71cSBard Liao 
300ddce71cSBard Liao #include "rl6231.h"
310ddce71cSBard Liao #include "rt5682.h"
320ddce71cSBard Liao 
33a50067d4SArnd Bergmann const char *rt5682_supply_names[RT5682_NUM_SUPPLIES] = {
340ddce71cSBard Liao 	"AVDD",
350ddce71cSBard Liao 	"MICVDD",
360ddce71cSBard Liao 	"VBAT",
37318ff069SNícolas F. R. A. Prado 	"DBVDD",
38318ff069SNícolas F. R. A. Prado 	"LDO1-IN",
390ddce71cSBard Liao };
40a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_supply_names);
413ac1b2e4SBard liao 
420ddce71cSBard Liao static const struct reg_sequence patch_list[] = {
4337efe23dSShuming Fan 	{RT5682_HP_IMP_SENS_CTRL_19, 0x1000},
4428b20ddeSShuming Fan 	{RT5682_DAC_ADC_DIG_VOL1, 0xa020},
45bc094709SShuming Fan 	{RT5682_I2C_CTRL, 0x000f},
460c48a653Sderek.fang 	{RT5682_PLL2_INTERNAL, 0x8266},
478d3019b6SDerek Fang 	{RT5682_SAR_IL_CMD_1, 0x22b7},
488d3019b6SDerek Fang 	{RT5682_SAR_IL_CMD_3, 0x0365},
498d3019b6SDerek Fang 	{RT5682_SAR_IL_CMD_6, 0x0110},
504b19e4a7SDerek Fang 	{RT5682_CHARGE_PUMP_1, 0x0210},
514b19e4a7SDerek Fang 	{RT5682_HP_LOGIC_CTRL_2, 0x0007},
52a3774a2aSDerek Fang 	{RT5682_SAR_IL_CMD_2, 0xac00},
532cd9b0efSDerek Fang 	{RT5682_CBJ_CTRL_7, 0x0104},
540ddce71cSBard Liao };
550ddce71cSBard Liao 
rt5682_apply_patch_list(struct rt5682_priv * rt5682,struct device * dev)56a50067d4SArnd Bergmann void rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev)
57a50067d4SArnd Bergmann {
58a50067d4SArnd Bergmann 	int ret;
59a50067d4SArnd Bergmann 
60a50067d4SArnd Bergmann 	ret = regmap_multi_reg_write(rt5682->regmap, patch_list,
61a50067d4SArnd Bergmann 				     ARRAY_SIZE(patch_list));
62a50067d4SArnd Bergmann 	if (ret)
63a50067d4SArnd Bergmann 		dev_warn(dev, "Failed to apply regmap patch: %d\n", ret);
64a50067d4SArnd Bergmann }
65a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_apply_patch_list);
66a50067d4SArnd Bergmann 
67a50067d4SArnd Bergmann const struct reg_default rt5682_reg[RT5682_REG_NUM] = {
680ddce71cSBard Liao 	{0x0002, 0x8080},
690ddce71cSBard Liao 	{0x0003, 0x8000},
700ddce71cSBard Liao 	{0x0005, 0x0000},
710ddce71cSBard Liao 	{0x0006, 0x0000},
720ddce71cSBard Liao 	{0x0008, 0x800f},
730ddce71cSBard Liao 	{0x000b, 0x0000},
740ddce71cSBard Liao 	{0x0010, 0x4040},
750ddce71cSBard Liao 	{0x0011, 0x0000},
760ddce71cSBard Liao 	{0x0012, 0x1404},
770ddce71cSBard Liao 	{0x0013, 0x1000},
780ddce71cSBard Liao 	{0x0014, 0xa00a},
790ddce71cSBard Liao 	{0x0015, 0x0404},
800ddce71cSBard Liao 	{0x0016, 0x0404},
810ddce71cSBard Liao 	{0x0019, 0xafaf},
820ddce71cSBard Liao 	{0x001c, 0x2f2f},
830ddce71cSBard Liao 	{0x001f, 0x0000},
840ddce71cSBard Liao 	{0x0022, 0x5757},
850ddce71cSBard Liao 	{0x0023, 0x0039},
860ddce71cSBard Liao 	{0x0024, 0x000b},
870ddce71cSBard Liao 	{0x0026, 0xc0c4},
880ddce71cSBard Liao 	{0x0029, 0x8080},
890ddce71cSBard Liao 	{0x002a, 0xa0a0},
900ddce71cSBard Liao 	{0x002b, 0x0300},
910ddce71cSBard Liao 	{0x0030, 0x0000},
920ddce71cSBard Liao 	{0x003c, 0x0080},
930ddce71cSBard Liao 	{0x0044, 0x0c0c},
940ddce71cSBard Liao 	{0x0049, 0x0000},
950ddce71cSBard Liao 	{0x0061, 0x0000},
960ddce71cSBard Liao 	{0x0062, 0x0000},
970ddce71cSBard Liao 	{0x0063, 0x003f},
980ddce71cSBard Liao 	{0x0064, 0x0000},
990ddce71cSBard Liao 	{0x0065, 0x0000},
1000ddce71cSBard Liao 	{0x0066, 0x0030},
1010ddce71cSBard Liao 	{0x0067, 0x0000},
1020ddce71cSBard Liao 	{0x006b, 0x0000},
1030ddce71cSBard Liao 	{0x006c, 0x0000},
1040ddce71cSBard Liao 	{0x006d, 0x2200},
1050ddce71cSBard Liao 	{0x006e, 0x0a10},
1060ddce71cSBard Liao 	{0x0070, 0x8000},
1070ddce71cSBard Liao 	{0x0071, 0x8000},
1080ddce71cSBard Liao 	{0x0073, 0x0000},
1090ddce71cSBard Liao 	{0x0074, 0x0000},
1100ddce71cSBard Liao 	{0x0075, 0x0002},
1110ddce71cSBard Liao 	{0x0076, 0x0001},
1120ddce71cSBard Liao 	{0x0079, 0x0000},
1130ddce71cSBard Liao 	{0x007a, 0x0000},
1140ddce71cSBard Liao 	{0x007b, 0x0000},
1150ddce71cSBard Liao 	{0x007c, 0x0100},
1160ddce71cSBard Liao 	{0x007e, 0x0000},
1170ddce71cSBard Liao 	{0x0080, 0x0000},
1180ddce71cSBard Liao 	{0x0081, 0x0000},
1190ddce71cSBard Liao 	{0x0082, 0x0000},
1200ddce71cSBard Liao 	{0x0083, 0x0000},
1210ddce71cSBard Liao 	{0x0084, 0x0000},
1220ddce71cSBard Liao 	{0x0085, 0x0000},
1230ddce71cSBard Liao 	{0x0086, 0x0005},
1240ddce71cSBard Liao 	{0x0087, 0x0000},
1250ddce71cSBard Liao 	{0x0088, 0x0000},
1260ddce71cSBard Liao 	{0x008c, 0x0003},
1270ddce71cSBard Liao 	{0x008d, 0x0000},
1280ddce71cSBard Liao 	{0x008e, 0x0060},
1290ddce71cSBard Liao 	{0x008f, 0x1000},
1300ddce71cSBard Liao 	{0x0091, 0x0c26},
1310ddce71cSBard Liao 	{0x0092, 0x0073},
1320ddce71cSBard Liao 	{0x0093, 0x0000},
1330ddce71cSBard Liao 	{0x0094, 0x0080},
1340ddce71cSBard Liao 	{0x0098, 0x0000},
1350ddce71cSBard Liao 	{0x009a, 0x0000},
1360ddce71cSBard Liao 	{0x009b, 0x0000},
1370ddce71cSBard Liao 	{0x009c, 0x0000},
1380ddce71cSBard Liao 	{0x009d, 0x0000},
1390ddce71cSBard Liao 	{0x009e, 0x100c},
1400ddce71cSBard Liao 	{0x009f, 0x0000},
1410ddce71cSBard Liao 	{0x00a0, 0x0000},
1420ddce71cSBard Liao 	{0x00a3, 0x0002},
1430ddce71cSBard Liao 	{0x00a4, 0x0001},
1440ddce71cSBard Liao 	{0x00ae, 0x2040},
1450ddce71cSBard Liao 	{0x00af, 0x0000},
1460ddce71cSBard Liao 	{0x00b6, 0x0000},
1470ddce71cSBard Liao 	{0x00b7, 0x0000},
1480ddce71cSBard Liao 	{0x00b8, 0x0000},
1490ddce71cSBard Liao 	{0x00b9, 0x0002},
1500ddce71cSBard Liao 	{0x00be, 0x0000},
1510ddce71cSBard Liao 	{0x00c0, 0x0160},
1520ddce71cSBard Liao 	{0x00c1, 0x82a0},
1530ddce71cSBard Liao 	{0x00c2, 0x0000},
1540ddce71cSBard Liao 	{0x00d0, 0x0000},
1550ddce71cSBard Liao 	{0x00d1, 0x2244},
1560ddce71cSBard Liao 	{0x00d2, 0x3300},
1570ddce71cSBard Liao 	{0x00d3, 0x2200},
1580ddce71cSBard Liao 	{0x00d4, 0x0000},
1590ddce71cSBard Liao 	{0x00d9, 0x0009},
1600ddce71cSBard Liao 	{0x00da, 0x0000},
1610ddce71cSBard Liao 	{0x00db, 0x0000},
1620ddce71cSBard Liao 	{0x00dc, 0x00c0},
1630ddce71cSBard Liao 	{0x00dd, 0x2220},
1640ddce71cSBard Liao 	{0x00de, 0x3131},
1650ddce71cSBard Liao 	{0x00df, 0x3131},
1660ddce71cSBard Liao 	{0x00e0, 0x3131},
1670ddce71cSBard Liao 	{0x00e2, 0x0000},
1680ddce71cSBard Liao 	{0x00e3, 0x4000},
1690ddce71cSBard Liao 	{0x00e4, 0x0aa0},
1700ddce71cSBard Liao 	{0x00e5, 0x3131},
1710ddce71cSBard Liao 	{0x00e6, 0x3131},
1720ddce71cSBard Liao 	{0x00e7, 0x3131},
1730ddce71cSBard Liao 	{0x00e8, 0x3131},
1740ddce71cSBard Liao 	{0x00ea, 0xb320},
1750ddce71cSBard Liao 	{0x00eb, 0x0000},
1760ddce71cSBard Liao 	{0x00f0, 0x0000},
1770ddce71cSBard Liao 	{0x00f1, 0x00d0},
1780ddce71cSBard Liao 	{0x00f2, 0x00d0},
1790ddce71cSBard Liao 	{0x00f6, 0x0000},
1800ddce71cSBard Liao 	{0x00fa, 0x0000},
1810ddce71cSBard Liao 	{0x00fb, 0x0000},
1820ddce71cSBard Liao 	{0x00fc, 0x0000},
1830ddce71cSBard Liao 	{0x00fd, 0x0000},
1840ddce71cSBard Liao 	{0x00fe, 0x10ec},
1850ddce71cSBard Liao 	{0x00ff, 0x6530},
1860ddce71cSBard Liao 	{0x0100, 0xa0a0},
1870ddce71cSBard Liao 	{0x010b, 0x0000},
1880ddce71cSBard Liao 	{0x010c, 0xae00},
1890ddce71cSBard Liao 	{0x010d, 0xaaa0},
1900ddce71cSBard Liao 	{0x010e, 0x8aa2},
1910ddce71cSBard Liao 	{0x010f, 0x02a2},
1920ddce71cSBard Liao 	{0x0110, 0xc000},
1930ddce71cSBard Liao 	{0x0111, 0x04a2},
1940ddce71cSBard Liao 	{0x0112, 0x2800},
1950ddce71cSBard Liao 	{0x0113, 0x0000},
1960ddce71cSBard Liao 	{0x0117, 0x0100},
1970ddce71cSBard Liao 	{0x0125, 0x0410},
1980ddce71cSBard Liao 	{0x0132, 0x6026},
1990ddce71cSBard Liao 	{0x0136, 0x5555},
2000ddce71cSBard Liao 	{0x0138, 0x3700},
2010ddce71cSBard Liao 	{0x013a, 0x2000},
2020ddce71cSBard Liao 	{0x013b, 0x2000},
2030ddce71cSBard Liao 	{0x013c, 0x2005},
2040ddce71cSBard Liao 	{0x013f, 0x0000},
2050ddce71cSBard Liao 	{0x0142, 0x0000},
2060ddce71cSBard Liao 	{0x0145, 0x0002},
2070ddce71cSBard Liao 	{0x0146, 0x0000},
2080ddce71cSBard Liao 	{0x0147, 0x0000},
2090ddce71cSBard Liao 	{0x0148, 0x0000},
2100ddce71cSBard Liao 	{0x0149, 0x0000},
2110ddce71cSBard Liao 	{0x0150, 0x79a1},
2120c48a653Sderek.fang 	{0x0156, 0xaaaa},
2130ddce71cSBard Liao 	{0x0160, 0x4ec0},
2140ddce71cSBard Liao 	{0x0161, 0x0080},
2150ddce71cSBard Liao 	{0x0162, 0x0200},
2160ddce71cSBard Liao 	{0x0163, 0x0800},
2170ddce71cSBard Liao 	{0x0164, 0x0000},
2180ddce71cSBard Liao 	{0x0165, 0x0000},
2190ddce71cSBard Liao 	{0x0166, 0x0000},
2200ddce71cSBard Liao 	{0x0167, 0x000f},
2210ddce71cSBard Liao 	{0x0168, 0x000f},
2220ddce71cSBard Liao 	{0x0169, 0x0021},
2230ddce71cSBard Liao 	{0x0190, 0x413d},
2240ddce71cSBard Liao 	{0x0194, 0x0000},
2250ddce71cSBard Liao 	{0x0195, 0x0000},
2260ddce71cSBard Liao 	{0x0197, 0x0022},
2270ddce71cSBard Liao 	{0x0198, 0x0000},
2280ddce71cSBard Liao 	{0x0199, 0x0000},
2290ddce71cSBard Liao 	{0x01af, 0x0000},
2300ddce71cSBard Liao 	{0x01b0, 0x0400},
2310ddce71cSBard Liao 	{0x01b1, 0x0000},
2320ddce71cSBard Liao 	{0x01b2, 0x0000},
2330ddce71cSBard Liao 	{0x01b3, 0x0000},
2340ddce71cSBard Liao 	{0x01b4, 0x0000},
2350ddce71cSBard Liao 	{0x01b5, 0x0000},
2360ddce71cSBard Liao 	{0x01b6, 0x01c3},
2370ddce71cSBard Liao 	{0x01b7, 0x02a0},
2380ddce71cSBard Liao 	{0x01b8, 0x03e9},
2390ddce71cSBard Liao 	{0x01b9, 0x1389},
2400ddce71cSBard Liao 	{0x01ba, 0xc351},
2410ddce71cSBard Liao 	{0x01bb, 0x0009},
2420ddce71cSBard Liao 	{0x01bc, 0x0018},
2430ddce71cSBard Liao 	{0x01bd, 0x002a},
2440ddce71cSBard Liao 	{0x01be, 0x004c},
2450ddce71cSBard Liao 	{0x01bf, 0x0097},
2460ddce71cSBard Liao 	{0x01c0, 0x433d},
2470ddce71cSBard Liao 	{0x01c2, 0x0000},
2480ddce71cSBard Liao 	{0x01c3, 0x0000},
2490ddce71cSBard Liao 	{0x01c4, 0x0000},
2500ddce71cSBard Liao 	{0x01c5, 0x0000},
2510ddce71cSBard Liao 	{0x01c6, 0x0000},
2520ddce71cSBard Liao 	{0x01c7, 0x0000},
2530ddce71cSBard Liao 	{0x01c8, 0x40af},
2540ddce71cSBard Liao 	{0x01c9, 0x0702},
2550ddce71cSBard Liao 	{0x01ca, 0x0000},
2560ddce71cSBard Liao 	{0x01cb, 0x0000},
2570ddce71cSBard Liao 	{0x01cc, 0x5757},
2580ddce71cSBard Liao 	{0x01cd, 0x5757},
2590ddce71cSBard Liao 	{0x01ce, 0x5757},
2600ddce71cSBard Liao 	{0x01cf, 0x5757},
2610ddce71cSBard Liao 	{0x01d0, 0x5757},
2620ddce71cSBard Liao 	{0x01d1, 0x5757},
2630ddce71cSBard Liao 	{0x01d2, 0x5757},
2640ddce71cSBard Liao 	{0x01d3, 0x5757},
2650ddce71cSBard Liao 	{0x01d4, 0x5757},
2660ddce71cSBard Liao 	{0x01d5, 0x5757},
2670ddce71cSBard Liao 	{0x01d6, 0x0000},
2680ddce71cSBard Liao 	{0x01d7, 0x0008},
2690ddce71cSBard Liao 	{0x01d8, 0x0029},
2700ddce71cSBard Liao 	{0x01d9, 0x3333},
2710ddce71cSBard Liao 	{0x01da, 0x0000},
2720ddce71cSBard Liao 	{0x01db, 0x0004},
2730ddce71cSBard Liao 	{0x01dc, 0x0000},
2740ddce71cSBard Liao 	{0x01de, 0x7c00},
2750ddce71cSBard Liao 	{0x01df, 0x0320},
2760ddce71cSBard Liao 	{0x01e0, 0x06a1},
2770ddce71cSBard Liao 	{0x01e1, 0x0000},
2780ddce71cSBard Liao 	{0x01e2, 0x0000},
2790ddce71cSBard Liao 	{0x01e3, 0x0000},
2800ddce71cSBard Liao 	{0x01e4, 0x0000},
2810ddce71cSBard Liao 	{0x01e6, 0x0001},
2820ddce71cSBard Liao 	{0x01e7, 0x0000},
2830ddce71cSBard Liao 	{0x01e8, 0x0000},
2840ddce71cSBard Liao 	{0x01ea, 0x0000},
2850ddce71cSBard Liao 	{0x01eb, 0x0000},
2860ddce71cSBard Liao 	{0x01ec, 0x0000},
2870ddce71cSBard Liao 	{0x01ed, 0x0000},
2880ddce71cSBard Liao 	{0x01ee, 0x0000},
2890ddce71cSBard Liao 	{0x01ef, 0x0000},
2900ddce71cSBard Liao 	{0x01f0, 0x0000},
2910ddce71cSBard Liao 	{0x01f1, 0x0000},
2920ddce71cSBard Liao 	{0x01f2, 0x0000},
2930ddce71cSBard Liao 	{0x01f3, 0x0000},
2940ddce71cSBard Liao 	{0x01f4, 0x0000},
2950ddce71cSBard Liao 	{0x0210, 0x6297},
2960ddce71cSBard Liao 	{0x0211, 0xa005},
2970ddce71cSBard Liao 	{0x0212, 0x824c},
2980ddce71cSBard Liao 	{0x0213, 0xf7ff},
2990ddce71cSBard Liao 	{0x0214, 0xf24c},
3000ddce71cSBard Liao 	{0x0215, 0x0102},
3010ddce71cSBard Liao 	{0x0216, 0x00a3},
3020ddce71cSBard Liao 	{0x0217, 0x0048},
3030ddce71cSBard Liao 	{0x0218, 0xa2c0},
3040ddce71cSBard Liao 	{0x0219, 0x0400},
3050ddce71cSBard Liao 	{0x021a, 0x00c8},
3060ddce71cSBard Liao 	{0x021b, 0x00c0},
3070ddce71cSBard Liao 	{0x021c, 0x0000},
3080ddce71cSBard Liao 	{0x0250, 0x4500},
3090ddce71cSBard Liao 	{0x0251, 0x40b3},
3100ddce71cSBard Liao 	{0x0252, 0x0000},
3110ddce71cSBard Liao 	{0x0253, 0x0000},
3120ddce71cSBard Liao 	{0x0254, 0x0000},
3130ddce71cSBard Liao 	{0x0255, 0x0000},
3140ddce71cSBard Liao 	{0x0256, 0x0000},
3150ddce71cSBard Liao 	{0x0257, 0x0000},
3160ddce71cSBard Liao 	{0x0258, 0x0000},
3170ddce71cSBard Liao 	{0x0259, 0x0000},
3180ddce71cSBard Liao 	{0x025a, 0x0005},
3190ddce71cSBard Liao 	{0x0270, 0x0000},
3200ddce71cSBard Liao 	{0x02ff, 0x0110},
3210ddce71cSBard Liao 	{0x0300, 0x001f},
3220ddce71cSBard Liao 	{0x0301, 0x032c},
3230ddce71cSBard Liao 	{0x0302, 0x5f21},
3240ddce71cSBard Liao 	{0x0303, 0x4000},
3250ddce71cSBard Liao 	{0x0304, 0x4000},
3260ddce71cSBard Liao 	{0x0305, 0x06d5},
3270ddce71cSBard Liao 	{0x0306, 0x8000},
3280ddce71cSBard Liao 	{0x0307, 0x0700},
3290ddce71cSBard Liao 	{0x0310, 0x4560},
3300ddce71cSBard Liao 	{0x0311, 0xa4a8},
3310ddce71cSBard Liao 	{0x0312, 0x7418},
3320ddce71cSBard Liao 	{0x0313, 0x0000},
3330ddce71cSBard Liao 	{0x0314, 0x0006},
3340ddce71cSBard Liao 	{0x0315, 0xffff},
3350ddce71cSBard Liao 	{0x0316, 0xc400},
3360ddce71cSBard Liao 	{0x0317, 0x0000},
3370ddce71cSBard Liao 	{0x03c0, 0x7e00},
3380ddce71cSBard Liao 	{0x03c1, 0x8000},
3390ddce71cSBard Liao 	{0x03c2, 0x8000},
3400ddce71cSBard Liao 	{0x03c3, 0x8000},
3410ddce71cSBard Liao 	{0x03c4, 0x8000},
3420ddce71cSBard Liao 	{0x03c5, 0x8000},
3430ddce71cSBard Liao 	{0x03c6, 0x8000},
3440ddce71cSBard Liao 	{0x03c7, 0x8000},
3450ddce71cSBard Liao 	{0x03c8, 0x8000},
3460ddce71cSBard Liao 	{0x03c9, 0x8000},
3470ddce71cSBard Liao 	{0x03ca, 0x8000},
3480ddce71cSBard Liao 	{0x03cb, 0x8000},
3490ddce71cSBard Liao 	{0x03cc, 0x8000},
3500ddce71cSBard Liao 	{0x03d0, 0x0000},
3510ddce71cSBard Liao 	{0x03d1, 0x0000},
3520ddce71cSBard Liao 	{0x03d2, 0x0000},
3530ddce71cSBard Liao 	{0x03d3, 0x0000},
3540ddce71cSBard Liao 	{0x03d4, 0x2000},
3550ddce71cSBard Liao 	{0x03d5, 0x2000},
3560ddce71cSBard Liao 	{0x03d6, 0x0000},
3570ddce71cSBard Liao 	{0x03d7, 0x0000},
3580ddce71cSBard Liao 	{0x03d8, 0x2000},
3590ddce71cSBard Liao 	{0x03d9, 0x2000},
3600ddce71cSBard Liao 	{0x03da, 0x2000},
3610ddce71cSBard Liao 	{0x03db, 0x2000},
3620ddce71cSBard Liao 	{0x03dc, 0x0000},
3630ddce71cSBard Liao 	{0x03dd, 0x0000},
3640ddce71cSBard Liao 	{0x03de, 0x0000},
3650ddce71cSBard Liao 	{0x03df, 0x2000},
3660ddce71cSBard Liao 	{0x03e0, 0x0000},
3670ddce71cSBard Liao 	{0x03e1, 0x0000},
3680ddce71cSBard Liao 	{0x03e2, 0x0000},
3690ddce71cSBard Liao 	{0x03e3, 0x0000},
3700ddce71cSBard Liao 	{0x03e4, 0x0000},
3710ddce71cSBard Liao 	{0x03e5, 0x0000},
3720ddce71cSBard Liao 	{0x03e6, 0x0000},
3730ddce71cSBard Liao 	{0x03e7, 0x0000},
3740ddce71cSBard Liao 	{0x03e8, 0x0000},
3750ddce71cSBard Liao 	{0x03e9, 0x0000},
3760ddce71cSBard Liao 	{0x03ea, 0x0000},
3770ddce71cSBard Liao 	{0x03eb, 0x0000},
3780ddce71cSBard Liao 	{0x03ec, 0x0000},
3790ddce71cSBard Liao 	{0x03ed, 0x0000},
3800ddce71cSBard Liao 	{0x03ee, 0x0000},
3810ddce71cSBard Liao 	{0x03ef, 0x0000},
3820ddce71cSBard Liao 	{0x03f0, 0x0800},
3830ddce71cSBard Liao 	{0x03f1, 0x0800},
3840ddce71cSBard Liao 	{0x03f2, 0x0800},
3850ddce71cSBard Liao 	{0x03f3, 0x0800},
3860ddce71cSBard Liao };
387a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_reg);
3880ddce71cSBard Liao 
rt5682_volatile_register(struct device * dev,unsigned int reg)389a50067d4SArnd Bergmann bool rt5682_volatile_register(struct device *dev, unsigned int reg)
3900ddce71cSBard Liao {
3910ddce71cSBard Liao 	switch (reg) {
3920ddce71cSBard Liao 	case RT5682_RESET:
3930ddce71cSBard Liao 	case RT5682_CBJ_CTRL_2:
3940ddce71cSBard Liao 	case RT5682_INT_ST_1:
3950ddce71cSBard Liao 	case RT5682_4BTN_IL_CMD_1:
3960ddce71cSBard Liao 	case RT5682_AJD1_CTRL:
3970ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_1:
3980ddce71cSBard Liao 	case RT5682_DEVICE_ID:
3990ddce71cSBard Liao 	case RT5682_I2C_MODE:
4000ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_10:
4010ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_2:
4020ddce71cSBard Liao 	case RT5682_JD_TOP_VC_VTRL:
4030ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_19:
4040ddce71cSBard Liao 	case RT5682_IL_CMD_1:
4050ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_2:
4060ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_4:
4070ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_10:
4080ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_11:
4090ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_6...RT5682_EFUSE_CTRL_11:
4100ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_1...RT5682_HP_CALIB_STA_11:
4110ddce71cSBard Liao 		return true;
4120ddce71cSBard Liao 	default:
4130ddce71cSBard Liao 		return false;
4140ddce71cSBard Liao 	}
4150ddce71cSBard Liao }
416a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_volatile_register);
4170ddce71cSBard Liao 
rt5682_readable_register(struct device * dev,unsigned int reg)418a50067d4SArnd Bergmann bool rt5682_readable_register(struct device *dev, unsigned int reg)
4190ddce71cSBard Liao {
4200ddce71cSBard Liao 	switch (reg) {
4210ddce71cSBard Liao 	case RT5682_RESET:
4220ddce71cSBard Liao 	case RT5682_VERSION_ID:
4230ddce71cSBard Liao 	case RT5682_VENDOR_ID:
4240ddce71cSBard Liao 	case RT5682_DEVICE_ID:
4250ddce71cSBard Liao 	case RT5682_HP_CTRL_1:
4260ddce71cSBard Liao 	case RT5682_HP_CTRL_2:
4270ddce71cSBard Liao 	case RT5682_HPL_GAIN:
4280ddce71cSBard Liao 	case RT5682_HPR_GAIN:
4290ddce71cSBard Liao 	case RT5682_I2C_CTRL:
4300ddce71cSBard Liao 	case RT5682_CBJ_BST_CTRL:
4310ddce71cSBard Liao 	case RT5682_CBJ_CTRL_1:
4320ddce71cSBard Liao 	case RT5682_CBJ_CTRL_2:
4330ddce71cSBard Liao 	case RT5682_CBJ_CTRL_3:
4340ddce71cSBard Liao 	case RT5682_CBJ_CTRL_4:
4350ddce71cSBard Liao 	case RT5682_CBJ_CTRL_5:
4360ddce71cSBard Liao 	case RT5682_CBJ_CTRL_6:
4370ddce71cSBard Liao 	case RT5682_CBJ_CTRL_7:
4380ddce71cSBard Liao 	case RT5682_DAC1_DIG_VOL:
4390ddce71cSBard Liao 	case RT5682_STO1_ADC_DIG_VOL:
4400ddce71cSBard Liao 	case RT5682_STO1_ADC_BOOST:
4410ddce71cSBard Liao 	case RT5682_HP_IMP_GAIN_1:
4420ddce71cSBard Liao 	case RT5682_HP_IMP_GAIN_2:
4430ddce71cSBard Liao 	case RT5682_SIDETONE_CTRL:
4440ddce71cSBard Liao 	case RT5682_STO1_ADC_MIXER:
4450ddce71cSBard Liao 	case RT5682_AD_DA_MIXER:
4460ddce71cSBard Liao 	case RT5682_STO1_DAC_MIXER:
4470ddce71cSBard Liao 	case RT5682_A_DAC1_MUX:
4480ddce71cSBard Liao 	case RT5682_DIG_INF2_DATA:
4490ddce71cSBard Liao 	case RT5682_REC_MIXER:
4500ddce71cSBard Liao 	case RT5682_CAL_REC:
4510ddce71cSBard Liao 	case RT5682_ALC_BACK_GAIN:
4520ddce71cSBard Liao 	case RT5682_PWR_DIG_1:
4530ddce71cSBard Liao 	case RT5682_PWR_DIG_2:
4540ddce71cSBard Liao 	case RT5682_PWR_ANLG_1:
4550ddce71cSBard Liao 	case RT5682_PWR_ANLG_2:
4560ddce71cSBard Liao 	case RT5682_PWR_ANLG_3:
4570ddce71cSBard Liao 	case RT5682_PWR_MIXER:
4580ddce71cSBard Liao 	case RT5682_PWR_VOL:
4590ddce71cSBard Liao 	case RT5682_CLK_DET:
4600ddce71cSBard Liao 	case RT5682_RESET_LPF_CTRL:
4610ddce71cSBard Liao 	case RT5682_RESET_HPF_CTRL:
4620ddce71cSBard Liao 	case RT5682_DMIC_CTRL_1:
4630ddce71cSBard Liao 	case RT5682_I2S1_SDP:
4640ddce71cSBard Liao 	case RT5682_I2S2_SDP:
4650ddce71cSBard Liao 	case RT5682_ADDA_CLK_1:
4660ddce71cSBard Liao 	case RT5682_ADDA_CLK_2:
4670ddce71cSBard Liao 	case RT5682_I2S1_F_DIV_CTRL_1:
4680ddce71cSBard Liao 	case RT5682_I2S1_F_DIV_CTRL_2:
4690ddce71cSBard Liao 	case RT5682_TDM_CTRL:
4700ddce71cSBard Liao 	case RT5682_TDM_ADDA_CTRL_1:
4710ddce71cSBard Liao 	case RT5682_TDM_ADDA_CTRL_2:
4720ddce71cSBard Liao 	case RT5682_DATA_SEL_CTRL_1:
4730ddce71cSBard Liao 	case RT5682_TDM_TCON_CTRL:
4740ddce71cSBard Liao 	case RT5682_GLB_CLK:
4750ddce71cSBard Liao 	case RT5682_PLL_CTRL_1:
4760ddce71cSBard Liao 	case RT5682_PLL_CTRL_2:
4770ddce71cSBard Liao 	case RT5682_PLL_TRACK_1:
4780ddce71cSBard Liao 	case RT5682_PLL_TRACK_2:
4790ddce71cSBard Liao 	case RT5682_PLL_TRACK_3:
4800ddce71cSBard Liao 	case RT5682_PLL_TRACK_4:
4810ddce71cSBard Liao 	case RT5682_PLL_TRACK_5:
4820ddce71cSBard Liao 	case RT5682_PLL_TRACK_6:
4830ddce71cSBard Liao 	case RT5682_PLL_TRACK_11:
4840ddce71cSBard Liao 	case RT5682_SDW_REF_CLK:
4850ddce71cSBard Liao 	case RT5682_DEPOP_1:
4860ddce71cSBard Liao 	case RT5682_DEPOP_2:
4870ddce71cSBard Liao 	case RT5682_HP_CHARGE_PUMP_1:
4880ddce71cSBard Liao 	case RT5682_HP_CHARGE_PUMP_2:
4890ddce71cSBard Liao 	case RT5682_MICBIAS_1:
4900ddce71cSBard Liao 	case RT5682_MICBIAS_2:
4910ddce71cSBard Liao 	case RT5682_PLL_TRACK_12:
4920ddce71cSBard Liao 	case RT5682_PLL_TRACK_14:
4930ddce71cSBard Liao 	case RT5682_PLL2_CTRL_1:
4940ddce71cSBard Liao 	case RT5682_PLL2_CTRL_2:
4950ddce71cSBard Liao 	case RT5682_PLL2_CTRL_3:
4960ddce71cSBard Liao 	case RT5682_PLL2_CTRL_4:
4970ddce71cSBard Liao 	case RT5682_RC_CLK_CTRL:
4980ddce71cSBard Liao 	case RT5682_I2S_M_CLK_CTRL_1:
4990ddce71cSBard Liao 	case RT5682_I2S2_F_DIV_CTRL_1:
5000ddce71cSBard Liao 	case RT5682_I2S2_F_DIV_CTRL_2:
5010ddce71cSBard Liao 	case RT5682_EQ_CTRL_1:
5020ddce71cSBard Liao 	case RT5682_EQ_CTRL_2:
5030ddce71cSBard Liao 	case RT5682_IRQ_CTRL_1:
5040ddce71cSBard Liao 	case RT5682_IRQ_CTRL_2:
5050ddce71cSBard Liao 	case RT5682_IRQ_CTRL_3:
5060ddce71cSBard Liao 	case RT5682_IRQ_CTRL_4:
5070ddce71cSBard Liao 	case RT5682_INT_ST_1:
5080ddce71cSBard Liao 	case RT5682_GPIO_CTRL_1:
5090ddce71cSBard Liao 	case RT5682_GPIO_CTRL_2:
5100ddce71cSBard Liao 	case RT5682_GPIO_CTRL_3:
5110ddce71cSBard Liao 	case RT5682_HP_AMP_DET_CTRL_1:
5120ddce71cSBard Liao 	case RT5682_HP_AMP_DET_CTRL_2:
5130ddce71cSBard Liao 	case RT5682_MID_HP_AMP_DET:
5140ddce71cSBard Liao 	case RT5682_LOW_HP_AMP_DET:
5150ddce71cSBard Liao 	case RT5682_DELAY_BUF_CTRL:
5160ddce71cSBard Liao 	case RT5682_SV_ZCD_1:
5170ddce71cSBard Liao 	case RT5682_SV_ZCD_2:
5180ddce71cSBard Liao 	case RT5682_IL_CMD_1:
5190ddce71cSBard Liao 	case RT5682_IL_CMD_2:
5200ddce71cSBard Liao 	case RT5682_IL_CMD_3:
5210ddce71cSBard Liao 	case RT5682_IL_CMD_4:
5220ddce71cSBard Liao 	case RT5682_IL_CMD_5:
5230ddce71cSBard Liao 	case RT5682_IL_CMD_6:
5240ddce71cSBard Liao 	case RT5682_4BTN_IL_CMD_1:
5250ddce71cSBard Liao 	case RT5682_4BTN_IL_CMD_2:
5260ddce71cSBard Liao 	case RT5682_4BTN_IL_CMD_3:
5270ddce71cSBard Liao 	case RT5682_4BTN_IL_CMD_4:
5280ddce71cSBard Liao 	case RT5682_4BTN_IL_CMD_5:
5290ddce71cSBard Liao 	case RT5682_4BTN_IL_CMD_6:
5300ddce71cSBard Liao 	case RT5682_4BTN_IL_CMD_7:
5310ddce71cSBard Liao 	case RT5682_ADC_STO1_HP_CTRL_1:
5320ddce71cSBard Liao 	case RT5682_ADC_STO1_HP_CTRL_2:
5330ddce71cSBard Liao 	case RT5682_AJD1_CTRL:
5340ddce71cSBard Liao 	case RT5682_JD1_THD:
5350ddce71cSBard Liao 	case RT5682_JD2_THD:
5360ddce71cSBard Liao 	case RT5682_JD_CTRL_1:
5370ddce71cSBard Liao 	case RT5682_DUMMY_1:
5380ddce71cSBard Liao 	case RT5682_DUMMY_2:
5390ddce71cSBard Liao 	case RT5682_DUMMY_3:
5400ddce71cSBard Liao 	case RT5682_DAC_ADC_DIG_VOL1:
5410ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_2:
5420ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_3:
5430ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_4:
5440ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_5:
5450ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_6:
5460ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_7:
5470ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_8:
5480ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_9:
5490ddce71cSBard Liao 	case RT5682_BIAS_CUR_CTRL_10:
5500ddce71cSBard Liao 	case RT5682_VREF_REC_OP_FB_CAP_CTRL:
5510ddce71cSBard Liao 	case RT5682_CHARGE_PUMP_1:
5520ddce71cSBard Liao 	case RT5682_DIG_IN_CTRL_1:
5530ddce71cSBard Liao 	case RT5682_PAD_DRIVING_CTRL:
5540ddce71cSBard Liao 	case RT5682_SOFT_RAMP_DEPOP:
5550ddce71cSBard Liao 	case RT5682_CHOP_DAC:
5560ddce71cSBard Liao 	case RT5682_CHOP_ADC:
5570ddce71cSBard Liao 	case RT5682_CALIB_ADC_CTRL:
5580ddce71cSBard Liao 	case RT5682_VOL_TEST:
5590ddce71cSBard Liao 	case RT5682_SPKVDD_DET_STA:
5600ddce71cSBard Liao 	case RT5682_TEST_MODE_CTRL_1:
5610ddce71cSBard Liao 	case RT5682_TEST_MODE_CTRL_2:
5620ddce71cSBard Liao 	case RT5682_TEST_MODE_CTRL_3:
5630ddce71cSBard Liao 	case RT5682_TEST_MODE_CTRL_4:
5640ddce71cSBard Liao 	case RT5682_TEST_MODE_CTRL_5:
5650ddce71cSBard Liao 	case RT5682_PLL1_INTERNAL:
5660ddce71cSBard Liao 	case RT5682_PLL2_INTERNAL:
5670ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_1:
5680ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_2:
5690ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_3:
5700ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_4:
5710ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_5:
5720ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_6:
5730ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_7:
5740ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_8:
5750ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_9:
5760ddce71cSBard Liao 	case RT5682_STO_NG2_CTRL_10:
5770ddce71cSBard Liao 	case RT5682_STO1_DAC_SIL_DET:
5780ddce71cSBard Liao 	case RT5682_SIL_PSV_CTRL1:
5790ddce71cSBard Liao 	case RT5682_SIL_PSV_CTRL2:
5800ddce71cSBard Liao 	case RT5682_SIL_PSV_CTRL3:
5810ddce71cSBard Liao 	case RT5682_SIL_PSV_CTRL4:
5820ddce71cSBard Liao 	case RT5682_SIL_PSV_CTRL5:
5830ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_01:
5840ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_02:
5850ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_03:
5860ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_04:
5870ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_05:
5880ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_06:
5890ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_07:
5900ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_08:
5910ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_09:
5920ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_10:
5930ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_11:
5940ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_12:
5950ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_13:
5960ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_14:
5970ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_15:
5980ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_16:
5990ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_17:
6000ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_18:
6010ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_19:
6020ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_20:
6030ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_21:
6040ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_22:
6050ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_23:
6060ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_24:
6070ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_25:
6080ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_26:
6090ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_27:
6100ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_28:
6110ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_29:
6120ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_30:
6130ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_31:
6140ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_32:
6150ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_33:
6160ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_34:
6170ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_35:
6180ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_36:
6190ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_37:
6200ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_38:
6210ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_39:
6220ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_40:
6230ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_41:
6240ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_42:
6250ddce71cSBard Liao 	case RT5682_HP_IMP_SENS_CTRL_43:
6260ddce71cSBard Liao 	case RT5682_HP_LOGIC_CTRL_1:
6270ddce71cSBard Liao 	case RT5682_HP_LOGIC_CTRL_2:
6280ddce71cSBard Liao 	case RT5682_HP_LOGIC_CTRL_3:
6290ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_1:
6300ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_2:
6310ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_3:
6320ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_4:
6330ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_5:
6340ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_6:
6350ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_7:
6360ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_9:
6370ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_10:
6380ddce71cSBard Liao 	case RT5682_HP_CALIB_CTRL_11:
6390ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_1:
6400ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_2:
6410ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_3:
6420ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_4:
6430ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_5:
6440ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_6:
6450ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_7:
6460ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_8:
6470ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_9:
6480ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_10:
6490ddce71cSBard Liao 	case RT5682_HP_CALIB_STA_11:
6500ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_1:
6510ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_2:
6520ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_3:
6530ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_4:
6540ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_5:
6550ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_6:
6560ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_7:
6570ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_8:
6580ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_9:
6590ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_10:
6600ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_11:
6610ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_12:
6620ddce71cSBard Liao 	case RT5682_SAR_IL_CMD_13:
6630ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_1:
6640ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_2:
6650ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_3:
6660ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_4:
6670ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_5:
6680ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_6:
6690ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_7:
6700ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_8:
6710ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_9:
6720ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_10:
6730ddce71cSBard Liao 	case RT5682_EFUSE_CTRL_11:
6740ddce71cSBard Liao 	case RT5682_JD_TOP_VC_VTRL:
6750ddce71cSBard Liao 	case RT5682_DRC1_CTRL_0:
6760ddce71cSBard Liao 	case RT5682_DRC1_CTRL_1:
6770ddce71cSBard Liao 	case RT5682_DRC1_CTRL_2:
6780ddce71cSBard Liao 	case RT5682_DRC1_CTRL_3:
6790ddce71cSBard Liao 	case RT5682_DRC1_CTRL_4:
6800ddce71cSBard Liao 	case RT5682_DRC1_CTRL_5:
6810ddce71cSBard Liao 	case RT5682_DRC1_CTRL_6:
6820ddce71cSBard Liao 	case RT5682_DRC1_HARD_LMT_CTRL_1:
6830ddce71cSBard Liao 	case RT5682_DRC1_HARD_LMT_CTRL_2:
6840ddce71cSBard Liao 	case RT5682_DRC1_PRIV_1:
6850ddce71cSBard Liao 	case RT5682_DRC1_PRIV_2:
6860ddce71cSBard Liao 	case RT5682_DRC1_PRIV_3:
6870ddce71cSBard Liao 	case RT5682_DRC1_PRIV_4:
6880ddce71cSBard Liao 	case RT5682_DRC1_PRIV_5:
6890ddce71cSBard Liao 	case RT5682_DRC1_PRIV_6:
6900ddce71cSBard Liao 	case RT5682_DRC1_PRIV_7:
6910ddce71cSBard Liao 	case RT5682_DRC1_PRIV_8:
6920ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL1:
6930ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL2:
6940ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL3:
6950ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL4:
6960ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL5:
6970ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL6:
6980ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL7:
6990ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL8:
7000ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL9:
7010ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL10:
7020ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL11:
7030ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL12:
7040ddce71cSBard Liao 	case RT5682_EQ_AUTO_RCV_CTRL13:
7050ddce71cSBard Liao 	case RT5682_ADC_L_EQ_LPF1_A1:
7060ddce71cSBard Liao 	case RT5682_R_EQ_LPF1_A1:
7070ddce71cSBard Liao 	case RT5682_L_EQ_LPF1_H0:
7080ddce71cSBard Liao 	case RT5682_R_EQ_LPF1_H0:
7090ddce71cSBard Liao 	case RT5682_L_EQ_BPF1_A1:
7100ddce71cSBard Liao 	case RT5682_R_EQ_BPF1_A1:
7110ddce71cSBard Liao 	case RT5682_L_EQ_BPF1_A2:
7120ddce71cSBard Liao 	case RT5682_R_EQ_BPF1_A2:
7130ddce71cSBard Liao 	case RT5682_L_EQ_BPF1_H0:
7140ddce71cSBard Liao 	case RT5682_R_EQ_BPF1_H0:
7150ddce71cSBard Liao 	case RT5682_L_EQ_BPF2_A1:
7160ddce71cSBard Liao 	case RT5682_R_EQ_BPF2_A1:
7170ddce71cSBard Liao 	case RT5682_L_EQ_BPF2_A2:
7180ddce71cSBard Liao 	case RT5682_R_EQ_BPF2_A2:
7190ddce71cSBard Liao 	case RT5682_L_EQ_BPF2_H0:
7200ddce71cSBard Liao 	case RT5682_R_EQ_BPF2_H0:
7210ddce71cSBard Liao 	case RT5682_L_EQ_BPF3_A1:
7220ddce71cSBard Liao 	case RT5682_R_EQ_BPF3_A1:
7230ddce71cSBard Liao 	case RT5682_L_EQ_BPF3_A2:
7240ddce71cSBard Liao 	case RT5682_R_EQ_BPF3_A2:
7250ddce71cSBard Liao 	case RT5682_L_EQ_BPF3_H0:
7260ddce71cSBard Liao 	case RT5682_R_EQ_BPF3_H0:
7270ddce71cSBard Liao 	case RT5682_L_EQ_BPF4_A1:
7280ddce71cSBard Liao 	case RT5682_R_EQ_BPF4_A1:
7290ddce71cSBard Liao 	case RT5682_L_EQ_BPF4_A2:
7300ddce71cSBard Liao 	case RT5682_R_EQ_BPF4_A2:
7310ddce71cSBard Liao 	case RT5682_L_EQ_BPF4_H0:
7320ddce71cSBard Liao 	case RT5682_R_EQ_BPF4_H0:
7330ddce71cSBard Liao 	case RT5682_L_EQ_HPF1_A1:
7340ddce71cSBard Liao 	case RT5682_R_EQ_HPF1_A1:
7350ddce71cSBard Liao 	case RT5682_L_EQ_HPF1_H0:
7360ddce71cSBard Liao 	case RT5682_R_EQ_HPF1_H0:
7370ddce71cSBard Liao 	case RT5682_L_EQ_PRE_VOL:
7380ddce71cSBard Liao 	case RT5682_R_EQ_PRE_VOL:
7390ddce71cSBard Liao 	case RT5682_L_EQ_POST_VOL:
7400ddce71cSBard Liao 	case RT5682_R_EQ_POST_VOL:
7410ddce71cSBard Liao 	case RT5682_I2C_MODE:
7420ddce71cSBard Liao 		return true;
7430ddce71cSBard Liao 	default:
7440ddce71cSBard Liao 		return false;
7450ddce71cSBard Liao 	}
7460ddce71cSBard Liao }
747a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_readable_register);
7480ddce71cSBard Liao 
74975094877SShuming Fan static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
75075094877SShuming Fan static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
7510ddce71cSBard Liao static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
7520ddce71cSBard Liao 
7530ddce71cSBard Liao /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
7540ddce71cSBard Liao static const DECLARE_TLV_DB_RANGE(bst_tlv,
7550ddce71cSBard Liao 	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
7560ddce71cSBard Liao 	1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
7570ddce71cSBard Liao 	2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
7580ddce71cSBard Liao 	3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
7590ddce71cSBard Liao 	6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
7600ddce71cSBard Liao 	7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
7610ddce71cSBard Liao 	8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
7620ddce71cSBard Liao );
7630ddce71cSBard Liao 
7640ddce71cSBard Liao /* Interface data select */
7650ddce71cSBard Liao static const char * const rt5682_data_select[] = {
7660ddce71cSBard Liao 	"L/R", "R/L", "L/L", "R/R"
7670ddce71cSBard Liao };
7680ddce71cSBard Liao 
7690ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(rt5682_if2_adc_enum,
7700ddce71cSBard Liao 	RT5682_DIG_INF2_DATA, RT5682_IF2_ADC_SEL_SFT, rt5682_data_select);
7710ddce71cSBard Liao 
7720ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(rt5682_if1_01_adc_enum,
7730ddce71cSBard Liao 	RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC1_SEL_SFT, rt5682_data_select);
7740ddce71cSBard Liao 
7750ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(rt5682_if1_23_adc_enum,
7760ddce71cSBard Liao 	RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC2_SEL_SFT, rt5682_data_select);
7770ddce71cSBard Liao 
7780ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(rt5682_if1_45_adc_enum,
7790ddce71cSBard Liao 	RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC3_SEL_SFT, rt5682_data_select);
7800ddce71cSBard Liao 
7810ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(rt5682_if1_67_adc_enum,
7820ddce71cSBard Liao 	RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC4_SEL_SFT, rt5682_data_select);
7830ddce71cSBard Liao 
7840ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_if2_adc_swap_mux =
7850ddce71cSBard Liao 	SOC_DAPM_ENUM("IF2 ADC Swap Mux", rt5682_if2_adc_enum);
7860ddce71cSBard Liao 
7870ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_if1_01_adc_swap_mux =
7880ddce71cSBard Liao 	SOC_DAPM_ENUM("IF1 01 ADC Swap Mux", rt5682_if1_01_adc_enum);
7890ddce71cSBard Liao 
7900ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_if1_23_adc_swap_mux =
7910ddce71cSBard Liao 	SOC_DAPM_ENUM("IF1 23 ADC Swap Mux", rt5682_if1_23_adc_enum);
7920ddce71cSBard Liao 
7930ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_if1_45_adc_swap_mux =
7940ddce71cSBard Liao 	SOC_DAPM_ENUM("IF1 45 ADC Swap Mux", rt5682_if1_45_adc_enum);
7950ddce71cSBard Liao 
7960ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_if1_67_adc_swap_mux =
7970ddce71cSBard Liao 	SOC_DAPM_ENUM("IF1 67 ADC Swap Mux", rt5682_if1_67_adc_enum);
7980ddce71cSBard Liao 
79903f6fc6dSOder Chiou static const char * const rt5682_dac_select[] = {
80003f6fc6dSOder Chiou 	"IF1", "SOUND"
80103f6fc6dSOder Chiou };
80203f6fc6dSOder Chiou 
80303f6fc6dSOder Chiou static SOC_ENUM_SINGLE_DECL(rt5682_dacl_enum,
80403f6fc6dSOder Chiou 	RT5682_AD_DA_MIXER, RT5682_DAC1_L_SEL_SFT, rt5682_dac_select);
80503f6fc6dSOder Chiou 
80603f6fc6dSOder Chiou static const struct snd_kcontrol_new rt5682_dac_l_mux =
80703f6fc6dSOder Chiou 	SOC_DAPM_ENUM("DAC L Mux", rt5682_dacl_enum);
80803f6fc6dSOder Chiou 
80903f6fc6dSOder Chiou static SOC_ENUM_SINGLE_DECL(rt5682_dacr_enum,
81003f6fc6dSOder Chiou 	RT5682_AD_DA_MIXER, RT5682_DAC1_R_SEL_SFT, rt5682_dac_select);
81103f6fc6dSOder Chiou 
81203f6fc6dSOder Chiou static const struct snd_kcontrol_new rt5682_dac_r_mux =
81303f6fc6dSOder Chiou 	SOC_DAPM_ENUM("DAC R Mux", rt5682_dacr_enum);
81403f6fc6dSOder Chiou 
rt5682_reset(struct rt5682_priv * rt5682)815a50067d4SArnd Bergmann void rt5682_reset(struct rt5682_priv *rt5682)
8160ddce71cSBard Liao {
817b5848c81SOder Chiou 	regmap_write(rt5682->regmap, RT5682_RESET, 0);
818b5848c81SOder Chiou 	if (!rt5682->is_sdw)
819b5848c81SOder Chiou 		regmap_write(rt5682->regmap, RT5682_I2C_MODE, 1);
8200ddce71cSBard Liao }
821a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_reset);
8225b8e0909STzung-Bi Shih 
8230ddce71cSBard Liao /**
8240ddce71cSBard Liao  * rt5682_sel_asrc_clk_src - select ASRC clock source for a set of filters
8250ddce71cSBard Liao  * @component: SoC audio component device.
8260ddce71cSBard Liao  * @filter_mask: mask of filters.
8270ddce71cSBard Liao  * @clk_src: clock source
8280ddce71cSBard Liao  *
8290ddce71cSBard Liao  * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5682 can
8300ddce71cSBard Liao  * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
8310ddce71cSBard Liao  * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
8320ddce71cSBard Liao  * ASRC function will track i2s clock and generate a corresponding system clock
8330ddce71cSBard Liao  * for codec. This function provides an API to select the clock source for a
8340ddce71cSBard Liao  * set of filters specified by the mask. And the component driver will turn on
8350ddce71cSBard Liao  * ASRC for these filters if ASRC is selected as their clock source.
8360ddce71cSBard Liao  */
rt5682_sel_asrc_clk_src(struct snd_soc_component * component,unsigned int filter_mask,unsigned int clk_src)8370ddce71cSBard Liao int rt5682_sel_asrc_clk_src(struct snd_soc_component *component,
8380ddce71cSBard Liao 		unsigned int filter_mask, unsigned int clk_src)
8390ddce71cSBard Liao {
8400ddce71cSBard Liao 	switch (clk_src) {
8410ddce71cSBard Liao 	case RT5682_CLK_SEL_SYS:
8420ddce71cSBard Liao 	case RT5682_CLK_SEL_I2S1_ASRC:
8430ddce71cSBard Liao 	case RT5682_CLK_SEL_I2S2_ASRC:
8440ddce71cSBard Liao 		break;
8450ddce71cSBard Liao 
8460ddce71cSBard Liao 	default:
8470ddce71cSBard Liao 		return -EINVAL;
8480ddce71cSBard Liao 	}
8490ddce71cSBard Liao 
8500ddce71cSBard Liao 	if (filter_mask & RT5682_DA_STEREO1_FILTER) {
8510ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_PLL_TRACK_2,
8520ddce71cSBard Liao 			RT5682_FILTER_CLK_SEL_MASK,
8530ddce71cSBard Liao 			clk_src << RT5682_FILTER_CLK_SEL_SFT);
8540ddce71cSBard Liao 	}
8550ddce71cSBard Liao 
8560ddce71cSBard Liao 	if (filter_mask & RT5682_AD_STEREO1_FILTER) {
8570ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_PLL_TRACK_3,
8580ddce71cSBard Liao 			RT5682_FILTER_CLK_SEL_MASK,
8590ddce71cSBard Liao 			clk_src << RT5682_FILTER_CLK_SEL_SFT);
8600ddce71cSBard Liao 	}
8610ddce71cSBard Liao 
8620ddce71cSBard Liao 	return 0;
8630ddce71cSBard Liao }
8640ddce71cSBard Liao EXPORT_SYMBOL_GPL(rt5682_sel_asrc_clk_src);
8650ddce71cSBard Liao 
rt5682_button_detect(struct snd_soc_component * component)8660ddce71cSBard Liao static int rt5682_button_detect(struct snd_soc_component *component)
8670ddce71cSBard Liao {
8680ddce71cSBard Liao 	int btn_type, val;
8690ddce71cSBard Liao 
870467a2553SKuninori Morimoto 	val = snd_soc_component_read(component, RT5682_4BTN_IL_CMD_1);
8710ddce71cSBard Liao 	btn_type = val & 0xfff0;
8720ddce71cSBard Liao 	snd_soc_component_write(component, RT5682_4BTN_IL_CMD_1, val);
8739c1cb755STzung-Bi Shih 	dev_dbg(component->dev, "%s btn_type=%x\n", __func__, btn_type);
8742daf3d99SBard Liao 	snd_soc_component_update_bits(component,
8752daf3d99SBard Liao 		RT5682_SAR_IL_CMD_2, 0x10, 0x10);
8760ddce71cSBard Liao 
8770ddce71cSBard Liao 	return btn_type;
8780ddce71cSBard Liao }
8790ddce71cSBard Liao 
rt5682_enable_push_button_irq(struct snd_soc_component * component,bool enable)8800ddce71cSBard Liao static void rt5682_enable_push_button_irq(struct snd_soc_component *component,
8810ddce71cSBard Liao 		bool enable)
8820ddce71cSBard Liao {
883b5848c81SOder Chiou 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
884b5848c81SOder Chiou 
8850ddce71cSBard Liao 	if (enable) {
8860ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
8870ddce71cSBard Liao 			RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_EN);
8880ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13,
8890ddce71cSBard Liao 			RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_BTN);
8900ddce71cSBard Liao 		snd_soc_component_write(component, RT5682_IL_CMD_1, 0x0040);
8910ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
8920ddce71cSBard Liao 			RT5682_4BTN_IL_MASK | RT5682_4BTN_IL_RST_MASK,
8930ddce71cSBard Liao 			RT5682_4BTN_IL_EN | RT5682_4BTN_IL_NOR);
894b5848c81SOder Chiou 		if (rt5682->is_sdw)
895b5848c81SOder Chiou 			snd_soc_component_update_bits(component,
896b5848c81SOder Chiou 				RT5682_IRQ_CTRL_3,
897b5848c81SOder Chiou 				RT5682_IL_IRQ_MASK | RT5682_IL_IRQ_TYPE_MASK,
898b5848c81SOder Chiou 				RT5682_IL_IRQ_EN | RT5682_IL_IRQ_PUL);
899b5848c81SOder Chiou 		else
900b5848c81SOder Chiou 			snd_soc_component_update_bits(component,
901b5848c81SOder Chiou 				RT5682_IRQ_CTRL_3, RT5682_IL_IRQ_MASK,
902b5848c81SOder Chiou 				RT5682_IL_IRQ_EN);
9030ddce71cSBard Liao 	} else {
9040ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_IRQ_CTRL_3,
9050ddce71cSBard Liao 			RT5682_IL_IRQ_MASK, RT5682_IL_IRQ_DIS);
9060ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
9070ddce71cSBard Liao 			RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_DIS);
9080ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
9090ddce71cSBard Liao 			RT5682_4BTN_IL_MASK, RT5682_4BTN_IL_DIS);
9100ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
9110ddce71cSBard Liao 			RT5682_4BTN_IL_RST_MASK, RT5682_4BTN_IL_RST);
9120ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13,
9130ddce71cSBard Liao 			RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_TYPE);
9140ddce71cSBard Liao 	}
9150ddce71cSBard Liao }
9160ddce71cSBard Liao 
9170ddce71cSBard Liao /**
9180ddce71cSBard Liao  * rt5682_headset_detect - Detect headset.
9190ddce71cSBard Liao  * @component: SoC audio component device.
9200ddce71cSBard Liao  * @jack_insert: Jack insert or not.
9210ddce71cSBard Liao  *
9220ddce71cSBard Liao  * Detect whether is headset or not when jack inserted.
9230ddce71cSBard Liao  *
9240ddce71cSBard Liao  * Returns detect status.
9250ddce71cSBard Liao  */
rt5682_headset_detect(struct snd_soc_component * component,int jack_insert)9264045daf0SPeter Ujfalusi static int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert)
9270ddce71cSBard Liao {
9280ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
929ebbfabc1SDerek Fang 	struct snd_soc_dapm_context *dapm = &component->dapm;
9300ddce71cSBard Liao 	unsigned int val, count;
9310ddce71cSBard Liao 
9320ddce71cSBard Liao 	if (jack_insert) {
9334834d707SShuming Fan 		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
934675212bfSShuming Fan 			RT5682_PWR_VREF2 | RT5682_PWR_MB,
935675212bfSShuming Fan 			RT5682_PWR_VREF2 | RT5682_PWR_MB);
9364834d707SShuming Fan 		snd_soc_component_update_bits(component,
9374834d707SShuming Fan 			RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0);
9384834d707SShuming Fan 		usleep_range(15000, 20000);
9394834d707SShuming Fan 		snd_soc_component_update_bits(component,
9404834d707SShuming Fan 			RT5682_PWR_ANLG_1, RT5682_PWR_FV2, RT5682_PWR_FV2);
9414834d707SShuming Fan 		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
9424834d707SShuming Fan 			RT5682_PWR_CBJ, RT5682_PWR_CBJ);
9439bc5fd71SShuming Fan 		snd_soc_component_update_bits(component,
9449bc5fd71SShuming Fan 			RT5682_HP_CHARGE_PUMP_1,
9459bc5fd71SShuming Fan 			RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0);
9462cd9b0efSDerek Fang 		rt5682_enable_push_button_irq(component, false);
9472cd9b0efSDerek Fang 		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
9482cd9b0efSDerek Fang 			RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW);
9492cd9b0efSDerek Fang 		usleep_range(55000, 60000);
9500ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
9510ddce71cSBard Liao 			RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH);
9520ddce71cSBard Liao 
9530ddce71cSBard Liao 		count = 0;
954467a2553SKuninori Morimoto 		val = snd_soc_component_read(component, RT5682_CBJ_CTRL_2)
9550ddce71cSBard Liao 			& RT5682_JACK_TYPE_MASK;
9560ddce71cSBard Liao 		while (val == 0 && count < 50) {
9570ddce71cSBard Liao 			usleep_range(10000, 15000);
958467a2553SKuninori Morimoto 			val = snd_soc_component_read(component,
9590ddce71cSBard Liao 				RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK;
9600ddce71cSBard Liao 			count++;
9610ddce71cSBard Liao 		}
9620ddce71cSBard Liao 
9630ddce71cSBard Liao 		switch (val) {
9640ddce71cSBard Liao 		case 0x1:
9650ddce71cSBard Liao 		case 0x2:
9660ddce71cSBard Liao 			rt5682->jack_type = SND_JACK_HEADSET;
9675a15cd7fSShuming Fan 			snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
9685a15cd7fSShuming Fan 				RT5682_FAST_OFF_MASK, RT5682_FAST_OFF_EN);
9690ddce71cSBard Liao 			rt5682_enable_push_button_irq(component, true);
9700ddce71cSBard Liao 			break;
9710ddce71cSBard Liao 		default:
9720ddce71cSBard Liao 			rt5682->jack_type = SND_JACK_HEADPHONE;
97370255cf6STzung-Bi Shih 			break;
9740ddce71cSBard Liao 		}
9759bc5fd71SShuming Fan 
9769bc5fd71SShuming Fan 		snd_soc_component_update_bits(component,
9779bc5fd71SShuming Fan 			RT5682_HP_CHARGE_PUMP_1,
9789bc5fd71SShuming Fan 			RT5682_OSW_L_MASK | RT5682_OSW_R_MASK,
9799bc5fd71SShuming Fan 			RT5682_OSW_L_EN | RT5682_OSW_R_EN);
9806301adf9SShuming Fan 		snd_soc_component_update_bits(component, RT5682_MICBIAS_2,
9816301adf9SShuming Fan 			RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK,
9826301adf9SShuming Fan 			RT5682_PWR_CLK25M_PU | RT5682_PWR_CLK1M_PU);
9830ddce71cSBard Liao 	} else {
9840ddce71cSBard Liao 		rt5682_enable_push_button_irq(component, false);
9850ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
9860ddce71cSBard Liao 			RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW);
9876a503e1cSOder Chiou 		if (!snd_soc_dapm_get_pin_status(dapm, "MICBIAS") &&
9886a503e1cSOder Chiou 			!snd_soc_dapm_get_pin_status(dapm, "PLL1") &&
9896a503e1cSOder Chiou 			!snd_soc_dapm_get_pin_status(dapm, "PLL2B"))
990fa291331Sderek.fang 			snd_soc_component_update_bits(component,
991fa291331Sderek.fang 				RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0);
9926a503e1cSOder Chiou 		if (!snd_soc_dapm_get_pin_status(dapm, "Vref2") &&
9936a503e1cSOder Chiou 			!snd_soc_dapm_get_pin_status(dapm, "PLL1") &&
9946a503e1cSOder Chiou 			!snd_soc_dapm_get_pin_status(dapm, "PLL2B"))
995ebbfabc1SDerek Fang 			snd_soc_component_update_bits(component,
996ebbfabc1SDerek Fang 				RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0);
9974834d707SShuming Fan 		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
9984834d707SShuming Fan 			RT5682_PWR_CBJ, 0);
9996301adf9SShuming Fan 		snd_soc_component_update_bits(component, RT5682_MICBIAS_2,
10006301adf9SShuming Fan 			RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK,
10016301adf9SShuming Fan 			RT5682_PWR_CLK25M_PD | RT5682_PWR_CLK1M_PD);
10025a15cd7fSShuming Fan 		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
10035a15cd7fSShuming Fan 			RT5682_FAST_OFF_MASK, RT5682_FAST_OFF_DIS);
10040ddce71cSBard Liao 
10050ddce71cSBard Liao 		rt5682->jack_type = 0;
10060ddce71cSBard Liao 	}
10070ddce71cSBard Liao 
10080ddce71cSBard Liao 	dev_dbg(component->dev, "jack_type = %d\n", rt5682->jack_type);
10090ddce71cSBard Liao 	return rt5682->jack_type;
10100ddce71cSBard Liao }
10110ddce71cSBard Liao 
rt5682_set_jack_detect(struct snd_soc_component * component,struct snd_soc_jack * hs_jack,void * data)10120ddce71cSBard Liao static int rt5682_set_jack_detect(struct snd_soc_component *component,
10130ddce71cSBard Liao 		struct snd_soc_jack *hs_jack, void *data)
10140ddce71cSBard Liao {
10150ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
10160ddce71cSBard Liao 
1017a315e76fSJaska Uimonen 	rt5682->hs_jack = hs_jack;
1018a315e76fSJaska Uimonen 
10194af11e11SPierre-Louis Bossart 	if (rt5682->is_sdw && !rt5682->first_hw_init)
10204af11e11SPierre-Louis Bossart 		return 0;
10214af11e11SPierre-Louis Bossart 
1022a315e76fSJaska Uimonen 	if (!hs_jack) {
1023a315e76fSJaska Uimonen 		regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
1024a315e76fSJaska Uimonen 			RT5682_JD1_EN_MASK, RT5682_JD1_DIS);
1025a315e76fSJaska Uimonen 		regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
1026a315e76fSJaska Uimonen 			RT5682_POW_JDH | RT5682_POW_JDL, 0);
102724de6356SBard liao 		cancel_delayed_work_sync(&rt5682->jack_detect_work);
1028bc4be656SOder Chiou 
1029a315e76fSJaska Uimonen 		return 0;
1030a315e76fSJaska Uimonen 	}
1031a315e76fSJaska Uimonen 
1032bc4be656SOder Chiou 	if (!rt5682->is_sdw) {
10330ddce71cSBard Liao 		switch (rt5682->pdata.jd_src) {
10340ddce71cSBard Liao 		case RT5682_JD1:
1035b5848c81SOder Chiou 			snd_soc_component_update_bits(component,
10365a15cd7fSShuming Fan 				RT5682_CBJ_CTRL_5, 0x0700, 0x0600);
10375a15cd7fSShuming Fan 			snd_soc_component_update_bits(component,
1038b5848c81SOder Chiou 				RT5682_CBJ_CTRL_2, RT5682_EXT_JD_SRC,
1039b5848c81SOder Chiou 				RT5682_EXT_JD_SRC_MANUAL);
1040b5848c81SOder Chiou 			snd_soc_component_write(component, RT5682_CBJ_CTRL_1,
10415a15cd7fSShuming Fan 				0xd142);
1042b5848c81SOder Chiou 			snd_soc_component_update_bits(component,
1043b5848c81SOder Chiou 				RT5682_CBJ_CTRL_3, RT5682_CBJ_IN_BUF_EN,
1044b5848c81SOder Chiou 				RT5682_CBJ_IN_BUF_EN);
1045b5848c81SOder Chiou 			snd_soc_component_update_bits(component,
1046b5848c81SOder Chiou 				RT5682_SAR_IL_CMD_1, RT5682_SAR_POW_MASK,
1047b5848c81SOder Chiou 				RT5682_SAR_POW_EN);
10480ddce71cSBard Liao 			regmap_update_bits(rt5682->regmap, RT5682_GPIO_CTRL_1,
10490ddce71cSBard Liao 				RT5682_GP1_PIN_MASK, RT5682_GP1_PIN_IRQ);
10500ddce71cSBard Liao 			regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
10510ddce71cSBard Liao 				RT5682_POW_IRQ | RT5682_POW_JDH |
10520ddce71cSBard Liao 				RT5682_POW_ANA, RT5682_POW_IRQ |
10530ddce71cSBard Liao 				RT5682_POW_JDH | RT5682_POW_ANA);
10540ddce71cSBard Liao 			regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_2,
10556301adf9SShuming Fan 				RT5682_PWR_JDH, RT5682_PWR_JDH);
10560ddce71cSBard Liao 			regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
10570ddce71cSBard Liao 				RT5682_JD1_EN_MASK | RT5682_JD1_POL_MASK,
10580ddce71cSBard Liao 				RT5682_JD1_EN | RT5682_JD1_POL_NOR);
1059e2264458SShuming Fan 			regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_4,
1060e2264458SShuming Fan 				0x7f7f, (rt5682->pdata.btndet_delay << 8 |
1061e2264458SShuming Fan 				rt5682->pdata.btndet_delay));
1062e2264458SShuming Fan 			regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_5,
1063e2264458SShuming Fan 				0x7f7f, (rt5682->pdata.btndet_delay << 8 |
1064e2264458SShuming Fan 				rt5682->pdata.btndet_delay));
1065e2264458SShuming Fan 			regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_6,
1066e2264458SShuming Fan 				0x7f7f, (rt5682->pdata.btndet_delay << 8 |
1067e2264458SShuming Fan 				rt5682->pdata.btndet_delay));
1068e2264458SShuming Fan 			regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_7,
1069e2264458SShuming Fan 				0x7f7f, (rt5682->pdata.btndet_delay << 8 |
1070e2264458SShuming Fan 				rt5682->pdata.btndet_delay));
10710ddce71cSBard Liao 			mod_delayed_work(system_power_efficient_wq,
1072b5848c81SOder Chiou 				&rt5682->jack_detect_work,
1073b5848c81SOder Chiou 				msecs_to_jiffies(250));
10740ddce71cSBard Liao 			break;
10750ddce71cSBard Liao 
10760ddce71cSBard Liao 		case RT5682_JD_NULL:
10770ddce71cSBard Liao 			regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
10780ddce71cSBard Liao 				RT5682_JD1_EN_MASK, RT5682_JD1_DIS);
10790ddce71cSBard Liao 			regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
10800ddce71cSBard Liao 				RT5682_POW_JDH | RT5682_POW_JDL, 0);
10810ddce71cSBard Liao 			break;
10820ddce71cSBard Liao 
10830ddce71cSBard Liao 		default:
10840ddce71cSBard Liao 			dev_warn(component->dev, "Wrong JD source\n");
10850ddce71cSBard Liao 			break;
10860ddce71cSBard Liao 		}
1087b5848c81SOder Chiou 	}
10880ddce71cSBard Liao 
10890ddce71cSBard Liao 	return 0;
10900ddce71cSBard Liao }
10910ddce71cSBard Liao 
rt5682_jack_detect_handler(struct work_struct * work)1092a50067d4SArnd Bergmann void rt5682_jack_detect_handler(struct work_struct *work)
10930ddce71cSBard Liao {
10940ddce71cSBard Liao 	struct rt5682_priv *rt5682 =
10950ddce71cSBard Liao 		container_of(work, struct rt5682_priv, jack_detect_work.work);
10964045daf0SPeter Ujfalusi 	struct snd_soc_dapm_context *dapm;
10970ddce71cSBard Liao 	int val, btn_type;
10980ddce71cSBard Liao 
10998ec35236SKuninori Morimoto 	if (!rt5682->component ||
11008ec35236SKuninori Morimoto 	    !snd_soc_card_is_instantiated(rt5682->component->card)) {
11014c33de06SKai Vehmanen 		/* card not yet ready, try later */
11024c33de06SKai Vehmanen 		mod_delayed_work(system_power_efficient_wq,
11034c33de06SKai Vehmanen 				 &rt5682->jack_detect_work, msecs_to_jiffies(15));
11044c33de06SKai Vehmanen 		return;
11054c33de06SKai Vehmanen 	}
11060ddce71cSBard Liao 
1107770f3d99SPierre-Louis Bossart 	if (rt5682->is_sdw) {
1108770f3d99SPierre-Louis Bossart 		if (pm_runtime_status_suspended(rt5682->slave->dev.parent)) {
1109770f3d99SPierre-Louis Bossart 			dev_dbg(&rt5682->slave->dev,
1110770f3d99SPierre-Louis Bossart 				"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
1111770f3d99SPierre-Louis Bossart 				__func__);
1112770f3d99SPierre-Louis Bossart 			return;
1113770f3d99SPierre-Louis Bossart 		}
1114770f3d99SPierre-Louis Bossart 	}
1115770f3d99SPierre-Louis Bossart 
11164045daf0SPeter Ujfalusi 	dapm = snd_soc_component_get_dapm(rt5682->component);
11174045daf0SPeter Ujfalusi 
11184045daf0SPeter Ujfalusi 	snd_soc_dapm_mutex_lock(dapm);
11190ddce71cSBard Liao 	mutex_lock(&rt5682->calibrate_mutex);
11200ddce71cSBard Liao 
1121467a2553SKuninori Morimoto 	val = snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL)
11220ddce71cSBard Liao 		& RT5682_JDH_RS_MASK;
11230ddce71cSBard Liao 	if (!val) {
11240ddce71cSBard Liao 		/* jack in */
11250ddce71cSBard Liao 		if (rt5682->jack_type == 0) {
11260ddce71cSBard Liao 			/* jack was out, report jack type */
11270ddce71cSBard Liao 			rt5682->jack_type =
11280ddce71cSBard Liao 				rt5682_headset_detect(rt5682->component, 1);
112954271282SShuming Fan 			rt5682->irq_work_delay_time = 0;
1130fe0a5304SOder Chiou 		} else if ((rt5682->jack_type & SND_JACK_HEADSET) ==
1131fe0a5304SOder Chiou 			SND_JACK_HEADSET) {
11320ddce71cSBard Liao 			/* jack is already in, report button event */
11330ddce71cSBard Liao 			rt5682->jack_type = SND_JACK_HEADSET;
11340ddce71cSBard Liao 			btn_type = rt5682_button_detect(rt5682->component);
11350ddce71cSBard Liao 			/**
11360ddce71cSBard Liao 			 * rt5682 can report three kinds of button behavior,
11370ddce71cSBard Liao 			 * one click, double click and hold. However,
11380ddce71cSBard Liao 			 * currently we will report button pressed/released
11390ddce71cSBard Liao 			 * event. So all the three button behaviors are
11400ddce71cSBard Liao 			 * treated as button pressed.
11410ddce71cSBard Liao 			 */
11420ddce71cSBard Liao 			switch (btn_type) {
11430ddce71cSBard Liao 			case 0x8000:
11440ddce71cSBard Liao 			case 0x4000:
11450ddce71cSBard Liao 			case 0x2000:
11460ddce71cSBard Liao 				rt5682->jack_type |= SND_JACK_BTN_0;
11470ddce71cSBard Liao 				break;
11480ddce71cSBard Liao 			case 0x1000:
11490ddce71cSBard Liao 			case 0x0800:
11500ddce71cSBard Liao 			case 0x0400:
11510ddce71cSBard Liao 				rt5682->jack_type |= SND_JACK_BTN_1;
11520ddce71cSBard Liao 				break;
11530ddce71cSBard Liao 			case 0x0200:
11540ddce71cSBard Liao 			case 0x0100:
11550ddce71cSBard Liao 			case 0x0080:
11560ddce71cSBard Liao 				rt5682->jack_type |= SND_JACK_BTN_2;
11570ddce71cSBard Liao 				break;
11580ddce71cSBard Liao 			case 0x0040:
11590ddce71cSBard Liao 			case 0x0020:
11600ddce71cSBard Liao 			case 0x0010:
11610ddce71cSBard Liao 				rt5682->jack_type |= SND_JACK_BTN_3;
11620ddce71cSBard Liao 				break;
11630ddce71cSBard Liao 			case 0x0000: /* unpressed */
11640ddce71cSBard Liao 				break;
11650ddce71cSBard Liao 			default:
11660ddce71cSBard Liao 				dev_err(rt5682->component->dev,
11670ddce71cSBard Liao 					"Unexpected button code 0x%04x\n",
11680ddce71cSBard Liao 					btn_type);
11690ddce71cSBard Liao 				break;
11700ddce71cSBard Liao 			}
11710ddce71cSBard Liao 		}
11720ddce71cSBard Liao 	} else {
11730ddce71cSBard Liao 		/* jack out */
11740ddce71cSBard Liao 		rt5682->jack_type = rt5682_headset_detect(rt5682->component, 0);
117554271282SShuming Fan 		rt5682->irq_work_delay_time = 50;
11760ddce71cSBard Liao 	}
11770ddce71cSBard Liao 
11784045daf0SPeter Ujfalusi 	mutex_unlock(&rt5682->calibrate_mutex);
11794045daf0SPeter Ujfalusi 	snd_soc_dapm_mutex_unlock(dapm);
11804045daf0SPeter Ujfalusi 
11810ddce71cSBard Liao 	snd_soc_jack_report(rt5682->hs_jack, rt5682->jack_type,
11820ddce71cSBard Liao 		SND_JACK_HEADSET |
11830ddce71cSBard Liao 		SND_JACK_BTN_0 | SND_JACK_BTN_1 |
11840ddce71cSBard Liao 		SND_JACK_BTN_2 | SND_JACK_BTN_3);
11850ddce71cSBard Liao 
1186b5848c81SOder Chiou 	if (!rt5682->is_sdw) {
11870ddce71cSBard Liao 		if (rt5682->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |
11880ddce71cSBard Liao 			SND_JACK_BTN_2 | SND_JACK_BTN_3))
11890ddce71cSBard Liao 			schedule_delayed_work(&rt5682->jd_check_work, 0);
11900ddce71cSBard Liao 		else
11910ddce71cSBard Liao 			cancel_delayed_work_sync(&rt5682->jd_check_work);
1192b5848c81SOder Chiou 	}
11930ddce71cSBard Liao }
1194a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_jack_detect_handler);
11950ddce71cSBard Liao 
11960ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_snd_controls[] = {
11970ddce71cSBard Liao 	/* DAC Digital Volume */
11980ddce71cSBard Liao 	SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682_DAC1_DIG_VOL,
11995b7ddb86SOder Chiou 		RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 87, 0, dac_vol_tlv),
12000ddce71cSBard Liao 
12010ddce71cSBard Liao 	/* IN Boost Volume */
12020ddce71cSBard Liao 	SOC_SINGLE_TLV("CBJ Boost Volume", RT5682_CBJ_BST_CTRL,
12030ddce71cSBard Liao 		RT5682_BST_CBJ_SFT, 8, 0, bst_tlv),
12040ddce71cSBard Liao 
12050ddce71cSBard Liao 	/* ADC Digital Volume Control */
12060ddce71cSBard Liao 	SOC_DOUBLE("STO1 ADC Capture Switch", RT5682_STO1_ADC_DIG_VOL,
12070ddce71cSBard Liao 		RT5682_L_MUTE_SFT, RT5682_R_MUTE_SFT, 1, 1),
12080ddce71cSBard Liao 	SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682_STO1_ADC_DIG_VOL,
120975094877SShuming Fan 		RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 63, 0, adc_vol_tlv),
12100ddce71cSBard Liao 
12110ddce71cSBard Liao 	/* ADC Boost Volume Control */
12120ddce71cSBard Liao 	SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682_STO1_ADC_BOOST,
12130ddce71cSBard Liao 		RT5682_STO1_ADC_L_BST_SFT, RT5682_STO1_ADC_R_BST_SFT,
12140ddce71cSBard Liao 		3, 0, adc_bst_tlv),
12150ddce71cSBard Liao };
12160ddce71cSBard Liao 
rt5682_div_sel(struct rt5682_priv * rt5682,int target,const int div[],int size)12170ddce71cSBard Liao static int rt5682_div_sel(struct rt5682_priv *rt5682,
12180ddce71cSBard Liao 		int target, const int div[], int size)
12190ddce71cSBard Liao {
12200ddce71cSBard Liao 	int i;
12210ddce71cSBard Liao 
12220ddce71cSBard Liao 	if (rt5682->sysclk < target) {
12239c1cb755STzung-Bi Shih 		dev_err(rt5682->component->dev,
12249c1cb755STzung-Bi Shih 			"sysclk rate %d is too low\n", rt5682->sysclk);
12250ddce71cSBard Liao 		return 0;
12260ddce71cSBard Liao 	}
12270ddce71cSBard Liao 
12280ddce71cSBard Liao 	for (i = 0; i < size - 1; i++) {
1229243de01dSShuming Fan 		dev_dbg(rt5682->component->dev, "div[%d]=%d\n", i, div[i]);
12300ddce71cSBard Liao 		if (target * div[i] == rt5682->sysclk)
12310ddce71cSBard Liao 			return i;
12320ddce71cSBard Liao 		if (target * div[i + 1] > rt5682->sysclk) {
12335b8e0909STzung-Bi Shih 			dev_dbg(rt5682->component->dev,
12345b8e0909STzung-Bi Shih 				"can't find div for sysclk %d\n",
12350ddce71cSBard Liao 				rt5682->sysclk);
12360ddce71cSBard Liao 			return i;
12370ddce71cSBard Liao 		}
12380ddce71cSBard Liao 	}
12390ddce71cSBard Liao 
12400ddce71cSBard Liao 	if (target * div[i] < rt5682->sysclk)
12419c1cb755STzung-Bi Shih 		dev_err(rt5682->component->dev,
12429c1cb755STzung-Bi Shih 			"sysclk rate %d is too high\n", rt5682->sysclk);
12430ddce71cSBard Liao 
12440ddce71cSBard Liao 	return size - 1;
12450ddce71cSBard Liao }
12460ddce71cSBard Liao 
12470ddce71cSBard Liao /**
12480ddce71cSBard Liao  * set_dmic_clk - Set parameter of dmic.
12490ddce71cSBard Liao  *
12500ddce71cSBard Liao  * @w: DAPM widget.
12510ddce71cSBard Liao  * @kcontrol: The kcontrol of this widget.
12520ddce71cSBard Liao  * @event: Event id.
12530ddce71cSBard Liao  *
12540ddce71cSBard Liao  * Choose dmic clock between 1MHz and 3MHz.
12550ddce71cSBard Liao  * It is better for clock to approximate 3MHz.
12560ddce71cSBard Liao  */
set_dmic_clk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)12570ddce71cSBard Liao static int set_dmic_clk(struct snd_soc_dapm_widget *w,
12580ddce71cSBard Liao 		struct snd_kcontrol *kcontrol, int event)
12590ddce71cSBard Liao {
12600ddce71cSBard Liao 	struct snd_soc_component *component =
12610ddce71cSBard Liao 		snd_soc_dapm_to_component(w->dapm);
12620ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
1263ec6aa9b5SPierre-Louis Bossart 	int idx, dmic_clk_rate = 3072000;
12640ddce71cSBard Liao 	static const int div[] = {2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128};
12650ddce71cSBard Liao 
12669a74c44aSOder Chiou 	if (rt5682->pdata.dmic_clk_rate)
12679a74c44aSOder Chiou 		dmic_clk_rate = rt5682->pdata.dmic_clk_rate;
12689a74c44aSOder Chiou 
12699a74c44aSOder Chiou 	idx = rt5682_div_sel(rt5682, dmic_clk_rate, div, ARRAY_SIZE(div));
12700ddce71cSBard Liao 
12710ddce71cSBard Liao 	snd_soc_component_update_bits(component, RT5682_DMIC_CTRL_1,
12720ddce71cSBard Liao 		RT5682_DMIC_CLK_MASK, idx << RT5682_DMIC_CLK_SFT);
12730ddce71cSBard Liao 
12740ddce71cSBard Liao 	return 0;
12750ddce71cSBard Liao }
12760ddce71cSBard Liao 
set_filter_clk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)12770ddce71cSBard Liao static int set_filter_clk(struct snd_soc_dapm_widget *w,
12780ddce71cSBard Liao 		struct snd_kcontrol *kcontrol, int event)
12790ddce71cSBard Liao {
12800ddce71cSBard Liao 	struct snd_soc_component *component =
12810ddce71cSBard Liao 		snd_soc_dapm_to_component(w->dapm);
12820ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
1283ec6aa9b5SPierre-Louis Bossart 	int ref, val, reg, idx;
12840ddce71cSBard Liao 	static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};
12850ddce71cSBard Liao 	static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48};
12860ddce71cSBard Liao 
128703f6fc6dSOder Chiou 	if (rt5682->is_sdw)
128803f6fc6dSOder Chiou 		return 0;
128903f6fc6dSOder Chiou 
1290467a2553SKuninori Morimoto 	val = snd_soc_component_read(component, RT5682_GPIO_CTRL_1) &
12910ddce71cSBard Liao 		RT5682_GP4_PIN_MASK;
12920ddce71cSBard Liao 	if (w->shift == RT5682_PWR_ADC_S1F_BIT &&
12930ddce71cSBard Liao 		val == RT5682_GP4_PIN_ADCDAT2)
12940ddce71cSBard Liao 		ref = 256 * rt5682->lrck[RT5682_AIF2];
12950ddce71cSBard Liao 	else
12960ddce71cSBard Liao 		ref = 256 * rt5682->lrck[RT5682_AIF1];
12970ddce71cSBard Liao 
12980ddce71cSBard Liao 	idx = rt5682_div_sel(rt5682, ref, div_f, ARRAY_SIZE(div_f));
12990ddce71cSBard Liao 
13001c5b6a27SShuming Fan 	if (w->shift == RT5682_PWR_ADC_S1F_BIT)
13010ddce71cSBard Liao 		reg = RT5682_PLL_TRACK_3;
13021c5b6a27SShuming Fan 	else
13030ddce71cSBard Liao 		reg = RT5682_PLL_TRACK_2;
13040ddce71cSBard Liao 
13050ddce71cSBard Liao 	snd_soc_component_update_bits(component, reg,
13060ddce71cSBard Liao 		RT5682_FILTER_CLK_DIV_MASK, idx << RT5682_FILTER_CLK_DIV_SFT);
13070ddce71cSBard Liao 
13080ddce71cSBard Liao 	/* select over sample rate */
13090ddce71cSBard Liao 	for (idx = 0; idx < ARRAY_SIZE(div_o); idx++) {
13100ddce71cSBard Liao 		if (rt5682->sysclk <= 12288000 * div_o[idx])
13110ddce71cSBard Liao 			break;
13120ddce71cSBard Liao 	}
13130ddce71cSBard Liao 
13140ddce71cSBard Liao 	snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1,
13151c5b6a27SShuming Fan 		RT5682_ADC_OSR_MASK | RT5682_DAC_OSR_MASK,
13161c5b6a27SShuming Fan 		(idx << RT5682_ADC_OSR_SFT) | (idx << RT5682_DAC_OSR_SFT));
13170ddce71cSBard Liao 
13180ddce71cSBard Liao 	return 0;
13190ddce71cSBard Liao }
13200ddce71cSBard Liao 
is_sys_clk_from_pll1(struct snd_soc_dapm_widget * w,struct snd_soc_dapm_widget * sink)13210ddce71cSBard Liao static int is_sys_clk_from_pll1(struct snd_soc_dapm_widget *w,
13220ddce71cSBard Liao 		struct snd_soc_dapm_widget *sink)
13230ddce71cSBard Liao {
13240ddce71cSBard Liao 	unsigned int val;
13250ddce71cSBard Liao 	struct snd_soc_component *component =
13260ddce71cSBard Liao 		snd_soc_dapm_to_component(w->dapm);
13270ddce71cSBard Liao 
1328467a2553SKuninori Morimoto 	val = snd_soc_component_read(component, RT5682_GLB_CLK);
13290ddce71cSBard Liao 	val &= RT5682_SCLK_SRC_MASK;
13300ddce71cSBard Liao 	if (val == RT5682_SCLK_SRC_PLL1)
13310ddce71cSBard Liao 		return 1;
13320ddce71cSBard Liao 	else
13330ddce71cSBard Liao 		return 0;
13340ddce71cSBard Liao }
13350ddce71cSBard Liao 
is_sys_clk_from_pll2(struct snd_soc_dapm_widget * w,struct snd_soc_dapm_widget * sink)13360c48a653Sderek.fang static int is_sys_clk_from_pll2(struct snd_soc_dapm_widget *w,
13370c48a653Sderek.fang 		struct snd_soc_dapm_widget *sink)
13380c48a653Sderek.fang {
13390c48a653Sderek.fang 	unsigned int val;
13400c48a653Sderek.fang 	struct snd_soc_component *component =
13410c48a653Sderek.fang 		snd_soc_dapm_to_component(w->dapm);
13420c48a653Sderek.fang 
1343467a2553SKuninori Morimoto 	val = snd_soc_component_read(component, RT5682_GLB_CLK);
13440c48a653Sderek.fang 	val &= RT5682_SCLK_SRC_MASK;
13450c48a653Sderek.fang 	if (val == RT5682_SCLK_SRC_PLL2)
13460c48a653Sderek.fang 		return 1;
13470c48a653Sderek.fang 	else
13480c48a653Sderek.fang 		return 0;
13490c48a653Sderek.fang }
13500c48a653Sderek.fang 
is_using_asrc(struct snd_soc_dapm_widget * w,struct snd_soc_dapm_widget * sink)13510ddce71cSBard Liao static int is_using_asrc(struct snd_soc_dapm_widget *w,
13520ddce71cSBard Liao 		struct snd_soc_dapm_widget *sink)
13530ddce71cSBard Liao {
13540ddce71cSBard Liao 	unsigned int reg, shift, val;
13550ddce71cSBard Liao 	struct snd_soc_component *component =
13560ddce71cSBard Liao 		snd_soc_dapm_to_component(w->dapm);
13570ddce71cSBard Liao 
13580ddce71cSBard Liao 	switch (w->shift) {
13590ddce71cSBard Liao 	case RT5682_ADC_STO1_ASRC_SFT:
13600ddce71cSBard Liao 		reg = RT5682_PLL_TRACK_3;
13610ddce71cSBard Liao 		shift = RT5682_FILTER_CLK_SEL_SFT;
13620ddce71cSBard Liao 		break;
13630ddce71cSBard Liao 	case RT5682_DAC_STO1_ASRC_SFT:
13640ddce71cSBard Liao 		reg = RT5682_PLL_TRACK_2;
13650ddce71cSBard Liao 		shift = RT5682_FILTER_CLK_SEL_SFT;
13660ddce71cSBard Liao 		break;
13670ddce71cSBard Liao 	default:
13680ddce71cSBard Liao 		return 0;
13690ddce71cSBard Liao 	}
13700ddce71cSBard Liao 
1371467a2553SKuninori Morimoto 	val = (snd_soc_component_read(component, reg) >> shift) & 0xf;
13720ddce71cSBard Liao 	switch (val) {
13730ddce71cSBard Liao 	case RT5682_CLK_SEL_I2S1_ASRC:
13740ddce71cSBard Liao 	case RT5682_CLK_SEL_I2S2_ASRC:
13750ddce71cSBard Liao 		return 1;
13760ddce71cSBard Liao 	default:
13770ddce71cSBard Liao 		return 0;
13780ddce71cSBard Liao 	}
13790ddce71cSBard Liao }
13800ddce71cSBard Liao 
13810ddce71cSBard Liao /* Digital Mixer */
13820ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_adc_l_mix[] = {
13830ddce71cSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER,
13840ddce71cSBard Liao 			RT5682_M_STO1_ADC_L1_SFT, 1, 1),
13850ddce71cSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER,
13860ddce71cSBard Liao 			RT5682_M_STO1_ADC_L2_SFT, 1, 1),
13870ddce71cSBard Liao };
13880ddce71cSBard Liao 
13890ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_adc_r_mix[] = {
13900ddce71cSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER,
13910ddce71cSBard Liao 			RT5682_M_STO1_ADC_R1_SFT, 1, 1),
13920ddce71cSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER,
13930ddce71cSBard Liao 			RT5682_M_STO1_ADC_R2_SFT, 1, 1),
13940ddce71cSBard Liao };
13950ddce71cSBard Liao 
13960ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_dac_l_mix[] = {
13970ddce71cSBard Liao 	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER,
13980ddce71cSBard Liao 			RT5682_M_ADCMIX_L_SFT, 1, 1),
13990ddce71cSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER,
14000ddce71cSBard Liao 			RT5682_M_DAC1_L_SFT, 1, 1),
14010ddce71cSBard Liao };
14020ddce71cSBard Liao 
14030ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_dac_r_mix[] = {
14040ddce71cSBard Liao 	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER,
14050ddce71cSBard Liao 			RT5682_M_ADCMIX_R_SFT, 1, 1),
14060ddce71cSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER,
14070ddce71cSBard Liao 			RT5682_M_DAC1_R_SFT, 1, 1),
14080ddce71cSBard Liao };
14090ddce71cSBard Liao 
14100ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_dac_l_mix[] = {
14110ddce71cSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER,
14120ddce71cSBard Liao 			RT5682_M_DAC_L1_STO_L_SFT, 1, 1),
14130ddce71cSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER,
14140ddce71cSBard Liao 			RT5682_M_DAC_R1_STO_L_SFT, 1, 1),
14150ddce71cSBard Liao };
14160ddce71cSBard Liao 
14170ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_dac_r_mix[] = {
14180ddce71cSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER,
14190ddce71cSBard Liao 			RT5682_M_DAC_L1_STO_R_SFT, 1, 1),
14200ddce71cSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER,
14210ddce71cSBard Liao 			RT5682_M_DAC_R1_STO_R_SFT, 1, 1),
14220ddce71cSBard Liao };
14230ddce71cSBard Liao 
14240ddce71cSBard Liao /* Analog Input Mixer */
14250ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_rec1_l_mix[] = {
14260ddce71cSBard Liao 	SOC_DAPM_SINGLE("CBJ Switch", RT5682_REC_MIXER,
14270ddce71cSBard Liao 			RT5682_M_CBJ_RM1_L_SFT, 1, 1),
14280ddce71cSBard Liao };
14290ddce71cSBard Liao 
14300ddce71cSBard Liao /* STO1 ADC1 Source */
14310ddce71cSBard Liao /* MX-26 [13] [5] */
14320ddce71cSBard Liao static const char * const rt5682_sto1_adc1_src[] = {
14330ddce71cSBard Liao 	"DAC MIX", "ADC"
14340ddce71cSBard Liao };
14350ddce71cSBard Liao 
14360ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(
14370ddce71cSBard Liao 	rt5682_sto1_adc1l_enum, RT5682_STO1_ADC_MIXER,
14380ddce71cSBard Liao 	RT5682_STO1_ADC1L_SRC_SFT, rt5682_sto1_adc1_src);
14390ddce71cSBard Liao 
14400ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_adc1l_mux =
14410ddce71cSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1l_enum);
14420ddce71cSBard Liao 
14430ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(
14440ddce71cSBard Liao 	rt5682_sto1_adc1r_enum, RT5682_STO1_ADC_MIXER,
14450ddce71cSBard Liao 	RT5682_STO1_ADC1R_SRC_SFT, rt5682_sto1_adc1_src);
14460ddce71cSBard Liao 
14470ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_adc1r_mux =
14480ddce71cSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1r_enum);
14490ddce71cSBard Liao 
14500ddce71cSBard Liao /* STO1 ADC Source */
14510ddce71cSBard Liao /* MX-26 [11:10] [3:2] */
14520ddce71cSBard Liao static const char * const rt5682_sto1_adc_src[] = {
14530ddce71cSBard Liao 	"ADC1 L", "ADC1 R"
14540ddce71cSBard Liao };
14550ddce71cSBard Liao 
14560ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(
14570ddce71cSBard Liao 	rt5682_sto1_adcl_enum, RT5682_STO1_ADC_MIXER,
14580ddce71cSBard Liao 	RT5682_STO1_ADCL_SRC_SFT, rt5682_sto1_adc_src);
14590ddce71cSBard Liao 
14600ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_adcl_mux =
14610ddce71cSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5682_sto1_adcl_enum);
14620ddce71cSBard Liao 
14630ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(
14640ddce71cSBard Liao 	rt5682_sto1_adcr_enum, RT5682_STO1_ADC_MIXER,
14650ddce71cSBard Liao 	RT5682_STO1_ADCR_SRC_SFT, rt5682_sto1_adc_src);
14660ddce71cSBard Liao 
14670ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_adcr_mux =
14680ddce71cSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5682_sto1_adcr_enum);
14690ddce71cSBard Liao 
14700ddce71cSBard Liao /* STO1 ADC2 Source */
14710ddce71cSBard Liao /* MX-26 [12] [4] */
14720ddce71cSBard Liao static const char * const rt5682_sto1_adc2_src[] = {
14730ddce71cSBard Liao 	"DAC MIX", "DMIC"
14740ddce71cSBard Liao };
14750ddce71cSBard Liao 
14760ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(
14770ddce71cSBard Liao 	rt5682_sto1_adc2l_enum, RT5682_STO1_ADC_MIXER,
14780ddce71cSBard Liao 	RT5682_STO1_ADC2L_SRC_SFT, rt5682_sto1_adc2_src);
14790ddce71cSBard Liao 
14800ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_adc2l_mux =
14810ddce71cSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5682_sto1_adc2l_enum);
14820ddce71cSBard Liao 
14830ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(
14840ddce71cSBard Liao 	rt5682_sto1_adc2r_enum, RT5682_STO1_ADC_MIXER,
14850ddce71cSBard Liao 	RT5682_STO1_ADC2R_SRC_SFT, rt5682_sto1_adc2_src);
14860ddce71cSBard Liao 
14870ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_sto1_adc2r_mux =
14880ddce71cSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5682_sto1_adc2r_enum);
14890ddce71cSBard Liao 
14900ddce71cSBard Liao /* MX-79 [6:4] I2S1 ADC data location */
14910ddce71cSBard Liao static const unsigned int rt5682_if1_adc_slot_values[] = {
14920ddce71cSBard Liao 	0,
14930ddce71cSBard Liao 	2,
14940ddce71cSBard Liao 	4,
14950ddce71cSBard Liao 	6,
14960ddce71cSBard Liao };
14970ddce71cSBard Liao 
14980ddce71cSBard Liao static const char * const rt5682_if1_adc_slot_src[] = {
14990ddce71cSBard Liao 	"Slot 0", "Slot 2", "Slot 4", "Slot 6"
15000ddce71cSBard Liao };
15010ddce71cSBard Liao 
15020ddce71cSBard Liao static SOC_VALUE_ENUM_SINGLE_DECL(rt5682_if1_adc_slot_enum,
15030ddce71cSBard Liao 	RT5682_TDM_CTRL, RT5682_TDM_ADC_LCA_SFT, RT5682_TDM_ADC_LCA_MASK,
15040ddce71cSBard Liao 	rt5682_if1_adc_slot_src, rt5682_if1_adc_slot_values);
15050ddce71cSBard Liao 
15060ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_if1_adc_slot_mux =
15070ddce71cSBard Liao 	SOC_DAPM_ENUM("IF1 ADC Slot location", rt5682_if1_adc_slot_enum);
15080ddce71cSBard Liao 
15090ddce71cSBard Liao /* Analog DAC L1 Source, Analog DAC R1 Source*/
15100ddce71cSBard Liao /* MX-2B [4], MX-2B [0]*/
15110ddce71cSBard Liao static const char * const rt5682_alg_dac1_src[] = {
15120ddce71cSBard Liao 	"Stereo1 DAC Mixer", "DAC1"
15130ddce71cSBard Liao };
15140ddce71cSBard Liao 
15150ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(
15160ddce71cSBard Liao 	rt5682_alg_dac_l1_enum, RT5682_A_DAC1_MUX,
15170ddce71cSBard Liao 	RT5682_A_DACL1_SFT, rt5682_alg_dac1_src);
15180ddce71cSBard Liao 
15190ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_alg_dac_l1_mux =
15200ddce71cSBard Liao 	SOC_DAPM_ENUM("Analog DAC L1 Source", rt5682_alg_dac_l1_enum);
15210ddce71cSBard Liao 
15220ddce71cSBard Liao static SOC_ENUM_SINGLE_DECL(
15230ddce71cSBard Liao 	rt5682_alg_dac_r1_enum, RT5682_A_DAC1_MUX,
15240ddce71cSBard Liao 	RT5682_A_DACR1_SFT, rt5682_alg_dac1_src);
15250ddce71cSBard Liao 
15260ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_alg_dac_r1_mux =
15270ddce71cSBard Liao 	SOC_DAPM_ENUM("Analog DAC R1 Source", rt5682_alg_dac_r1_enum);
15280ddce71cSBard Liao 
15290ddce71cSBard Liao /* Out Switch */
15300ddce71cSBard Liao static const struct snd_kcontrol_new hpol_switch =
15310ddce71cSBard Liao 	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1,
15320ddce71cSBard Liao 		RT5682_L_MUTE_SFT, 1, 1);
15330ddce71cSBard Liao static const struct snd_kcontrol_new hpor_switch =
15340ddce71cSBard Liao 	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1,
15350ddce71cSBard Liao 		RT5682_R_MUTE_SFT, 1, 1);
15360ddce71cSBard Liao 
rt5682_hp_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)15370ddce71cSBard Liao static int rt5682_hp_event(struct snd_soc_dapm_widget *w,
15380ddce71cSBard Liao 		struct snd_kcontrol *kcontrol, int event)
15390ddce71cSBard Liao {
15400ddce71cSBard Liao 	struct snd_soc_component *component =
15410ddce71cSBard Liao 		snd_soc_dapm_to_component(w->dapm);
15420ddce71cSBard Liao 
15430ddce71cSBard Liao 	switch (event) {
15440ddce71cSBard Liao 	case SND_SOC_DAPM_PRE_PMU:
15454b19e4a7SDerek Fang 		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
15464b19e4a7SDerek Fang 			RT5682_HP_C2_DAC_AMP_MUTE, 0);
15474b19e4a7SDerek Fang 		snd_soc_component_update_bits(component, RT5682_HP_LOGIC_CTRL_2,
15484b19e4a7SDerek Fang 			RT5682_HP_LC2_SIG_SOUR2_MASK, RT5682_HP_LC2_SIG_SOUR2_REG);
15490ddce71cSBard Liao 		snd_soc_component_update_bits(component,
15500ddce71cSBard Liao 			RT5682_DEPOP_1, 0x60, 0x60);
155128b20ddeSShuming Fan 		snd_soc_component_update_bits(component,
155228b20ddeSShuming Fan 			RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080);
15534b19e4a7SDerek Fang 		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
15544b19e4a7SDerek Fang 			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN,
15554b19e4a7SDerek Fang 			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN);
15564b19e4a7SDerek Fang 		usleep_range(5000, 10000);
15574b19e4a7SDerek Fang 		snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1,
15584b19e4a7SDerek Fang 			RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_L);
15590ddce71cSBard Liao 		break;
15600ddce71cSBard Liao 
15610ddce71cSBard Liao 	case SND_SOC_DAPM_POST_PMD:
15624b19e4a7SDerek Fang 		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
15634b19e4a7SDerek Fang 			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN, 0);
15644b19e4a7SDerek Fang 		snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1,
15654b19e4a7SDerek Fang 			RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_M);
15660ddce71cSBard Liao 		snd_soc_component_update_bits(component,
15670ddce71cSBard Liao 			RT5682_DEPOP_1, 0x60, 0x0);
156828b20ddeSShuming Fan 		snd_soc_component_update_bits(component,
156928b20ddeSShuming Fan 			RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0000);
15700ddce71cSBard Liao 		break;
15710ddce71cSBard Liao 	}
15720ddce71cSBard Liao 
15730ddce71cSBard Liao 	return 0;
15740ddce71cSBard Liao }
15750ddce71cSBard Liao 
set_dmic_power(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)15760ddce71cSBard Liao static int set_dmic_power(struct snd_soc_dapm_widget *w,
15770ddce71cSBard Liao 		struct snd_kcontrol *kcontrol, int event)
15780ddce71cSBard Liao {
15798b15ee0bSOder Chiou 	struct snd_soc_component *component =
15808b15ee0bSOder Chiou 		snd_soc_dapm_to_component(w->dapm);
15818b15ee0bSOder Chiou 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
15829fe0ec27SOder Chiou 	unsigned int delay = 50, val;
15838b15ee0bSOder Chiou 
15848b15ee0bSOder Chiou 	if (rt5682->pdata.dmic_delay)
15858b15ee0bSOder Chiou 		delay = rt5682->pdata.dmic_delay;
15868b15ee0bSOder Chiou 
15870ddce71cSBard Liao 	switch (event) {
15880ddce71cSBard Liao 	case SND_SOC_DAPM_POST_PMU:
15899fe0ec27SOder Chiou 		val = snd_soc_component_read(component, RT5682_GLB_CLK);
15909fe0ec27SOder Chiou 		val &= RT5682_SCLK_SRC_MASK;
15919fe0ec27SOder Chiou 		if (val == RT5682_SCLK_SRC_PLL1 || val == RT5682_SCLK_SRC_PLL2)
15929fe0ec27SOder Chiou 			snd_soc_component_update_bits(component,
15939fe0ec27SOder Chiou 				RT5682_PWR_ANLG_1,
15949fe0ec27SOder Chiou 				RT5682_PWR_VREF2 | RT5682_PWR_MB,
15959fe0ec27SOder Chiou 				RT5682_PWR_VREF2 | RT5682_PWR_MB);
15969fe0ec27SOder Chiou 
15970ddce71cSBard Liao 		/*Add delay to avoid pop noise*/
15988b15ee0bSOder Chiou 		msleep(delay);
15990ddce71cSBard Liao 		break;
16009fe0ec27SOder Chiou 
16019fe0ec27SOder Chiou 	case SND_SOC_DAPM_POST_PMD:
16029fe0ec27SOder Chiou 		if (!rt5682->jack_type) {
16039fe0ec27SOder Chiou 			if (!snd_soc_dapm_get_pin_status(w->dapm, "MICBIAS"))
16049fe0ec27SOder Chiou 				snd_soc_component_update_bits(component,
16059fe0ec27SOder Chiou 					RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0);
16069fe0ec27SOder Chiou 			if (!snd_soc_dapm_get_pin_status(w->dapm, "Vref2"))
16079fe0ec27SOder Chiou 				snd_soc_component_update_bits(component,
16089fe0ec27SOder Chiou 					RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0);
16099fe0ec27SOder Chiou 		}
16109fe0ec27SOder Chiou 		break;
16110ddce71cSBard Liao 	}
16120ddce71cSBard Liao 
16130ddce71cSBard Liao 	return 0;
16140ddce71cSBard Liao }
16150ddce71cSBard Liao 
rt5682_set_verf(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1616b2d48ddeSOder Chiou static int rt5682_set_verf(struct snd_soc_dapm_widget *w,
16170ddce71cSBard Liao 		struct snd_kcontrol *kcontrol, int event)
16180ddce71cSBard Liao {
16190ddce71cSBard Liao 	struct snd_soc_component *component =
16200ddce71cSBard Liao 		snd_soc_dapm_to_component(w->dapm);
16210ddce71cSBard Liao 
16220ddce71cSBard Liao 	switch (event) {
16230ddce71cSBard Liao 	case SND_SOC_DAPM_PRE_PMU:
16240ddce71cSBard Liao 		switch (w->shift) {
16250ddce71cSBard Liao 		case RT5682_PWR_VREF1_BIT:
16260ddce71cSBard Liao 			snd_soc_component_update_bits(component,
16270ddce71cSBard Liao 				RT5682_PWR_ANLG_1, RT5682_PWR_FV1, 0);
16280ddce71cSBard Liao 			break;
16290ddce71cSBard Liao 
16300ddce71cSBard Liao 		case RT5682_PWR_VREF2_BIT:
16310ddce71cSBard Liao 			snd_soc_component_update_bits(component,
16320ddce71cSBard Liao 				RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0);
16330ddce71cSBard Liao 			break;
16340ddce71cSBard Liao 		}
16350ddce71cSBard Liao 		break;
16360ddce71cSBard Liao 
16370ddce71cSBard Liao 	case SND_SOC_DAPM_POST_PMU:
16380ddce71cSBard Liao 		usleep_range(15000, 20000);
16390ddce71cSBard Liao 		switch (w->shift) {
16400ddce71cSBard Liao 		case RT5682_PWR_VREF1_BIT:
16410ddce71cSBard Liao 			snd_soc_component_update_bits(component,
16420ddce71cSBard Liao 				RT5682_PWR_ANLG_1, RT5682_PWR_FV1,
16430ddce71cSBard Liao 				RT5682_PWR_FV1);
16440ddce71cSBard Liao 			break;
16450ddce71cSBard Liao 
16460ddce71cSBard Liao 		case RT5682_PWR_VREF2_BIT:
16470ddce71cSBard Liao 			snd_soc_component_update_bits(component,
16480ddce71cSBard Liao 				RT5682_PWR_ANLG_1, RT5682_PWR_FV2,
16490ddce71cSBard Liao 				RT5682_PWR_FV2);
16500ddce71cSBard Liao 			break;
16510ddce71cSBard Liao 		}
16520ddce71cSBard Liao 		break;
16530ddce71cSBard Liao 	}
16540ddce71cSBard Liao 
16550ddce71cSBard Liao 	return 0;
16560ddce71cSBard Liao }
16570ddce71cSBard Liao 
16580ddce71cSBard Liao static const unsigned int rt5682_adcdat_pin_values[] = {
16590ddce71cSBard Liao 	1,
16600ddce71cSBard Liao 	3,
16610ddce71cSBard Liao };
16620ddce71cSBard Liao 
16630ddce71cSBard Liao static const char * const rt5682_adcdat_pin_select[] = {
16640ddce71cSBard Liao 	"ADCDAT1",
16650ddce71cSBard Liao 	"ADCDAT2",
16660ddce71cSBard Liao };
16670ddce71cSBard Liao 
16680ddce71cSBard Liao static SOC_VALUE_ENUM_SINGLE_DECL(rt5682_adcdat_pin_enum,
16690ddce71cSBard Liao 	RT5682_GPIO_CTRL_1, RT5682_GP4_PIN_SFT, RT5682_GP4_PIN_MASK,
16700ddce71cSBard Liao 	rt5682_adcdat_pin_select, rt5682_adcdat_pin_values);
16710ddce71cSBard Liao 
16720ddce71cSBard Liao static const struct snd_kcontrol_new rt5682_adcdat_pin_ctrl =
16730ddce71cSBard Liao 	SOC_DAPM_ENUM("ADCDAT", rt5682_adcdat_pin_enum);
16740ddce71cSBard Liao 
16754b19e4a7SDerek Fang static const unsigned int rt5682_hpo_sig_out_values[] = {
16764b19e4a7SDerek Fang 	2,
16774b19e4a7SDerek Fang 	7,
16784b19e4a7SDerek Fang };
16794b19e4a7SDerek Fang 
16804b19e4a7SDerek Fang static const char * const rt5682_hpo_sig_out_mode[] = {
16814b19e4a7SDerek Fang 	"Legacy",
16824b19e4a7SDerek Fang 	"OneBit",
16834b19e4a7SDerek Fang };
16844b19e4a7SDerek Fang 
16854b19e4a7SDerek Fang static SOC_VALUE_ENUM_SINGLE_DECL(rt5682_hpo_sig_out_enum,
16864b19e4a7SDerek Fang 	RT5682_HP_LOGIC_CTRL_2, 0, RT5682_HP_LC2_SIG_SOUR1_MASK,
16874b19e4a7SDerek Fang 	rt5682_hpo_sig_out_mode, rt5682_hpo_sig_out_values);
16884b19e4a7SDerek Fang 
16894b19e4a7SDerek Fang static const struct snd_kcontrol_new rt5682_hpo_sig_demux =
16904b19e4a7SDerek Fang 	SOC_DAPM_ENUM("HPO Signal Demux", rt5682_hpo_sig_out_enum);
16914b19e4a7SDerek Fang 
16920ddce71cSBard Liao static const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = {
16930ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("LDO2", RT5682_PWR_ANLG_3, RT5682_PWR_LDO2_BIT,
16940ddce71cSBard Liao 		0, NULL, 0),
16950ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("PLL1", RT5682_PWR_ANLG_3, RT5682_PWR_PLL_BIT,
16960ddce71cSBard Liao 		0, NULL, 0),
16970ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("PLL2B", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2B_BIT,
16980ddce71cSBard Liao 		0, NULL, 0),
16990ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("PLL2F", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2F_BIT,
17000c48a653Sderek.fang 		0, set_filter_clk, SND_SOC_DAPM_PRE_PMU),
17010ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("Vref1", RT5682_PWR_ANLG_1, RT5682_PWR_VREF1_BIT, 0,
1702b2d48ddeSOder Chiou 		rt5682_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1703fa291331Sderek.fang 	SND_SOC_DAPM_SUPPLY("Vref2", SND_SOC_NOPM, 0, 0, NULL, 0),
1704ebbfabc1SDerek Fang 	SND_SOC_DAPM_SUPPLY("MICBIAS", SND_SOC_NOPM, 0, 0, NULL, 0),
17050ddce71cSBard Liao 
17060ddce71cSBard Liao 	/* ASRC */
17070ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682_PLL_TRACK_1,
17080ddce71cSBard Liao 		RT5682_DAC_STO1_ASRC_SFT, 0, NULL, 0),
17090ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5682_PLL_TRACK_1,
17100ddce71cSBard Liao 		RT5682_ADC_STO1_ASRC_SFT, 0, NULL, 0),
17110ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY_S("AD ASRC", 1, RT5682_PLL_TRACK_1,
17120ddce71cSBard Liao 		RT5682_AD_ASRC_SFT, 0, NULL, 0),
17130ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DA ASRC", 1, RT5682_PLL_TRACK_1,
17140ddce71cSBard Liao 		RT5682_DA_ASRC_SFT, 0, NULL, 0),
17150ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DMIC ASRC", 1, RT5682_PLL_TRACK_1,
17160ddce71cSBard Liao 		RT5682_DMIC_ASRC_SFT, 0, NULL, 0),
17170ddce71cSBard Liao 
17180ddce71cSBard Liao 	/* Input Side */
17190ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5682_PWR_ANLG_2, RT5682_PWR_MB1_BIT,
17200ddce71cSBard Liao 		0, NULL, 0),
17210ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5682_PWR_ANLG_2, RT5682_PWR_MB2_BIT,
17220ddce71cSBard Liao 		0, NULL, 0),
17230ddce71cSBard Liao 
17240ddce71cSBard Liao 	/* Input Lines */
17250ddce71cSBard Liao 	SND_SOC_DAPM_INPUT("DMIC L1"),
17260ddce71cSBard Liao 	SND_SOC_DAPM_INPUT("DMIC R1"),
17270ddce71cSBard Liao 
17280ddce71cSBard Liao 	SND_SOC_DAPM_INPUT("IN1P"),
17290ddce71cSBard Liao 
17300ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
17310ddce71cSBard Liao 		set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
17320ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5682_DMIC_CTRL_1,
17339fe0ec27SOder Chiou 		RT5682_DMIC_1_EN_SFT, 0, set_dmic_power,
17349fe0ec27SOder Chiou 		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
17350ddce71cSBard Liao 
17360ddce71cSBard Liao 	/* Boost */
17370ddce71cSBard Liao 	SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM,
17380ddce71cSBard Liao 		0, 0, NULL, 0),
17390ddce71cSBard Liao 
17400ddce71cSBard Liao 	/* REC Mixer */
17410ddce71cSBard Liao 	SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682_rec1_l_mix,
17420ddce71cSBard Liao 		ARRAY_SIZE(rt5682_rec1_l_mix)),
17430ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5682_PWR_ANLG_2,
17440ddce71cSBard Liao 		RT5682_PWR_RM1_L_BIT, 0, NULL, 0),
17450ddce71cSBard Liao 
17460ddce71cSBard Liao 	/* ADCs */
17470ddce71cSBard Liao 	SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),
17480ddce71cSBard Liao 	SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),
17490ddce71cSBard Liao 
17500ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5682_PWR_DIG_1,
17510ddce71cSBard Liao 		RT5682_PWR_ADC_L1_BIT, 0, NULL, 0),
17520ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5682_PWR_DIG_1,
17530ddce71cSBard Liao 		RT5682_PWR_ADC_R1_BIT, 0, NULL, 0),
17540ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5682_CHOP_ADC,
17550ddce71cSBard Liao 		RT5682_CKGEN_ADC1_SFT, 0, NULL, 0),
17560ddce71cSBard Liao 
17570ddce71cSBard Liao 	/* ADC Mux */
17580ddce71cSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
17590ddce71cSBard Liao 		&rt5682_sto1_adc1l_mux),
17600ddce71cSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
17610ddce71cSBard Liao 		&rt5682_sto1_adc1r_mux),
17620ddce71cSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
17630ddce71cSBard Liao 		&rt5682_sto1_adc2l_mux),
17640ddce71cSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
17650ddce71cSBard Liao 		&rt5682_sto1_adc2r_mux),
17660ddce71cSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,
17670ddce71cSBard Liao 		&rt5682_sto1_adcl_mux),
17680ddce71cSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,
17690ddce71cSBard Liao 		&rt5682_sto1_adcr_mux),
17700ddce71cSBard Liao 	SND_SOC_DAPM_MUX("IF1_ADC Mux", SND_SOC_NOPM, 0, 0,
17710ddce71cSBard Liao 		&rt5682_if1_adc_slot_mux),
17720ddce71cSBard Liao 
17730ddce71cSBard Liao 	/* ADC Mixer */
17740ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682_PWR_DIG_2,
17750ddce71cSBard Liao 		RT5682_PWR_ADC_S1F_BIT, 0, set_filter_clk,
17760ddce71cSBard Liao 		SND_SOC_DAPM_PRE_PMU),
17770ddce71cSBard Liao 	SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", RT5682_STO1_ADC_DIG_VOL,
17780ddce71cSBard Liao 		RT5682_L_MUTE_SFT, 1, rt5682_sto1_adc_l_mix,
17790ddce71cSBard Liao 		ARRAY_SIZE(rt5682_sto1_adc_l_mix)),
17800ddce71cSBard Liao 	SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5682_STO1_ADC_DIG_VOL,
17810ddce71cSBard Liao 		RT5682_R_MUTE_SFT, 1, rt5682_sto1_adc_r_mix,
17820ddce71cSBard Liao 		ARRAY_SIZE(rt5682_sto1_adc_r_mix)),
17830ddce71cSBard Liao 
17840ddce71cSBard Liao 	/* ADC PGA */
17850ddce71cSBard Liao 	SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
17860ddce71cSBard Liao 
17870ddce71cSBard Liao 	/* Digital Interface */
17880ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S1", RT5682_PWR_DIG_1, RT5682_PWR_I2S1_BIT,
17890ddce71cSBard Liao 		0, NULL, 0),
17900ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S2", RT5682_PWR_DIG_1, RT5682_PWR_I2S2_BIT,
17910ddce71cSBard Liao 		0, NULL, 0),
17920ddce71cSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
17930ddce71cSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
17940ddce71cSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
179503f6fc6dSOder Chiou 	SND_SOC_DAPM_PGA("SOUND DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
179603f6fc6dSOder Chiou 	SND_SOC_DAPM_PGA("SOUND DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
17970ddce71cSBard Liao 
17980ddce71cSBard Liao 	/* Digital Interface Select */
17990ddce71cSBard Liao 	SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
18000ddce71cSBard Liao 		&rt5682_if1_01_adc_swap_mux),
18010ddce71cSBard Liao 	SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
18020ddce71cSBard Liao 		&rt5682_if1_23_adc_swap_mux),
18030ddce71cSBard Liao 	SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
18040ddce71cSBard Liao 		&rt5682_if1_45_adc_swap_mux),
18050ddce71cSBard Liao 	SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
18060ddce71cSBard Liao 		&rt5682_if1_67_adc_swap_mux),
18070ddce71cSBard Liao 	SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
18080ddce71cSBard Liao 		&rt5682_if2_adc_swap_mux),
18090ddce71cSBard Liao 
18100ddce71cSBard Liao 	SND_SOC_DAPM_MUX("ADCDAT Mux", SND_SOC_NOPM, 0, 0,
18110ddce71cSBard Liao 		&rt5682_adcdat_pin_ctrl),
18120ddce71cSBard Liao 
181303f6fc6dSOder Chiou 	SND_SOC_DAPM_MUX("DAC L Mux", SND_SOC_NOPM, 0, 0,
181403f6fc6dSOder Chiou 		&rt5682_dac_l_mux),
181503f6fc6dSOder Chiou 	SND_SOC_DAPM_MUX("DAC R Mux", SND_SOC_NOPM, 0, 0,
181603f6fc6dSOder Chiou 		&rt5682_dac_r_mux),
181703f6fc6dSOder Chiou 
18180ddce71cSBard Liao 	/* Audio Interface */
18190ddce71cSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0,
18200ddce71cSBard Liao 		RT5682_I2S1_SDP, RT5682_SEL_ADCDAT_SFT, 1),
18210ddce71cSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0,
18220ddce71cSBard Liao 		RT5682_I2S2_SDP, RT5682_I2S2_PIN_CFG_SFT, 1),
18230ddce71cSBard Liao 	SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
182403f6fc6dSOder Chiou 	SND_SOC_DAPM_AIF_IN("SDWRX", "SDW Playback", 0, SND_SOC_NOPM, 0, 0),
182503f6fc6dSOder Chiou 	SND_SOC_DAPM_AIF_OUT("SDWTX", "SDW Capture", 0, SND_SOC_NOPM, 0, 0),
18260ddce71cSBard Liao 
18270ddce71cSBard Liao 	/* Output Side */
18280ddce71cSBard Liao 	/* DAC mixer before sound effect  */
18290ddce71cSBard Liao 	SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
18300ddce71cSBard Liao 		rt5682_dac_l_mix, ARRAY_SIZE(rt5682_dac_l_mix)),
18310ddce71cSBard Liao 	SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
18320ddce71cSBard Liao 		rt5682_dac_r_mix, ARRAY_SIZE(rt5682_dac_r_mix)),
18330ddce71cSBard Liao 
18340ddce71cSBard Liao 	/* DAC channel Mux */
18350ddce71cSBard Liao 	SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0,
18360ddce71cSBard Liao 		&rt5682_alg_dac_l1_mux),
18370ddce71cSBard Liao 	SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0,
18380ddce71cSBard Liao 		&rt5682_alg_dac_r1_mux),
18390ddce71cSBard Liao 
18400ddce71cSBard Liao 	/* DAC Mixer */
18410ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5682_PWR_DIG_2,
18420ddce71cSBard Liao 		RT5682_PWR_DAC_S1F_BIT, 0, set_filter_clk,
18430ddce71cSBard Liao 		SND_SOC_DAPM_PRE_PMU),
18440ddce71cSBard Liao 	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0,
18450ddce71cSBard Liao 		rt5682_sto1_dac_l_mix, ARRAY_SIZE(rt5682_sto1_dac_l_mix)),
18460ddce71cSBard Liao 	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0,
18470ddce71cSBard Liao 		rt5682_sto1_dac_r_mix, ARRAY_SIZE(rt5682_sto1_dac_r_mix)),
18480ddce71cSBard Liao 
18490ddce71cSBard Liao 	/* DACs */
18500ddce71cSBard Liao 	SND_SOC_DAPM_DAC("DAC L1", NULL, RT5682_PWR_DIG_1,
18510ddce71cSBard Liao 		RT5682_PWR_DAC_L1_BIT, 0),
18520ddce71cSBard Liao 	SND_SOC_DAPM_DAC("DAC R1", NULL, RT5682_PWR_DIG_1,
18530ddce71cSBard Liao 		RT5682_PWR_DAC_R1_BIT, 0),
18540ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC 1 Clock", 3, RT5682_CHOP_DAC,
18550ddce71cSBard Liao 		RT5682_CKGEN_DAC1_SFT, 0, NULL, 0),
18560ddce71cSBard Liao 
18570ddce71cSBard Liao 	/* HPO */
18580ddce71cSBard Liao 	SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5682_hp_event,
18590ddce71cSBard Liao 		SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU),
18600ddce71cSBard Liao 
18610ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("HP Amp L", RT5682_PWR_ANLG_1,
18620ddce71cSBard Liao 		RT5682_PWR_HA_L_BIT, 0, NULL, 0),
18630ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("HP Amp R", RT5682_PWR_ANLG_1,
18640ddce71cSBard Liao 		RT5682_PWR_HA_R_BIT, 0, NULL, 0),
18650ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, RT5682_DEPOP_1,
186644d13f6cSShuming Fan 		RT5682_PUMP_EN_SFT, 0, NULL, 0),
18670ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY_S("Capless", 2, RT5682_DEPOP_1,
18680ddce71cSBard Liao 		RT5682_CAPLESS_EN_SFT, 0, NULL, 0),
18690ddce71cSBard Liao 
18700ddce71cSBard Liao 	SND_SOC_DAPM_SWITCH("HPOL Playback", SND_SOC_NOPM, 0, 0,
18710ddce71cSBard Liao 		&hpol_switch),
18720ddce71cSBard Liao 	SND_SOC_DAPM_SWITCH("HPOR Playback", SND_SOC_NOPM, 0, 0,
18730ddce71cSBard Liao 		&hpor_switch),
18740ddce71cSBard Liao 
18754b19e4a7SDerek Fang 	SND_SOC_DAPM_OUT_DRV("HPO Legacy", SND_SOC_NOPM, 0, 0, NULL, 0),
18764b19e4a7SDerek Fang 	SND_SOC_DAPM_OUT_DRV("HPO OneBit", SND_SOC_NOPM, 0, 0, NULL, 0),
18774b19e4a7SDerek Fang 	SND_SOC_DAPM_DEMUX("HPO Signal Demux", SND_SOC_NOPM, 0, 0, &rt5682_hpo_sig_demux),
18784b19e4a7SDerek Fang 
18790ddce71cSBard Liao 	/* CLK DET */
18800ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682_CLK_DET,
18810ddce71cSBard Liao 		RT5682_SYS_CLK_DET_SFT,	0, NULL, 0),
18820ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET PLL1", RT5682_CLK_DET,
18830ddce71cSBard Liao 		RT5682_PLL1_CLK_DET_SFT, 0, NULL, 0),
18840ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET PLL2", RT5682_CLK_DET,
18850ddce71cSBard Liao 		RT5682_PLL2_CLK_DET_SFT, 0, NULL, 0),
18860ddce71cSBard Liao 	SND_SOC_DAPM_SUPPLY("CLKDET", RT5682_CLK_DET,
18870ddce71cSBard Liao 		RT5682_POW_CLK_DET_SFT, 0, NULL, 0),
18880ddce71cSBard Liao 
18890ddce71cSBard Liao 	/* Output Lines */
18900ddce71cSBard Liao 	SND_SOC_DAPM_OUTPUT("HPOL"),
18910ddce71cSBard Liao 	SND_SOC_DAPM_OUTPUT("HPOR"),
18920ddce71cSBard Liao };
18930ddce71cSBard Liao 
18940ddce71cSBard Liao static const struct snd_soc_dapm_route rt5682_dapm_routes[] = {
18950ddce71cSBard Liao 	/*PLL*/
18960ddce71cSBard Liao 	{"ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1},
18970c48a653Sderek.fang 	{"ADC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2},
18980c48a653Sderek.fang 	{"ADC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2},
18990ddce71cSBard Liao 	{"DAC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1},
19000c48a653Sderek.fang 	{"DAC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2},
19010c48a653Sderek.fang 	{"DAC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2},
19020ddce71cSBard Liao 
19030ddce71cSBard Liao 	/*ASRC*/
19040ddce71cSBard Liao 	{"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc},
19050ddce71cSBard Liao 	{"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},
19060ddce71cSBard Liao 	{"ADC STO1 ASRC", NULL, "AD ASRC"},
19078077ec01SShuming Fan 	{"ADC STO1 ASRC", NULL, "DA ASRC"},
19080ddce71cSBard Liao 	{"ADC STO1 ASRC", NULL, "CLKDET"},
19098077ec01SShuming Fan 	{"DAC STO1 ASRC", NULL, "AD ASRC"},
19100ddce71cSBard Liao 	{"DAC STO1 ASRC", NULL, "DA ASRC"},
19110ddce71cSBard Liao 	{"DAC STO1 ASRC", NULL, "CLKDET"},
19120ddce71cSBard Liao 
19130ddce71cSBard Liao 	/*Vref*/
19140ddce71cSBard Liao 	{"MICBIAS1", NULL, "Vref1"},
19150ddce71cSBard Liao 	{"MICBIAS2", NULL, "Vref1"},
19160ddce71cSBard Liao 
19170ddce71cSBard Liao 	{"CLKDET SYS", NULL, "CLKDET"},
19180ddce71cSBard Liao 
19190ddce71cSBard Liao 	{"BST1 CBJ", NULL, "IN1P"},
19200ddce71cSBard Liao 
19210ddce71cSBard Liao 	{"RECMIX1L", "CBJ Switch", "BST1 CBJ"},
19220ddce71cSBard Liao 	{"RECMIX1L", NULL, "RECMIX1L Power"},
19230ddce71cSBard Liao 
19240ddce71cSBard Liao 	{"ADC1 L", NULL, "RECMIX1L"},
19250ddce71cSBard Liao 	{"ADC1 L", NULL, "ADC1 L Power"},
19260ddce71cSBard Liao 	{"ADC1 L", NULL, "ADC1 clock"},
19270ddce71cSBard Liao 
19280ddce71cSBard Liao 	{"DMIC L1", NULL, "DMIC CLK"},
19290ddce71cSBard Liao 	{"DMIC L1", NULL, "DMIC1 Power"},
19300ddce71cSBard Liao 	{"DMIC R1", NULL, "DMIC CLK"},
19310ddce71cSBard Liao 	{"DMIC R1", NULL, "DMIC1 Power"},
19320ddce71cSBard Liao 	{"DMIC CLK", NULL, "DMIC ASRC"},
19330ddce71cSBard Liao 
19340ddce71cSBard Liao 	{"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"},
19350ddce71cSBard Liao 	{"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"},
19360ddce71cSBard Liao 	{"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"},
19370ddce71cSBard Liao 	{"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"},
19380ddce71cSBard Liao 
19390ddce71cSBard Liao 	{"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"},
19400ddce71cSBard Liao 	{"Stereo1 ADC L1 Mux", "DAC MIX", "Stereo1 DAC MIXL"},
19410ddce71cSBard Liao 	{"Stereo1 ADC L2 Mux", "DMIC", "DMIC L1"},
19420ddce71cSBard Liao 	{"Stereo1 ADC L2 Mux", "DAC MIX", "Stereo1 DAC MIXL"},
19430ddce71cSBard Liao 
19440ddce71cSBard Liao 	{"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"},
19450ddce71cSBard Liao 	{"Stereo1 ADC R1 Mux", "DAC MIX", "Stereo1 DAC MIXR"},
19460ddce71cSBard Liao 	{"Stereo1 ADC R2 Mux", "DMIC", "DMIC R1"},
19470ddce71cSBard Liao 	{"Stereo1 ADC R2 Mux", "DAC MIX", "Stereo1 DAC MIXR"},
19480ddce71cSBard Liao 
19490ddce71cSBard Liao 	{"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"},
19500ddce71cSBard Liao 	{"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"},
19510ddce71cSBard Liao 	{"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"},
19520ddce71cSBard Liao 
19530ddce71cSBard Liao 	{"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"},
19540ddce71cSBard Liao 	{"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"},
19550ddce71cSBard Liao 	{"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"},
19560ddce71cSBard Liao 
19570ddce71cSBard Liao 	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"},
19580ddce71cSBard Liao 	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"},
19590ddce71cSBard Liao 
19600ddce71cSBard Liao 	{"IF1 01 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
19610ddce71cSBard Liao 	{"IF1 01 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
19620ddce71cSBard Liao 	{"IF1 01 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
19630ddce71cSBard Liao 	{"IF1 01 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
19640ddce71cSBard Liao 	{"IF1 23 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
19650ddce71cSBard Liao 	{"IF1 23 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
19660ddce71cSBard Liao 	{"IF1 23 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
19670ddce71cSBard Liao 	{"IF1 23 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
19680ddce71cSBard Liao 	{"IF1 45 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
19690ddce71cSBard Liao 	{"IF1 45 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
19700ddce71cSBard Liao 	{"IF1 45 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
19710ddce71cSBard Liao 	{"IF1 45 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
19720ddce71cSBard Liao 	{"IF1 67 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
19730ddce71cSBard Liao 	{"IF1 67 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
19740ddce71cSBard Liao 	{"IF1 67 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
19750ddce71cSBard Liao 	{"IF1 67 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
19760ddce71cSBard Liao 
19770ddce71cSBard Liao 	{"IF1_ADC Mux", "Slot 0", "IF1 01 ADC Swap Mux"},
19780ddce71cSBard Liao 	{"IF1_ADC Mux", "Slot 2", "IF1 23 ADC Swap Mux"},
19790ddce71cSBard Liao 	{"IF1_ADC Mux", "Slot 4", "IF1 45 ADC Swap Mux"},
19800ddce71cSBard Liao 	{"IF1_ADC Mux", "Slot 6", "IF1 67 ADC Swap Mux"},
19810ddce71cSBard Liao 	{"ADCDAT Mux", "ADCDAT1", "IF1_ADC Mux"},
198203f6fc6dSOder Chiou 	{"AIF1TX", NULL, "I2S1"},
19830ddce71cSBard Liao 	{"AIF1TX", NULL, "ADCDAT Mux"},
19840ddce71cSBard Liao 	{"IF2 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
19850ddce71cSBard Liao 	{"IF2 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
19860ddce71cSBard Liao 	{"IF2 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
19870ddce71cSBard Liao 	{"IF2 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
19880ddce71cSBard Liao 	{"ADCDAT Mux", "ADCDAT2", "IF2 ADC Swap Mux"},
19890ddce71cSBard Liao 	{"AIF2TX", NULL, "ADCDAT Mux"},
19900ddce71cSBard Liao 
199103f6fc6dSOder Chiou 	{"SDWTX", NULL, "PLL2B"},
199203f6fc6dSOder Chiou 	{"SDWTX", NULL, "PLL2F"},
199303f6fc6dSOder Chiou 	{"SDWTX", NULL, "ADCDAT Mux"},
199403f6fc6dSOder Chiou 
19950ddce71cSBard Liao 	{"IF1 DAC1 L", NULL, "AIF1RX"},
19960ddce71cSBard Liao 	{"IF1 DAC1 L", NULL, "I2S1"},
19970ddce71cSBard Liao 	{"IF1 DAC1 L", NULL, "DAC Stereo1 Filter"},
19980ddce71cSBard Liao 	{"IF1 DAC1 R", NULL, "AIF1RX"},
19990ddce71cSBard Liao 	{"IF1 DAC1 R", NULL, "I2S1"},
20000ddce71cSBard Liao 	{"IF1 DAC1 R", NULL, "DAC Stereo1 Filter"},
20010ddce71cSBard Liao 
200203f6fc6dSOder Chiou 	{"SOUND DAC L", NULL, "SDWRX"},
200303f6fc6dSOder Chiou 	{"SOUND DAC L", NULL, "DAC Stereo1 Filter"},
200403f6fc6dSOder Chiou 	{"SOUND DAC L", NULL, "PLL2B"},
200503f6fc6dSOder Chiou 	{"SOUND DAC L", NULL, "PLL2F"},
200603f6fc6dSOder Chiou 	{"SOUND DAC R", NULL, "SDWRX"},
200703f6fc6dSOder Chiou 	{"SOUND DAC R", NULL, "DAC Stereo1 Filter"},
200803f6fc6dSOder Chiou 	{"SOUND DAC R", NULL, "PLL2B"},
200903f6fc6dSOder Chiou 	{"SOUND DAC R", NULL, "PLL2F"},
201003f6fc6dSOder Chiou 
201103f6fc6dSOder Chiou 	{"DAC L Mux", "IF1", "IF1 DAC1 L"},
201203f6fc6dSOder Chiou 	{"DAC L Mux", "SOUND", "SOUND DAC L"},
201303f6fc6dSOder Chiou 	{"DAC R Mux", "IF1", "IF1 DAC1 R"},
201403f6fc6dSOder Chiou 	{"DAC R Mux", "SOUND", "SOUND DAC R"},
201503f6fc6dSOder Chiou 
20160ddce71cSBard Liao 	{"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},
201703f6fc6dSOder Chiou 	{"DAC1 MIXL", "DAC1 Switch", "DAC L Mux"},
20180ddce71cSBard Liao 	{"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},
201903f6fc6dSOder Chiou 	{"DAC1 MIXR", "DAC1 Switch", "DAC R Mux"},
20200ddce71cSBard Liao 
20210ddce71cSBard Liao 	{"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
20220ddce71cSBard Liao 	{"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},
20230ddce71cSBard Liao 
20240ddce71cSBard Liao 	{"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
20250ddce71cSBard Liao 	{"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},
20260ddce71cSBard Liao 
20270ddce71cSBard Liao 	{"DAC L1 Source", "DAC1", "DAC1 MIXL"},
20280ddce71cSBard Liao 	{"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},
20290ddce71cSBard Liao 	{"DAC R1 Source", "DAC1", "DAC1 MIXR"},
20300ddce71cSBard Liao 	{"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},
20310ddce71cSBard Liao 
20320ddce71cSBard Liao 	{"DAC L1", NULL, "DAC L1 Source"},
20330ddce71cSBard Liao 	{"DAC R1", NULL, "DAC R1 Source"},
20340ddce71cSBard Liao 
20350ddce71cSBard Liao 	{"DAC L1", NULL, "DAC 1 Clock"},
20360ddce71cSBard Liao 	{"DAC R1", NULL, "DAC 1 Clock"},
20370ddce71cSBard Liao 
20380ddce71cSBard Liao 	{"HP Amp", NULL, "DAC L1"},
20390ddce71cSBard Liao 	{"HP Amp", NULL, "DAC R1"},
20400ddce71cSBard Liao 	{"HP Amp", NULL, "HP Amp L"},
20410ddce71cSBard Liao 	{"HP Amp", NULL, "HP Amp R"},
20420ddce71cSBard Liao 	{"HP Amp", NULL, "Capless"},
20430ddce71cSBard Liao 	{"HP Amp", NULL, "Charge Pump"},
20440ddce71cSBard Liao 	{"HP Amp", NULL, "CLKDET SYS"},
2045bf0fa00fSShuming Fan 	{"HP Amp", NULL, "Vref1"},
20464b19e4a7SDerek Fang 
20474b19e4a7SDerek Fang 	{"HPO Signal Demux", NULL, "HP Amp"},
20484b19e4a7SDerek Fang 
20494b19e4a7SDerek Fang 	{"HPO Legacy", "Legacy", "HPO Signal Demux"},
20504b19e4a7SDerek Fang 	{"HPO OneBit", "OneBit", "HPO Signal Demux"},
20514b19e4a7SDerek Fang 
20524b19e4a7SDerek Fang 	{"HPOL Playback", "Switch", "HPO Legacy"},
20534b19e4a7SDerek Fang 	{"HPOR Playback", "Switch", "HPO Legacy"},
20544b19e4a7SDerek Fang 
20550ddce71cSBard Liao 	{"HPOL", NULL, "HPOL Playback"},
20560ddce71cSBard Liao 	{"HPOR", NULL, "HPOR Playback"},
20574b19e4a7SDerek Fang 	{"HPOL", NULL, "HPO OneBit"},
20584b19e4a7SDerek Fang 	{"HPOR", NULL, "HPO OneBit"},
20590ddce71cSBard Liao };
20600ddce71cSBard Liao 
rt5682_set_tdm_slot(struct snd_soc_dai * dai,unsigned int tx_mask,unsigned int rx_mask,int slots,int slot_width)20610ddce71cSBard Liao static int rt5682_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
20620ddce71cSBard Liao 		unsigned int rx_mask, int slots, int slot_width)
20630ddce71cSBard Liao {
20640ddce71cSBard Liao 	struct snd_soc_component *component = dai->component;
20650ddce71cSBard Liao 	unsigned int cl, val = 0;
20660ddce71cSBard Liao 
20670ddce71cSBard Liao 	if (tx_mask || rx_mask)
20680ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2,
20690ddce71cSBard Liao 			RT5682_TDM_EN, RT5682_TDM_EN);
20700ddce71cSBard Liao 	else
20710ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2,
20720ddce71cSBard Liao 			RT5682_TDM_EN, 0);
20730ddce71cSBard Liao 
20740ddce71cSBard Liao 	switch (slots) {
20750ddce71cSBard Liao 	case 4:
20760ddce71cSBard Liao 		val |= RT5682_TDM_TX_CH_4;
20770ddce71cSBard Liao 		val |= RT5682_TDM_RX_CH_4;
20780ddce71cSBard Liao 		break;
20790ddce71cSBard Liao 	case 6:
20800ddce71cSBard Liao 		val |= RT5682_TDM_TX_CH_6;
20810ddce71cSBard Liao 		val |= RT5682_TDM_RX_CH_6;
20820ddce71cSBard Liao 		break;
20830ddce71cSBard Liao 	case 8:
20840ddce71cSBard Liao 		val |= RT5682_TDM_TX_CH_8;
20850ddce71cSBard Liao 		val |= RT5682_TDM_RX_CH_8;
20860ddce71cSBard Liao 		break;
20870ddce71cSBard Liao 	case 2:
20880ddce71cSBard Liao 		break;
20890ddce71cSBard Liao 	default:
20900ddce71cSBard Liao 		return -EINVAL;
20910ddce71cSBard Liao 	}
20920ddce71cSBard Liao 
20930ddce71cSBard Liao 	snd_soc_component_update_bits(component, RT5682_TDM_CTRL,
20940ddce71cSBard Liao 		RT5682_TDM_TX_CH_MASK | RT5682_TDM_RX_CH_MASK, val);
20950ddce71cSBard Liao 
20960ddce71cSBard Liao 	switch (slot_width) {
20970ddce71cSBard Liao 	case 8:
20980ddce71cSBard Liao 		if (tx_mask || rx_mask)
20990ddce71cSBard Liao 			return -EINVAL;
21000ddce71cSBard Liao 		cl = RT5682_I2S1_TX_CHL_8 | RT5682_I2S1_RX_CHL_8;
21010ddce71cSBard Liao 		break;
21020ddce71cSBard Liao 	case 16:
21030ddce71cSBard Liao 		val = RT5682_TDM_CL_16;
21040ddce71cSBard Liao 		cl = RT5682_I2S1_TX_CHL_16 | RT5682_I2S1_RX_CHL_16;
21050ddce71cSBard Liao 		break;
21060ddce71cSBard Liao 	case 20:
21070ddce71cSBard Liao 		val = RT5682_TDM_CL_20;
21080ddce71cSBard Liao 		cl = RT5682_I2S1_TX_CHL_20 | RT5682_I2S1_RX_CHL_20;
21090ddce71cSBard Liao 		break;
21100ddce71cSBard Liao 	case 24:
21110ddce71cSBard Liao 		val = RT5682_TDM_CL_24;
21120ddce71cSBard Liao 		cl = RT5682_I2S1_TX_CHL_24 | RT5682_I2S1_RX_CHL_24;
21130ddce71cSBard Liao 		break;
21140ddce71cSBard Liao 	case 32:
21150ddce71cSBard Liao 		val = RT5682_TDM_CL_32;
21160ddce71cSBard Liao 		cl = RT5682_I2S1_TX_CHL_32 | RT5682_I2S1_RX_CHL_32;
21170ddce71cSBard Liao 		break;
21180ddce71cSBard Liao 	default:
21190ddce71cSBard Liao 		return -EINVAL;
21200ddce71cSBard Liao 	}
21210ddce71cSBard Liao 
21220ddce71cSBard Liao 	snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
21230ddce71cSBard Liao 		RT5682_TDM_CL_MASK, val);
21240ddce71cSBard Liao 	snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
21250ddce71cSBard Liao 		RT5682_I2S1_TX_CHL_MASK | RT5682_I2S1_RX_CHL_MASK, cl);
21260ddce71cSBard Liao 
21270ddce71cSBard Liao 	return 0;
21280ddce71cSBard Liao }
21290ddce71cSBard Liao 
rt5682_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)21300ddce71cSBard Liao static int rt5682_hw_params(struct snd_pcm_substream *substream,
21310ddce71cSBard Liao 		struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
21320ddce71cSBard Liao {
21330ddce71cSBard Liao 	struct snd_soc_component *component = dai->component;
21340ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
21350ddce71cSBard Liao 	unsigned int len_1 = 0, len_2 = 0;
21360ddce71cSBard Liao 	int pre_div, frame_size;
21370ddce71cSBard Liao 
21380ddce71cSBard Liao 	rt5682->lrck[dai->id] = params_rate(params);
21390ddce71cSBard Liao 	pre_div = rl6231_get_clk_info(rt5682->sysclk, rt5682->lrck[dai->id]);
21400ddce71cSBard Liao 
21410ddce71cSBard Liao 	frame_size = snd_soc_params_to_frame_size(params);
21420ddce71cSBard Liao 	if (frame_size < 0) {
21430ddce71cSBard Liao 		dev_err(component->dev, "Unsupported frame size: %d\n",
21440ddce71cSBard Liao 			frame_size);
21450ddce71cSBard Liao 		return -EINVAL;
21460ddce71cSBard Liao 	}
21470ddce71cSBard Liao 
21480ddce71cSBard Liao 	dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n",
21490ddce71cSBard Liao 		rt5682->lrck[dai->id], pre_div, dai->id);
21500ddce71cSBard Liao 
21510ddce71cSBard Liao 	switch (params_width(params)) {
21520ddce71cSBard Liao 	case 16:
21530ddce71cSBard Liao 		break;
21540ddce71cSBard Liao 	case 20:
21550ddce71cSBard Liao 		len_1 |= RT5682_I2S1_DL_20;
21560ddce71cSBard Liao 		len_2 |= RT5682_I2S2_DL_20;
21570ddce71cSBard Liao 		break;
21580ddce71cSBard Liao 	case 24:
21590ddce71cSBard Liao 		len_1 |= RT5682_I2S1_DL_24;
21600ddce71cSBard Liao 		len_2 |= RT5682_I2S2_DL_24;
21610ddce71cSBard Liao 		break;
21620ddce71cSBard Liao 	case 32:
21630ddce71cSBard Liao 		len_1 |= RT5682_I2S1_DL_32;
21640ddce71cSBard Liao 		len_2 |= RT5682_I2S2_DL_24;
21650ddce71cSBard Liao 		break;
21660ddce71cSBard Liao 	case 8:
21670ddce71cSBard Liao 		len_1 |= RT5682_I2S2_DL_8;
21680ddce71cSBard Liao 		len_2 |= RT5682_I2S2_DL_8;
21690ddce71cSBard Liao 		break;
21700ddce71cSBard Liao 	default:
21710ddce71cSBard Liao 		return -EINVAL;
21720ddce71cSBard Liao 	}
21730ddce71cSBard Liao 
21740ddce71cSBard Liao 	switch (dai->id) {
21750ddce71cSBard Liao 	case RT5682_AIF1:
21760ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
21770ddce71cSBard Liao 			RT5682_I2S1_DL_MASK, len_1);
21780ddce71cSBard Liao 		if (rt5682->master[RT5682_AIF1]) {
21790ddce71cSBard Liao 			snd_soc_component_update_bits(component,
21800c48a653Sderek.fang 				RT5682_ADDA_CLK_1, RT5682_I2S_M_DIV_MASK |
21810c48a653Sderek.fang 				RT5682_I2S_CLK_SRC_MASK,
21820c48a653Sderek.fang 				pre_div << RT5682_I2S_M_DIV_SFT |
21830c48a653Sderek.fang 				(rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT);
21840ddce71cSBard Liao 		}
21850ddce71cSBard Liao 		if (params_channels(params) == 1) /* mono mode */
21860ddce71cSBard Liao 			snd_soc_component_update_bits(component,
21870ddce71cSBard Liao 				RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK,
21880ddce71cSBard Liao 				RT5682_I2S1_MONO_EN);
21890ddce71cSBard Liao 		else
21900ddce71cSBard Liao 			snd_soc_component_update_bits(component,
21910ddce71cSBard Liao 				RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK,
21920ddce71cSBard Liao 				RT5682_I2S1_MONO_DIS);
21930ddce71cSBard Liao 		break;
21940ddce71cSBard Liao 	case RT5682_AIF2:
21950ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_I2S2_SDP,
21960ddce71cSBard Liao 			RT5682_I2S2_DL_MASK, len_2);
21970ddce71cSBard Liao 		if (rt5682->master[RT5682_AIF2]) {
21980ddce71cSBard Liao 			snd_soc_component_update_bits(component,
21990ddce71cSBard Liao 				RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_M_PD_MASK,
22000ddce71cSBard Liao 				pre_div << RT5682_I2S2_M_PD_SFT);
22010ddce71cSBard Liao 		}
22020ddce71cSBard Liao 		if (params_channels(params) == 1) /* mono mode */
22030ddce71cSBard Liao 			snd_soc_component_update_bits(component,
22040ddce71cSBard Liao 				RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK,
22050ddce71cSBard Liao 				RT5682_I2S2_MONO_EN);
22060ddce71cSBard Liao 		else
22070ddce71cSBard Liao 			snd_soc_component_update_bits(component,
22080ddce71cSBard Liao 				RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK,
22090ddce71cSBard Liao 				RT5682_I2S2_MONO_DIS);
22100ddce71cSBard Liao 		break;
22110ddce71cSBard Liao 	default:
22120ddce71cSBard Liao 		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
22130ddce71cSBard Liao 		return -EINVAL;
22140ddce71cSBard Liao 	}
22150ddce71cSBard Liao 
22160ddce71cSBard Liao 	return 0;
22170ddce71cSBard Liao }
22180ddce71cSBard Liao 
rt5682_set_dai_fmt(struct snd_soc_dai * dai,unsigned int fmt)22190ddce71cSBard Liao static int rt5682_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
22200ddce71cSBard Liao {
22210ddce71cSBard Liao 	struct snd_soc_component *component = dai->component;
22220ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
22230ddce71cSBard Liao 	unsigned int reg_val = 0, tdm_ctrl = 0;
22240ddce71cSBard Liao 
22250ddce71cSBard Liao 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
22260ddce71cSBard Liao 	case SND_SOC_DAIFMT_CBM_CFM:
22270ddce71cSBard Liao 		rt5682->master[dai->id] = 1;
22280ddce71cSBard Liao 		break;
22290ddce71cSBard Liao 	case SND_SOC_DAIFMT_CBS_CFS:
22300ddce71cSBard Liao 		rt5682->master[dai->id] = 0;
22310ddce71cSBard Liao 		break;
22320ddce71cSBard Liao 	default:
22330ddce71cSBard Liao 		return -EINVAL;
22340ddce71cSBard Liao 	}
22350ddce71cSBard Liao 
22360ddce71cSBard Liao 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
22370ddce71cSBard Liao 	case SND_SOC_DAIFMT_NB_NF:
22380ddce71cSBard Liao 		break;
22390ddce71cSBard Liao 	case SND_SOC_DAIFMT_IB_NF:
22400ddce71cSBard Liao 		reg_val |= RT5682_I2S_BP_INV;
22410ddce71cSBard Liao 		tdm_ctrl |= RT5682_TDM_S_BP_INV;
22420ddce71cSBard Liao 		break;
22430ddce71cSBard Liao 	case SND_SOC_DAIFMT_NB_IF:
22440ddce71cSBard Liao 		if (dai->id == RT5682_AIF1)
22450ddce71cSBard Liao 			tdm_ctrl |= RT5682_TDM_S_LP_INV | RT5682_TDM_M_BP_INV;
22460ddce71cSBard Liao 		else
22470ddce71cSBard Liao 			return -EINVAL;
22480ddce71cSBard Liao 		break;
22490ddce71cSBard Liao 	case SND_SOC_DAIFMT_IB_IF:
22500ddce71cSBard Liao 		if (dai->id == RT5682_AIF1)
22510ddce71cSBard Liao 			tdm_ctrl |= RT5682_TDM_S_BP_INV | RT5682_TDM_S_LP_INV |
22520ddce71cSBard Liao 				    RT5682_TDM_M_BP_INV | RT5682_TDM_M_LP_INV;
22530ddce71cSBard Liao 		else
22540ddce71cSBard Liao 			return -EINVAL;
22550ddce71cSBard Liao 		break;
22560ddce71cSBard Liao 	default:
22570ddce71cSBard Liao 		return -EINVAL;
22580ddce71cSBard Liao 	}
22590ddce71cSBard Liao 
22600ddce71cSBard Liao 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
22610ddce71cSBard Liao 	case SND_SOC_DAIFMT_I2S:
22620ddce71cSBard Liao 		break;
22630ddce71cSBard Liao 	case SND_SOC_DAIFMT_LEFT_J:
22640ddce71cSBard Liao 		reg_val |= RT5682_I2S_DF_LEFT;
22650ddce71cSBard Liao 		tdm_ctrl |= RT5682_TDM_DF_LEFT;
22660ddce71cSBard Liao 		break;
22670ddce71cSBard Liao 	case SND_SOC_DAIFMT_DSP_A:
22680ddce71cSBard Liao 		reg_val |= RT5682_I2S_DF_PCM_A;
22690ddce71cSBard Liao 		tdm_ctrl |= RT5682_TDM_DF_PCM_A;
22700ddce71cSBard Liao 		break;
22710ddce71cSBard Liao 	case SND_SOC_DAIFMT_DSP_B:
22720ddce71cSBard Liao 		reg_val |= RT5682_I2S_DF_PCM_B;
22730ddce71cSBard Liao 		tdm_ctrl |= RT5682_TDM_DF_PCM_B;
22740ddce71cSBard Liao 		break;
22750ddce71cSBard Liao 	default:
22760ddce71cSBard Liao 		return -EINVAL;
22770ddce71cSBard Liao 	}
22780ddce71cSBard Liao 
22790ddce71cSBard Liao 	switch (dai->id) {
22800ddce71cSBard Liao 	case RT5682_AIF1:
22810ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
22820ddce71cSBard Liao 			RT5682_I2S_DF_MASK, reg_val);
22830ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
22840ddce71cSBard Liao 			RT5682_TDM_MS_MASK | RT5682_TDM_S_BP_MASK |
22850ddce71cSBard Liao 			RT5682_TDM_DF_MASK | RT5682_TDM_M_BP_MASK |
22860ddce71cSBard Liao 			RT5682_TDM_M_LP_MASK | RT5682_TDM_S_LP_MASK,
22870ddce71cSBard Liao 			tdm_ctrl | rt5682->master[dai->id]);
22880ddce71cSBard Liao 		break;
22890ddce71cSBard Liao 	case RT5682_AIF2:
22900ddce71cSBard Liao 		if (rt5682->master[dai->id] == 0)
22910ddce71cSBard Liao 			reg_val |= RT5682_I2S2_MS_S;
22920ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_I2S2_SDP,
22930ddce71cSBard Liao 			RT5682_I2S2_MS_MASK | RT5682_I2S_BP_MASK |
22940ddce71cSBard Liao 			RT5682_I2S_DF_MASK, reg_val);
22950ddce71cSBard Liao 		break;
22960ddce71cSBard Liao 	default:
22970ddce71cSBard Liao 		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
22980ddce71cSBard Liao 		return -EINVAL;
22990ddce71cSBard Liao 	}
23000ddce71cSBard Liao 	return 0;
23010ddce71cSBard Liao }
23020ddce71cSBard Liao 
rt5682_set_component_sysclk(struct snd_soc_component * component,int clk_id,int source,unsigned int freq,int dir)23030ddce71cSBard Liao static int rt5682_set_component_sysclk(struct snd_soc_component *component,
23040ddce71cSBard Liao 		int clk_id, int source, unsigned int freq, int dir)
23050ddce71cSBard Liao {
23060ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
23070ddce71cSBard Liao 	unsigned int reg_val = 0, src = 0;
23080ddce71cSBard Liao 
23090ddce71cSBard Liao 	if (freq == rt5682->sysclk && clk_id == rt5682->sysclk_src)
23100ddce71cSBard Liao 		return 0;
23110ddce71cSBard Liao 
23120ddce71cSBard Liao 	switch (clk_id) {
23130ddce71cSBard Liao 	case RT5682_SCLK_S_MCLK:
23140ddce71cSBard Liao 		reg_val |= RT5682_SCLK_SRC_MCLK;
23150ddce71cSBard Liao 		src = RT5682_CLK_SRC_MCLK;
23160ddce71cSBard Liao 		break;
23170ddce71cSBard Liao 	case RT5682_SCLK_S_PLL1:
23180ddce71cSBard Liao 		reg_val |= RT5682_SCLK_SRC_PLL1;
23190ddce71cSBard Liao 		src = RT5682_CLK_SRC_PLL1;
23200ddce71cSBard Liao 		break;
23210ddce71cSBard Liao 	case RT5682_SCLK_S_PLL2:
23220ddce71cSBard Liao 		reg_val |= RT5682_SCLK_SRC_PLL2;
23230ddce71cSBard Liao 		src = RT5682_CLK_SRC_PLL2;
23240ddce71cSBard Liao 		break;
23250ddce71cSBard Liao 	case RT5682_SCLK_S_RCCLK:
23260ddce71cSBard Liao 		reg_val |= RT5682_SCLK_SRC_RCCLK;
23270ddce71cSBard Liao 		src = RT5682_CLK_SRC_RCCLK;
23280ddce71cSBard Liao 		break;
23290ddce71cSBard Liao 	default:
23300ddce71cSBard Liao 		dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
23310ddce71cSBard Liao 		return -EINVAL;
23320ddce71cSBard Liao 	}
23330ddce71cSBard Liao 	snd_soc_component_update_bits(component, RT5682_GLB_CLK,
23340ddce71cSBard Liao 		RT5682_SCLK_SRC_MASK, reg_val);
23350ddce71cSBard Liao 
23360ddce71cSBard Liao 	if (rt5682->master[RT5682_AIF2]) {
23370ddce71cSBard Liao 		snd_soc_component_update_bits(component,
23380ddce71cSBard Liao 			RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_SRC_MASK,
23390ddce71cSBard Liao 			src << RT5682_I2S2_SRC_SFT);
23400ddce71cSBard Liao 	}
23410ddce71cSBard Liao 
23420ddce71cSBard Liao 	rt5682->sysclk = freq;
23430ddce71cSBard Liao 	rt5682->sysclk_src = clk_id;
23440ddce71cSBard Liao 
23450ddce71cSBard Liao 	dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n",
23460ddce71cSBard Liao 		freq, clk_id);
23470ddce71cSBard Liao 
23480ddce71cSBard Liao 	return 0;
23490ddce71cSBard Liao }
23500ddce71cSBard Liao 
rt5682_set_component_pll(struct snd_soc_component * component,int pll_id,int source,unsigned int freq_in,unsigned int freq_out)23510ddce71cSBard Liao static int rt5682_set_component_pll(struct snd_soc_component *component,
23520ddce71cSBard Liao 		int pll_id, int source, unsigned int freq_in,
23530ddce71cSBard Liao 		unsigned int freq_out)
23540ddce71cSBard Liao {
23550ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
23560c48a653Sderek.fang 	struct rl6231_pll_code pll_code, pll2f_code, pll2b_code;
2357d54348fbSderek.fang 	unsigned int pll2_fout1, pll2_ps_val;
23580ddce71cSBard Liao 	int ret;
23590ddce71cSBard Liao 
23600c48a653Sderek.fang 	if (source == rt5682->pll_src[pll_id] &&
23610c48a653Sderek.fang 	    freq_in == rt5682->pll_in[pll_id] &&
23620c48a653Sderek.fang 	    freq_out == rt5682->pll_out[pll_id])
23630ddce71cSBard Liao 		return 0;
23640ddce71cSBard Liao 
23650ddce71cSBard Liao 	if (!freq_in || !freq_out) {
23660ddce71cSBard Liao 		dev_dbg(component->dev, "PLL disabled\n");
23670ddce71cSBard Liao 
23680c48a653Sderek.fang 		rt5682->pll_in[pll_id] = 0;
23690c48a653Sderek.fang 		rt5682->pll_out[pll_id] = 0;
23700ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_GLB_CLK,
23710ddce71cSBard Liao 			RT5682_SCLK_SRC_MASK, RT5682_SCLK_SRC_MCLK);
23720ddce71cSBard Liao 		return 0;
23730ddce71cSBard Liao 	}
23740ddce71cSBard Liao 
23750c48a653Sderek.fang 	if (pll_id == RT5682_PLL2) {
23760ddce71cSBard Liao 		switch (source) {
23770c48a653Sderek.fang 		case RT5682_PLL2_S_MCLK:
23780c48a653Sderek.fang 			snd_soc_component_update_bits(component,
23790c48a653Sderek.fang 				RT5682_GLB_CLK, RT5682_PLL2_SRC_MASK,
23800c48a653Sderek.fang 				RT5682_PLL2_SRC_MCLK);
23810ddce71cSBard Liao 			break;
23820ddce71cSBard Liao 		default:
23830c48a653Sderek.fang 			dev_err(component->dev, "Unknown PLL2 Source %d\n",
23840c48a653Sderek.fang 				source);
23850c48a653Sderek.fang 			return -EINVAL;
23860c48a653Sderek.fang 		}
23870c48a653Sderek.fang 
23880c48a653Sderek.fang 		/**
23890c48a653Sderek.fang 		 * PLL2 concatenates 2 PLL units.
23900c48a653Sderek.fang 		 * We suggest the Fout of the front PLL is 3.84MHz.
23910c48a653Sderek.fang 		 */
23920c48a653Sderek.fang 		pll2_fout1 = 3840000;
23930c48a653Sderek.fang 		ret = rl6231_pll_calc(freq_in, pll2_fout1, &pll2f_code);
23940c48a653Sderek.fang 		if (ret < 0) {
2395a4db95b2SColin Ian King 			dev_err(component->dev, "Unsupported input clock %d\n",
23960c48a653Sderek.fang 				freq_in);
23970c48a653Sderek.fang 			return ret;
23980c48a653Sderek.fang 		}
23990c48a653Sderek.fang 		dev_dbg(component->dev, "PLL2F: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n",
24000c48a653Sderek.fang 			freq_in, pll2_fout1,
24010c48a653Sderek.fang 			pll2f_code.m_bp,
24020c48a653Sderek.fang 			(pll2f_code.m_bp ? 0 : pll2f_code.m_code),
24030c48a653Sderek.fang 			pll2f_code.n_code, pll2f_code.k_code);
24040c48a653Sderek.fang 
24050c48a653Sderek.fang 		ret = rl6231_pll_calc(pll2_fout1, freq_out, &pll2b_code);
24060c48a653Sderek.fang 		if (ret < 0) {
2407a4db95b2SColin Ian King 			dev_err(component->dev, "Unsupported input clock %d\n",
24080c48a653Sderek.fang 				pll2_fout1);
24090c48a653Sderek.fang 			return ret;
24100c48a653Sderek.fang 		}
24110c48a653Sderek.fang 		dev_dbg(component->dev, "PLL2B: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n",
24120c48a653Sderek.fang 			pll2_fout1, freq_out,
24130c48a653Sderek.fang 			pll2b_code.m_bp,
24140c48a653Sderek.fang 			(pll2b_code.m_bp ? 0 : pll2b_code.m_code),
24150c48a653Sderek.fang 			pll2b_code.n_code, pll2b_code.k_code);
24160c48a653Sderek.fang 
24170c48a653Sderek.fang 		snd_soc_component_write(component, RT5682_PLL2_CTRL_1,
24180c48a653Sderek.fang 			pll2f_code.k_code << RT5682_PLL2F_K_SFT |
24190c48a653Sderek.fang 			pll2b_code.k_code << RT5682_PLL2B_K_SFT |
24200c48a653Sderek.fang 			pll2b_code.m_code);
24210c48a653Sderek.fang 		snd_soc_component_write(component, RT5682_PLL2_CTRL_2,
24220c48a653Sderek.fang 			pll2f_code.m_code << RT5682_PLL2F_M_SFT |
24230c48a653Sderek.fang 			pll2b_code.n_code);
24240c48a653Sderek.fang 		snd_soc_component_write(component, RT5682_PLL2_CTRL_3,
24250c48a653Sderek.fang 			pll2f_code.n_code << RT5682_PLL2F_N_SFT);
2426d54348fbSderek.fang 
2427d54348fbSderek.fang 		if (freq_out == 22579200)
2428d54348fbSderek.fang 			pll2_ps_val = 1 << RT5682_PLL2B_SEL_PS_SFT;
2429d54348fbSderek.fang 		else
2430d54348fbSderek.fang 			pll2_ps_val = 1 << RT5682_PLL2B_PS_BYP_SFT;
24310c48a653Sderek.fang 		snd_soc_component_update_bits(component, RT5682_PLL2_CTRL_4,
2432d54348fbSderek.fang 			RT5682_PLL2B_SEL_PS_MASK | RT5682_PLL2B_PS_BYP_MASK |
24330c48a653Sderek.fang 			RT5682_PLL2B_M_BP_MASK | RT5682_PLL2F_M_BP_MASK | 0xf,
2434d54348fbSderek.fang 			pll2_ps_val |
24350c48a653Sderek.fang 			(pll2b_code.m_bp ? 1 : 0) << RT5682_PLL2B_M_BP_SFT |
24360c48a653Sderek.fang 			(pll2f_code.m_bp ? 1 : 0) << RT5682_PLL2F_M_BP_SFT |
24370c48a653Sderek.fang 			0xf);
24380c48a653Sderek.fang 	} else {
24390c48a653Sderek.fang 		switch (source) {
24400c48a653Sderek.fang 		case RT5682_PLL1_S_MCLK:
24410c48a653Sderek.fang 			snd_soc_component_update_bits(component,
24420c48a653Sderek.fang 				RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK,
24430c48a653Sderek.fang 				RT5682_PLL1_SRC_MCLK);
24440c48a653Sderek.fang 			break;
24450c48a653Sderek.fang 		case RT5682_PLL1_S_BCLK1:
24460c48a653Sderek.fang 			snd_soc_component_update_bits(component,
24470c48a653Sderek.fang 				RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK,
24480c48a653Sderek.fang 				RT5682_PLL1_SRC_BCLK1);
24490c48a653Sderek.fang 			break;
24500c48a653Sderek.fang 		default:
24510c48a653Sderek.fang 			dev_err(component->dev, "Unknown PLL1 Source %d\n",
24520c48a653Sderek.fang 				source);
24530ddce71cSBard Liao 			return -EINVAL;
24540ddce71cSBard Liao 		}
24550ddce71cSBard Liao 
24560ddce71cSBard Liao 		ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
24570ddce71cSBard Liao 		if (ret < 0) {
2458a4db95b2SColin Ian King 			dev_err(component->dev, "Unsupported input clock %d\n",
24590c48a653Sderek.fang 				freq_in);
24600ddce71cSBard Liao 			return ret;
24610ddce71cSBard Liao 		}
24620ddce71cSBard Liao 
24630ddce71cSBard Liao 		dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n",
24640ddce71cSBard Liao 			pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
24650ddce71cSBard Liao 			pll_code.n_code, pll_code.k_code);
24660ddce71cSBard Liao 
24670ddce71cSBard Liao 		snd_soc_component_write(component, RT5682_PLL_CTRL_1,
2468e699b2c8SPierre-Louis Bossart 			(pll_code.n_code << RT5682_PLL_N_SFT) | pll_code.k_code);
24690ddce71cSBard Liao 		snd_soc_component_write(component, RT5682_PLL_CTRL_2,
2470e699b2c8SPierre-Louis Bossart 			((pll_code.m_bp ? 0 : pll_code.m_code) << RT5682_PLL_M_SFT) |
24719726db36SPierre-Louis Bossart 			((pll_code.m_bp << RT5682_PLL_M_BP_SFT) | RT5682_PLL_RST));
24720c48a653Sderek.fang 	}
24730ddce71cSBard Liao 
24740c48a653Sderek.fang 	rt5682->pll_in[pll_id] = freq_in;
24750c48a653Sderek.fang 	rt5682->pll_out[pll_id] = freq_out;
24760c48a653Sderek.fang 	rt5682->pll_src[pll_id] = source;
24770ddce71cSBard Liao 
24780ddce71cSBard Liao 	return 0;
24790ddce71cSBard Liao }
24800ddce71cSBard Liao 
rt5682_set_bclk1_ratio(struct snd_soc_dai * dai,unsigned int ratio)24810c48a653Sderek.fang static int rt5682_set_bclk1_ratio(struct snd_soc_dai *dai, unsigned int ratio)
24820c48a653Sderek.fang {
24830c48a653Sderek.fang 	struct snd_soc_component *component = dai->component;
24840c48a653Sderek.fang 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
24850c48a653Sderek.fang 
24860c48a653Sderek.fang 	rt5682->bclk[dai->id] = ratio;
24870c48a653Sderek.fang 
24880c48a653Sderek.fang 	switch (ratio) {
24890c48a653Sderek.fang 	case 256:
24900c48a653Sderek.fang 		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
24910c48a653Sderek.fang 			RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_256);
24920c48a653Sderek.fang 		break;
24930c48a653Sderek.fang 	case 128:
24940c48a653Sderek.fang 		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
24950c48a653Sderek.fang 			RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_128);
24960c48a653Sderek.fang 		break;
24970c48a653Sderek.fang 	case 64:
24980c48a653Sderek.fang 		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
24990c48a653Sderek.fang 			RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_64);
25000c48a653Sderek.fang 		break;
25010c48a653Sderek.fang 	case 32:
25020c48a653Sderek.fang 		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
25030c48a653Sderek.fang 			RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_32);
25040c48a653Sderek.fang 		break;
25050c48a653Sderek.fang 	default:
25060c48a653Sderek.fang 		dev_err(dai->dev, "Invalid bclk1 ratio %d\n", ratio);
25070c48a653Sderek.fang 		return -EINVAL;
25080c48a653Sderek.fang 	}
25090c48a653Sderek.fang 
25100c48a653Sderek.fang 	return 0;
25110c48a653Sderek.fang }
25120c48a653Sderek.fang 
rt5682_set_bclk2_ratio(struct snd_soc_dai * dai,unsigned int ratio)25130c48a653Sderek.fang static int rt5682_set_bclk2_ratio(struct snd_soc_dai *dai, unsigned int ratio)
25140ddce71cSBard Liao {
25150ddce71cSBard Liao 	struct snd_soc_component *component = dai->component;
25160ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
25170ddce71cSBard Liao 
25180ddce71cSBard Liao 	rt5682->bclk[dai->id] = ratio;
25190ddce71cSBard Liao 
25200ddce71cSBard Liao 	switch (ratio) {
25210ddce71cSBard Liao 	case 64:
25220ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2,
25230ddce71cSBard Liao 			RT5682_I2S2_BCLK_MS2_MASK,
25240ddce71cSBard Liao 			RT5682_I2S2_BCLK_MS2_64);
25250ddce71cSBard Liao 		break;
25260ddce71cSBard Liao 	case 32:
25270ddce71cSBard Liao 		snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2,
25280ddce71cSBard Liao 			RT5682_I2S2_BCLK_MS2_MASK,
25290ddce71cSBard Liao 			RT5682_I2S2_BCLK_MS2_32);
25300ddce71cSBard Liao 		break;
25310ddce71cSBard Liao 	default:
25320c48a653Sderek.fang 		dev_err(dai->dev, "Invalid bclk2 ratio %d\n", ratio);
25330ddce71cSBard Liao 		return -EINVAL;
25340ddce71cSBard Liao 	}
25350ddce71cSBard Liao 
25360ddce71cSBard Liao 	return 0;
25370ddce71cSBard Liao }
25380ddce71cSBard Liao 
rt5682_set_bias_level(struct snd_soc_component * component,enum snd_soc_bias_level level)25390ddce71cSBard Liao static int rt5682_set_bias_level(struct snd_soc_component *component,
25400ddce71cSBard Liao 		enum snd_soc_bias_level level)
25410ddce71cSBard Liao {
25420ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
25430ddce71cSBard Liao 
25440ddce71cSBard Liao 	switch (level) {
25450ddce71cSBard Liao 	case SND_SOC_BIAS_PREPARE:
25460ddce71cSBard Liao 		regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
2547675212bfSShuming Fan 			RT5682_PWR_BG, RT5682_PWR_BG);
25480ddce71cSBard Liao 		regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
25490ddce71cSBard Liao 			RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO,
25500ddce71cSBard Liao 			RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO);
25510ddce71cSBard Liao 		break;
25520ddce71cSBard Liao 
25530ddce71cSBard Liao 	case SND_SOC_BIAS_STANDBY:
25540ddce71cSBard Liao 		regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
25550ddce71cSBard Liao 			RT5682_DIG_GATE_CTRL, RT5682_DIG_GATE_CTRL);
25560ddce71cSBard Liao 		break;
25570ddce71cSBard Liao 	case SND_SOC_BIAS_OFF:
25580ddce71cSBard Liao 		regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
25590ddce71cSBard Liao 			RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 0);
25600ddce71cSBard Liao 		regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
2561675212bfSShuming Fan 			RT5682_PWR_BG, 0);
25620ddce71cSBard Liao 		break;
256370255cf6STzung-Bi Shih 	case SND_SOC_BIAS_ON:
25640ddce71cSBard Liao 		break;
25650ddce71cSBard Liao 	}
25660ddce71cSBard Liao 
25670ddce71cSBard Liao 	return 0;
25680ddce71cSBard Liao }
25690ddce71cSBard Liao 
2570ebbfabc1SDerek Fang #ifdef CONFIG_COMMON_CLK
2571ebbfabc1SDerek Fang #define CLK_PLL2_FIN 48000000
2572ebbfabc1SDerek Fang #define CLK_48 48000
2573fde418b6Sderek.fang #define CLK_44 44100
2574ebbfabc1SDerek Fang 
rt5682_clk_check(struct rt5682_priv * rt5682)2575ebbfabc1SDerek Fang static bool rt5682_clk_check(struct rt5682_priv *rt5682)
2576ebbfabc1SDerek Fang {
2577ebbfabc1SDerek Fang 	if (!rt5682->master[RT5682_AIF1]) {
257857589f82SJack Yu 		dev_dbg(rt5682->i2c_dev, "sysclk/dai not set correctly\n");
2579ebbfabc1SDerek Fang 		return false;
2580ebbfabc1SDerek Fang 	}
2581ebbfabc1SDerek Fang 	return true;
2582ebbfabc1SDerek Fang }
2583ebbfabc1SDerek Fang 
rt5682_wclk_prepare(struct clk_hw * hw)2584ebbfabc1SDerek Fang static int rt5682_wclk_prepare(struct clk_hw *hw)
2585ebbfabc1SDerek Fang {
2586ebbfabc1SDerek Fang 	struct rt5682_priv *rt5682 =
2587ebbfabc1SDerek Fang 		container_of(hw, struct rt5682_priv,
2588ebbfabc1SDerek Fang 			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
258957589f82SJack Yu 	struct snd_soc_component *component;
259057589f82SJack Yu 	struct snd_soc_dapm_context *dapm;
2591ebbfabc1SDerek Fang 
2592ebbfabc1SDerek Fang 	if (!rt5682_clk_check(rt5682))
2593ebbfabc1SDerek Fang 		return -EINVAL;
2594ebbfabc1SDerek Fang 
259557589f82SJack Yu 	component = rt5682->component;
259657589f82SJack Yu 	dapm = snd_soc_component_get_dapm(component);
259757589f82SJack Yu 
2598ebbfabc1SDerek Fang 	snd_soc_dapm_mutex_lock(dapm);
2599ebbfabc1SDerek Fang 
2600ebbfabc1SDerek Fang 	snd_soc_dapm_force_enable_pin_unlocked(dapm, "MICBIAS");
2601ebbfabc1SDerek Fang 	snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
2602ebbfabc1SDerek Fang 				RT5682_PWR_MB, RT5682_PWR_MB);
2603fa291331Sderek.fang 
2604fa291331Sderek.fang 	snd_soc_dapm_force_enable_pin_unlocked(dapm, "Vref2");
2605fa291331Sderek.fang 	snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
2606fa291331Sderek.fang 			RT5682_PWR_VREF2 | RT5682_PWR_FV2,
2607fa291331Sderek.fang 			RT5682_PWR_VREF2);
2608fa291331Sderek.fang 	usleep_range(55000, 60000);
2609fa291331Sderek.fang 	snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
2610fa291331Sderek.fang 			RT5682_PWR_FV2, RT5682_PWR_FV2);
2611fa291331Sderek.fang 
2612ebbfabc1SDerek Fang 	snd_soc_dapm_force_enable_pin_unlocked(dapm, "I2S1");
2613ebbfabc1SDerek Fang 	snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2F");
2614ebbfabc1SDerek Fang 	snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2B");
2615ebbfabc1SDerek Fang 	snd_soc_dapm_sync_unlocked(dapm);
2616ebbfabc1SDerek Fang 
2617ebbfabc1SDerek Fang 	snd_soc_dapm_mutex_unlock(dapm);
2618ebbfabc1SDerek Fang 
2619ebbfabc1SDerek Fang 	return 0;
2620ebbfabc1SDerek Fang }
2621ebbfabc1SDerek Fang 
rt5682_wclk_unprepare(struct clk_hw * hw)2622ebbfabc1SDerek Fang static void rt5682_wclk_unprepare(struct clk_hw *hw)
2623ebbfabc1SDerek Fang {
2624ebbfabc1SDerek Fang 	struct rt5682_priv *rt5682 =
2625ebbfabc1SDerek Fang 		container_of(hw, struct rt5682_priv,
2626ebbfabc1SDerek Fang 			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
262757589f82SJack Yu 	struct snd_soc_component *component;
262857589f82SJack Yu 	struct snd_soc_dapm_context *dapm;
2629ebbfabc1SDerek Fang 
2630ebbfabc1SDerek Fang 	if (!rt5682_clk_check(rt5682))
2631ebbfabc1SDerek Fang 		return;
2632ebbfabc1SDerek Fang 
263357589f82SJack Yu 	component = rt5682->component;
263457589f82SJack Yu 	dapm = snd_soc_component_get_dapm(component);
263557589f82SJack Yu 
2636ebbfabc1SDerek Fang 	snd_soc_dapm_mutex_lock(dapm);
2637ebbfabc1SDerek Fang 
2638ebbfabc1SDerek Fang 	snd_soc_dapm_disable_pin_unlocked(dapm, "MICBIAS");
2639fa291331Sderek.fang 	snd_soc_dapm_disable_pin_unlocked(dapm, "Vref2");
2640ebbfabc1SDerek Fang 	if (!rt5682->jack_type)
2641ebbfabc1SDerek Fang 		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
2642fa291331Sderek.fang 				RT5682_PWR_VREF2 | RT5682_PWR_FV2 |
2643ebbfabc1SDerek Fang 				RT5682_PWR_MB, 0);
2644fa291331Sderek.fang 
2645ebbfabc1SDerek Fang 	snd_soc_dapm_disable_pin_unlocked(dapm, "I2S1");
2646ebbfabc1SDerek Fang 	snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2F");
2647ebbfabc1SDerek Fang 	snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2B");
2648ebbfabc1SDerek Fang 	snd_soc_dapm_sync_unlocked(dapm);
2649ebbfabc1SDerek Fang 
2650ebbfabc1SDerek Fang 	snd_soc_dapm_mutex_unlock(dapm);
2651ebbfabc1SDerek Fang }
2652ebbfabc1SDerek Fang 
rt5682_wclk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)2653ebbfabc1SDerek Fang static unsigned long rt5682_wclk_recalc_rate(struct clk_hw *hw,
2654ebbfabc1SDerek Fang 					     unsigned long parent_rate)
2655ebbfabc1SDerek Fang {
2656ebbfabc1SDerek Fang 	struct rt5682_priv *rt5682 =
2657ebbfabc1SDerek Fang 		container_of(hw, struct rt5682_priv,
2658ebbfabc1SDerek Fang 			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
2659edbd24eaSStephen Boyd 	const char * const clk_name = clk_hw_get_name(hw);
2660ebbfabc1SDerek Fang 
2661ebbfabc1SDerek Fang 	if (!rt5682_clk_check(rt5682))
2662ebbfabc1SDerek Fang 		return 0;
2663ebbfabc1SDerek Fang 	/*
2664fde418b6Sderek.fang 	 * Only accept to set wclk rate to 44.1k or 48kHz.
2665ebbfabc1SDerek Fang 	 */
2666fde418b6Sderek.fang 	if (rt5682->lrck[RT5682_AIF1] != CLK_48 &&
2667fde418b6Sderek.fang 	    rt5682->lrck[RT5682_AIF1] != CLK_44) {
266857589f82SJack Yu 		dev_warn(rt5682->i2c_dev, "%s: clk %s only support %d or %d Hz output\n",
2669fde418b6Sderek.fang 			__func__, clk_name, CLK_44, CLK_48);
2670fde418b6Sderek.fang 		return 0;
2671fde418b6Sderek.fang 	}
2672fde418b6Sderek.fang 
2673fde418b6Sderek.fang 	return rt5682->lrck[RT5682_AIF1];
2674ebbfabc1SDerek Fang }
2675ebbfabc1SDerek Fang 
rt5682_wclk_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)2676ebbfabc1SDerek Fang static long rt5682_wclk_round_rate(struct clk_hw *hw, unsigned long rate,
2677ebbfabc1SDerek Fang 				   unsigned long *parent_rate)
2678ebbfabc1SDerek Fang {
2679ebbfabc1SDerek Fang 	struct rt5682_priv *rt5682 =
2680ebbfabc1SDerek Fang 		container_of(hw, struct rt5682_priv,
2681ebbfabc1SDerek Fang 			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
2682edbd24eaSStephen Boyd 	const char * const clk_name = clk_hw_get_name(hw);
2683ebbfabc1SDerek Fang 
2684ebbfabc1SDerek Fang 	if (!rt5682_clk_check(rt5682))
2685ebbfabc1SDerek Fang 		return -EINVAL;
2686ebbfabc1SDerek Fang 	/*
2687fde418b6Sderek.fang 	 * Only accept to set wclk rate to 44.1k or 48kHz.
2688fde418b6Sderek.fang 	 * It will force to 48kHz if not both.
2689ebbfabc1SDerek Fang 	 */
2690fde418b6Sderek.fang 	if (rate != CLK_48 && rate != CLK_44) {
269157589f82SJack Yu 		dev_warn(rt5682->i2c_dev, "%s: clk %s only support %d or %d Hz output\n",
2692fde418b6Sderek.fang 			__func__, clk_name, CLK_44, CLK_48);
2693fde418b6Sderek.fang 		rate = CLK_48;
2694fde418b6Sderek.fang 	}
2695fde418b6Sderek.fang 
2696fde418b6Sderek.fang 	return rate;
2697ebbfabc1SDerek Fang }
2698ebbfabc1SDerek Fang 
rt5682_wclk_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)2699ebbfabc1SDerek Fang static int rt5682_wclk_set_rate(struct clk_hw *hw, unsigned long rate,
2700ebbfabc1SDerek Fang 				unsigned long parent_rate)
2701ebbfabc1SDerek Fang {
2702ebbfabc1SDerek Fang 	struct rt5682_priv *rt5682 =
2703ebbfabc1SDerek Fang 		container_of(hw, struct rt5682_priv,
2704ebbfabc1SDerek Fang 			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
270557589f82SJack Yu 	struct snd_soc_component *component;
27068691743cSJerome Brunet 	struct clk_hw *parent_hw;
2707edbd24eaSStephen Boyd 	const char * const clk_name = clk_hw_get_name(hw);
2708ebbfabc1SDerek Fang 	int pre_div;
2709fde418b6Sderek.fang 	unsigned int clk_pll2_out;
2710ebbfabc1SDerek Fang 
2711ebbfabc1SDerek Fang 	if (!rt5682_clk_check(rt5682))
2712ebbfabc1SDerek Fang 		return -EINVAL;
2713ebbfabc1SDerek Fang 
271457589f82SJack Yu 	component = rt5682->component;
271557589f82SJack Yu 
2716ebbfabc1SDerek Fang 	/*
2717ebbfabc1SDerek Fang 	 * Whether the wclk's parent clk (mclk) exists or not, please ensure
2718ebbfabc1SDerek Fang 	 * it is fixed or set to 48MHz before setting wclk rate. It's a
2719ebbfabc1SDerek Fang 	 * temporary limitation. Only accept 48MHz clk as the clk provider.
2720ebbfabc1SDerek Fang 	 *
2721ebbfabc1SDerek Fang 	 * It will set the codec anyway by assuming mclk is 48MHz.
2722ebbfabc1SDerek Fang 	 */
27238691743cSJerome Brunet 	parent_hw = clk_hw_get_parent(hw);
27248691743cSJerome Brunet 	if (!parent_hw)
272557589f82SJack Yu 		dev_warn(rt5682->i2c_dev,
2726ebbfabc1SDerek Fang 			"Parent mclk of wclk not acquired in driver. Please ensure mclk was provided as %d Hz.\n",
2727ebbfabc1SDerek Fang 			CLK_PLL2_FIN);
2728ebbfabc1SDerek Fang 
2729ebbfabc1SDerek Fang 	if (parent_rate != CLK_PLL2_FIN)
273057589f82SJack Yu 		dev_warn(rt5682->i2c_dev, "clk %s only support %d Hz input\n",
2731ebbfabc1SDerek Fang 			clk_name, CLK_PLL2_FIN);
2732ebbfabc1SDerek Fang 
2733ebbfabc1SDerek Fang 	/*
2734fde418b6Sderek.fang 	 * To achieve the rate conversion from 48MHz to 44.1k or 48kHz,
2735fde418b6Sderek.fang 	 * PLL2 is needed.
2736ebbfabc1SDerek Fang 	 */
2737fde418b6Sderek.fang 	clk_pll2_out = rate * 512;
2738ebbfabc1SDerek Fang 	rt5682_set_component_pll(component, RT5682_PLL2, RT5682_PLL2_S_MCLK,
2739fde418b6Sderek.fang 		CLK_PLL2_FIN, clk_pll2_out);
2740ebbfabc1SDerek Fang 
2741ebbfabc1SDerek Fang 	rt5682_set_component_sysclk(component, RT5682_SCLK_S_PLL2, 0,
2742fde418b6Sderek.fang 		clk_pll2_out, SND_SOC_CLOCK_IN);
2743fde418b6Sderek.fang 
2744fde418b6Sderek.fang 	rt5682->lrck[RT5682_AIF1] = rate;
2745ebbfabc1SDerek Fang 
2746ebbfabc1SDerek Fang 	pre_div = rl6231_get_clk_info(rt5682->sysclk, rate);
2747ebbfabc1SDerek Fang 
2748ebbfabc1SDerek Fang 	snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1,
2749ebbfabc1SDerek Fang 		RT5682_I2S_M_DIV_MASK | RT5682_I2S_CLK_SRC_MASK,
2750ebbfabc1SDerek Fang 		pre_div << RT5682_I2S_M_DIV_SFT |
2751ebbfabc1SDerek Fang 		(rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT);
2752ebbfabc1SDerek Fang 
2753ebbfabc1SDerek Fang 	return 0;
2754ebbfabc1SDerek Fang }
2755ebbfabc1SDerek Fang 
rt5682_bclk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)2756ebbfabc1SDerek Fang static unsigned long rt5682_bclk_recalc_rate(struct clk_hw *hw,
2757ebbfabc1SDerek Fang 					     unsigned long parent_rate)
2758ebbfabc1SDerek Fang {
2759ebbfabc1SDerek Fang 	struct rt5682_priv *rt5682 =
2760ebbfabc1SDerek Fang 		container_of(hw, struct rt5682_priv,
2761ebbfabc1SDerek Fang 			     dai_clks_hw[RT5682_DAI_BCLK_IDX]);
2762ebbfabc1SDerek Fang 	unsigned int bclks_per_wclk;
2763ebbfabc1SDerek Fang 
276457589f82SJack Yu 	regmap_read(rt5682->regmap, RT5682_TDM_TCON_CTRL, &bclks_per_wclk);
2765ebbfabc1SDerek Fang 
2766ebbfabc1SDerek Fang 	switch (bclks_per_wclk & RT5682_TDM_BCLK_MS1_MASK) {
2767ebbfabc1SDerek Fang 	case RT5682_TDM_BCLK_MS1_256:
2768ebbfabc1SDerek Fang 		return parent_rate * 256;
2769ebbfabc1SDerek Fang 	case RT5682_TDM_BCLK_MS1_128:
2770ebbfabc1SDerek Fang 		return parent_rate * 128;
2771ebbfabc1SDerek Fang 	case RT5682_TDM_BCLK_MS1_64:
2772ebbfabc1SDerek Fang 		return parent_rate * 64;
2773ebbfabc1SDerek Fang 	case RT5682_TDM_BCLK_MS1_32:
2774ebbfabc1SDerek Fang 		return parent_rate * 32;
2775ebbfabc1SDerek Fang 	default:
2776ebbfabc1SDerek Fang 		return 0;
2777ebbfabc1SDerek Fang 	}
2778ebbfabc1SDerek Fang }
2779ebbfabc1SDerek Fang 
rt5682_bclk_get_factor(unsigned long rate,unsigned long parent_rate)2780ebbfabc1SDerek Fang static unsigned long rt5682_bclk_get_factor(unsigned long rate,
2781ebbfabc1SDerek Fang 					    unsigned long parent_rate)
2782ebbfabc1SDerek Fang {
2783ebbfabc1SDerek Fang 	unsigned long factor;
2784ebbfabc1SDerek Fang 
2785ebbfabc1SDerek Fang 	factor = rate / parent_rate;
2786ebbfabc1SDerek Fang 	if (factor < 64)
2787ebbfabc1SDerek Fang 		return 32;
2788ebbfabc1SDerek Fang 	else if (factor < 128)
2789ebbfabc1SDerek Fang 		return 64;
2790ebbfabc1SDerek Fang 	else if (factor < 256)
2791ebbfabc1SDerek Fang 		return 128;
2792ebbfabc1SDerek Fang 	else
2793ebbfabc1SDerek Fang 		return 256;
2794ebbfabc1SDerek Fang }
2795ebbfabc1SDerek Fang 
rt5682_bclk_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)2796ebbfabc1SDerek Fang static long rt5682_bclk_round_rate(struct clk_hw *hw, unsigned long rate,
2797ebbfabc1SDerek Fang 				   unsigned long *parent_rate)
2798ebbfabc1SDerek Fang {
2799ebbfabc1SDerek Fang 	struct rt5682_priv *rt5682 =
2800ebbfabc1SDerek Fang 		container_of(hw, struct rt5682_priv,
2801ebbfabc1SDerek Fang 			     dai_clks_hw[RT5682_DAI_BCLK_IDX]);
2802ebbfabc1SDerek Fang 	unsigned long factor;
2803ebbfabc1SDerek Fang 
2804ebbfabc1SDerek Fang 	if (!*parent_rate || !rt5682_clk_check(rt5682))
2805ebbfabc1SDerek Fang 		return -EINVAL;
2806ebbfabc1SDerek Fang 
2807ebbfabc1SDerek Fang 	/*
2808ebbfabc1SDerek Fang 	 * BCLK rates are set as a multiplier of WCLK in HW.
2809ebbfabc1SDerek Fang 	 * We don't allow changing the parent WCLK. We just do
2810ebbfabc1SDerek Fang 	 * some rounding down based on the parent WCLK rate
2811ebbfabc1SDerek Fang 	 * and find the appropriate multiplier of BCLK to
2812ebbfabc1SDerek Fang 	 * get the rounded down BCLK value.
2813ebbfabc1SDerek Fang 	 */
2814ebbfabc1SDerek Fang 	factor = rt5682_bclk_get_factor(rate, *parent_rate);
2815ebbfabc1SDerek Fang 
2816ebbfabc1SDerek Fang 	return *parent_rate * factor;
2817ebbfabc1SDerek Fang }
2818ebbfabc1SDerek Fang 
rt5682_bclk_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)2819ebbfabc1SDerek Fang static int rt5682_bclk_set_rate(struct clk_hw *hw, unsigned long rate,
2820ebbfabc1SDerek Fang 				unsigned long parent_rate)
2821ebbfabc1SDerek Fang {
2822ebbfabc1SDerek Fang 	struct rt5682_priv *rt5682 =
2823ebbfabc1SDerek Fang 		container_of(hw, struct rt5682_priv,
2824ebbfabc1SDerek Fang 			     dai_clks_hw[RT5682_DAI_BCLK_IDX]);
282557589f82SJack Yu 	struct snd_soc_component *component;
2826f1a1da09SPierre-Louis Bossart 	struct snd_soc_dai *dai;
2827ebbfabc1SDerek Fang 	unsigned long factor;
2828ebbfabc1SDerek Fang 
2829ebbfabc1SDerek Fang 	if (!rt5682_clk_check(rt5682))
2830ebbfabc1SDerek Fang 		return -EINVAL;
2831ebbfabc1SDerek Fang 
283257589f82SJack Yu 	component = rt5682->component;
283357589f82SJack Yu 
2834ebbfabc1SDerek Fang 	factor = rt5682_bclk_get_factor(rate, parent_rate);
2835ebbfabc1SDerek Fang 
2836ebbfabc1SDerek Fang 	for_each_component_dais(component, dai)
2837ebbfabc1SDerek Fang 		if (dai->id == RT5682_AIF1)
2838c8618d65SXiaomeng Tong 			return rt5682_set_bclk1_ratio(dai, factor);
2839c8618d65SXiaomeng Tong 
284057589f82SJack Yu 	dev_err(rt5682->i2c_dev, "dai %d not found in component\n",
2841ebbfabc1SDerek Fang 		RT5682_AIF1);
2842ebbfabc1SDerek Fang 	return -ENODEV;
2843ebbfabc1SDerek Fang }
2844ebbfabc1SDerek Fang 
2845ebbfabc1SDerek Fang static const struct clk_ops rt5682_dai_clk_ops[RT5682_DAI_NUM_CLKS] = {
2846ebbfabc1SDerek Fang 	[RT5682_DAI_WCLK_IDX] = {
2847ebbfabc1SDerek Fang 		.prepare = rt5682_wclk_prepare,
2848ebbfabc1SDerek Fang 		.unprepare = rt5682_wclk_unprepare,
2849ebbfabc1SDerek Fang 		.recalc_rate = rt5682_wclk_recalc_rate,
2850ebbfabc1SDerek Fang 		.round_rate = rt5682_wclk_round_rate,
2851ebbfabc1SDerek Fang 		.set_rate = rt5682_wclk_set_rate,
2852ebbfabc1SDerek Fang 	},
2853ebbfabc1SDerek Fang 	[RT5682_DAI_BCLK_IDX] = {
2854ebbfabc1SDerek Fang 		.recalc_rate = rt5682_bclk_recalc_rate,
2855ebbfabc1SDerek Fang 		.round_rate = rt5682_bclk_round_rate,
2856ebbfabc1SDerek Fang 		.set_rate = rt5682_bclk_set_rate,
2857ebbfabc1SDerek Fang 	},
2858ebbfabc1SDerek Fang };
2859ebbfabc1SDerek Fang 
rt5682_register_dai_clks(struct rt5682_priv * rt5682)286057589f82SJack Yu int rt5682_register_dai_clks(struct rt5682_priv *rt5682)
2861ebbfabc1SDerek Fang {
286257589f82SJack Yu 	struct device *dev = rt5682->i2c_dev;
2863ebbfabc1SDerek Fang 	struct rt5682_platform_data *pdata = &rt5682->pdata;
2864ebbfabc1SDerek Fang 	struct clk_hw *dai_clk_hw;
2865ebbfabc1SDerek Fang 	int i, ret;
2866ebbfabc1SDerek Fang 
2867ebbfabc1SDerek Fang 	for (i = 0; i < RT5682_DAI_NUM_CLKS; ++i) {
2868edbd24eaSStephen Boyd 		struct clk_init_data init = { };
28694999d703SRob Clark 		const struct clk_hw *parent;
2870edbd24eaSStephen Boyd 
2871ebbfabc1SDerek Fang 		dai_clk_hw = &rt5682->dai_clks_hw[i];
2872ebbfabc1SDerek Fang 
2873ebbfabc1SDerek Fang 		switch (i) {
2874ebbfabc1SDerek Fang 		case RT5682_DAI_WCLK_IDX:
2875ebbfabc1SDerek Fang 			/* Make MCLK the parent of WCLK */
2876ebbfabc1SDerek Fang 			if (rt5682->mclk) {
2877cc5c9788SDerek Fang 				parent = __clk_get_hw(rt5682->mclk);
2878cc5c9788SDerek Fang 				init.parent_hws = &parent;
2879ebbfabc1SDerek Fang 				init.num_parents = 1;
2880ebbfabc1SDerek Fang 			}
2881ebbfabc1SDerek Fang 			break;
2882ebbfabc1SDerek Fang 		case RT5682_DAI_BCLK_IDX:
2883ebbfabc1SDerek Fang 			/* Make WCLK the parent of BCLK */
28844999d703SRob Clark 			parent = &rt5682->dai_clks_hw[RT5682_DAI_WCLK_IDX];
28854999d703SRob Clark 			init.parent_hws = &parent;
2886ebbfabc1SDerek Fang 			init.num_parents = 1;
2887ebbfabc1SDerek Fang 			break;
2888ebbfabc1SDerek Fang 		default:
2889ebbfabc1SDerek Fang 			dev_err(dev, "Invalid clock index\n");
2890653bdab2SStephen Boyd 			return -EINVAL;
2891ebbfabc1SDerek Fang 		}
2892ebbfabc1SDerek Fang 
2893ebbfabc1SDerek Fang 		init.name = pdata->dai_clk_names[i];
2894ebbfabc1SDerek Fang 		init.ops = &rt5682_dai_clk_ops[i];
2895ebbfabc1SDerek Fang 		init.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_GATE;
2896ebbfabc1SDerek Fang 		dai_clk_hw->init = &init;
2897ebbfabc1SDerek Fang 
2898653bdab2SStephen Boyd 		ret = devm_clk_hw_register(dev, dai_clk_hw);
2899653bdab2SStephen Boyd 		if (ret) {
2900653bdab2SStephen Boyd 			dev_warn(dev, "Failed to register %s: %d\n",
2901653bdab2SStephen Boyd 				 init.name, ret);
2902653bdab2SStephen Boyd 			return ret;
2903ebbfabc1SDerek Fang 		}
2904ebbfabc1SDerek Fang 
2905ebbfabc1SDerek Fang 		if (dev->of_node) {
2906*543a3c7dSMa Ke 			ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
2907ebbfabc1SDerek Fang 						    dai_clk_hw);
2908*543a3c7dSMa Ke 			if (ret)
2909*543a3c7dSMa Ke 				return ret;
2910ebbfabc1SDerek Fang 		} else {
2911653bdab2SStephen Boyd 			ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw,
2912653bdab2SStephen Boyd 							  init.name,
2913653bdab2SStephen Boyd 							  dev_name(dev));
2914653bdab2SStephen Boyd 			if (ret)
2915653bdab2SStephen Boyd 				return ret;
2916ebbfabc1SDerek Fang 		}
2917ebbfabc1SDerek Fang 	}
2918ebbfabc1SDerek Fang 
2919ebbfabc1SDerek Fang 	return 0;
2920ebbfabc1SDerek Fang }
292157589f82SJack Yu EXPORT_SYMBOL_GPL(rt5682_register_dai_clks);
2922ebbfabc1SDerek Fang #endif /* CONFIG_COMMON_CLK */
2923ebbfabc1SDerek Fang 
rt5682_probe(struct snd_soc_component * component)29240ddce71cSBard Liao static int rt5682_probe(struct snd_soc_component *component)
29250ddce71cSBard Liao {
29260ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
292703f6fc6dSOder Chiou 	struct sdw_slave *slave;
292803f6fc6dSOder Chiou 	unsigned long time;
2929969943bfSShuming Fan 	struct snd_soc_dapm_context *dapm = &component->dapm;
29300ddce71cSBard Liao 
29310ddce71cSBard Liao 	rt5682->component = component;
29320ddce71cSBard Liao 
293303f6fc6dSOder Chiou 	if (rt5682->is_sdw) {
293403f6fc6dSOder Chiou 		slave = rt5682->slave;
293503f6fc6dSOder Chiou 		time = wait_for_completion_timeout(
293603f6fc6dSOder Chiou 			&slave->initialization_complete,
293703f6fc6dSOder Chiou 			msecs_to_jiffies(RT5682_PROBE_TIMEOUT));
293803f6fc6dSOder Chiou 		if (!time) {
293903f6fc6dSOder Chiou 			dev_err(&slave->dev, "Initialization not complete, timed out\n");
294003f6fc6dSOder Chiou 			return -ETIMEDOUT;
294103f6fc6dSOder Chiou 		}
294203f6fc6dSOder Chiou 	}
294303f6fc6dSOder Chiou 
2944969943bfSShuming Fan 	snd_soc_dapm_disable_pin(dapm, "MICBIAS");
2945969943bfSShuming Fan 	snd_soc_dapm_disable_pin(dapm, "Vref2");
2946969943bfSShuming Fan 	snd_soc_dapm_sync(dapm);
29470ddce71cSBard Liao 	return 0;
29480ddce71cSBard Liao }
29490ddce71cSBard Liao 
rt5682_remove(struct snd_soc_component * component)29500ddce71cSBard Liao static void rt5682_remove(struct snd_soc_component *component)
29510ddce71cSBard Liao {
29520ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
29530ddce71cSBard Liao 
2954b5848c81SOder Chiou 	rt5682_reset(rt5682);
29550ddce71cSBard Liao }
29560ddce71cSBard Liao 
29570ddce71cSBard Liao #ifdef CONFIG_PM
rt5682_suspend(struct snd_soc_component * component)29580ddce71cSBard Liao static int rt5682_suspend(struct snd_soc_component *component)
29590ddce71cSBard Liao {
29600ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
296189d751d8SShuming Fan 	unsigned int val;
29620ddce71cSBard Liao 
296330fd8f65SBard Liao 	if (rt5682->is_sdw)
296430fd8f65SBard Liao 		return 0;
296530fd8f65SBard Liao 
29668b271370SMatthias Kaehlcke 	if (rt5682->irq)
29678b271370SMatthias Kaehlcke 		disable_irq(rt5682->irq);
29688b271370SMatthias Kaehlcke 
296989d751d8SShuming Fan 	cancel_delayed_work_sync(&rt5682->jack_detect_work);
297089d751d8SShuming Fan 	cancel_delayed_work_sync(&rt5682->jd_check_work);
29712cd9b0efSDerek Fang 	if (rt5682->hs_jack && (rt5682->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) {
297289d751d8SShuming Fan 		val = snd_soc_component_read(component,
297389d751d8SShuming Fan 				RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK;
297489d751d8SShuming Fan 
297589d751d8SShuming Fan 		switch (val) {
297689d751d8SShuming Fan 		case 0x1:
297789d751d8SShuming Fan 			snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
297889d751d8SShuming Fan 				RT5682_SAR_SEL_MB1_MASK | RT5682_SAR_SEL_MB2_MASK,
297989d751d8SShuming Fan 				RT5682_SAR_SEL_MB1_NOSEL | RT5682_SAR_SEL_MB2_SEL);
298089d751d8SShuming Fan 			break;
298189d751d8SShuming Fan 		case 0x2:
298289d751d8SShuming Fan 			snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
298389d751d8SShuming Fan 				RT5682_SAR_SEL_MB1_MASK | RT5682_SAR_SEL_MB2_MASK,
298489d751d8SShuming Fan 				RT5682_SAR_SEL_MB1_SEL | RT5682_SAR_SEL_MB2_NOSEL);
298589d751d8SShuming Fan 			break;
298689d751d8SShuming Fan 		default:
298789d751d8SShuming Fan 			break;
298889d751d8SShuming Fan 		}
298989d751d8SShuming Fan 
299089d751d8SShuming Fan 		/* enter SAR ADC power saving mode */
299189d751d8SShuming Fan 		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
29928d3019b6SDerek Fang 			RT5682_SAR_BUTT_DET_MASK | RT5682_SAR_BUTDET_MODE_MASK |
2993a3774a2aSDerek Fang 			RT5682_SAR_SEL_MB1_MB2_MASK, 0);
2994a3774a2aSDerek Fang 		usleep_range(5000, 6000);
2995a3774a2aSDerek Fang 		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
2996a3774a2aSDerek Fang 			RT5682_MB1_PATH_MASK | RT5682_MB2_PATH_MASK,
2997a3774a2aSDerek Fang 			RT5682_CTRL_MB1_REG | RT5682_CTRL_MB2_REG);
2998a3774a2aSDerek Fang 		usleep_range(10000, 12000);
299989d751d8SShuming Fan 		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
3000a3774a2aSDerek Fang 			RT5682_SAR_BUTT_DET_MASK | RT5682_SAR_BUTDET_MODE_MASK,
3001a3774a2aSDerek Fang 			RT5682_SAR_BUTT_DET_EN | RT5682_SAR_BUTDET_POW_SAV);
30022cd9b0efSDerek Fang 		snd_soc_component_update_bits(component, RT5682_HP_CHARGE_PUMP_1,
30032cd9b0efSDerek Fang 			RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0);
300489d751d8SShuming Fan 	}
300589d751d8SShuming Fan 
30060ddce71cSBard Liao 	regcache_cache_only(rt5682->regmap, true);
30070ddce71cSBard Liao 	regcache_mark_dirty(rt5682->regmap);
30080ddce71cSBard Liao 	return 0;
30090ddce71cSBard Liao }
30100ddce71cSBard Liao 
rt5682_resume(struct snd_soc_component * component)30110ddce71cSBard Liao static int rt5682_resume(struct snd_soc_component *component)
30120ddce71cSBard Liao {
30130ddce71cSBard Liao 	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
30140ddce71cSBard Liao 
301530fd8f65SBard Liao 	if (rt5682->is_sdw)
301630fd8f65SBard Liao 		return 0;
301730fd8f65SBard Liao 
30180ddce71cSBard Liao 	regcache_cache_only(rt5682->regmap, false);
30190ddce71cSBard Liao 	regcache_sync(rt5682->regmap);
30200ddce71cSBard Liao 
30212cd9b0efSDerek Fang 	if (rt5682->hs_jack && (rt5682->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) {
30228d3019b6SDerek Fang 		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
30238d3019b6SDerek Fang 			RT5682_SAR_BUTDET_MODE_MASK | RT5682_SAR_SEL_MB1_MB2_MASK,
30248d3019b6SDerek Fang 			RT5682_SAR_BUTDET_POW_NORM | RT5682_SAR_SEL_MB1_MB2_AUTO);
30252cd9b0efSDerek Fang 		usleep_range(5000, 6000);
302689d751d8SShuming Fan 		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
302789d751d8SShuming Fan 			RT5682_MB1_PATH_MASK | RT5682_MB2_PATH_MASK,
302889d751d8SShuming Fan 			RT5682_CTRL_MB1_FSM | RT5682_CTRL_MB2_FSM);
302989d751d8SShuming Fan 		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
303089d751d8SShuming Fan 			RT5682_PWR_CBJ, RT5682_PWR_CBJ);
303189d751d8SShuming Fan 	}
303289d751d8SShuming Fan 
30332cd9b0efSDerek Fang 	rt5682->jack_type = 0;
3034a50067d4SArnd Bergmann 	mod_delayed_work(system_power_efficient_wq,
30352cd9b0efSDerek Fang 		&rt5682->jack_detect_work, msecs_to_jiffies(0));
30364834d707SShuming Fan 
30378b271370SMatthias Kaehlcke 	if (rt5682->irq)
30388b271370SMatthias Kaehlcke 		enable_irq(rt5682->irq);
30398b271370SMatthias Kaehlcke 
30400ddce71cSBard Liao 	return 0;
30410ddce71cSBard Liao }
30420ddce71cSBard Liao #else
30430ddce71cSBard Liao #define rt5682_suspend NULL
30440ddce71cSBard Liao #define rt5682_resume NULL
30450ddce71cSBard Liao #endif
30460ddce71cSBard Liao 
3047a50067d4SArnd Bergmann const struct snd_soc_dai_ops rt5682_aif1_dai_ops = {
30480ddce71cSBard Liao 	.hw_params = rt5682_hw_params,
30490ddce71cSBard Liao 	.set_fmt = rt5682_set_dai_fmt,
30500ddce71cSBard Liao 	.set_tdm_slot = rt5682_set_tdm_slot,
30510c48a653Sderek.fang 	.set_bclk_ratio = rt5682_set_bclk1_ratio,
30520ddce71cSBard Liao };
3053a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_aif1_dai_ops);
30540ddce71cSBard Liao 
3055a50067d4SArnd Bergmann const struct snd_soc_dai_ops rt5682_aif2_dai_ops = {
30560ddce71cSBard Liao 	.hw_params = rt5682_hw_params,
30570ddce71cSBard Liao 	.set_fmt = rt5682_set_dai_fmt,
30580c48a653Sderek.fang 	.set_bclk_ratio = rt5682_set_bclk2_ratio,
30590ddce71cSBard Liao };
3060a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_aif2_dai_ops);
30610ddce71cSBard Liao 
3062a50067d4SArnd Bergmann const struct snd_soc_component_driver rt5682_soc_component_dev = {
30630ddce71cSBard Liao 	.probe = rt5682_probe,
30640ddce71cSBard Liao 	.remove = rt5682_remove,
30650ddce71cSBard Liao 	.suspend = rt5682_suspend,
30660ddce71cSBard Liao 	.resume = rt5682_resume,
30670ddce71cSBard Liao 	.set_bias_level = rt5682_set_bias_level,
30680ddce71cSBard Liao 	.controls = rt5682_snd_controls,
30690ddce71cSBard Liao 	.num_controls = ARRAY_SIZE(rt5682_snd_controls),
30700ddce71cSBard Liao 	.dapm_widgets = rt5682_dapm_widgets,
30710ddce71cSBard Liao 	.num_dapm_widgets = ARRAY_SIZE(rt5682_dapm_widgets),
30720ddce71cSBard Liao 	.dapm_routes = rt5682_dapm_routes,
30730ddce71cSBard Liao 	.num_dapm_routes = ARRAY_SIZE(rt5682_dapm_routes),
30740ddce71cSBard Liao 	.set_sysclk = rt5682_set_component_sysclk,
30750ddce71cSBard Liao 	.set_pll = rt5682_set_component_pll,
30760ddce71cSBard Liao 	.set_jack = rt5682_set_jack_detect,
30770ddce71cSBard Liao 	.use_pmdown_time	= 1,
30780ddce71cSBard Liao 	.endianness		= 1,
30790ddce71cSBard Liao };
3080a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_soc_component_dev);
30810ddce71cSBard Liao 
rt5682_parse_dt(struct rt5682_priv * rt5682,struct device * dev)3082a50067d4SArnd Bergmann int rt5682_parse_dt(struct rt5682_priv *rt5682, struct device *dev)
30830ddce71cSBard Liao {
30840ddce71cSBard Liao 
30850ddce71cSBard Liao 	device_property_read_u32(dev, "realtek,dmic1-data-pin",
30860ddce71cSBard Liao 		&rt5682->pdata.dmic1_data_pin);
30870ddce71cSBard Liao 	device_property_read_u32(dev, "realtek,dmic1-clk-pin",
30880ddce71cSBard Liao 		&rt5682->pdata.dmic1_clk_pin);
30890ddce71cSBard Liao 	device_property_read_u32(dev, "realtek,jd-src",
30900ddce71cSBard Liao 		&rt5682->pdata.jd_src);
3091e2264458SShuming Fan 	device_property_read_u32(dev, "realtek,btndet-delay",
3092e2264458SShuming Fan 		&rt5682->pdata.btndet_delay);
30939a74c44aSOder Chiou 	device_property_read_u32(dev, "realtek,dmic-clk-rate-hz",
30949a74c44aSOder Chiou 		&rt5682->pdata.dmic_clk_rate);
30958b15ee0bSOder Chiou 	device_property_read_u32(dev, "realtek,dmic-delay-ms",
30968b15ee0bSOder Chiou 		&rt5682->pdata.dmic_delay);
30970ddce71cSBard Liao 
3098ebbfabc1SDerek Fang 	if (device_property_read_string_array(dev, "clock-output-names",
3099ebbfabc1SDerek Fang 					      rt5682->pdata.dai_clk_names,
3100ebbfabc1SDerek Fang 					      RT5682_DAI_NUM_CLKS) < 0)
3101ebbfabc1SDerek Fang 		dev_warn(dev, "Using default DAI clk names: %s, %s\n",
3102ebbfabc1SDerek Fang 			 rt5682->pdata.dai_clk_names[RT5682_DAI_WCLK_IDX],
3103ebbfabc1SDerek Fang 			 rt5682->pdata.dai_clk_names[RT5682_DAI_BCLK_IDX]);
3104ebbfabc1SDerek Fang 
31057416f6bcSOder Chiou 	rt5682->pdata.dmic_clk_driving_high = device_property_read_bool(dev,
31067416f6bcSOder Chiou 		"realtek,dmic-clk-driving-high");
31077416f6bcSOder Chiou 
31080ddce71cSBard Liao 	return 0;
31090ddce71cSBard Liao }
3110a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_parse_dt);
31110ddce71cSBard Liao 
rt5682_get_ldo1(struct rt5682_priv * rt5682,struct device * dev)3112ed117017SLinus Walleij int rt5682_get_ldo1(struct rt5682_priv *rt5682, struct device *dev)
3113ed117017SLinus Walleij {
3114ed117017SLinus Walleij 	rt5682->ldo1_en = devm_gpiod_get_optional(dev,
3115ed117017SLinus Walleij 						  "realtek,ldo1-en",
3116ed117017SLinus Walleij 						  GPIOD_OUT_HIGH);
3117ed117017SLinus Walleij 	if (IS_ERR(rt5682->ldo1_en)) {
3118ed117017SLinus Walleij 		dev_err(dev, "Fail gpio request ldo1_en\n");
3119ed117017SLinus Walleij 		return PTR_ERR(rt5682->ldo1_en);
3120ed117017SLinus Walleij 	}
3121ed117017SLinus Walleij 
3122ed117017SLinus Walleij 	return 0;
3123ed117017SLinus Walleij }
3124ed117017SLinus Walleij EXPORT_SYMBOL_GPL(rt5682_get_ldo1);
3125ed117017SLinus Walleij 
rt5682_calibrate(struct rt5682_priv * rt5682)3126a50067d4SArnd Bergmann void rt5682_calibrate(struct rt5682_priv *rt5682)
31270ddce71cSBard Liao {
31280ddce71cSBard Liao 	int value, count;
31290ddce71cSBard Liao 
31300ddce71cSBard Liao 	mutex_lock(&rt5682->calibrate_mutex);
31310ddce71cSBard Liao 
3132b5848c81SOder Chiou 	rt5682_reset(rt5682);
3133bc094709SShuming Fan 	regmap_write(rt5682->regmap, RT5682_I2C_CTRL, 0x000f);
3134afd603e4SShuming Fan 	regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xa2af);
31350ddce71cSBard Liao 	usleep_range(15000, 20000);
3136afd603e4SShuming Fan 	regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xf2af);
3137513792c2SShuming Fan 	regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0300);
3138513792c2SShuming Fan 	regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x8000);
3139513792c2SShuming Fan 	regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0100);
3140afd603e4SShuming Fan 	regmap_write(rt5682->regmap, RT5682_HP_IMP_SENS_CTRL_19, 0x3800);
31410ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x3000);
3142afd603e4SShuming Fan 	regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x7005);
31430ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0x686c);
31440ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0d0d);
31450ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_2, 0x0321);
31460ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_HP_LOGIC_CTRL_2, 0x0004);
31470ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00);
31480ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_3, 0x06a1);
31490ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_A_DAC1_MUX, 0x0311);
3150513792c2SShuming Fan 	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00);
31510ddce71cSBard Liao 
31520ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0xfc00);
31530ddce71cSBard Liao 
31540ddce71cSBard Liao 	for (count = 0; count < 60; count++) {
31550ddce71cSBard Liao 		regmap_read(rt5682->regmap, RT5682_HP_CALIB_STA_1, &value);
31560ddce71cSBard Liao 		if (!(value & 0x8000))
31570ddce71cSBard Liao 			break;
31580ddce71cSBard Liao 
31590ddce71cSBard Liao 		usleep_range(10000, 10005);
31600ddce71cSBard Liao 	}
31610ddce71cSBard Liao 
31620ddce71cSBard Liao 	if (count >= 60)
31639c1cb755STzung-Bi Shih 		dev_err(rt5682->component->dev, "HP Calibration Failure\n");
31640ddce71cSBard Liao 
31650ddce71cSBard Liao 	/* restore settings */
31666301adf9SShuming Fan 	regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0x002f);
3167afd603e4SShuming Fan 	regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0080);
3168513792c2SShuming Fan 	regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x0000);
31690ddce71cSBard Liao 	regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0000);
3170afd603e4SShuming Fan 	regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x2000);
3171afd603e4SShuming Fan 	regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x2005);
317222c7d5e7SShuming Fan 	regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0xc0c4);
31736301adf9SShuming Fan 	regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0c0c);
31740ddce71cSBard Liao 
31750ddce71cSBard Liao 	mutex_unlock(&rt5682->calibrate_mutex);
31760ddce71cSBard Liao }
3177a50067d4SArnd Bergmann EXPORT_SYMBOL_GPL(rt5682_calibrate);
31780ddce71cSBard Liao 
31790ddce71cSBard Liao MODULE_DESCRIPTION("ASoC RT5682 driver");
31800ddce71cSBard Liao MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
31810ddce71cSBard Liao MODULE_LICENSE("GPL v2");
3182