162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// rt5682s.c  --  RT5682I-VS ALSA SoC audio component driver
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright 2021 Realtek Semiconductor Corp.
662306a36Sopenharmony_ci// Author: Derek Fang <derek.fang@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/i2c.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/rt5682s.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#include "rt5682s.h"
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define DEVICE_ID 0x6749
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic const struct rt5682s_platform_data i2s_default_platform_data = {
3562306a36Sopenharmony_ci	.dmic1_data_pin = RT5682S_DMIC1_DATA_GPIO2,
3662306a36Sopenharmony_ci	.dmic1_clk_pin = RT5682S_DMIC1_CLK_GPIO3,
3762306a36Sopenharmony_ci	.jd_src = RT5682S_JD1,
3862306a36Sopenharmony_ci	.dai_clk_names[RT5682S_DAI_WCLK_IDX] = "rt5682-dai-wclk",
3962306a36Sopenharmony_ci	.dai_clk_names[RT5682S_DAI_BCLK_IDX] = "rt5682-dai-bclk",
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic const char *rt5682s_supply_names[RT5682S_NUM_SUPPLIES] = {
4362306a36Sopenharmony_ci	[RT5682S_SUPPLY_AVDD] = "AVDD",
4462306a36Sopenharmony_ci	[RT5682S_SUPPLY_MICVDD] = "MICVDD",
4562306a36Sopenharmony_ci	[RT5682S_SUPPLY_DBVDD] = "DBVDD",
4662306a36Sopenharmony_ci	[RT5682S_SUPPLY_LDO1_IN] = "LDO1-IN",
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic const struct reg_sequence patch_list[] = {
5062306a36Sopenharmony_ci	{RT5682S_I2C_CTRL,			0x0007},
5162306a36Sopenharmony_ci	{RT5682S_DIG_IN_CTRL_1,			0x0000},
5262306a36Sopenharmony_ci	{RT5682S_CHOP_DAC_2,			0x2020},
5362306a36Sopenharmony_ci	{RT5682S_VREF_REC_OP_FB_CAP_CTRL_2,	0x0101},
5462306a36Sopenharmony_ci	{RT5682S_VREF_REC_OP_FB_CAP_CTRL_1,	0x80c0},
5562306a36Sopenharmony_ci	{RT5682S_HP_CALIB_CTRL_9,		0x0002},
5662306a36Sopenharmony_ci	{RT5682S_DEPOP_1,			0x0000},
5762306a36Sopenharmony_ci	{RT5682S_HP_CHARGE_PUMP_2,		0x3c15},
5862306a36Sopenharmony_ci	{RT5682S_DAC1_DIG_VOL,			0xfefe},
5962306a36Sopenharmony_ci	{RT5682S_SAR_IL_CMD_2,			0xac00},
6062306a36Sopenharmony_ci	{RT5682S_SAR_IL_CMD_3,			0x024c},
6162306a36Sopenharmony_ci	{RT5682S_CBJ_CTRL_6,			0x0804},
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic void rt5682s_apply_patch_list(struct rt5682s_priv *rt5682s,
6562306a36Sopenharmony_ci		struct device *dev)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	int ret;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	ret = regmap_multi_reg_write(rt5682s->regmap, patch_list, ARRAY_SIZE(patch_list));
7062306a36Sopenharmony_ci	if (ret)
7162306a36Sopenharmony_ci		dev_warn(dev, "Failed to apply regmap patch: %d\n", ret);
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistatic const struct reg_default rt5682s_reg[] = {
7562306a36Sopenharmony_ci	{0x0002, 0x8080},
7662306a36Sopenharmony_ci	{0x0003, 0x0001},
7762306a36Sopenharmony_ci	{0x0005, 0x0000},
7862306a36Sopenharmony_ci	{0x0006, 0x0000},
7962306a36Sopenharmony_ci	{0x0008, 0x8007},
8062306a36Sopenharmony_ci	{0x000b, 0x0000},
8162306a36Sopenharmony_ci	{0x000f, 0x4000},
8262306a36Sopenharmony_ci	{0x0010, 0x4040},
8362306a36Sopenharmony_ci	{0x0011, 0x0000},
8462306a36Sopenharmony_ci	{0x0012, 0x0000},
8562306a36Sopenharmony_ci	{0x0013, 0x1200},
8662306a36Sopenharmony_ci	{0x0014, 0x200a},
8762306a36Sopenharmony_ci	{0x0015, 0x0404},
8862306a36Sopenharmony_ci	{0x0016, 0x0404},
8962306a36Sopenharmony_ci	{0x0017, 0x05a4},
9062306a36Sopenharmony_ci	{0x0019, 0xffff},
9162306a36Sopenharmony_ci	{0x001c, 0x2f2f},
9262306a36Sopenharmony_ci	{0x001f, 0x0000},
9362306a36Sopenharmony_ci	{0x0022, 0x5757},
9462306a36Sopenharmony_ci	{0x0023, 0x0039},
9562306a36Sopenharmony_ci	{0x0024, 0x000b},
9662306a36Sopenharmony_ci	{0x0026, 0xc0c4},
9762306a36Sopenharmony_ci	{0x0029, 0x8080},
9862306a36Sopenharmony_ci	{0x002a, 0xa0a0},
9962306a36Sopenharmony_ci	{0x002b, 0x0300},
10062306a36Sopenharmony_ci	{0x0030, 0x0000},
10162306a36Sopenharmony_ci	{0x003c, 0x08c0},
10262306a36Sopenharmony_ci	{0x0044, 0x1818},
10362306a36Sopenharmony_ci	{0x004b, 0x00c0},
10462306a36Sopenharmony_ci	{0x004c, 0x0000},
10562306a36Sopenharmony_ci	{0x004d, 0x0000},
10662306a36Sopenharmony_ci	{0x0061, 0x00c0},
10762306a36Sopenharmony_ci	{0x0062, 0x008a},
10862306a36Sopenharmony_ci	{0x0063, 0x0800},
10962306a36Sopenharmony_ci	{0x0064, 0x0000},
11062306a36Sopenharmony_ci	{0x0065, 0x0000},
11162306a36Sopenharmony_ci	{0x0066, 0x0030},
11262306a36Sopenharmony_ci	{0x0067, 0x000c},
11362306a36Sopenharmony_ci	{0x0068, 0x0000},
11462306a36Sopenharmony_ci	{0x0069, 0x0000},
11562306a36Sopenharmony_ci	{0x006a, 0x0000},
11662306a36Sopenharmony_ci	{0x006b, 0x0000},
11762306a36Sopenharmony_ci	{0x006c, 0x0000},
11862306a36Sopenharmony_ci	{0x006d, 0x2200},
11962306a36Sopenharmony_ci	{0x006e, 0x0810},
12062306a36Sopenharmony_ci	{0x006f, 0xe4de},
12162306a36Sopenharmony_ci	{0x0070, 0x3320},
12262306a36Sopenharmony_ci	{0x0071, 0x0000},
12362306a36Sopenharmony_ci	{0x0073, 0x0000},
12462306a36Sopenharmony_ci	{0x0074, 0x0000},
12562306a36Sopenharmony_ci	{0x0075, 0x0002},
12662306a36Sopenharmony_ci	{0x0076, 0x0001},
12762306a36Sopenharmony_ci	{0x0079, 0x0000},
12862306a36Sopenharmony_ci	{0x007a, 0x0000},
12962306a36Sopenharmony_ci	{0x007b, 0x0000},
13062306a36Sopenharmony_ci	{0x007c, 0x0100},
13162306a36Sopenharmony_ci	{0x007e, 0x0000},
13262306a36Sopenharmony_ci	{0x007f, 0x0000},
13362306a36Sopenharmony_ci	{0x0080, 0x0000},
13462306a36Sopenharmony_ci	{0x0083, 0x0000},
13562306a36Sopenharmony_ci	{0x0084, 0x0000},
13662306a36Sopenharmony_ci	{0x0085, 0x0000},
13762306a36Sopenharmony_ci	{0x0086, 0x0005},
13862306a36Sopenharmony_ci	{0x0087, 0x0000},
13962306a36Sopenharmony_ci	{0x0088, 0x0000},
14062306a36Sopenharmony_ci	{0x008c, 0x0003},
14162306a36Sopenharmony_ci	{0x008e, 0x0060},
14262306a36Sopenharmony_ci	{0x008f, 0x4da1},
14362306a36Sopenharmony_ci	{0x0091, 0x1c15},
14462306a36Sopenharmony_ci	{0x0092, 0x0425},
14562306a36Sopenharmony_ci	{0x0093, 0x0000},
14662306a36Sopenharmony_ci	{0x0094, 0x0080},
14762306a36Sopenharmony_ci	{0x0095, 0x008f},
14862306a36Sopenharmony_ci	{0x0096, 0x0000},
14962306a36Sopenharmony_ci	{0x0097, 0x0000},
15062306a36Sopenharmony_ci	{0x0098, 0x0000},
15162306a36Sopenharmony_ci	{0x0099, 0x0000},
15262306a36Sopenharmony_ci	{0x009a, 0x0000},
15362306a36Sopenharmony_ci	{0x009b, 0x0000},
15462306a36Sopenharmony_ci	{0x009c, 0x0000},
15562306a36Sopenharmony_ci	{0x009d, 0x0000},
15662306a36Sopenharmony_ci	{0x009e, 0x0000},
15762306a36Sopenharmony_ci	{0x009f, 0x0009},
15862306a36Sopenharmony_ci	{0x00a0, 0x0000},
15962306a36Sopenharmony_ci	{0x00a3, 0x0002},
16062306a36Sopenharmony_ci	{0x00a4, 0x0001},
16162306a36Sopenharmony_ci	{0x00b6, 0x0000},
16262306a36Sopenharmony_ci	{0x00b7, 0x0000},
16362306a36Sopenharmony_ci	{0x00b8, 0x0000},
16462306a36Sopenharmony_ci	{0x00b9, 0x0002},
16562306a36Sopenharmony_ci	{0x00be, 0x0000},
16662306a36Sopenharmony_ci	{0x00c0, 0x0160},
16762306a36Sopenharmony_ci	{0x00c1, 0x82a0},
16862306a36Sopenharmony_ci	{0x00c2, 0x0000},
16962306a36Sopenharmony_ci	{0x00d0, 0x0000},
17062306a36Sopenharmony_ci	{0x00d2, 0x3300},
17162306a36Sopenharmony_ci	{0x00d3, 0x2200},
17262306a36Sopenharmony_ci	{0x00d4, 0x0000},
17362306a36Sopenharmony_ci	{0x00d9, 0x0000},
17462306a36Sopenharmony_ci	{0x00da, 0x0000},
17562306a36Sopenharmony_ci	{0x00db, 0x0000},
17662306a36Sopenharmony_ci	{0x00dc, 0x00c0},
17762306a36Sopenharmony_ci	{0x00dd, 0x2220},
17862306a36Sopenharmony_ci	{0x00de, 0x3131},
17962306a36Sopenharmony_ci	{0x00df, 0x3131},
18062306a36Sopenharmony_ci	{0x00e0, 0x3131},
18162306a36Sopenharmony_ci	{0x00e2, 0x0000},
18262306a36Sopenharmony_ci	{0x00e3, 0x4000},
18362306a36Sopenharmony_ci	{0x00e4, 0x0aa0},
18462306a36Sopenharmony_ci	{0x00e5, 0x3131},
18562306a36Sopenharmony_ci	{0x00e6, 0x3131},
18662306a36Sopenharmony_ci	{0x00e7, 0x3131},
18762306a36Sopenharmony_ci	{0x00e8, 0x3131},
18862306a36Sopenharmony_ci	{0x00ea, 0xb320},
18962306a36Sopenharmony_ci	{0x00eb, 0x0000},
19062306a36Sopenharmony_ci	{0x00f0, 0x0000},
19162306a36Sopenharmony_ci	{0x00f6, 0x0000},
19262306a36Sopenharmony_ci	{0x00fa, 0x0000},
19362306a36Sopenharmony_ci	{0x00fb, 0x0000},
19462306a36Sopenharmony_ci	{0x00fc, 0x0000},
19562306a36Sopenharmony_ci	{0x00fd, 0x0000},
19662306a36Sopenharmony_ci	{0x00fe, 0x10ec},
19762306a36Sopenharmony_ci	{0x00ff, 0x6749},
19862306a36Sopenharmony_ci	{0x0100, 0xa000},
19962306a36Sopenharmony_ci	{0x010b, 0x0066},
20062306a36Sopenharmony_ci	{0x010c, 0x6666},
20162306a36Sopenharmony_ci	{0x010d, 0x2202},
20262306a36Sopenharmony_ci	{0x010e, 0x6666},
20362306a36Sopenharmony_ci	{0x010f, 0xa800},
20462306a36Sopenharmony_ci	{0x0110, 0x0006},
20562306a36Sopenharmony_ci	{0x0111, 0x0460},
20662306a36Sopenharmony_ci	{0x0112, 0x2000},
20762306a36Sopenharmony_ci	{0x0113, 0x0200},
20862306a36Sopenharmony_ci	{0x0117, 0x8000},
20962306a36Sopenharmony_ci	{0x0118, 0x0303},
21062306a36Sopenharmony_ci	{0x0125, 0x0020},
21162306a36Sopenharmony_ci	{0x0132, 0x5026},
21262306a36Sopenharmony_ci	{0x0136, 0x8000},
21362306a36Sopenharmony_ci	{0x0139, 0x0005},
21462306a36Sopenharmony_ci	{0x013a, 0x3030},
21562306a36Sopenharmony_ci	{0x013b, 0xa000},
21662306a36Sopenharmony_ci	{0x013c, 0x4110},
21762306a36Sopenharmony_ci	{0x013f, 0x0000},
21862306a36Sopenharmony_ci	{0x0145, 0x0022},
21962306a36Sopenharmony_ci	{0x0146, 0x0000},
22062306a36Sopenharmony_ci	{0x0147, 0x0000},
22162306a36Sopenharmony_ci	{0x0148, 0x0000},
22262306a36Sopenharmony_ci	{0x0156, 0x0022},
22362306a36Sopenharmony_ci	{0x0157, 0x0303},
22462306a36Sopenharmony_ci	{0x0158, 0x2222},
22562306a36Sopenharmony_ci	{0x0159, 0x0000},
22662306a36Sopenharmony_ci	{0x0160, 0x4ec0},
22762306a36Sopenharmony_ci	{0x0161, 0x0080},
22862306a36Sopenharmony_ci	{0x0162, 0x0200},
22962306a36Sopenharmony_ci	{0x0163, 0x0800},
23062306a36Sopenharmony_ci	{0x0164, 0x0000},
23162306a36Sopenharmony_ci	{0x0165, 0x0000},
23262306a36Sopenharmony_ci	{0x0166, 0x0000},
23362306a36Sopenharmony_ci	{0x0167, 0x000f},
23462306a36Sopenharmony_ci	{0x0168, 0x000f},
23562306a36Sopenharmony_ci	{0x0169, 0x0001},
23662306a36Sopenharmony_ci	{0x0190, 0x4131},
23762306a36Sopenharmony_ci	{0x0194, 0x0000},
23862306a36Sopenharmony_ci	{0x0195, 0x0000},
23962306a36Sopenharmony_ci	{0x0197, 0x0022},
24062306a36Sopenharmony_ci	{0x0198, 0x0000},
24162306a36Sopenharmony_ci	{0x0199, 0x0000},
24262306a36Sopenharmony_ci	{0x01ac, 0x0000},
24362306a36Sopenharmony_ci	{0x01ad, 0x0000},
24462306a36Sopenharmony_ci	{0x01ae, 0x0000},
24562306a36Sopenharmony_ci	{0x01af, 0x2000},
24662306a36Sopenharmony_ci	{0x01b0, 0x0000},
24762306a36Sopenharmony_ci	{0x01b1, 0x0000},
24862306a36Sopenharmony_ci	{0x01b2, 0x0000},
24962306a36Sopenharmony_ci	{0x01b3, 0x0017},
25062306a36Sopenharmony_ci	{0x01b4, 0x004b},
25162306a36Sopenharmony_ci	{0x01b5, 0x0000},
25262306a36Sopenharmony_ci	{0x01b6, 0x03e8},
25362306a36Sopenharmony_ci	{0x01b7, 0x0000},
25462306a36Sopenharmony_ci	{0x01b8, 0x0000},
25562306a36Sopenharmony_ci	{0x01b9, 0x0400},
25662306a36Sopenharmony_ci	{0x01ba, 0xb5b6},
25762306a36Sopenharmony_ci	{0x01bb, 0x9124},
25862306a36Sopenharmony_ci	{0x01bc, 0x4924},
25962306a36Sopenharmony_ci	{0x01bd, 0x0009},
26062306a36Sopenharmony_ci	{0x01be, 0x0018},
26162306a36Sopenharmony_ci	{0x01bf, 0x002a},
26262306a36Sopenharmony_ci	{0x01c0, 0x004c},
26362306a36Sopenharmony_ci	{0x01c1, 0x0097},
26462306a36Sopenharmony_ci	{0x01c2, 0x01c3},
26562306a36Sopenharmony_ci	{0x01c3, 0x03e9},
26662306a36Sopenharmony_ci	{0x01c4, 0x1389},
26762306a36Sopenharmony_ci	{0x01c5, 0xc351},
26862306a36Sopenharmony_ci	{0x01c6, 0x02a0},
26962306a36Sopenharmony_ci	{0x01c7, 0x0b0f},
27062306a36Sopenharmony_ci	{0x01c8, 0x402f},
27162306a36Sopenharmony_ci	{0x01c9, 0x0702},
27262306a36Sopenharmony_ci	{0x01ca, 0x0000},
27362306a36Sopenharmony_ci	{0x01cb, 0x0000},
27462306a36Sopenharmony_ci	{0x01cc, 0x5757},
27562306a36Sopenharmony_ci	{0x01cd, 0x5757},
27662306a36Sopenharmony_ci	{0x01ce, 0x5757},
27762306a36Sopenharmony_ci	{0x01cf, 0x5757},
27862306a36Sopenharmony_ci	{0x01d0, 0x5757},
27962306a36Sopenharmony_ci	{0x01d1, 0x5757},
28062306a36Sopenharmony_ci	{0x01d2, 0x5757},
28162306a36Sopenharmony_ci	{0x01d3, 0x5757},
28262306a36Sopenharmony_ci	{0x01d4, 0x5757},
28362306a36Sopenharmony_ci	{0x01d5, 0x5757},
28462306a36Sopenharmony_ci	{0x01d6, 0x0000},
28562306a36Sopenharmony_ci	{0x01d7, 0x0000},
28662306a36Sopenharmony_ci	{0x01d8, 0x0162},
28762306a36Sopenharmony_ci	{0x01d9, 0x0007},
28862306a36Sopenharmony_ci	{0x01da, 0x0000},
28962306a36Sopenharmony_ci	{0x01db, 0x0004},
29062306a36Sopenharmony_ci	{0x01dc, 0x0000},
29162306a36Sopenharmony_ci	{0x01de, 0x7c00},
29262306a36Sopenharmony_ci	{0x01df, 0x0020},
29362306a36Sopenharmony_ci	{0x01e0, 0x04c1},
29462306a36Sopenharmony_ci	{0x01e1, 0x0000},
29562306a36Sopenharmony_ci	{0x01e2, 0x0000},
29662306a36Sopenharmony_ci	{0x01e3, 0x0000},
29762306a36Sopenharmony_ci	{0x01e4, 0x0000},
29862306a36Sopenharmony_ci	{0x01e5, 0x0000},
29962306a36Sopenharmony_ci	{0x01e6, 0x0001},
30062306a36Sopenharmony_ci	{0x01e7, 0x0000},
30162306a36Sopenharmony_ci	{0x01e8, 0x0000},
30262306a36Sopenharmony_ci	{0x01eb, 0x0000},
30362306a36Sopenharmony_ci	{0x01ec, 0x0000},
30462306a36Sopenharmony_ci	{0x01ed, 0x0000},
30562306a36Sopenharmony_ci	{0x01ee, 0x0000},
30662306a36Sopenharmony_ci	{0x01ef, 0x0000},
30762306a36Sopenharmony_ci	{0x01f0, 0x0000},
30862306a36Sopenharmony_ci	{0x01f1, 0x0000},
30962306a36Sopenharmony_ci	{0x01f2, 0x0000},
31062306a36Sopenharmony_ci	{0x01f3, 0x0000},
31162306a36Sopenharmony_ci	{0x01f4, 0x0000},
31262306a36Sopenharmony_ci	{0x0210, 0x6297},
31362306a36Sopenharmony_ci	{0x0211, 0xa004},
31462306a36Sopenharmony_ci	{0x0212, 0x0365},
31562306a36Sopenharmony_ci	{0x0213, 0xf7ff},
31662306a36Sopenharmony_ci	{0x0214, 0xf24c},
31762306a36Sopenharmony_ci	{0x0215, 0x0102},
31862306a36Sopenharmony_ci	{0x0216, 0x00a3},
31962306a36Sopenharmony_ci	{0x0217, 0x0048},
32062306a36Sopenharmony_ci	{0x0218, 0xa2c0},
32162306a36Sopenharmony_ci	{0x0219, 0x0400},
32262306a36Sopenharmony_ci	{0x021a, 0x00c8},
32362306a36Sopenharmony_ci	{0x021b, 0x00c0},
32462306a36Sopenharmony_ci	{0x021c, 0x0000},
32562306a36Sopenharmony_ci	{0x021d, 0x024c},
32662306a36Sopenharmony_ci	{0x02fa, 0x0000},
32762306a36Sopenharmony_ci	{0x02fb, 0x0000},
32862306a36Sopenharmony_ci	{0x02fc, 0x0000},
32962306a36Sopenharmony_ci	{0x03fe, 0x0000},
33062306a36Sopenharmony_ci	{0x03ff, 0x0000},
33162306a36Sopenharmony_ci	{0x0500, 0x0000},
33262306a36Sopenharmony_ci	{0x0600, 0x0000},
33362306a36Sopenharmony_ci	{0x0610, 0x6666},
33462306a36Sopenharmony_ci	{0x0611, 0xa9aa},
33562306a36Sopenharmony_ci	{0x0620, 0x6666},
33662306a36Sopenharmony_ci	{0x0621, 0xa9aa},
33762306a36Sopenharmony_ci	{0x0630, 0x6666},
33862306a36Sopenharmony_ci	{0x0631, 0xa9aa},
33962306a36Sopenharmony_ci	{0x0640, 0x6666},
34062306a36Sopenharmony_ci	{0x0641, 0xa9aa},
34162306a36Sopenharmony_ci	{0x07fa, 0x0000},
34262306a36Sopenharmony_ci	{0x08fa, 0x0000},
34362306a36Sopenharmony_ci	{0x08fb, 0x0000},
34462306a36Sopenharmony_ci	{0x0d00, 0x0000},
34562306a36Sopenharmony_ci	{0x1100, 0x0000},
34662306a36Sopenharmony_ci	{0x1101, 0x0000},
34762306a36Sopenharmony_ci	{0x1102, 0x0000},
34862306a36Sopenharmony_ci	{0x1103, 0x0000},
34962306a36Sopenharmony_ci	{0x1104, 0x0000},
35062306a36Sopenharmony_ci	{0x1105, 0x0000},
35162306a36Sopenharmony_ci	{0x1106, 0x0000},
35262306a36Sopenharmony_ci	{0x1107, 0x0000},
35362306a36Sopenharmony_ci	{0x1108, 0x0000},
35462306a36Sopenharmony_ci	{0x1109, 0x0000},
35562306a36Sopenharmony_ci	{0x110a, 0x0000},
35662306a36Sopenharmony_ci	{0x110b, 0x0000},
35762306a36Sopenharmony_ci	{0x110c, 0x0000},
35862306a36Sopenharmony_ci	{0x1111, 0x0000},
35962306a36Sopenharmony_ci	{0x1112, 0x0000},
36062306a36Sopenharmony_ci	{0x1113, 0x0000},
36162306a36Sopenharmony_ci	{0x1114, 0x0000},
36262306a36Sopenharmony_ci	{0x1115, 0x0000},
36362306a36Sopenharmony_ci	{0x1116, 0x0000},
36462306a36Sopenharmony_ci	{0x1117, 0x0000},
36562306a36Sopenharmony_ci	{0x1118, 0x0000},
36662306a36Sopenharmony_ci	{0x1119, 0x0000},
36762306a36Sopenharmony_ci	{0x111a, 0x0000},
36862306a36Sopenharmony_ci	{0x111b, 0x0000},
36962306a36Sopenharmony_ci	{0x111c, 0x0000},
37062306a36Sopenharmony_ci	{0x1401, 0x0404},
37162306a36Sopenharmony_ci	{0x1402, 0x0007},
37262306a36Sopenharmony_ci	{0x1403, 0x0365},
37362306a36Sopenharmony_ci	{0x1404, 0x0210},
37462306a36Sopenharmony_ci	{0x1405, 0x0365},
37562306a36Sopenharmony_ci	{0x1406, 0x0210},
37662306a36Sopenharmony_ci	{0x1407, 0x0000},
37762306a36Sopenharmony_ci	{0x1408, 0x0000},
37862306a36Sopenharmony_ci	{0x1409, 0x0000},
37962306a36Sopenharmony_ci	{0x140a, 0x0000},
38062306a36Sopenharmony_ci	{0x140b, 0x0000},
38162306a36Sopenharmony_ci	{0x140c, 0x0000},
38262306a36Sopenharmony_ci	{0x140d, 0x0000},
38362306a36Sopenharmony_ci	{0x140e, 0x0000},
38462306a36Sopenharmony_ci	{0x140f, 0x0000},
38562306a36Sopenharmony_ci	{0x1410, 0x0000},
38662306a36Sopenharmony_ci	{0x1411, 0x0000},
38762306a36Sopenharmony_ci	{0x1801, 0x0004},
38862306a36Sopenharmony_ci	{0x1802, 0x0000},
38962306a36Sopenharmony_ci	{0x1803, 0x0000},
39062306a36Sopenharmony_ci	{0x1804, 0x0000},
39162306a36Sopenharmony_ci	{0x1805, 0x00ff},
39262306a36Sopenharmony_ci	{0x2c00, 0x0000},
39362306a36Sopenharmony_ci	{0x3400, 0x0200},
39462306a36Sopenharmony_ci	{0x3404, 0x0000},
39562306a36Sopenharmony_ci	{0x3405, 0x0000},
39662306a36Sopenharmony_ci	{0x3406, 0x0000},
39762306a36Sopenharmony_ci	{0x3407, 0x0000},
39862306a36Sopenharmony_ci	{0x3408, 0x0000},
39962306a36Sopenharmony_ci	{0x3409, 0x0000},
40062306a36Sopenharmony_ci	{0x340a, 0x0000},
40162306a36Sopenharmony_ci	{0x340b, 0x0000},
40262306a36Sopenharmony_ci	{0x340c, 0x0000},
40362306a36Sopenharmony_ci	{0x340d, 0x0000},
40462306a36Sopenharmony_ci	{0x340e, 0x0000},
40562306a36Sopenharmony_ci	{0x340f, 0x0000},
40662306a36Sopenharmony_ci	{0x3410, 0x0000},
40762306a36Sopenharmony_ci	{0x3411, 0x0000},
40862306a36Sopenharmony_ci	{0x3412, 0x0000},
40962306a36Sopenharmony_ci	{0x3413, 0x0000},
41062306a36Sopenharmony_ci	{0x3414, 0x0000},
41162306a36Sopenharmony_ci	{0x3415, 0x0000},
41262306a36Sopenharmony_ci	{0x3424, 0x0000},
41362306a36Sopenharmony_ci	{0x3425, 0x0000},
41462306a36Sopenharmony_ci	{0x3426, 0x0000},
41562306a36Sopenharmony_ci	{0x3427, 0x0000},
41662306a36Sopenharmony_ci	{0x3428, 0x0000},
41762306a36Sopenharmony_ci	{0x3429, 0x0000},
41862306a36Sopenharmony_ci	{0x342a, 0x0000},
41962306a36Sopenharmony_ci	{0x342b, 0x0000},
42062306a36Sopenharmony_ci	{0x342c, 0x0000},
42162306a36Sopenharmony_ci	{0x342d, 0x0000},
42262306a36Sopenharmony_ci	{0x342e, 0x0000},
42362306a36Sopenharmony_ci	{0x342f, 0x0000},
42462306a36Sopenharmony_ci	{0x3430, 0x0000},
42562306a36Sopenharmony_ci	{0x3431, 0x0000},
42662306a36Sopenharmony_ci	{0x3432, 0x0000},
42762306a36Sopenharmony_ci	{0x3433, 0x0000},
42862306a36Sopenharmony_ci	{0x3434, 0x0000},
42962306a36Sopenharmony_ci	{0x3435, 0x0000},
43062306a36Sopenharmony_ci	{0x3440, 0x6319},
43162306a36Sopenharmony_ci	{0x3441, 0x3771},
43262306a36Sopenharmony_ci	{0x3500, 0x0002},
43362306a36Sopenharmony_ci	{0x3501, 0x5728},
43462306a36Sopenharmony_ci	{0x3b00, 0x3010},
43562306a36Sopenharmony_ci	{0x3b01, 0x3300},
43662306a36Sopenharmony_ci	{0x3b02, 0x2200},
43762306a36Sopenharmony_ci	{0x3b03, 0x0100},
43862306a36Sopenharmony_ci};
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_cistatic bool rt5682s_volatile_register(struct device *dev, unsigned int reg)
44162306a36Sopenharmony_ci{
44262306a36Sopenharmony_ci	switch (reg) {
44362306a36Sopenharmony_ci	case RT5682S_RESET:
44462306a36Sopenharmony_ci	case RT5682S_CBJ_CTRL_2:
44562306a36Sopenharmony_ci	case RT5682S_I2S1_F_DIV_CTRL_2:
44662306a36Sopenharmony_ci	case RT5682S_I2S2_F_DIV_CTRL_2:
44762306a36Sopenharmony_ci	case RT5682S_INT_ST_1:
44862306a36Sopenharmony_ci	case RT5682S_GPIO_ST:
44962306a36Sopenharmony_ci	case RT5682S_IL_CMD_1:
45062306a36Sopenharmony_ci	case RT5682S_4BTN_IL_CMD_1:
45162306a36Sopenharmony_ci	case RT5682S_AJD1_CTRL:
45262306a36Sopenharmony_ci	case RT5682S_VERSION_ID...RT5682S_DEVICE_ID:
45362306a36Sopenharmony_ci	case RT5682S_STO_NG2_CTRL_1:
45462306a36Sopenharmony_ci	case RT5682S_STO_NG2_CTRL_5...RT5682S_STO_NG2_CTRL_7:
45562306a36Sopenharmony_ci	case RT5682S_STO1_DAC_SIL_DET:
45662306a36Sopenharmony_ci	case RT5682S_HP_IMP_SENS_CTRL_1...RT5682S_HP_IMP_SENS_CTRL_4:
45762306a36Sopenharmony_ci	case RT5682S_HP_IMP_SENS_CTRL_13:
45862306a36Sopenharmony_ci	case RT5682S_HP_IMP_SENS_CTRL_14:
45962306a36Sopenharmony_ci	case RT5682S_HP_IMP_SENS_CTRL_43...RT5682S_HP_IMP_SENS_CTRL_46:
46062306a36Sopenharmony_ci	case RT5682S_HP_CALIB_CTRL_1:
46162306a36Sopenharmony_ci	case RT5682S_HP_CALIB_CTRL_10:
46262306a36Sopenharmony_ci	case RT5682S_HP_CALIB_ST_1...RT5682S_HP_CALIB_ST_11:
46362306a36Sopenharmony_ci	case RT5682S_SAR_IL_CMD_2...RT5682S_SAR_IL_CMD_5:
46462306a36Sopenharmony_ci	case RT5682S_SAR_IL_CMD_10:
46562306a36Sopenharmony_ci	case RT5682S_SAR_IL_CMD_11:
46662306a36Sopenharmony_ci	case RT5682S_VERSION_ID_HIDE:
46762306a36Sopenharmony_ci	case RT5682S_VERSION_ID_CUS:
46862306a36Sopenharmony_ci	case RT5682S_I2C_TRANS_CTRL:
46962306a36Sopenharmony_ci	case RT5682S_DMIC_FLOAT_DET:
47062306a36Sopenharmony_ci	case RT5682S_HA_CMP_OP_1:
47162306a36Sopenharmony_ci	case RT5682S_NEW_CBJ_DET_CTL_10...RT5682S_NEW_CBJ_DET_CTL_16:
47262306a36Sopenharmony_ci	case RT5682S_CLK_SW_TEST_1:
47362306a36Sopenharmony_ci	case RT5682S_CLK_SW_TEST_2:
47462306a36Sopenharmony_ci	case RT5682S_EFUSE_READ_1...RT5682S_EFUSE_READ_18:
47562306a36Sopenharmony_ci	case RT5682S_PILOT_DIG_CTL_1:
47662306a36Sopenharmony_ci		return true;
47762306a36Sopenharmony_ci	default:
47862306a36Sopenharmony_ci		return false;
47962306a36Sopenharmony_ci	}
48062306a36Sopenharmony_ci}
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_cistatic bool rt5682s_readable_register(struct device *dev, unsigned int reg)
48362306a36Sopenharmony_ci{
48462306a36Sopenharmony_ci	switch (reg) {
48562306a36Sopenharmony_ci	case RT5682S_RESET:
48662306a36Sopenharmony_ci	case RT5682S_VERSION_ID:
48762306a36Sopenharmony_ci	case RT5682S_VENDOR_ID:
48862306a36Sopenharmony_ci	case RT5682S_DEVICE_ID:
48962306a36Sopenharmony_ci	case RT5682S_HP_CTRL_1:
49062306a36Sopenharmony_ci	case RT5682S_HP_CTRL_2:
49162306a36Sopenharmony_ci	case RT5682S_HPL_GAIN:
49262306a36Sopenharmony_ci	case RT5682S_HPR_GAIN:
49362306a36Sopenharmony_ci	case RT5682S_I2C_CTRL:
49462306a36Sopenharmony_ci	case RT5682S_CBJ_BST_CTRL:
49562306a36Sopenharmony_ci	case RT5682S_CBJ_DET_CTRL:
49662306a36Sopenharmony_ci	case RT5682S_CBJ_CTRL_1...RT5682S_CBJ_CTRL_8:
49762306a36Sopenharmony_ci	case RT5682S_DAC1_DIG_VOL:
49862306a36Sopenharmony_ci	case RT5682S_STO1_ADC_DIG_VOL:
49962306a36Sopenharmony_ci	case RT5682S_STO1_ADC_BOOST:
50062306a36Sopenharmony_ci	case RT5682S_HP_IMP_GAIN_1:
50162306a36Sopenharmony_ci	case RT5682S_HP_IMP_GAIN_2:
50262306a36Sopenharmony_ci	case RT5682S_SIDETONE_CTRL:
50362306a36Sopenharmony_ci	case RT5682S_STO1_ADC_MIXER:
50462306a36Sopenharmony_ci	case RT5682S_AD_DA_MIXER:
50562306a36Sopenharmony_ci	case RT5682S_STO1_DAC_MIXER:
50662306a36Sopenharmony_ci	case RT5682S_A_DAC1_MUX:
50762306a36Sopenharmony_ci	case RT5682S_DIG_INF2_DATA:
50862306a36Sopenharmony_ci	case RT5682S_REC_MIXER:
50962306a36Sopenharmony_ci	case RT5682S_CAL_REC:
51062306a36Sopenharmony_ci	case RT5682S_HP_ANA_OST_CTRL_1...RT5682S_HP_ANA_OST_CTRL_3:
51162306a36Sopenharmony_ci	case RT5682S_PWR_DIG_1...RT5682S_PWR_MIXER:
51262306a36Sopenharmony_ci	case RT5682S_MB_CTRL:
51362306a36Sopenharmony_ci	case RT5682S_CLK_GATE_TCON_1...RT5682S_CLK_GATE_TCON_3:
51462306a36Sopenharmony_ci	case RT5682S_CLK_DET...RT5682S_LPF_AD_DMIC:
51562306a36Sopenharmony_ci	case RT5682S_I2S1_SDP:
51662306a36Sopenharmony_ci	case RT5682S_I2S2_SDP:
51762306a36Sopenharmony_ci	case RT5682S_ADDA_CLK_1:
51862306a36Sopenharmony_ci	case RT5682S_ADDA_CLK_2:
51962306a36Sopenharmony_ci	case RT5682S_I2S1_F_DIV_CTRL_1:
52062306a36Sopenharmony_ci	case RT5682S_I2S1_F_DIV_CTRL_2:
52162306a36Sopenharmony_ci	case RT5682S_TDM_CTRL:
52262306a36Sopenharmony_ci	case RT5682S_TDM_ADDA_CTRL_1:
52362306a36Sopenharmony_ci	case RT5682S_TDM_ADDA_CTRL_2:
52462306a36Sopenharmony_ci	case RT5682S_DATA_SEL_CTRL_1:
52562306a36Sopenharmony_ci	case RT5682S_TDM_TCON_CTRL_1:
52662306a36Sopenharmony_ci	case RT5682S_TDM_TCON_CTRL_2:
52762306a36Sopenharmony_ci	case RT5682S_GLB_CLK:
52862306a36Sopenharmony_ci	case RT5682S_PLL_TRACK_1...RT5682S_PLL_TRACK_6:
52962306a36Sopenharmony_ci	case RT5682S_PLL_TRACK_11:
53062306a36Sopenharmony_ci	case RT5682S_DEPOP_1:
53162306a36Sopenharmony_ci	case RT5682S_HP_CHARGE_PUMP_1:
53262306a36Sopenharmony_ci	case RT5682S_HP_CHARGE_PUMP_2:
53362306a36Sopenharmony_ci	case RT5682S_HP_CHARGE_PUMP_3:
53462306a36Sopenharmony_ci	case RT5682S_MICBIAS_1...RT5682S_MICBIAS_3:
53562306a36Sopenharmony_ci	case RT5682S_PLL_TRACK_12...RT5682S_PLL_CTRL_7:
53662306a36Sopenharmony_ci	case RT5682S_RC_CLK_CTRL:
53762306a36Sopenharmony_ci	case RT5682S_I2S2_M_CLK_CTRL_1:
53862306a36Sopenharmony_ci	case RT5682S_I2S2_F_DIV_CTRL_1:
53962306a36Sopenharmony_ci	case RT5682S_I2S2_F_DIV_CTRL_2:
54062306a36Sopenharmony_ci	case RT5682S_IRQ_CTRL_1...RT5682S_IRQ_CTRL_4:
54162306a36Sopenharmony_ci	case RT5682S_INT_ST_1:
54262306a36Sopenharmony_ci	case RT5682S_GPIO_CTRL_1:
54362306a36Sopenharmony_ci	case RT5682S_GPIO_CTRL_2:
54462306a36Sopenharmony_ci	case RT5682S_GPIO_ST:
54562306a36Sopenharmony_ci	case RT5682S_HP_AMP_DET_CTRL_1:
54662306a36Sopenharmony_ci	case RT5682S_MID_HP_AMP_DET:
54762306a36Sopenharmony_ci	case RT5682S_LOW_HP_AMP_DET:
54862306a36Sopenharmony_ci	case RT5682S_DELAY_BUF_CTRL:
54962306a36Sopenharmony_ci	case RT5682S_SV_ZCD_1:
55062306a36Sopenharmony_ci	case RT5682S_SV_ZCD_2:
55162306a36Sopenharmony_ci	case RT5682S_IL_CMD_1...RT5682S_IL_CMD_6:
55262306a36Sopenharmony_ci	case RT5682S_4BTN_IL_CMD_1...RT5682S_4BTN_IL_CMD_7:
55362306a36Sopenharmony_ci	case RT5682S_ADC_STO1_HP_CTRL_1:
55462306a36Sopenharmony_ci	case RT5682S_ADC_STO1_HP_CTRL_2:
55562306a36Sopenharmony_ci	case RT5682S_AJD1_CTRL:
55662306a36Sopenharmony_ci	case RT5682S_JD_CTRL_1:
55762306a36Sopenharmony_ci	case RT5682S_DUMMY_1...RT5682S_DUMMY_3:
55862306a36Sopenharmony_ci	case RT5682S_DAC_ADC_DIG_VOL1:
55962306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_2...RT5682S_BIAS_CUR_CTRL_10:
56062306a36Sopenharmony_ci	case RT5682S_VREF_REC_OP_FB_CAP_CTRL_1:
56162306a36Sopenharmony_ci	case RT5682S_VREF_REC_OP_FB_CAP_CTRL_2:
56262306a36Sopenharmony_ci	case RT5682S_CHARGE_PUMP_1:
56362306a36Sopenharmony_ci	case RT5682S_DIG_IN_CTRL_1:
56462306a36Sopenharmony_ci	case RT5682S_PAD_DRIVING_CTRL:
56562306a36Sopenharmony_ci	case RT5682S_CHOP_DAC_1:
56662306a36Sopenharmony_ci	case RT5682S_CHOP_DAC_2:
56762306a36Sopenharmony_ci	case RT5682S_CHOP_ADC:
56862306a36Sopenharmony_ci	case RT5682S_CALIB_ADC_CTRL:
56962306a36Sopenharmony_ci	case RT5682S_VOL_TEST:
57062306a36Sopenharmony_ci	case RT5682S_SPKVDD_DET_ST:
57162306a36Sopenharmony_ci	case RT5682S_TEST_MODE_CTRL_1...RT5682S_TEST_MODE_CTRL_4:
57262306a36Sopenharmony_ci	case RT5682S_PLL_INTERNAL_1...RT5682S_PLL_INTERNAL_4:
57362306a36Sopenharmony_ci	case RT5682S_STO_NG2_CTRL_1...RT5682S_STO_NG2_CTRL_10:
57462306a36Sopenharmony_ci	case RT5682S_STO1_DAC_SIL_DET:
57562306a36Sopenharmony_ci	case RT5682S_SIL_PSV_CTRL1:
57662306a36Sopenharmony_ci	case RT5682S_SIL_PSV_CTRL2:
57762306a36Sopenharmony_ci	case RT5682S_SIL_PSV_CTRL3:
57862306a36Sopenharmony_ci	case RT5682S_SIL_PSV_CTRL4:
57962306a36Sopenharmony_ci	case RT5682S_SIL_PSV_CTRL5:
58062306a36Sopenharmony_ci	case RT5682S_HP_IMP_SENS_CTRL_1...RT5682S_HP_IMP_SENS_CTRL_46:
58162306a36Sopenharmony_ci	case RT5682S_HP_LOGIC_CTRL_1...RT5682S_HP_LOGIC_CTRL_3:
58262306a36Sopenharmony_ci	case RT5682S_HP_CALIB_CTRL_1...RT5682S_HP_CALIB_CTRL_11:
58362306a36Sopenharmony_ci	case RT5682S_HP_CALIB_ST_1...RT5682S_HP_CALIB_ST_11:
58462306a36Sopenharmony_ci	case RT5682S_SAR_IL_CMD_1...RT5682S_SAR_IL_CMD_14:
58562306a36Sopenharmony_ci	case RT5682S_DUMMY_4...RT5682S_DUMMY_6:
58662306a36Sopenharmony_ci	case RT5682S_VERSION_ID_HIDE:
58762306a36Sopenharmony_ci	case RT5682S_VERSION_ID_CUS:
58862306a36Sopenharmony_ci	case RT5682S_SCAN_CTL:
58962306a36Sopenharmony_ci	case RT5682S_HP_AMP_DET:
59062306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_11:
59162306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_12:
59262306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_13:
59362306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_14:
59462306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_15:
59562306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_16:
59662306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_17:
59762306a36Sopenharmony_ci	case RT5682S_BIAS_CUR_CTRL_18:
59862306a36Sopenharmony_ci	case RT5682S_I2C_TRANS_CTRL:
59962306a36Sopenharmony_ci	case RT5682S_DUMMY_7:
60062306a36Sopenharmony_ci	case RT5682S_DUMMY_8:
60162306a36Sopenharmony_ci	case RT5682S_DMIC_FLOAT_DET:
60262306a36Sopenharmony_ci	case RT5682S_HA_CMP_OP_1...RT5682S_HA_CMP_OP_13:
60362306a36Sopenharmony_ci	case RT5682S_HA_CMP_OP_14...RT5682S_HA_CMP_OP_25:
60462306a36Sopenharmony_ci	case RT5682S_NEW_CBJ_DET_CTL_1...RT5682S_NEW_CBJ_DET_CTL_16:
60562306a36Sopenharmony_ci	case RT5682S_DA_FILTER_1...RT5682S_DA_FILTER_5:
60662306a36Sopenharmony_ci	case RT5682S_CLK_SW_TEST_1:
60762306a36Sopenharmony_ci	case RT5682S_CLK_SW_TEST_2:
60862306a36Sopenharmony_ci	case RT5682S_CLK_SW_TEST_3...RT5682S_CLK_SW_TEST_14:
60962306a36Sopenharmony_ci	case RT5682S_EFUSE_MANU_WRITE_1...RT5682S_EFUSE_MANU_WRITE_6:
61062306a36Sopenharmony_ci	case RT5682S_EFUSE_READ_1...RT5682S_EFUSE_READ_18:
61162306a36Sopenharmony_ci	case RT5682S_EFUSE_TIMING_CTL_1:
61262306a36Sopenharmony_ci	case RT5682S_EFUSE_TIMING_CTL_2:
61362306a36Sopenharmony_ci	case RT5682S_PILOT_DIG_CTL_1:
61462306a36Sopenharmony_ci	case RT5682S_PILOT_DIG_CTL_2:
61562306a36Sopenharmony_ci	case RT5682S_HP_AMP_DET_CTL_1...RT5682S_HP_AMP_DET_CTL_4:
61662306a36Sopenharmony_ci		return true;
61762306a36Sopenharmony_ci	default:
61862306a36Sopenharmony_ci		return false;
61962306a36Sopenharmony_ci	}
62062306a36Sopenharmony_ci}
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_cistatic void rt5682s_reset(struct rt5682s_priv *rt5682s)
62362306a36Sopenharmony_ci{
62462306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_RESET, 0);
62562306a36Sopenharmony_ci}
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_cistatic int rt5682s_button_detect(struct snd_soc_component *component)
62862306a36Sopenharmony_ci{
62962306a36Sopenharmony_ci	int btn_type, val;
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci	val = snd_soc_component_read(component, RT5682S_4BTN_IL_CMD_1);
63262306a36Sopenharmony_ci	btn_type = val & 0xfff0;
63362306a36Sopenharmony_ci	snd_soc_component_write(component, RT5682S_4BTN_IL_CMD_1, val);
63462306a36Sopenharmony_ci	dev_dbg(component->dev, "%s btn_type=%x\n", __func__, btn_type);
63562306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_2,
63662306a36Sopenharmony_ci		RT5682S_SAR_ADC_PSV_MASK, RT5682S_SAR_ADC_PSV_ENTRY);
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci	return btn_type;
63962306a36Sopenharmony_ci}
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_cienum {
64262306a36Sopenharmony_ci	SAR_PWR_OFF,
64362306a36Sopenharmony_ci	SAR_PWR_NORMAL,
64462306a36Sopenharmony_ci	SAR_PWR_SAVING,
64562306a36Sopenharmony_ci};
64662306a36Sopenharmony_ci
64762306a36Sopenharmony_cistatic void rt5682s_sar_power_mode(struct snd_soc_component *component, int mode)
64862306a36Sopenharmony_ci{
64962306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
65062306a36Sopenharmony_ci
65162306a36Sopenharmony_ci	mutex_lock(&rt5682s->sar_mutex);
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci	switch (mode) {
65462306a36Sopenharmony_ci	case SAR_PWR_SAVING:
65562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3,
65662306a36Sopenharmony_ci			RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_DIS);
65762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,
65862306a36Sopenharmony_ci			RT5682S_MB1_PATH_MASK | RT5682S_MB2_PATH_MASK,
65962306a36Sopenharmony_ci			RT5682S_CTRL_MB1_REG | RT5682S_CTRL_MB2_REG);
66062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,
66162306a36Sopenharmony_ci			RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK |
66262306a36Sopenharmony_ci			RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS |
66362306a36Sopenharmony_ci			RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU);
66462306a36Sopenharmony_ci		usleep_range(5000, 5500);
66562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,
66662306a36Sopenharmony_ci			RT5682S_SAR_BUTDET_MASK, RT5682S_SAR_BUTDET_EN);
66762306a36Sopenharmony_ci		usleep_range(5000, 5500);
66862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_2,
66962306a36Sopenharmony_ci			RT5682S_SAR_ADC_PSV_MASK, RT5682S_SAR_ADC_PSV_ENTRY);
67062306a36Sopenharmony_ci		break;
67162306a36Sopenharmony_ci	case SAR_PWR_NORMAL:
67262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3,
67362306a36Sopenharmony_ci			RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_EN);
67462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,
67562306a36Sopenharmony_ci			RT5682S_MB1_PATH_MASK | RT5682S_MB2_PATH_MASK,
67662306a36Sopenharmony_ci			RT5682S_CTRL_MB1_FSM | RT5682S_CTRL_MB2_FSM);
67762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,
67862306a36Sopenharmony_ci			RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_SEL_MB1_2_AUTO);
67962306a36Sopenharmony_ci		usleep_range(5000, 5500);
68062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,
68162306a36Sopenharmony_ci			RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK,
68262306a36Sopenharmony_ci			RT5682S_SAR_BUTDET_EN | RT5682S_SAR_BUTDET_POW_NORM);
68362306a36Sopenharmony_ci		break;
68462306a36Sopenharmony_ci	case SAR_PWR_OFF:
68562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,
68662306a36Sopenharmony_ci			RT5682S_MB1_PATH_MASK | RT5682S_MB2_PATH_MASK,
68762306a36Sopenharmony_ci			RT5682S_CTRL_MB1_FSM | RT5682S_CTRL_MB2_FSM);
68862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,
68962306a36Sopenharmony_ci			RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK |
69062306a36Sopenharmony_ci			RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS |
69162306a36Sopenharmony_ci			RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU);
69262306a36Sopenharmony_ci		break;
69362306a36Sopenharmony_ci	default:
69462306a36Sopenharmony_ci		dev_err(component->dev, "Invalid SAR Power mode: %d\n", mode);
69562306a36Sopenharmony_ci		break;
69662306a36Sopenharmony_ci	}
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_ci	mutex_unlock(&rt5682s->sar_mutex);
69962306a36Sopenharmony_ci}
70062306a36Sopenharmony_ci
70162306a36Sopenharmony_cistatic void rt5682s_enable_push_button_irq(struct snd_soc_component *component)
70262306a36Sopenharmony_ci{
70362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_13,
70462306a36Sopenharmony_ci		RT5682S_SAR_SOUR_MASK, RT5682S_SAR_SOUR_BTN);
70562306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,
70662306a36Sopenharmony_ci		RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK |
70762306a36Sopenharmony_ci		RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_EN |
70862306a36Sopenharmony_ci		RT5682S_SAR_BUTDET_POW_NORM | RT5682S_SAR_SEL_MB1_2_AUTO);
70962306a36Sopenharmony_ci	snd_soc_component_write(component, RT5682S_IL_CMD_1, 0x0040);
71062306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_4BTN_IL_CMD_2,
71162306a36Sopenharmony_ci		RT5682S_4BTN_IL_MASK | RT5682S_4BTN_IL_RST_MASK,
71262306a36Sopenharmony_ci		RT5682S_4BTN_IL_EN | RT5682S_4BTN_IL_NOR);
71362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_IRQ_CTRL_3,
71462306a36Sopenharmony_ci		RT5682S_IL_IRQ_MASK, RT5682S_IL_IRQ_EN);
71562306a36Sopenharmony_ci}
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_cistatic void rt5682s_disable_push_button_irq(struct snd_soc_component *component)
71862306a36Sopenharmony_ci{
71962306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_IRQ_CTRL_3,
72062306a36Sopenharmony_ci		RT5682S_IL_IRQ_MASK, RT5682S_IL_IRQ_DIS);
72162306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_4BTN_IL_CMD_2,
72262306a36Sopenharmony_ci		RT5682S_4BTN_IL_MASK, RT5682S_4BTN_IL_DIS);
72362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_13,
72462306a36Sopenharmony_ci		RT5682S_SAR_SOUR_MASK, RT5682S_SAR_SOUR_TYPE);
72562306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,
72662306a36Sopenharmony_ci		RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK |
72762306a36Sopenharmony_ci		RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS |
72862306a36Sopenharmony_ci		RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU);
72962306a36Sopenharmony_ci}
73062306a36Sopenharmony_ci
73162306a36Sopenharmony_ci/**
73262306a36Sopenharmony_ci * rt5682s_headset_detect - Detect headset.
73362306a36Sopenharmony_ci * @component: SoC audio component device.
73462306a36Sopenharmony_ci * @jack_insert: Jack insert or not.
73562306a36Sopenharmony_ci *
73662306a36Sopenharmony_ci * Detect whether is headset or not when jack inserted.
73762306a36Sopenharmony_ci *
73862306a36Sopenharmony_ci * Returns detect status.
73962306a36Sopenharmony_ci */
74062306a36Sopenharmony_cistatic int rt5682s_headset_detect(struct snd_soc_component *component, int jack_insert)
74162306a36Sopenharmony_ci{
74262306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
74362306a36Sopenharmony_ci	unsigned int val, count;
74462306a36Sopenharmony_ci	int jack_type = 0;
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci	if (jack_insert) {
74762306a36Sopenharmony_ci		rt5682s_disable_push_button_irq(component);
74862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,
74962306a36Sopenharmony_ci			RT5682S_PWR_VREF1 | RT5682S_PWR_VREF2 | RT5682S_PWR_MB,
75062306a36Sopenharmony_ci			RT5682S_PWR_VREF1 | RT5682S_PWR_VREF2 | RT5682S_PWR_MB);
75162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,
75262306a36Sopenharmony_ci			RT5682S_PWR_FV1 | RT5682S_PWR_FV2, 0);
75362306a36Sopenharmony_ci		usleep_range(15000, 20000);
75462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,
75562306a36Sopenharmony_ci			RT5682S_PWR_FV1 | RT5682S_PWR_FV2,
75662306a36Sopenharmony_ci			RT5682S_PWR_FV1 | RT5682S_PWR_FV2);
75762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,
75862306a36Sopenharmony_ci			RT5682S_PWR_CBJ, RT5682S_PWR_CBJ);
75962306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682S_SAR_IL_CMD_3, 0x0365);
76062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_HP_CHARGE_PUMP_2,
76162306a36Sopenharmony_ci			RT5682S_OSW_L_MASK | RT5682S_OSW_R_MASK,
76262306a36Sopenharmony_ci			RT5682S_OSW_L_DIS | RT5682S_OSW_R_DIS);
76362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_13,
76462306a36Sopenharmony_ci			RT5682S_SAR_SOUR_MASK, RT5682S_SAR_SOUR_TYPE);
76562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3,
76662306a36Sopenharmony_ci			RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_EN);
76762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,
76862306a36Sopenharmony_ci			RT5682S_TRIG_JD_MASK, RT5682S_TRIG_JD_LOW);
76962306a36Sopenharmony_ci		usleep_range(45000, 50000);
77062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,
77162306a36Sopenharmony_ci			RT5682S_TRIG_JD_MASK, RT5682S_TRIG_JD_HIGH);
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci		count = 0;
77462306a36Sopenharmony_ci		do {
77562306a36Sopenharmony_ci			usleep_range(10000, 15000);
77662306a36Sopenharmony_ci			val = snd_soc_component_read(component, RT5682S_CBJ_CTRL_2)
77762306a36Sopenharmony_ci				& RT5682S_JACK_TYPE_MASK;
77862306a36Sopenharmony_ci			count++;
77962306a36Sopenharmony_ci		} while (val == 0 && count < 50);
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci		dev_dbg(component->dev, "%s, val=%d, count=%d\n", __func__, val, count);
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_ci		switch (val) {
78462306a36Sopenharmony_ci		case 0x1:
78562306a36Sopenharmony_ci		case 0x2:
78662306a36Sopenharmony_ci			jack_type = SND_JACK_HEADSET;
78762306a36Sopenharmony_ci			snd_soc_component_write(component, RT5682S_SAR_IL_CMD_3, 0x024c);
78862306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,
78962306a36Sopenharmony_ci				RT5682S_FAST_OFF_MASK, RT5682S_FAST_OFF_EN);
79062306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,
79162306a36Sopenharmony_ci				RT5682S_SAR_SEL_MB1_2_MASK, val << RT5682S_SAR_SEL_MB1_2_SFT);
79262306a36Sopenharmony_ci			rt5682s_enable_push_button_irq(component);
79362306a36Sopenharmony_ci			rt5682s_sar_power_mode(component, SAR_PWR_SAVING);
79462306a36Sopenharmony_ci			break;
79562306a36Sopenharmony_ci		default:
79662306a36Sopenharmony_ci			jack_type = SND_JACK_HEADPHONE;
79762306a36Sopenharmony_ci			break;
79862306a36Sopenharmony_ci		}
79962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_HP_CHARGE_PUMP_2,
80062306a36Sopenharmony_ci			RT5682S_OSW_L_MASK | RT5682S_OSW_R_MASK,
80162306a36Sopenharmony_ci			RT5682S_OSW_L_EN | RT5682S_OSW_R_EN);
80262306a36Sopenharmony_ci		usleep_range(35000, 40000);
80362306a36Sopenharmony_ci	} else {
80462306a36Sopenharmony_ci		rt5682s_sar_power_mode(component, SAR_PWR_OFF);
80562306a36Sopenharmony_ci		rt5682s_disable_push_button_irq(component);
80662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,
80762306a36Sopenharmony_ci			RT5682S_TRIG_JD_MASK, RT5682S_TRIG_JD_LOW);
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_ci		if (!rt5682s->wclk_enabled) {
81062306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
81162306a36Sopenharmony_ci				RT5682S_PWR_ANLG_1, RT5682S_PWR_VREF2 | RT5682S_PWR_MB, 0);
81262306a36Sopenharmony_ci		}
81362306a36Sopenharmony_ci
81462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,
81562306a36Sopenharmony_ci			RT5682S_PWR_CBJ, 0);
81662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,
81762306a36Sopenharmony_ci			RT5682S_FAST_OFF_MASK, RT5682S_FAST_OFF_DIS);
81862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3,
81962306a36Sopenharmony_ci			RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_DIS);
82062306a36Sopenharmony_ci		jack_type = 0;
82162306a36Sopenharmony_ci	}
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci	dev_dbg(component->dev, "jack_type = %d\n", jack_type);
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_ci	return jack_type;
82662306a36Sopenharmony_ci}
82762306a36Sopenharmony_ci
82862306a36Sopenharmony_cistatic void rt5682s_jack_detect_handler(struct work_struct *work)
82962306a36Sopenharmony_ci{
83062306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
83162306a36Sopenharmony_ci		container_of(work, struct rt5682s_priv, jack_detect_work.work);
83262306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm;
83362306a36Sopenharmony_ci	int val, btn_type;
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_ci	if (!rt5682s->component ||
83662306a36Sopenharmony_ci	    !snd_soc_card_is_instantiated(rt5682s->component->card)) {
83762306a36Sopenharmony_ci		/* card not yet ready, try later */
83862306a36Sopenharmony_ci		mod_delayed_work(system_power_efficient_wq,
83962306a36Sopenharmony_ci				 &rt5682s->jack_detect_work, msecs_to_jiffies(15));
84062306a36Sopenharmony_ci		return;
84162306a36Sopenharmony_ci	}
84262306a36Sopenharmony_ci
84362306a36Sopenharmony_ci	dapm = snd_soc_component_get_dapm(rt5682s->component);
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci	snd_soc_dapm_mutex_lock(dapm);
84662306a36Sopenharmony_ci	mutex_lock(&rt5682s->calibrate_mutex);
84762306a36Sopenharmony_ci	mutex_lock(&rt5682s->wclk_mutex);
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci	val = snd_soc_component_read(rt5682s->component, RT5682S_AJD1_CTRL)
85062306a36Sopenharmony_ci		& RT5682S_JDH_RS_MASK;
85162306a36Sopenharmony_ci	if (!val) {
85262306a36Sopenharmony_ci		/* jack in */
85362306a36Sopenharmony_ci		if (rt5682s->jack_type == 0) {
85462306a36Sopenharmony_ci			/* jack was out, report jack type */
85562306a36Sopenharmony_ci			rt5682s->jack_type = rt5682s_headset_detect(rt5682s->component, 1);
85662306a36Sopenharmony_ci			rt5682s->irq_work_delay_time = 0;
85762306a36Sopenharmony_ci		} else if ((rt5682s->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) {
85862306a36Sopenharmony_ci			/* jack is already in, report button event */
85962306a36Sopenharmony_ci			rt5682s->jack_type = SND_JACK_HEADSET;
86062306a36Sopenharmony_ci			btn_type = rt5682s_button_detect(rt5682s->component);
86162306a36Sopenharmony_ci			/**
86262306a36Sopenharmony_ci			 * rt5682s can report three kinds of button behavior,
86362306a36Sopenharmony_ci			 * one click, double click and hold. However,
86462306a36Sopenharmony_ci			 * currently we will report button pressed/released
86562306a36Sopenharmony_ci			 * event. So all the three button behaviors are
86662306a36Sopenharmony_ci			 * treated as button pressed.
86762306a36Sopenharmony_ci			 */
86862306a36Sopenharmony_ci			switch (btn_type) {
86962306a36Sopenharmony_ci			case 0x8000:
87062306a36Sopenharmony_ci			case 0x4000:
87162306a36Sopenharmony_ci			case 0x2000:
87262306a36Sopenharmony_ci				rt5682s->jack_type |= SND_JACK_BTN_0;
87362306a36Sopenharmony_ci				break;
87462306a36Sopenharmony_ci			case 0x1000:
87562306a36Sopenharmony_ci			case 0x0800:
87662306a36Sopenharmony_ci			case 0x0400:
87762306a36Sopenharmony_ci				rt5682s->jack_type |= SND_JACK_BTN_1;
87862306a36Sopenharmony_ci				break;
87962306a36Sopenharmony_ci			case 0x0200:
88062306a36Sopenharmony_ci			case 0x0100:
88162306a36Sopenharmony_ci			case 0x0080:
88262306a36Sopenharmony_ci				rt5682s->jack_type |= SND_JACK_BTN_2;
88362306a36Sopenharmony_ci				break;
88462306a36Sopenharmony_ci			case 0x0040:
88562306a36Sopenharmony_ci			case 0x0020:
88662306a36Sopenharmony_ci			case 0x0010:
88762306a36Sopenharmony_ci				rt5682s->jack_type |= SND_JACK_BTN_3;
88862306a36Sopenharmony_ci				break;
88962306a36Sopenharmony_ci			case 0x0000: /* unpressed */
89062306a36Sopenharmony_ci				break;
89162306a36Sopenharmony_ci			default:
89262306a36Sopenharmony_ci				dev_err(rt5682s->component->dev,
89362306a36Sopenharmony_ci					"Unexpected button code 0x%04x\n", btn_type);
89462306a36Sopenharmony_ci				break;
89562306a36Sopenharmony_ci			}
89662306a36Sopenharmony_ci		}
89762306a36Sopenharmony_ci	} else {
89862306a36Sopenharmony_ci		/* jack out */
89962306a36Sopenharmony_ci		rt5682s->jack_type = rt5682s_headset_detect(rt5682s->component, 0);
90062306a36Sopenharmony_ci		rt5682s->irq_work_delay_time = 50;
90162306a36Sopenharmony_ci	}
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_ci	mutex_unlock(&rt5682s->wclk_mutex);
90462306a36Sopenharmony_ci	mutex_unlock(&rt5682s->calibrate_mutex);
90562306a36Sopenharmony_ci	snd_soc_dapm_mutex_unlock(dapm);
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_ci	snd_soc_jack_report(rt5682s->hs_jack, rt5682s->jack_type,
90862306a36Sopenharmony_ci		SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |
90962306a36Sopenharmony_ci		SND_JACK_BTN_2 | SND_JACK_BTN_3);
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	if (rt5682s->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |
91262306a36Sopenharmony_ci		SND_JACK_BTN_2 | SND_JACK_BTN_3))
91362306a36Sopenharmony_ci		schedule_delayed_work(&rt5682s->jd_check_work, 0);
91462306a36Sopenharmony_ci	else
91562306a36Sopenharmony_ci		cancel_delayed_work_sync(&rt5682s->jd_check_work);
91662306a36Sopenharmony_ci}
91762306a36Sopenharmony_ci
91862306a36Sopenharmony_cistatic void rt5682s_jd_check_handler(struct work_struct *work)
91962306a36Sopenharmony_ci{
92062306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
92162306a36Sopenharmony_ci		container_of(work, struct rt5682s_priv, jd_check_work.work);
92262306a36Sopenharmony_ci
92362306a36Sopenharmony_ci	if (snd_soc_component_read(rt5682s->component, RT5682S_AJD1_CTRL) & RT5682S_JDH_RS_MASK) {
92462306a36Sopenharmony_ci		/* jack out */
92562306a36Sopenharmony_ci		schedule_delayed_work(&rt5682s->jack_detect_work, 0);
92662306a36Sopenharmony_ci	} else {
92762306a36Sopenharmony_ci		schedule_delayed_work(&rt5682s->jd_check_work, 500);
92862306a36Sopenharmony_ci	}
92962306a36Sopenharmony_ci}
93062306a36Sopenharmony_ci
93162306a36Sopenharmony_cistatic irqreturn_t rt5682s_irq(int irq, void *data)
93262306a36Sopenharmony_ci{
93362306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = data;
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci	mod_delayed_work(system_power_efficient_wq, &rt5682s->jack_detect_work,
93662306a36Sopenharmony_ci		msecs_to_jiffies(rt5682s->irq_work_delay_time));
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci	return IRQ_HANDLED;
93962306a36Sopenharmony_ci}
94062306a36Sopenharmony_ci
94162306a36Sopenharmony_cistatic int rt5682s_set_jack_detect(struct snd_soc_component *component,
94262306a36Sopenharmony_ci		struct snd_soc_jack *hs_jack, void *data)
94362306a36Sopenharmony_ci{
94462306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
94562306a36Sopenharmony_ci	int btndet_delay = 16;
94662306a36Sopenharmony_ci
94762306a36Sopenharmony_ci	rt5682s->hs_jack = hs_jack;
94862306a36Sopenharmony_ci
94962306a36Sopenharmony_ci	if (!hs_jack) {
95062306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_IRQ_CTRL_2,
95162306a36Sopenharmony_ci			RT5682S_JD1_EN_MASK, RT5682S_JD1_DIS);
95262306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_RC_CLK_CTRL,
95362306a36Sopenharmony_ci			RT5682S_POW_JDH, 0);
95462306a36Sopenharmony_ci		cancel_delayed_work_sync(&rt5682s->jack_detect_work);
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci		return 0;
95762306a36Sopenharmony_ci	}
95862306a36Sopenharmony_ci
95962306a36Sopenharmony_ci	switch (rt5682s->pdata.jd_src) {
96062306a36Sopenharmony_ci	case RT5682S_JD1:
96162306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_CBJ_CTRL_5,
96262306a36Sopenharmony_ci			RT5682S_JD_FAST_OFF_SRC_MASK, RT5682S_JD_FAST_OFF_SRC_JDH);
96362306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_CBJ_CTRL_2,
96462306a36Sopenharmony_ci			RT5682S_EXT_JD_SRC, RT5682S_EXT_JD_SRC_MANUAL);
96562306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_CBJ_CTRL_1,
96662306a36Sopenharmony_ci			RT5682S_EMB_JD_MASK | RT5682S_DET_TYPE |
96762306a36Sopenharmony_ci			RT5682S_POL_FAST_OFF_MASK | RT5682S_MIC_CAP_MASK,
96862306a36Sopenharmony_ci			RT5682S_EMB_JD_EN | RT5682S_DET_TYPE |
96962306a36Sopenharmony_ci			RT5682S_POL_FAST_OFF_HIGH | RT5682S_MIC_CAP_HS);
97062306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_SAR_IL_CMD_1,
97162306a36Sopenharmony_ci			RT5682S_SAR_POW_MASK, RT5682S_SAR_POW_EN);
97262306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,
97362306a36Sopenharmony_ci			RT5682S_GP1_PIN_MASK, RT5682S_GP1_PIN_IRQ);
97462306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_PWR_ANLG_3,
97562306a36Sopenharmony_ci			RT5682S_PWR_BGLDO, RT5682S_PWR_BGLDO);
97662306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_PWR_ANLG_2,
97762306a36Sopenharmony_ci			RT5682S_PWR_JD_MASK, RT5682S_PWR_JD_ENABLE);
97862306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_RC_CLK_CTRL,
97962306a36Sopenharmony_ci			RT5682S_POW_IRQ | RT5682S_POW_JDH, RT5682S_POW_IRQ | RT5682S_POW_JDH);
98062306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_IRQ_CTRL_2,
98162306a36Sopenharmony_ci			RT5682S_JD1_EN_MASK | RT5682S_JD1_POL_MASK,
98262306a36Sopenharmony_ci			RT5682S_JD1_EN | RT5682S_JD1_POL_NOR);
98362306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_4BTN_IL_CMD_4,
98462306a36Sopenharmony_ci			RT5682S_4BTN_IL_HOLD_WIN_MASK | RT5682S_4BTN_IL_CLICK_WIN_MASK,
98562306a36Sopenharmony_ci			(btndet_delay << RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay));
98662306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_4BTN_IL_CMD_5,
98762306a36Sopenharmony_ci			RT5682S_4BTN_IL_HOLD_WIN_MASK | RT5682S_4BTN_IL_CLICK_WIN_MASK,
98862306a36Sopenharmony_ci			(btndet_delay << RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay));
98962306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_4BTN_IL_CMD_6,
99062306a36Sopenharmony_ci			RT5682S_4BTN_IL_HOLD_WIN_MASK | RT5682S_4BTN_IL_CLICK_WIN_MASK,
99162306a36Sopenharmony_ci			(btndet_delay << RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay));
99262306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_4BTN_IL_CMD_7,
99362306a36Sopenharmony_ci			RT5682S_4BTN_IL_HOLD_WIN_MASK | RT5682S_4BTN_IL_CLICK_WIN_MASK,
99462306a36Sopenharmony_ci			(btndet_delay << RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay));
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci		mod_delayed_work(system_power_efficient_wq,
99762306a36Sopenharmony_ci			&rt5682s->jack_detect_work, msecs_to_jiffies(250));
99862306a36Sopenharmony_ci		break;
99962306a36Sopenharmony_ci
100062306a36Sopenharmony_ci	case RT5682S_JD_NULL:
100162306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_IRQ_CTRL_2,
100262306a36Sopenharmony_ci			RT5682S_JD1_EN_MASK, RT5682S_JD1_DIS);
100362306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_RC_CLK_CTRL,
100462306a36Sopenharmony_ci			RT5682S_POW_JDH, 0);
100562306a36Sopenharmony_ci		break;
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci	default:
100862306a36Sopenharmony_ci		dev_warn(component->dev, "Wrong JD source\n");
100962306a36Sopenharmony_ci		break;
101062306a36Sopenharmony_ci	}
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_ci	return 0;
101362306a36Sopenharmony_ci}
101462306a36Sopenharmony_ci
101562306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -9562, 75, 0);
101662306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
101762306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
101862306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(cbj_bst_tlv, -1200, 150, 0);
101962306a36Sopenharmony_ci
102062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_snd_controls[] = {
102162306a36Sopenharmony_ci	/* DAC Digital Volume */
102262306a36Sopenharmony_ci	SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682S_DAC1_DIG_VOL,
102362306a36Sopenharmony_ci		RT5682S_L_VOL_SFT + 1, RT5682S_R_VOL_SFT + 1, 127, 0, dac_vol_tlv),
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_ci	/* CBJ Boost Volume */
102662306a36Sopenharmony_ci	SOC_SINGLE_TLV("CBJ Boost Volume", RT5682S_REC_MIXER,
102762306a36Sopenharmony_ci		RT5682S_BST_CBJ_SFT, 35, 0,  cbj_bst_tlv),
102862306a36Sopenharmony_ci
102962306a36Sopenharmony_ci	/* ADC Digital Volume Control */
103062306a36Sopenharmony_ci	SOC_DOUBLE("STO1 ADC Capture Switch", RT5682S_STO1_ADC_DIG_VOL,
103162306a36Sopenharmony_ci		RT5682S_L_MUTE_SFT, RT5682S_R_MUTE_SFT, 1, 1),
103262306a36Sopenharmony_ci	SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682S_STO1_ADC_DIG_VOL,
103362306a36Sopenharmony_ci		RT5682S_L_VOL_SFT + 1, RT5682S_R_VOL_SFT + 1, 63, 0, adc_vol_tlv),
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_ci	/* ADC Boost Volume Control */
103662306a36Sopenharmony_ci	SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682S_STO1_ADC_BOOST,
103762306a36Sopenharmony_ci		RT5682S_STO1_ADC_L_BST_SFT, RT5682S_STO1_ADC_R_BST_SFT, 3, 0, adc_bst_tlv),
103862306a36Sopenharmony_ci};
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci/**
104162306a36Sopenharmony_ci * rt5682s_sel_asrc_clk_src - select ASRC clock source for a set of filters
104262306a36Sopenharmony_ci * @component: SoC audio component device.
104362306a36Sopenharmony_ci * @filter_mask: mask of filters.
104462306a36Sopenharmony_ci * @clk_src: clock source
104562306a36Sopenharmony_ci *
104662306a36Sopenharmony_ci * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5682S can
104762306a36Sopenharmony_ci * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
104862306a36Sopenharmony_ci * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
104962306a36Sopenharmony_ci * ASRC function will track i2s clock and generate a corresponding system clock
105062306a36Sopenharmony_ci * for codec. This function provides an API to select the clock source for a
105162306a36Sopenharmony_ci * set of filters specified by the mask. And the component driver will turn on
105262306a36Sopenharmony_ci * ASRC for these filters if ASRC is selected as their clock source.
105362306a36Sopenharmony_ci */
105462306a36Sopenharmony_ciint rt5682s_sel_asrc_clk_src(struct snd_soc_component *component,
105562306a36Sopenharmony_ci		unsigned int filter_mask, unsigned int clk_src)
105662306a36Sopenharmony_ci{
105762306a36Sopenharmony_ci	switch (clk_src) {
105862306a36Sopenharmony_ci	case RT5682S_CLK_SEL_SYS:
105962306a36Sopenharmony_ci	case RT5682S_CLK_SEL_I2S1_ASRC:
106062306a36Sopenharmony_ci	case RT5682S_CLK_SEL_I2S2_ASRC:
106162306a36Sopenharmony_ci		break;
106262306a36Sopenharmony_ci
106362306a36Sopenharmony_ci	default:
106462306a36Sopenharmony_ci		return -EINVAL;
106562306a36Sopenharmony_ci	}
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci	if (filter_mask & RT5682S_DA_STEREO1_FILTER) {
106862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_TRACK_2,
106962306a36Sopenharmony_ci			RT5682S_FILTER_CLK_SEL_MASK, clk_src << RT5682S_FILTER_CLK_SEL_SFT);
107062306a36Sopenharmony_ci	}
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_ci	if (filter_mask & RT5682S_AD_STEREO1_FILTER) {
107362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_TRACK_3,
107462306a36Sopenharmony_ci			RT5682S_FILTER_CLK_SEL_MASK, clk_src << RT5682S_FILTER_CLK_SEL_SFT);
107562306a36Sopenharmony_ci	}
107662306a36Sopenharmony_ci
107762306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_PLL_TRACK_11,
107862306a36Sopenharmony_ci		RT5682S_ASRCIN_AUTO_CLKOUT_MASK, RT5682S_ASRCIN_AUTO_CLKOUT_EN);
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_ci	return 0;
108162306a36Sopenharmony_ci}
108262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682s_sel_asrc_clk_src);
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_cistatic int rt5682s_div_sel(struct rt5682s_priv *rt5682s,
108562306a36Sopenharmony_ci		int target, const int div[], int size)
108662306a36Sopenharmony_ci{
108762306a36Sopenharmony_ci	int i;
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci	if (rt5682s->sysclk < target) {
109062306a36Sopenharmony_ci		dev_err(rt5682s->component->dev,
109162306a36Sopenharmony_ci			"sysclk rate %d is too low\n", rt5682s->sysclk);
109262306a36Sopenharmony_ci		return 0;
109362306a36Sopenharmony_ci	}
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci	for (i = 0; i < size - 1; i++) {
109662306a36Sopenharmony_ci		dev_dbg(rt5682s->component->dev, "div[%d]=%d\n", i, div[i]);
109762306a36Sopenharmony_ci		if (target * div[i] == rt5682s->sysclk)
109862306a36Sopenharmony_ci			return i;
109962306a36Sopenharmony_ci		if (target * div[i + 1] > rt5682s->sysclk) {
110062306a36Sopenharmony_ci			dev_dbg(rt5682s->component->dev,
110162306a36Sopenharmony_ci				"can't find div for sysclk %d\n", rt5682s->sysclk);
110262306a36Sopenharmony_ci			return i;
110362306a36Sopenharmony_ci		}
110462306a36Sopenharmony_ci	}
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci	if (target * div[i] < rt5682s->sysclk)
110762306a36Sopenharmony_ci		dev_err(rt5682s->component->dev,
110862306a36Sopenharmony_ci			"sysclk rate %d is too high\n", rt5682s->sysclk);
110962306a36Sopenharmony_ci
111062306a36Sopenharmony_ci	return size - 1;
111162306a36Sopenharmony_ci}
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_cistatic int get_clk_info(int sclk, int rate)
111462306a36Sopenharmony_ci{
111562306a36Sopenharmony_ci	int i;
111662306a36Sopenharmony_ci	static const int pd[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};
111762306a36Sopenharmony_ci
111862306a36Sopenharmony_ci	if (sclk <= 0 || rate <= 0)
111962306a36Sopenharmony_ci		return -EINVAL;
112062306a36Sopenharmony_ci
112162306a36Sopenharmony_ci	rate = rate << 8;
112262306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(pd); i++)
112362306a36Sopenharmony_ci		if (sclk == rate * pd[i])
112462306a36Sopenharmony_ci			return i;
112562306a36Sopenharmony_ci
112662306a36Sopenharmony_ci	return -EINVAL;
112762306a36Sopenharmony_ci}
112862306a36Sopenharmony_ci
112962306a36Sopenharmony_ci/**
113062306a36Sopenharmony_ci * set_dmic_clk - Set parameter of dmic.
113162306a36Sopenharmony_ci *
113262306a36Sopenharmony_ci * @w: DAPM widget.
113362306a36Sopenharmony_ci * @kcontrol: The kcontrol of this widget.
113462306a36Sopenharmony_ci * @event: Event id.
113562306a36Sopenharmony_ci *
113662306a36Sopenharmony_ci * Choose dmic clock between 1MHz and 3MHz.
113762306a36Sopenharmony_ci * It is better for clock to approximate 3MHz.
113862306a36Sopenharmony_ci */
113962306a36Sopenharmony_cistatic int set_dmic_clk(struct snd_soc_dapm_widget *w,
114062306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
114162306a36Sopenharmony_ci{
114262306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
114362306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
114462306a36Sopenharmony_ci	int idx, dmic_clk_rate = 3072000;
114562306a36Sopenharmony_ci	static const int div[] = {2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128};
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_ci	if (rt5682s->pdata.dmic_clk_rate)
114862306a36Sopenharmony_ci		dmic_clk_rate = rt5682s->pdata.dmic_clk_rate;
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_ci	idx = rt5682s_div_sel(rt5682s, dmic_clk_rate, div, ARRAY_SIZE(div));
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_DMIC_CTRL_1,
115362306a36Sopenharmony_ci		RT5682S_DMIC_CLK_MASK, idx << RT5682S_DMIC_CLK_SFT);
115462306a36Sopenharmony_ci
115562306a36Sopenharmony_ci	return 0;
115662306a36Sopenharmony_ci}
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci
115962306a36Sopenharmony_cistatic int rt5682s_set_pllb_power(struct rt5682s_priv *rt5682s, int on)
116062306a36Sopenharmony_ci{
116162306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_ci	if (on) {
116462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,
116562306a36Sopenharmony_ci			RT5682S_PWR_LDO_PLLB | RT5682S_PWR_BIAS_PLLB | RT5682S_PWR_PLLB,
116662306a36Sopenharmony_ci			RT5682S_PWR_LDO_PLLB | RT5682S_PWR_BIAS_PLLB | RT5682S_PWR_PLLB);
116762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,
116862306a36Sopenharmony_ci			RT5682S_RSTB_PLLB, RT5682S_RSTB_PLLB);
116962306a36Sopenharmony_ci	} else {
117062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,
117162306a36Sopenharmony_ci			RT5682S_PWR_LDO_PLLB | RT5682S_PWR_BIAS_PLLB |
117262306a36Sopenharmony_ci			RT5682S_RSTB_PLLB | RT5682S_PWR_PLLB, 0);
117362306a36Sopenharmony_ci	}
117462306a36Sopenharmony_ci
117562306a36Sopenharmony_ci	return 0;
117662306a36Sopenharmony_ci}
117762306a36Sopenharmony_ci
117862306a36Sopenharmony_cistatic int set_pllb_event(struct snd_soc_dapm_widget *w,
117962306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
118062306a36Sopenharmony_ci{
118162306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
118262306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
118362306a36Sopenharmony_ci	int on = 0;
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_ci	if (rt5682s->wclk_enabled)
118662306a36Sopenharmony_ci		return 0;
118762306a36Sopenharmony_ci
118862306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event))
118962306a36Sopenharmony_ci		on = 1;
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_ci	rt5682s_set_pllb_power(rt5682s, on);
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci	return 0;
119462306a36Sopenharmony_ci}
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_cistatic void rt5682s_set_filter_clk(struct rt5682s_priv *rt5682s, int reg, int ref)
119762306a36Sopenharmony_ci{
119862306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
119962306a36Sopenharmony_ci	int idx;
120062306a36Sopenharmony_ci	static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};
120162306a36Sopenharmony_ci	static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48};
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci	idx = rt5682s_div_sel(rt5682s, ref, div_f, ARRAY_SIZE(div_f));
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci	snd_soc_component_update_bits(component, reg,
120662306a36Sopenharmony_ci		RT5682S_FILTER_CLK_DIV_MASK, idx << RT5682S_FILTER_CLK_DIV_SFT);
120762306a36Sopenharmony_ci
120862306a36Sopenharmony_ci	/* select over sample rate */
120962306a36Sopenharmony_ci	for (idx = 0; idx < ARRAY_SIZE(div_o); idx++) {
121062306a36Sopenharmony_ci		if (rt5682s->sysclk <= 12288000 * div_o[idx])
121162306a36Sopenharmony_ci			break;
121262306a36Sopenharmony_ci	}
121362306a36Sopenharmony_ci
121462306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_1,
121562306a36Sopenharmony_ci		RT5682S_ADC_OSR_MASK | RT5682S_DAC_OSR_MASK,
121662306a36Sopenharmony_ci		(idx << RT5682S_ADC_OSR_SFT) | (idx << RT5682S_DAC_OSR_SFT));
121762306a36Sopenharmony_ci}
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_cistatic int set_filter_clk(struct snd_soc_dapm_widget *w,
122062306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
122162306a36Sopenharmony_ci{
122262306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
122362306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
122462306a36Sopenharmony_ci	int ref, reg, val;
122562306a36Sopenharmony_ci
122662306a36Sopenharmony_ci	val = snd_soc_component_read(component, RT5682S_GPIO_CTRL_1)
122762306a36Sopenharmony_ci			& RT5682S_GP4_PIN_MASK;
122862306a36Sopenharmony_ci
122962306a36Sopenharmony_ci	if (w->shift == RT5682S_PWR_ADC_S1F_BIT && val == RT5682S_GP4_PIN_ADCDAT2)
123062306a36Sopenharmony_ci		ref = 256 * rt5682s->lrck[RT5682S_AIF2];
123162306a36Sopenharmony_ci	else
123262306a36Sopenharmony_ci		ref = 256 * rt5682s->lrck[RT5682S_AIF1];
123362306a36Sopenharmony_ci
123462306a36Sopenharmony_ci	if (w->shift == RT5682S_PWR_ADC_S1F_BIT)
123562306a36Sopenharmony_ci		reg = RT5682S_PLL_TRACK_3;
123662306a36Sopenharmony_ci	else
123762306a36Sopenharmony_ci		reg = RT5682S_PLL_TRACK_2;
123862306a36Sopenharmony_ci
123962306a36Sopenharmony_ci	rt5682s_set_filter_clk(rt5682s, reg, ref);
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_ci	return 0;
124262306a36Sopenharmony_ci}
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_cistatic int set_dmic_power(struct snd_soc_dapm_widget *w,
124562306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
124662306a36Sopenharmony_ci{
124762306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
124862306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
124962306a36Sopenharmony_ci	unsigned int delay = 50, val;
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci	if (rt5682s->pdata.dmic_delay)
125262306a36Sopenharmony_ci		delay = rt5682s->pdata.dmic_delay;
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_ci	switch (event) {
125562306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
125662306a36Sopenharmony_ci		val = (snd_soc_component_read(component, RT5682S_GLB_CLK)
125762306a36Sopenharmony_ci			& RT5682S_SCLK_SRC_MASK) >> RT5682S_SCLK_SRC_SFT;
125862306a36Sopenharmony_ci		if (val == RT5682S_CLK_SRC_PLL1 || val == RT5682S_CLK_SRC_PLL2)
125962306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,
126062306a36Sopenharmony_ci				RT5682S_PWR_VREF2 | RT5682S_PWR_MB,
126162306a36Sopenharmony_ci				RT5682S_PWR_VREF2 | RT5682S_PWR_MB);
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_ci		/*Add delay to avoid pop noise*/
126462306a36Sopenharmony_ci		msleep(delay);
126562306a36Sopenharmony_ci		break;
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
126862306a36Sopenharmony_ci		if (!rt5682s->jack_type && !rt5682s->wclk_enabled) {
126962306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,
127062306a36Sopenharmony_ci				RT5682S_PWR_VREF2 | RT5682S_PWR_MB, 0);
127162306a36Sopenharmony_ci		}
127262306a36Sopenharmony_ci		break;
127362306a36Sopenharmony_ci	}
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	return 0;
127662306a36Sopenharmony_ci}
127762306a36Sopenharmony_ci
127862306a36Sopenharmony_cistatic void rt5682s_set_i2s(struct rt5682s_priv *rt5682s, int id, int on)
127962306a36Sopenharmony_ci{
128062306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
128162306a36Sopenharmony_ci	int pre_div;
128262306a36Sopenharmony_ci	unsigned int p_reg, p_mask, p_sft;
128362306a36Sopenharmony_ci	unsigned int c_reg, c_mask, c_sft;
128462306a36Sopenharmony_ci
128562306a36Sopenharmony_ci	if (id == RT5682S_AIF1) {
128662306a36Sopenharmony_ci		c_reg = RT5682S_ADDA_CLK_1;
128762306a36Sopenharmony_ci		c_mask = RT5682S_I2S_M_D_MASK;
128862306a36Sopenharmony_ci		c_sft = RT5682S_I2S_M_D_SFT;
128962306a36Sopenharmony_ci		p_reg = RT5682S_PWR_DIG_1;
129062306a36Sopenharmony_ci		p_mask = RT5682S_PWR_I2S1;
129162306a36Sopenharmony_ci		p_sft = RT5682S_PWR_I2S1_BIT;
129262306a36Sopenharmony_ci	} else {
129362306a36Sopenharmony_ci		c_reg = RT5682S_I2S2_M_CLK_CTRL_1;
129462306a36Sopenharmony_ci		c_mask = RT5682S_I2S2_M_D_MASK;
129562306a36Sopenharmony_ci		c_sft = RT5682S_I2S2_M_D_SFT;
129662306a36Sopenharmony_ci		p_reg = RT5682S_PWR_DIG_1;
129762306a36Sopenharmony_ci		p_mask = RT5682S_PWR_I2S2;
129862306a36Sopenharmony_ci		p_sft = RT5682S_PWR_I2S2_BIT;
129962306a36Sopenharmony_ci	}
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_ci	if (on && rt5682s->master[id]) {
130262306a36Sopenharmony_ci		pre_div = get_clk_info(rt5682s->sysclk, rt5682s->lrck[id]);
130362306a36Sopenharmony_ci		if (pre_div < 0) {
130462306a36Sopenharmony_ci			dev_err(component->dev, "get pre_div failed\n");
130562306a36Sopenharmony_ci			return;
130662306a36Sopenharmony_ci		}
130762306a36Sopenharmony_ci
130862306a36Sopenharmony_ci		dev_dbg(component->dev, "lrck is %dHz and pre_div is %d for iis %d master\n",
130962306a36Sopenharmony_ci			rt5682s->lrck[id], pre_div, id);
131062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, c_reg, c_mask, pre_div << c_sft);
131162306a36Sopenharmony_ci	}
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, p_reg, p_mask, on << p_sft);
131462306a36Sopenharmony_ci}
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_cistatic int set_i2s_event(struct snd_soc_dapm_widget *w,
131762306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
131862306a36Sopenharmony_ci{
131962306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
132062306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
132162306a36Sopenharmony_ci	int on = 0;
132262306a36Sopenharmony_ci
132362306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event))
132462306a36Sopenharmony_ci		on = 1;
132562306a36Sopenharmony_ci
132662306a36Sopenharmony_ci	if (!strcmp(w->name, "I2S1") && !rt5682s->wclk_enabled)
132762306a36Sopenharmony_ci		rt5682s_set_i2s(rt5682s, RT5682S_AIF1, on);
132862306a36Sopenharmony_ci	else if (!strcmp(w->name, "I2S2"))
132962306a36Sopenharmony_ci		rt5682s_set_i2s(rt5682s, RT5682S_AIF2, on);
133062306a36Sopenharmony_ci
133162306a36Sopenharmony_ci	return 0;
133262306a36Sopenharmony_ci}
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_cistatic int is_sys_clk_from_plla(struct snd_soc_dapm_widget *w,
133562306a36Sopenharmony_ci		struct snd_soc_dapm_widget *sink)
133662306a36Sopenharmony_ci{
133762306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
133862306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
133962306a36Sopenharmony_ci
134062306a36Sopenharmony_ci	if ((rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL1) ||
134162306a36Sopenharmony_ci	    (rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL2 && rt5682s->pll_comb == USE_PLLAB))
134262306a36Sopenharmony_ci		return 1;
134362306a36Sopenharmony_ci
134462306a36Sopenharmony_ci	return 0;
134562306a36Sopenharmony_ci}
134662306a36Sopenharmony_ci
134762306a36Sopenharmony_cistatic int is_sys_clk_from_pllb(struct snd_soc_dapm_widget *w,
134862306a36Sopenharmony_ci		struct snd_soc_dapm_widget *sink)
134962306a36Sopenharmony_ci{
135062306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
135162306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
135262306a36Sopenharmony_ci
135362306a36Sopenharmony_ci	if (rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL2)
135462306a36Sopenharmony_ci		return 1;
135562306a36Sopenharmony_ci
135662306a36Sopenharmony_ci	return 0;
135762306a36Sopenharmony_ci}
135862306a36Sopenharmony_ci
135962306a36Sopenharmony_cistatic int is_using_asrc(struct snd_soc_dapm_widget *w,
136062306a36Sopenharmony_ci		struct snd_soc_dapm_widget *sink)
136162306a36Sopenharmony_ci{
136262306a36Sopenharmony_ci	unsigned int reg, sft, val;
136362306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
136462306a36Sopenharmony_ci
136562306a36Sopenharmony_ci	switch (w->shift) {
136662306a36Sopenharmony_ci	case RT5682S_ADC_STO1_ASRC_SFT:
136762306a36Sopenharmony_ci		reg = RT5682S_PLL_TRACK_3;
136862306a36Sopenharmony_ci		sft = RT5682S_FILTER_CLK_SEL_SFT;
136962306a36Sopenharmony_ci		break;
137062306a36Sopenharmony_ci	case RT5682S_DAC_STO1_ASRC_SFT:
137162306a36Sopenharmony_ci		reg = RT5682S_PLL_TRACK_2;
137262306a36Sopenharmony_ci		sft = RT5682S_FILTER_CLK_SEL_SFT;
137362306a36Sopenharmony_ci		break;
137462306a36Sopenharmony_ci	default:
137562306a36Sopenharmony_ci		return 0;
137662306a36Sopenharmony_ci	}
137762306a36Sopenharmony_ci
137862306a36Sopenharmony_ci	val = (snd_soc_component_read(component, reg) >> sft) & 0xf;
137962306a36Sopenharmony_ci	switch (val) {
138062306a36Sopenharmony_ci	case RT5682S_CLK_SEL_I2S1_ASRC:
138162306a36Sopenharmony_ci	case RT5682S_CLK_SEL_I2S2_ASRC:
138262306a36Sopenharmony_ci		return 1;
138362306a36Sopenharmony_ci	default:
138462306a36Sopenharmony_ci		return 0;
138562306a36Sopenharmony_ci	}
138662306a36Sopenharmony_ci}
138762306a36Sopenharmony_ci
138862306a36Sopenharmony_cistatic int rt5682s_hp_amp_event(struct snd_soc_dapm_widget *w,
138962306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
139062306a36Sopenharmony_ci{
139162306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
139262306a36Sopenharmony_ci
139362306a36Sopenharmony_ci	switch (event) {
139462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
139562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_DEPOP_1,
139662306a36Sopenharmony_ci			RT5682S_OUT_HP_L_EN | RT5682S_OUT_HP_R_EN,
139762306a36Sopenharmony_ci			RT5682S_OUT_HP_L_EN | RT5682S_OUT_HP_R_EN);
139862306a36Sopenharmony_ci		usleep_range(15000, 20000);
139962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_DEPOP_1,
140062306a36Sopenharmony_ci			RT5682S_LDO_PUMP_EN | RT5682S_PUMP_EN |
140162306a36Sopenharmony_ci			RT5682S_CAPLESS_L_EN | RT5682S_CAPLESS_R_EN,
140262306a36Sopenharmony_ci			RT5682S_LDO_PUMP_EN | RT5682S_PUMP_EN |
140362306a36Sopenharmony_ci			RT5682S_CAPLESS_L_EN | RT5682S_CAPLESS_R_EN);
140462306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682S_BIAS_CUR_CTRL_11, 0x6666);
140562306a36Sopenharmony_ci		snd_soc_component_write(component, RT5682S_BIAS_CUR_CTRL_12, 0xa82a);
140662306a36Sopenharmony_ci
140762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_HP_CTRL_2,
140862306a36Sopenharmony_ci			RT5682S_HPO_L_PATH_MASK | RT5682S_HPO_R_PATH_MASK |
140962306a36Sopenharmony_ci			RT5682S_HPO_SEL_IP_EN_SW, RT5682S_HPO_L_PATH_EN |
141062306a36Sopenharmony_ci			RT5682S_HPO_R_PATH_EN | RT5682S_HPO_IP_EN_GATING);
141162306a36Sopenharmony_ci		usleep_range(5000, 10000);
141262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_HP_AMP_DET_CTL_1,
141362306a36Sopenharmony_ci			RT5682S_CP_SW_SIZE_MASK, RT5682S_CP_SW_SIZE_L | RT5682S_CP_SW_SIZE_S);
141462306a36Sopenharmony_ci		break;
141562306a36Sopenharmony_ci
141662306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
141762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_HP_CTRL_2,
141862306a36Sopenharmony_ci			RT5682S_HPO_L_PATH_MASK | RT5682S_HPO_R_PATH_MASK |
141962306a36Sopenharmony_ci			RT5682S_HPO_SEL_IP_EN_SW, 0);
142062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_HP_AMP_DET_CTL_1,
142162306a36Sopenharmony_ci			RT5682S_CP_SW_SIZE_MASK, RT5682S_CP_SW_SIZE_M);
142262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_DEPOP_1,
142362306a36Sopenharmony_ci			RT5682S_LDO_PUMP_EN | RT5682S_PUMP_EN |
142462306a36Sopenharmony_ci			RT5682S_CAPLESS_L_EN | RT5682S_CAPLESS_R_EN, 0);
142562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_DEPOP_1,
142662306a36Sopenharmony_ci			RT5682S_OUT_HP_L_EN | RT5682S_OUT_HP_R_EN, 0);
142762306a36Sopenharmony_ci		break;
142862306a36Sopenharmony_ci	}
142962306a36Sopenharmony_ci
143062306a36Sopenharmony_ci	return 0;
143162306a36Sopenharmony_ci}
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_cistatic int rt5682s_stereo1_adc_mixl_event(struct snd_soc_dapm_widget *w,
143462306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
143562306a36Sopenharmony_ci{
143662306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
143762306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
143862306a36Sopenharmony_ci	unsigned int delay = 0;
143962306a36Sopenharmony_ci
144062306a36Sopenharmony_ci	if (rt5682s->pdata.amic_delay)
144162306a36Sopenharmony_ci		delay = rt5682s->pdata.amic_delay;
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_ci	switch (event) {
144462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
144562306a36Sopenharmony_ci		msleep(delay);
144662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_STO1_ADC_DIG_VOL,
144762306a36Sopenharmony_ci			RT5682S_L_MUTE, 0);
144862306a36Sopenharmony_ci		break;
144962306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
145062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_STO1_ADC_DIG_VOL,
145162306a36Sopenharmony_ci			RT5682S_L_MUTE, RT5682S_L_MUTE);
145262306a36Sopenharmony_ci		break;
145362306a36Sopenharmony_ci	}
145462306a36Sopenharmony_ci
145562306a36Sopenharmony_ci	return 0;
145662306a36Sopenharmony_ci}
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_cistatic int sar_power_event(struct snd_soc_dapm_widget *w,
145962306a36Sopenharmony_ci		struct snd_kcontrol *kcontrol, int event)
146062306a36Sopenharmony_ci{
146162306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
146262306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci	if ((rt5682s->jack_type & SND_JACK_HEADSET) != SND_JACK_HEADSET)
146562306a36Sopenharmony_ci		return 0;
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_ci	switch (event) {
146862306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
146962306a36Sopenharmony_ci		rt5682s_sar_power_mode(component, SAR_PWR_NORMAL);
147062306a36Sopenharmony_ci		break;
147162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
147262306a36Sopenharmony_ci		rt5682s_sar_power_mode(component, SAR_PWR_SAVING);
147362306a36Sopenharmony_ci		break;
147462306a36Sopenharmony_ci	}
147562306a36Sopenharmony_ci
147662306a36Sopenharmony_ci	return 0;
147762306a36Sopenharmony_ci}
147862306a36Sopenharmony_ci
147962306a36Sopenharmony_ci/* Interface data select */
148062306a36Sopenharmony_cistatic const char * const rt5682s_data_select[] = {
148162306a36Sopenharmony_ci	"L/R", "R/L", "L/L", "R/R"
148262306a36Sopenharmony_ci};
148362306a36Sopenharmony_ci
148462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_if2_adc_enum, RT5682S_DIG_INF2_DATA,
148562306a36Sopenharmony_ci	RT5682S_IF2_ADC_SEL_SFT, rt5682s_data_select);
148662306a36Sopenharmony_ci
148762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_if1_01_adc_enum, RT5682S_TDM_ADDA_CTRL_1,
148862306a36Sopenharmony_ci	RT5682S_IF1_ADC1_SEL_SFT, rt5682s_data_select);
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_if1_23_adc_enum, RT5682S_TDM_ADDA_CTRL_1,
149162306a36Sopenharmony_ci	RT5682S_IF1_ADC2_SEL_SFT, rt5682s_data_select);
149262306a36Sopenharmony_ci
149362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_if1_45_adc_enum, RT5682S_TDM_ADDA_CTRL_1,
149462306a36Sopenharmony_ci	RT5682S_IF1_ADC3_SEL_SFT, rt5682s_data_select);
149562306a36Sopenharmony_ci
149662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_if1_67_adc_enum, RT5682S_TDM_ADDA_CTRL_1,
149762306a36Sopenharmony_ci	RT5682S_IF1_ADC4_SEL_SFT, rt5682s_data_select);
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_if2_adc_swap_mux =
150062306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC Swap Mux", rt5682s_if2_adc_enum);
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_if1_01_adc_swap_mux =
150362306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 01 ADC Swap Mux", rt5682s_if1_01_adc_enum);
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_if1_23_adc_swap_mux =
150662306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 23 ADC Swap Mux", rt5682s_if1_23_adc_enum);
150762306a36Sopenharmony_ci
150862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_if1_45_adc_swap_mux =
150962306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 45 ADC Swap Mux", rt5682s_if1_45_adc_enum);
151062306a36Sopenharmony_ci
151162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_if1_67_adc_swap_mux =
151262306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 67 ADC Swap Mux", rt5682s_if1_67_adc_enum);
151362306a36Sopenharmony_ci
151462306a36Sopenharmony_ci/* Digital Mixer */
151562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_adc_l_mix[] = {
151662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5682S_STO1_ADC_MIXER,
151762306a36Sopenharmony_ci			RT5682S_M_STO1_ADC_L1_SFT, 1, 1),
151862306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5682S_STO1_ADC_MIXER,
151962306a36Sopenharmony_ci			RT5682S_M_STO1_ADC_L2_SFT, 1, 1),
152062306a36Sopenharmony_ci};
152162306a36Sopenharmony_ci
152262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_adc_r_mix[] = {
152362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5682S_STO1_ADC_MIXER,
152462306a36Sopenharmony_ci			RT5682S_M_STO1_ADC_R1_SFT, 1, 1),
152562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5682S_STO1_ADC_MIXER,
152662306a36Sopenharmony_ci			RT5682S_M_STO1_ADC_R2_SFT, 1, 1),
152762306a36Sopenharmony_ci};
152862306a36Sopenharmony_ci
152962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_dac_l_mix[] = {
153062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682S_AD_DA_MIXER,
153162306a36Sopenharmony_ci			RT5682S_M_ADCMIX_L_SFT, 1, 1),
153262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC1 Switch", RT5682S_AD_DA_MIXER,
153362306a36Sopenharmony_ci			RT5682S_M_DAC1_L_SFT, 1, 1),
153462306a36Sopenharmony_ci};
153562306a36Sopenharmony_ci
153662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_dac_r_mix[] = {
153762306a36Sopenharmony_ci	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682S_AD_DA_MIXER,
153862306a36Sopenharmony_ci			RT5682S_M_ADCMIX_R_SFT, 1, 1),
153962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC1 Switch", RT5682S_AD_DA_MIXER,
154062306a36Sopenharmony_ci			RT5682S_M_DAC1_R_SFT, 1, 1),
154162306a36Sopenharmony_ci};
154262306a36Sopenharmony_ci
154362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_dac_l_mix[] = {
154462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC L1 Switch", RT5682S_STO1_DAC_MIXER,
154562306a36Sopenharmony_ci			RT5682S_M_DAC_L1_STO_L_SFT, 1, 1),
154662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC R1 Switch", RT5682S_STO1_DAC_MIXER,
154762306a36Sopenharmony_ci			RT5682S_M_DAC_R1_STO_L_SFT, 1, 1),
154862306a36Sopenharmony_ci};
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_dac_r_mix[] = {
155162306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC L1 Switch", RT5682S_STO1_DAC_MIXER,
155262306a36Sopenharmony_ci			RT5682S_M_DAC_L1_STO_R_SFT, 1, 1),
155362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC R1 Switch", RT5682S_STO1_DAC_MIXER,
155462306a36Sopenharmony_ci			RT5682S_M_DAC_R1_STO_R_SFT, 1, 1),
155562306a36Sopenharmony_ci};
155662306a36Sopenharmony_ci
155762306a36Sopenharmony_ci/* Analog Input Mixer */
155862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_rec1_l_mix[] = {
155962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("CBJ Switch", RT5682S_REC_MIXER,
156062306a36Sopenharmony_ci			RT5682S_M_CBJ_RM1_L_SFT, 1, 1),
156162306a36Sopenharmony_ci};
156262306a36Sopenharmony_ci
156362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_rec1_r_mix[] = {
156462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("CBJ Switch", RT5682S_REC_MIXER,
156562306a36Sopenharmony_ci			RT5682S_M_CBJ_RM1_R_SFT, 1, 1),
156662306a36Sopenharmony_ci};
156762306a36Sopenharmony_ci
156862306a36Sopenharmony_ci/* STO1 ADC1 Source */
156962306a36Sopenharmony_ci/* MX-26 [13] [5] */
157062306a36Sopenharmony_cistatic const char * const rt5682s_sto1_adc1_src[] = {
157162306a36Sopenharmony_ci	"DAC MIX", "ADC"
157262306a36Sopenharmony_ci};
157362306a36Sopenharmony_ci
157462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc1l_enum, RT5682S_STO1_ADC_MIXER,
157562306a36Sopenharmony_ci	RT5682S_STO1_ADC1L_SRC_SFT, rt5682s_sto1_adc1_src);
157662306a36Sopenharmony_ci
157762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_adc1l_mux =
157862306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682s_sto1_adc1l_enum);
157962306a36Sopenharmony_ci
158062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc1r_enum, RT5682S_STO1_ADC_MIXER,
158162306a36Sopenharmony_ci	RT5682S_STO1_ADC1R_SRC_SFT, rt5682s_sto1_adc1_src);
158262306a36Sopenharmony_ci
158362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_adc1r_mux =
158462306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682s_sto1_adc1r_enum);
158562306a36Sopenharmony_ci
158662306a36Sopenharmony_ci/* STO1 ADC Source */
158762306a36Sopenharmony_ci/* MX-26 [11:10] [3:2] */
158862306a36Sopenharmony_cistatic const char * const rt5682s_sto1_adc_src[] = {
158962306a36Sopenharmony_ci	"ADC1 L", "ADC1 R"
159062306a36Sopenharmony_ci};
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adcl_enum, RT5682S_STO1_ADC_MIXER,
159362306a36Sopenharmony_ci	RT5682S_STO1_ADCL_SRC_SFT, rt5682s_sto1_adc_src);
159462306a36Sopenharmony_ci
159562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_adcl_mux =
159662306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5682s_sto1_adcl_enum);
159762306a36Sopenharmony_ci
159862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adcr_enum, RT5682S_STO1_ADC_MIXER,
159962306a36Sopenharmony_ci	RT5682S_STO1_ADCR_SRC_SFT, rt5682s_sto1_adc_src);
160062306a36Sopenharmony_ci
160162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_adcr_mux =
160262306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5682s_sto1_adcr_enum);
160362306a36Sopenharmony_ci
160462306a36Sopenharmony_ci/* STO1 ADC2 Source */
160562306a36Sopenharmony_ci/* MX-26 [12] [4] */
160662306a36Sopenharmony_cistatic const char * const rt5682s_sto1_adc2_src[] = {
160762306a36Sopenharmony_ci	"DAC MIX", "DMIC"
160862306a36Sopenharmony_ci};
160962306a36Sopenharmony_ci
161062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc2l_enum, RT5682S_STO1_ADC_MIXER,
161162306a36Sopenharmony_ci	RT5682S_STO1_ADC2L_SRC_SFT, rt5682s_sto1_adc2_src);
161262306a36Sopenharmony_ci
161362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_adc2l_mux =
161462306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5682s_sto1_adc2l_enum);
161562306a36Sopenharmony_ci
161662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc2r_enum, RT5682S_STO1_ADC_MIXER,
161762306a36Sopenharmony_ci	RT5682S_STO1_ADC2R_SRC_SFT, rt5682s_sto1_adc2_src);
161862306a36Sopenharmony_ci
161962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_sto1_adc2r_mux =
162062306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5682s_sto1_adc2r_enum);
162162306a36Sopenharmony_ci
162262306a36Sopenharmony_ci/* MX-79 [6:4] I2S1 ADC data location */
162362306a36Sopenharmony_cistatic const unsigned int rt5682s_if1_adc_slot_values[] = {
162462306a36Sopenharmony_ci	0, 2, 4, 6,
162562306a36Sopenharmony_ci};
162662306a36Sopenharmony_ci
162762306a36Sopenharmony_cistatic const char * const rt5682s_if1_adc_slot_src[] = {
162862306a36Sopenharmony_ci	"Slot 0", "Slot 2", "Slot 4", "Slot 6"
162962306a36Sopenharmony_ci};
163062306a36Sopenharmony_ci
163162306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682s_if1_adc_slot_enum,
163262306a36Sopenharmony_ci	RT5682S_TDM_CTRL, RT5682S_TDM_ADC_LCA_SFT, RT5682S_TDM_ADC_LCA_MASK,
163362306a36Sopenharmony_ci	rt5682s_if1_adc_slot_src, rt5682s_if1_adc_slot_values);
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_if1_adc_slot_mux =
163662306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC Slot location", rt5682s_if1_adc_slot_enum);
163762306a36Sopenharmony_ci
163862306a36Sopenharmony_ci/* Analog DAC L1 Source, Analog DAC R1 Source*/
163962306a36Sopenharmony_ci/* MX-2B [4], MX-2B [0]*/
164062306a36Sopenharmony_cistatic const char * const rt5682s_alg_dac1_src[] = {
164162306a36Sopenharmony_ci	"Stereo1 DAC Mixer", "DAC1"
164262306a36Sopenharmony_ci};
164362306a36Sopenharmony_ci
164462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_alg_dac_l1_enum, RT5682S_A_DAC1_MUX,
164562306a36Sopenharmony_ci	RT5682S_A_DACL1_SFT, rt5682s_alg_dac1_src);
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_alg_dac_l1_mux =
164862306a36Sopenharmony_ci	SOC_DAPM_ENUM("Analog DAC L1 Source", rt5682s_alg_dac_l1_enum);
164962306a36Sopenharmony_ci
165062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682s_alg_dac_r1_enum, RT5682S_A_DAC1_MUX,
165162306a36Sopenharmony_ci	RT5682S_A_DACR1_SFT, rt5682s_alg_dac1_src);
165262306a36Sopenharmony_ci
165362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_alg_dac_r1_mux =
165462306a36Sopenharmony_ci	SOC_DAPM_ENUM("Analog DAC R1 Source", rt5682s_alg_dac_r1_enum);
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_cistatic const unsigned int rt5682s_adcdat_pin_values[] = {
165762306a36Sopenharmony_ci	1, 3,
165862306a36Sopenharmony_ci};
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_cistatic const char * const rt5682s_adcdat_pin_select[] = {
166162306a36Sopenharmony_ci	"ADCDAT1", "ADCDAT2",
166262306a36Sopenharmony_ci};
166362306a36Sopenharmony_ci
166462306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682s_adcdat_pin_enum,
166562306a36Sopenharmony_ci	RT5682S_GPIO_CTRL_1, RT5682S_GP4_PIN_SFT, RT5682S_GP4_PIN_MASK,
166662306a36Sopenharmony_ci	rt5682s_adcdat_pin_select, rt5682s_adcdat_pin_values);
166762306a36Sopenharmony_ci
166862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682s_adcdat_pin_ctrl =
166962306a36Sopenharmony_ci	SOC_DAPM_ENUM("ADCDAT", rt5682s_adcdat_pin_enum);
167062306a36Sopenharmony_ci
167162306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5682s_dapm_widgets[] = {
167262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("LDO MB1", RT5682S_PWR_ANLG_3,
167362306a36Sopenharmony_ci		RT5682S_PWR_LDO_MB1_BIT, 0, NULL, 0),
167462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("LDO MB2", RT5682S_PWR_ANLG_3,
167562306a36Sopenharmony_ci		RT5682S_PWR_LDO_MB2_BIT, 0, NULL, 0),
167662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("LDO", RT5682S_PWR_ANLG_3,
167762306a36Sopenharmony_ci		RT5682S_PWR_LDO_BIT, 0, NULL, 0),
167862306a36Sopenharmony_ci
167962306a36Sopenharmony_ci	/* PLL Powers */
168062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("PLLA_LDO", 0, RT5682S_PWR_ANLG_3,
168162306a36Sopenharmony_ci		RT5682S_PWR_LDO_PLLA_BIT, 0, NULL, 0),
168262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("PLLA_BIAS", 0, RT5682S_PWR_ANLG_3,
168362306a36Sopenharmony_ci		RT5682S_PWR_BIAS_PLLA_BIT, 0, NULL, 0),
168462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("PLLA", 0, RT5682S_PWR_ANLG_3,
168562306a36Sopenharmony_ci		RT5682S_PWR_PLLA_BIT, 0, NULL, 0),
168662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("PLLA_RST", 1, RT5682S_PWR_ANLG_3,
168762306a36Sopenharmony_ci		RT5682S_RSTB_PLLA_BIT, 0, NULL, 0),
168862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("PLLB", SND_SOC_NOPM, 0, 0,
168962306a36Sopenharmony_ci		set_pllb_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci	/* ASRC */
169262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682S_PLL_TRACK_1,
169362306a36Sopenharmony_ci		RT5682S_DAC_STO1_ASRC_SFT, 0, NULL, 0),
169462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5682S_PLL_TRACK_1,
169562306a36Sopenharmony_ci		RT5682S_ADC_STO1_ASRC_SFT, 0, NULL, 0),
169662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AD ASRC", 1, RT5682S_PLL_TRACK_1,
169762306a36Sopenharmony_ci		RT5682S_AD_ASRC_SFT, 0, NULL, 0),
169862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DA ASRC", 1, RT5682S_PLL_TRACK_1,
169962306a36Sopenharmony_ci		RT5682S_DA_ASRC_SFT, 0, NULL, 0),
170062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC ASRC", 1, RT5682S_PLL_TRACK_1,
170162306a36Sopenharmony_ci		RT5682S_DMIC_ASRC_SFT, 0, NULL, 0),
170262306a36Sopenharmony_ci
170362306a36Sopenharmony_ci	/* Input Side */
170462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5682S_PWR_ANLG_2,
170562306a36Sopenharmony_ci		RT5682S_PWR_MB1_BIT, 0, NULL, 0),
170662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5682S_PWR_ANLG_2,
170762306a36Sopenharmony_ci		RT5682S_PWR_MB2_BIT, 0, NULL, 0),
170862306a36Sopenharmony_ci
170962306a36Sopenharmony_ci	/* Input Lines */
171062306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC L1"),
171162306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC R1"),
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("IN1P"),
171462306a36Sopenharmony_ci
171562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
171662306a36Sopenharmony_ci		set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
171762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5682S_DMIC_CTRL_1, RT5682S_DMIC_1_EN_SFT, 0,
171862306a36Sopenharmony_ci		set_dmic_power, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
171962306a36Sopenharmony_ci
172062306a36Sopenharmony_ci	/* Boost */
172162306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM, 0, 0, NULL, 0),
172262306a36Sopenharmony_ci
172362306a36Sopenharmony_ci	/* REC Mixer */
172462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682s_rec1_l_mix,
172562306a36Sopenharmony_ci		ARRAY_SIZE(rt5682s_rec1_l_mix)),
172662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RECMIX1R", SND_SOC_NOPM, 0, 0, rt5682s_rec1_r_mix,
172762306a36Sopenharmony_ci		ARRAY_SIZE(rt5682s_rec1_r_mix)),
172862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5682S_CAL_REC,
172962306a36Sopenharmony_ci		RT5682S_PWR_RM1_L_BIT, 0, NULL, 0),
173062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("RECMIX1R Power", RT5682S_CAL_REC,
173162306a36Sopenharmony_ci		RT5682S_PWR_RM1_R_BIT, 0, NULL, 0),
173262306a36Sopenharmony_ci
173362306a36Sopenharmony_ci	/* ADCs */
173462306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),
173562306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),
173662306a36Sopenharmony_ci
173762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5682S_PWR_DIG_1,
173862306a36Sopenharmony_ci		RT5682S_PWR_ADC_L1_BIT, 0, NULL, 0),
173962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5682S_PWR_DIG_1,
174062306a36Sopenharmony_ci		RT5682S_PWR_ADC_R1_BIT, 0, NULL, 0),
174162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5682S_CHOP_ADC,
174262306a36Sopenharmony_ci		RT5682S_CKGEN_ADC1_SFT, 0, NULL, 0),
174362306a36Sopenharmony_ci
174462306a36Sopenharmony_ci	/* ADC Mux */
174562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
174662306a36Sopenharmony_ci		&rt5682s_sto1_adc1l_mux),
174762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
174862306a36Sopenharmony_ci		&rt5682s_sto1_adc1r_mux),
174962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
175062306a36Sopenharmony_ci		&rt5682s_sto1_adc2l_mux),
175162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
175262306a36Sopenharmony_ci		&rt5682s_sto1_adc2r_mux),
175362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,
175462306a36Sopenharmony_ci		&rt5682s_sto1_adcl_mux),
175562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,
175662306a36Sopenharmony_ci		&rt5682s_sto1_adcr_mux),
175762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1_ADC Mux", SND_SOC_NOPM, 0, 0,
175862306a36Sopenharmony_ci		&rt5682s_if1_adc_slot_mux),
175962306a36Sopenharmony_ci
176062306a36Sopenharmony_ci	/* ADC Mixer */
176162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682S_PWR_DIG_2,
176262306a36Sopenharmony_ci		RT5682S_PWR_ADC_S1F_BIT, 0, set_filter_clk, SND_SOC_DAPM_PRE_PMU),
176362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER_E("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0,
176462306a36Sopenharmony_ci		rt5682s_sto1_adc_l_mix, ARRAY_SIZE(rt5682s_sto1_adc_l_mix),
176562306a36Sopenharmony_ci		rt5682s_stereo1_adc_mixl_event,
176662306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
176762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5682S_STO1_ADC_DIG_VOL,
176862306a36Sopenharmony_ci		RT5682S_R_MUTE_SFT, 1, rt5682s_sto1_adc_r_mix,
176962306a36Sopenharmony_ci		ARRAY_SIZE(rt5682s_sto1_adc_r_mix)),
177062306a36Sopenharmony_ci
177162306a36Sopenharmony_ci	/* ADC PGA */
177262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
177362306a36Sopenharmony_ci
177462306a36Sopenharmony_ci	/* Digital Interface */
177562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("I2S1", SND_SOC_NOPM, 0, 0,
177662306a36Sopenharmony_ci		set_i2s_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
177762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("I2S2", SND_SOC_NOPM, 0, 0,
177862306a36Sopenharmony_ci		set_i2s_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
177962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
178062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
178162306a36Sopenharmony_ci
178262306a36Sopenharmony_ci	/* Digital Interface Select */
178362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
178462306a36Sopenharmony_ci		&rt5682s_if1_01_adc_swap_mux),
178562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
178662306a36Sopenharmony_ci		&rt5682s_if1_23_adc_swap_mux),
178762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
178862306a36Sopenharmony_ci		&rt5682s_if1_45_adc_swap_mux),
178962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
179062306a36Sopenharmony_ci		&rt5682s_if1_67_adc_swap_mux),
179162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
179262306a36Sopenharmony_ci		&rt5682s_if2_adc_swap_mux),
179362306a36Sopenharmony_ci
179462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("ADCDAT Mux", SND_SOC_NOPM, 0, 0, &rt5682s_adcdat_pin_ctrl),
179562306a36Sopenharmony_ci
179662306a36Sopenharmony_ci	/* Audio Interface */
179762306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, RT5682S_I2S1_SDP,
179862306a36Sopenharmony_ci		RT5682S_SEL_ADCDAT_SFT, 1),
179962306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, RT5682S_I2S2_SDP,
180062306a36Sopenharmony_ci		RT5682S_I2S2_PIN_CFG_SFT, 1),
180162306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
180262306a36Sopenharmony_ci
180362306a36Sopenharmony_ci	/* Output Side */
180462306a36Sopenharmony_ci	/* DAC mixer before sound effect  */
180562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
180662306a36Sopenharmony_ci		rt5682s_dac_l_mix, ARRAY_SIZE(rt5682s_dac_l_mix)),
180762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
180862306a36Sopenharmony_ci		rt5682s_dac_r_mix, ARRAY_SIZE(rt5682s_dac_r_mix)),
180962306a36Sopenharmony_ci
181062306a36Sopenharmony_ci	/* DAC channel Mux */
181162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0, &rt5682s_alg_dac_l1_mux),
181262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0, &rt5682s_alg_dac_r1_mux),
181362306a36Sopenharmony_ci
181462306a36Sopenharmony_ci	/* DAC Mixer */
181562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5682S_PWR_DIG_2,
181662306a36Sopenharmony_ci		RT5682S_PWR_DAC_S1F_BIT, 0, set_filter_clk, SND_SOC_DAPM_PRE_PMU),
181762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0,
181862306a36Sopenharmony_ci		rt5682s_sto1_dac_l_mix, ARRAY_SIZE(rt5682s_sto1_dac_l_mix)),
181962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0,
182062306a36Sopenharmony_ci		rt5682s_sto1_dac_r_mix, ARRAY_SIZE(rt5682s_sto1_dac_r_mix)),
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci	/* DACs */
182362306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC L1", NULL, RT5682S_PWR_DIG_1, RT5682S_PWR_DAC_L1_BIT, 0),
182462306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC R1", NULL, RT5682S_PWR_DIG_1, RT5682S_PWR_DAC_R1_BIT, 0),
182562306a36Sopenharmony_ci
182662306a36Sopenharmony_ci	/* HPO */
182762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5682s_hp_amp_event,
182862306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),
182962306a36Sopenharmony_ci
183062306a36Sopenharmony_ci	/* CLK DET */
183162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682S_CLK_DET,
183262306a36Sopenharmony_ci		RT5682S_SYS_CLK_DET_SFT, 0, NULL, 0),
183362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("CLKDET PLL1", RT5682S_CLK_DET,
183462306a36Sopenharmony_ci		RT5682S_PLL1_CLK_DET_SFT, 0, NULL, 0),
183562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MCLK0 DET PWR", RT5682S_PWR_ANLG_2,
183662306a36Sopenharmony_ci		RT5682S_PWR_MCLK0_WD_BIT, 0, NULL, 0),
183762306a36Sopenharmony_ci
183862306a36Sopenharmony_ci	/* SAR */
183962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("SAR", SND_SOC_NOPM, 0, 0, sar_power_event,
184062306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
184162306a36Sopenharmony_ci
184262306a36Sopenharmony_ci	/* Output Lines */
184362306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("HPOL"),
184462306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("HPOR"),
184562306a36Sopenharmony_ci};
184662306a36Sopenharmony_ci
184762306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5682s_dapm_routes[] = {
184862306a36Sopenharmony_ci	/*PLL*/
184962306a36Sopenharmony_ci	{"ADC Stereo1 Filter", NULL, "PLLA", is_sys_clk_from_plla},
185062306a36Sopenharmony_ci	{"ADC Stereo1 Filter", NULL, "PLLB", is_sys_clk_from_pllb},
185162306a36Sopenharmony_ci	{"DAC Stereo1 Filter", NULL, "PLLA", is_sys_clk_from_plla},
185262306a36Sopenharmony_ci	{"DAC Stereo1 Filter", NULL, "PLLB", is_sys_clk_from_pllb},
185362306a36Sopenharmony_ci	{"PLLA", NULL, "PLLA_LDO"},
185462306a36Sopenharmony_ci	{"PLLA", NULL, "PLLA_BIAS"},
185562306a36Sopenharmony_ci	{"PLLA", NULL, "PLLA_RST"},
185662306a36Sopenharmony_ci
185762306a36Sopenharmony_ci	/*ASRC*/
185862306a36Sopenharmony_ci	{"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc},
185962306a36Sopenharmony_ci	{"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},
186062306a36Sopenharmony_ci	{"ADC STO1 ASRC", NULL, "AD ASRC"},
186162306a36Sopenharmony_ci	{"ADC STO1 ASRC", NULL, "DA ASRC"},
186262306a36Sopenharmony_ci	{"DAC STO1 ASRC", NULL, "AD ASRC"},
186362306a36Sopenharmony_ci	{"DAC STO1 ASRC", NULL, "DA ASRC"},
186462306a36Sopenharmony_ci
186562306a36Sopenharmony_ci	{"CLKDET SYS", NULL, "MCLK0 DET PWR"},
186662306a36Sopenharmony_ci
186762306a36Sopenharmony_ci	{"BST1 CBJ", NULL, "IN1P"},
186862306a36Sopenharmony_ci	{"BST1 CBJ", NULL, "SAR"},
186962306a36Sopenharmony_ci
187062306a36Sopenharmony_ci	{"RECMIX1L", "CBJ Switch", "BST1 CBJ"},
187162306a36Sopenharmony_ci	{"RECMIX1L", NULL, "RECMIX1L Power"},
187262306a36Sopenharmony_ci	{"RECMIX1R", "CBJ Switch", "BST1 CBJ"},
187362306a36Sopenharmony_ci	{"RECMIX1R", NULL, "RECMIX1R Power"},
187462306a36Sopenharmony_ci
187562306a36Sopenharmony_ci	{"ADC1 L", NULL, "RECMIX1L"},
187662306a36Sopenharmony_ci	{"ADC1 L", NULL, "ADC1 L Power"},
187762306a36Sopenharmony_ci	{"ADC1 L", NULL, "ADC1 clock"},
187862306a36Sopenharmony_ci	{"ADC1 R", NULL, "RECMIX1R"},
187962306a36Sopenharmony_ci	{"ADC1 R", NULL, "ADC1 R Power"},
188062306a36Sopenharmony_ci	{"ADC1 R", NULL, "ADC1 clock"},
188162306a36Sopenharmony_ci
188262306a36Sopenharmony_ci	{"DMIC L1", NULL, "DMIC CLK"},
188362306a36Sopenharmony_ci	{"DMIC L1", NULL, "DMIC1 Power"},
188462306a36Sopenharmony_ci	{"DMIC R1", NULL, "DMIC CLK"},
188562306a36Sopenharmony_ci	{"DMIC R1", NULL, "DMIC1 Power"},
188662306a36Sopenharmony_ci	{"DMIC CLK", NULL, "DMIC ASRC"},
188762306a36Sopenharmony_ci
188862306a36Sopenharmony_ci	{"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"},
188962306a36Sopenharmony_ci	{"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"},
189062306a36Sopenharmony_ci	{"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"},
189162306a36Sopenharmony_ci	{"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"},
189262306a36Sopenharmony_ci
189362306a36Sopenharmony_ci	{"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"},
189462306a36Sopenharmony_ci	{"Stereo1 ADC L1 Mux", "DAC MIX", "Stereo1 DAC MIXL"},
189562306a36Sopenharmony_ci	{"Stereo1 ADC L2 Mux", "DMIC", "DMIC L1"},
189662306a36Sopenharmony_ci	{"Stereo1 ADC L2 Mux", "DAC MIX", "Stereo1 DAC MIXL"},
189762306a36Sopenharmony_ci
189862306a36Sopenharmony_ci	{"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"},
189962306a36Sopenharmony_ci	{"Stereo1 ADC R1 Mux", "DAC MIX", "Stereo1 DAC MIXR"},
190062306a36Sopenharmony_ci	{"Stereo1 ADC R2 Mux", "DMIC", "DMIC R1"},
190162306a36Sopenharmony_ci	{"Stereo1 ADC R2 Mux", "DAC MIX", "Stereo1 DAC MIXR"},
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci	{"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"},
190462306a36Sopenharmony_ci	{"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"},
190562306a36Sopenharmony_ci	{"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"},
190662306a36Sopenharmony_ci
190762306a36Sopenharmony_ci	{"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"},
190862306a36Sopenharmony_ci	{"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"},
190962306a36Sopenharmony_ci	{"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"},
191062306a36Sopenharmony_ci
191162306a36Sopenharmony_ci	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"},
191262306a36Sopenharmony_ci	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"},
191362306a36Sopenharmony_ci
191462306a36Sopenharmony_ci	{"IF1 01 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
191562306a36Sopenharmony_ci	{"IF1 01 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
191662306a36Sopenharmony_ci	{"IF1 01 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
191762306a36Sopenharmony_ci	{"IF1 01 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
191862306a36Sopenharmony_ci	{"IF1 23 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
191962306a36Sopenharmony_ci	{"IF1 23 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
192062306a36Sopenharmony_ci	{"IF1 23 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
192162306a36Sopenharmony_ci	{"IF1 23 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
192262306a36Sopenharmony_ci	{"IF1 45 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
192362306a36Sopenharmony_ci	{"IF1 45 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
192462306a36Sopenharmony_ci	{"IF1 45 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
192562306a36Sopenharmony_ci	{"IF1 45 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
192662306a36Sopenharmony_ci	{"IF1 67 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
192762306a36Sopenharmony_ci	{"IF1 67 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
192862306a36Sopenharmony_ci	{"IF1 67 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
192962306a36Sopenharmony_ci	{"IF1 67 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
193062306a36Sopenharmony_ci
193162306a36Sopenharmony_ci	{"IF1_ADC Mux", "Slot 0", "IF1 01 ADC Swap Mux"},
193262306a36Sopenharmony_ci	{"IF1_ADC Mux", "Slot 2", "IF1 23 ADC Swap Mux"},
193362306a36Sopenharmony_ci	{"IF1_ADC Mux", "Slot 4", "IF1 45 ADC Swap Mux"},
193462306a36Sopenharmony_ci	{"IF1_ADC Mux", "Slot 6", "IF1 67 ADC Swap Mux"},
193562306a36Sopenharmony_ci	{"ADCDAT Mux", "ADCDAT1", "IF1_ADC Mux"},
193662306a36Sopenharmony_ci	{"AIF1TX", NULL, "I2S1"},
193762306a36Sopenharmony_ci	{"AIF1TX", NULL, "ADCDAT Mux"},
193862306a36Sopenharmony_ci	{"IF2 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},
193962306a36Sopenharmony_ci	{"IF2 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},
194062306a36Sopenharmony_ci	{"IF2 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},
194162306a36Sopenharmony_ci	{"IF2 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},
194262306a36Sopenharmony_ci	{"ADCDAT Mux", "ADCDAT2", "IF2 ADC Swap Mux"},
194362306a36Sopenharmony_ci	{"AIF2TX", NULL, "ADCDAT Mux"},
194462306a36Sopenharmony_ci
194562306a36Sopenharmony_ci	{"IF1 DAC1 L", NULL, "AIF1RX"},
194662306a36Sopenharmony_ci	{"IF1 DAC1 L", NULL, "I2S1"},
194762306a36Sopenharmony_ci	{"IF1 DAC1 L", NULL, "DAC Stereo1 Filter"},
194862306a36Sopenharmony_ci	{"IF1 DAC1 R", NULL, "AIF1RX"},
194962306a36Sopenharmony_ci	{"IF1 DAC1 R", NULL, "I2S1"},
195062306a36Sopenharmony_ci	{"IF1 DAC1 R", NULL, "DAC Stereo1 Filter"},
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci	{"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},
195362306a36Sopenharmony_ci	{"DAC1 MIXL", "DAC1 Switch", "IF1 DAC1 L"},
195462306a36Sopenharmony_ci	{"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},
195562306a36Sopenharmony_ci	{"DAC1 MIXR", "DAC1 Switch", "IF1 DAC1 R"},
195662306a36Sopenharmony_ci
195762306a36Sopenharmony_ci	{"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
195862306a36Sopenharmony_ci	{"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},
195962306a36Sopenharmony_ci
196062306a36Sopenharmony_ci	{"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
196162306a36Sopenharmony_ci	{"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},
196262306a36Sopenharmony_ci
196362306a36Sopenharmony_ci	{"DAC L1 Source", "DAC1", "DAC1 MIXL"},
196462306a36Sopenharmony_ci	{"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},
196562306a36Sopenharmony_ci	{"DAC R1 Source", "DAC1", "DAC1 MIXR"},
196662306a36Sopenharmony_ci	{"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_ci	{"DAC L1", NULL, "DAC L1 Source"},
196962306a36Sopenharmony_ci	{"DAC R1", NULL, "DAC R1 Source"},
197062306a36Sopenharmony_ci
197162306a36Sopenharmony_ci	{"HP Amp", NULL, "DAC L1"},
197262306a36Sopenharmony_ci	{"HP Amp", NULL, "DAC R1"},
197362306a36Sopenharmony_ci	{"HP Amp", NULL, "CLKDET SYS"},
197462306a36Sopenharmony_ci	{"HP Amp", NULL, "SAR"},
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_ci	{"HPOL", NULL, "HP Amp"},
197762306a36Sopenharmony_ci	{"HPOR", NULL, "HP Amp"},
197862306a36Sopenharmony_ci};
197962306a36Sopenharmony_ci
198062306a36Sopenharmony_cistatic int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
198162306a36Sopenharmony_ci		unsigned int rx_mask, int slots, int slot_width)
198262306a36Sopenharmony_ci{
198362306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
198462306a36Sopenharmony_ci	unsigned int cl, val = 0, tx_slotnum;
198562306a36Sopenharmony_ci
198662306a36Sopenharmony_ci	if (tx_mask || rx_mask)
198762306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
198862306a36Sopenharmony_ci			RT5682S_TDM_ADDA_CTRL_2, RT5682S_TDM_EN, RT5682S_TDM_EN);
198962306a36Sopenharmony_ci	else
199062306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
199162306a36Sopenharmony_ci			RT5682S_TDM_ADDA_CTRL_2, RT5682S_TDM_EN, 0);
199262306a36Sopenharmony_ci
199362306a36Sopenharmony_ci	/* Tx slot configuration */
199462306a36Sopenharmony_ci	tx_slotnum = hweight_long(tx_mask);
199562306a36Sopenharmony_ci	if (tx_slotnum) {
199662306a36Sopenharmony_ci		if (tx_slotnum > slots) {
199762306a36Sopenharmony_ci			dev_err(component->dev, "Invalid or oversized Tx slots.\n");
199862306a36Sopenharmony_ci			return -EINVAL;
199962306a36Sopenharmony_ci		}
200062306a36Sopenharmony_ci		val |= (tx_slotnum - 1) << RT5682S_TDM_ADC_DL_SFT;
200162306a36Sopenharmony_ci	}
200262306a36Sopenharmony_ci
200362306a36Sopenharmony_ci	switch (slots) {
200462306a36Sopenharmony_ci	case 4:
200562306a36Sopenharmony_ci		val |= RT5682S_TDM_TX_CH_4;
200662306a36Sopenharmony_ci		val |= RT5682S_TDM_RX_CH_4;
200762306a36Sopenharmony_ci		break;
200862306a36Sopenharmony_ci	case 6:
200962306a36Sopenharmony_ci		val |= RT5682S_TDM_TX_CH_6;
201062306a36Sopenharmony_ci		val |= RT5682S_TDM_RX_CH_6;
201162306a36Sopenharmony_ci		break;
201262306a36Sopenharmony_ci	case 8:
201362306a36Sopenharmony_ci		val |= RT5682S_TDM_TX_CH_8;
201462306a36Sopenharmony_ci		val |= RT5682S_TDM_RX_CH_8;
201562306a36Sopenharmony_ci		break;
201662306a36Sopenharmony_ci	case 2:
201762306a36Sopenharmony_ci		break;
201862306a36Sopenharmony_ci	default:
201962306a36Sopenharmony_ci		return -EINVAL;
202062306a36Sopenharmony_ci	}
202162306a36Sopenharmony_ci
202262306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_TDM_CTRL,
202362306a36Sopenharmony_ci		RT5682S_TDM_TX_CH_MASK | RT5682S_TDM_RX_CH_MASK |
202462306a36Sopenharmony_ci		RT5682S_TDM_ADC_DL_MASK, val);
202562306a36Sopenharmony_ci
202662306a36Sopenharmony_ci	switch (slot_width) {
202762306a36Sopenharmony_ci	case 8:
202862306a36Sopenharmony_ci		if (tx_mask || rx_mask)
202962306a36Sopenharmony_ci			return -EINVAL;
203062306a36Sopenharmony_ci		cl = RT5682S_I2S1_TX_CHL_8 | RT5682S_I2S1_RX_CHL_8;
203162306a36Sopenharmony_ci		break;
203262306a36Sopenharmony_ci	case 16:
203362306a36Sopenharmony_ci		val = RT5682S_TDM_CL_16;
203462306a36Sopenharmony_ci		cl = RT5682S_I2S1_TX_CHL_16 | RT5682S_I2S1_RX_CHL_16;
203562306a36Sopenharmony_ci		break;
203662306a36Sopenharmony_ci	case 20:
203762306a36Sopenharmony_ci		val = RT5682S_TDM_CL_20;
203862306a36Sopenharmony_ci		cl = RT5682S_I2S1_TX_CHL_20 | RT5682S_I2S1_RX_CHL_20;
203962306a36Sopenharmony_ci		break;
204062306a36Sopenharmony_ci	case 24:
204162306a36Sopenharmony_ci		val = RT5682S_TDM_CL_24;
204262306a36Sopenharmony_ci		cl = RT5682S_I2S1_TX_CHL_24 | RT5682S_I2S1_RX_CHL_24;
204362306a36Sopenharmony_ci		break;
204462306a36Sopenharmony_ci	case 32:
204562306a36Sopenharmony_ci		val = RT5682S_TDM_CL_32;
204662306a36Sopenharmony_ci		cl = RT5682S_I2S1_TX_CHL_32 | RT5682S_I2S1_RX_CHL_32;
204762306a36Sopenharmony_ci		break;
204862306a36Sopenharmony_ci	default:
204962306a36Sopenharmony_ci		return -EINVAL;
205062306a36Sopenharmony_ci	}
205162306a36Sopenharmony_ci
205262306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,
205362306a36Sopenharmony_ci		RT5682S_TDM_CL_MASK, val);
205462306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,
205562306a36Sopenharmony_ci		RT5682S_I2S1_TX_CHL_MASK | RT5682S_I2S1_RX_CHL_MASK, cl);
205662306a36Sopenharmony_ci
205762306a36Sopenharmony_ci	return 0;
205862306a36Sopenharmony_ci}
205962306a36Sopenharmony_ci
206062306a36Sopenharmony_cistatic int rt5682s_hw_params(struct snd_pcm_substream *substream,
206162306a36Sopenharmony_ci		struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
206262306a36Sopenharmony_ci{
206362306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
206462306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
206562306a36Sopenharmony_ci	unsigned int len_1 = 0, len_2 = 0;
206662306a36Sopenharmony_ci	int frame_size;
206762306a36Sopenharmony_ci
206862306a36Sopenharmony_ci	rt5682s->lrck[dai->id] = params_rate(params);
206962306a36Sopenharmony_ci
207062306a36Sopenharmony_ci	frame_size = snd_soc_params_to_frame_size(params);
207162306a36Sopenharmony_ci	if (frame_size < 0) {
207262306a36Sopenharmony_ci		dev_err(component->dev, "Unsupported frame size: %d\n", frame_size);
207362306a36Sopenharmony_ci		return -EINVAL;
207462306a36Sopenharmony_ci	}
207562306a36Sopenharmony_ci
207662306a36Sopenharmony_ci	switch (params_width(params)) {
207762306a36Sopenharmony_ci	case 16:
207862306a36Sopenharmony_ci		break;
207962306a36Sopenharmony_ci	case 20:
208062306a36Sopenharmony_ci		len_1 |= RT5682S_I2S1_DL_20;
208162306a36Sopenharmony_ci		len_2 |= RT5682S_I2S2_DL_20;
208262306a36Sopenharmony_ci		break;
208362306a36Sopenharmony_ci	case 24:
208462306a36Sopenharmony_ci		len_1 |= RT5682S_I2S1_DL_24;
208562306a36Sopenharmony_ci		len_2 |= RT5682S_I2S2_DL_24;
208662306a36Sopenharmony_ci		break;
208762306a36Sopenharmony_ci	case 32:
208862306a36Sopenharmony_ci		len_1 |= RT5682S_I2S1_DL_32;
208962306a36Sopenharmony_ci		len_2 |= RT5682S_I2S2_DL_24;
209062306a36Sopenharmony_ci		break;
209162306a36Sopenharmony_ci	case 8:
209262306a36Sopenharmony_ci		len_1 |= RT5682S_I2S2_DL_8;
209362306a36Sopenharmony_ci		len_2 |= RT5682S_I2S2_DL_8;
209462306a36Sopenharmony_ci		break;
209562306a36Sopenharmony_ci	default:
209662306a36Sopenharmony_ci		return -EINVAL;
209762306a36Sopenharmony_ci	}
209862306a36Sopenharmony_ci
209962306a36Sopenharmony_ci	switch (dai->id) {
210062306a36Sopenharmony_ci	case RT5682S_AIF1:
210162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,
210262306a36Sopenharmony_ci			RT5682S_I2S1_DL_MASK, len_1);
210362306a36Sopenharmony_ci		if (params_channels(params) == 1) /* mono mode */
210462306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,
210562306a36Sopenharmony_ci				RT5682S_I2S1_MONO_MASK, RT5682S_I2S1_MONO_EN);
210662306a36Sopenharmony_ci		else
210762306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,
210862306a36Sopenharmony_ci				RT5682S_I2S1_MONO_MASK, RT5682S_I2S1_MONO_DIS);
210962306a36Sopenharmony_ci		break;
211062306a36Sopenharmony_ci	case RT5682S_AIF2:
211162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_I2S2_SDP,
211262306a36Sopenharmony_ci			RT5682S_I2S2_DL_MASK, len_2);
211362306a36Sopenharmony_ci		if (params_channels(params) == 1) /* mono mode */
211462306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682S_I2S2_SDP,
211562306a36Sopenharmony_ci				RT5682S_I2S2_MONO_MASK, RT5682S_I2S2_MONO_EN);
211662306a36Sopenharmony_ci		else
211762306a36Sopenharmony_ci			snd_soc_component_update_bits(component, RT5682S_I2S2_SDP,
211862306a36Sopenharmony_ci				RT5682S_I2S2_MONO_MASK, RT5682S_I2S2_MONO_DIS);
211962306a36Sopenharmony_ci		break;
212062306a36Sopenharmony_ci	default:
212162306a36Sopenharmony_ci		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
212262306a36Sopenharmony_ci		return -EINVAL;
212362306a36Sopenharmony_ci	}
212462306a36Sopenharmony_ci
212562306a36Sopenharmony_ci	return 0;
212662306a36Sopenharmony_ci}
212762306a36Sopenharmony_ci
212862306a36Sopenharmony_cistatic int rt5682s_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
212962306a36Sopenharmony_ci{
213062306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
213162306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
213262306a36Sopenharmony_ci	unsigned int reg_val = 0, tdm_ctrl = 0;
213362306a36Sopenharmony_ci
213462306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
213562306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBM_CFM:
213662306a36Sopenharmony_ci		rt5682s->master[dai->id] = 1;
213762306a36Sopenharmony_ci		break;
213862306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBS_CFS:
213962306a36Sopenharmony_ci		rt5682s->master[dai->id] = 0;
214062306a36Sopenharmony_ci		break;
214162306a36Sopenharmony_ci	default:
214262306a36Sopenharmony_ci		return -EINVAL;
214362306a36Sopenharmony_ci	}
214462306a36Sopenharmony_ci
214562306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
214662306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_NF:
214762306a36Sopenharmony_ci		break;
214862306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_NF:
214962306a36Sopenharmony_ci		reg_val |= RT5682S_I2S_BP_INV;
215062306a36Sopenharmony_ci		tdm_ctrl |= RT5682S_TDM_S_BP_INV;
215162306a36Sopenharmony_ci		break;
215262306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_IF:
215362306a36Sopenharmony_ci		if (dai->id == RT5682S_AIF1)
215462306a36Sopenharmony_ci			tdm_ctrl |= RT5682S_TDM_S_LP_INV | RT5682S_TDM_M_BP_INV;
215562306a36Sopenharmony_ci		else
215662306a36Sopenharmony_ci			return -EINVAL;
215762306a36Sopenharmony_ci		break;
215862306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_IF:
215962306a36Sopenharmony_ci		if (dai->id == RT5682S_AIF1)
216062306a36Sopenharmony_ci			tdm_ctrl |= RT5682S_TDM_S_BP_INV | RT5682S_TDM_S_LP_INV |
216162306a36Sopenharmony_ci				RT5682S_TDM_M_BP_INV | RT5682S_TDM_M_LP_INV;
216262306a36Sopenharmony_ci		else
216362306a36Sopenharmony_ci			return -EINVAL;
216462306a36Sopenharmony_ci		break;
216562306a36Sopenharmony_ci	default:
216662306a36Sopenharmony_ci		return -EINVAL;
216762306a36Sopenharmony_ci	}
216862306a36Sopenharmony_ci
216962306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
217062306a36Sopenharmony_ci	case SND_SOC_DAIFMT_I2S:
217162306a36Sopenharmony_ci		break;
217262306a36Sopenharmony_ci	case SND_SOC_DAIFMT_LEFT_J:
217362306a36Sopenharmony_ci		reg_val |= RT5682S_I2S_DF_LEFT;
217462306a36Sopenharmony_ci		tdm_ctrl |= RT5682S_TDM_DF_LEFT;
217562306a36Sopenharmony_ci		break;
217662306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_A:
217762306a36Sopenharmony_ci		reg_val |= RT5682S_I2S_DF_PCM_A;
217862306a36Sopenharmony_ci		tdm_ctrl |= RT5682S_TDM_DF_PCM_A;
217962306a36Sopenharmony_ci		break;
218062306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_B:
218162306a36Sopenharmony_ci		reg_val |= RT5682S_I2S_DF_PCM_B;
218262306a36Sopenharmony_ci		tdm_ctrl |= RT5682S_TDM_DF_PCM_B;
218362306a36Sopenharmony_ci		break;
218462306a36Sopenharmony_ci	default:
218562306a36Sopenharmony_ci		return -EINVAL;
218662306a36Sopenharmony_ci	}
218762306a36Sopenharmony_ci
218862306a36Sopenharmony_ci	switch (dai->id) {
218962306a36Sopenharmony_ci	case RT5682S_AIF1:
219062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,
219162306a36Sopenharmony_ci			RT5682S_I2S_DF_MASK, reg_val);
219262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,
219362306a36Sopenharmony_ci			RT5682S_TDM_MS_MASK | RT5682S_TDM_S_BP_MASK |
219462306a36Sopenharmony_ci			RT5682S_TDM_DF_MASK | RT5682S_TDM_M_BP_MASK |
219562306a36Sopenharmony_ci			RT5682S_TDM_M_LP_MASK | RT5682S_TDM_S_LP_MASK,
219662306a36Sopenharmony_ci			tdm_ctrl | rt5682s->master[dai->id]);
219762306a36Sopenharmony_ci		break;
219862306a36Sopenharmony_ci	case RT5682S_AIF2:
219962306a36Sopenharmony_ci		if (rt5682s->master[dai->id] == 0)
220062306a36Sopenharmony_ci			reg_val |= RT5682S_I2S2_MS_S;
220162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_I2S2_SDP,
220262306a36Sopenharmony_ci			RT5682S_I2S2_MS_MASK | RT5682S_I2S_BP_MASK |
220362306a36Sopenharmony_ci			RT5682S_I2S_DF_MASK, reg_val);
220462306a36Sopenharmony_ci		break;
220562306a36Sopenharmony_ci	default:
220662306a36Sopenharmony_ci		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);
220762306a36Sopenharmony_ci		return -EINVAL;
220862306a36Sopenharmony_ci	}
220962306a36Sopenharmony_ci	return 0;
221062306a36Sopenharmony_ci}
221162306a36Sopenharmony_ci
221262306a36Sopenharmony_cistatic int rt5682s_set_component_sysclk(struct snd_soc_component *component,
221362306a36Sopenharmony_ci		int clk_id, int source, unsigned int freq, int dir)
221462306a36Sopenharmony_ci{
221562306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
221662306a36Sopenharmony_ci	unsigned int src = 0;
221762306a36Sopenharmony_ci
221862306a36Sopenharmony_ci	if (freq == rt5682s->sysclk && clk_id == rt5682s->sysclk_src)
221962306a36Sopenharmony_ci		return 0;
222062306a36Sopenharmony_ci
222162306a36Sopenharmony_ci	switch (clk_id) {
222262306a36Sopenharmony_ci	case RT5682S_SCLK_S_MCLK:
222362306a36Sopenharmony_ci		src = RT5682S_CLK_SRC_MCLK;
222462306a36Sopenharmony_ci		break;
222562306a36Sopenharmony_ci	case RT5682S_SCLK_S_PLL1:
222662306a36Sopenharmony_ci		src = RT5682S_CLK_SRC_PLL1;
222762306a36Sopenharmony_ci		break;
222862306a36Sopenharmony_ci	case RT5682S_SCLK_S_PLL2:
222962306a36Sopenharmony_ci		src = RT5682S_CLK_SRC_PLL2;
223062306a36Sopenharmony_ci		break;
223162306a36Sopenharmony_ci	case RT5682S_SCLK_S_RCCLK:
223262306a36Sopenharmony_ci		src = RT5682S_CLK_SRC_RCCLK;
223362306a36Sopenharmony_ci		break;
223462306a36Sopenharmony_ci	default:
223562306a36Sopenharmony_ci		dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
223662306a36Sopenharmony_ci		return -EINVAL;
223762306a36Sopenharmony_ci	}
223862306a36Sopenharmony_ci
223962306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_GLB_CLK,
224062306a36Sopenharmony_ci		RT5682S_SCLK_SRC_MASK, src << RT5682S_SCLK_SRC_SFT);
224162306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_1,
224262306a36Sopenharmony_ci		RT5682S_I2S_M_CLK_SRC_MASK, src << RT5682S_I2S_M_CLK_SRC_SFT);
224362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_I2S2_M_CLK_CTRL_1,
224462306a36Sopenharmony_ci		RT5682S_I2S2_M_CLK_SRC_MASK, src << RT5682S_I2S2_M_CLK_SRC_SFT);
224562306a36Sopenharmony_ci
224662306a36Sopenharmony_ci	rt5682s->sysclk = freq;
224762306a36Sopenharmony_ci	rt5682s->sysclk_src = clk_id;
224862306a36Sopenharmony_ci
224962306a36Sopenharmony_ci	dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n",
225062306a36Sopenharmony_ci		freq, clk_id);
225162306a36Sopenharmony_ci
225262306a36Sopenharmony_ci	return 0;
225362306a36Sopenharmony_ci}
225462306a36Sopenharmony_ci
225562306a36Sopenharmony_cistatic const struct pll_calc_map plla_table[] = {
225662306a36Sopenharmony_ci	{2048000, 24576000, 0, 46, 2, true, false, false, false},
225762306a36Sopenharmony_ci	{256000, 24576000, 0, 382, 2, true, false, false, false},
225862306a36Sopenharmony_ci	{512000, 24576000, 0, 190, 2, true, false, false, false},
225962306a36Sopenharmony_ci	{4096000, 24576000, 0, 22, 2, true, false, false, false},
226062306a36Sopenharmony_ci	{1024000, 24576000, 0, 94, 2, true, false, false, false},
226162306a36Sopenharmony_ci	{11289600, 22579200, 1, 22, 2, false, false, false, false},
226262306a36Sopenharmony_ci	{1411200, 22579200, 0, 62, 2, true, false, false, false},
226362306a36Sopenharmony_ci	{2822400, 22579200, 0, 30, 2, true, false, false, false},
226462306a36Sopenharmony_ci	{12288000, 24576000, 1, 22, 2, false, false, false, false},
226562306a36Sopenharmony_ci	{1536000, 24576000, 0, 62, 2, true, false, false, false},
226662306a36Sopenharmony_ci	{3072000, 24576000, 0, 30, 2, true, false, false, false},
226762306a36Sopenharmony_ci	{24576000, 49152000, 4, 22, 0, false, false, false, false},
226862306a36Sopenharmony_ci	{3072000, 49152000, 0, 30, 0, true, false, false, false},
226962306a36Sopenharmony_ci	{6144000, 49152000, 0, 30, 0, false, false, false, false},
227062306a36Sopenharmony_ci	{49152000, 98304000, 10, 22, 0, false, true, false, false},
227162306a36Sopenharmony_ci	{6144000, 98304000, 0, 30, 0, false, true, false, false},
227262306a36Sopenharmony_ci	{12288000, 98304000, 1, 22, 0, false, true, false, false},
227362306a36Sopenharmony_ci	{48000000, 3840000, 10, 22, 23, false, false, false, false},
227462306a36Sopenharmony_ci	{24000000, 3840000, 4, 22, 23, false, false, false, false},
227562306a36Sopenharmony_ci	{19200000, 3840000, 3, 23, 23, false, false, false, false},
227662306a36Sopenharmony_ci	{38400000, 3840000, 8, 23, 23, false, false, false, false},
227762306a36Sopenharmony_ci};
227862306a36Sopenharmony_ci
227962306a36Sopenharmony_cistatic const struct pll_calc_map pllb_table[] = {
228062306a36Sopenharmony_ci	{48000000, 24576000, 8, 6, 3, false, false, false, false},
228162306a36Sopenharmony_ci	{48000000, 22579200, 23, 12, 3, false, false, false, true},
228262306a36Sopenharmony_ci	{24000000, 24576000, 3, 6, 3, false, false, false, false},
228362306a36Sopenharmony_ci	{24000000, 22579200, 23, 26, 3, false, false, false, true},
228462306a36Sopenharmony_ci	{19200000, 24576000, 2, 6, 3, false, false, false, false},
228562306a36Sopenharmony_ci	{19200000, 22579200, 3, 5, 3, false, false, false, true},
228662306a36Sopenharmony_ci	{38400000, 24576000, 6, 6, 3, false, false, false, false},
228762306a36Sopenharmony_ci	{38400000, 22579200, 8, 5, 3, false, false, false, true},
228862306a36Sopenharmony_ci	{3840000, 49152000, 0, 6, 0, true, false, false, false},
228962306a36Sopenharmony_ci};
229062306a36Sopenharmony_ci
229162306a36Sopenharmony_cistatic int find_pll_inter_combination(unsigned int f_in, unsigned int f_out,
229262306a36Sopenharmony_ci		struct pll_calc_map *a, struct pll_calc_map *b)
229362306a36Sopenharmony_ci{
229462306a36Sopenharmony_ci	int i, j;
229562306a36Sopenharmony_ci
229662306a36Sopenharmony_ci	/* Look at PLLA table */
229762306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(plla_table); i++) {
229862306a36Sopenharmony_ci		if (plla_table[i].freq_in == f_in && plla_table[i].freq_out == f_out) {
229962306a36Sopenharmony_ci			memcpy(a, plla_table + i, sizeof(*a));
230062306a36Sopenharmony_ci			return USE_PLLA;
230162306a36Sopenharmony_ci		}
230262306a36Sopenharmony_ci	}
230362306a36Sopenharmony_ci
230462306a36Sopenharmony_ci	/* Look at PLLB table */
230562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(pllb_table); i++) {
230662306a36Sopenharmony_ci		if (pllb_table[i].freq_in == f_in && pllb_table[i].freq_out == f_out) {
230762306a36Sopenharmony_ci			memcpy(b, pllb_table + i, sizeof(*b));
230862306a36Sopenharmony_ci			return USE_PLLB;
230962306a36Sopenharmony_ci		}
231062306a36Sopenharmony_ci	}
231162306a36Sopenharmony_ci
231262306a36Sopenharmony_ci	/* Find a combination of PLLA & PLLB */
231362306a36Sopenharmony_ci	for (i = ARRAY_SIZE(plla_table) - 1; i >= 0; i--) {
231462306a36Sopenharmony_ci		if (plla_table[i].freq_in == f_in && plla_table[i].freq_out == 3840000) {
231562306a36Sopenharmony_ci			for (j = ARRAY_SIZE(pllb_table) - 1; j >= 0; j--) {
231662306a36Sopenharmony_ci				if (pllb_table[j].freq_in == 3840000 &&
231762306a36Sopenharmony_ci					pllb_table[j].freq_out == f_out) {
231862306a36Sopenharmony_ci					memcpy(a, plla_table + i, sizeof(*a));
231962306a36Sopenharmony_ci					memcpy(b, pllb_table + j, sizeof(*b));
232062306a36Sopenharmony_ci					return USE_PLLAB;
232162306a36Sopenharmony_ci				}
232262306a36Sopenharmony_ci			}
232362306a36Sopenharmony_ci		}
232462306a36Sopenharmony_ci	}
232562306a36Sopenharmony_ci
232662306a36Sopenharmony_ci	return -EINVAL;
232762306a36Sopenharmony_ci}
232862306a36Sopenharmony_ci
232962306a36Sopenharmony_cistatic int rt5682s_set_component_pll(struct snd_soc_component *component,
233062306a36Sopenharmony_ci		int pll_id, int source, unsigned int freq_in,
233162306a36Sopenharmony_ci		unsigned int freq_out)
233262306a36Sopenharmony_ci{
233362306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
233462306a36Sopenharmony_ci	struct pll_calc_map a_map, b_map;
233562306a36Sopenharmony_ci
233662306a36Sopenharmony_ci	if (source == rt5682s->pll_src[pll_id] && freq_in == rt5682s->pll_in[pll_id] &&
233762306a36Sopenharmony_ci	    freq_out == rt5682s->pll_out[pll_id])
233862306a36Sopenharmony_ci		return 0;
233962306a36Sopenharmony_ci
234062306a36Sopenharmony_ci	if (!freq_in || !freq_out) {
234162306a36Sopenharmony_ci		dev_dbg(component->dev, "PLL disabled\n");
234262306a36Sopenharmony_ci		rt5682s->pll_in[pll_id] = 0;
234362306a36Sopenharmony_ci		rt5682s->pll_out[pll_id] = 0;
234462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_GLB_CLK,
234562306a36Sopenharmony_ci			RT5682S_SCLK_SRC_MASK, RT5682S_CLK_SRC_MCLK << RT5682S_SCLK_SRC_SFT);
234662306a36Sopenharmony_ci		return 0;
234762306a36Sopenharmony_ci	}
234862306a36Sopenharmony_ci
234962306a36Sopenharmony_ci	switch (source) {
235062306a36Sopenharmony_ci	case RT5682S_PLL_S_MCLK:
235162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_GLB_CLK,
235262306a36Sopenharmony_ci			RT5682S_PLL_SRC_MASK, RT5682S_PLL_SRC_MCLK);
235362306a36Sopenharmony_ci		break;
235462306a36Sopenharmony_ci	case RT5682S_PLL_S_BCLK1:
235562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_GLB_CLK,
235662306a36Sopenharmony_ci			RT5682S_PLL_SRC_MASK, RT5682S_PLL_SRC_BCLK1);
235762306a36Sopenharmony_ci		break;
235862306a36Sopenharmony_ci	default:
235962306a36Sopenharmony_ci		dev_err(component->dev, "Unknown PLL Source %d\n", source);
236062306a36Sopenharmony_ci		return -EINVAL;
236162306a36Sopenharmony_ci	}
236262306a36Sopenharmony_ci
236362306a36Sopenharmony_ci	rt5682s->pll_comb = find_pll_inter_combination(freq_in, freq_out,
236462306a36Sopenharmony_ci							&a_map, &b_map);
236562306a36Sopenharmony_ci
236662306a36Sopenharmony_ci	if ((pll_id == RT5682S_PLL1 && rt5682s->pll_comb == USE_PLLA) ||
236762306a36Sopenharmony_ci	    (pll_id == RT5682S_PLL2 && (rt5682s->pll_comb == USE_PLLB ||
236862306a36Sopenharmony_ci					rt5682s->pll_comb == USE_PLLAB))) {
236962306a36Sopenharmony_ci		dev_dbg(component->dev,
237062306a36Sopenharmony_ci			"Supported freq conversion for PLL%d:(%d->%d): %d\n",
237162306a36Sopenharmony_ci			pll_id + 1, freq_in, freq_out, rt5682s->pll_comb);
237262306a36Sopenharmony_ci	} else {
237362306a36Sopenharmony_ci		dev_err(component->dev,
237462306a36Sopenharmony_ci			"Unsupported freq conversion for PLL%d:(%d->%d): %d\n",
237562306a36Sopenharmony_ci			pll_id + 1, freq_in, freq_out, rt5682s->pll_comb);
237662306a36Sopenharmony_ci		return -EINVAL;
237762306a36Sopenharmony_ci	}
237862306a36Sopenharmony_ci
237962306a36Sopenharmony_ci	if (rt5682s->pll_comb == USE_PLLA || rt5682s->pll_comb == USE_PLLAB) {
238062306a36Sopenharmony_ci		dev_dbg(component->dev,
238162306a36Sopenharmony_ci			"PLLA: fin=%d fout=%d m_bp=%d k_bp=%d m=%d n=%d k=%d\n",
238262306a36Sopenharmony_ci			a_map.freq_in, a_map.freq_out, a_map.m_bp, a_map.k_bp,
238362306a36Sopenharmony_ci			(a_map.m_bp ? 0 : a_map.m), a_map.n, (a_map.k_bp ? 0 : a_map.k));
238462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_1,
238562306a36Sopenharmony_ci			RT5682S_PLLA_N_MASK, a_map.n);
238662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_2,
238762306a36Sopenharmony_ci			RT5682S_PLLA_M_MASK | RT5682S_PLLA_K_MASK,
238862306a36Sopenharmony_ci			a_map.m << RT5682S_PLLA_M_SFT | a_map.k);
238962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_6,
239062306a36Sopenharmony_ci			RT5682S_PLLA_M_BP_MASK | RT5682S_PLLA_K_BP_MASK,
239162306a36Sopenharmony_ci			a_map.m_bp << RT5682S_PLLA_M_BP_SFT |
239262306a36Sopenharmony_ci			a_map.k_bp << RT5682S_PLLA_K_BP_SFT);
239362306a36Sopenharmony_ci	}
239462306a36Sopenharmony_ci
239562306a36Sopenharmony_ci	if (rt5682s->pll_comb == USE_PLLB || rt5682s->pll_comb == USE_PLLAB) {
239662306a36Sopenharmony_ci		dev_dbg(component->dev,
239762306a36Sopenharmony_ci			"PLLB: fin=%d fout=%d m_bp=%d k_bp=%d m=%d n=%d k=%d byp_ps=%d sel_ps=%d\n",
239862306a36Sopenharmony_ci			b_map.freq_in, b_map.freq_out, b_map.m_bp, b_map.k_bp,
239962306a36Sopenharmony_ci			(b_map.m_bp ? 0 : b_map.m), b_map.n, (b_map.k_bp ? 0 : b_map.k),
240062306a36Sopenharmony_ci			b_map.byp_ps, b_map.sel_ps);
240162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_3,
240262306a36Sopenharmony_ci			RT5682S_PLLB_N_MASK, b_map.n);
240362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_4,
240462306a36Sopenharmony_ci			RT5682S_PLLB_M_MASK | RT5682S_PLLB_K_MASK,
240562306a36Sopenharmony_ci			b_map.m << RT5682S_PLLB_M_SFT | b_map.k);
240662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_6,
240762306a36Sopenharmony_ci			RT5682S_PLLB_SEL_PS_MASK | RT5682S_PLLB_BYP_PS_MASK |
240862306a36Sopenharmony_ci			RT5682S_PLLB_M_BP_MASK | RT5682S_PLLB_K_BP_MASK,
240962306a36Sopenharmony_ci			b_map.sel_ps << RT5682S_PLLB_SEL_PS_SFT |
241062306a36Sopenharmony_ci			b_map.byp_ps << RT5682S_PLLB_BYP_PS_SFT |
241162306a36Sopenharmony_ci			b_map.m_bp << RT5682S_PLLB_M_BP_SFT |
241262306a36Sopenharmony_ci			b_map.k_bp << RT5682S_PLLB_K_BP_SFT);
241362306a36Sopenharmony_ci	}
241462306a36Sopenharmony_ci
241562306a36Sopenharmony_ci	if (rt5682s->pll_comb == USE_PLLB)
241662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_7,
241762306a36Sopenharmony_ci			RT5682S_PLLB_SRC_MASK, RT5682S_PLLB_SRC_DFIN);
241862306a36Sopenharmony_ci
241962306a36Sopenharmony_ci	rt5682s->pll_in[pll_id] = freq_in;
242062306a36Sopenharmony_ci	rt5682s->pll_out[pll_id] = freq_out;
242162306a36Sopenharmony_ci	rt5682s->pll_src[pll_id] = source;
242262306a36Sopenharmony_ci
242362306a36Sopenharmony_ci	return 0;
242462306a36Sopenharmony_ci}
242562306a36Sopenharmony_ci
242662306a36Sopenharmony_cistatic int rt5682s_set_bclk1_ratio(struct snd_soc_dai *dai,
242762306a36Sopenharmony_ci		unsigned int ratio)
242862306a36Sopenharmony_ci{
242962306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
243062306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
243162306a36Sopenharmony_ci
243262306a36Sopenharmony_ci	rt5682s->bclk[dai->id] = ratio;
243362306a36Sopenharmony_ci
243462306a36Sopenharmony_ci	switch (ratio) {
243562306a36Sopenharmony_ci	case 256:
243662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,
243762306a36Sopenharmony_ci			RT5682S_TDM_BCLK_MS1_MASK, RT5682S_TDM_BCLK_MS1_256);
243862306a36Sopenharmony_ci		break;
243962306a36Sopenharmony_ci	case 128:
244062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,
244162306a36Sopenharmony_ci			RT5682S_TDM_BCLK_MS1_MASK, RT5682S_TDM_BCLK_MS1_128);
244262306a36Sopenharmony_ci		break;
244362306a36Sopenharmony_ci	case 64:
244462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,
244562306a36Sopenharmony_ci			RT5682S_TDM_BCLK_MS1_MASK, RT5682S_TDM_BCLK_MS1_64);
244662306a36Sopenharmony_ci		break;
244762306a36Sopenharmony_ci	case 32:
244862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,
244962306a36Sopenharmony_ci			RT5682S_TDM_BCLK_MS1_MASK, RT5682S_TDM_BCLK_MS1_32);
245062306a36Sopenharmony_ci		break;
245162306a36Sopenharmony_ci	default:
245262306a36Sopenharmony_ci		dev_err(dai->dev, "Invalid bclk1 ratio %d\n", ratio);
245362306a36Sopenharmony_ci		return -EINVAL;
245462306a36Sopenharmony_ci	}
245562306a36Sopenharmony_ci
245662306a36Sopenharmony_ci	return 0;
245762306a36Sopenharmony_ci}
245862306a36Sopenharmony_ci
245962306a36Sopenharmony_cistatic int rt5682s_set_bclk2_ratio(struct snd_soc_dai *dai, unsigned int ratio)
246062306a36Sopenharmony_ci{
246162306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
246262306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
246362306a36Sopenharmony_ci
246462306a36Sopenharmony_ci	rt5682s->bclk[dai->id] = ratio;
246562306a36Sopenharmony_ci
246662306a36Sopenharmony_ci	switch (ratio) {
246762306a36Sopenharmony_ci	case 64:
246862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_2,
246962306a36Sopenharmony_ci			RT5682S_I2S2_BCLK_MS2_MASK, RT5682S_I2S2_BCLK_MS2_64);
247062306a36Sopenharmony_ci		break;
247162306a36Sopenharmony_ci	case 32:
247262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_2,
247362306a36Sopenharmony_ci			RT5682S_I2S2_BCLK_MS2_MASK, RT5682S_I2S2_BCLK_MS2_32);
247462306a36Sopenharmony_ci		break;
247562306a36Sopenharmony_ci	default:
247662306a36Sopenharmony_ci		dev_err(dai->dev, "Invalid bclk2 ratio %d\n", ratio);
247762306a36Sopenharmony_ci		return -EINVAL;
247862306a36Sopenharmony_ci	}
247962306a36Sopenharmony_ci
248062306a36Sopenharmony_ci	return 0;
248162306a36Sopenharmony_ci}
248262306a36Sopenharmony_ci
248362306a36Sopenharmony_cistatic int rt5682s_set_bias_level(struct snd_soc_component *component,
248462306a36Sopenharmony_ci		enum snd_soc_bias_level level)
248562306a36Sopenharmony_ci{
248662306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
248762306a36Sopenharmony_ci
248862306a36Sopenharmony_ci	switch (level) {
248962306a36Sopenharmony_ci	case SND_SOC_BIAS_PREPARE:
249062306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_1,
249162306a36Sopenharmony_ci			RT5682S_PWR_LDO, RT5682S_PWR_LDO);
249262306a36Sopenharmony_ci		break;
249362306a36Sopenharmony_ci	case SND_SOC_BIAS_STANDBY:
249462306a36Sopenharmony_ci		if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF)
249562306a36Sopenharmony_ci			regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_1,
249662306a36Sopenharmony_ci				RT5682S_DIG_GATE_CTRL, RT5682S_DIG_GATE_CTRL);
249762306a36Sopenharmony_ci		break;
249862306a36Sopenharmony_ci	case SND_SOC_BIAS_OFF:
249962306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_1, RT5682S_PWR_LDO, 0);
250062306a36Sopenharmony_ci		if (!rt5682s->wclk_enabled)
250162306a36Sopenharmony_ci			regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_1,
250262306a36Sopenharmony_ci				RT5682S_DIG_GATE_CTRL, 0);
250362306a36Sopenharmony_ci		break;
250462306a36Sopenharmony_ci	case SND_SOC_BIAS_ON:
250562306a36Sopenharmony_ci		break;
250662306a36Sopenharmony_ci	}
250762306a36Sopenharmony_ci
250862306a36Sopenharmony_ci	return 0;
250962306a36Sopenharmony_ci}
251062306a36Sopenharmony_ci
251162306a36Sopenharmony_ci#ifdef CONFIG_COMMON_CLK
251262306a36Sopenharmony_ci#define CLK_PLL2_FIN 48000000
251362306a36Sopenharmony_ci#define CLK_48 48000
251462306a36Sopenharmony_ci#define CLK_44 44100
251562306a36Sopenharmony_ci
251662306a36Sopenharmony_cistatic bool rt5682s_clk_check(struct rt5682s_priv *rt5682s)
251762306a36Sopenharmony_ci{
251862306a36Sopenharmony_ci	if (!rt5682s->master[RT5682S_AIF1]) {
251962306a36Sopenharmony_ci		dev_dbg(rt5682s->component->dev, "dai clk fmt not set correctly\n");
252062306a36Sopenharmony_ci		return false;
252162306a36Sopenharmony_ci	}
252262306a36Sopenharmony_ci	return true;
252362306a36Sopenharmony_ci}
252462306a36Sopenharmony_ci
252562306a36Sopenharmony_cistatic int rt5682s_wclk_prepare(struct clk_hw *hw)
252662306a36Sopenharmony_ci{
252762306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
252862306a36Sopenharmony_ci		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);
252962306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
253062306a36Sopenharmony_ci	int ref, reg;
253162306a36Sopenharmony_ci
253262306a36Sopenharmony_ci	if (!rt5682s_clk_check(rt5682s))
253362306a36Sopenharmony_ci		return -EINVAL;
253462306a36Sopenharmony_ci
253562306a36Sopenharmony_ci	mutex_lock(&rt5682s->wclk_mutex);
253662306a36Sopenharmony_ci
253762306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,
253862306a36Sopenharmony_ci		RT5682S_PWR_VREF2 | RT5682S_PWR_FV2 | RT5682S_PWR_MB,
253962306a36Sopenharmony_ci		RT5682S_PWR_VREF2 | RT5682S_PWR_MB);
254062306a36Sopenharmony_ci	usleep_range(15000, 20000);
254162306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,
254262306a36Sopenharmony_ci		RT5682S_PWR_FV2, RT5682S_PWR_FV2);
254362306a36Sopenharmony_ci
254462306a36Sopenharmony_ci	/* Set and power on I2S1 */
254562306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_PWR_DIG_1,
254662306a36Sopenharmony_ci		RT5682S_DIG_GATE_CTRL, RT5682S_DIG_GATE_CTRL);
254762306a36Sopenharmony_ci	rt5682s_set_i2s(rt5682s, RT5682S_AIF1, 1);
254862306a36Sopenharmony_ci
254962306a36Sopenharmony_ci	/* Only need to power on PLLB due to the rate set restriction */
255062306a36Sopenharmony_ci	reg = RT5682S_PLL_TRACK_2;
255162306a36Sopenharmony_ci	ref = 256 * rt5682s->lrck[RT5682S_AIF1];
255262306a36Sopenharmony_ci	rt5682s_set_filter_clk(rt5682s, reg, ref);
255362306a36Sopenharmony_ci	rt5682s_set_pllb_power(rt5682s, 1);
255462306a36Sopenharmony_ci
255562306a36Sopenharmony_ci	rt5682s->wclk_enabled = 1;
255662306a36Sopenharmony_ci
255762306a36Sopenharmony_ci	mutex_unlock(&rt5682s->wclk_mutex);
255862306a36Sopenharmony_ci
255962306a36Sopenharmony_ci	return 0;
256062306a36Sopenharmony_ci}
256162306a36Sopenharmony_ci
256262306a36Sopenharmony_cistatic void rt5682s_wclk_unprepare(struct clk_hw *hw)
256362306a36Sopenharmony_ci{
256462306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
256562306a36Sopenharmony_ci		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);
256662306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
256762306a36Sopenharmony_ci
256862306a36Sopenharmony_ci	if (!rt5682s_clk_check(rt5682s))
256962306a36Sopenharmony_ci		return;
257062306a36Sopenharmony_ci
257162306a36Sopenharmony_ci	mutex_lock(&rt5682s->wclk_mutex);
257262306a36Sopenharmony_ci
257362306a36Sopenharmony_ci	if (!rt5682s->jack_type)
257462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,
257562306a36Sopenharmony_ci			RT5682S_PWR_VREF2 | RT5682S_PWR_FV2 | RT5682S_PWR_MB, 0);
257662306a36Sopenharmony_ci
257762306a36Sopenharmony_ci	/* Power down I2S1 */
257862306a36Sopenharmony_ci	rt5682s_set_i2s(rt5682s, RT5682S_AIF1, 0);
257962306a36Sopenharmony_ci	snd_soc_component_update_bits(component, RT5682S_PWR_DIG_1,
258062306a36Sopenharmony_ci		RT5682S_DIG_GATE_CTRL, 0);
258162306a36Sopenharmony_ci
258262306a36Sopenharmony_ci	/* Power down PLLB */
258362306a36Sopenharmony_ci	rt5682s_set_pllb_power(rt5682s, 0);
258462306a36Sopenharmony_ci
258562306a36Sopenharmony_ci	rt5682s->wclk_enabled = 0;
258662306a36Sopenharmony_ci
258762306a36Sopenharmony_ci	mutex_unlock(&rt5682s->wclk_mutex);
258862306a36Sopenharmony_ci}
258962306a36Sopenharmony_ci
259062306a36Sopenharmony_cistatic unsigned long rt5682s_wclk_recalc_rate(struct clk_hw *hw,
259162306a36Sopenharmony_ci					     unsigned long parent_rate)
259262306a36Sopenharmony_ci{
259362306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
259462306a36Sopenharmony_ci		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);
259562306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
259662306a36Sopenharmony_ci	const char * const clk_name = clk_hw_get_name(hw);
259762306a36Sopenharmony_ci
259862306a36Sopenharmony_ci	if (!rt5682s_clk_check(rt5682s))
259962306a36Sopenharmony_ci		return 0;
260062306a36Sopenharmony_ci	/*
260162306a36Sopenharmony_ci	 * Only accept to set wclk rate to 44.1k or 48kHz.
260262306a36Sopenharmony_ci	 */
260362306a36Sopenharmony_ci	if (rt5682s->lrck[RT5682S_AIF1] != CLK_48 &&
260462306a36Sopenharmony_ci	    rt5682s->lrck[RT5682S_AIF1] != CLK_44) {
260562306a36Sopenharmony_ci		dev_warn(component->dev, "%s: clk %s only support %d or %d Hz output\n",
260662306a36Sopenharmony_ci			__func__, clk_name, CLK_44, CLK_48);
260762306a36Sopenharmony_ci		return 0;
260862306a36Sopenharmony_ci	}
260962306a36Sopenharmony_ci
261062306a36Sopenharmony_ci	return rt5682s->lrck[RT5682S_AIF1];
261162306a36Sopenharmony_ci}
261262306a36Sopenharmony_ci
261362306a36Sopenharmony_cistatic long rt5682s_wclk_round_rate(struct clk_hw *hw, unsigned long rate,
261462306a36Sopenharmony_ci				   unsigned long *parent_rate)
261562306a36Sopenharmony_ci{
261662306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
261762306a36Sopenharmony_ci		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);
261862306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
261962306a36Sopenharmony_ci	const char * const clk_name = clk_hw_get_name(hw);
262062306a36Sopenharmony_ci
262162306a36Sopenharmony_ci	if (!rt5682s_clk_check(rt5682s))
262262306a36Sopenharmony_ci		return -EINVAL;
262362306a36Sopenharmony_ci	/*
262462306a36Sopenharmony_ci	 * Only accept to set wclk rate to 44.1k or 48kHz.
262562306a36Sopenharmony_ci	 * It will force to 48kHz if not both.
262662306a36Sopenharmony_ci	 */
262762306a36Sopenharmony_ci	if (rate != CLK_48 && rate != CLK_44) {
262862306a36Sopenharmony_ci		dev_warn(component->dev, "%s: clk %s only support %d or %d Hz output\n",
262962306a36Sopenharmony_ci			__func__, clk_name, CLK_44, CLK_48);
263062306a36Sopenharmony_ci		rate = CLK_48;
263162306a36Sopenharmony_ci	}
263262306a36Sopenharmony_ci
263362306a36Sopenharmony_ci	return rate;
263462306a36Sopenharmony_ci}
263562306a36Sopenharmony_ci
263662306a36Sopenharmony_cistatic int rt5682s_wclk_set_rate(struct clk_hw *hw, unsigned long rate,
263762306a36Sopenharmony_ci				unsigned long parent_rate)
263862306a36Sopenharmony_ci{
263962306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
264062306a36Sopenharmony_ci		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);
264162306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
264262306a36Sopenharmony_ci	struct clk *parent_clk;
264362306a36Sopenharmony_ci	const char * const clk_name = clk_hw_get_name(hw);
264462306a36Sopenharmony_ci	unsigned int clk_pll2_fout;
264562306a36Sopenharmony_ci
264662306a36Sopenharmony_ci	if (!rt5682s_clk_check(rt5682s))
264762306a36Sopenharmony_ci		return -EINVAL;
264862306a36Sopenharmony_ci
264962306a36Sopenharmony_ci	/*
265062306a36Sopenharmony_ci	 * Whether the wclk's parent clk (mclk) exists or not, please ensure
265162306a36Sopenharmony_ci	 * it is fixed or set to 48MHz before setting wclk rate. It's a
265262306a36Sopenharmony_ci	 * temporary limitation. Only accept 48MHz clk as the clk provider.
265362306a36Sopenharmony_ci	 *
265462306a36Sopenharmony_ci	 * It will set the codec anyway by assuming mclk is 48MHz.
265562306a36Sopenharmony_ci	 */
265662306a36Sopenharmony_ci	parent_clk = clk_get_parent(hw->clk);
265762306a36Sopenharmony_ci	if (!parent_clk)
265862306a36Sopenharmony_ci		dev_warn(component->dev,
265962306a36Sopenharmony_ci			"Parent mclk of wclk not acquired in driver. Please ensure mclk was provided as %d Hz.\n",
266062306a36Sopenharmony_ci			CLK_PLL2_FIN);
266162306a36Sopenharmony_ci
266262306a36Sopenharmony_ci	if (parent_rate != CLK_PLL2_FIN)
266362306a36Sopenharmony_ci		dev_warn(component->dev, "clk %s only support %d Hz input\n",
266462306a36Sopenharmony_ci			clk_name, CLK_PLL2_FIN);
266562306a36Sopenharmony_ci
266662306a36Sopenharmony_ci	/*
266762306a36Sopenharmony_ci	 * To achieve the rate conversion from 48MHz to 44.1k or 48kHz,
266862306a36Sopenharmony_ci	 * PLL2 is needed.
266962306a36Sopenharmony_ci	 */
267062306a36Sopenharmony_ci	clk_pll2_fout = rate * 512;
267162306a36Sopenharmony_ci	rt5682s_set_component_pll(component, RT5682S_PLL2, RT5682S_PLL_S_MCLK,
267262306a36Sopenharmony_ci		CLK_PLL2_FIN, clk_pll2_fout);
267362306a36Sopenharmony_ci
267462306a36Sopenharmony_ci	rt5682s_set_component_sysclk(component, RT5682S_SCLK_S_PLL2, 0,
267562306a36Sopenharmony_ci		clk_pll2_fout, SND_SOC_CLOCK_IN);
267662306a36Sopenharmony_ci
267762306a36Sopenharmony_ci	rt5682s->lrck[RT5682S_AIF1] = rate;
267862306a36Sopenharmony_ci
267962306a36Sopenharmony_ci	return 0;
268062306a36Sopenharmony_ci}
268162306a36Sopenharmony_ci
268262306a36Sopenharmony_cistatic unsigned long rt5682s_bclk_recalc_rate(struct clk_hw *hw,
268362306a36Sopenharmony_ci					     unsigned long parent_rate)
268462306a36Sopenharmony_ci{
268562306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
268662306a36Sopenharmony_ci		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_BCLK_IDX]);
268762306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
268862306a36Sopenharmony_ci	unsigned int bclks_per_wclk;
268962306a36Sopenharmony_ci
269062306a36Sopenharmony_ci	bclks_per_wclk = snd_soc_component_read(component, RT5682S_TDM_TCON_CTRL_1);
269162306a36Sopenharmony_ci
269262306a36Sopenharmony_ci	switch (bclks_per_wclk & RT5682S_TDM_BCLK_MS1_MASK) {
269362306a36Sopenharmony_ci	case RT5682S_TDM_BCLK_MS1_256:
269462306a36Sopenharmony_ci		return parent_rate * 256;
269562306a36Sopenharmony_ci	case RT5682S_TDM_BCLK_MS1_128:
269662306a36Sopenharmony_ci		return parent_rate * 128;
269762306a36Sopenharmony_ci	case RT5682S_TDM_BCLK_MS1_64:
269862306a36Sopenharmony_ci		return parent_rate * 64;
269962306a36Sopenharmony_ci	case RT5682S_TDM_BCLK_MS1_32:
270062306a36Sopenharmony_ci		return parent_rate * 32;
270162306a36Sopenharmony_ci	default:
270262306a36Sopenharmony_ci		return 0;
270362306a36Sopenharmony_ci	}
270462306a36Sopenharmony_ci}
270562306a36Sopenharmony_ci
270662306a36Sopenharmony_cistatic unsigned long rt5682s_bclk_get_factor(unsigned long rate,
270762306a36Sopenharmony_ci					    unsigned long parent_rate)
270862306a36Sopenharmony_ci{
270962306a36Sopenharmony_ci	unsigned long factor;
271062306a36Sopenharmony_ci
271162306a36Sopenharmony_ci	factor = rate / parent_rate;
271262306a36Sopenharmony_ci	if (factor < 64)
271362306a36Sopenharmony_ci		return 32;
271462306a36Sopenharmony_ci	else if (factor < 128)
271562306a36Sopenharmony_ci		return 64;
271662306a36Sopenharmony_ci	else if (factor < 256)
271762306a36Sopenharmony_ci		return 128;
271862306a36Sopenharmony_ci	else
271962306a36Sopenharmony_ci		return 256;
272062306a36Sopenharmony_ci}
272162306a36Sopenharmony_ci
272262306a36Sopenharmony_cistatic long rt5682s_bclk_round_rate(struct clk_hw *hw, unsigned long rate,
272362306a36Sopenharmony_ci				   unsigned long *parent_rate)
272462306a36Sopenharmony_ci{
272562306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
272662306a36Sopenharmony_ci		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_BCLK_IDX]);
272762306a36Sopenharmony_ci	unsigned long factor;
272862306a36Sopenharmony_ci
272962306a36Sopenharmony_ci	if (!*parent_rate || !rt5682s_clk_check(rt5682s))
273062306a36Sopenharmony_ci		return -EINVAL;
273162306a36Sopenharmony_ci
273262306a36Sopenharmony_ci	/*
273362306a36Sopenharmony_ci	 * BCLK rates are set as a multiplier of WCLK in HW.
273462306a36Sopenharmony_ci	 * We don't allow changing the parent WCLK. We just do
273562306a36Sopenharmony_ci	 * some rounding down based on the parent WCLK rate
273662306a36Sopenharmony_ci	 * and find the appropriate multiplier of BCLK to
273762306a36Sopenharmony_ci	 * get the rounded down BCLK value.
273862306a36Sopenharmony_ci	 */
273962306a36Sopenharmony_ci	factor = rt5682s_bclk_get_factor(rate, *parent_rate);
274062306a36Sopenharmony_ci
274162306a36Sopenharmony_ci	return *parent_rate * factor;
274262306a36Sopenharmony_ci}
274362306a36Sopenharmony_ci
274462306a36Sopenharmony_cistatic int rt5682s_bclk_set_rate(struct clk_hw *hw, unsigned long rate,
274562306a36Sopenharmony_ci				unsigned long parent_rate)
274662306a36Sopenharmony_ci{
274762306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s =
274862306a36Sopenharmony_ci		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_BCLK_IDX]);
274962306a36Sopenharmony_ci	struct snd_soc_component *component = rt5682s->component;
275062306a36Sopenharmony_ci	struct snd_soc_dai *dai;
275162306a36Sopenharmony_ci	unsigned long factor;
275262306a36Sopenharmony_ci
275362306a36Sopenharmony_ci	if (!rt5682s_clk_check(rt5682s))
275462306a36Sopenharmony_ci		return -EINVAL;
275562306a36Sopenharmony_ci
275662306a36Sopenharmony_ci	factor = rt5682s_bclk_get_factor(rate, parent_rate);
275762306a36Sopenharmony_ci
275862306a36Sopenharmony_ci	for_each_component_dais(component, dai)
275962306a36Sopenharmony_ci		if (dai->id == RT5682S_AIF1)
276062306a36Sopenharmony_ci			return rt5682s_set_bclk1_ratio(dai, factor);
276162306a36Sopenharmony_ci
276262306a36Sopenharmony_ci	dev_err(component->dev, "dai %d not found in component\n",
276362306a36Sopenharmony_ci		RT5682S_AIF1);
276462306a36Sopenharmony_ci	return -ENODEV;
276562306a36Sopenharmony_ci}
276662306a36Sopenharmony_ci
276762306a36Sopenharmony_cistatic const struct clk_ops rt5682s_dai_clk_ops[RT5682S_DAI_NUM_CLKS] = {
276862306a36Sopenharmony_ci	[RT5682S_DAI_WCLK_IDX] = {
276962306a36Sopenharmony_ci		.prepare = rt5682s_wclk_prepare,
277062306a36Sopenharmony_ci		.unprepare = rt5682s_wclk_unprepare,
277162306a36Sopenharmony_ci		.recalc_rate = rt5682s_wclk_recalc_rate,
277262306a36Sopenharmony_ci		.round_rate = rt5682s_wclk_round_rate,
277362306a36Sopenharmony_ci		.set_rate = rt5682s_wclk_set_rate,
277462306a36Sopenharmony_ci	},
277562306a36Sopenharmony_ci	[RT5682S_DAI_BCLK_IDX] = {
277662306a36Sopenharmony_ci		.recalc_rate = rt5682s_bclk_recalc_rate,
277762306a36Sopenharmony_ci		.round_rate = rt5682s_bclk_round_rate,
277862306a36Sopenharmony_ci		.set_rate = rt5682s_bclk_set_rate,
277962306a36Sopenharmony_ci	},
278062306a36Sopenharmony_ci};
278162306a36Sopenharmony_ci
278262306a36Sopenharmony_cistatic int rt5682s_register_dai_clks(struct snd_soc_component *component)
278362306a36Sopenharmony_ci{
278462306a36Sopenharmony_ci	struct device *dev = component->dev;
278562306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
278662306a36Sopenharmony_ci	struct rt5682s_platform_data *pdata = &rt5682s->pdata;
278762306a36Sopenharmony_ci	struct clk_hw *dai_clk_hw;
278862306a36Sopenharmony_ci	int i, ret;
278962306a36Sopenharmony_ci
279062306a36Sopenharmony_ci	for (i = 0; i < RT5682S_DAI_NUM_CLKS; ++i) {
279162306a36Sopenharmony_ci		struct clk_init_data init = { };
279262306a36Sopenharmony_ci		struct clk_parent_data parent_data;
279362306a36Sopenharmony_ci		const struct clk_hw *parent;
279462306a36Sopenharmony_ci
279562306a36Sopenharmony_ci		dai_clk_hw = &rt5682s->dai_clks_hw[i];
279662306a36Sopenharmony_ci
279762306a36Sopenharmony_ci		switch (i) {
279862306a36Sopenharmony_ci		case RT5682S_DAI_WCLK_IDX:
279962306a36Sopenharmony_ci			/* Make MCLK the parent of WCLK */
280062306a36Sopenharmony_ci			if (rt5682s->mclk) {
280162306a36Sopenharmony_ci				parent_data = (struct clk_parent_data){
280262306a36Sopenharmony_ci					.fw_name = "mclk",
280362306a36Sopenharmony_ci				};
280462306a36Sopenharmony_ci				init.parent_data = &parent_data;
280562306a36Sopenharmony_ci				init.num_parents = 1;
280662306a36Sopenharmony_ci			}
280762306a36Sopenharmony_ci			break;
280862306a36Sopenharmony_ci		case RT5682S_DAI_BCLK_IDX:
280962306a36Sopenharmony_ci			/* Make WCLK the parent of BCLK */
281062306a36Sopenharmony_ci			parent = &rt5682s->dai_clks_hw[RT5682S_DAI_WCLK_IDX];
281162306a36Sopenharmony_ci			init.parent_hws = &parent;
281262306a36Sopenharmony_ci			init.num_parents = 1;
281362306a36Sopenharmony_ci			break;
281462306a36Sopenharmony_ci		default:
281562306a36Sopenharmony_ci			dev_err(dev, "Invalid clock index\n");
281662306a36Sopenharmony_ci			return -EINVAL;
281762306a36Sopenharmony_ci		}
281862306a36Sopenharmony_ci
281962306a36Sopenharmony_ci		init.name = pdata->dai_clk_names[i];
282062306a36Sopenharmony_ci		init.ops = &rt5682s_dai_clk_ops[i];
282162306a36Sopenharmony_ci		init.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_GATE;
282262306a36Sopenharmony_ci		dai_clk_hw->init = &init;
282362306a36Sopenharmony_ci
282462306a36Sopenharmony_ci		ret = devm_clk_hw_register(dev, dai_clk_hw);
282562306a36Sopenharmony_ci		if (ret) {
282662306a36Sopenharmony_ci			dev_warn(dev, "Failed to register %s: %d\n", init.name, ret);
282762306a36Sopenharmony_ci			return ret;
282862306a36Sopenharmony_ci		}
282962306a36Sopenharmony_ci
283062306a36Sopenharmony_ci		if (dev->of_node) {
283162306a36Sopenharmony_ci			devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, dai_clk_hw);
283262306a36Sopenharmony_ci		} else {
283362306a36Sopenharmony_ci			ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw,
283462306a36Sopenharmony_ci							  init.name, dev_name(dev));
283562306a36Sopenharmony_ci			if (ret)
283662306a36Sopenharmony_ci				return ret;
283762306a36Sopenharmony_ci		}
283862306a36Sopenharmony_ci	}
283962306a36Sopenharmony_ci
284062306a36Sopenharmony_ci	return 0;
284162306a36Sopenharmony_ci}
284262306a36Sopenharmony_ci
284362306a36Sopenharmony_cistatic int rt5682s_dai_probe_clks(struct snd_soc_component *component)
284462306a36Sopenharmony_ci{
284562306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
284662306a36Sopenharmony_ci	int ret;
284762306a36Sopenharmony_ci
284862306a36Sopenharmony_ci	/* Check if MCLK provided */
284962306a36Sopenharmony_ci	rt5682s->mclk = devm_clk_get_optional(component->dev, "mclk");
285062306a36Sopenharmony_ci	if (IS_ERR(rt5682s->mclk))
285162306a36Sopenharmony_ci		return PTR_ERR(rt5682s->mclk);
285262306a36Sopenharmony_ci
285362306a36Sopenharmony_ci	/* Register CCF DAI clock control */
285462306a36Sopenharmony_ci	ret = rt5682s_register_dai_clks(component);
285562306a36Sopenharmony_ci	if (ret)
285662306a36Sopenharmony_ci		return ret;
285762306a36Sopenharmony_ci
285862306a36Sopenharmony_ci	/* Initial setup for CCF */
285962306a36Sopenharmony_ci	rt5682s->lrck[RT5682S_AIF1] = CLK_48;
286062306a36Sopenharmony_ci
286162306a36Sopenharmony_ci	return 0;
286262306a36Sopenharmony_ci}
286362306a36Sopenharmony_ci#else
286462306a36Sopenharmony_cistatic inline int rt5682s_dai_probe_clks(struct snd_soc_component *component)
286562306a36Sopenharmony_ci{
286662306a36Sopenharmony_ci	return 0;
286762306a36Sopenharmony_ci}
286862306a36Sopenharmony_ci#endif /* CONFIG_COMMON_CLK */
286962306a36Sopenharmony_ci
287062306a36Sopenharmony_cistatic int rt5682s_probe(struct snd_soc_component *component)
287162306a36Sopenharmony_ci{
287262306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
287362306a36Sopenharmony_ci
287462306a36Sopenharmony_ci	rt5682s->component = component;
287562306a36Sopenharmony_ci
287662306a36Sopenharmony_ci	return rt5682s_dai_probe_clks(component);
287762306a36Sopenharmony_ci}
287862306a36Sopenharmony_ci
287962306a36Sopenharmony_cistatic void rt5682s_remove(struct snd_soc_component *component)
288062306a36Sopenharmony_ci{
288162306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
288262306a36Sopenharmony_ci
288362306a36Sopenharmony_ci	rt5682s_reset(rt5682s);
288462306a36Sopenharmony_ci}
288562306a36Sopenharmony_ci
288662306a36Sopenharmony_ci#ifdef CONFIG_PM
288762306a36Sopenharmony_cistatic int rt5682s_suspend(struct snd_soc_component *component)
288862306a36Sopenharmony_ci{
288962306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
289062306a36Sopenharmony_ci
289162306a36Sopenharmony_ci	if (rt5682s->irq)
289262306a36Sopenharmony_ci		disable_irq(rt5682s->irq);
289362306a36Sopenharmony_ci
289462306a36Sopenharmony_ci	cancel_delayed_work_sync(&rt5682s->jack_detect_work);
289562306a36Sopenharmony_ci	cancel_delayed_work_sync(&rt5682s->jd_check_work);
289662306a36Sopenharmony_ci
289762306a36Sopenharmony_ci	if (rt5682s->hs_jack)
289862306a36Sopenharmony_ci		rt5682s->jack_type = rt5682s_headset_detect(component, 0);
289962306a36Sopenharmony_ci
290062306a36Sopenharmony_ci	regcache_cache_only(rt5682s->regmap, true);
290162306a36Sopenharmony_ci	regcache_mark_dirty(rt5682s->regmap);
290262306a36Sopenharmony_ci
290362306a36Sopenharmony_ci	return 0;
290462306a36Sopenharmony_ci}
290562306a36Sopenharmony_ci
290662306a36Sopenharmony_cistatic int rt5682s_resume(struct snd_soc_component *component)
290762306a36Sopenharmony_ci{
290862306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);
290962306a36Sopenharmony_ci
291062306a36Sopenharmony_ci	regcache_cache_only(rt5682s->regmap, false);
291162306a36Sopenharmony_ci	regcache_sync(rt5682s->regmap);
291262306a36Sopenharmony_ci
291362306a36Sopenharmony_ci	if (rt5682s->hs_jack) {
291462306a36Sopenharmony_ci		mod_delayed_work(system_power_efficient_wq,
291562306a36Sopenharmony_ci			&rt5682s->jack_detect_work, msecs_to_jiffies(0));
291662306a36Sopenharmony_ci	}
291762306a36Sopenharmony_ci
291862306a36Sopenharmony_ci	if (rt5682s->irq)
291962306a36Sopenharmony_ci		enable_irq(rt5682s->irq);
292062306a36Sopenharmony_ci
292162306a36Sopenharmony_ci	return 0;
292262306a36Sopenharmony_ci}
292362306a36Sopenharmony_ci#else
292462306a36Sopenharmony_ci#define rt5682s_suspend NULL
292562306a36Sopenharmony_ci#define rt5682s_resume NULL
292662306a36Sopenharmony_ci#endif
292762306a36Sopenharmony_ci
292862306a36Sopenharmony_cistatic const struct snd_soc_dai_ops rt5682s_aif1_dai_ops = {
292962306a36Sopenharmony_ci	.hw_params = rt5682s_hw_params,
293062306a36Sopenharmony_ci	.set_fmt = rt5682s_set_dai_fmt,
293162306a36Sopenharmony_ci	.set_tdm_slot = rt5682s_set_tdm_slot,
293262306a36Sopenharmony_ci	.set_bclk_ratio = rt5682s_set_bclk1_ratio,
293362306a36Sopenharmony_ci};
293462306a36Sopenharmony_ci
293562306a36Sopenharmony_cistatic const struct snd_soc_dai_ops rt5682s_aif2_dai_ops = {
293662306a36Sopenharmony_ci	.hw_params = rt5682s_hw_params,
293762306a36Sopenharmony_ci	.set_fmt = rt5682s_set_dai_fmt,
293862306a36Sopenharmony_ci	.set_bclk_ratio = rt5682s_set_bclk2_ratio,
293962306a36Sopenharmony_ci};
294062306a36Sopenharmony_ci
294162306a36Sopenharmony_cistatic const struct snd_soc_component_driver rt5682s_soc_component_dev = {
294262306a36Sopenharmony_ci	.probe = rt5682s_probe,
294362306a36Sopenharmony_ci	.remove = rt5682s_remove,
294462306a36Sopenharmony_ci	.suspend = rt5682s_suspend,
294562306a36Sopenharmony_ci	.resume = rt5682s_resume,
294662306a36Sopenharmony_ci	.set_bias_level = rt5682s_set_bias_level,
294762306a36Sopenharmony_ci	.controls = rt5682s_snd_controls,
294862306a36Sopenharmony_ci	.num_controls = ARRAY_SIZE(rt5682s_snd_controls),
294962306a36Sopenharmony_ci	.dapm_widgets = rt5682s_dapm_widgets,
295062306a36Sopenharmony_ci	.num_dapm_widgets = ARRAY_SIZE(rt5682s_dapm_widgets),
295162306a36Sopenharmony_ci	.dapm_routes = rt5682s_dapm_routes,
295262306a36Sopenharmony_ci	.num_dapm_routes = ARRAY_SIZE(rt5682s_dapm_routes),
295362306a36Sopenharmony_ci	.set_sysclk = rt5682s_set_component_sysclk,
295462306a36Sopenharmony_ci	.set_pll = rt5682s_set_component_pll,
295562306a36Sopenharmony_ci	.set_jack = rt5682s_set_jack_detect,
295662306a36Sopenharmony_ci	.use_pmdown_time	= 1,
295762306a36Sopenharmony_ci	.endianness		= 1,
295862306a36Sopenharmony_ci};
295962306a36Sopenharmony_ci
296062306a36Sopenharmony_cistatic int rt5682s_parse_dt(struct rt5682s_priv *rt5682s, struct device *dev)
296162306a36Sopenharmony_ci{
296262306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,dmic1-data-pin",
296362306a36Sopenharmony_ci		&rt5682s->pdata.dmic1_data_pin);
296462306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,dmic1-clk-pin",
296562306a36Sopenharmony_ci		&rt5682s->pdata.dmic1_clk_pin);
296662306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,jd-src",
296762306a36Sopenharmony_ci		&rt5682s->pdata.jd_src);
296862306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,dmic-clk-rate-hz",
296962306a36Sopenharmony_ci		&rt5682s->pdata.dmic_clk_rate);
297062306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,dmic-delay-ms",
297162306a36Sopenharmony_ci		&rt5682s->pdata.dmic_delay);
297262306a36Sopenharmony_ci	device_property_read_u32(dev, "realtek,amic-delay-ms",
297362306a36Sopenharmony_ci		&rt5682s->pdata.amic_delay);
297462306a36Sopenharmony_ci
297562306a36Sopenharmony_ci	if (device_property_read_string_array(dev, "clock-output-names",
297662306a36Sopenharmony_ci					      rt5682s->pdata.dai_clk_names,
297762306a36Sopenharmony_ci					      RT5682S_DAI_NUM_CLKS) < 0)
297862306a36Sopenharmony_ci		dev_warn(dev, "Using default DAI clk names: %s, %s\n",
297962306a36Sopenharmony_ci			 rt5682s->pdata.dai_clk_names[RT5682S_DAI_WCLK_IDX],
298062306a36Sopenharmony_ci			 rt5682s->pdata.dai_clk_names[RT5682S_DAI_BCLK_IDX]);
298162306a36Sopenharmony_ci
298262306a36Sopenharmony_ci	rt5682s->pdata.dmic_clk_driving_high = device_property_read_bool(dev,
298362306a36Sopenharmony_ci		"realtek,dmic-clk-driving-high");
298462306a36Sopenharmony_ci
298562306a36Sopenharmony_ci	return 0;
298662306a36Sopenharmony_ci}
298762306a36Sopenharmony_ci
298862306a36Sopenharmony_cistatic void rt5682s_calibrate(struct rt5682s_priv *rt5682s)
298962306a36Sopenharmony_ci{
299062306a36Sopenharmony_ci	unsigned int count, value;
299162306a36Sopenharmony_ci
299262306a36Sopenharmony_ci	mutex_lock(&rt5682s->calibrate_mutex);
299362306a36Sopenharmony_ci
299462306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0xaa80);
299562306a36Sopenharmony_ci	usleep_range(15000, 20000);
299662306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0xfa80);
299762306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_PWR_DIG_1, 0x01c0);
299862306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_MICBIAS_2, 0x0380);
299962306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_GLB_CLK, 0x8000);
300062306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_ADDA_CLK_1, 0x1001);
300162306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_CHOP_DAC_2, 0x3030);
300262306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_CHOP_ADC, 0xb000);
300362306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_STO1_ADC_MIXER, 0x686c);
300462306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_CAL_REC, 0x5151);
300562306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_2, 0x0321);
300662306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_HP_LOGIC_CTRL_2, 0x0004);
300762306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_1, 0x7c00);
300862306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_1, 0xfc00);
300962306a36Sopenharmony_ci
301062306a36Sopenharmony_ci	for (count = 0; count < 60; count++) {
301162306a36Sopenharmony_ci		regmap_read(rt5682s->regmap, RT5682S_HP_CALIB_ST_1, &value);
301262306a36Sopenharmony_ci		if (!(value & 0x8000))
301362306a36Sopenharmony_ci			break;
301462306a36Sopenharmony_ci
301562306a36Sopenharmony_ci		usleep_range(10000, 10005);
301662306a36Sopenharmony_ci	}
301762306a36Sopenharmony_ci
301862306a36Sopenharmony_ci	if (count >= 60)
301962306a36Sopenharmony_ci		dev_err(rt5682s->component->dev, "HP Calibration Failure\n");
302062306a36Sopenharmony_ci
302162306a36Sopenharmony_ci	/* restore settings */
302262306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_MICBIAS_2, 0x0180);
302362306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_CAL_REC, 0x5858);
302462306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_STO1_ADC_MIXER, 0xc0c4);
302562306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_2, 0x0320);
302662306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_PWR_DIG_1, 0x00c0);
302762306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0x0800);
302862306a36Sopenharmony_ci	regmap_write(rt5682s->regmap, RT5682S_GLB_CLK, 0x0000);
302962306a36Sopenharmony_ci
303062306a36Sopenharmony_ci	mutex_unlock(&rt5682s->calibrate_mutex);
303162306a36Sopenharmony_ci}
303262306a36Sopenharmony_ci
303362306a36Sopenharmony_cistatic const struct regmap_config rt5682s_regmap = {
303462306a36Sopenharmony_ci	.reg_bits = 16,
303562306a36Sopenharmony_ci	.val_bits = 16,
303662306a36Sopenharmony_ci	.max_register = RT5682S_MAX_REG,
303762306a36Sopenharmony_ci	.volatile_reg = rt5682s_volatile_register,
303862306a36Sopenharmony_ci	.readable_reg = rt5682s_readable_register,
303962306a36Sopenharmony_ci	.cache_type = REGCACHE_MAPLE,
304062306a36Sopenharmony_ci	.reg_defaults = rt5682s_reg,
304162306a36Sopenharmony_ci	.num_reg_defaults = ARRAY_SIZE(rt5682s_reg),
304262306a36Sopenharmony_ci	.use_single_read = true,
304362306a36Sopenharmony_ci	.use_single_write = true,
304462306a36Sopenharmony_ci};
304562306a36Sopenharmony_ci
304662306a36Sopenharmony_cistatic struct snd_soc_dai_driver rt5682s_dai[] = {
304762306a36Sopenharmony_ci	{
304862306a36Sopenharmony_ci		.name = "rt5682s-aif1",
304962306a36Sopenharmony_ci		.id = RT5682S_AIF1,
305062306a36Sopenharmony_ci		.playback = {
305162306a36Sopenharmony_ci			.stream_name = "AIF1 Playback",
305262306a36Sopenharmony_ci			.channels_min = 1,
305362306a36Sopenharmony_ci			.channels_max = 2,
305462306a36Sopenharmony_ci			.rates = RT5682S_STEREO_RATES,
305562306a36Sopenharmony_ci			.formats = RT5682S_FORMATS,
305662306a36Sopenharmony_ci		},
305762306a36Sopenharmony_ci		.capture = {
305862306a36Sopenharmony_ci			.stream_name = "AIF1 Capture",
305962306a36Sopenharmony_ci			.channels_min = 1,
306062306a36Sopenharmony_ci			.channels_max = 2,
306162306a36Sopenharmony_ci			.rates = RT5682S_STEREO_RATES,
306262306a36Sopenharmony_ci			.formats = RT5682S_FORMATS,
306362306a36Sopenharmony_ci		},
306462306a36Sopenharmony_ci		.ops = &rt5682s_aif1_dai_ops,
306562306a36Sopenharmony_ci	},
306662306a36Sopenharmony_ci	{
306762306a36Sopenharmony_ci		.name = "rt5682s-aif2",
306862306a36Sopenharmony_ci		.id = RT5682S_AIF2,
306962306a36Sopenharmony_ci		.capture = {
307062306a36Sopenharmony_ci			.stream_name = "AIF2 Capture",
307162306a36Sopenharmony_ci			.channels_min = 1,
307262306a36Sopenharmony_ci			.channels_max = 2,
307362306a36Sopenharmony_ci			.rates = RT5682S_STEREO_RATES,
307462306a36Sopenharmony_ci			.formats = RT5682S_FORMATS,
307562306a36Sopenharmony_ci		},
307662306a36Sopenharmony_ci		.ops = &rt5682s_aif2_dai_ops,
307762306a36Sopenharmony_ci	},
307862306a36Sopenharmony_ci};
307962306a36Sopenharmony_ci
308062306a36Sopenharmony_cistatic void rt5682s_i2c_disable_regulators(void *data)
308162306a36Sopenharmony_ci{
308262306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = data;
308362306a36Sopenharmony_ci	struct device *dev = regmap_get_device(rt5682s->regmap);
308462306a36Sopenharmony_ci	int ret;
308562306a36Sopenharmony_ci
308662306a36Sopenharmony_ci	ret = regulator_disable(rt5682s->supplies[RT5682S_SUPPLY_AVDD].consumer);
308762306a36Sopenharmony_ci	if (ret)
308862306a36Sopenharmony_ci		dev_err(dev, "Failed to disable supply AVDD: %d\n", ret);
308962306a36Sopenharmony_ci
309062306a36Sopenharmony_ci	ret = regulator_disable(rt5682s->supplies[RT5682S_SUPPLY_DBVDD].consumer);
309162306a36Sopenharmony_ci	if (ret)
309262306a36Sopenharmony_ci		dev_err(dev, "Failed to disable supply DBVDD: %d\n", ret);
309362306a36Sopenharmony_ci
309462306a36Sopenharmony_ci	ret = regulator_disable(rt5682s->supplies[RT5682S_SUPPLY_LDO1_IN].consumer);
309562306a36Sopenharmony_ci	if (ret)
309662306a36Sopenharmony_ci		dev_err(dev, "Failed to disable supply LDO1-IN: %d\n", ret);
309762306a36Sopenharmony_ci
309862306a36Sopenharmony_ci	usleep_range(1000, 1500);
309962306a36Sopenharmony_ci
310062306a36Sopenharmony_ci	ret = regulator_disable(rt5682s->supplies[RT5682S_SUPPLY_MICVDD].consumer);
310162306a36Sopenharmony_ci	if (ret)
310262306a36Sopenharmony_ci		dev_err(dev, "Failed to disable supply MICVDD: %d\n", ret);
310362306a36Sopenharmony_ci}
310462306a36Sopenharmony_ci
310562306a36Sopenharmony_cistatic int rt5682s_i2c_probe(struct i2c_client *i2c)
310662306a36Sopenharmony_ci{
310762306a36Sopenharmony_ci	struct rt5682s_platform_data *pdata = dev_get_platdata(&i2c->dev);
310862306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s;
310962306a36Sopenharmony_ci	int i, ret;
311062306a36Sopenharmony_ci	unsigned int val;
311162306a36Sopenharmony_ci
311262306a36Sopenharmony_ci	rt5682s = devm_kzalloc(&i2c->dev, sizeof(struct rt5682s_priv), GFP_KERNEL);
311362306a36Sopenharmony_ci	if (!rt5682s)
311462306a36Sopenharmony_ci		return -ENOMEM;
311562306a36Sopenharmony_ci
311662306a36Sopenharmony_ci	i2c_set_clientdata(i2c, rt5682s);
311762306a36Sopenharmony_ci
311862306a36Sopenharmony_ci	rt5682s->pdata = i2s_default_platform_data;
311962306a36Sopenharmony_ci
312062306a36Sopenharmony_ci	if (pdata)
312162306a36Sopenharmony_ci		rt5682s->pdata = *pdata;
312262306a36Sopenharmony_ci	else
312362306a36Sopenharmony_ci		rt5682s_parse_dt(rt5682s, &i2c->dev);
312462306a36Sopenharmony_ci
312562306a36Sopenharmony_ci	rt5682s->regmap = devm_regmap_init_i2c(i2c, &rt5682s_regmap);
312662306a36Sopenharmony_ci	if (IS_ERR(rt5682s->regmap)) {
312762306a36Sopenharmony_ci		ret = PTR_ERR(rt5682s->regmap);
312862306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to allocate register map: %d\n", ret);
312962306a36Sopenharmony_ci		return ret;
313062306a36Sopenharmony_ci	}
313162306a36Sopenharmony_ci
313262306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(rt5682s->supplies); i++)
313362306a36Sopenharmony_ci		rt5682s->supplies[i].supply = rt5682s_supply_names[i];
313462306a36Sopenharmony_ci
313562306a36Sopenharmony_ci	ret = devm_regulator_bulk_get(&i2c->dev,
313662306a36Sopenharmony_ci			ARRAY_SIZE(rt5682s->supplies), rt5682s->supplies);
313762306a36Sopenharmony_ci	if (ret) {
313862306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
313962306a36Sopenharmony_ci		return ret;
314062306a36Sopenharmony_ci	}
314162306a36Sopenharmony_ci
314262306a36Sopenharmony_ci	ret = devm_add_action_or_reset(&i2c->dev, rt5682s_i2c_disable_regulators, rt5682s);
314362306a36Sopenharmony_ci	if (ret)
314462306a36Sopenharmony_ci		return ret;
314562306a36Sopenharmony_ci
314662306a36Sopenharmony_ci	ret = regulator_enable(rt5682s->supplies[RT5682S_SUPPLY_MICVDD].consumer);
314762306a36Sopenharmony_ci	if (ret) {
314862306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to enable supply MICVDD: %d\n", ret);
314962306a36Sopenharmony_ci		return ret;
315062306a36Sopenharmony_ci	}
315162306a36Sopenharmony_ci	usleep_range(1000, 1500);
315262306a36Sopenharmony_ci
315362306a36Sopenharmony_ci	ret = regulator_enable(rt5682s->supplies[RT5682S_SUPPLY_AVDD].consumer);
315462306a36Sopenharmony_ci	if (ret) {
315562306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to enable supply AVDD: %d\n", ret);
315662306a36Sopenharmony_ci		return ret;
315762306a36Sopenharmony_ci	}
315862306a36Sopenharmony_ci
315962306a36Sopenharmony_ci	ret = regulator_enable(rt5682s->supplies[RT5682S_SUPPLY_DBVDD].consumer);
316062306a36Sopenharmony_ci	if (ret) {
316162306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to enable supply DBVDD: %d\n", ret);
316262306a36Sopenharmony_ci		return ret;
316362306a36Sopenharmony_ci	}
316462306a36Sopenharmony_ci
316562306a36Sopenharmony_ci	ret = regulator_enable(rt5682s->supplies[RT5682S_SUPPLY_LDO1_IN].consumer);
316662306a36Sopenharmony_ci	if (ret) {
316762306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to enable supply LDO1-IN: %d\n", ret);
316862306a36Sopenharmony_ci		return ret;
316962306a36Sopenharmony_ci	}
317062306a36Sopenharmony_ci
317162306a36Sopenharmony_ci	rt5682s->ldo1_en = devm_gpiod_get_optional(&i2c->dev,
317262306a36Sopenharmony_ci						   "realtek,ldo1-en",
317362306a36Sopenharmony_ci						   GPIOD_OUT_HIGH);
317462306a36Sopenharmony_ci	if (IS_ERR(rt5682s->ldo1_en)) {
317562306a36Sopenharmony_ci		dev_err(&i2c->dev, "Fail gpio request ldo1_en\n");
317662306a36Sopenharmony_ci		return PTR_ERR(rt5682s->ldo1_en);
317762306a36Sopenharmony_ci	}
317862306a36Sopenharmony_ci
317962306a36Sopenharmony_ci	/* Sleep for 50 ms minimum */
318062306a36Sopenharmony_ci	usleep_range(50000, 55000);
318162306a36Sopenharmony_ci
318262306a36Sopenharmony_ci	regmap_read(rt5682s->regmap, RT5682S_DEVICE_ID, &val);
318362306a36Sopenharmony_ci	if (val != DEVICE_ID) {
318462306a36Sopenharmony_ci		dev_err(&i2c->dev, "Device with ID register %x is not rt5682s\n", val);
318562306a36Sopenharmony_ci		return -ENODEV;
318662306a36Sopenharmony_ci	}
318762306a36Sopenharmony_ci
318862306a36Sopenharmony_ci	rt5682s_reset(rt5682s);
318962306a36Sopenharmony_ci	rt5682s_apply_patch_list(rt5682s, &i2c->dev);
319062306a36Sopenharmony_ci
319162306a36Sopenharmony_ci	regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_2,
319262306a36Sopenharmony_ci		RT5682S_DLDO_I_LIMIT_MASK, RT5682S_DLDO_I_LIMIT_DIS);
319362306a36Sopenharmony_ci	usleep_range(20000, 25000);
319462306a36Sopenharmony_ci
319562306a36Sopenharmony_ci	mutex_init(&rt5682s->calibrate_mutex);
319662306a36Sopenharmony_ci	mutex_init(&rt5682s->sar_mutex);
319762306a36Sopenharmony_ci	mutex_init(&rt5682s->wclk_mutex);
319862306a36Sopenharmony_ci	rt5682s_calibrate(rt5682s);
319962306a36Sopenharmony_ci
320062306a36Sopenharmony_ci	regmap_update_bits(rt5682s->regmap, RT5682S_MICBIAS_2,
320162306a36Sopenharmony_ci		RT5682S_PWR_CLK25M_MASK | RT5682S_PWR_CLK1M_MASK,
320262306a36Sopenharmony_ci		RT5682S_PWR_CLK25M_PD | RT5682S_PWR_CLK1M_PU);
320362306a36Sopenharmony_ci	regmap_update_bits(rt5682s->regmap, RT5682S_PWR_ANLG_1,
320462306a36Sopenharmony_ci		RT5682S_PWR_BG, RT5682S_PWR_BG);
320562306a36Sopenharmony_ci	regmap_update_bits(rt5682s->regmap, RT5682S_HP_LOGIC_CTRL_2,
320662306a36Sopenharmony_ci		RT5682S_HP_SIG_SRC_MASK, RT5682S_HP_SIG_SRC_1BIT_CTL);
320762306a36Sopenharmony_ci	regmap_update_bits(rt5682s->regmap, RT5682S_HP_CHARGE_PUMP_2,
320862306a36Sopenharmony_ci		RT5682S_PM_HP_MASK, RT5682S_PM_HP_HV);
320962306a36Sopenharmony_ci	regmap_update_bits(rt5682s->regmap, RT5682S_HP_AMP_DET_CTL_1,
321062306a36Sopenharmony_ci		RT5682S_CP_SW_SIZE_MASK, RT5682S_CP_SW_SIZE_M);
321162306a36Sopenharmony_ci
321262306a36Sopenharmony_ci	/* DMIC data pin */
321362306a36Sopenharmony_ci	switch (rt5682s->pdata.dmic1_data_pin) {
321462306a36Sopenharmony_ci	case RT5682S_DMIC1_DATA_NULL:
321562306a36Sopenharmony_ci		break;
321662306a36Sopenharmony_ci	case RT5682S_DMIC1_DATA_GPIO2: /* share with LRCK2 */
321762306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_DMIC_CTRL_1,
321862306a36Sopenharmony_ci			RT5682S_DMIC_1_DP_MASK, RT5682S_DMIC_1_DP_GPIO2);
321962306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,
322062306a36Sopenharmony_ci			RT5682S_GP2_PIN_MASK, RT5682S_GP2_PIN_DMIC_SDA);
322162306a36Sopenharmony_ci		break;
322262306a36Sopenharmony_ci	case RT5682S_DMIC1_DATA_GPIO5: /* share with DACDAT1 */
322362306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_DMIC_CTRL_1,
322462306a36Sopenharmony_ci			RT5682S_DMIC_1_DP_MASK, RT5682S_DMIC_1_DP_GPIO5);
322562306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,
322662306a36Sopenharmony_ci			RT5682S_GP5_PIN_MASK, RT5682S_GP5_PIN_DMIC_SDA);
322762306a36Sopenharmony_ci		break;
322862306a36Sopenharmony_ci	default:
322962306a36Sopenharmony_ci		dev_warn(&i2c->dev, "invalid DMIC_DAT pin\n");
323062306a36Sopenharmony_ci		break;
323162306a36Sopenharmony_ci	}
323262306a36Sopenharmony_ci
323362306a36Sopenharmony_ci	/* DMIC clk pin */
323462306a36Sopenharmony_ci	switch (rt5682s->pdata.dmic1_clk_pin) {
323562306a36Sopenharmony_ci	case RT5682S_DMIC1_CLK_NULL:
323662306a36Sopenharmony_ci		break;
323762306a36Sopenharmony_ci	case RT5682S_DMIC1_CLK_GPIO1: /* share with IRQ */
323862306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,
323962306a36Sopenharmony_ci			RT5682S_GP1_PIN_MASK, RT5682S_GP1_PIN_DMIC_CLK);
324062306a36Sopenharmony_ci		break;
324162306a36Sopenharmony_ci	case RT5682S_DMIC1_CLK_GPIO3: /* share with BCLK2 */
324262306a36Sopenharmony_ci		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,
324362306a36Sopenharmony_ci			RT5682S_GP3_PIN_MASK, RT5682S_GP3_PIN_DMIC_CLK);
324462306a36Sopenharmony_ci		if (rt5682s->pdata.dmic_clk_driving_high)
324562306a36Sopenharmony_ci			regmap_update_bits(rt5682s->regmap, RT5682S_PAD_DRIVING_CTRL,
324662306a36Sopenharmony_ci				RT5682S_PAD_DRV_GP3_MASK, RT5682S_PAD_DRV_GP3_HIGH);
324762306a36Sopenharmony_ci		break;
324862306a36Sopenharmony_ci	default:
324962306a36Sopenharmony_ci		dev_warn(&i2c->dev, "invalid DMIC_CLK pin\n");
325062306a36Sopenharmony_ci		break;
325162306a36Sopenharmony_ci	}
325262306a36Sopenharmony_ci
325362306a36Sopenharmony_ci	INIT_DELAYED_WORK(&rt5682s->jack_detect_work, rt5682s_jack_detect_handler);
325462306a36Sopenharmony_ci	INIT_DELAYED_WORK(&rt5682s->jd_check_work, rt5682s_jd_check_handler);
325562306a36Sopenharmony_ci
325662306a36Sopenharmony_ci	if (i2c->irq) {
325762306a36Sopenharmony_ci		ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, rt5682s_irq,
325862306a36Sopenharmony_ci			IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
325962306a36Sopenharmony_ci			"rt5682s", rt5682s);
326062306a36Sopenharmony_ci		if (!ret)
326162306a36Sopenharmony_ci			rt5682s->irq = i2c->irq;
326262306a36Sopenharmony_ci		else
326362306a36Sopenharmony_ci			dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret);
326462306a36Sopenharmony_ci	}
326562306a36Sopenharmony_ci
326662306a36Sopenharmony_ci	return devm_snd_soc_register_component(&i2c->dev, &rt5682s_soc_component_dev,
326762306a36Sopenharmony_ci			rt5682s_dai, ARRAY_SIZE(rt5682s_dai));
326862306a36Sopenharmony_ci}
326962306a36Sopenharmony_ci
327062306a36Sopenharmony_cistatic void rt5682s_i2c_shutdown(struct i2c_client *client)
327162306a36Sopenharmony_ci{
327262306a36Sopenharmony_ci	struct rt5682s_priv *rt5682s = i2c_get_clientdata(client);
327362306a36Sopenharmony_ci
327462306a36Sopenharmony_ci	disable_irq(client->irq);
327562306a36Sopenharmony_ci	cancel_delayed_work_sync(&rt5682s->jack_detect_work);
327662306a36Sopenharmony_ci	cancel_delayed_work_sync(&rt5682s->jd_check_work);
327762306a36Sopenharmony_ci
327862306a36Sopenharmony_ci	rt5682s_reset(rt5682s);
327962306a36Sopenharmony_ci}
328062306a36Sopenharmony_ci
328162306a36Sopenharmony_cistatic void rt5682s_i2c_remove(struct i2c_client *client)
328262306a36Sopenharmony_ci{
328362306a36Sopenharmony_ci	rt5682s_i2c_shutdown(client);
328462306a36Sopenharmony_ci}
328562306a36Sopenharmony_ci
328662306a36Sopenharmony_cistatic const struct of_device_id rt5682s_of_match[] = {
328762306a36Sopenharmony_ci	{.compatible = "realtek,rt5682s"},
328862306a36Sopenharmony_ci	{},
328962306a36Sopenharmony_ci};
329062306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, rt5682s_of_match);
329162306a36Sopenharmony_ci
329262306a36Sopenharmony_cistatic const struct acpi_device_id rt5682s_acpi_match[] = {
329362306a36Sopenharmony_ci	{"RTL5682", 0,},
329462306a36Sopenharmony_ci	{},
329562306a36Sopenharmony_ci};
329662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(acpi, rt5682s_acpi_match);
329762306a36Sopenharmony_ci
329862306a36Sopenharmony_cistatic const struct i2c_device_id rt5682s_i2c_id[] = {
329962306a36Sopenharmony_ci	{"rt5682s", 0},
330062306a36Sopenharmony_ci	{}
330162306a36Sopenharmony_ci};
330262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, rt5682s_i2c_id);
330362306a36Sopenharmony_ci
330462306a36Sopenharmony_cistatic struct i2c_driver rt5682s_i2c_driver = {
330562306a36Sopenharmony_ci	.driver = {
330662306a36Sopenharmony_ci		.name = "rt5682s",
330762306a36Sopenharmony_ci		.of_match_table = rt5682s_of_match,
330862306a36Sopenharmony_ci		.acpi_match_table = rt5682s_acpi_match,
330962306a36Sopenharmony_ci		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
331062306a36Sopenharmony_ci	},
331162306a36Sopenharmony_ci	.probe = rt5682s_i2c_probe,
331262306a36Sopenharmony_ci	.remove = rt5682s_i2c_remove,
331362306a36Sopenharmony_ci	.shutdown = rt5682s_i2c_shutdown,
331462306a36Sopenharmony_ci	.id_table = rt5682s_i2c_id,
331562306a36Sopenharmony_ci};
331662306a36Sopenharmony_cimodule_i2c_driver(rt5682s_i2c_driver);
331762306a36Sopenharmony_ci
331862306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC RT5682I-VS driver");
331962306a36Sopenharmony_ciMODULE_AUTHOR("Derek Fang <derek.fang@realtek.com>");
332062306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
3321