162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// rt5682.c  --  RT5682 ALSA SoC audio component driver
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright 2018 Realtek Semiconductor Corp.
662306a36Sopenharmony_ci// Author: Bard Liao <bardliao@realtek.com>
762306a36Sopenharmony_ci//
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/module.h>
1062306a36Sopenharmony_ci#include <linux/moduleparam.h>
1162306a36Sopenharmony_ci#include <linux/init.h>
1262306a36Sopenharmony_ci#include <linux/delay.h>
1362306a36Sopenharmony_ci#include <linux/pm.h>
1462306a36Sopenharmony_ci#include <linux/pm_runtime.h>
1562306a36Sopenharmony_ci#include <linux/platform_device.h>
1662306a36Sopenharmony_ci#include <linux/spi/spi.h>
1762306a36Sopenharmony_ci#include <linux/acpi.h>
1862306a36Sopenharmony_ci#include <linux/gpio/consumer.h>
1962306a36Sopenharmony_ci#include <linux/mutex.h>
2062306a36Sopenharmony_ci#include <sound/core.h>
2162306a36Sopenharmony_ci#include <sound/pcm.h>
2262306a36Sopenharmony_ci#include <sound/pcm_params.h>
2362306a36Sopenharmony_ci#include <sound/jack.h>
2462306a36Sopenharmony_ci#include <sound/soc.h>
2562306a36Sopenharmony_ci#include <sound/soc-dapm.h>
2662306a36Sopenharmony_ci#include <sound/initval.h>
2762306a36Sopenharmony_ci#include <sound/tlv.h>
2862306a36Sopenharmony_ci#include <sound/rt5682.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#include "rl6231.h"
3162306a36Sopenharmony_ci#include "rt5682.h"
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciconst char *rt5682_supply_names[RT5682_NUM_SUPPLIES] = {
3462306a36Sopenharmony_ci	"AVDD",
3562306a36Sopenharmony_ci	"MICVDD",
3662306a36Sopenharmony_ci	"VBAT",
3762306a36Sopenharmony_ci	"DBVDD",
3862306a36Sopenharmony_ci	"LDO1-IN",
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_supply_names);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic const struct reg_sequence patch_list[] = {
4362306a36Sopenharmony_ci	{RT5682_HP_IMP_SENS_CTRL_19, 0x1000},
4462306a36Sopenharmony_ci	{RT5682_DAC_ADC_DIG_VOL1, 0xa020},
4562306a36Sopenharmony_ci	{RT5682_I2C_CTRL, 0x000f},
4662306a36Sopenharmony_ci	{RT5682_PLL2_INTERNAL, 0x8266},
4762306a36Sopenharmony_ci	{RT5682_SAR_IL_CMD_1, 0x22b7},
4862306a36Sopenharmony_ci	{RT5682_SAR_IL_CMD_3, 0x0365},
4962306a36Sopenharmony_ci	{RT5682_SAR_IL_CMD_6, 0x0110},
5062306a36Sopenharmony_ci	{RT5682_CHARGE_PUMP_1, 0x0210},
5162306a36Sopenharmony_ci	{RT5682_HP_LOGIC_CTRL_2, 0x0007},
5262306a36Sopenharmony_ci	{RT5682_SAR_IL_CMD_2, 0xac00},
5362306a36Sopenharmony_ci	{RT5682_CBJ_CTRL_7, 0x0104},
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_civoid rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	int ret;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	ret = regmap_multi_reg_write(rt5682->regmap, patch_list,
6162306a36Sopenharmony_ci				     ARRAY_SIZE(patch_list));
6262306a36Sopenharmony_ci	if (ret)
6362306a36Sopenharmony_ci		dev_warn(dev, "Failed to apply regmap patch: %d\n", ret);
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_apply_patch_list);
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciconst struct reg_default rt5682_reg[RT5682_REG_NUM] = {
6862306a36Sopenharmony_ci	{0x0002, 0x8080},
6962306a36Sopenharmony_ci	{0x0003, 0x8000},
7062306a36Sopenharmony_ci	{0x0005, 0x0000},
7162306a36Sopenharmony_ci	{0x0006, 0x0000},
7262306a36Sopenharmony_ci	{0x0008, 0x800f},
7362306a36Sopenharmony_ci	{0x000b, 0x0000},
7462306a36Sopenharmony_ci	{0x0010, 0x4040},
7562306a36Sopenharmony_ci	{0x0011, 0x0000},
7662306a36Sopenharmony_ci	{0x0012, 0x1404},
7762306a36Sopenharmony_ci	{0x0013, 0x1000},
7862306a36Sopenharmony_ci	{0x0014, 0xa00a},
7962306a36Sopenharmony_ci	{0x0015, 0x0404},
8062306a36Sopenharmony_ci	{0x0016, 0x0404},
8162306a36Sopenharmony_ci	{0x0019, 0xafaf},
8262306a36Sopenharmony_ci	{0x001c, 0x2f2f},
8362306a36Sopenharmony_ci	{0x001f, 0x0000},
8462306a36Sopenharmony_ci	{0x0022, 0x5757},
8562306a36Sopenharmony_ci	{0x0023, 0x0039},
8662306a36Sopenharmony_ci	{0x0024, 0x000b},
8762306a36Sopenharmony_ci	{0x0026, 0xc0c4},
8862306a36Sopenharmony_ci	{0x0029, 0x8080},
8962306a36Sopenharmony_ci	{0x002a, 0xa0a0},
9062306a36Sopenharmony_ci	{0x002b, 0x0300},
9162306a36Sopenharmony_ci	{0x0030, 0x0000},
9262306a36Sopenharmony_ci	{0x003c, 0x0080},
9362306a36Sopenharmony_ci	{0x0044, 0x0c0c},
9462306a36Sopenharmony_ci	{0x0049, 0x0000},
9562306a36Sopenharmony_ci	{0x0061, 0x0000},
9662306a36Sopenharmony_ci	{0x0062, 0x0000},
9762306a36Sopenharmony_ci	{0x0063, 0x003f},
9862306a36Sopenharmony_ci	{0x0064, 0x0000},
9962306a36Sopenharmony_ci	{0x0065, 0x0000},
10062306a36Sopenharmony_ci	{0x0066, 0x0030},
10162306a36Sopenharmony_ci	{0x0067, 0x0000},
10262306a36Sopenharmony_ci	{0x006b, 0x0000},
10362306a36Sopenharmony_ci	{0x006c, 0x0000},
10462306a36Sopenharmony_ci	{0x006d, 0x2200},
10562306a36Sopenharmony_ci	{0x006e, 0x0a10},
10662306a36Sopenharmony_ci	{0x0070, 0x8000},
10762306a36Sopenharmony_ci	{0x0071, 0x8000},
10862306a36Sopenharmony_ci	{0x0073, 0x0000},
10962306a36Sopenharmony_ci	{0x0074, 0x0000},
11062306a36Sopenharmony_ci	{0x0075, 0x0002},
11162306a36Sopenharmony_ci	{0x0076, 0x0001},
11262306a36Sopenharmony_ci	{0x0079, 0x0000},
11362306a36Sopenharmony_ci	{0x007a, 0x0000},
11462306a36Sopenharmony_ci	{0x007b, 0x0000},
11562306a36Sopenharmony_ci	{0x007c, 0x0100},
11662306a36Sopenharmony_ci	{0x007e, 0x0000},
11762306a36Sopenharmony_ci	{0x0080, 0x0000},
11862306a36Sopenharmony_ci	{0x0081, 0x0000},
11962306a36Sopenharmony_ci	{0x0082, 0x0000},
12062306a36Sopenharmony_ci	{0x0083, 0x0000},
12162306a36Sopenharmony_ci	{0x0084, 0x0000},
12262306a36Sopenharmony_ci	{0x0085, 0x0000},
12362306a36Sopenharmony_ci	{0x0086, 0x0005},
12462306a36Sopenharmony_ci	{0x0087, 0x0000},
12562306a36Sopenharmony_ci	{0x0088, 0x0000},
12662306a36Sopenharmony_ci	{0x008c, 0x0003},
12762306a36Sopenharmony_ci	{0x008d, 0x0000},
12862306a36Sopenharmony_ci	{0x008e, 0x0060},
12962306a36Sopenharmony_ci	{0x008f, 0x1000},
13062306a36Sopenharmony_ci	{0x0091, 0x0c26},
13162306a36Sopenharmony_ci	{0x0092, 0x0073},
13262306a36Sopenharmony_ci	{0x0093, 0x0000},
13362306a36Sopenharmony_ci	{0x0094, 0x0080},
13462306a36Sopenharmony_ci	{0x0098, 0x0000},
13562306a36Sopenharmony_ci	{0x009a, 0x0000},
13662306a36Sopenharmony_ci	{0x009b, 0x0000},
13762306a36Sopenharmony_ci	{0x009c, 0x0000},
13862306a36Sopenharmony_ci	{0x009d, 0x0000},
13962306a36Sopenharmony_ci	{0x009e, 0x100c},
14062306a36Sopenharmony_ci	{0x009f, 0x0000},
14162306a36Sopenharmony_ci	{0x00a0, 0x0000},
14262306a36Sopenharmony_ci	{0x00a3, 0x0002},
14362306a36Sopenharmony_ci	{0x00a4, 0x0001},
14462306a36Sopenharmony_ci	{0x00ae, 0x2040},
14562306a36Sopenharmony_ci	{0x00af, 0x0000},
14662306a36Sopenharmony_ci	{0x00b6, 0x0000},
14762306a36Sopenharmony_ci	{0x00b7, 0x0000},
14862306a36Sopenharmony_ci	{0x00b8, 0x0000},
14962306a36Sopenharmony_ci	{0x00b9, 0x0002},
15062306a36Sopenharmony_ci	{0x00be, 0x0000},
15162306a36Sopenharmony_ci	{0x00c0, 0x0160},
15262306a36Sopenharmony_ci	{0x00c1, 0x82a0},
15362306a36Sopenharmony_ci	{0x00c2, 0x0000},
15462306a36Sopenharmony_ci	{0x00d0, 0x0000},
15562306a36Sopenharmony_ci	{0x00d1, 0x2244},
15662306a36Sopenharmony_ci	{0x00d2, 0x3300},
15762306a36Sopenharmony_ci	{0x00d3, 0x2200},
15862306a36Sopenharmony_ci	{0x00d4, 0x0000},
15962306a36Sopenharmony_ci	{0x00d9, 0x0009},
16062306a36Sopenharmony_ci	{0x00da, 0x0000},
16162306a36Sopenharmony_ci	{0x00db, 0x0000},
16262306a36Sopenharmony_ci	{0x00dc, 0x00c0},
16362306a36Sopenharmony_ci	{0x00dd, 0x2220},
16462306a36Sopenharmony_ci	{0x00de, 0x3131},
16562306a36Sopenharmony_ci	{0x00df, 0x3131},
16662306a36Sopenharmony_ci	{0x00e0, 0x3131},
16762306a36Sopenharmony_ci	{0x00e2, 0x0000},
16862306a36Sopenharmony_ci	{0x00e3, 0x4000},
16962306a36Sopenharmony_ci	{0x00e4, 0x0aa0},
17062306a36Sopenharmony_ci	{0x00e5, 0x3131},
17162306a36Sopenharmony_ci	{0x00e6, 0x3131},
17262306a36Sopenharmony_ci	{0x00e7, 0x3131},
17362306a36Sopenharmony_ci	{0x00e8, 0x3131},
17462306a36Sopenharmony_ci	{0x00ea, 0xb320},
17562306a36Sopenharmony_ci	{0x00eb, 0x0000},
17662306a36Sopenharmony_ci	{0x00f0, 0x0000},
17762306a36Sopenharmony_ci	{0x00f1, 0x00d0},
17862306a36Sopenharmony_ci	{0x00f2, 0x00d0},
17962306a36Sopenharmony_ci	{0x00f6, 0x0000},
18062306a36Sopenharmony_ci	{0x00fa, 0x0000},
18162306a36Sopenharmony_ci	{0x00fb, 0x0000},
18262306a36Sopenharmony_ci	{0x00fc, 0x0000},
18362306a36Sopenharmony_ci	{0x00fd, 0x0000},
18462306a36Sopenharmony_ci	{0x00fe, 0x10ec},
18562306a36Sopenharmony_ci	{0x00ff, 0x6530},
18662306a36Sopenharmony_ci	{0x0100, 0xa0a0},
18762306a36Sopenharmony_ci	{0x010b, 0x0000},
18862306a36Sopenharmony_ci	{0x010c, 0xae00},
18962306a36Sopenharmony_ci	{0x010d, 0xaaa0},
19062306a36Sopenharmony_ci	{0x010e, 0x8aa2},
19162306a36Sopenharmony_ci	{0x010f, 0x02a2},
19262306a36Sopenharmony_ci	{0x0110, 0xc000},
19362306a36Sopenharmony_ci	{0x0111, 0x04a2},
19462306a36Sopenharmony_ci	{0x0112, 0x2800},
19562306a36Sopenharmony_ci	{0x0113, 0x0000},
19662306a36Sopenharmony_ci	{0x0117, 0x0100},
19762306a36Sopenharmony_ci	{0x0125, 0x0410},
19862306a36Sopenharmony_ci	{0x0132, 0x6026},
19962306a36Sopenharmony_ci	{0x0136, 0x5555},
20062306a36Sopenharmony_ci	{0x0138, 0x3700},
20162306a36Sopenharmony_ci	{0x013a, 0x2000},
20262306a36Sopenharmony_ci	{0x013b, 0x2000},
20362306a36Sopenharmony_ci	{0x013c, 0x2005},
20462306a36Sopenharmony_ci	{0x013f, 0x0000},
20562306a36Sopenharmony_ci	{0x0142, 0x0000},
20662306a36Sopenharmony_ci	{0x0145, 0x0002},
20762306a36Sopenharmony_ci	{0x0146, 0x0000},
20862306a36Sopenharmony_ci	{0x0147, 0x0000},
20962306a36Sopenharmony_ci	{0x0148, 0x0000},
21062306a36Sopenharmony_ci	{0x0149, 0x0000},
21162306a36Sopenharmony_ci	{0x0150, 0x79a1},
21262306a36Sopenharmony_ci	{0x0156, 0xaaaa},
21362306a36Sopenharmony_ci	{0x0160, 0x4ec0},
21462306a36Sopenharmony_ci	{0x0161, 0x0080},
21562306a36Sopenharmony_ci	{0x0162, 0x0200},
21662306a36Sopenharmony_ci	{0x0163, 0x0800},
21762306a36Sopenharmony_ci	{0x0164, 0x0000},
21862306a36Sopenharmony_ci	{0x0165, 0x0000},
21962306a36Sopenharmony_ci	{0x0166, 0x0000},
22062306a36Sopenharmony_ci	{0x0167, 0x000f},
22162306a36Sopenharmony_ci	{0x0168, 0x000f},
22262306a36Sopenharmony_ci	{0x0169, 0x0021},
22362306a36Sopenharmony_ci	{0x0190, 0x413d},
22462306a36Sopenharmony_ci	{0x0194, 0x0000},
22562306a36Sopenharmony_ci	{0x0195, 0x0000},
22662306a36Sopenharmony_ci	{0x0197, 0x0022},
22762306a36Sopenharmony_ci	{0x0198, 0x0000},
22862306a36Sopenharmony_ci	{0x0199, 0x0000},
22962306a36Sopenharmony_ci	{0x01af, 0x0000},
23062306a36Sopenharmony_ci	{0x01b0, 0x0400},
23162306a36Sopenharmony_ci	{0x01b1, 0x0000},
23262306a36Sopenharmony_ci	{0x01b2, 0x0000},
23362306a36Sopenharmony_ci	{0x01b3, 0x0000},
23462306a36Sopenharmony_ci	{0x01b4, 0x0000},
23562306a36Sopenharmony_ci	{0x01b5, 0x0000},
23662306a36Sopenharmony_ci	{0x01b6, 0x01c3},
23762306a36Sopenharmony_ci	{0x01b7, 0x02a0},
23862306a36Sopenharmony_ci	{0x01b8, 0x03e9},
23962306a36Sopenharmony_ci	{0x01b9, 0x1389},
24062306a36Sopenharmony_ci	{0x01ba, 0xc351},
24162306a36Sopenharmony_ci	{0x01bb, 0x0009},
24262306a36Sopenharmony_ci	{0x01bc, 0x0018},
24362306a36Sopenharmony_ci	{0x01bd, 0x002a},
24462306a36Sopenharmony_ci	{0x01be, 0x004c},
24562306a36Sopenharmony_ci	{0x01bf, 0x0097},
24662306a36Sopenharmony_ci	{0x01c0, 0x433d},
24762306a36Sopenharmony_ci	{0x01c2, 0x0000},
24862306a36Sopenharmony_ci	{0x01c3, 0x0000},
24962306a36Sopenharmony_ci	{0x01c4, 0x0000},
25062306a36Sopenharmony_ci	{0x01c5, 0x0000},
25162306a36Sopenharmony_ci	{0x01c6, 0x0000},
25262306a36Sopenharmony_ci	{0x01c7, 0x0000},
25362306a36Sopenharmony_ci	{0x01c8, 0x40af},
25462306a36Sopenharmony_ci	{0x01c9, 0x0702},
25562306a36Sopenharmony_ci	{0x01ca, 0x0000},
25662306a36Sopenharmony_ci	{0x01cb, 0x0000},
25762306a36Sopenharmony_ci	{0x01cc, 0x5757},
25862306a36Sopenharmony_ci	{0x01cd, 0x5757},
25962306a36Sopenharmony_ci	{0x01ce, 0x5757},
26062306a36Sopenharmony_ci	{0x01cf, 0x5757},
26162306a36Sopenharmony_ci	{0x01d0, 0x5757},
26262306a36Sopenharmony_ci	{0x01d1, 0x5757},
26362306a36Sopenharmony_ci	{0x01d2, 0x5757},
26462306a36Sopenharmony_ci	{0x01d3, 0x5757},
26562306a36Sopenharmony_ci	{0x01d4, 0x5757},
26662306a36Sopenharmony_ci	{0x01d5, 0x5757},
26762306a36Sopenharmony_ci	{0x01d6, 0x0000},
26862306a36Sopenharmony_ci	{0x01d7, 0x0008},
26962306a36Sopenharmony_ci	{0x01d8, 0x0029},
27062306a36Sopenharmony_ci	{0x01d9, 0x3333},
27162306a36Sopenharmony_ci	{0x01da, 0x0000},
27262306a36Sopenharmony_ci	{0x01db, 0x0004},
27362306a36Sopenharmony_ci	{0x01dc, 0x0000},
27462306a36Sopenharmony_ci	{0x01de, 0x7c00},
27562306a36Sopenharmony_ci	{0x01df, 0x0320},
27662306a36Sopenharmony_ci	{0x01e0, 0x06a1},
27762306a36Sopenharmony_ci	{0x01e1, 0x0000},
27862306a36Sopenharmony_ci	{0x01e2, 0x0000},
27962306a36Sopenharmony_ci	{0x01e3, 0x0000},
28062306a36Sopenharmony_ci	{0x01e4, 0x0000},
28162306a36Sopenharmony_ci	{0x01e6, 0x0001},
28262306a36Sopenharmony_ci	{0x01e7, 0x0000},
28362306a36Sopenharmony_ci	{0x01e8, 0x0000},
28462306a36Sopenharmony_ci	{0x01ea, 0x0000},
28562306a36Sopenharmony_ci	{0x01eb, 0x0000},
28662306a36Sopenharmony_ci	{0x01ec, 0x0000},
28762306a36Sopenharmony_ci	{0x01ed, 0x0000},
28862306a36Sopenharmony_ci	{0x01ee, 0x0000},
28962306a36Sopenharmony_ci	{0x01ef, 0x0000},
29062306a36Sopenharmony_ci	{0x01f0, 0x0000},
29162306a36Sopenharmony_ci	{0x01f1, 0x0000},
29262306a36Sopenharmony_ci	{0x01f2, 0x0000},
29362306a36Sopenharmony_ci	{0x01f3, 0x0000},
29462306a36Sopenharmony_ci	{0x01f4, 0x0000},
29562306a36Sopenharmony_ci	{0x0210, 0x6297},
29662306a36Sopenharmony_ci	{0x0211, 0xa005},
29762306a36Sopenharmony_ci	{0x0212, 0x824c},
29862306a36Sopenharmony_ci	{0x0213, 0xf7ff},
29962306a36Sopenharmony_ci	{0x0214, 0xf24c},
30062306a36Sopenharmony_ci	{0x0215, 0x0102},
30162306a36Sopenharmony_ci	{0x0216, 0x00a3},
30262306a36Sopenharmony_ci	{0x0217, 0x0048},
30362306a36Sopenharmony_ci	{0x0218, 0xa2c0},
30462306a36Sopenharmony_ci	{0x0219, 0x0400},
30562306a36Sopenharmony_ci	{0x021a, 0x00c8},
30662306a36Sopenharmony_ci	{0x021b, 0x00c0},
30762306a36Sopenharmony_ci	{0x021c, 0x0000},
30862306a36Sopenharmony_ci	{0x0250, 0x4500},
30962306a36Sopenharmony_ci	{0x0251, 0x40b3},
31062306a36Sopenharmony_ci	{0x0252, 0x0000},
31162306a36Sopenharmony_ci	{0x0253, 0x0000},
31262306a36Sopenharmony_ci	{0x0254, 0x0000},
31362306a36Sopenharmony_ci	{0x0255, 0x0000},
31462306a36Sopenharmony_ci	{0x0256, 0x0000},
31562306a36Sopenharmony_ci	{0x0257, 0x0000},
31662306a36Sopenharmony_ci	{0x0258, 0x0000},
31762306a36Sopenharmony_ci	{0x0259, 0x0000},
31862306a36Sopenharmony_ci	{0x025a, 0x0005},
31962306a36Sopenharmony_ci	{0x0270, 0x0000},
32062306a36Sopenharmony_ci	{0x02ff, 0x0110},
32162306a36Sopenharmony_ci	{0x0300, 0x001f},
32262306a36Sopenharmony_ci	{0x0301, 0x032c},
32362306a36Sopenharmony_ci	{0x0302, 0x5f21},
32462306a36Sopenharmony_ci	{0x0303, 0x4000},
32562306a36Sopenharmony_ci	{0x0304, 0x4000},
32662306a36Sopenharmony_ci	{0x0305, 0x06d5},
32762306a36Sopenharmony_ci	{0x0306, 0x8000},
32862306a36Sopenharmony_ci	{0x0307, 0x0700},
32962306a36Sopenharmony_ci	{0x0310, 0x4560},
33062306a36Sopenharmony_ci	{0x0311, 0xa4a8},
33162306a36Sopenharmony_ci	{0x0312, 0x7418},
33262306a36Sopenharmony_ci	{0x0313, 0x0000},
33362306a36Sopenharmony_ci	{0x0314, 0x0006},
33462306a36Sopenharmony_ci	{0x0315, 0xffff},
33562306a36Sopenharmony_ci	{0x0316, 0xc400},
33662306a36Sopenharmony_ci	{0x0317, 0x0000},
33762306a36Sopenharmony_ci	{0x03c0, 0x7e00},
33862306a36Sopenharmony_ci	{0x03c1, 0x8000},
33962306a36Sopenharmony_ci	{0x03c2, 0x8000},
34062306a36Sopenharmony_ci	{0x03c3, 0x8000},
34162306a36Sopenharmony_ci	{0x03c4, 0x8000},
34262306a36Sopenharmony_ci	{0x03c5, 0x8000},
34362306a36Sopenharmony_ci	{0x03c6, 0x8000},
34462306a36Sopenharmony_ci	{0x03c7, 0x8000},
34562306a36Sopenharmony_ci	{0x03c8, 0x8000},
34662306a36Sopenharmony_ci	{0x03c9, 0x8000},
34762306a36Sopenharmony_ci	{0x03ca, 0x8000},
34862306a36Sopenharmony_ci	{0x03cb, 0x8000},
34962306a36Sopenharmony_ci	{0x03cc, 0x8000},
35062306a36Sopenharmony_ci	{0x03d0, 0x0000},
35162306a36Sopenharmony_ci	{0x03d1, 0x0000},
35262306a36Sopenharmony_ci	{0x03d2, 0x0000},
35362306a36Sopenharmony_ci	{0x03d3, 0x0000},
35462306a36Sopenharmony_ci	{0x03d4, 0x2000},
35562306a36Sopenharmony_ci	{0x03d5, 0x2000},
35662306a36Sopenharmony_ci	{0x03d6, 0x0000},
35762306a36Sopenharmony_ci	{0x03d7, 0x0000},
35862306a36Sopenharmony_ci	{0x03d8, 0x2000},
35962306a36Sopenharmony_ci	{0x03d9, 0x2000},
36062306a36Sopenharmony_ci	{0x03da, 0x2000},
36162306a36Sopenharmony_ci	{0x03db, 0x2000},
36262306a36Sopenharmony_ci	{0x03dc, 0x0000},
36362306a36Sopenharmony_ci	{0x03dd, 0x0000},
36462306a36Sopenharmony_ci	{0x03de, 0x0000},
36562306a36Sopenharmony_ci	{0x03df, 0x2000},
36662306a36Sopenharmony_ci	{0x03e0, 0x0000},
36762306a36Sopenharmony_ci	{0x03e1, 0x0000},
36862306a36Sopenharmony_ci	{0x03e2, 0x0000},
36962306a36Sopenharmony_ci	{0x03e3, 0x0000},
37062306a36Sopenharmony_ci	{0x03e4, 0x0000},
37162306a36Sopenharmony_ci	{0x03e5, 0x0000},
37262306a36Sopenharmony_ci	{0x03e6, 0x0000},
37362306a36Sopenharmony_ci	{0x03e7, 0x0000},
37462306a36Sopenharmony_ci	{0x03e8, 0x0000},
37562306a36Sopenharmony_ci	{0x03e9, 0x0000},
37662306a36Sopenharmony_ci	{0x03ea, 0x0000},
37762306a36Sopenharmony_ci	{0x03eb, 0x0000},
37862306a36Sopenharmony_ci	{0x03ec, 0x0000},
37962306a36Sopenharmony_ci	{0x03ed, 0x0000},
38062306a36Sopenharmony_ci	{0x03ee, 0x0000},
38162306a36Sopenharmony_ci	{0x03ef, 0x0000},
38262306a36Sopenharmony_ci	{0x03f0, 0x0800},
38362306a36Sopenharmony_ci	{0x03f1, 0x0800},
38462306a36Sopenharmony_ci	{0x03f2, 0x0800},
38562306a36Sopenharmony_ci	{0x03f3, 0x0800},
38662306a36Sopenharmony_ci};
38762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_reg);
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_cibool rt5682_volatile_register(struct device *dev, unsigned int reg)
39062306a36Sopenharmony_ci{
39162306a36Sopenharmony_ci	switch (reg) {
39262306a36Sopenharmony_ci	case RT5682_RESET:
39362306a36Sopenharmony_ci	case RT5682_CBJ_CTRL_2:
39462306a36Sopenharmony_ci	case RT5682_INT_ST_1:
39562306a36Sopenharmony_ci	case RT5682_4BTN_IL_CMD_1:
39662306a36Sopenharmony_ci	case RT5682_AJD1_CTRL:
39762306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_1:
39862306a36Sopenharmony_ci	case RT5682_DEVICE_ID:
39962306a36Sopenharmony_ci	case RT5682_I2C_MODE:
40062306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_10:
40162306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_2:
40262306a36Sopenharmony_ci	case RT5682_JD_TOP_VC_VTRL:
40362306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_19:
40462306a36Sopenharmony_ci	case RT5682_IL_CMD_1:
40562306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_2:
40662306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_4:
40762306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_10:
40862306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_11:
40962306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_6...RT5682_EFUSE_CTRL_11:
41062306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_1...RT5682_HP_CALIB_STA_11:
41162306a36Sopenharmony_ci		return true;
41262306a36Sopenharmony_ci	default:
41362306a36Sopenharmony_ci		return false;
41462306a36Sopenharmony_ci	}
41562306a36Sopenharmony_ci}
41662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_volatile_register);
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_cibool rt5682_readable_register(struct device *dev, unsigned int reg)
41962306a36Sopenharmony_ci{
42062306a36Sopenharmony_ci	switch (reg) {
42162306a36Sopenharmony_ci	case RT5682_RESET:
42262306a36Sopenharmony_ci	case RT5682_VERSION_ID:
42362306a36Sopenharmony_ci	case RT5682_VENDOR_ID:
42462306a36Sopenharmony_ci	case RT5682_DEVICE_ID:
42562306a36Sopenharmony_ci	case RT5682_HP_CTRL_1:
42662306a36Sopenharmony_ci	case RT5682_HP_CTRL_2:
42762306a36Sopenharmony_ci	case RT5682_HPL_GAIN:
42862306a36Sopenharmony_ci	case RT5682_HPR_GAIN:
42962306a36Sopenharmony_ci	case RT5682_I2C_CTRL:
43062306a36Sopenharmony_ci	case RT5682_CBJ_BST_CTRL:
43162306a36Sopenharmony_ci	case RT5682_CBJ_CTRL_1:
43262306a36Sopenharmony_ci	case RT5682_CBJ_CTRL_2:
43362306a36Sopenharmony_ci	case RT5682_CBJ_CTRL_3:
43462306a36Sopenharmony_ci	case RT5682_CBJ_CTRL_4:
43562306a36Sopenharmony_ci	case RT5682_CBJ_CTRL_5:
43662306a36Sopenharmony_ci	case RT5682_CBJ_CTRL_6:
43762306a36Sopenharmony_ci	case RT5682_CBJ_CTRL_7:
43862306a36Sopenharmony_ci	case RT5682_DAC1_DIG_VOL:
43962306a36Sopenharmony_ci	case RT5682_STO1_ADC_DIG_VOL:
44062306a36Sopenharmony_ci	case RT5682_STO1_ADC_BOOST:
44162306a36Sopenharmony_ci	case RT5682_HP_IMP_GAIN_1:
44262306a36Sopenharmony_ci	case RT5682_HP_IMP_GAIN_2:
44362306a36Sopenharmony_ci	case RT5682_SIDETONE_CTRL:
44462306a36Sopenharmony_ci	case RT5682_STO1_ADC_MIXER:
44562306a36Sopenharmony_ci	case RT5682_AD_DA_MIXER:
44662306a36Sopenharmony_ci	case RT5682_STO1_DAC_MIXER:
44762306a36Sopenharmony_ci	case RT5682_A_DAC1_MUX:
44862306a36Sopenharmony_ci	case RT5682_DIG_INF2_DATA:
44962306a36Sopenharmony_ci	case RT5682_REC_MIXER:
45062306a36Sopenharmony_ci	case RT5682_CAL_REC:
45162306a36Sopenharmony_ci	case RT5682_ALC_BACK_GAIN:
45262306a36Sopenharmony_ci	case RT5682_PWR_DIG_1:
45362306a36Sopenharmony_ci	case RT5682_PWR_DIG_2:
45462306a36Sopenharmony_ci	case RT5682_PWR_ANLG_1:
45562306a36Sopenharmony_ci	case RT5682_PWR_ANLG_2:
45662306a36Sopenharmony_ci	case RT5682_PWR_ANLG_3:
45762306a36Sopenharmony_ci	case RT5682_PWR_MIXER:
45862306a36Sopenharmony_ci	case RT5682_PWR_VOL:
45962306a36Sopenharmony_ci	case RT5682_CLK_DET:
46062306a36Sopenharmony_ci	case RT5682_RESET_LPF_CTRL:
46162306a36Sopenharmony_ci	case RT5682_RESET_HPF_CTRL:
46262306a36Sopenharmony_ci	case RT5682_DMIC_CTRL_1:
46362306a36Sopenharmony_ci	case RT5682_I2S1_SDP:
46462306a36Sopenharmony_ci	case RT5682_I2S2_SDP:
46562306a36Sopenharmony_ci	case RT5682_ADDA_CLK_1:
46662306a36Sopenharmony_ci	case RT5682_ADDA_CLK_2:
46762306a36Sopenharmony_ci	case RT5682_I2S1_F_DIV_CTRL_1:
46862306a36Sopenharmony_ci	case RT5682_I2S1_F_DIV_CTRL_2:
46962306a36Sopenharmony_ci	case RT5682_TDM_CTRL:
47062306a36Sopenharmony_ci	case RT5682_TDM_ADDA_CTRL_1:
47162306a36Sopenharmony_ci	case RT5682_TDM_ADDA_CTRL_2:
47262306a36Sopenharmony_ci	case RT5682_DATA_SEL_CTRL_1:
47362306a36Sopenharmony_ci	case RT5682_TDM_TCON_CTRL:
47462306a36Sopenharmony_ci	case RT5682_GLB_CLK:
47562306a36Sopenharmony_ci	case RT5682_PLL_CTRL_1:
47662306a36Sopenharmony_ci	case RT5682_PLL_CTRL_2:
47762306a36Sopenharmony_ci	case RT5682_PLL_TRACK_1:
47862306a36Sopenharmony_ci	case RT5682_PLL_TRACK_2:
47962306a36Sopenharmony_ci	case RT5682_PLL_TRACK_3:
48062306a36Sopenharmony_ci	case RT5682_PLL_TRACK_4:
48162306a36Sopenharmony_ci	case RT5682_PLL_TRACK_5:
48262306a36Sopenharmony_ci	case RT5682_PLL_TRACK_6:
48362306a36Sopenharmony_ci	case RT5682_PLL_TRACK_11:
48462306a36Sopenharmony_ci	case RT5682_SDW_REF_CLK:
48562306a36Sopenharmony_ci	case RT5682_DEPOP_1:
48662306a36Sopenharmony_ci	case RT5682_DEPOP_2:
48762306a36Sopenharmony_ci	case RT5682_HP_CHARGE_PUMP_1:
48862306a36Sopenharmony_ci	case RT5682_HP_CHARGE_PUMP_2:
48962306a36Sopenharmony_ci	case RT5682_MICBIAS_1:
49062306a36Sopenharmony_ci	case RT5682_MICBIAS_2:
49162306a36Sopenharmony_ci	case RT5682_PLL_TRACK_12:
49262306a36Sopenharmony_ci	case RT5682_PLL_TRACK_14:
49362306a36Sopenharmony_ci	case RT5682_PLL2_CTRL_1:
49462306a36Sopenharmony_ci	case RT5682_PLL2_CTRL_2:
49562306a36Sopenharmony_ci	case RT5682_PLL2_CTRL_3:
49662306a36Sopenharmony_ci	case RT5682_PLL2_CTRL_4:
49762306a36Sopenharmony_ci	case RT5682_RC_CLK_CTRL:
49862306a36Sopenharmony_ci	case RT5682_I2S_M_CLK_CTRL_1:
49962306a36Sopenharmony_ci	case RT5682_I2S2_F_DIV_CTRL_1:
50062306a36Sopenharmony_ci	case RT5682_I2S2_F_DIV_CTRL_2:
50162306a36Sopenharmony_ci	case RT5682_EQ_CTRL_1:
50262306a36Sopenharmony_ci	case RT5682_EQ_CTRL_2:
50362306a36Sopenharmony_ci	case RT5682_IRQ_CTRL_1:
50462306a36Sopenharmony_ci	case RT5682_IRQ_CTRL_2:
50562306a36Sopenharmony_ci	case RT5682_IRQ_CTRL_3:
50662306a36Sopenharmony_ci	case RT5682_IRQ_CTRL_4:
50762306a36Sopenharmony_ci	case RT5682_INT_ST_1:
50862306a36Sopenharmony_ci	case RT5682_GPIO_CTRL_1:
50962306a36Sopenharmony_ci	case RT5682_GPIO_CTRL_2:
51062306a36Sopenharmony_ci	case RT5682_GPIO_CTRL_3:
51162306a36Sopenharmony_ci	case RT5682_HP_AMP_DET_CTRL_1:
51262306a36Sopenharmony_ci	case RT5682_HP_AMP_DET_CTRL_2:
51362306a36Sopenharmony_ci	case RT5682_MID_HP_AMP_DET:
51462306a36Sopenharmony_ci	case RT5682_LOW_HP_AMP_DET:
51562306a36Sopenharmony_ci	case RT5682_DELAY_BUF_CTRL:
51662306a36Sopenharmony_ci	case RT5682_SV_ZCD_1:
51762306a36Sopenharmony_ci	case RT5682_SV_ZCD_2:
51862306a36Sopenharmony_ci	case RT5682_IL_CMD_1:
51962306a36Sopenharmony_ci	case RT5682_IL_CMD_2:
52062306a36Sopenharmony_ci	case RT5682_IL_CMD_3:
52162306a36Sopenharmony_ci	case RT5682_IL_CMD_4:
52262306a36Sopenharmony_ci	case RT5682_IL_CMD_5:
52362306a36Sopenharmony_ci	case RT5682_IL_CMD_6:
52462306a36Sopenharmony_ci	case RT5682_4BTN_IL_CMD_1:
52562306a36Sopenharmony_ci	case RT5682_4BTN_IL_CMD_2:
52662306a36Sopenharmony_ci	case RT5682_4BTN_IL_CMD_3:
52762306a36Sopenharmony_ci	case RT5682_4BTN_IL_CMD_4:
52862306a36Sopenharmony_ci	case RT5682_4BTN_IL_CMD_5:
52962306a36Sopenharmony_ci	case RT5682_4BTN_IL_CMD_6:
53062306a36Sopenharmony_ci	case RT5682_4BTN_IL_CMD_7:
53162306a36Sopenharmony_ci	case RT5682_ADC_STO1_HP_CTRL_1:
53262306a36Sopenharmony_ci	case RT5682_ADC_STO1_HP_CTRL_2:
53362306a36Sopenharmony_ci	case RT5682_AJD1_CTRL:
53462306a36Sopenharmony_ci	case RT5682_JD1_THD:
53562306a36Sopenharmony_ci	case RT5682_JD2_THD:
53662306a36Sopenharmony_ci	case RT5682_JD_CTRL_1:
53762306a36Sopenharmony_ci	case RT5682_DUMMY_1:
53862306a36Sopenharmony_ci	case RT5682_DUMMY_2:
53962306a36Sopenharmony_ci	case RT5682_DUMMY_3:
54062306a36Sopenharmony_ci	case RT5682_DAC_ADC_DIG_VOL1:
54162306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_2:
54262306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_3:
54362306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_4:
54462306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_5:
54562306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_6:
54662306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_7:
54762306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_8:
54862306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_9:
54962306a36Sopenharmony_ci	case RT5682_BIAS_CUR_CTRL_10:
55062306a36Sopenharmony_ci	case RT5682_VREF_REC_OP_FB_CAP_CTRL:
55162306a36Sopenharmony_ci	case RT5682_CHARGE_PUMP_1:
55262306a36Sopenharmony_ci	case RT5682_DIG_IN_CTRL_1:
55362306a36Sopenharmony_ci	case RT5682_PAD_DRIVING_CTRL:
55462306a36Sopenharmony_ci	case RT5682_SOFT_RAMP_DEPOP:
55562306a36Sopenharmony_ci	case RT5682_CHOP_DAC:
55662306a36Sopenharmony_ci	case RT5682_CHOP_ADC:
55762306a36Sopenharmony_ci	case RT5682_CALIB_ADC_CTRL:
55862306a36Sopenharmony_ci	case RT5682_VOL_TEST:
55962306a36Sopenharmony_ci	case RT5682_SPKVDD_DET_STA:
56062306a36Sopenharmony_ci	case RT5682_TEST_MODE_CTRL_1:
56162306a36Sopenharmony_ci	case RT5682_TEST_MODE_CTRL_2:
56262306a36Sopenharmony_ci	case RT5682_TEST_MODE_CTRL_3:
56362306a36Sopenharmony_ci	case RT5682_TEST_MODE_CTRL_4:
56462306a36Sopenharmony_ci	case RT5682_TEST_MODE_CTRL_5:
56562306a36Sopenharmony_ci	case RT5682_PLL1_INTERNAL:
56662306a36Sopenharmony_ci	case RT5682_PLL2_INTERNAL:
56762306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_1:
56862306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_2:
56962306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_3:
57062306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_4:
57162306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_5:
57262306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_6:
57362306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_7:
57462306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_8:
57562306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_9:
57662306a36Sopenharmony_ci	case RT5682_STO_NG2_CTRL_10:
57762306a36Sopenharmony_ci	case RT5682_STO1_DAC_SIL_DET:
57862306a36Sopenharmony_ci	case RT5682_SIL_PSV_CTRL1:
57962306a36Sopenharmony_ci	case RT5682_SIL_PSV_CTRL2:
58062306a36Sopenharmony_ci	case RT5682_SIL_PSV_CTRL3:
58162306a36Sopenharmony_ci	case RT5682_SIL_PSV_CTRL4:
58262306a36Sopenharmony_ci	case RT5682_SIL_PSV_CTRL5:
58362306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_01:
58462306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_02:
58562306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_03:
58662306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_04:
58762306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_05:
58862306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_06:
58962306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_07:
59062306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_08:
59162306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_09:
59262306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_10:
59362306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_11:
59462306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_12:
59562306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_13:
59662306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_14:
59762306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_15:
59862306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_16:
59962306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_17:
60062306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_18:
60162306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_19:
60262306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_20:
60362306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_21:
60462306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_22:
60562306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_23:
60662306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_24:
60762306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_25:
60862306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_26:
60962306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_27:
61062306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_28:
61162306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_29:
61262306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_30:
61362306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_31:
61462306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_32:
61562306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_33:
61662306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_34:
61762306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_35:
61862306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_36:
61962306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_37:
62062306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_38:
62162306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_39:
62262306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_40:
62362306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_41:
62462306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_42:
62562306a36Sopenharmony_ci	case RT5682_HP_IMP_SENS_CTRL_43:
62662306a36Sopenharmony_ci	case RT5682_HP_LOGIC_CTRL_1:
62762306a36Sopenharmony_ci	case RT5682_HP_LOGIC_CTRL_2:
62862306a36Sopenharmony_ci	case RT5682_HP_LOGIC_CTRL_3:
62962306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_1:
63062306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_2:
63162306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_3:
63262306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_4:
63362306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_5:
63462306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_6:
63562306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_7:
63662306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_9:
63762306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_10:
63862306a36Sopenharmony_ci	case RT5682_HP_CALIB_CTRL_11:
63962306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_1:
64062306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_2:
64162306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_3:
64262306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_4:
64362306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_5:
64462306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_6:
64562306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_7:
64662306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_8:
64762306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_9:
64862306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_10:
64962306a36Sopenharmony_ci	case RT5682_HP_CALIB_STA_11:
65062306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_1:
65162306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_2:
65262306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_3:
65362306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_4:
65462306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_5:
65562306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_6:
65662306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_7:
65762306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_8:
65862306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_9:
65962306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_10:
66062306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_11:
66162306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_12:
66262306a36Sopenharmony_ci	case RT5682_SAR_IL_CMD_13:
66362306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_1:
66462306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_2:
66562306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_3:
66662306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_4:
66762306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_5:
66862306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_6:
66962306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_7:
67062306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_8:
67162306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_9:
67262306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_10:
67362306a36Sopenharmony_ci	case RT5682_EFUSE_CTRL_11:
67462306a36Sopenharmony_ci	case RT5682_JD_TOP_VC_VTRL:
67562306a36Sopenharmony_ci	case RT5682_DRC1_CTRL_0:
67662306a36Sopenharmony_ci	case RT5682_DRC1_CTRL_1:
67762306a36Sopenharmony_ci	case RT5682_DRC1_CTRL_2:
67862306a36Sopenharmony_ci	case RT5682_DRC1_CTRL_3:
67962306a36Sopenharmony_ci	case RT5682_DRC1_CTRL_4:
68062306a36Sopenharmony_ci	case RT5682_DRC1_CTRL_5:
68162306a36Sopenharmony_ci	case RT5682_DRC1_CTRL_6:
68262306a36Sopenharmony_ci	case RT5682_DRC1_HARD_LMT_CTRL_1:
68362306a36Sopenharmony_ci	case RT5682_DRC1_HARD_LMT_CTRL_2:
68462306a36Sopenharmony_ci	case RT5682_DRC1_PRIV_1:
68562306a36Sopenharmony_ci	case RT5682_DRC1_PRIV_2:
68662306a36Sopenharmony_ci	case RT5682_DRC1_PRIV_3:
68762306a36Sopenharmony_ci	case RT5682_DRC1_PRIV_4:
68862306a36Sopenharmony_ci	case RT5682_DRC1_PRIV_5:
68962306a36Sopenharmony_ci	case RT5682_DRC1_PRIV_6:
69062306a36Sopenharmony_ci	case RT5682_DRC1_PRIV_7:
69162306a36Sopenharmony_ci	case RT5682_DRC1_PRIV_8:
69262306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL1:
69362306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL2:
69462306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL3:
69562306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL4:
69662306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL5:
69762306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL6:
69862306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL7:
69962306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL8:
70062306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL9:
70162306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL10:
70262306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL11:
70362306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL12:
70462306a36Sopenharmony_ci	case RT5682_EQ_AUTO_RCV_CTRL13:
70562306a36Sopenharmony_ci	case RT5682_ADC_L_EQ_LPF1_A1:
70662306a36Sopenharmony_ci	case RT5682_R_EQ_LPF1_A1:
70762306a36Sopenharmony_ci	case RT5682_L_EQ_LPF1_H0:
70862306a36Sopenharmony_ci	case RT5682_R_EQ_LPF1_H0:
70962306a36Sopenharmony_ci	case RT5682_L_EQ_BPF1_A1:
71062306a36Sopenharmony_ci	case RT5682_R_EQ_BPF1_A1:
71162306a36Sopenharmony_ci	case RT5682_L_EQ_BPF1_A2:
71262306a36Sopenharmony_ci	case RT5682_R_EQ_BPF1_A2:
71362306a36Sopenharmony_ci	case RT5682_L_EQ_BPF1_H0:
71462306a36Sopenharmony_ci	case RT5682_R_EQ_BPF1_H0:
71562306a36Sopenharmony_ci	case RT5682_L_EQ_BPF2_A1:
71662306a36Sopenharmony_ci	case RT5682_R_EQ_BPF2_A1:
71762306a36Sopenharmony_ci	case RT5682_L_EQ_BPF2_A2:
71862306a36Sopenharmony_ci	case RT5682_R_EQ_BPF2_A2:
71962306a36Sopenharmony_ci	case RT5682_L_EQ_BPF2_H0:
72062306a36Sopenharmony_ci	case RT5682_R_EQ_BPF2_H0:
72162306a36Sopenharmony_ci	case RT5682_L_EQ_BPF3_A1:
72262306a36Sopenharmony_ci	case RT5682_R_EQ_BPF3_A1:
72362306a36Sopenharmony_ci	case RT5682_L_EQ_BPF3_A2:
72462306a36Sopenharmony_ci	case RT5682_R_EQ_BPF3_A2:
72562306a36Sopenharmony_ci	case RT5682_L_EQ_BPF3_H0:
72662306a36Sopenharmony_ci	case RT5682_R_EQ_BPF3_H0:
72762306a36Sopenharmony_ci	case RT5682_L_EQ_BPF4_A1:
72862306a36Sopenharmony_ci	case RT5682_R_EQ_BPF4_A1:
72962306a36Sopenharmony_ci	case RT5682_L_EQ_BPF4_A2:
73062306a36Sopenharmony_ci	case RT5682_R_EQ_BPF4_A2:
73162306a36Sopenharmony_ci	case RT5682_L_EQ_BPF4_H0:
73262306a36Sopenharmony_ci	case RT5682_R_EQ_BPF4_H0:
73362306a36Sopenharmony_ci	case RT5682_L_EQ_HPF1_A1:
73462306a36Sopenharmony_ci	case RT5682_R_EQ_HPF1_A1:
73562306a36Sopenharmony_ci	case RT5682_L_EQ_HPF1_H0:
73662306a36Sopenharmony_ci	case RT5682_R_EQ_HPF1_H0:
73762306a36Sopenharmony_ci	case RT5682_L_EQ_PRE_VOL:
73862306a36Sopenharmony_ci	case RT5682_R_EQ_PRE_VOL:
73962306a36Sopenharmony_ci	case RT5682_L_EQ_POST_VOL:
74062306a36Sopenharmony_ci	case RT5682_R_EQ_POST_VOL:
74162306a36Sopenharmony_ci	case RT5682_I2C_MODE:
74262306a36Sopenharmony_ci		return true;
74362306a36Sopenharmony_ci	default:
74462306a36Sopenharmony_ci		return false;
74562306a36Sopenharmony_ci	}
74662306a36Sopenharmony_ci}
74762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_readable_register);
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
75062306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
75162306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_ci/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
75462306a36Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(bst_tlv,
75562306a36Sopenharmony_ci	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
75662306a36Sopenharmony_ci	1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
75762306a36Sopenharmony_ci	2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
75862306a36Sopenharmony_ci	3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
75962306a36Sopenharmony_ci	6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
76062306a36Sopenharmony_ci	7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
76162306a36Sopenharmony_ci	8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
76262306a36Sopenharmony_ci);
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_ci/* Interface data select */
76562306a36Sopenharmony_cistatic const char * const rt5682_data_select[] = {
76662306a36Sopenharmony_ci	"L/R", "R/L", "L/L", "R/R"
76762306a36Sopenharmony_ci};
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if2_adc_enum,
77062306a36Sopenharmony_ci	RT5682_DIG_INF2_DATA, RT5682_IF2_ADC_SEL_SFT, rt5682_data_select);
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_01_adc_enum,
77362306a36Sopenharmony_ci	RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC1_SEL_SFT, rt5682_data_select);
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_23_adc_enum,
77662306a36Sopenharmony_ci	RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC2_SEL_SFT, rt5682_data_select);
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_45_adc_enum,
77962306a36Sopenharmony_ci	RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC3_SEL_SFT, rt5682_data_select);
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_67_adc_enum,
78262306a36Sopenharmony_ci	RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC4_SEL_SFT, rt5682_data_select);
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if2_adc_swap_mux =
78562306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC Swap Mux", rt5682_if2_adc_enum);
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_01_adc_swap_mux =
78862306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 01 ADC Swap Mux", rt5682_if1_01_adc_enum);
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_23_adc_swap_mux =
79162306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 23 ADC Swap Mux", rt5682_if1_23_adc_enum);
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_45_adc_swap_mux =
79462306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 45 ADC Swap Mux", rt5682_if1_45_adc_enum);
79562306a36Sopenharmony_ci
79662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_67_adc_swap_mux =
79762306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 67 ADC Swap Mux", rt5682_if1_67_adc_enum);
79862306a36Sopenharmony_ci
79962306a36Sopenharmony_cistatic const char * const rt5682_dac_select[] = {
80062306a36Sopenharmony_ci	"IF1", "SOUND"
80162306a36Sopenharmony_ci};
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_dacl_enum,
80462306a36Sopenharmony_ci	RT5682_AD_DA_MIXER, RT5682_DAC1_L_SEL_SFT, rt5682_dac_select);
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_l_mux =
80762306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC L Mux", rt5682_dacl_enum);
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_dacr_enum,
81062306a36Sopenharmony_ci	RT5682_AD_DA_MIXER, RT5682_DAC1_R_SEL_SFT, rt5682_dac_select);
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_r_mux =
81362306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC R Mux", rt5682_dacr_enum);
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_civoid rt5682_reset(struct rt5682_priv *rt5682)
81662306a36Sopenharmony_ci{
81762306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_RESET, 0);
81862306a36Sopenharmony_ci	if (!rt5682->is_sdw)
81962306a36Sopenharmony_ci		regmap_write(rt5682->regmap, RT5682_I2C_MODE, 1);
82062306a36Sopenharmony_ci}
82162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_reset);
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci/**
82462306a36Sopenharmony_ci * rt5682_sel_asrc_clk_src - select ASRC clock source for a set of filters
82562306a36Sopenharmony_ci * @component: SoC audio component device.
82662306a36Sopenharmony_ci * @filter_mask: mask of filters.
82762306a36Sopenharmony_ci * @clk_src: clock source
82862306a36Sopenharmony_ci *
82962306a36Sopenharmony_ci * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5682 can
83062306a36Sopenharmony_ci * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
83162306a36Sopenharmony_ci * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
83262306a36Sopenharmony_ci * ASRC function will track i2s clock and generate a corresponding system clock
83362306a36Sopenharmony_ci * for codec. This function provides an API to select the clock source for a
83462306a36Sopenharmony_ci * set of filters specified by the mask. And the component driver will turn on
83562306a36Sopenharmony_ci * ASRC for these filters if ASRC is selected as their clock source.
83662306a36Sopenharmony_ci */
83762306a36Sopenharmony_ciint rt5682_sel_asrc_clk_src(struct snd_soc_component *component,
83862306a36Sopenharmony_ci		unsigned int filter_mask, unsigned int clk_src)
83962306a36Sopenharmony_ci{
84062306a36Sopenharmony_ci	switch (clk_src) {
84162306a36Sopenharmony_ci	case RT5682_CLK_SEL_SYS:
84262306a36Sopenharmony_ci	case RT5682_CLK_SEL_I2S1_ASRC:
84362306a36Sopenharmony_ci	case RT5682_CLK_SEL_I2S2_ASRC:
84462306a36Sopenharmony_ci		break;
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ci	default:
84762306a36Sopenharmony_ci		return -EINVAL;
84862306a36Sopenharmony_ci	}
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_ci	if (filter_mask & RT5682_DA_STEREO1_FILTER) {
85162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_PLL_TRACK_2,
85262306a36Sopenharmony_ci			RT5682_FILTER_CLK_SEL_MASK,
85362306a36Sopenharmony_ci			clk_src << RT5682_FILTER_CLK_SEL_SFT);
85462306a36Sopenharmony_ci	}
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ci	if (filter_mask & RT5682_AD_STEREO1_FILTER) {
85762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_PLL_TRACK_3,
85862306a36Sopenharmony_ci			RT5682_FILTER_CLK_SEL_MASK,
85962306a36Sopenharmony_ci			clk_src << RT5682_FILTER_CLK_SEL_SFT);
86062306a36Sopenharmony_ci	}
86162306a36Sopenharmony_ci
86262306a36Sopenharmony_ci	return 0;
86362306a36Sopenharmony_ci}
86462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_sel_asrc_clk_src);
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_cistatic int rt5682_button_detect(struct snd_soc_component *component)
86762306a36Sopenharmony_ci{
86862306a36Sopenharmony_ci	int btn_type, val;
86962306a36Sopenharmony_ci
87062306a36Sopenharmony_ci	val = snd_soc_component_read(component, RT5682_4BTN_IL_CMD_1);
87162306a36Sopenharmony_ci	btn_type = val & 0xfff0;
87262306a36Sopenharmony_ci	snd_soc_component_write(component, RT5682_4BTN_IL_CMD_1, val);
87362306a36Sopenharmony_ci	dev_dbg(component->dev, "%s btn_type=%x\n", __func__, btn_type);
87462306a36Sopenharmony_ci	snd_soc_component_update_bits(component,
87562306a36Sopenharmony_ci		RT5682_SAR_IL_CMD_2, 0x10, 0x10);
87662306a36Sopenharmony_ci
87762306a36Sopenharmony_ci	return btn_type;
87862306a36Sopenharmony_ci}
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_cistatic void rt5682_enable_push_button_irq(struct snd_soc_component *component,
88162306a36Sopenharmony_ci		bool enable)
88262306a36Sopenharmony_ci{
88362306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci	if (enable) {
88662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
88762306a36Sopenharmony_ci			RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_EN);
88862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13,
88962306a36Sopenharmony_ci			RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_BTN);
89062306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682_IL_CMD_1, 0x0040);
89162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
89262306a36Sopenharmony_ci			RT5682_4BTN_IL_MASK | RT5682_4BTN_IL_RST_MASK,
89362306a36Sopenharmony_ci			RT5682_4BTN_IL_EN | RT5682_4BTN_IL_NOR);
89462306a36Sopenharmony_ci		if (rt5682->is_sdw)
89562306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
89662306a36Sopenharmony_ci				RT5682_IRQ_CTRL_3,
89762306a36Sopenharmony_ci				RT5682_IL_IRQ_MASK | RT5682_IL_IRQ_TYPE_MASK,
89862306a36Sopenharmony_ci				RT5682_IL_IRQ_EN | RT5682_IL_IRQ_PUL);
89962306a36Sopenharmony_ci		else
90062306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
90162306a36Sopenharmony_ci				RT5682_IRQ_CTRL_3, RT5682_IL_IRQ_MASK,
90262306a36Sopenharmony_ci				RT5682_IL_IRQ_EN);
90362306a36Sopenharmony_ci	} else {
90462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_IRQ_CTRL_3,
90562306a36Sopenharmony_ci			RT5682_IL_IRQ_MASK, RT5682_IL_IRQ_DIS);
90662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
90762306a36Sopenharmony_ci			RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_DIS);
90862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
90962306a36Sopenharmony_ci			RT5682_4BTN_IL_MASK, RT5682_4BTN_IL_DIS);
91062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2,
91162306a36Sopenharmony_ci			RT5682_4BTN_IL_RST_MASK, RT5682_4BTN_IL_RST);
91262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13,
91362306a36Sopenharmony_ci			RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_TYPE);
91462306a36Sopenharmony_ci	}
91562306a36Sopenharmony_ci}
91662306a36Sopenharmony_ci
91762306a36Sopenharmony_ci/**
91862306a36Sopenharmony_ci * rt5682_headset_detect - Detect headset.
91962306a36Sopenharmony_ci * @component: SoC audio component device.
92062306a36Sopenharmony_ci * @jack_insert: Jack insert or not.
92162306a36Sopenharmony_ci *
92262306a36Sopenharmony_ci * Detect whether is headset or not when jack inserted.
92362306a36Sopenharmony_ci *
92462306a36Sopenharmony_ci * Returns detect status.
92562306a36Sopenharmony_ci */
92662306a36Sopenharmony_cistatic int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert)
92762306a36Sopenharmony_ci{
92862306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
92962306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm = &component->dapm;
93062306a36Sopenharmony_ci	unsigned int val, count;
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci	if (jack_insert) {
93362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
93462306a36Sopenharmony_ci			RT5682_PWR_VREF2 | RT5682_PWR_MB,
93562306a36Sopenharmony_ci			RT5682_PWR_VREF2 | RT5682_PWR_MB);
93662306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
93762306a36Sopenharmony_ci			RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0);
93862306a36Sopenharmony_ci		usleep_range(15000, 20000);
93962306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
94062306a36Sopenharmony_ci			RT5682_PWR_ANLG_1, RT5682_PWR_FV2, RT5682_PWR_FV2);
94162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
94262306a36Sopenharmony_ci			RT5682_PWR_CBJ, RT5682_PWR_CBJ);
94362306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
94462306a36Sopenharmony_ci			RT5682_HP_CHARGE_PUMP_1,
94562306a36Sopenharmony_ci			RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0);
94662306a36Sopenharmony_ci		rt5682_enable_push_button_irq(component, false);
94762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
94862306a36Sopenharmony_ci			RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW);
94962306a36Sopenharmony_ci		usleep_range(55000, 60000);
95062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
95162306a36Sopenharmony_ci			RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH);
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_ci		count = 0;
95462306a36Sopenharmony_ci		val = snd_soc_component_read(component, RT5682_CBJ_CTRL_2)
95562306a36Sopenharmony_ci			& RT5682_JACK_TYPE_MASK;
95662306a36Sopenharmony_ci		while (val == 0 && count < 50) {
95762306a36Sopenharmony_ci			usleep_range(10000, 15000);
95862306a36Sopenharmony_ci			val = snd_soc_component_read(component,
95962306a36Sopenharmony_ci				RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK;
96062306a36Sopenharmony_ci			count++;
96162306a36Sopenharmony_ci		}
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci		switch (val) {
96462306a36Sopenharmony_ci		case 0x1:
96562306a36Sopenharmony_ci		case 0x2:
96662306a36Sopenharmony_ci			rt5682->jack_type = SND_JACK_HEADSET;
96762306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
96862306a36Sopenharmony_ci				RT5682_FAST_OFF_MASK, RT5682_FAST_OFF_EN);
96962306a36Sopenharmony_ci			rt5682_enable_push_button_irq(component, true);
97062306a36Sopenharmony_ci			break;
97162306a36Sopenharmony_ci		default:
97262306a36Sopenharmony_ci			rt5682->jack_type = SND_JACK_HEADPHONE;
97362306a36Sopenharmony_ci			break;
97462306a36Sopenharmony_ci		}
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
97762306a36Sopenharmony_ci			RT5682_HP_CHARGE_PUMP_1,
97862306a36Sopenharmony_ci			RT5682_OSW_L_MASK | RT5682_OSW_R_MASK,
97962306a36Sopenharmony_ci			RT5682_OSW_L_EN | RT5682_OSW_R_EN);
98062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_MICBIAS_2,
98162306a36Sopenharmony_ci			RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK,
98262306a36Sopenharmony_ci			RT5682_PWR_CLK25M_PU | RT5682_PWR_CLK1M_PU);
98362306a36Sopenharmony_ci	} else {
98462306a36Sopenharmony_ci		rt5682_enable_push_button_irq(component, false);
98562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
98662306a36Sopenharmony_ci			RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW);
98762306a36Sopenharmony_ci		if (!snd_soc_dapm_get_pin_status(dapm, "MICBIAS") &&
98862306a36Sopenharmony_ci			!snd_soc_dapm_get_pin_status(dapm, "PLL1") &&
98962306a36Sopenharmony_ci			!snd_soc_dapm_get_pin_status(dapm, "PLL2B"))
99062306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
99162306a36Sopenharmony_ci				RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0);
99262306a36Sopenharmony_ci		if (!snd_soc_dapm_get_pin_status(dapm, "Vref2") &&
99362306a36Sopenharmony_ci			!snd_soc_dapm_get_pin_status(dapm, "PLL1") &&
99462306a36Sopenharmony_ci			!snd_soc_dapm_get_pin_status(dapm, "PLL2B"))
99562306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
99662306a36Sopenharmony_ci				RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0);
99762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
99862306a36Sopenharmony_ci			RT5682_PWR_CBJ, 0);
99962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_MICBIAS_2,
100062306a36Sopenharmony_ci			RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK,
100162306a36Sopenharmony_ci			RT5682_PWR_CLK25M_PD | RT5682_PWR_CLK1M_PD);
100262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
100362306a36Sopenharmony_ci			RT5682_FAST_OFF_MASK, RT5682_FAST_OFF_DIS);
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_ci		rt5682->jack_type = 0;
100662306a36Sopenharmony_ci	}
100762306a36Sopenharmony_ci
100862306a36Sopenharmony_ci	dev_dbg(component->dev, "jack_type = %d\n", rt5682->jack_type);
100962306a36Sopenharmony_ci	return rt5682->jack_type;
101062306a36Sopenharmony_ci}
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_cistatic int rt5682_set_jack_detect(struct snd_soc_component *component,
101362306a36Sopenharmony_ci		struct snd_soc_jack *hs_jack, void *data)
101462306a36Sopenharmony_ci{
101562306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
101662306a36Sopenharmony_ci
101762306a36Sopenharmony_ci	rt5682->hs_jack = hs_jack;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	if (rt5682->is_sdw && !rt5682->first_hw_init)
102062306a36Sopenharmony_ci		return 0;
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_ci	if (!hs_jack) {
102362306a36Sopenharmony_ci		regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
102462306a36Sopenharmony_ci			RT5682_JD1_EN_MASK, RT5682_JD1_DIS);
102562306a36Sopenharmony_ci		regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
102662306a36Sopenharmony_ci			RT5682_POW_JDH | RT5682_POW_JDL, 0);
102762306a36Sopenharmony_ci		cancel_delayed_work_sync(&rt5682->jack_detect_work);
102862306a36Sopenharmony_ci
102962306a36Sopenharmony_ci		return 0;
103062306a36Sopenharmony_ci	}
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_ci	if (!rt5682->is_sdw) {
103362306a36Sopenharmony_ci		switch (rt5682->pdata.jd_src) {
103462306a36Sopenharmony_ci		case RT5682_JD1:
103562306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
103662306a36Sopenharmony_ci				RT5682_CBJ_CTRL_5, 0x0700, 0x0600);
103762306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
103862306a36Sopenharmony_ci				RT5682_CBJ_CTRL_2, RT5682_EXT_JD_SRC,
103962306a36Sopenharmony_ci				RT5682_EXT_JD_SRC_MANUAL);
104062306a36Sopenharmony_ci			snd_soc_component_write(component, RT5682_CBJ_CTRL_1,
104162306a36Sopenharmony_ci				0xd142);
104262306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
104362306a36Sopenharmony_ci				RT5682_CBJ_CTRL_3, RT5682_CBJ_IN_BUF_EN,
104462306a36Sopenharmony_ci				RT5682_CBJ_IN_BUF_EN);
104562306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
104662306a36Sopenharmony_ci				RT5682_SAR_IL_CMD_1, RT5682_SAR_POW_MASK,
104762306a36Sopenharmony_ci				RT5682_SAR_POW_EN);
104862306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_GPIO_CTRL_1,
104962306a36Sopenharmony_ci				RT5682_GP1_PIN_MASK, RT5682_GP1_PIN_IRQ);
105062306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
105162306a36Sopenharmony_ci				RT5682_POW_IRQ | RT5682_POW_JDH |
105262306a36Sopenharmony_ci				RT5682_POW_ANA, RT5682_POW_IRQ |
105362306a36Sopenharmony_ci				RT5682_POW_JDH | RT5682_POW_ANA);
105462306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_2,
105562306a36Sopenharmony_ci				RT5682_PWR_JDH, RT5682_PWR_JDH);
105662306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
105762306a36Sopenharmony_ci				RT5682_JD1_EN_MASK | RT5682_JD1_POL_MASK,
105862306a36Sopenharmony_ci				RT5682_JD1_EN | RT5682_JD1_POL_NOR);
105962306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_4,
106062306a36Sopenharmony_ci				0x7f7f, (rt5682->pdata.btndet_delay << 8 |
106162306a36Sopenharmony_ci				rt5682->pdata.btndet_delay));
106262306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_5,
106362306a36Sopenharmony_ci				0x7f7f, (rt5682->pdata.btndet_delay << 8 |
106462306a36Sopenharmony_ci				rt5682->pdata.btndet_delay));
106562306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_6,
106662306a36Sopenharmony_ci				0x7f7f, (rt5682->pdata.btndet_delay << 8 |
106762306a36Sopenharmony_ci				rt5682->pdata.btndet_delay));
106862306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_7,
106962306a36Sopenharmony_ci				0x7f7f, (rt5682->pdata.btndet_delay << 8 |
107062306a36Sopenharmony_ci				rt5682->pdata.btndet_delay));
107162306a36Sopenharmony_ci			mod_delayed_work(system_power_efficient_wq,
107262306a36Sopenharmony_ci				&rt5682->jack_detect_work,
107362306a36Sopenharmony_ci				msecs_to_jiffies(250));
107462306a36Sopenharmony_ci			break;
107562306a36Sopenharmony_ci
107662306a36Sopenharmony_ci		case RT5682_JD_NULL:
107762306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2,
107862306a36Sopenharmony_ci				RT5682_JD1_EN_MASK, RT5682_JD1_DIS);
107962306a36Sopenharmony_ci			regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL,
108062306a36Sopenharmony_ci				RT5682_POW_JDH | RT5682_POW_JDL, 0);
108162306a36Sopenharmony_ci			break;
108262306a36Sopenharmony_ci
108362306a36Sopenharmony_ci		default:
108462306a36Sopenharmony_ci			dev_warn(component->dev, "Wrong JD source\n");
108562306a36Sopenharmony_ci			break;
108662306a36Sopenharmony_ci		}
108762306a36Sopenharmony_ci	}
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci	return 0;
109062306a36Sopenharmony_ci}
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_civoid rt5682_jack_detect_handler(struct work_struct *work)
109362306a36Sopenharmony_ci{
109462306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
109562306a36Sopenharmony_ci		container_of(work, struct rt5682_priv, jack_detect_work.work);
109662306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm;
109762306a36Sopenharmony_ci	int val, btn_type;
109862306a36Sopenharmony_ci
109962306a36Sopenharmony_ci	if (!rt5682->component ||
110062306a36Sopenharmony_ci	    !snd_soc_card_is_instantiated(rt5682->component->card)) {
110162306a36Sopenharmony_ci		/* card not yet ready, try later */
110262306a36Sopenharmony_ci		mod_delayed_work(system_power_efficient_wq,
110362306a36Sopenharmony_ci				 &rt5682->jack_detect_work, msecs_to_jiffies(15));
110462306a36Sopenharmony_ci		return;
110562306a36Sopenharmony_ci	}
110662306a36Sopenharmony_ci
110762306a36Sopenharmony_ci	if (rt5682->is_sdw) {
110862306a36Sopenharmony_ci		if (pm_runtime_status_suspended(rt5682->slave->dev.parent)) {
110962306a36Sopenharmony_ci			dev_dbg(&rt5682->slave->dev,
111062306a36Sopenharmony_ci				"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
111162306a36Sopenharmony_ci				__func__);
111262306a36Sopenharmony_ci			return;
111362306a36Sopenharmony_ci		}
111462306a36Sopenharmony_ci	}
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci	dapm = snd_soc_component_get_dapm(rt5682->component);
111762306a36Sopenharmony_ci
111862306a36Sopenharmony_ci	snd_soc_dapm_mutex_lock(dapm);
111962306a36Sopenharmony_ci	mutex_lock(&rt5682->calibrate_mutex);
112062306a36Sopenharmony_ci
112162306a36Sopenharmony_ci	val = snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL)
112262306a36Sopenharmony_ci		& RT5682_JDH_RS_MASK;
112362306a36Sopenharmony_ci	if (!val) {
112462306a36Sopenharmony_ci		/* jack in */
112562306a36Sopenharmony_ci		if (rt5682->jack_type == 0) {
112662306a36Sopenharmony_ci			/* jack was out, report jack type */
112762306a36Sopenharmony_ci			rt5682->jack_type =
112862306a36Sopenharmony_ci				rt5682_headset_detect(rt5682->component, 1);
112962306a36Sopenharmony_ci			rt5682->irq_work_delay_time = 0;
113062306a36Sopenharmony_ci		} else if ((rt5682->jack_type & SND_JACK_HEADSET) ==
113162306a36Sopenharmony_ci			SND_JACK_HEADSET) {
113262306a36Sopenharmony_ci			/* jack is already in, report button event */
113362306a36Sopenharmony_ci			rt5682->jack_type = SND_JACK_HEADSET;
113462306a36Sopenharmony_ci			btn_type = rt5682_button_detect(rt5682->component);
113562306a36Sopenharmony_ci			/**
113662306a36Sopenharmony_ci			 * rt5682 can report three kinds of button behavior,
113762306a36Sopenharmony_ci			 * one click, double click and hold. However,
113862306a36Sopenharmony_ci			 * currently we will report button pressed/released
113962306a36Sopenharmony_ci			 * event. So all the three button behaviors are
114062306a36Sopenharmony_ci			 * treated as button pressed.
114162306a36Sopenharmony_ci			 */
114262306a36Sopenharmony_ci			switch (btn_type) {
114362306a36Sopenharmony_ci			case 0x8000:
114462306a36Sopenharmony_ci			case 0x4000:
114562306a36Sopenharmony_ci			case 0x2000:
114662306a36Sopenharmony_ci				rt5682->jack_type |= SND_JACK_BTN_0;
114762306a36Sopenharmony_ci				break;
114862306a36Sopenharmony_ci			case 0x1000:
114962306a36Sopenharmony_ci			case 0x0800:
115062306a36Sopenharmony_ci			case 0x0400:
115162306a36Sopenharmony_ci				rt5682->jack_type |= SND_JACK_BTN_1;
115262306a36Sopenharmony_ci				break;
115362306a36Sopenharmony_ci			case 0x0200:
115462306a36Sopenharmony_ci			case 0x0100:
115562306a36Sopenharmony_ci			case 0x0080:
115662306a36Sopenharmony_ci				rt5682->jack_type |= SND_JACK_BTN_2;
115762306a36Sopenharmony_ci				break;
115862306a36Sopenharmony_ci			case 0x0040:
115962306a36Sopenharmony_ci			case 0x0020:
116062306a36Sopenharmony_ci			case 0x0010:
116162306a36Sopenharmony_ci				rt5682->jack_type |= SND_JACK_BTN_3;
116262306a36Sopenharmony_ci				break;
116362306a36Sopenharmony_ci			case 0x0000: /* unpressed */
116462306a36Sopenharmony_ci				break;
116562306a36Sopenharmony_ci			default:
116662306a36Sopenharmony_ci				dev_err(rt5682->component->dev,
116762306a36Sopenharmony_ci					"Unexpected button code 0x%04x\n",
116862306a36Sopenharmony_ci					btn_type);
116962306a36Sopenharmony_ci				break;
117062306a36Sopenharmony_ci			}
117162306a36Sopenharmony_ci		}
117262306a36Sopenharmony_ci	} else {
117362306a36Sopenharmony_ci		/* jack out */
117462306a36Sopenharmony_ci		rt5682->jack_type = rt5682_headset_detect(rt5682->component, 0);
117562306a36Sopenharmony_ci		rt5682->irq_work_delay_time = 50;
117662306a36Sopenharmony_ci	}
117762306a36Sopenharmony_ci
117862306a36Sopenharmony_ci	mutex_unlock(&rt5682->calibrate_mutex);
117962306a36Sopenharmony_ci	snd_soc_dapm_mutex_unlock(dapm);
118062306a36Sopenharmony_ci
118162306a36Sopenharmony_ci	snd_soc_jack_report(rt5682->hs_jack, rt5682->jack_type,
118262306a36Sopenharmony_ci		SND_JACK_HEADSET |
118362306a36Sopenharmony_ci		SND_JACK_BTN_0 | SND_JACK_BTN_1 |
118462306a36Sopenharmony_ci		SND_JACK_BTN_2 | SND_JACK_BTN_3);
118562306a36Sopenharmony_ci
118662306a36Sopenharmony_ci	if (!rt5682->is_sdw) {
118762306a36Sopenharmony_ci		if (rt5682->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |
118862306a36Sopenharmony_ci			SND_JACK_BTN_2 | SND_JACK_BTN_3))
118962306a36Sopenharmony_ci			schedule_delayed_work(&rt5682->jd_check_work, 0);
119062306a36Sopenharmony_ci		else
119162306a36Sopenharmony_ci			cancel_delayed_work_sync(&rt5682->jd_check_work);
119262306a36Sopenharmony_ci	}
119362306a36Sopenharmony_ci}
119462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_jack_detect_handler);
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_snd_controls[] = {
119762306a36Sopenharmony_ci	/* DAC Digital Volume */
119862306a36Sopenharmony_ci	SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682_DAC1_DIG_VOL,
119962306a36Sopenharmony_ci		RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 87, 0, dac_vol_tlv),
120062306a36Sopenharmony_ci
120162306a36Sopenharmony_ci	/* IN Boost Volume */
120262306a36Sopenharmony_ci	SOC_SINGLE_TLV("CBJ Boost Volume", RT5682_CBJ_BST_CTRL,
120362306a36Sopenharmony_ci		RT5682_BST_CBJ_SFT, 8, 0, bst_tlv),
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci	/* ADC Digital Volume Control */
120662306a36Sopenharmony_ci	SOC_DOUBLE("STO1 ADC Capture Switch", RT5682_STO1_ADC_DIG_VOL,
120762306a36Sopenharmony_ci		RT5682_L_MUTE_SFT, RT5682_R_MUTE_SFT, 1, 1),
120862306a36Sopenharmony_ci	SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682_STO1_ADC_DIG_VOL,
120962306a36Sopenharmony_ci		RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 63, 0, adc_vol_tlv),
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci	/* ADC Boost Volume Control */
121262306a36Sopenharmony_ci	SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682_STO1_ADC_BOOST,
121362306a36Sopenharmony_ci		RT5682_STO1_ADC_L_BST_SFT, RT5682_STO1_ADC_R_BST_SFT,
121462306a36Sopenharmony_ci		3, 0, adc_bst_tlv),
121562306a36Sopenharmony_ci};
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_cistatic int rt5682_div_sel(struct rt5682_priv *rt5682,
121862306a36Sopenharmony_ci		int target, const int div[], int size)
121962306a36Sopenharmony_ci{
122062306a36Sopenharmony_ci	int i;
122162306a36Sopenharmony_ci
122262306a36Sopenharmony_ci	if (rt5682->sysclk < target) {
122362306a36Sopenharmony_ci		dev_err(rt5682->component->dev,
122462306a36Sopenharmony_ci			"sysclk rate %d is too low\n", rt5682->sysclk);
122562306a36Sopenharmony_ci		return 0;
122662306a36Sopenharmony_ci	}
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci	for (i = 0; i < size - 1; i++) {
122962306a36Sopenharmony_ci		dev_dbg(rt5682->component->dev, "div[%d]=%d\n", i, div[i]);
123062306a36Sopenharmony_ci		if (target * div[i] == rt5682->sysclk)
123162306a36Sopenharmony_ci			return i;
123262306a36Sopenharmony_ci		if (target * div[i + 1] > rt5682->sysclk) {
123362306a36Sopenharmony_ci			dev_dbg(rt5682->component->dev,
123462306a36Sopenharmony_ci				"can't find div for sysclk %d\n",
123562306a36Sopenharmony_ci				rt5682->sysclk);
123662306a36Sopenharmony_ci			return i;
123762306a36Sopenharmony_ci		}
123862306a36Sopenharmony_ci	}
123962306a36Sopenharmony_ci
124062306a36Sopenharmony_ci	if (target * div[i] < rt5682->sysclk)
124162306a36Sopenharmony_ci		dev_err(rt5682->component->dev,
124262306a36Sopenharmony_ci			"sysclk rate %d is too high\n", rt5682->sysclk);
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_ci	return size - 1;
124562306a36Sopenharmony_ci}
124662306a36Sopenharmony_ci
124762306a36Sopenharmony_ci/**
124862306a36Sopenharmony_ci * set_dmic_clk - Set parameter of dmic.
124962306a36Sopenharmony_ci *
125062306a36Sopenharmony_ci * @w: DAPM widget.
125162306a36Sopenharmony_ci * @kcontrol: The kcontrol of this widget.
125262306a36Sopenharmony_ci * @event: Event id.
125362306a36Sopenharmony_ci *
125462306a36Sopenharmony_ci * Choose dmic clock between 1MHz and 3MHz.
125562306a36Sopenharmony_ci * It is better for clock to approximate 3MHz.
125662306a36Sopenharmony_ci */
125762306a36Sopenharmony_cistatic int set_dmic_clk(struct snd_soc_dapm_widget *w,
125862306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
125962306a36Sopenharmony_ci{
126062306a36Sopenharmony_ci	struct snd_soc_component *component =
126162306a36Sopenharmony_ci		snd_soc_dapm_to_component(w->dapm);
126262306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
126362306a36Sopenharmony_ci	int idx, dmic_clk_rate = 3072000;
126462306a36Sopenharmony_ci	static const int div[] = {2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128};
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_ci	if (rt5682->pdata.dmic_clk_rate)
126762306a36Sopenharmony_ci		dmic_clk_rate = rt5682->pdata.dmic_clk_rate;
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci	idx = rt5682_div_sel(rt5682, dmic_clk_rate, div, ARRAY_SIZE(div));
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_DMIC_CTRL_1,
127262306a36Sopenharmony_ci		RT5682_DMIC_CLK_MASK, idx << RT5682_DMIC_CLK_SFT);
127362306a36Sopenharmony_ci
127462306a36Sopenharmony_ci	return 0;
127562306a36Sopenharmony_ci}
127662306a36Sopenharmony_ci
127762306a36Sopenharmony_cistatic int set_filter_clk(struct snd_soc_dapm_widget *w,
127862306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
127962306a36Sopenharmony_ci{
128062306a36Sopenharmony_ci	struct snd_soc_component *component =
128162306a36Sopenharmony_ci		snd_soc_dapm_to_component(w->dapm);
128262306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
128362306a36Sopenharmony_ci	int ref, val, reg, idx;
128462306a36Sopenharmony_ci	static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};
128562306a36Sopenharmony_ci	static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48};
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_ci	if (rt5682->is_sdw)
128862306a36Sopenharmony_ci		return 0;
128962306a36Sopenharmony_ci
129062306a36Sopenharmony_ci	val = snd_soc_component_read(component, RT5682_GPIO_CTRL_1) &
129162306a36Sopenharmony_ci		RT5682_GP4_PIN_MASK;
129262306a36Sopenharmony_ci	if (w->shift == RT5682_PWR_ADC_S1F_BIT &&
129362306a36Sopenharmony_ci		val == RT5682_GP4_PIN_ADCDAT2)
129462306a36Sopenharmony_ci		ref = 256 * rt5682->lrck[RT5682_AIF2];
129562306a36Sopenharmony_ci	else
129662306a36Sopenharmony_ci		ref = 256 * rt5682->lrck[RT5682_AIF1];
129762306a36Sopenharmony_ci
129862306a36Sopenharmony_ci	idx = rt5682_div_sel(rt5682, ref, div_f, ARRAY_SIZE(div_f));
129962306a36Sopenharmony_ci
130062306a36Sopenharmony_ci	if (w->shift == RT5682_PWR_ADC_S1F_BIT)
130162306a36Sopenharmony_ci		reg = RT5682_PLL_TRACK_3;
130262306a36Sopenharmony_ci	else
130362306a36Sopenharmony_ci		reg = RT5682_PLL_TRACK_2;
130462306a36Sopenharmony_ci
130562306a36Sopenharmony_ci	snd_soc_component_update_bits(component, reg,
130662306a36Sopenharmony_ci		RT5682_FILTER_CLK_DIV_MASK, idx << RT5682_FILTER_CLK_DIV_SFT);
130762306a36Sopenharmony_ci
130862306a36Sopenharmony_ci	/* select over sample rate */
130962306a36Sopenharmony_ci	for (idx = 0; idx < ARRAY_SIZE(div_o); idx++) {
131062306a36Sopenharmony_ci		if (rt5682->sysclk <= 12288000 * div_o[idx])
131162306a36Sopenharmony_ci			break;
131262306a36Sopenharmony_ci	}
131362306a36Sopenharmony_ci
131462306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1,
131562306a36Sopenharmony_ci		RT5682_ADC_OSR_MASK | RT5682_DAC_OSR_MASK,
131662306a36Sopenharmony_ci		(idx << RT5682_ADC_OSR_SFT) | (idx << RT5682_DAC_OSR_SFT));
131762306a36Sopenharmony_ci
131862306a36Sopenharmony_ci	return 0;
131962306a36Sopenharmony_ci}
132062306a36Sopenharmony_ci
132162306a36Sopenharmony_cistatic int is_sys_clk_from_pll1(struct snd_soc_dapm_widget *w,
132262306a36Sopenharmony_ci		struct snd_soc_dapm_widget *sink)
132362306a36Sopenharmony_ci{
132462306a36Sopenharmony_ci	unsigned int val;
132562306a36Sopenharmony_ci	struct snd_soc_component *component =
132662306a36Sopenharmony_ci		snd_soc_dapm_to_component(w->dapm);
132762306a36Sopenharmony_ci
132862306a36Sopenharmony_ci	val = snd_soc_component_read(component, RT5682_GLB_CLK);
132962306a36Sopenharmony_ci	val &= RT5682_SCLK_SRC_MASK;
133062306a36Sopenharmony_ci	if (val == RT5682_SCLK_SRC_PLL1)
133162306a36Sopenharmony_ci		return 1;
133262306a36Sopenharmony_ci	else
133362306a36Sopenharmony_ci		return 0;
133462306a36Sopenharmony_ci}
133562306a36Sopenharmony_ci
133662306a36Sopenharmony_cistatic int is_sys_clk_from_pll2(struct snd_soc_dapm_widget *w,
133762306a36Sopenharmony_ci		struct snd_soc_dapm_widget *sink)
133862306a36Sopenharmony_ci{
133962306a36Sopenharmony_ci	unsigned int val;
134062306a36Sopenharmony_ci	struct snd_soc_component *component =
134162306a36Sopenharmony_ci		snd_soc_dapm_to_component(w->dapm);
134262306a36Sopenharmony_ci
134362306a36Sopenharmony_ci	val = snd_soc_component_read(component, RT5682_GLB_CLK);
134462306a36Sopenharmony_ci	val &= RT5682_SCLK_SRC_MASK;
134562306a36Sopenharmony_ci	if (val == RT5682_SCLK_SRC_PLL2)
134662306a36Sopenharmony_ci		return 1;
134762306a36Sopenharmony_ci	else
134862306a36Sopenharmony_ci		return 0;
134962306a36Sopenharmony_ci}
135062306a36Sopenharmony_ci
135162306a36Sopenharmony_cistatic int is_using_asrc(struct snd_soc_dapm_widget *w,
135262306a36Sopenharmony_ci		struct snd_soc_dapm_widget *sink)
135362306a36Sopenharmony_ci{
135462306a36Sopenharmony_ci	unsigned int reg, shift, val;
135562306a36Sopenharmony_ci	struct snd_soc_component *component =
135662306a36Sopenharmony_ci		snd_soc_dapm_to_component(w->dapm);
135762306a36Sopenharmony_ci
135862306a36Sopenharmony_ci	switch (w->shift) {
135962306a36Sopenharmony_ci	case RT5682_ADC_STO1_ASRC_SFT:
136062306a36Sopenharmony_ci		reg = RT5682_PLL_TRACK_3;
136162306a36Sopenharmony_ci		shift = RT5682_FILTER_CLK_SEL_SFT;
136262306a36Sopenharmony_ci		break;
136362306a36Sopenharmony_ci	case RT5682_DAC_STO1_ASRC_SFT:
136462306a36Sopenharmony_ci		reg = RT5682_PLL_TRACK_2;
136562306a36Sopenharmony_ci		shift = RT5682_FILTER_CLK_SEL_SFT;
136662306a36Sopenharmony_ci		break;
136762306a36Sopenharmony_ci	default:
136862306a36Sopenharmony_ci		return 0;
136962306a36Sopenharmony_ci	}
137062306a36Sopenharmony_ci
137162306a36Sopenharmony_ci	val = (snd_soc_component_read(component, reg) >> shift) & 0xf;
137262306a36Sopenharmony_ci	switch (val) {
137362306a36Sopenharmony_ci	case RT5682_CLK_SEL_I2S1_ASRC:
137462306a36Sopenharmony_ci	case RT5682_CLK_SEL_I2S2_ASRC:
137562306a36Sopenharmony_ci		return 1;
137662306a36Sopenharmony_ci	default:
137762306a36Sopenharmony_ci		return 0;
137862306a36Sopenharmony_ci	}
137962306a36Sopenharmony_ci}
138062306a36Sopenharmony_ci
138162306a36Sopenharmony_ci/* Digital Mixer */
138262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc_l_mix[] = {
138362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER,
138462306a36Sopenharmony_ci			RT5682_M_STO1_ADC_L1_SFT, 1, 1),
138562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER,
138662306a36Sopenharmony_ci			RT5682_M_STO1_ADC_L2_SFT, 1, 1),
138762306a36Sopenharmony_ci};
138862306a36Sopenharmony_ci
138962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc_r_mix[] = {
139062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER,
139162306a36Sopenharmony_ci			RT5682_M_STO1_ADC_R1_SFT, 1, 1),
139262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER,
139362306a36Sopenharmony_ci			RT5682_M_STO1_ADC_R2_SFT, 1, 1),
139462306a36Sopenharmony_ci};
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_l_mix[] = {
139762306a36Sopenharmony_ci	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER,
139862306a36Sopenharmony_ci			RT5682_M_ADCMIX_L_SFT, 1, 1),
139962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER,
140062306a36Sopenharmony_ci			RT5682_M_DAC1_L_SFT, 1, 1),
140162306a36Sopenharmony_ci};
140262306a36Sopenharmony_ci
140362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_r_mix[] = {
140462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER,
140562306a36Sopenharmony_ci			RT5682_M_ADCMIX_R_SFT, 1, 1),
140662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER,
140762306a36Sopenharmony_ci			RT5682_M_DAC1_R_SFT, 1, 1),
140862306a36Sopenharmony_ci};
140962306a36Sopenharmony_ci
141062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_dac_l_mix[] = {
141162306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER,
141262306a36Sopenharmony_ci			RT5682_M_DAC_L1_STO_L_SFT, 1, 1),
141362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER,
141462306a36Sopenharmony_ci			RT5682_M_DAC_R1_STO_L_SFT, 1, 1),
141562306a36Sopenharmony_ci};
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_dac_r_mix[] = {
141862306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER,
141962306a36Sopenharmony_ci			RT5682_M_DAC_L1_STO_R_SFT, 1, 1),
142062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER,
142162306a36Sopenharmony_ci			RT5682_M_DAC_R1_STO_R_SFT, 1, 1),
142262306a36Sopenharmony_ci};
142362306a36Sopenharmony_ci
142462306a36Sopenharmony_ci/* Analog Input Mixer */
142562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_rec1_l_mix[] = {
142662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("CBJ Switch", RT5682_REC_MIXER,
142762306a36Sopenharmony_ci			RT5682_M_CBJ_RM1_L_SFT, 1, 1),
142862306a36Sopenharmony_ci};
142962306a36Sopenharmony_ci
143062306a36Sopenharmony_ci/* STO1 ADC1 Source */
143162306a36Sopenharmony_ci/* MX-26 [13] [5] */
143262306a36Sopenharmony_cistatic const char * const rt5682_sto1_adc1_src[] = {
143362306a36Sopenharmony_ci	"DAC MIX", "ADC"
143462306a36Sopenharmony_ci};
143562306a36Sopenharmony_ci
143662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
143762306a36Sopenharmony_ci	rt5682_sto1_adc1l_enum, RT5682_STO1_ADC_MIXER,
143862306a36Sopenharmony_ci	RT5682_STO1_ADC1L_SRC_SFT, rt5682_sto1_adc1_src);
143962306a36Sopenharmony_ci
144062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc1l_mux =
144162306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1l_enum);
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
144462306a36Sopenharmony_ci	rt5682_sto1_adc1r_enum, RT5682_STO1_ADC_MIXER,
144562306a36Sopenharmony_ci	RT5682_STO1_ADC1R_SRC_SFT, rt5682_sto1_adc1_src);
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc1r_mux =
144862306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1r_enum);
144962306a36Sopenharmony_ci
145062306a36Sopenharmony_ci/* STO1 ADC Source */
145162306a36Sopenharmony_ci/* MX-26 [11:10] [3:2] */
145262306a36Sopenharmony_cistatic const char * const rt5682_sto1_adc_src[] = {
145362306a36Sopenharmony_ci	"ADC1 L", "ADC1 R"
145462306a36Sopenharmony_ci};
145562306a36Sopenharmony_ci
145662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
145762306a36Sopenharmony_ci	rt5682_sto1_adcl_enum, RT5682_STO1_ADC_MIXER,
145862306a36Sopenharmony_ci	RT5682_STO1_ADCL_SRC_SFT, rt5682_sto1_adc_src);
145962306a36Sopenharmony_ci
146062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adcl_mux =
146162306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5682_sto1_adcl_enum);
146262306a36Sopenharmony_ci
146362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
146462306a36Sopenharmony_ci	rt5682_sto1_adcr_enum, RT5682_STO1_ADC_MIXER,
146562306a36Sopenharmony_ci	RT5682_STO1_ADCR_SRC_SFT, rt5682_sto1_adc_src);
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adcr_mux =
146862306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5682_sto1_adcr_enum);
146962306a36Sopenharmony_ci
147062306a36Sopenharmony_ci/* STO1 ADC2 Source */
147162306a36Sopenharmony_ci/* MX-26 [12] [4] */
147262306a36Sopenharmony_cistatic const char * const rt5682_sto1_adc2_src[] = {
147362306a36Sopenharmony_ci	"DAC MIX", "DMIC"
147462306a36Sopenharmony_ci};
147562306a36Sopenharmony_ci
147662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
147762306a36Sopenharmony_ci	rt5682_sto1_adc2l_enum, RT5682_STO1_ADC_MIXER,
147862306a36Sopenharmony_ci	RT5682_STO1_ADC2L_SRC_SFT, rt5682_sto1_adc2_src);
147962306a36Sopenharmony_ci
148062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc2l_mux =
148162306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5682_sto1_adc2l_enum);
148262306a36Sopenharmony_ci
148362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
148462306a36Sopenharmony_ci	rt5682_sto1_adc2r_enum, RT5682_STO1_ADC_MIXER,
148562306a36Sopenharmony_ci	RT5682_STO1_ADC2R_SRC_SFT, rt5682_sto1_adc2_src);
148662306a36Sopenharmony_ci
148762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc2r_mux =
148862306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5682_sto1_adc2r_enum);
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_ci/* MX-79 [6:4] I2S1 ADC data location */
149162306a36Sopenharmony_cistatic const unsigned int rt5682_if1_adc_slot_values[] = {
149262306a36Sopenharmony_ci	0,
149362306a36Sopenharmony_ci	2,
149462306a36Sopenharmony_ci	4,
149562306a36Sopenharmony_ci	6,
149662306a36Sopenharmony_ci};
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_cistatic const char * const rt5682_if1_adc_slot_src[] = {
149962306a36Sopenharmony_ci	"Slot 0", "Slot 2", "Slot 4", "Slot 6"
150062306a36Sopenharmony_ci};
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682_if1_adc_slot_enum,
150362306a36Sopenharmony_ci	RT5682_TDM_CTRL, RT5682_TDM_ADC_LCA_SFT, RT5682_TDM_ADC_LCA_MASK,
150462306a36Sopenharmony_ci	rt5682_if1_adc_slot_src, rt5682_if1_adc_slot_values);
150562306a36Sopenharmony_ci
150662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_adc_slot_mux =
150762306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC Slot location", rt5682_if1_adc_slot_enum);
150862306a36Sopenharmony_ci
150962306a36Sopenharmony_ci/* Analog DAC L1 Source, Analog DAC R1 Source*/
151062306a36Sopenharmony_ci/* MX-2B [4], MX-2B [0]*/
151162306a36Sopenharmony_cistatic const char * const rt5682_alg_dac1_src[] = {
151262306a36Sopenharmony_ci	"Stereo1 DAC Mixer", "DAC1"
151362306a36Sopenharmony_ci};
151462306a36Sopenharmony_ci
151562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
151662306a36Sopenharmony_ci	rt5682_alg_dac_l1_enum, RT5682_A_DAC1_MUX,
151762306a36Sopenharmony_ci	RT5682_A_DACL1_SFT, rt5682_alg_dac1_src);
151862306a36Sopenharmony_ci
151962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_alg_dac_l1_mux =
152062306a36Sopenharmony_ci	SOC_DAPM_ENUM("Analog DAC L1 Source", rt5682_alg_dac_l1_enum);
152162306a36Sopenharmony_ci
152262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
152362306a36Sopenharmony_ci	rt5682_alg_dac_r1_enum, RT5682_A_DAC1_MUX,
152462306a36Sopenharmony_ci	RT5682_A_DACR1_SFT, rt5682_alg_dac1_src);
152562306a36Sopenharmony_ci
152662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_alg_dac_r1_mux =
152762306a36Sopenharmony_ci	SOC_DAPM_ENUM("Analog DAC R1 Source", rt5682_alg_dac_r1_enum);
152862306a36Sopenharmony_ci
152962306a36Sopenharmony_ci/* Out Switch */
153062306a36Sopenharmony_cistatic const struct snd_kcontrol_new hpol_switch =
153162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1,
153262306a36Sopenharmony_ci		RT5682_L_MUTE_SFT, 1, 1);
153362306a36Sopenharmony_cistatic const struct snd_kcontrol_new hpor_switch =
153462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1,
153562306a36Sopenharmony_ci		RT5682_R_MUTE_SFT, 1, 1);
153662306a36Sopenharmony_ci
153762306a36Sopenharmony_cistatic int rt5682_hp_event(struct snd_soc_dapm_widget *w,
153862306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
153962306a36Sopenharmony_ci{
154062306a36Sopenharmony_ci	struct snd_soc_component *component =
154162306a36Sopenharmony_ci		snd_soc_dapm_to_component(w->dapm);
154262306a36Sopenharmony_ci
154362306a36Sopenharmony_ci	switch (event) {
154462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
154562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
154662306a36Sopenharmony_ci			RT5682_HP_C2_DAC_AMP_MUTE, 0);
154762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_HP_LOGIC_CTRL_2,
154862306a36Sopenharmony_ci			RT5682_HP_LC2_SIG_SOUR2_MASK, RT5682_HP_LC2_SIG_SOUR2_REG);
154962306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
155062306a36Sopenharmony_ci			RT5682_DEPOP_1, 0x60, 0x60);
155162306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
155262306a36Sopenharmony_ci			RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080);
155362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
155462306a36Sopenharmony_ci			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN,
155562306a36Sopenharmony_ci			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN);
155662306a36Sopenharmony_ci		usleep_range(5000, 10000);
155762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1,
155862306a36Sopenharmony_ci			RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_L);
155962306a36Sopenharmony_ci		break;
156062306a36Sopenharmony_ci
156162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
156262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
156362306a36Sopenharmony_ci			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN, 0);
156462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1,
156562306a36Sopenharmony_ci			RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_M);
156662306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
156762306a36Sopenharmony_ci			RT5682_DEPOP_1, 0x60, 0x0);
156862306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
156962306a36Sopenharmony_ci			RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0000);
157062306a36Sopenharmony_ci		break;
157162306a36Sopenharmony_ci	}
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_ci	return 0;
157462306a36Sopenharmony_ci}
157562306a36Sopenharmony_ci
157662306a36Sopenharmony_cistatic int set_dmic_power(struct snd_soc_dapm_widget *w,
157762306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
157862306a36Sopenharmony_ci{
157962306a36Sopenharmony_ci	struct snd_soc_component *component =
158062306a36Sopenharmony_ci		snd_soc_dapm_to_component(w->dapm);
158162306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
158262306a36Sopenharmony_ci	unsigned int delay = 50, val;
158362306a36Sopenharmony_ci
158462306a36Sopenharmony_ci	if (rt5682->pdata.dmic_delay)
158562306a36Sopenharmony_ci		delay = rt5682->pdata.dmic_delay;
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	switch (event) {
158862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
158962306a36Sopenharmony_ci		val = snd_soc_component_read(component, RT5682_GLB_CLK);
159062306a36Sopenharmony_ci		val &= RT5682_SCLK_SRC_MASK;
159162306a36Sopenharmony_ci		if (val == RT5682_SCLK_SRC_PLL1 || val == RT5682_SCLK_SRC_PLL2)
159262306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
159362306a36Sopenharmony_ci				RT5682_PWR_ANLG_1,
159462306a36Sopenharmony_ci				RT5682_PWR_VREF2 | RT5682_PWR_MB,
159562306a36Sopenharmony_ci				RT5682_PWR_VREF2 | RT5682_PWR_MB);
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_ci		/*Add delay to avoid pop noise*/
159862306a36Sopenharmony_ci		msleep(delay);
159962306a36Sopenharmony_ci		break;
160062306a36Sopenharmony_ci
160162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
160262306a36Sopenharmony_ci		if (!rt5682->jack_type) {
160362306a36Sopenharmony_ci			if (!snd_soc_dapm_get_pin_status(w->dapm, "MICBIAS"))
160462306a36Sopenharmony_ci				snd_soc_component_update_bits(component,
160562306a36Sopenharmony_ci					RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0);
160662306a36Sopenharmony_ci			if (!snd_soc_dapm_get_pin_status(w->dapm, "Vref2"))
160762306a36Sopenharmony_ci				snd_soc_component_update_bits(component,
160862306a36Sopenharmony_ci					RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0);
160962306a36Sopenharmony_ci		}
161062306a36Sopenharmony_ci		break;
161162306a36Sopenharmony_ci	}
161262306a36Sopenharmony_ci
161362306a36Sopenharmony_ci	return 0;
161462306a36Sopenharmony_ci}
161562306a36Sopenharmony_ci
161662306a36Sopenharmony_cistatic int rt5682_set_verf(struct snd_soc_dapm_widget *w,
161762306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
161862306a36Sopenharmony_ci{
161962306a36Sopenharmony_ci	struct snd_soc_component *component =
162062306a36Sopenharmony_ci		snd_soc_dapm_to_component(w->dapm);
162162306a36Sopenharmony_ci
162262306a36Sopenharmony_ci	switch (event) {
162362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
162462306a36Sopenharmony_ci		switch (w->shift) {
162562306a36Sopenharmony_ci		case RT5682_PWR_VREF1_BIT:
162662306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
162762306a36Sopenharmony_ci				RT5682_PWR_ANLG_1, RT5682_PWR_FV1, 0);
162862306a36Sopenharmony_ci			break;
162962306a36Sopenharmony_ci
163062306a36Sopenharmony_ci		case RT5682_PWR_VREF2_BIT:
163162306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
163262306a36Sopenharmony_ci				RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0);
163362306a36Sopenharmony_ci			break;
163462306a36Sopenharmony_ci		}
163562306a36Sopenharmony_ci		break;
163662306a36Sopenharmony_ci
163762306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
163862306a36Sopenharmony_ci		usleep_range(15000, 20000);
163962306a36Sopenharmony_ci		switch (w->shift) {
164062306a36Sopenharmony_ci		case RT5682_PWR_VREF1_BIT:
164162306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
164262306a36Sopenharmony_ci				RT5682_PWR_ANLG_1, RT5682_PWR_FV1,
164362306a36Sopenharmony_ci				RT5682_PWR_FV1);
164462306a36Sopenharmony_ci			break;
164562306a36Sopenharmony_ci
164662306a36Sopenharmony_ci		case RT5682_PWR_VREF2_BIT:
164762306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
164862306a36Sopenharmony_ci				RT5682_PWR_ANLG_1, RT5682_PWR_FV2,
164962306a36Sopenharmony_ci				RT5682_PWR_FV2);
165062306a36Sopenharmony_ci			break;
165162306a36Sopenharmony_ci		}
165262306a36Sopenharmony_ci		break;
165362306a36Sopenharmony_ci	}
165462306a36Sopenharmony_ci
165562306a36Sopenharmony_ci	return 0;
165662306a36Sopenharmony_ci}
165762306a36Sopenharmony_ci
165862306a36Sopenharmony_cistatic const unsigned int rt5682_adcdat_pin_values[] = {
165962306a36Sopenharmony_ci	1,
166062306a36Sopenharmony_ci	3,
166162306a36Sopenharmony_ci};
166262306a36Sopenharmony_ci
166362306a36Sopenharmony_cistatic const char * const rt5682_adcdat_pin_select[] = {
166462306a36Sopenharmony_ci	"ADCDAT1",
166562306a36Sopenharmony_ci	"ADCDAT2",
166662306a36Sopenharmony_ci};
166762306a36Sopenharmony_ci
166862306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682_adcdat_pin_enum,
166962306a36Sopenharmony_ci	RT5682_GPIO_CTRL_1, RT5682_GP4_PIN_SFT, RT5682_GP4_PIN_MASK,
167062306a36Sopenharmony_ci	rt5682_adcdat_pin_select, rt5682_adcdat_pin_values);
167162306a36Sopenharmony_ci
167262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_adcdat_pin_ctrl =
167362306a36Sopenharmony_ci	SOC_DAPM_ENUM("ADCDAT", rt5682_adcdat_pin_enum);
167462306a36Sopenharmony_ci
167562306a36Sopenharmony_cistatic const unsigned int rt5682_hpo_sig_out_values[] = {
167662306a36Sopenharmony_ci	2,
167762306a36Sopenharmony_ci	7,
167862306a36Sopenharmony_ci};
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_cistatic const char * const rt5682_hpo_sig_out_mode[] = {
168162306a36Sopenharmony_ci	"Legacy",
168262306a36Sopenharmony_ci	"OneBit",
168362306a36Sopenharmony_ci};
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682_hpo_sig_out_enum,
168662306a36Sopenharmony_ci	RT5682_HP_LOGIC_CTRL_2, 0, RT5682_HP_LC2_SIG_SOUR1_MASK,
168762306a36Sopenharmony_ci	rt5682_hpo_sig_out_mode, rt5682_hpo_sig_out_values);
168862306a36Sopenharmony_ci
168962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_hpo_sig_demux =
169062306a36Sopenharmony_ci	SOC_DAPM_ENUM("HPO Signal Demux", rt5682_hpo_sig_out_enum);
169162306a36Sopenharmony_ci
169262306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = {
169362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("LDO2", RT5682_PWR_ANLG_3, RT5682_PWR_LDO2_BIT,
169462306a36Sopenharmony_ci		0, NULL, 0),
169562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("PLL1", RT5682_PWR_ANLG_3, RT5682_PWR_PLL_BIT,
169662306a36Sopenharmony_ci		0, NULL, 0),
169762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("PLL2B", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2B_BIT,
169862306a36Sopenharmony_ci		0, NULL, 0),
169962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("PLL2F", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2F_BIT,
170062306a36Sopenharmony_ci		0, set_filter_clk, SND_SOC_DAPM_PRE_PMU),
170162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("Vref1", RT5682_PWR_ANLG_1, RT5682_PWR_VREF1_BIT, 0,
170262306a36Sopenharmony_ci		rt5682_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
170362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("Vref2", SND_SOC_NOPM, 0, 0, NULL, 0),
170462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MICBIAS", SND_SOC_NOPM, 0, 0, NULL, 0),
170562306a36Sopenharmony_ci
170662306a36Sopenharmony_ci	/* ASRC */
170762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682_PLL_TRACK_1,
170862306a36Sopenharmony_ci		RT5682_DAC_STO1_ASRC_SFT, 0, NULL, 0),
170962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5682_PLL_TRACK_1,
171062306a36Sopenharmony_ci		RT5682_ADC_STO1_ASRC_SFT, 0, NULL, 0),
171162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AD ASRC", 1, RT5682_PLL_TRACK_1,
171262306a36Sopenharmony_ci		RT5682_AD_ASRC_SFT, 0, NULL, 0),
171362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DA ASRC", 1, RT5682_PLL_TRACK_1,
171462306a36Sopenharmony_ci		RT5682_DA_ASRC_SFT, 0, NULL, 0),
171562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC ASRC", 1, RT5682_PLL_TRACK_1,
171662306a36Sopenharmony_ci		RT5682_DMIC_ASRC_SFT, 0, NULL, 0),
171762306a36Sopenharmony_ci
171862306a36Sopenharmony_ci	/* Input Side */
171962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5682_PWR_ANLG_2, RT5682_PWR_MB1_BIT,
172062306a36Sopenharmony_ci		0, NULL, 0),
172162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5682_PWR_ANLG_2, RT5682_PWR_MB2_BIT,
172262306a36Sopenharmony_ci		0, NULL, 0),
172362306a36Sopenharmony_ci
172462306a36Sopenharmony_ci	/* Input Lines */
172562306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC L1"),
172662306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC R1"),
172762306a36Sopenharmony_ci
172862306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("IN1P"),
172962306a36Sopenharmony_ci
173062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
173162306a36Sopenharmony_ci		set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
173262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5682_DMIC_CTRL_1,
173362306a36Sopenharmony_ci		RT5682_DMIC_1_EN_SFT, 0, set_dmic_power,
173462306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
173562306a36Sopenharmony_ci
173662306a36Sopenharmony_ci	/* Boost */
173762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM,
173862306a36Sopenharmony_ci		0, 0, NULL, 0),
173962306a36Sopenharmony_ci
174062306a36Sopenharmony_ci	/* REC Mixer */
174162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682_rec1_l_mix,
174262306a36Sopenharmony_ci		ARRAY_SIZE(rt5682_rec1_l_mix)),
174362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5682_PWR_ANLG_2,
174462306a36Sopenharmony_ci		RT5682_PWR_RM1_L_BIT, 0, NULL, 0),
174562306a36Sopenharmony_ci
174662306a36Sopenharmony_ci	/* ADCs */
174762306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),
174862306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),
174962306a36Sopenharmony_ci
175062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5682_PWR_DIG_1,
175162306a36Sopenharmony_ci		RT5682_PWR_ADC_L1_BIT, 0, NULL, 0),
175262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5682_PWR_DIG_1,
175362306a36Sopenharmony_ci		RT5682_PWR_ADC_R1_BIT, 0, NULL, 0),
175462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5682_CHOP_ADC,
175562306a36Sopenharmony_ci		RT5682_CKGEN_ADC1_SFT, 0, NULL, 0),
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci	/* ADC Mux */
175862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
175962306a36Sopenharmony_ci		&rt5682_sto1_adc1l_mux),
176062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
176162306a36Sopenharmony_ci		&rt5682_sto1_adc1r_mux),
176262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
176362306a36Sopenharmony_ci		&rt5682_sto1_adc2l_mux),
176462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
176562306a36Sopenharmony_ci		&rt5682_sto1_adc2r_mux),
176662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,
176762306a36Sopenharmony_ci		&rt5682_sto1_adcl_mux),
176862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,
176962306a36Sopenharmony_ci		&rt5682_sto1_adcr_mux),
177062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1_ADC Mux", SND_SOC_NOPM, 0, 0,
177162306a36Sopenharmony_ci		&rt5682_if1_adc_slot_mux),
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_ci	/* ADC Mixer */
177462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682_PWR_DIG_2,
177562306a36Sopenharmony_ci		RT5682_PWR_ADC_S1F_BIT, 0, set_filter_clk,
177662306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU),
177762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", RT5682_STO1_ADC_DIG_VOL,
177862306a36Sopenharmony_ci		RT5682_L_MUTE_SFT, 1, rt5682_sto1_adc_l_mix,
177962306a36Sopenharmony_ci		ARRAY_SIZE(rt5682_sto1_adc_l_mix)),
178062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5682_STO1_ADC_DIG_VOL,
178162306a36Sopenharmony_ci		RT5682_R_MUTE_SFT, 1, rt5682_sto1_adc_r_mix,
178262306a36Sopenharmony_ci		ARRAY_SIZE(rt5682_sto1_adc_r_mix)),
178362306a36Sopenharmony_ci
178462306a36Sopenharmony_ci	/* ADC PGA */
178562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
178662306a36Sopenharmony_ci
178762306a36Sopenharmony_ci	/* Digital Interface */
178862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("I2S1", RT5682_PWR_DIG_1, RT5682_PWR_I2S1_BIT,
178962306a36Sopenharmony_ci		0, NULL, 0),
179062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("I2S2", RT5682_PWR_DIG_1, RT5682_PWR_I2S2_BIT,
179162306a36Sopenharmony_ci		0, NULL, 0),
179262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
179362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
179462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
179562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SOUND DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
179662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SOUND DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
179762306a36Sopenharmony_ci
179862306a36Sopenharmony_ci	/* Digital Interface Select */
179962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
180062306a36Sopenharmony_ci		&rt5682_if1_01_adc_swap_mux),
180162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
180262306a36Sopenharmony_ci		&rt5682_if1_23_adc_swap_mux),
180362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
180462306a36Sopenharmony_ci		&rt5682_if1_45_adc_swap_mux),
180562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
180662306a36Sopenharmony_ci		&rt5682_if1_67_adc_swap_mux),
180762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
180862306a36Sopenharmony_ci		&rt5682_if2_adc_swap_mux),
180962306a36Sopenharmony_ci
181062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("ADCDAT Mux", SND_SOC_NOPM, 0, 0,
181162306a36Sopenharmony_ci		&rt5682_adcdat_pin_ctrl),
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC L Mux", SND_SOC_NOPM, 0, 0,
181462306a36Sopenharmony_ci		&rt5682_dac_l_mux),
181562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC R Mux", SND_SOC_NOPM, 0, 0,
181662306a36Sopenharmony_ci		&rt5682_dac_r_mux),
181762306a36Sopenharmony_ci
181862306a36Sopenharmony_ci	/* Audio Interface */
181962306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0,
182062306a36Sopenharmony_ci		RT5682_I2S1_SDP, RT5682_SEL_ADCDAT_SFT, 1),
182162306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0,
182262306a36Sopenharmony_ci		RT5682_I2S2_SDP, RT5682_I2S2_PIN_CFG_SFT, 1),
182362306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
182462306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("SDWRX", "SDW Playback", 0, SND_SOC_NOPM, 0, 0),
182562306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("SDWTX", "SDW Capture", 0, SND_SOC_NOPM, 0, 0),
182662306a36Sopenharmony_ci
182762306a36Sopenharmony_ci	/* Output Side */
182862306a36Sopenharmony_ci	/* DAC mixer before sound effect  */
182962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
183062306a36Sopenharmony_ci		rt5682_dac_l_mix, ARRAY_SIZE(rt5682_dac_l_mix)),
183162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
183262306a36Sopenharmony_ci		rt5682_dac_r_mix, ARRAY_SIZE(rt5682_dac_r_mix)),
183362306a36Sopenharmony_ci
183462306a36Sopenharmony_ci	/* DAC channel Mux */
183562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0,
183662306a36Sopenharmony_ci		&rt5682_alg_dac_l1_mux),
183762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0,
183862306a36Sopenharmony_ci		&rt5682_alg_dac_r1_mux),
183962306a36Sopenharmony_ci
184062306a36Sopenharmony_ci	/* DAC Mixer */
184162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5682_PWR_DIG_2,
184262306a36Sopenharmony_ci		RT5682_PWR_DAC_S1F_BIT, 0, set_filter_clk,
184362306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU),
184462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0,
184562306a36Sopenharmony_ci		rt5682_sto1_dac_l_mix, ARRAY_SIZE(rt5682_sto1_dac_l_mix)),
184662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0,
184762306a36Sopenharmony_ci		rt5682_sto1_dac_r_mix, ARRAY_SIZE(rt5682_sto1_dac_r_mix)),
184862306a36Sopenharmony_ci
184962306a36Sopenharmony_ci	/* DACs */
185062306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC L1", NULL, RT5682_PWR_DIG_1,
185162306a36Sopenharmony_ci		RT5682_PWR_DAC_L1_BIT, 0),
185262306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC R1", NULL, RT5682_PWR_DIG_1,
185362306a36Sopenharmony_ci		RT5682_PWR_DAC_R1_BIT, 0),
185462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC 1 Clock", 3, RT5682_CHOP_DAC,
185562306a36Sopenharmony_ci		RT5682_CKGEN_DAC1_SFT, 0, NULL, 0),
185662306a36Sopenharmony_ci
185762306a36Sopenharmony_ci	/* HPO */
185862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5682_hp_event,
185962306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU),
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("HP Amp L", RT5682_PWR_ANLG_1,
186262306a36Sopenharmony_ci		RT5682_PWR_HA_L_BIT, 0, NULL, 0),
186362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("HP Amp R", RT5682_PWR_ANLG_1,
186462306a36Sopenharmony_ci		RT5682_PWR_HA_R_BIT, 0, NULL, 0),
186562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, RT5682_DEPOP_1,
186662306a36Sopenharmony_ci		RT5682_PUMP_EN_SFT, 0, NULL, 0),
186762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("Capless", 2, RT5682_DEPOP_1,
186862306a36Sopenharmony_ci		RT5682_CAPLESS_EN_SFT, 0, NULL, 0),
186962306a36Sopenharmony_ci
187062306a36Sopenharmony_ci	SND_SOC_DAPM_SWITCH("HPOL Playback", SND_SOC_NOPM, 0, 0,
187162306a36Sopenharmony_ci		&hpol_switch),
187262306a36Sopenharmony_ci	SND_SOC_DAPM_SWITCH("HPOR Playback", SND_SOC_NOPM, 0, 0,
187362306a36Sopenharmony_ci		&hpor_switch),
187462306a36Sopenharmony_ci
187562306a36Sopenharmony_ci	SND_SOC_DAPM_OUT_DRV("HPO Legacy", SND_SOC_NOPM, 0, 0, NULL, 0),
187662306a36Sopenharmony_ci	SND_SOC_DAPM_OUT_DRV("HPO OneBit", SND_SOC_NOPM, 0, 0, NULL, 0),
187762306a36Sopenharmony_ci	SND_SOC_DAPM_DEMUX("HPO Signal Demux", SND_SOC_NOPM, 0, 0, &rt5682_hpo_sig_demux),
187862306a36Sopenharmony_ci
187962306a36Sopenharmony_ci	/* CLK DET */
188062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682_CLK_DET,
188162306a36Sopenharmony_ci		RT5682_SYS_CLK_DET_SFT,	0, NULL, 0),
188262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("CLKDET PLL1", RT5682_CLK_DET,
188362306a36Sopenharmony_ci		RT5682_PLL1_CLK_DET_SFT, 0, NULL, 0),
188462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("CLKDET PLL2", RT5682_CLK_DET,
188562306a36Sopenharmony_ci		RT5682_PLL2_CLK_DET_SFT, 0, NULL, 0),
188662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("CLKDET", RT5682_CLK_DET,
188762306a36Sopenharmony_ci		RT5682_POW_CLK_DET_SFT, 0, NULL, 0),
188862306a36Sopenharmony_ci
188962306a36Sopenharmony_ci	/* Output Lines */
189062306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("HPOL"),
189162306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("HPOR"),
189262306a36Sopenharmony_ci};
189362306a36Sopenharmony_ci
189462306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5682_dapm_routes[] = {
189562306a36Sopenharmony_ci	/*PLL*/
189662306a36Sopenharmony_ci	{"ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1},
189762306a36Sopenharmony_ci	{"ADC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2},
189862306a36Sopenharmony_ci	{"ADC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2},
189962306a36Sopenharmony_ci	{"DAC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1},
190062306a36Sopenharmony_ci	{"DAC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2},
190162306a36Sopenharmony_ci	{"DAC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2},
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci	/*ASRC*/
190462306a36Sopenharmony_ci	{"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc},
190562306a36Sopenharmony_ci	{"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},
190662306a36Sopenharmony_ci	{"ADC STO1 ASRC", NULL, "AD ASRC"},
190762306a36Sopenharmony_ci	{"ADC STO1 ASRC", NULL, "DA ASRC"},
190862306a36Sopenharmony_ci	{"ADC STO1 ASRC", NULL, "CLKDET"},
190962306a36Sopenharmony_ci	{"DAC STO1 ASRC", NULL, "AD ASRC"},
191062306a36Sopenharmony_ci	{"DAC STO1 ASRC", NULL, "DA ASRC"},
191162306a36Sopenharmony_ci	{"DAC STO1 ASRC", NULL, "CLKDET"},
191262306a36Sopenharmony_ci
191362306a36Sopenharmony_ci	/*Vref*/
191462306a36Sopenharmony_ci	{"MICBIAS1", NULL, "Vref1"},
191562306a36Sopenharmony_ci	{"MICBIAS2", NULL, "Vref1"},
191662306a36Sopenharmony_ci
191762306a36Sopenharmony_ci	{"CLKDET SYS", NULL, "CLKDET"},
191862306a36Sopenharmony_ci
191962306a36Sopenharmony_ci	{"BST1 CBJ", NULL, "IN1P"},
192062306a36Sopenharmony_ci
192162306a36Sopenharmony_ci	{"RECMIX1L", "CBJ Switch", "BST1 CBJ"},
192262306a36Sopenharmony_ci	{"RECMIX1L", NULL, "RECMIX1L Power"},
192362306a36Sopenharmony_ci
192462306a36Sopenharmony_ci	{"ADC1 L", NULL, "RECMIX1L"},
192562306a36Sopenharmony_ci	{"ADC1 L", NULL, "ADC1 L Power"},
192662306a36Sopenharmony_ci	{"ADC1 L", NULL, "ADC1 clock"},
192762306a36Sopenharmony_ci
192862306a36Sopenharmony_ci	{"DMIC L1", NULL, "DMIC CLK"},
192962306a36Sopenharmony_ci	{"DMIC L1", NULL, "DMIC1 Power"},
193062306a36Sopenharmony_ci	{"DMIC R1", NULL, "DMIC CLK"},
193162306a36Sopenharmony_ci	{"DMIC R1", NULL, "DMIC1 Power"},
193262306a36Sopenharmony_ci	{"DMIC CLK", NULL, "DMIC ASRC"},
193362306a36Sopenharmony_ci
193462306a36Sopenharmony_ci	{"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"},
193562306a36Sopenharmony_ci	{"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"},
193662306a36Sopenharmony_ci	{"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"},
193762306a36Sopenharmony_ci	{"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"},
193862306a36Sopenharmony_ci
193962306a36Sopenharmony_ci	{"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"},
194062306a36Sopenharmony_ci	{"Stereo1 ADC L1 Mux", "DAC MIX", "Stereo1 DAC MIXL"},
194162306a36Sopenharmony_ci	{"Stereo1 ADC L2 Mux", "DMIC", "DMIC L1"},
194262306a36Sopenharmony_ci	{"Stereo1 ADC L2 Mux", "DAC MIX", "Stereo1 DAC MIXL"},
194362306a36Sopenharmony_ci
194462306a36Sopenharmony_ci	{"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"},
194562306a36Sopenharmony_ci	{"Stereo1 ADC R1 Mux", "DAC MIX", "Stereo1 DAC MIXR"},
194662306a36Sopenharmony_ci	{"Stereo1 ADC R2 Mux", "DMIC", "DMIC R1"},
194762306a36Sopenharmony_ci	{"Stereo1 ADC R2 Mux", "DAC MIX", "Stereo1 DAC MIXR"},
194862306a36Sopenharmony_ci
194962306a36Sopenharmony_ci	{"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"},
195062306a36Sopenharmony_ci	{"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"},
195162306a36Sopenharmony_ci	{"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"},
195262306a36Sopenharmony_ci
195362306a36Sopenharmony_ci	{"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"},
195462306a36Sopenharmony_ci	{"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"},
195562306a36Sopenharmony_ci	{"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"},
195662306a36Sopenharmony_ci
195762306a36Sopenharmony_ci	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"},
195862306a36Sopenharmony_ci	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"},
195962306a36Sopenharmony_ci
196062306a36Sopenharmony_ci	{"IF1 01 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
196162306a36Sopenharmony_ci	{"IF1 01 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
196262306a36Sopenharmony_ci	{"IF1 01 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
196362306a36Sopenharmony_ci	{"IF1 01 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
196462306a36Sopenharmony_ci	{"IF1 23 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
196562306a36Sopenharmony_ci	{"IF1 23 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
196662306a36Sopenharmony_ci	{"IF1 23 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
196762306a36Sopenharmony_ci	{"IF1 23 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
196862306a36Sopenharmony_ci	{"IF1 45 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
196962306a36Sopenharmony_ci	{"IF1 45 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
197062306a36Sopenharmony_ci	{"IF1 45 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
197162306a36Sopenharmony_ci	{"IF1 45 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
197262306a36Sopenharmony_ci	{"IF1 67 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
197362306a36Sopenharmony_ci	{"IF1 67 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
197462306a36Sopenharmony_ci	{"IF1 67 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
197562306a36Sopenharmony_ci	{"IF1 67 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
197662306a36Sopenharmony_ci
197762306a36Sopenharmony_ci	{"IF1_ADC Mux", "Slot 0", "IF1 01 ADC Swap Mux"},
197862306a36Sopenharmony_ci	{"IF1_ADC Mux", "Slot 2", "IF1 23 ADC Swap Mux"},
197962306a36Sopenharmony_ci	{"IF1_ADC Mux", "Slot 4", "IF1 45 ADC Swap Mux"},
198062306a36Sopenharmony_ci	{"IF1_ADC Mux", "Slot 6", "IF1 67 ADC Swap Mux"},
198162306a36Sopenharmony_ci	{"ADCDAT Mux", "ADCDAT1", "IF1_ADC Mux"},
198262306a36Sopenharmony_ci	{"AIF1TX", NULL, "I2S1"},
198362306a36Sopenharmony_ci	{"AIF1TX", NULL, "ADCDAT Mux"},
198462306a36Sopenharmony_ci	{"IF2 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
198562306a36Sopenharmony_ci	{"IF2 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
198662306a36Sopenharmony_ci	{"IF2 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
198762306a36Sopenharmony_ci	{"IF2 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
198862306a36Sopenharmony_ci	{"ADCDAT Mux", "ADCDAT2", "IF2 ADC Swap Mux"},
198962306a36Sopenharmony_ci	{"AIF2TX", NULL, "ADCDAT Mux"},
199062306a36Sopenharmony_ci
199162306a36Sopenharmony_ci	{"SDWTX", NULL, "PLL2B"},
199262306a36Sopenharmony_ci	{"SDWTX", NULL, "PLL2F"},
199362306a36Sopenharmony_ci	{"SDWTX", NULL, "ADCDAT Mux"},
199462306a36Sopenharmony_ci
199562306a36Sopenharmony_ci	{"IF1 DAC1 L", NULL, "AIF1RX"},
199662306a36Sopenharmony_ci	{"IF1 DAC1 L", NULL, "I2S1"},
199762306a36Sopenharmony_ci	{"IF1 DAC1 L", NULL, "DAC Stereo1 Filter"},
199862306a36Sopenharmony_ci	{"IF1 DAC1 R", NULL, "AIF1RX"},
199962306a36Sopenharmony_ci	{"IF1 DAC1 R", NULL, "I2S1"},
200062306a36Sopenharmony_ci	{"IF1 DAC1 R", NULL, "DAC Stereo1 Filter"},
200162306a36Sopenharmony_ci
200262306a36Sopenharmony_ci	{"SOUND DAC L", NULL, "SDWRX"},
200362306a36Sopenharmony_ci	{"SOUND DAC L", NULL, "DAC Stereo1 Filter"},
200462306a36Sopenharmony_ci	{"SOUND DAC L", NULL, "PLL2B"},
200562306a36Sopenharmony_ci	{"SOUND DAC L", NULL, "PLL2F"},
200662306a36Sopenharmony_ci	{"SOUND DAC R", NULL, "SDWRX"},
200762306a36Sopenharmony_ci	{"SOUND DAC R", NULL, "DAC Stereo1 Filter"},
200862306a36Sopenharmony_ci	{"SOUND DAC R", NULL, "PLL2B"},
200962306a36Sopenharmony_ci	{"SOUND DAC R", NULL, "PLL2F"},
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_ci	{"DAC L Mux", "IF1", "IF1 DAC1 L"},
201262306a36Sopenharmony_ci	{"DAC L Mux", "SOUND", "SOUND DAC L"},
201362306a36Sopenharmony_ci	{"DAC R Mux", "IF1", "IF1 DAC1 R"},
201462306a36Sopenharmony_ci	{"DAC R Mux", "SOUND", "SOUND DAC R"},
201562306a36Sopenharmony_ci
201662306a36Sopenharmony_ci	{"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},
201762306a36Sopenharmony_ci	{"DAC1 MIXL", "DAC1 Switch", "DAC L Mux"},
201862306a36Sopenharmony_ci	{"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},
201962306a36Sopenharmony_ci	{"DAC1 MIXR", "DAC1 Switch", "DAC R Mux"},
202062306a36Sopenharmony_ci
202162306a36Sopenharmony_ci	{"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
202262306a36Sopenharmony_ci	{"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},
202362306a36Sopenharmony_ci
202462306a36Sopenharmony_ci	{"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
202562306a36Sopenharmony_ci	{"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},
202662306a36Sopenharmony_ci
202762306a36Sopenharmony_ci	{"DAC L1 Source", "DAC1", "DAC1 MIXL"},
202862306a36Sopenharmony_ci	{"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},
202962306a36Sopenharmony_ci	{"DAC R1 Source", "DAC1", "DAC1 MIXR"},
203062306a36Sopenharmony_ci	{"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},
203162306a36Sopenharmony_ci
203262306a36Sopenharmony_ci	{"DAC L1", NULL, "DAC L1 Source"},
203362306a36Sopenharmony_ci	{"DAC R1", NULL, "DAC R1 Source"},
203462306a36Sopenharmony_ci
203562306a36Sopenharmony_ci	{"DAC L1", NULL, "DAC 1 Clock"},
203662306a36Sopenharmony_ci	{"DAC R1", NULL, "DAC 1 Clock"},
203762306a36Sopenharmony_ci
203862306a36Sopenharmony_ci	{"HP Amp", NULL, "DAC L1"},
203962306a36Sopenharmony_ci	{"HP Amp", NULL, "DAC R1"},
204062306a36Sopenharmony_ci	{"HP Amp", NULL, "HP Amp L"},
204162306a36Sopenharmony_ci	{"HP Amp", NULL, "HP Amp R"},
204262306a36Sopenharmony_ci	{"HP Amp", NULL, "Capless"},
204362306a36Sopenharmony_ci	{"HP Amp", NULL, "Charge Pump"},
204462306a36Sopenharmony_ci	{"HP Amp", NULL, "CLKDET SYS"},
204562306a36Sopenharmony_ci	{"HP Amp", NULL, "Vref1"},
204662306a36Sopenharmony_ci
204762306a36Sopenharmony_ci	{"HPO Signal Demux", NULL, "HP Amp"},
204862306a36Sopenharmony_ci
204962306a36Sopenharmony_ci	{"HPO Legacy", "Legacy", "HPO Signal Demux"},
205062306a36Sopenharmony_ci	{"HPO OneBit", "OneBit", "HPO Signal Demux"},
205162306a36Sopenharmony_ci
205262306a36Sopenharmony_ci	{"HPOL Playback", "Switch", "HPO Legacy"},
205362306a36Sopenharmony_ci	{"HPOR Playback", "Switch", "HPO Legacy"},
205462306a36Sopenharmony_ci
205562306a36Sopenharmony_ci	{"HPOL", NULL, "HPOL Playback"},
205662306a36Sopenharmony_ci	{"HPOR", NULL, "HPOR Playback"},
205762306a36Sopenharmony_ci	{"HPOL", NULL, "HPO OneBit"},
205862306a36Sopenharmony_ci	{"HPOR", NULL, "HPO OneBit"},
205962306a36Sopenharmony_ci};
206062306a36Sopenharmony_ci
206162306a36Sopenharmony_cistatic int rt5682_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
206262306a36Sopenharmony_ci		unsigned int rx_mask, int slots, int slot_width)
206362306a36Sopenharmony_ci{
206462306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
206562306a36Sopenharmony_ci	unsigned int cl, val = 0;
206662306a36Sopenharmony_ci
206762306a36Sopenharmony_ci	if (tx_mask || rx_mask)
206862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2,
206962306a36Sopenharmony_ci			RT5682_TDM_EN, RT5682_TDM_EN);
207062306a36Sopenharmony_ci	else
207162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2,
207262306a36Sopenharmony_ci			RT5682_TDM_EN, 0);
207362306a36Sopenharmony_ci
207462306a36Sopenharmony_ci	switch (slots) {
207562306a36Sopenharmony_ci	case 4:
207662306a36Sopenharmony_ci		val |= RT5682_TDM_TX_CH_4;
207762306a36Sopenharmony_ci		val |= RT5682_TDM_RX_CH_4;
207862306a36Sopenharmony_ci		break;
207962306a36Sopenharmony_ci	case 6:
208062306a36Sopenharmony_ci		val |= RT5682_TDM_TX_CH_6;
208162306a36Sopenharmony_ci		val |= RT5682_TDM_RX_CH_6;
208262306a36Sopenharmony_ci		break;
208362306a36Sopenharmony_ci	case 8:
208462306a36Sopenharmony_ci		val |= RT5682_TDM_TX_CH_8;
208562306a36Sopenharmony_ci		val |= RT5682_TDM_RX_CH_8;
208662306a36Sopenharmony_ci		break;
208762306a36Sopenharmony_ci	case 2:
208862306a36Sopenharmony_ci		break;
208962306a36Sopenharmony_ci	default:
209062306a36Sopenharmony_ci		return -EINVAL;
209162306a36Sopenharmony_ci	}
209262306a36Sopenharmony_ci
209362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_TDM_CTRL,
209462306a36Sopenharmony_ci		RT5682_TDM_TX_CH_MASK | RT5682_TDM_RX_CH_MASK, val);
209562306a36Sopenharmony_ci
209662306a36Sopenharmony_ci	switch (slot_width) {
209762306a36Sopenharmony_ci	case 8:
209862306a36Sopenharmony_ci		if (tx_mask || rx_mask)
209962306a36Sopenharmony_ci			return -EINVAL;
210062306a36Sopenharmony_ci		cl = RT5682_I2S1_TX_CHL_8 | RT5682_I2S1_RX_CHL_8;
210162306a36Sopenharmony_ci		break;
210262306a36Sopenharmony_ci	case 16:
210362306a36Sopenharmony_ci		val = RT5682_TDM_CL_16;
210462306a36Sopenharmony_ci		cl = RT5682_I2S1_TX_CHL_16 | RT5682_I2S1_RX_CHL_16;
210562306a36Sopenharmony_ci		break;
210662306a36Sopenharmony_ci	case 20:
210762306a36Sopenharmony_ci		val = RT5682_TDM_CL_20;
210862306a36Sopenharmony_ci		cl = RT5682_I2S1_TX_CHL_20 | RT5682_I2S1_RX_CHL_20;
210962306a36Sopenharmony_ci		break;
211062306a36Sopenharmony_ci	case 24:
211162306a36Sopenharmony_ci		val = RT5682_TDM_CL_24;
211262306a36Sopenharmony_ci		cl = RT5682_I2S1_TX_CHL_24 | RT5682_I2S1_RX_CHL_24;
211362306a36Sopenharmony_ci		break;
211462306a36Sopenharmony_ci	case 32:
211562306a36Sopenharmony_ci		val = RT5682_TDM_CL_32;
211662306a36Sopenharmony_ci		cl = RT5682_I2S1_TX_CHL_32 | RT5682_I2S1_RX_CHL_32;
211762306a36Sopenharmony_ci		break;
211862306a36Sopenharmony_ci	default:
211962306a36Sopenharmony_ci		return -EINVAL;
212062306a36Sopenharmony_ci	}
212162306a36Sopenharmony_ci
212262306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
212362306a36Sopenharmony_ci		RT5682_TDM_CL_MASK, val);
212462306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
212562306a36Sopenharmony_ci		RT5682_I2S1_TX_CHL_MASK | RT5682_I2S1_RX_CHL_MASK, cl);
212662306a36Sopenharmony_ci
212762306a36Sopenharmony_ci	return 0;
212862306a36Sopenharmony_ci}
212962306a36Sopenharmony_ci
213062306a36Sopenharmony_cistatic int rt5682_hw_params(struct snd_pcm_substream *substream,
213162306a36Sopenharmony_ci		struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
213262306a36Sopenharmony_ci{
213362306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
213462306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
213562306a36Sopenharmony_ci	unsigned int len_1 = 0, len_2 = 0;
213662306a36Sopenharmony_ci	int pre_div, frame_size;
213762306a36Sopenharmony_ci
213862306a36Sopenharmony_ci	rt5682->lrck[dai->id] = params_rate(params);
213962306a36Sopenharmony_ci	pre_div = rl6231_get_clk_info(rt5682->sysclk, rt5682->lrck[dai->id]);
214062306a36Sopenharmony_ci
214162306a36Sopenharmony_ci	frame_size = snd_soc_params_to_frame_size(params);
214262306a36Sopenharmony_ci	if (frame_size < 0) {
214362306a36Sopenharmony_ci		dev_err(component->dev, "Unsupported frame size: %d\n",
214462306a36Sopenharmony_ci			frame_size);
214562306a36Sopenharmony_ci		return -EINVAL;
214662306a36Sopenharmony_ci	}
214762306a36Sopenharmony_ci
214862306a36Sopenharmony_ci	dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n",
214962306a36Sopenharmony_ci		rt5682->lrck[dai->id], pre_div, dai->id);
215062306a36Sopenharmony_ci
215162306a36Sopenharmony_ci	switch (params_width(params)) {
215262306a36Sopenharmony_ci	case 16:
215362306a36Sopenharmony_ci		break;
215462306a36Sopenharmony_ci	case 20:
215562306a36Sopenharmony_ci		len_1 |= RT5682_I2S1_DL_20;
215662306a36Sopenharmony_ci		len_2 |= RT5682_I2S2_DL_20;
215762306a36Sopenharmony_ci		break;
215862306a36Sopenharmony_ci	case 24:
215962306a36Sopenharmony_ci		len_1 |= RT5682_I2S1_DL_24;
216062306a36Sopenharmony_ci		len_2 |= RT5682_I2S2_DL_24;
216162306a36Sopenharmony_ci		break;
216262306a36Sopenharmony_ci	case 32:
216362306a36Sopenharmony_ci		len_1 |= RT5682_I2S1_DL_32;
216462306a36Sopenharmony_ci		len_2 |= RT5682_I2S2_DL_24;
216562306a36Sopenharmony_ci		break;
216662306a36Sopenharmony_ci	case 8:
216762306a36Sopenharmony_ci		len_1 |= RT5682_I2S2_DL_8;
216862306a36Sopenharmony_ci		len_2 |= RT5682_I2S2_DL_8;
216962306a36Sopenharmony_ci		break;
217062306a36Sopenharmony_ci	default:
217162306a36Sopenharmony_ci		return -EINVAL;
217262306a36Sopenharmony_ci	}
217362306a36Sopenharmony_ci
217462306a36Sopenharmony_ci	switch (dai->id) {
217562306a36Sopenharmony_ci	case RT5682_AIF1:
217662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
217762306a36Sopenharmony_ci			RT5682_I2S1_DL_MASK, len_1);
217862306a36Sopenharmony_ci		if (rt5682->master[RT5682_AIF1]) {
217962306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
218062306a36Sopenharmony_ci				RT5682_ADDA_CLK_1, RT5682_I2S_M_DIV_MASK |
218162306a36Sopenharmony_ci				RT5682_I2S_CLK_SRC_MASK,
218262306a36Sopenharmony_ci				pre_div << RT5682_I2S_M_DIV_SFT |
218362306a36Sopenharmony_ci				(rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT);
218462306a36Sopenharmony_ci		}
218562306a36Sopenharmony_ci		if (params_channels(params) == 1) /* mono mode */
218662306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
218762306a36Sopenharmony_ci				RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK,
218862306a36Sopenharmony_ci				RT5682_I2S1_MONO_EN);
218962306a36Sopenharmony_ci		else
219062306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
219162306a36Sopenharmony_ci				RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK,
219262306a36Sopenharmony_ci				RT5682_I2S1_MONO_DIS);
219362306a36Sopenharmony_ci		break;
219462306a36Sopenharmony_ci	case RT5682_AIF2:
219562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_I2S2_SDP,
219662306a36Sopenharmony_ci			RT5682_I2S2_DL_MASK, len_2);
219762306a36Sopenharmony_ci		if (rt5682->master[RT5682_AIF2]) {
219862306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
219962306a36Sopenharmony_ci				RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_M_PD_MASK,
220062306a36Sopenharmony_ci				pre_div << RT5682_I2S2_M_PD_SFT);
220162306a36Sopenharmony_ci		}
220262306a36Sopenharmony_ci		if (params_channels(params) == 1) /* mono mode */
220362306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
220462306a36Sopenharmony_ci				RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK,
220562306a36Sopenharmony_ci				RT5682_I2S2_MONO_EN);
220662306a36Sopenharmony_ci		else
220762306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
220862306a36Sopenharmony_ci				RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK,
220962306a36Sopenharmony_ci				RT5682_I2S2_MONO_DIS);
221062306a36Sopenharmony_ci		break;
221162306a36Sopenharmony_ci	default:
221262306a36Sopenharmony_ci		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
221362306a36Sopenharmony_ci		return -EINVAL;
221462306a36Sopenharmony_ci	}
221562306a36Sopenharmony_ci
221662306a36Sopenharmony_ci	return 0;
221762306a36Sopenharmony_ci}
221862306a36Sopenharmony_ci
221962306a36Sopenharmony_cistatic int rt5682_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
222062306a36Sopenharmony_ci{
222162306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
222262306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
222362306a36Sopenharmony_ci	unsigned int reg_val = 0, tdm_ctrl = 0;
222462306a36Sopenharmony_ci
222562306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
222662306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBM_CFM:
222762306a36Sopenharmony_ci		rt5682->master[dai->id] = 1;
222862306a36Sopenharmony_ci		break;
222962306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBS_CFS:
223062306a36Sopenharmony_ci		rt5682->master[dai->id] = 0;
223162306a36Sopenharmony_ci		break;
223262306a36Sopenharmony_ci	default:
223362306a36Sopenharmony_ci		return -EINVAL;
223462306a36Sopenharmony_ci	}
223562306a36Sopenharmony_ci
223662306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
223762306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_NF:
223862306a36Sopenharmony_ci		break;
223962306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_NF:
224062306a36Sopenharmony_ci		reg_val |= RT5682_I2S_BP_INV;
224162306a36Sopenharmony_ci		tdm_ctrl |= RT5682_TDM_S_BP_INV;
224262306a36Sopenharmony_ci		break;
224362306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_IF:
224462306a36Sopenharmony_ci		if (dai->id == RT5682_AIF1)
224562306a36Sopenharmony_ci			tdm_ctrl |= RT5682_TDM_S_LP_INV | RT5682_TDM_M_BP_INV;
224662306a36Sopenharmony_ci		else
224762306a36Sopenharmony_ci			return -EINVAL;
224862306a36Sopenharmony_ci		break;
224962306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_IF:
225062306a36Sopenharmony_ci		if (dai->id == RT5682_AIF1)
225162306a36Sopenharmony_ci			tdm_ctrl |= RT5682_TDM_S_BP_INV | RT5682_TDM_S_LP_INV |
225262306a36Sopenharmony_ci				    RT5682_TDM_M_BP_INV | RT5682_TDM_M_LP_INV;
225362306a36Sopenharmony_ci		else
225462306a36Sopenharmony_ci			return -EINVAL;
225562306a36Sopenharmony_ci		break;
225662306a36Sopenharmony_ci	default:
225762306a36Sopenharmony_ci		return -EINVAL;
225862306a36Sopenharmony_ci	}
225962306a36Sopenharmony_ci
226062306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
226162306a36Sopenharmony_ci	case SND_SOC_DAIFMT_I2S:
226262306a36Sopenharmony_ci		break;
226362306a36Sopenharmony_ci	case SND_SOC_DAIFMT_LEFT_J:
226462306a36Sopenharmony_ci		reg_val |= RT5682_I2S_DF_LEFT;
226562306a36Sopenharmony_ci		tdm_ctrl |= RT5682_TDM_DF_LEFT;
226662306a36Sopenharmony_ci		break;
226762306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_A:
226862306a36Sopenharmony_ci		reg_val |= RT5682_I2S_DF_PCM_A;
226962306a36Sopenharmony_ci		tdm_ctrl |= RT5682_TDM_DF_PCM_A;
227062306a36Sopenharmony_ci		break;
227162306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_B:
227262306a36Sopenharmony_ci		reg_val |= RT5682_I2S_DF_PCM_B;
227362306a36Sopenharmony_ci		tdm_ctrl |= RT5682_TDM_DF_PCM_B;
227462306a36Sopenharmony_ci		break;
227562306a36Sopenharmony_ci	default:
227662306a36Sopenharmony_ci		return -EINVAL;
227762306a36Sopenharmony_ci	}
227862306a36Sopenharmony_ci
227962306a36Sopenharmony_ci	switch (dai->id) {
228062306a36Sopenharmony_ci	case RT5682_AIF1:
228162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_I2S1_SDP,
228262306a36Sopenharmony_ci			RT5682_I2S_DF_MASK, reg_val);
228362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
228462306a36Sopenharmony_ci			RT5682_TDM_MS_MASK | RT5682_TDM_S_BP_MASK |
228562306a36Sopenharmony_ci			RT5682_TDM_DF_MASK | RT5682_TDM_M_BP_MASK |
228662306a36Sopenharmony_ci			RT5682_TDM_M_LP_MASK | RT5682_TDM_S_LP_MASK,
228762306a36Sopenharmony_ci			tdm_ctrl | rt5682->master[dai->id]);
228862306a36Sopenharmony_ci		break;
228962306a36Sopenharmony_ci	case RT5682_AIF2:
229062306a36Sopenharmony_ci		if (rt5682->master[dai->id] == 0)
229162306a36Sopenharmony_ci			reg_val |= RT5682_I2S2_MS_S;
229262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_I2S2_SDP,
229362306a36Sopenharmony_ci			RT5682_I2S2_MS_MASK | RT5682_I2S_BP_MASK |
229462306a36Sopenharmony_ci			RT5682_I2S_DF_MASK, reg_val);
229562306a36Sopenharmony_ci		break;
229662306a36Sopenharmony_ci	default:
229762306a36Sopenharmony_ci		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
229862306a36Sopenharmony_ci		return -EINVAL;
229962306a36Sopenharmony_ci	}
230062306a36Sopenharmony_ci	return 0;
230162306a36Sopenharmony_ci}
230262306a36Sopenharmony_ci
230362306a36Sopenharmony_cistatic int rt5682_set_component_sysclk(struct snd_soc_component *component,
230462306a36Sopenharmony_ci		int clk_id, int source, unsigned int freq, int dir)
230562306a36Sopenharmony_ci{
230662306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
230762306a36Sopenharmony_ci	unsigned int reg_val = 0, src = 0;
230862306a36Sopenharmony_ci
230962306a36Sopenharmony_ci	if (freq == rt5682->sysclk && clk_id == rt5682->sysclk_src)
231062306a36Sopenharmony_ci		return 0;
231162306a36Sopenharmony_ci
231262306a36Sopenharmony_ci	switch (clk_id) {
231362306a36Sopenharmony_ci	case RT5682_SCLK_S_MCLK:
231462306a36Sopenharmony_ci		reg_val |= RT5682_SCLK_SRC_MCLK;
231562306a36Sopenharmony_ci		src = RT5682_CLK_SRC_MCLK;
231662306a36Sopenharmony_ci		break;
231762306a36Sopenharmony_ci	case RT5682_SCLK_S_PLL1:
231862306a36Sopenharmony_ci		reg_val |= RT5682_SCLK_SRC_PLL1;
231962306a36Sopenharmony_ci		src = RT5682_CLK_SRC_PLL1;
232062306a36Sopenharmony_ci		break;
232162306a36Sopenharmony_ci	case RT5682_SCLK_S_PLL2:
232262306a36Sopenharmony_ci		reg_val |= RT5682_SCLK_SRC_PLL2;
232362306a36Sopenharmony_ci		src = RT5682_CLK_SRC_PLL2;
232462306a36Sopenharmony_ci		break;
232562306a36Sopenharmony_ci	case RT5682_SCLK_S_RCCLK:
232662306a36Sopenharmony_ci		reg_val |= RT5682_SCLK_SRC_RCCLK;
232762306a36Sopenharmony_ci		src = RT5682_CLK_SRC_RCCLK;
232862306a36Sopenharmony_ci		break;
232962306a36Sopenharmony_ci	default:
233062306a36Sopenharmony_ci		dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
233162306a36Sopenharmony_ci		return -EINVAL;
233262306a36Sopenharmony_ci	}
233362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_GLB_CLK,
233462306a36Sopenharmony_ci		RT5682_SCLK_SRC_MASK, reg_val);
233562306a36Sopenharmony_ci
233662306a36Sopenharmony_ci	if (rt5682->master[RT5682_AIF2]) {
233762306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
233862306a36Sopenharmony_ci			RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_SRC_MASK,
233962306a36Sopenharmony_ci			src << RT5682_I2S2_SRC_SFT);
234062306a36Sopenharmony_ci	}
234162306a36Sopenharmony_ci
234262306a36Sopenharmony_ci	rt5682->sysclk = freq;
234362306a36Sopenharmony_ci	rt5682->sysclk_src = clk_id;
234462306a36Sopenharmony_ci
234562306a36Sopenharmony_ci	dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n",
234662306a36Sopenharmony_ci		freq, clk_id);
234762306a36Sopenharmony_ci
234862306a36Sopenharmony_ci	return 0;
234962306a36Sopenharmony_ci}
235062306a36Sopenharmony_ci
235162306a36Sopenharmony_cistatic int rt5682_set_component_pll(struct snd_soc_component *component,
235262306a36Sopenharmony_ci		int pll_id, int source, unsigned int freq_in,
235362306a36Sopenharmony_ci		unsigned int freq_out)
235462306a36Sopenharmony_ci{
235562306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
235662306a36Sopenharmony_ci	struct rl6231_pll_code pll_code, pll2f_code, pll2b_code;
235762306a36Sopenharmony_ci	unsigned int pll2_fout1, pll2_ps_val;
235862306a36Sopenharmony_ci	int ret;
235962306a36Sopenharmony_ci
236062306a36Sopenharmony_ci	if (source == rt5682->pll_src[pll_id] &&
236162306a36Sopenharmony_ci	    freq_in == rt5682->pll_in[pll_id] &&
236262306a36Sopenharmony_ci	    freq_out == rt5682->pll_out[pll_id])
236362306a36Sopenharmony_ci		return 0;
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_ci	if (!freq_in || !freq_out) {
236662306a36Sopenharmony_ci		dev_dbg(component->dev, "PLL disabled\n");
236762306a36Sopenharmony_ci
236862306a36Sopenharmony_ci		rt5682->pll_in[pll_id] = 0;
236962306a36Sopenharmony_ci		rt5682->pll_out[pll_id] = 0;
237062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_GLB_CLK,
237162306a36Sopenharmony_ci			RT5682_SCLK_SRC_MASK, RT5682_SCLK_SRC_MCLK);
237262306a36Sopenharmony_ci		return 0;
237362306a36Sopenharmony_ci	}
237462306a36Sopenharmony_ci
237562306a36Sopenharmony_ci	if (pll_id == RT5682_PLL2) {
237662306a36Sopenharmony_ci		switch (source) {
237762306a36Sopenharmony_ci		case RT5682_PLL2_S_MCLK:
237862306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
237962306a36Sopenharmony_ci				RT5682_GLB_CLK, RT5682_PLL2_SRC_MASK,
238062306a36Sopenharmony_ci				RT5682_PLL2_SRC_MCLK);
238162306a36Sopenharmony_ci			break;
238262306a36Sopenharmony_ci		default:
238362306a36Sopenharmony_ci			dev_err(component->dev, "Unknown PLL2 Source %d\n",
238462306a36Sopenharmony_ci				source);
238562306a36Sopenharmony_ci			return -EINVAL;
238662306a36Sopenharmony_ci		}
238762306a36Sopenharmony_ci
238862306a36Sopenharmony_ci		/**
238962306a36Sopenharmony_ci		 * PLL2 concatenates 2 PLL units.
239062306a36Sopenharmony_ci		 * We suggest the Fout of the front PLL is 3.84MHz.
239162306a36Sopenharmony_ci		 */
239262306a36Sopenharmony_ci		pll2_fout1 = 3840000;
239362306a36Sopenharmony_ci		ret = rl6231_pll_calc(freq_in, pll2_fout1, &pll2f_code);
239462306a36Sopenharmony_ci		if (ret < 0) {
239562306a36Sopenharmony_ci			dev_err(component->dev, "Unsupported input clock %d\n",
239662306a36Sopenharmony_ci				freq_in);
239762306a36Sopenharmony_ci			return ret;
239862306a36Sopenharmony_ci		}
239962306a36Sopenharmony_ci		dev_dbg(component->dev, "PLL2F: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n",
240062306a36Sopenharmony_ci			freq_in, pll2_fout1,
240162306a36Sopenharmony_ci			pll2f_code.m_bp,
240262306a36Sopenharmony_ci			(pll2f_code.m_bp ? 0 : pll2f_code.m_code),
240362306a36Sopenharmony_ci			pll2f_code.n_code, pll2f_code.k_code);
240462306a36Sopenharmony_ci
240562306a36Sopenharmony_ci		ret = rl6231_pll_calc(pll2_fout1, freq_out, &pll2b_code);
240662306a36Sopenharmony_ci		if (ret < 0) {
240762306a36Sopenharmony_ci			dev_err(component->dev, "Unsupported input clock %d\n",
240862306a36Sopenharmony_ci				pll2_fout1);
240962306a36Sopenharmony_ci			return ret;
241062306a36Sopenharmony_ci		}
241162306a36Sopenharmony_ci		dev_dbg(component->dev, "PLL2B: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n",
241262306a36Sopenharmony_ci			pll2_fout1, freq_out,
241362306a36Sopenharmony_ci			pll2b_code.m_bp,
241462306a36Sopenharmony_ci			(pll2b_code.m_bp ? 0 : pll2b_code.m_code),
241562306a36Sopenharmony_ci			pll2b_code.n_code, pll2b_code.k_code);
241662306a36Sopenharmony_ci
241762306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682_PLL2_CTRL_1,
241862306a36Sopenharmony_ci			pll2f_code.k_code << RT5682_PLL2F_K_SFT |
241962306a36Sopenharmony_ci			pll2b_code.k_code << RT5682_PLL2B_K_SFT |
242062306a36Sopenharmony_ci			pll2b_code.m_code);
242162306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682_PLL2_CTRL_2,
242262306a36Sopenharmony_ci			pll2f_code.m_code << RT5682_PLL2F_M_SFT |
242362306a36Sopenharmony_ci			pll2b_code.n_code);
242462306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682_PLL2_CTRL_3,
242562306a36Sopenharmony_ci			pll2f_code.n_code << RT5682_PLL2F_N_SFT);
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_ci		if (freq_out == 22579200)
242862306a36Sopenharmony_ci			pll2_ps_val = 1 << RT5682_PLL2B_SEL_PS_SFT;
242962306a36Sopenharmony_ci		else
243062306a36Sopenharmony_ci			pll2_ps_val = 1 << RT5682_PLL2B_PS_BYP_SFT;
243162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_PLL2_CTRL_4,
243262306a36Sopenharmony_ci			RT5682_PLL2B_SEL_PS_MASK | RT5682_PLL2B_PS_BYP_MASK |
243362306a36Sopenharmony_ci			RT5682_PLL2B_M_BP_MASK | RT5682_PLL2F_M_BP_MASK | 0xf,
243462306a36Sopenharmony_ci			pll2_ps_val |
243562306a36Sopenharmony_ci			(pll2b_code.m_bp ? 1 : 0) << RT5682_PLL2B_M_BP_SFT |
243662306a36Sopenharmony_ci			(pll2f_code.m_bp ? 1 : 0) << RT5682_PLL2F_M_BP_SFT |
243762306a36Sopenharmony_ci			0xf);
243862306a36Sopenharmony_ci	} else {
243962306a36Sopenharmony_ci		switch (source) {
244062306a36Sopenharmony_ci		case RT5682_PLL1_S_MCLK:
244162306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
244262306a36Sopenharmony_ci				RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK,
244362306a36Sopenharmony_ci				RT5682_PLL1_SRC_MCLK);
244462306a36Sopenharmony_ci			break;
244562306a36Sopenharmony_ci		case RT5682_PLL1_S_BCLK1:
244662306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
244762306a36Sopenharmony_ci				RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK,
244862306a36Sopenharmony_ci				RT5682_PLL1_SRC_BCLK1);
244962306a36Sopenharmony_ci			break;
245062306a36Sopenharmony_ci		default:
245162306a36Sopenharmony_ci			dev_err(component->dev, "Unknown PLL1 Source %d\n",
245262306a36Sopenharmony_ci				source);
245362306a36Sopenharmony_ci			return -EINVAL;
245462306a36Sopenharmony_ci		}
245562306a36Sopenharmony_ci
245662306a36Sopenharmony_ci		ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
245762306a36Sopenharmony_ci		if (ret < 0) {
245862306a36Sopenharmony_ci			dev_err(component->dev, "Unsupported input clock %d\n",
245962306a36Sopenharmony_ci				freq_in);
246062306a36Sopenharmony_ci			return ret;
246162306a36Sopenharmony_ci		}
246262306a36Sopenharmony_ci
246362306a36Sopenharmony_ci		dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n",
246462306a36Sopenharmony_ci			pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
246562306a36Sopenharmony_ci			pll_code.n_code, pll_code.k_code);
246662306a36Sopenharmony_ci
246762306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682_PLL_CTRL_1,
246862306a36Sopenharmony_ci			(pll_code.n_code << RT5682_PLL_N_SFT) | pll_code.k_code);
246962306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682_PLL_CTRL_2,
247062306a36Sopenharmony_ci			((pll_code.m_bp ? 0 : pll_code.m_code) << RT5682_PLL_M_SFT) |
247162306a36Sopenharmony_ci			((pll_code.m_bp << RT5682_PLL_M_BP_SFT) | RT5682_PLL_RST));
247262306a36Sopenharmony_ci	}
247362306a36Sopenharmony_ci
247462306a36Sopenharmony_ci	rt5682->pll_in[pll_id] = freq_in;
247562306a36Sopenharmony_ci	rt5682->pll_out[pll_id] = freq_out;
247662306a36Sopenharmony_ci	rt5682->pll_src[pll_id] = source;
247762306a36Sopenharmony_ci
247862306a36Sopenharmony_ci	return 0;
247962306a36Sopenharmony_ci}
248062306a36Sopenharmony_ci
248162306a36Sopenharmony_cistatic int rt5682_set_bclk1_ratio(struct snd_soc_dai *dai, unsigned int ratio)
248262306a36Sopenharmony_ci{
248362306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
248462306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
248562306a36Sopenharmony_ci
248662306a36Sopenharmony_ci	rt5682->bclk[dai->id] = ratio;
248762306a36Sopenharmony_ci
248862306a36Sopenharmony_ci	switch (ratio) {
248962306a36Sopenharmony_ci	case 256:
249062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
249162306a36Sopenharmony_ci			RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_256);
249262306a36Sopenharmony_ci		break;
249362306a36Sopenharmony_ci	case 128:
249462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
249562306a36Sopenharmony_ci			RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_128);
249662306a36Sopenharmony_ci		break;
249762306a36Sopenharmony_ci	case 64:
249862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
249962306a36Sopenharmony_ci			RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_64);
250062306a36Sopenharmony_ci		break;
250162306a36Sopenharmony_ci	case 32:
250262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL,
250362306a36Sopenharmony_ci			RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_32);
250462306a36Sopenharmony_ci		break;
250562306a36Sopenharmony_ci	default:
250662306a36Sopenharmony_ci		dev_err(dai->dev, "Invalid bclk1 ratio %d\n", ratio);
250762306a36Sopenharmony_ci		return -EINVAL;
250862306a36Sopenharmony_ci	}
250962306a36Sopenharmony_ci
251062306a36Sopenharmony_ci	return 0;
251162306a36Sopenharmony_ci}
251262306a36Sopenharmony_ci
251362306a36Sopenharmony_cistatic int rt5682_set_bclk2_ratio(struct snd_soc_dai *dai, unsigned int ratio)
251462306a36Sopenharmony_ci{
251562306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
251662306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
251762306a36Sopenharmony_ci
251862306a36Sopenharmony_ci	rt5682->bclk[dai->id] = ratio;
251962306a36Sopenharmony_ci
252062306a36Sopenharmony_ci	switch (ratio) {
252162306a36Sopenharmony_ci	case 64:
252262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2,
252362306a36Sopenharmony_ci			RT5682_I2S2_BCLK_MS2_MASK,
252462306a36Sopenharmony_ci			RT5682_I2S2_BCLK_MS2_64);
252562306a36Sopenharmony_ci		break;
252662306a36Sopenharmony_ci	case 32:
252762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2,
252862306a36Sopenharmony_ci			RT5682_I2S2_BCLK_MS2_MASK,
252962306a36Sopenharmony_ci			RT5682_I2S2_BCLK_MS2_32);
253062306a36Sopenharmony_ci		break;
253162306a36Sopenharmony_ci	default:
253262306a36Sopenharmony_ci		dev_err(dai->dev, "Invalid bclk2 ratio %d\n", ratio);
253362306a36Sopenharmony_ci		return -EINVAL;
253462306a36Sopenharmony_ci	}
253562306a36Sopenharmony_ci
253662306a36Sopenharmony_ci	return 0;
253762306a36Sopenharmony_ci}
253862306a36Sopenharmony_ci
253962306a36Sopenharmony_cistatic int rt5682_set_bias_level(struct snd_soc_component *component,
254062306a36Sopenharmony_ci		enum snd_soc_bias_level level)
254162306a36Sopenharmony_ci{
254262306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
254362306a36Sopenharmony_ci
254462306a36Sopenharmony_ci	switch (level) {
254562306a36Sopenharmony_ci	case SND_SOC_BIAS_PREPARE:
254662306a36Sopenharmony_ci		regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
254762306a36Sopenharmony_ci			RT5682_PWR_BG, RT5682_PWR_BG);
254862306a36Sopenharmony_ci		regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
254962306a36Sopenharmony_ci			RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO,
255062306a36Sopenharmony_ci			RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO);
255162306a36Sopenharmony_ci		break;
255262306a36Sopenharmony_ci
255362306a36Sopenharmony_ci	case SND_SOC_BIAS_STANDBY:
255462306a36Sopenharmony_ci		regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
255562306a36Sopenharmony_ci			RT5682_DIG_GATE_CTRL, RT5682_DIG_GATE_CTRL);
255662306a36Sopenharmony_ci		break;
255762306a36Sopenharmony_ci	case SND_SOC_BIAS_OFF:
255862306a36Sopenharmony_ci		regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
255962306a36Sopenharmony_ci			RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 0);
256062306a36Sopenharmony_ci		regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
256162306a36Sopenharmony_ci			RT5682_PWR_BG, 0);
256262306a36Sopenharmony_ci		break;
256362306a36Sopenharmony_ci	case SND_SOC_BIAS_ON:
256462306a36Sopenharmony_ci		break;
256562306a36Sopenharmony_ci	}
256662306a36Sopenharmony_ci
256762306a36Sopenharmony_ci	return 0;
256862306a36Sopenharmony_ci}
256962306a36Sopenharmony_ci
257062306a36Sopenharmony_ci#ifdef CONFIG_COMMON_CLK
257162306a36Sopenharmony_ci#define CLK_PLL2_FIN 48000000
257262306a36Sopenharmony_ci#define CLK_48 48000
257362306a36Sopenharmony_ci#define CLK_44 44100
257462306a36Sopenharmony_ci
257562306a36Sopenharmony_cistatic bool rt5682_clk_check(struct rt5682_priv *rt5682)
257662306a36Sopenharmony_ci{
257762306a36Sopenharmony_ci	if (!rt5682->master[RT5682_AIF1]) {
257862306a36Sopenharmony_ci		dev_dbg(rt5682->i2c_dev, "sysclk/dai not set correctly\n");
257962306a36Sopenharmony_ci		return false;
258062306a36Sopenharmony_ci	}
258162306a36Sopenharmony_ci	return true;
258262306a36Sopenharmony_ci}
258362306a36Sopenharmony_ci
258462306a36Sopenharmony_cistatic int rt5682_wclk_prepare(struct clk_hw *hw)
258562306a36Sopenharmony_ci{
258662306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
258762306a36Sopenharmony_ci		container_of(hw, struct rt5682_priv,
258862306a36Sopenharmony_ci			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
258962306a36Sopenharmony_ci	struct snd_soc_component *component;
259062306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm;
259162306a36Sopenharmony_ci
259262306a36Sopenharmony_ci	if (!rt5682_clk_check(rt5682))
259362306a36Sopenharmony_ci		return -EINVAL;
259462306a36Sopenharmony_ci
259562306a36Sopenharmony_ci	component = rt5682->component;
259662306a36Sopenharmony_ci	dapm = snd_soc_component_get_dapm(component);
259762306a36Sopenharmony_ci
259862306a36Sopenharmony_ci	snd_soc_dapm_mutex_lock(dapm);
259962306a36Sopenharmony_ci
260062306a36Sopenharmony_ci	snd_soc_dapm_force_enable_pin_unlocked(dapm, "MICBIAS");
260162306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
260262306a36Sopenharmony_ci				RT5682_PWR_MB, RT5682_PWR_MB);
260362306a36Sopenharmony_ci
260462306a36Sopenharmony_ci	snd_soc_dapm_force_enable_pin_unlocked(dapm, "Vref2");
260562306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
260662306a36Sopenharmony_ci			RT5682_PWR_VREF2 | RT5682_PWR_FV2,
260762306a36Sopenharmony_ci			RT5682_PWR_VREF2);
260862306a36Sopenharmony_ci	usleep_range(55000, 60000);
260962306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
261062306a36Sopenharmony_ci			RT5682_PWR_FV2, RT5682_PWR_FV2);
261162306a36Sopenharmony_ci
261262306a36Sopenharmony_ci	snd_soc_dapm_force_enable_pin_unlocked(dapm, "I2S1");
261362306a36Sopenharmony_ci	snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2F");
261462306a36Sopenharmony_ci	snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2B");
261562306a36Sopenharmony_ci	snd_soc_dapm_sync_unlocked(dapm);
261662306a36Sopenharmony_ci
261762306a36Sopenharmony_ci	snd_soc_dapm_mutex_unlock(dapm);
261862306a36Sopenharmony_ci
261962306a36Sopenharmony_ci	return 0;
262062306a36Sopenharmony_ci}
262162306a36Sopenharmony_ci
262262306a36Sopenharmony_cistatic void rt5682_wclk_unprepare(struct clk_hw *hw)
262362306a36Sopenharmony_ci{
262462306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
262562306a36Sopenharmony_ci		container_of(hw, struct rt5682_priv,
262662306a36Sopenharmony_ci			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
262762306a36Sopenharmony_ci	struct snd_soc_component *component;
262862306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm;
262962306a36Sopenharmony_ci
263062306a36Sopenharmony_ci	if (!rt5682_clk_check(rt5682))
263162306a36Sopenharmony_ci		return;
263262306a36Sopenharmony_ci
263362306a36Sopenharmony_ci	component = rt5682->component;
263462306a36Sopenharmony_ci	dapm = snd_soc_component_get_dapm(component);
263562306a36Sopenharmony_ci
263662306a36Sopenharmony_ci	snd_soc_dapm_mutex_lock(dapm);
263762306a36Sopenharmony_ci
263862306a36Sopenharmony_ci	snd_soc_dapm_disable_pin_unlocked(dapm, "MICBIAS");
263962306a36Sopenharmony_ci	snd_soc_dapm_disable_pin_unlocked(dapm, "Vref2");
264062306a36Sopenharmony_ci	if (!rt5682->jack_type)
264162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
264262306a36Sopenharmony_ci				RT5682_PWR_VREF2 | RT5682_PWR_FV2 |
264362306a36Sopenharmony_ci				RT5682_PWR_MB, 0);
264462306a36Sopenharmony_ci
264562306a36Sopenharmony_ci	snd_soc_dapm_disable_pin_unlocked(dapm, "I2S1");
264662306a36Sopenharmony_ci	snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2F");
264762306a36Sopenharmony_ci	snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2B");
264862306a36Sopenharmony_ci	snd_soc_dapm_sync_unlocked(dapm);
264962306a36Sopenharmony_ci
265062306a36Sopenharmony_ci	snd_soc_dapm_mutex_unlock(dapm);
265162306a36Sopenharmony_ci}
265262306a36Sopenharmony_ci
265362306a36Sopenharmony_cistatic unsigned long rt5682_wclk_recalc_rate(struct clk_hw *hw,
265462306a36Sopenharmony_ci					     unsigned long parent_rate)
265562306a36Sopenharmony_ci{
265662306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
265762306a36Sopenharmony_ci		container_of(hw, struct rt5682_priv,
265862306a36Sopenharmony_ci			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
265962306a36Sopenharmony_ci	const char * const clk_name = clk_hw_get_name(hw);
266062306a36Sopenharmony_ci
266162306a36Sopenharmony_ci	if (!rt5682_clk_check(rt5682))
266262306a36Sopenharmony_ci		return 0;
266362306a36Sopenharmony_ci	/*
266462306a36Sopenharmony_ci	 * Only accept to set wclk rate to 44.1k or 48kHz.
266562306a36Sopenharmony_ci	 */
266662306a36Sopenharmony_ci	if (rt5682->lrck[RT5682_AIF1] != CLK_48 &&
266762306a36Sopenharmony_ci	    rt5682->lrck[RT5682_AIF1] != CLK_44) {
266862306a36Sopenharmony_ci		dev_warn(rt5682->i2c_dev, "%s: clk %s only support %d or %d Hz output\n",
266962306a36Sopenharmony_ci			__func__, clk_name, CLK_44, CLK_48);
267062306a36Sopenharmony_ci		return 0;
267162306a36Sopenharmony_ci	}
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_ci	return rt5682->lrck[RT5682_AIF1];
267462306a36Sopenharmony_ci}
267562306a36Sopenharmony_ci
267662306a36Sopenharmony_cistatic long rt5682_wclk_round_rate(struct clk_hw *hw, unsigned long rate,
267762306a36Sopenharmony_ci				   unsigned long *parent_rate)
267862306a36Sopenharmony_ci{
267962306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
268062306a36Sopenharmony_ci		container_of(hw, struct rt5682_priv,
268162306a36Sopenharmony_ci			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
268262306a36Sopenharmony_ci	const char * const clk_name = clk_hw_get_name(hw);
268362306a36Sopenharmony_ci
268462306a36Sopenharmony_ci	if (!rt5682_clk_check(rt5682))
268562306a36Sopenharmony_ci		return -EINVAL;
268662306a36Sopenharmony_ci	/*
268762306a36Sopenharmony_ci	 * Only accept to set wclk rate to 44.1k or 48kHz.
268862306a36Sopenharmony_ci	 * It will force to 48kHz if not both.
268962306a36Sopenharmony_ci	 */
269062306a36Sopenharmony_ci	if (rate != CLK_48 && rate != CLK_44) {
269162306a36Sopenharmony_ci		dev_warn(rt5682->i2c_dev, "%s: clk %s only support %d or %d Hz output\n",
269262306a36Sopenharmony_ci			__func__, clk_name, CLK_44, CLK_48);
269362306a36Sopenharmony_ci		rate = CLK_48;
269462306a36Sopenharmony_ci	}
269562306a36Sopenharmony_ci
269662306a36Sopenharmony_ci	return rate;
269762306a36Sopenharmony_ci}
269862306a36Sopenharmony_ci
269962306a36Sopenharmony_cistatic int rt5682_wclk_set_rate(struct clk_hw *hw, unsigned long rate,
270062306a36Sopenharmony_ci				unsigned long parent_rate)
270162306a36Sopenharmony_ci{
270262306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
270362306a36Sopenharmony_ci		container_of(hw, struct rt5682_priv,
270462306a36Sopenharmony_ci			     dai_clks_hw[RT5682_DAI_WCLK_IDX]);
270562306a36Sopenharmony_ci	struct snd_soc_component *component;
270662306a36Sopenharmony_ci	struct clk_hw *parent_hw;
270762306a36Sopenharmony_ci	const char * const clk_name = clk_hw_get_name(hw);
270862306a36Sopenharmony_ci	int pre_div;
270962306a36Sopenharmony_ci	unsigned int clk_pll2_out;
271062306a36Sopenharmony_ci
271162306a36Sopenharmony_ci	if (!rt5682_clk_check(rt5682))
271262306a36Sopenharmony_ci		return -EINVAL;
271362306a36Sopenharmony_ci
271462306a36Sopenharmony_ci	component = rt5682->component;
271562306a36Sopenharmony_ci
271662306a36Sopenharmony_ci	/*
271762306a36Sopenharmony_ci	 * Whether the wclk's parent clk (mclk) exists or not, please ensure
271862306a36Sopenharmony_ci	 * it is fixed or set to 48MHz before setting wclk rate. It's a
271962306a36Sopenharmony_ci	 * temporary limitation. Only accept 48MHz clk as the clk provider.
272062306a36Sopenharmony_ci	 *
272162306a36Sopenharmony_ci	 * It will set the codec anyway by assuming mclk is 48MHz.
272262306a36Sopenharmony_ci	 */
272362306a36Sopenharmony_ci	parent_hw = clk_hw_get_parent(hw);
272462306a36Sopenharmony_ci	if (!parent_hw)
272562306a36Sopenharmony_ci		dev_warn(rt5682->i2c_dev,
272662306a36Sopenharmony_ci			"Parent mclk of wclk not acquired in driver. Please ensure mclk was provided as %d Hz.\n",
272762306a36Sopenharmony_ci			CLK_PLL2_FIN);
272862306a36Sopenharmony_ci
272962306a36Sopenharmony_ci	if (parent_rate != CLK_PLL2_FIN)
273062306a36Sopenharmony_ci		dev_warn(rt5682->i2c_dev, "clk %s only support %d Hz input\n",
273162306a36Sopenharmony_ci			clk_name, CLK_PLL2_FIN);
273262306a36Sopenharmony_ci
273362306a36Sopenharmony_ci	/*
273462306a36Sopenharmony_ci	 * To achieve the rate conversion from 48MHz to 44.1k or 48kHz,
273562306a36Sopenharmony_ci	 * PLL2 is needed.
273662306a36Sopenharmony_ci	 */
273762306a36Sopenharmony_ci	clk_pll2_out = rate * 512;
273862306a36Sopenharmony_ci	rt5682_set_component_pll(component, RT5682_PLL2, RT5682_PLL2_S_MCLK,
273962306a36Sopenharmony_ci		CLK_PLL2_FIN, clk_pll2_out);
274062306a36Sopenharmony_ci
274162306a36Sopenharmony_ci	rt5682_set_component_sysclk(component, RT5682_SCLK_S_PLL2, 0,
274262306a36Sopenharmony_ci		clk_pll2_out, SND_SOC_CLOCK_IN);
274362306a36Sopenharmony_ci
274462306a36Sopenharmony_ci	rt5682->lrck[RT5682_AIF1] = rate;
274562306a36Sopenharmony_ci
274662306a36Sopenharmony_ci	pre_div = rl6231_get_clk_info(rt5682->sysclk, rate);
274762306a36Sopenharmony_ci
274862306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1,
274962306a36Sopenharmony_ci		RT5682_I2S_M_DIV_MASK | RT5682_I2S_CLK_SRC_MASK,
275062306a36Sopenharmony_ci		pre_div << RT5682_I2S_M_DIV_SFT |
275162306a36Sopenharmony_ci		(rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT);
275262306a36Sopenharmony_ci
275362306a36Sopenharmony_ci	return 0;
275462306a36Sopenharmony_ci}
275562306a36Sopenharmony_ci
275662306a36Sopenharmony_cistatic unsigned long rt5682_bclk_recalc_rate(struct clk_hw *hw,
275762306a36Sopenharmony_ci					     unsigned long parent_rate)
275862306a36Sopenharmony_ci{
275962306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
276062306a36Sopenharmony_ci		container_of(hw, struct rt5682_priv,
276162306a36Sopenharmony_ci			     dai_clks_hw[RT5682_DAI_BCLK_IDX]);
276262306a36Sopenharmony_ci	unsigned int bclks_per_wclk;
276362306a36Sopenharmony_ci
276462306a36Sopenharmony_ci	regmap_read(rt5682->regmap, RT5682_TDM_TCON_CTRL, &bclks_per_wclk);
276562306a36Sopenharmony_ci
276662306a36Sopenharmony_ci	switch (bclks_per_wclk & RT5682_TDM_BCLK_MS1_MASK) {
276762306a36Sopenharmony_ci	case RT5682_TDM_BCLK_MS1_256:
276862306a36Sopenharmony_ci		return parent_rate * 256;
276962306a36Sopenharmony_ci	case RT5682_TDM_BCLK_MS1_128:
277062306a36Sopenharmony_ci		return parent_rate * 128;
277162306a36Sopenharmony_ci	case RT5682_TDM_BCLK_MS1_64:
277262306a36Sopenharmony_ci		return parent_rate * 64;
277362306a36Sopenharmony_ci	case RT5682_TDM_BCLK_MS1_32:
277462306a36Sopenharmony_ci		return parent_rate * 32;
277562306a36Sopenharmony_ci	default:
277662306a36Sopenharmony_ci		return 0;
277762306a36Sopenharmony_ci	}
277862306a36Sopenharmony_ci}
277962306a36Sopenharmony_ci
278062306a36Sopenharmony_cistatic unsigned long rt5682_bclk_get_factor(unsigned long rate,
278162306a36Sopenharmony_ci					    unsigned long parent_rate)
278262306a36Sopenharmony_ci{
278362306a36Sopenharmony_ci	unsigned long factor;
278462306a36Sopenharmony_ci
278562306a36Sopenharmony_ci	factor = rate / parent_rate;
278662306a36Sopenharmony_ci	if (factor < 64)
278762306a36Sopenharmony_ci		return 32;
278862306a36Sopenharmony_ci	else if (factor < 128)
278962306a36Sopenharmony_ci		return 64;
279062306a36Sopenharmony_ci	else if (factor < 256)
279162306a36Sopenharmony_ci		return 128;
279262306a36Sopenharmony_ci	else
279362306a36Sopenharmony_ci		return 256;
279462306a36Sopenharmony_ci}
279562306a36Sopenharmony_ci
279662306a36Sopenharmony_cistatic long rt5682_bclk_round_rate(struct clk_hw *hw, unsigned long rate,
279762306a36Sopenharmony_ci				   unsigned long *parent_rate)
279862306a36Sopenharmony_ci{
279962306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
280062306a36Sopenharmony_ci		container_of(hw, struct rt5682_priv,
280162306a36Sopenharmony_ci			     dai_clks_hw[RT5682_DAI_BCLK_IDX]);
280262306a36Sopenharmony_ci	unsigned long factor;
280362306a36Sopenharmony_ci
280462306a36Sopenharmony_ci	if (!*parent_rate || !rt5682_clk_check(rt5682))
280562306a36Sopenharmony_ci		return -EINVAL;
280662306a36Sopenharmony_ci
280762306a36Sopenharmony_ci	/*
280862306a36Sopenharmony_ci	 * BCLK rates are set as a multiplier of WCLK in HW.
280962306a36Sopenharmony_ci	 * We don't allow changing the parent WCLK. We just do
281062306a36Sopenharmony_ci	 * some rounding down based on the parent WCLK rate
281162306a36Sopenharmony_ci	 * and find the appropriate multiplier of BCLK to
281262306a36Sopenharmony_ci	 * get the rounded down BCLK value.
281362306a36Sopenharmony_ci	 */
281462306a36Sopenharmony_ci	factor = rt5682_bclk_get_factor(rate, *parent_rate);
281562306a36Sopenharmony_ci
281662306a36Sopenharmony_ci	return *parent_rate * factor;
281762306a36Sopenharmony_ci}
281862306a36Sopenharmony_ci
281962306a36Sopenharmony_cistatic int rt5682_bclk_set_rate(struct clk_hw *hw, unsigned long rate,
282062306a36Sopenharmony_ci				unsigned long parent_rate)
282162306a36Sopenharmony_ci{
282262306a36Sopenharmony_ci	struct rt5682_priv *rt5682 =
282362306a36Sopenharmony_ci		container_of(hw, struct rt5682_priv,
282462306a36Sopenharmony_ci			     dai_clks_hw[RT5682_DAI_BCLK_IDX]);
282562306a36Sopenharmony_ci	struct snd_soc_component *component;
282662306a36Sopenharmony_ci	struct snd_soc_dai *dai;
282762306a36Sopenharmony_ci	unsigned long factor;
282862306a36Sopenharmony_ci
282962306a36Sopenharmony_ci	if (!rt5682_clk_check(rt5682))
283062306a36Sopenharmony_ci		return -EINVAL;
283162306a36Sopenharmony_ci
283262306a36Sopenharmony_ci	component = rt5682->component;
283362306a36Sopenharmony_ci
283462306a36Sopenharmony_ci	factor = rt5682_bclk_get_factor(rate, parent_rate);
283562306a36Sopenharmony_ci
283662306a36Sopenharmony_ci	for_each_component_dais(component, dai)
283762306a36Sopenharmony_ci		if (dai->id == RT5682_AIF1)
283862306a36Sopenharmony_ci			return rt5682_set_bclk1_ratio(dai, factor);
283962306a36Sopenharmony_ci
284062306a36Sopenharmony_ci	dev_err(rt5682->i2c_dev, "dai %d not found in component\n",
284162306a36Sopenharmony_ci		RT5682_AIF1);
284262306a36Sopenharmony_ci	return -ENODEV;
284362306a36Sopenharmony_ci}
284462306a36Sopenharmony_ci
284562306a36Sopenharmony_cistatic const struct clk_ops rt5682_dai_clk_ops[RT5682_DAI_NUM_CLKS] = {
284662306a36Sopenharmony_ci	[RT5682_DAI_WCLK_IDX] = {
284762306a36Sopenharmony_ci		.prepare = rt5682_wclk_prepare,
284862306a36Sopenharmony_ci		.unprepare = rt5682_wclk_unprepare,
284962306a36Sopenharmony_ci		.recalc_rate = rt5682_wclk_recalc_rate,
285062306a36Sopenharmony_ci		.round_rate = rt5682_wclk_round_rate,
285162306a36Sopenharmony_ci		.set_rate = rt5682_wclk_set_rate,
285262306a36Sopenharmony_ci	},
285362306a36Sopenharmony_ci	[RT5682_DAI_BCLK_IDX] = {
285462306a36Sopenharmony_ci		.recalc_rate = rt5682_bclk_recalc_rate,
285562306a36Sopenharmony_ci		.round_rate = rt5682_bclk_round_rate,
285662306a36Sopenharmony_ci		.set_rate = rt5682_bclk_set_rate,
285762306a36Sopenharmony_ci	},
285862306a36Sopenharmony_ci};
285962306a36Sopenharmony_ci
286062306a36Sopenharmony_ciint rt5682_register_dai_clks(struct rt5682_priv *rt5682)
286162306a36Sopenharmony_ci{
286262306a36Sopenharmony_ci	struct device *dev = rt5682->i2c_dev;
286362306a36Sopenharmony_ci	struct rt5682_platform_data *pdata = &rt5682->pdata;
286462306a36Sopenharmony_ci	struct clk_hw *dai_clk_hw;
286562306a36Sopenharmony_ci	int i, ret;
286662306a36Sopenharmony_ci
286762306a36Sopenharmony_ci	for (i = 0; i < RT5682_DAI_NUM_CLKS; ++i) {
286862306a36Sopenharmony_ci		struct clk_init_data init = { };
286962306a36Sopenharmony_ci		const struct clk_hw *parent;
287062306a36Sopenharmony_ci
287162306a36Sopenharmony_ci		dai_clk_hw = &rt5682->dai_clks_hw[i];
287262306a36Sopenharmony_ci
287362306a36Sopenharmony_ci		switch (i) {
287462306a36Sopenharmony_ci		case RT5682_DAI_WCLK_IDX:
287562306a36Sopenharmony_ci			/* Make MCLK the parent of WCLK */
287662306a36Sopenharmony_ci			if (rt5682->mclk) {
287762306a36Sopenharmony_ci				parent = __clk_get_hw(rt5682->mclk);
287862306a36Sopenharmony_ci				init.parent_hws = &parent;
287962306a36Sopenharmony_ci				init.num_parents = 1;
288062306a36Sopenharmony_ci			}
288162306a36Sopenharmony_ci			break;
288262306a36Sopenharmony_ci		case RT5682_DAI_BCLK_IDX:
288362306a36Sopenharmony_ci			/* Make WCLK the parent of BCLK */
288462306a36Sopenharmony_ci			parent = &rt5682->dai_clks_hw[RT5682_DAI_WCLK_IDX];
288562306a36Sopenharmony_ci			init.parent_hws = &parent;
288662306a36Sopenharmony_ci			init.num_parents = 1;
288762306a36Sopenharmony_ci			break;
288862306a36Sopenharmony_ci		default:
288962306a36Sopenharmony_ci			dev_err(dev, "Invalid clock index\n");
289062306a36Sopenharmony_ci			return -EINVAL;
289162306a36Sopenharmony_ci		}
289262306a36Sopenharmony_ci
289362306a36Sopenharmony_ci		init.name = pdata->dai_clk_names[i];
289462306a36Sopenharmony_ci		init.ops = &rt5682_dai_clk_ops[i];
289562306a36Sopenharmony_ci		init.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_GATE;
289662306a36Sopenharmony_ci		dai_clk_hw->init = &init;
289762306a36Sopenharmony_ci
289862306a36Sopenharmony_ci		ret = devm_clk_hw_register(dev, dai_clk_hw);
289962306a36Sopenharmony_ci		if (ret) {
290062306a36Sopenharmony_ci			dev_warn(dev, "Failed to register %s: %d\n",
290162306a36Sopenharmony_ci				 init.name, ret);
290262306a36Sopenharmony_ci			return ret;
290362306a36Sopenharmony_ci		}
290462306a36Sopenharmony_ci
290562306a36Sopenharmony_ci		if (dev->of_node) {
290662306a36Sopenharmony_ci			devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
290762306a36Sopenharmony_ci						    dai_clk_hw);
290862306a36Sopenharmony_ci		} else {
290962306a36Sopenharmony_ci			ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw,
291062306a36Sopenharmony_ci							  init.name,
291162306a36Sopenharmony_ci							  dev_name(dev));
291262306a36Sopenharmony_ci			if (ret)
291362306a36Sopenharmony_ci				return ret;
291462306a36Sopenharmony_ci		}
291562306a36Sopenharmony_ci	}
291662306a36Sopenharmony_ci
291762306a36Sopenharmony_ci	return 0;
291862306a36Sopenharmony_ci}
291962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_register_dai_clks);
292062306a36Sopenharmony_ci#endif /* CONFIG_COMMON_CLK */
292162306a36Sopenharmony_ci
292262306a36Sopenharmony_cistatic int rt5682_probe(struct snd_soc_component *component)
292362306a36Sopenharmony_ci{
292462306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
292562306a36Sopenharmony_ci	struct sdw_slave *slave;
292662306a36Sopenharmony_ci	unsigned long time;
292762306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm = &component->dapm;
292862306a36Sopenharmony_ci
292962306a36Sopenharmony_ci	rt5682->component = component;
293062306a36Sopenharmony_ci
293162306a36Sopenharmony_ci	if (rt5682->is_sdw) {
293262306a36Sopenharmony_ci		slave = rt5682->slave;
293362306a36Sopenharmony_ci		time = wait_for_completion_timeout(
293462306a36Sopenharmony_ci			&slave->initialization_complete,
293562306a36Sopenharmony_ci			msecs_to_jiffies(RT5682_PROBE_TIMEOUT));
293662306a36Sopenharmony_ci		if (!time) {
293762306a36Sopenharmony_ci			dev_err(&slave->dev, "Initialization not complete, timed out\n");
293862306a36Sopenharmony_ci			return -ETIMEDOUT;
293962306a36Sopenharmony_ci		}
294062306a36Sopenharmony_ci	}
294162306a36Sopenharmony_ci
294262306a36Sopenharmony_ci	snd_soc_dapm_disable_pin(dapm, "MICBIAS");
294362306a36Sopenharmony_ci	snd_soc_dapm_disable_pin(dapm, "Vref2");
294462306a36Sopenharmony_ci	snd_soc_dapm_sync(dapm);
294562306a36Sopenharmony_ci	return 0;
294662306a36Sopenharmony_ci}
294762306a36Sopenharmony_ci
294862306a36Sopenharmony_cistatic void rt5682_remove(struct snd_soc_component *component)
294962306a36Sopenharmony_ci{
295062306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
295162306a36Sopenharmony_ci
295262306a36Sopenharmony_ci	rt5682_reset(rt5682);
295362306a36Sopenharmony_ci}
295462306a36Sopenharmony_ci
295562306a36Sopenharmony_ci#ifdef CONFIG_PM
295662306a36Sopenharmony_cistatic int rt5682_suspend(struct snd_soc_component *component)
295762306a36Sopenharmony_ci{
295862306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
295962306a36Sopenharmony_ci	unsigned int val;
296062306a36Sopenharmony_ci
296162306a36Sopenharmony_ci	if (rt5682->is_sdw)
296262306a36Sopenharmony_ci		return 0;
296362306a36Sopenharmony_ci
296462306a36Sopenharmony_ci	if (rt5682->irq)
296562306a36Sopenharmony_ci		disable_irq(rt5682->irq);
296662306a36Sopenharmony_ci
296762306a36Sopenharmony_ci	cancel_delayed_work_sync(&rt5682->jack_detect_work);
296862306a36Sopenharmony_ci	cancel_delayed_work_sync(&rt5682->jd_check_work);
296962306a36Sopenharmony_ci	if (rt5682->hs_jack && (rt5682->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) {
297062306a36Sopenharmony_ci		val = snd_soc_component_read(component,
297162306a36Sopenharmony_ci				RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK;
297262306a36Sopenharmony_ci
297362306a36Sopenharmony_ci		switch (val) {
297462306a36Sopenharmony_ci		case 0x1:
297562306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
297662306a36Sopenharmony_ci				RT5682_SAR_SEL_MB1_MASK | RT5682_SAR_SEL_MB2_MASK,
297762306a36Sopenharmony_ci				RT5682_SAR_SEL_MB1_NOSEL | RT5682_SAR_SEL_MB2_SEL);
297862306a36Sopenharmony_ci			break;
297962306a36Sopenharmony_ci		case 0x2:
298062306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
298162306a36Sopenharmony_ci				RT5682_SAR_SEL_MB1_MASK | RT5682_SAR_SEL_MB2_MASK,
298262306a36Sopenharmony_ci				RT5682_SAR_SEL_MB1_SEL | RT5682_SAR_SEL_MB2_NOSEL);
298362306a36Sopenharmony_ci			break;
298462306a36Sopenharmony_ci		default:
298562306a36Sopenharmony_ci			break;
298662306a36Sopenharmony_ci		}
298762306a36Sopenharmony_ci
298862306a36Sopenharmony_ci		/* enter SAR ADC power saving mode */
298962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
299062306a36Sopenharmony_ci			RT5682_SAR_BUTT_DET_MASK | RT5682_SAR_BUTDET_MODE_MASK |
299162306a36Sopenharmony_ci			RT5682_SAR_SEL_MB1_MB2_MASK, 0);
299262306a36Sopenharmony_ci		usleep_range(5000, 6000);
299362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
299462306a36Sopenharmony_ci			RT5682_MB1_PATH_MASK | RT5682_MB2_PATH_MASK,
299562306a36Sopenharmony_ci			RT5682_CTRL_MB1_REG | RT5682_CTRL_MB2_REG);
299662306a36Sopenharmony_ci		usleep_range(10000, 12000);
299762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
299862306a36Sopenharmony_ci			RT5682_SAR_BUTT_DET_MASK | RT5682_SAR_BUTDET_MODE_MASK,
299962306a36Sopenharmony_ci			RT5682_SAR_BUTT_DET_EN | RT5682_SAR_BUTDET_POW_SAV);
300062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_HP_CHARGE_PUMP_1,
300162306a36Sopenharmony_ci			RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0);
300262306a36Sopenharmony_ci	}
300362306a36Sopenharmony_ci
300462306a36Sopenharmony_ci	regcache_cache_only(rt5682->regmap, true);
300562306a36Sopenharmony_ci	regcache_mark_dirty(rt5682->regmap);
300662306a36Sopenharmony_ci	return 0;
300762306a36Sopenharmony_ci}
300862306a36Sopenharmony_ci
300962306a36Sopenharmony_cistatic int rt5682_resume(struct snd_soc_component *component)
301062306a36Sopenharmony_ci{
301162306a36Sopenharmony_ci	struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
301262306a36Sopenharmony_ci
301362306a36Sopenharmony_ci	if (rt5682->is_sdw)
301462306a36Sopenharmony_ci		return 0;
301562306a36Sopenharmony_ci
301662306a36Sopenharmony_ci	regcache_cache_only(rt5682->regmap, false);
301762306a36Sopenharmony_ci	regcache_sync(rt5682->regmap);
301862306a36Sopenharmony_ci
301962306a36Sopenharmony_ci	if (rt5682->hs_jack && (rt5682->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) {
302062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
302162306a36Sopenharmony_ci			RT5682_SAR_BUTDET_MODE_MASK | RT5682_SAR_SEL_MB1_MB2_MASK,
302262306a36Sopenharmony_ci			RT5682_SAR_BUTDET_POW_NORM | RT5682_SAR_SEL_MB1_MB2_AUTO);
302362306a36Sopenharmony_ci		usleep_range(5000, 6000);
302462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
302562306a36Sopenharmony_ci			RT5682_MB1_PATH_MASK | RT5682_MB2_PATH_MASK,
302662306a36Sopenharmony_ci			RT5682_CTRL_MB1_FSM | RT5682_CTRL_MB2_FSM);
302762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
302862306a36Sopenharmony_ci			RT5682_PWR_CBJ, RT5682_PWR_CBJ);
302962306a36Sopenharmony_ci	}
303062306a36Sopenharmony_ci
303162306a36Sopenharmony_ci	rt5682->jack_type = 0;
303262306a36Sopenharmony_ci	mod_delayed_work(system_power_efficient_wq,
303362306a36Sopenharmony_ci		&rt5682->jack_detect_work, msecs_to_jiffies(0));
303462306a36Sopenharmony_ci
303562306a36Sopenharmony_ci	if (rt5682->irq)
303662306a36Sopenharmony_ci		enable_irq(rt5682->irq);
303762306a36Sopenharmony_ci
303862306a36Sopenharmony_ci	return 0;
303962306a36Sopenharmony_ci}
304062306a36Sopenharmony_ci#else
304162306a36Sopenharmony_ci#define rt5682_suspend NULL
304262306a36Sopenharmony_ci#define rt5682_resume NULL
304362306a36Sopenharmony_ci#endif
304462306a36Sopenharmony_ci
304562306a36Sopenharmony_ciconst struct snd_soc_dai_ops rt5682_aif1_dai_ops = {
304662306a36Sopenharmony_ci	.hw_params = rt5682_hw_params,
304762306a36Sopenharmony_ci	.set_fmt = rt5682_set_dai_fmt,
304862306a36Sopenharmony_ci	.set_tdm_slot = rt5682_set_tdm_slot,
304962306a36Sopenharmony_ci	.set_bclk_ratio = rt5682_set_bclk1_ratio,
305062306a36Sopenharmony_ci};
305162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_aif1_dai_ops);
305262306a36Sopenharmony_ci
305362306a36Sopenharmony_ciconst struct snd_soc_dai_ops rt5682_aif2_dai_ops = {
305462306a36Sopenharmony_ci	.hw_params = rt5682_hw_params,
305562306a36Sopenharmony_ci	.set_fmt = rt5682_set_dai_fmt,
305662306a36Sopenharmony_ci	.set_bclk_ratio = rt5682_set_bclk2_ratio,
305762306a36Sopenharmony_ci};
305862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_aif2_dai_ops);
305962306a36Sopenharmony_ci
306062306a36Sopenharmony_ciconst struct snd_soc_component_driver rt5682_soc_component_dev = {
306162306a36Sopenharmony_ci	.probe = rt5682_probe,
306262306a36Sopenharmony_ci	.remove = rt5682_remove,
306362306a36Sopenharmony_ci	.suspend = rt5682_suspend,
306462306a36Sopenharmony_ci	.resume = rt5682_resume,
306562306a36Sopenharmony_ci	.set_bias_level = rt5682_set_bias_level,
306662306a36Sopenharmony_ci	.controls = rt5682_snd_controls,
306762306a36Sopenharmony_ci	.num_controls = ARRAY_SIZE(rt5682_snd_controls),
306862306a36Sopenharmony_ci	.dapm_widgets = rt5682_dapm_widgets,
306962306a36Sopenharmony_ci	.num_dapm_widgets = ARRAY_SIZE(rt5682_dapm_widgets),
307062306a36Sopenharmony_ci	.dapm_routes = rt5682_dapm_routes,
307162306a36Sopenharmony_ci	.num_dapm_routes = ARRAY_SIZE(rt5682_dapm_routes),
307262306a36Sopenharmony_ci	.set_sysclk = rt5682_set_component_sysclk,
307362306a36Sopenharmony_ci	.set_pll = rt5682_set_component_pll,
307462306a36Sopenharmony_ci	.set_jack = rt5682_set_jack_detect,
307562306a36Sopenharmony_ci	.use_pmdown_time	= 1,
307662306a36Sopenharmony_ci	.endianness		= 1,
307762306a36Sopenharmony_ci};
307862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_soc_component_dev);
307962306a36Sopenharmony_ci
308062306a36Sopenharmony_ciint rt5682_parse_dt(struct rt5682_priv *rt5682, struct device *dev)
308162306a36Sopenharmony_ci{
308262306a36Sopenharmony_ci
308362306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,dmic1-data-pin",
308462306a36Sopenharmony_ci		&rt5682->pdata.dmic1_data_pin);
308562306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,dmic1-clk-pin",
308662306a36Sopenharmony_ci		&rt5682->pdata.dmic1_clk_pin);
308762306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,jd-src",
308862306a36Sopenharmony_ci		&rt5682->pdata.jd_src);
308962306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,btndet-delay",
309062306a36Sopenharmony_ci		&rt5682->pdata.btndet_delay);
309162306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,dmic-clk-rate-hz",
309262306a36Sopenharmony_ci		&rt5682->pdata.dmic_clk_rate);
309362306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,dmic-delay-ms",
309462306a36Sopenharmony_ci		&rt5682->pdata.dmic_delay);
309562306a36Sopenharmony_ci
309662306a36Sopenharmony_ci	if (device_property_read_string_array(dev, "clock-output-names",
309762306a36Sopenharmony_ci					      rt5682->pdata.dai_clk_names,
309862306a36Sopenharmony_ci					      RT5682_DAI_NUM_CLKS) < 0)
309962306a36Sopenharmony_ci		dev_warn(dev, "Using default DAI clk names: %s, %s\n",
310062306a36Sopenharmony_ci			 rt5682->pdata.dai_clk_names[RT5682_DAI_WCLK_IDX],
310162306a36Sopenharmony_ci			 rt5682->pdata.dai_clk_names[RT5682_DAI_BCLK_IDX]);
310262306a36Sopenharmony_ci
310362306a36Sopenharmony_ci	rt5682->pdata.dmic_clk_driving_high = device_property_read_bool(dev,
310462306a36Sopenharmony_ci		"realtek,dmic-clk-driving-high");
310562306a36Sopenharmony_ci
310662306a36Sopenharmony_ci	return 0;
310762306a36Sopenharmony_ci}
310862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_parse_dt);
310962306a36Sopenharmony_ci
311062306a36Sopenharmony_ciint rt5682_get_ldo1(struct rt5682_priv *rt5682, struct device *dev)
311162306a36Sopenharmony_ci{
311262306a36Sopenharmony_ci	rt5682->ldo1_en = devm_gpiod_get_optional(dev,
311362306a36Sopenharmony_ci						  "realtek,ldo1-en",
311462306a36Sopenharmony_ci						  GPIOD_OUT_HIGH);
311562306a36Sopenharmony_ci	if (IS_ERR(rt5682->ldo1_en)) {
311662306a36Sopenharmony_ci		dev_err(dev, "Fail gpio request ldo1_en\n");
311762306a36Sopenharmony_ci		return PTR_ERR(rt5682->ldo1_en);
311862306a36Sopenharmony_ci	}
311962306a36Sopenharmony_ci
312062306a36Sopenharmony_ci	return 0;
312162306a36Sopenharmony_ci}
312262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_get_ldo1);
312362306a36Sopenharmony_ci
312462306a36Sopenharmony_civoid rt5682_calibrate(struct rt5682_priv *rt5682)
312562306a36Sopenharmony_ci{
312662306a36Sopenharmony_ci	int value, count;
312762306a36Sopenharmony_ci
312862306a36Sopenharmony_ci	mutex_lock(&rt5682->calibrate_mutex);
312962306a36Sopenharmony_ci
313062306a36Sopenharmony_ci	rt5682_reset(rt5682);
313162306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_I2C_CTRL, 0x000f);
313262306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xa2af);
313362306a36Sopenharmony_ci	usleep_range(15000, 20000);
313462306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xf2af);
313562306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0300);
313662306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x8000);
313762306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0100);
313862306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_HP_IMP_SENS_CTRL_19, 0x3800);
313962306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x3000);
314062306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x7005);
314162306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0x686c);
314262306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0d0d);
314362306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_2, 0x0321);
314462306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_HP_LOGIC_CTRL_2, 0x0004);
314562306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00);
314662306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_3, 0x06a1);
314762306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_A_DAC1_MUX, 0x0311);
314862306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00);
314962306a36Sopenharmony_ci
315062306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0xfc00);
315162306a36Sopenharmony_ci
315262306a36Sopenharmony_ci	for (count = 0; count < 60; count++) {
315362306a36Sopenharmony_ci		regmap_read(rt5682->regmap, RT5682_HP_CALIB_STA_1, &value);
315462306a36Sopenharmony_ci		if (!(value & 0x8000))
315562306a36Sopenharmony_ci			break;
315662306a36Sopenharmony_ci
315762306a36Sopenharmony_ci		usleep_range(10000, 10005);
315862306a36Sopenharmony_ci	}
315962306a36Sopenharmony_ci
316062306a36Sopenharmony_ci	if (count >= 60)
316162306a36Sopenharmony_ci		dev_err(rt5682->component->dev, "HP Calibration Failure\n");
316262306a36Sopenharmony_ci
316362306a36Sopenharmony_ci	/* restore settings */
316462306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0x002f);
316562306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0080);
316662306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x0000);
316762306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0000);
316862306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x2000);
316962306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x2005);
317062306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0xc0c4);
317162306a36Sopenharmony_ci	regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0c0c);
317262306a36Sopenharmony_ci
317362306a36Sopenharmony_ci	mutex_unlock(&rt5682->calibrate_mutex);
317462306a36Sopenharmony_ci}
317562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_calibrate);
317662306a36Sopenharmony_ci
317762306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC RT5682 driver");
317862306a36Sopenharmony_ciMODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
317962306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
3180