Hi Albert, Normally, the reviewers will reply in a week. If it's urgent, I think it's okay to merge as a FROMLIST CL first. And reland it after upstream. On Wed, Sep 1, 2021 at 11:00 AM Mingjane Hsieh <mingjanehsieh@xxxxxxxxxx> wrote: > Copy Yuhsuan in the loop. > > Hi Albert, > > As I checked, the review usually takes a week. > If it's urgent, Yuhsuan may provide some information about what you can do > now. > > @Yu-hsuan Hsu <yuhsuan@xxxxxxxxxx> > Please provide more context. > Appreciated a lot for your help. > > best regards > mingjane > > > On Wed, Sep 1, 2021 at 10:33 AM Albert Wang <albertwang@xxxxxxxxxxx> > wrote: > >> <<copy Google audio champion MJ for help>> >> >> >> >> Hi MJ, >> >> Please you help us to cross check with Linux team for initial codec >> driver of Realtek ALC5682I-VS. Thank you. >> >> >> >> Regards, >> >> Albert Wang >> >> Realtek PC4 CE PM >> >> >> >> -----Original Message----- >> From: Derek [方德義] <derek.fang@xxxxxxxxxxx> >> Sent: Tuesday, August 31, 2021 9:03 PM >> To: broonie@xxxxxxxxxx; lgirdwood@xxxxxxxxx >> Cc: alsa-devel@xxxxxxxxxxxxxxxx; lars@xxxxxxxxxx; Flove(HsinFu) < >> flove@xxxxxxxxxxx>; Oder Chiou <oder_chiou@xxxxxxxxxxx>; Jack Yu < >> jack.yu@xxxxxxxxxxx>; Shuming [范書銘] <shumingf@xxxxxxxxxxx>; Albert Chen < >> albertchen@xxxxxxxxxxx>; Albert Wang <albertwang@xxxxxxxxxxx>; Derek [方德義] >> <derek.fang@xxxxxxxxxxx> >> Subject: [PATCH v2 1/2] ASoC: rt5682s: Add driver for ALC5682I-VS codec >> >> >> >> From: Derek Fang <derek.fang@xxxxxxxxxxx> >> >> >> >> This is an initial codec driver for Realtek ALC5682I-VS codec. >> >> >> >> Signed-off-by: Derek Fang <derek.fang@xxxxxxxxxxx> >> >> --- >> >> include/sound/rt5682s.h | 48 + >> >> sound/soc/codecs/Kconfig | 5 + >> >> sound/soc/codecs/Makefile | 2 + >> >> sound/soc/codecs/rt5682s.c | 3188 ++++++++++++++++++++++++++++++++++++ >> >> sound/soc/codecs/rt5682s.h | 1455 ++++++++++++++++ >> >> 5 files changed, 4698 insertions(+) >> >> create mode 100644 include/sound/rt5682s.h >> >> create mode 100644 sound/soc/codecs/rt5682s.c >> >> create mode 100644 sound/soc/codecs/rt5682s.h >> >> >> >> diff --git a/include/sound/rt5682s.h b/include/sound/rt5682s.h >> >> new file mode 100644 >> >> index 000000000000..accfbc2dcdd2 >> >> --- /dev/null >> >> +++ b/include/sound/rt5682s.h >> >> @@ -0,0 +1,48 @@ >> >> +/* SPDX-License-Identifier: GPL-2.0-only */ >> >> +/* >> >> + * linux/sound/rt5682s.h -- Platform data for RT5682I-VS >> >> + * >> >> + * Copyright 2021 Realtek Microelectronics >> >> + */ >> >> + >> >> +#ifndef __LINUX_SND_RT5682S_H >> >> +#define __LINUX_SND_RT5682S_H >> >> + >> >> +enum rt5682s_dmic1_data_pin { >> >> + RT5682S_DMIC1_DATA_NULL, >> >> + RT5682S_DMIC1_DATA_GPIO2, >> >> + RT5682S_DMIC1_DATA_GPIO5, >> >> +}; >> >> + >> >> +enum rt5682s_dmic1_clk_pin { >> >> + RT5682S_DMIC1_CLK_NULL, >> >> + RT5682S_DMIC1_CLK_GPIO1, >> >> + RT5682S_DMIC1_CLK_GPIO3, >> >> +}; >> >> + >> >> +enum rt5682s_jd_src { >> >> + RT5682S_JD_NULL, >> >> + RT5682S_JD1, >> >> +}; >> >> + >> >> +enum rt5682s_dai_clks { >> >> + RT5682S_DAI_WCLK_IDX, >> >> + RT5682S_DAI_BCLK_IDX, >> >> + RT5682S_DAI_NUM_CLKS, >> >> +}; >> >> + >> >> +struct rt5682s_platform_data { >> >> + >> >> + int ldo1_en; /* GPIO for LDO1_EN */ >> >> + >> >> + enum rt5682s_dmic1_data_pin dmic1_data_pin; >> >> + enum rt5682s_dmic1_clk_pin dmic1_clk_pin; >> >> + enum rt5682s_jd_src jd_src; >> >> + unsigned int dmic_clk_rate; >> >> + unsigned int dmic_delay; >> >> + bool dmic_clk_driving_high; >> >> + >> >> + const char *dai_clk_names[RT5682S_DAI_NUM_CLKS]; >> >> +}; >> >> + >> >> +#endif >> >> diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig >> >> index 82ee233a269d..6b3c2cf153db 100644 >> >> --- a/sound/soc/codecs/Kconfig >> >> +++ b/sound/soc/codecs/Kconfig >> >> @@ -180,6 +180,7 @@ config SND_SOC_ALL_CODECS >> >> imply SND_SOC_RT5677 >> >> imply SND_SOC_RT5682_I2C >> >> imply SND_SOC_RT5682_SDW >> >> + imply SND_SOC_RT5682S >> >> imply SND_SOC_RT700_SDW >> >> imply SND_SOC_RT711_SDW >> >> imply SND_SOC_RT711_SDCA_SDW >> >> @@ -1249,6 +1250,10 @@ config SND_SOC_RT5682_SDW >> >> select SND_SOC_RT5682 >> >> select REGMAP_SOUNDWIRE >> >> +config SND_SOC_RT5682S >> >> + tristate >> >> + depends on I2C >> >> + >> >> config SND_SOC_RT700 >> >> tristate >> >> diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile >> >> index 8dcea2c4604a..42d00aa4ee46 100644 >> >> --- a/sound/soc/codecs/Makefile >> >> +++ b/sound/soc/codecs/Makefile >> >> @@ -198,6 +198,7 @@ snd-soc-rt5677-spi-objs := rt5677-spi.o >> >> snd-soc-rt5682-objs := rt5682.o >> >> snd-soc-rt5682-sdw-objs := rt5682-sdw.o >> >> snd-soc-rt5682-i2c-objs := rt5682-i2c.o >> >> +snd-soc-rt5682s-objs := rt5682s.o >> >> snd-soc-rt700-objs := rt700.o rt700-sdw.o >> >> snd-soc-rt711-objs := rt711.o rt711-sdw.o >> >> snd-soc-rt711-sdca-objs := rt711-sdca.o rt711-sdca-sdw.o >> >> @@ -526,6 +527,7 @@ obj-$(CONFIG_SND_SOC_RT5677_SPI) += >> snd-soc-rt5677-spi.o >> >> obj-$(CONFIG_SND_SOC_RT5682) += snd-soc-rt5682.o >> >> obj-$(CONFIG_SND_SOC_RT5682_I2C) += snd-soc-rt5682-i2c.o >> >> obj-$(CONFIG_SND_SOC_RT5682_SDW) += snd-soc-rt5682-sdw.o >> >> +obj-$(CONFIG_SND_SOC_RT5682S) += snd-soc-rt5682s.o >> >> obj-$(CONFIG_SND_SOC_RT700) += snd-soc-rt700.o >> >> obj-$(CONFIG_SND_SOC_RT711) += snd-soc-rt711.o >> >> obj-$(CONFIG_SND_SOC_RT711_SDCA_SDW) += snd-soc-rt711-sdca.o >> >> diff --git a/sound/soc/codecs/rt5682s.c b/sound/soc/codecs/rt5682s.c >> >> new file mode 100644 >> >> index 000000000000..d878a20527f1 >> >> --- /dev/null >> >> +++ b/sound/soc/codecs/rt5682s.c >> >> @@ -0,0 +1,3188 @@ >> >> +// SPDX-License-Identifier: GPL-2.0-only >> >> +// >> >> +// rt5682s.c -- RT5682I-VS ALSA SoC audio component driver >> >> +// >> >> +// Copyright 2021 Realtek Semiconductor Corp. >> >> +// Author: Derek Fang <derek.fang@xxxxxxxxxxx> >> >> +// >> >> + >> >> +#include <linux/module.h> >> >> +#include <linux/moduleparam.h> >> >> +#include <linux/init.h> >> >> +#include <linux/delay.h> >> >> +#include <linux/pm.h> >> >> +#include <linux/pm_runtime.h> >> >> +#include <linux/i2c.h> >> >> +#include <linux/platform_device.h> >> >> +#include <linux/spi/spi.h> >> >> +#include <linux/acpi.h> >> >> +#include <linux/gpio.h> >> >> +#include <linux/of_gpio.h> >> >> +#include <linux/mutex.h> >> >> +#include <sound/core.h> >> >> +#include <sound/pcm.h> >> >> +#include <sound/pcm_params.h> >> >> +#include <sound/jack.h> >> >> +#include <sound/soc.h> >> >> +#include <sound/soc-dapm.h> >> >> +#include <sound/initval.h> >> >> +#include <sound/tlv.h> >> >> +#include <sound/rt5682s.h> >> >> + >> >> +#include "rt5682s.h" >> >> + >> >> +#define DEVICE_ID 0x6749 >> >> + >> >> +static const struct rt5682s_platform_data i2s_default_platform_data = { >> >> + .dmic1_data_pin = RT5682S_DMIC1_DATA_GPIO2, >> >> + .dmic1_clk_pin = RT5682S_DMIC1_CLK_GPIO3, >> >> + .jd_src = RT5682S_JD1, >> >> + .dai_clk_names[RT5682S_DAI_WCLK_IDX] = "rt5682-dai-wclk", >> >> + .dai_clk_names[RT5682S_DAI_BCLK_IDX] = "rt5682-dai-bclk", >> >> +}; >> >> + >> >> +const char *rt5682s_supply_names[RT5682S_NUM_SUPPLIES] = { >> >> + "AVDD", >> >> + "MICVDD", >> >> +}; >> >> + >> >> +static const struct reg_sequence patch_list[] = { >> >> + {RT5682S_I2C_CTRL, 0x0007}, >> >> + {RT5682S_DIG_IN_CTRL_1, >> 0x0000}, >> >> + {RT5682S_CHOP_DAC_2, >> 0x2020}, >> >> + {RT5682S_VREF_REC_OP_FB_CAP_CTRL_2, 0x0101}, >> >> + {RT5682S_VREF_REC_OP_FB_CAP_CTRL_1, 0x80c0}, >> >> + {RT5682S_HP_CALIB_CTRL_9, 0x0002}, >> >> + {RT5682S_DEPOP_1, 0x0000}, >> >> + {RT5682S_HP_CHARGE_PUMP_2, 0x3c15}, >> >> + {RT5682S_DAC1_DIG_VOL, >> 0xfefe}, >> >> + {RT5682S_SAR_IL_CMD_2, >> 0xac00}, >> >> + {RT5682S_SAR_IL_CMD_3, >> 0x024c}, >> >> + {RT5682S_CBJ_CTRL_6, 0x0804}, >> >> +}; >> >> + >> >> +static void rt5682s_apply_patch_list(struct rt5682s_priv *rt5682s, >> >> + struct device *dev) >> >> +{ >> >> + int ret; >> >> + >> >> + ret = regmap_multi_reg_write(rt5682s->regmap, patch_list, >> ARRAY_SIZE(patch_list)); >> >> + if (ret) >> >> + dev_warn(dev, "Failed to apply regmap patch: >> %d\n", ret); >> >> +} >> >> + >> >> +const struct reg_default rt5682s_reg[] = { >> >> + {0x0000, 0x0001}, >> >> + {0x0002, 0x8080}, >> >> + {0x0003, 0x0001}, >> >> + {0x0005, 0x0000}, >> >> + {0x0006, 0x0000}, >> >> + {0x0008, 0x8007}, >> >> + {0x000b, 0x0000}, >> >> + {0x000f, 0x4000}, >> >> + {0x0010, 0x4040}, >> >> + {0x0011, 0x0000}, >> >> + {0x0012, 0x0000}, >> >> + {0x0013, 0x1200}, >> >> + {0x0014, 0x200a}, >> >> + {0x0015, 0x0404}, >> >> + {0x0016, 0x0404}, >> >> + {0x0017, 0x05a4}, >> >> + {0x0019, 0xffff}, >> >> + {0x001c, 0x2f2f}, >> >> + {0x001f, 0x0000}, >> >> + {0x0022, 0x5757}, >> >> + {0x0023, 0x0039}, >> >> + {0x0024, 0x000b}, >> >> + {0x0026, 0xc0c4}, >> >> + {0x0029, 0x8080}, >> >> + {0x002a, 0xa0a0}, >> >> + {0x002b, 0x0300}, >> >> + {0x0030, 0x0000}, >> >> + {0x003c, 0x08c0}, >> >> + {0x0044, 0x1818}, >> >> + {0x004b, 0x00c0}, >> >> + {0x004c, 0x0000}, >> >> + {0x004d, 0x0000}, >> >> + {0x0061, 0x00c0}, >> >> + {0x0062, 0x008a}, >> >> + {0x0063, 0x0800}, >> >> + {0x0064, 0x0000}, >> >> + {0x0065, 0x0000}, >> >> + {0x0066, 0x0030}, >> >> + {0x0067, 0x000c}, >> >> + {0x0068, 0x0000}, >> >> + {0x0069, 0x0000}, >> >> + {0x006a, 0x0000}, >> >> + {0x006b, 0x0000}, >> >> + {0x006c, 0x0000}, >> >> + {0x006d, 0x2200}, >> >> + {0x006e, 0x0810}, >> >> + {0x006f, 0xe4de}, >> >> + {0x0070, 0x3320}, >> >> + {0x0071, 0x0000}, >> >> + {0x0073, 0x0000}, >> >> + {0x0074, 0x0000}, >> >> + {0x0075, 0x0002}, >> >> + {0x0076, 0x0001}, >> >> + {0x0079, 0x0000}, >> >> + {0x007a, 0x0000}, >> >> + {0x007b, 0x0000}, >> >> + {0x007c, 0x0100}, >> >> + {0x007e, 0x0000}, >> >> + {0x007f, 0x0000}, >> >> + {0x0080, 0x0000}, >> >> + {0x0083, 0x0000}, >> >> + {0x0084, 0x0000}, >> >> + {0x0085, 0x0000}, >> >> + {0x0086, 0x0005}, >> >> + {0x0087, 0x0000}, >> >> + {0x0088, 0x0000}, >> >> + {0x008c, 0x0003}, >> >> + {0x008e, 0x0060}, >> >> + {0x008f, 0x4da1}, >> >> + {0x0091, 0x1c15}, >> >> + {0x0092, 0x0425}, >> >> + {0x0093, 0x0000}, >> >> + {0x0094, 0x0080}, >> >> + {0x0095, 0x008f}, >> >> + {0x0096, 0x0000}, >> >> + {0x0097, 0x0000}, >> >> + {0x0098, 0x0000}, >> >> + {0x0099, 0x0000}, >> >> + {0x009a, 0x0000}, >> >> + {0x009b, 0x0000}, >> >> + {0x009c, 0x0000}, >> >> + {0x009d, 0x0000}, >> >> + {0x009e, 0x0000}, >> >> + {0x009f, 0x0009}, >> >> + {0x00a0, 0x0000}, >> >> + {0x00a3, 0x0002}, >> >> + {0x00a4, 0x0001}, >> >> + {0x00b6, 0x0000}, >> >> + {0x00b7, 0x0000}, >> >> + {0x00b8, 0x0000}, >> >> + {0x00b9, 0x0002}, >> >> + {0x00be, 0x0000}, >> >> + {0x00c0, 0x0160}, >> >> + {0x00c1, 0x82a0}, >> >> + {0x00c2, 0x0000}, >> >> + {0x00d0, 0x0000}, >> >> + {0x00d2, 0x3300}, >> >> + {0x00d3, 0x2200}, >> >> + {0x00d4, 0x0000}, >> >> + {0x00d9, 0x0000}, >> >> + {0x00da, 0x0000}, >> >> + {0x00db, 0x0000}, >> >> + {0x00dc, 0x00c0}, >> >> + {0x00dd, 0x2220}, >> >> + {0x00de, 0x3131}, >> >> + {0x00df, 0x3131}, >> >> + {0x00e0, 0x3131}, >> >> + {0x00e2, 0x0000}, >> >> + {0x00e3, 0x4000}, >> >> + {0x00e4, 0x0aa0}, >> >> + {0x00e5, 0x3131}, >> >> + {0x00e6, 0x3131}, >> >> + {0x00e7, 0x3131}, >> >> + {0x00e8, 0x3131}, >> >> + {0x00ea, 0xb320}, >> >> + {0x00eb, 0x0000}, >> >> + {0x00f0, 0x0000}, >> >> + {0x00f6, 0x0000}, >> >> + {0x00fa, 0x0000}, >> >> + {0x00fb, 0x0000}, >> >> + {0x00fc, 0x0000}, >> >> + {0x00fd, 0x0000}, >> >> + {0x00fe, 0x10ec}, >> >> + {0x00ff, 0x6749}, >> >> + {0x0100, 0xa000}, >> >> + {0x010b, 0x0066}, >> >> + {0x010c, 0x6666}, >> >> + {0x010d, 0x2202}, >> >> + {0x010e, 0x6666}, >> >> + {0x010f, 0xa800}, >> >> + {0x0110, 0x0006}, >> >> + {0x0111, 0x0460}, >> >> + {0x0112, 0x2000}, >> >> + {0x0113, 0x0200}, >> >> + {0x0117, 0x8000}, >> >> + {0x0118, 0x0303}, >> >> + {0x0125, 0x0020}, >> >> + {0x0132, 0x5026}, >> >> + {0x0136, 0x8000}, >> >> + {0x0139, 0x0005}, >> >> + {0x013a, 0x3030}, >> >> + {0x013b, 0xa000}, >> >> + {0x013c, 0x4110}, >> >> + {0x013f, 0x0000}, >> >> + {0x0145, 0x0022}, >> >> + {0x0146, 0x0000}, >> >> + {0x0147, 0x0000}, >> >> + {0x0148, 0x0000}, >> >> + {0x0156, 0x0022}, >> >> + {0x0157, 0x0303}, >> >> + {0x0158, 0x2222}, >> >> + {0x0159, 0x0000}, >> >> + {0x0160, 0x4ec0}, >> >> + {0x0161, 0x0080}, >> >> + {0x0162, 0x0200}, >> >> + {0x0163, 0x0800}, >> >> + {0x0164, 0x0000}, >> >> + {0x0165, 0x0000}, >> >> + {0x0166, 0x0000}, >> >> + {0x0167, 0x000f}, >> >> + {0x0168, 0x000f}, >> >> + {0x0169, 0x0001}, >> >> + {0x0190, 0x4131}, >> >> + {0x0194, 0x0000}, >> >> + {0x0195, 0x0000}, >> >> + {0x0197, 0x0022}, >> >> + {0x0198, 0x0000}, >> >> + {0x0199, 0x0000}, >> >> + {0x01ac, 0x0000}, >> >> + {0x01ad, 0x0000}, >> >> + {0x01ae, 0x0000}, >> >> + {0x01af, 0x2000}, >> >> + {0x01b0, 0x0000}, >> >> + {0x01b1, 0x0000}, >> >> + {0x01b2, 0x0000}, >> >> + {0x01b3, 0x0017}, >> >> + {0x01b4, 0x004b}, >> >> + {0x01b5, 0x0000}, >> >> + {0x01b6, 0x03e8}, >> >> + {0x01b7, 0x0000}, >> >> + {0x01b8, 0x0000}, >> >> + {0x01b9, 0x0400}, >> >> + {0x01ba, 0xb5b6}, >> >> + {0x01bb, 0x9124}, >> >> + {0x01bc, 0x4924}, >> >> + {0x01bd, 0x0009}, >> >> + {0x01be, 0x0018}, >> >> + {0x01bf, 0x002a}, >> >> + {0x01c0, 0x004c}, >> >> + {0x01c1, 0x0097}, >> >> + {0x01c2, 0x01c3}, >> >> + {0x01c3, 0x03e9}, >> >> + {0x01c4, 0x1389}, >> >> + {0x01c5, 0xc351}, >> >> + {0x01c6, 0x02a0}, >> >> + {0x01c7, 0x0b0f}, >> >> + {0x01c8, 0x402f}, >> >> + {0x01c9, 0x0702}, >> >> + {0x01ca, 0x0000}, >> >> + {0x01cb, 0x0000}, >> >> + {0x01cc, 0x5757}, >> >> + {0x01cd, 0x5757}, >> >> + {0x01ce, 0x5757}, >> >> + {0x01cf, 0x5757}, >> >> + {0x01d0, 0x5757}, >> >> + {0x01d1, 0x5757}, >> >> + {0x01d2, 0x5757}, >> >> + {0x01d3, 0x5757}, >> >> + {0x01d4, 0x5757}, >> >> + {0x01d5, 0x5757}, >> >> + {0x01d6, 0x0000}, >> >> + {0x01d7, 0x0000}, >> >> + {0x01d8, 0x0162}, >> >> + {0x01d9, 0x0007}, >> >> + {0x01da, 0x0000}, >> >> + {0x01db, 0x0004}, >> >> + {0x01dc, 0x0000}, >> >> + {0x01de, 0x7c00}, >> >> + {0x01df, 0x0020}, >> >> + {0x01e0, 0x04c1}, >> >> + {0x01e1, 0x0000}, >> >> + {0x01e2, 0x0000}, >> >> + {0x01e3, 0x0000}, >> >> + {0x01e4, 0x0000}, >> >> + {0x01e5, 0x0000}, >> >> + {0x01e6, 0x0001}, >> >> + {0x01e7, 0x0000}, >> >> + {0x01e8, 0x0000}, >> >> + {0x01eb, 0x0000}, >> >> + {0x01ec, 0x0000}, >> >> + {0x01ed, 0x0000}, >> >> + {0x01ee, 0x0000}, >> >> + {0x01ef, 0x0000}, >> >> + {0x01f0, 0x0000}, >> >> + {0x01f1, 0x0000}, >> >> + {0x01f2, 0x0000}, >> >> + {0x01f3, 0x0000}, >> >> + {0x01f4, 0x0000}, >> >> + {0x0210, 0x6297}, >> >> + {0x0211, 0xa004}, >> >> + {0x0212, 0x0365}, >> >> + {0x0213, 0xf7ff}, >> >> + {0x0214, 0xf24c}, >> >> + {0x0215, 0x0102}, >> >> + {0x0216, 0x00a3}, >> >> + {0x0217, 0x0048}, >> >> + {0x0218, 0xa2c0}, >> >> + {0x0219, 0x0400}, >> >> + {0x021a, 0x00c8}, >> >> + {0x021b, 0x00c0}, >> >> + {0x021c, 0x0000}, >> >> + {0x021d, 0x024c}, >> >> + {0x02fa, 0x0000}, >> >> + {0x02fb, 0x0000}, >> >> + {0x02fc, 0x0000}, >> >> + {0x03fe, 0x0000}, >> >> + {0x03ff, 0x0000}, >> >> + {0x0500, 0x0000}, >> >> + {0x0600, 0x0000}, >> >> + {0x0610, 0x6666}, >> >> + {0x0611, 0xa9aa}, >> >> + {0x0620, 0x6666}, >> >> + {0x0621, 0xa9aa}, >> >> + {0x0630, 0x6666}, >> >> + {0x0631, 0xa9aa}, >> >> + {0x0640, 0x6666}, >> >> + {0x0641, 0xa9aa}, >> >> + {0x07fa, 0x0000}, >> >> + {0x08fa, 0x0000}, >> >> + {0x08fb, 0x0000}, >> >> + {0x0d00, 0x0000}, >> >> + {0x1100, 0x0000}, >> >> + {0x1101, 0x0000}, >> >> + {0x1102, 0x0000}, >> >> + {0x1103, 0x0000}, >> >> + {0x1104, 0x0000}, >> >> + {0x1105, 0x0000}, >> >> + {0x1106, 0x0000}, >> >> + {0x1107, 0x0000}, >> >> + {0x1108, 0x0000}, >> >> + {0x1109, 0x0000}, >> >> + {0x110a, 0x0000}, >> >> + {0x110b, 0x0000}, >> >> + {0x110c, 0x0000}, >> >> + {0x1111, 0x0000}, >> >> + {0x1112, 0x0000}, >> >> + {0x1113, 0x0000}, >> >> + {0x1114, 0x0000}, >> >> + {0x1115, 0x0000}, >> >> + {0x1116, 0x0000}, >> >> + {0x1117, 0x0000}, >> >> + {0x1118, 0x0000}, >> >> + {0x1119, 0x0000}, >> >> + {0x111a, 0x0000}, >> >> + {0x111b, 0x0000}, >> >> + {0x111c, 0x0000}, >> >> + {0x1401, 0x0404}, >> >> + {0x1402, 0x0007}, >> >> + {0x1403, 0x0365}, >> >> + {0x1404, 0x0210}, >> >> + {0x1405, 0x0365}, >> >> + {0x1406, 0x0210}, >> >> + {0x1407, 0x0000}, >> >> + {0x1408, 0x0000}, >> >> + {0x1409, 0x0000}, >> >> + {0x140a, 0x0000}, >> >> + {0x140b, 0x0000}, >> >> + {0x140c, 0x0000}, >> >> + {0x140d, 0x0000}, >> >> + {0x140e, 0x0000}, >> >> + {0x140f, 0x0000}, >> >> + {0x1410, 0x0000}, >> >> + {0x1411, 0x0000}, >> >> + {0x1801, 0x0004}, >> >> + {0x1802, 0x0000}, >> >> + {0x1803, 0x0000}, >> >> + {0x1804, 0x0000}, >> >> + {0x1805, 0x00ff}, >> >> + {0x2c00, 0x0000}, >> >> + {0x3400, 0x0200}, >> >> + {0x3404, 0x0000}, >> >> + {0x3405, 0x0000}, >> >> + {0x3406, 0x0000}, >> >> + {0x3407, 0x0000}, >> >> + {0x3408, 0x0000}, >> >> + {0x3409, 0x0000}, >> >> + {0x340a, 0x0000}, >> >> + {0x340b, 0x0000}, >> >> + {0x340c, 0x0000}, >> >> + {0x340d, 0x0000}, >> >> + {0x340e, 0x0000}, >> >> + {0x340f, 0x0000}, >> >> + {0x3410, 0x0000}, >> >> + {0x3411, 0x0000}, >> >> + {0x3412, 0x0000}, >> >> + {0x3413, 0x0000}, >> >> + {0x3414, 0x0000}, >> >> + {0x3415, 0x0000}, >> >> + {0x3424, 0x0000}, >> >> + {0x3425, 0x0000}, >> >> + {0x3426, 0x0000}, >> >> + {0x3427, 0x0000}, >> >> + {0x3428, 0x0000}, >> >> + {0x3429, 0x0000}, >> >> + {0x342a, 0x0000}, >> >> + {0x342b, 0x0000}, >> >> + {0x342c, 0x0000}, >> >> + {0x342d, 0x0000}, >> >> + {0x342e, 0x0000}, >> >> + {0x342f, 0x0000}, >> >> + {0x3430, 0x0000}, >> >> + {0x3431, 0x0000}, >> >> + {0x3432, 0x0000}, >> >> + {0x3433, 0x0000}, >> >> + {0x3434, 0x0000}, >> >> + {0x3435, 0x0000}, >> >> + {0x3440, 0x6319}, >> >> + {0x3441, 0x3771}, >> >> + {0x3500, 0x0002}, >> >> + {0x3501, 0x5728}, >> >> + {0x3b00, 0x3010}, >> >> + {0x3b01, 0x3300}, >> >> + {0x3b02, 0x2200}, >> >> + {0x3b03, 0x0100}, >> >> +}; >> >> + >> >> +static bool rt5682s_volatile_register(struct device *dev, unsigned int >> reg) >> >> +{ >> >> + switch (reg) { >> >> + case RT5682S_RESET: >> >> + case RT5682S_CBJ_CTRL_2: >> >> + case RT5682S_I2S1_F_DIV_CTRL_2: >> >> + case RT5682S_I2S2_F_DIV_CTRL_2: >> >> + case RT5682S_INT_ST_1: >> >> + case RT5682S_GPIO_ST: >> >> + case RT5682S_IL_CMD_1: >> >> + case RT5682S_4BTN_IL_CMD_1: >> >> + case RT5682S_AJD1_CTRL: >> >> + case RT5682S_VERSION_ID...RT5682S_DEVICE_ID: >> >> + case RT5682S_STO_NG2_CTRL_1: >> >> + case RT5682S_STO_NG2_CTRL_5...RT5682S_STO_NG2_CTRL_7: >> >> + case RT5682S_STO1_DAC_SIL_DET: >> >> + case RT5682S_HP_IMP_SENS_CTRL_1...RT5682S_HP_IMP_SENS_CTRL_4: >> >> + case RT5682S_HP_IMP_SENS_CTRL_13: >> >> + case RT5682S_HP_IMP_SENS_CTRL_14: >> >> + case >> RT5682S_HP_IMP_SENS_CTRL_43...RT5682S_HP_IMP_SENS_CTRL_46: >> >> + case RT5682S_HP_CALIB_CTRL_1: >> >> + case RT5682S_HP_CALIB_CTRL_10: >> >> + case RT5682S_HP_CALIB_ST_1...RT5682S_HP_CALIB_ST_11: >> >> + case RT5682S_SAR_IL_CMD_2...RT5682S_SAR_IL_CMD_5: >> >> + case RT5682S_SAR_IL_CMD_10: >> >> + case RT5682S_SAR_IL_CMD_11: >> >> + case RT5682S_VERSION_ID_HIDE: >> >> + case RT5682S_VERSION_ID_CUS: >> >> + case RT5682S_I2C_TRANS_CTRL: >> >> + case RT5682S_DMIC_FLOAT_DET: >> >> + case RT5682S_HA_CMP_OP_1: >> >> + case RT5682S_NEW_CBJ_DET_CTL_10...RT5682S_NEW_CBJ_DET_CTL_16: >> >> + case RT5682S_CLK_SW_TEST_1: >> >> + case RT5682S_CLK_SW_TEST_2: >> >> + case RT5682S_EFUSE_READ_1...RT5682S_EFUSE_READ_18: >> >> + case RT5682S_PILOT_DIG_CTL_1: >> >> + return true; >> >> + default: >> >> + return false; >> >> + } >> >> +} >> >> + >> >> +static bool rt5682s_readable_register(struct device *dev, unsigned int >> reg) >> >> +{ >> >> + switch (reg) { >> >> + case RT5682S_RESET: >> >> + case RT5682S_VERSION_ID: >> >> + case RT5682S_VENDOR_ID: >> >> + case RT5682S_DEVICE_ID: >> >> + case RT5682S_HP_CTRL_1: >> >> + case RT5682S_HP_CTRL_2: >> >> + case RT5682S_HPL_GAIN: >> >> + case RT5682S_HPR_GAIN: >> >> + case RT5682S_I2C_CTRL: >> >> + case RT5682S_CBJ_BST_CTRL: >> >> + case RT5682S_CBJ_DET_CTRL: >> >> + case RT5682S_CBJ_CTRL_1...RT5682S_CBJ_CTRL_8: >> >> + case RT5682S_DAC1_DIG_VOL: >> >> + case RT5682S_STO1_ADC_DIG_VOL: >> >> + case RT5682S_STO1_ADC_BOOST: >> >> + case RT5682S_HP_IMP_GAIN_1: >> >> + case RT5682S_HP_IMP_GAIN_2: >> >> + case RT5682S_SIDETONE_CTRL: >> >> + case RT5682S_STO1_ADC_MIXER: >> >> + case RT5682S_AD_DA_MIXER: >> >> + case RT5682S_STO1_DAC_MIXER: >> >> + case RT5682S_A_DAC1_MUX: >> >> + case RT5682S_DIG_INF2_DATA: >> >> + case RT5682S_REC_MIXER: >> >> + case RT5682S_CAL_REC: >> >> + case RT5682S_HP_ANA_OST_CTRL_1...RT5682S_HP_ANA_OST_CTRL_3: >> >> + case RT5682S_PWR_DIG_1...RT5682S_PWR_MIXER: >> >> + case RT5682S_MB_CTRL: >> >> + case RT5682S_CLK_GATE_TCON_1...RT5682S_CLK_GATE_TCON_3: >> >> + case RT5682S_CLK_DET...RT5682S_LPF_AD_DMIC: >> >> + case RT5682S_I2S1_SDP: >> >> + case RT5682S_I2S2_SDP: >> >> + case RT5682S_ADDA_CLK_1: >> >> + case RT5682S_ADDA_CLK_2: >> >> + case RT5682S_I2S1_F_DIV_CTRL_1: >> >> + case RT5682S_I2S1_F_DIV_CTRL_2: >> >> + case RT5682S_TDM_CTRL: >> >> + case RT5682S_TDM_ADDA_CTRL_1: >> >> + case RT5682S_TDM_ADDA_CTRL_2: >> >> + case RT5682S_DATA_SEL_CTRL_1: >> >> + case RT5682S_TDM_TCON_CTRL_1: >> >> + case RT5682S_TDM_TCON_CTRL_2: >> >> + case RT5682S_GLB_CLK: >> >> + case RT5682S_PLL_TRACK_1...RT5682S_PLL_TRACK_6: >> >> + case RT5682S_PLL_TRACK_11: >> >> + case RT5682S_DEPOP_1: >> >> + case RT5682S_HP_CHARGE_PUMP_1: >> >> + case RT5682S_HP_CHARGE_PUMP_2: >> >> + case RT5682S_HP_CHARGE_PUMP_3: >> >> + case RT5682S_MICBIAS_1...RT5682S_MICBIAS_3: >> >> + case RT5682S_PLL_TRACK_12...RT5682S_PLL_CTRL_7: >> >> + case RT5682S_RC_CLK_CTRL: >> >> + case RT5682S_I2S2_M_CLK_CTRL_1: >> >> + case RT5682S_I2S2_F_DIV_CTRL_1: >> >> + case RT5682S_I2S2_F_DIV_CTRL_2: >> >> + case RT5682S_IRQ_CTRL_1...RT5682S_IRQ_CTRL_4: >> >> + case RT5682S_INT_ST_1: >> >> + case RT5682S_GPIO_CTRL_1: >> >> + case RT5682S_GPIO_CTRL_2: >> >> + case RT5682S_GPIO_ST: >> >> + case RT5682S_HP_AMP_DET_CTRL_1: >> >> + case RT5682S_MID_HP_AMP_DET: >> >> + case RT5682S_LOW_HP_AMP_DET: >> >> + case RT5682S_DELAY_BUF_CTRL: >> >> + case RT5682S_SV_ZCD_1: >> >> + case RT5682S_SV_ZCD_2: >> >> + case RT5682S_IL_CMD_1...RT5682S_IL_CMD_6: >> >> + case RT5682S_4BTN_IL_CMD_1...RT5682S_4BTN_IL_CMD_7: >> >> + case RT5682S_ADC_STO1_HP_CTRL_1: >> >> + case RT5682S_ADC_STO1_HP_CTRL_2: >> >> + case RT5682S_AJD1_CTRL: >> >> + case RT5682S_JD_CTRL_1: >> >> + case RT5682S_DUMMY_1...RT5682S_DUMMY_3: >> >> + case RT5682S_DAC_ADC_DIG_VOL1: >> >> + case RT5682S_BIAS_CUR_CTRL_2...RT5682S_BIAS_CUR_CTRL_10: >> >> + case RT5682S_VREF_REC_OP_FB_CAP_CTRL_1: >> >> + case RT5682S_VREF_REC_OP_FB_CAP_CTRL_2: >> >> + case RT5682S_CHARGE_PUMP_1: >> >> + case RT5682S_DIG_IN_CTRL_1: >> >> + case RT5682S_PAD_DRIVING_CTRL: >> >> + case RT5682S_CHOP_DAC_1: >> >> + case RT5682S_CHOP_DAC_2: >> >> + case RT5682S_CHOP_ADC: >> >> + case RT5682S_CALIB_ADC_CTRL: >> >> + case RT5682S_VOL_TEST: >> >> + case RT5682S_SPKVDD_DET_ST: >> >> + case RT5682S_TEST_MODE_CTRL_1...RT5682S_TEST_MODE_CTRL_4: >> >> + case RT5682S_PLL_INTERNAL_1...RT5682S_PLL_INTERNAL_4: >> >> + case RT5682S_STO_NG2_CTRL_1...RT5682S_STO_NG2_CTRL_10: >> >> + case RT5682S_STO1_DAC_SIL_DET: >> >> + case RT5682S_SIL_PSV_CTRL1: >> >> + case RT5682S_SIL_PSV_CTRL2: >> >> + case RT5682S_SIL_PSV_CTRL3: >> >> + case RT5682S_SIL_PSV_CTRL4: >> >> + case RT5682S_SIL_PSV_CTRL5: >> >> + case >> RT5682S_HP_IMP_SENS_CTRL_1...RT5682S_HP_IMP_SENS_CTRL_46: >> >> + case RT5682S_HP_LOGIC_CTRL_1...RT5682S_HP_LOGIC_CTRL_3: >> >> + case RT5682S_HP_CALIB_CTRL_1...RT5682S_HP_CALIB_CTRL_11: >> >> + case RT5682S_HP_CALIB_ST_1...RT5682S_HP_CALIB_ST_11: >> >> + case RT5682S_SAR_IL_CMD_1...RT5682S_SAR_IL_CMD_14: >> >> + case RT5682S_DUMMY_4...RT5682S_DUMMY_6: >> >> + case RT5682S_VERSION_ID_HIDE: >> >> + case RT5682S_VERSION_ID_CUS: >> >> + case RT5682S_SCAN_CTL: >> >> + case RT5682S_HP_AMP_DET: >> >> + case RT5682S_BIAS_CUR_CTRL_11: >> >> + case RT5682S_BIAS_CUR_CTRL_12: >> >> + case RT5682S_BIAS_CUR_CTRL_13: >> >> + case RT5682S_BIAS_CUR_CTRL_14: >> >> + case RT5682S_BIAS_CUR_CTRL_15: >> >> + case RT5682S_BIAS_CUR_CTRL_16: >> >> + case RT5682S_BIAS_CUR_CTRL_17: >> >> + case RT5682S_BIAS_CUR_CTRL_18: >> >> + case RT5682S_I2C_TRANS_CTRL: >> >> + case RT5682S_DUMMY_7: >> >> + case RT5682S_DUMMY_8: >> >> + case RT5682S_DMIC_FLOAT_DET: >> >> + case RT5682S_HA_CMP_OP_1...RT5682S_HA_CMP_OP_13: >> >> + case RT5682S_HA_CMP_OP_14...RT5682S_HA_CMP_OP_25: >> >> + case RT5682S_NEW_CBJ_DET_CTL_1...RT5682S_NEW_CBJ_DET_CTL_16: >> >> + case RT5682S_DA_FILTER_1...RT5682S_DA_FILTER_5: >> >> + case RT5682S_CLK_SW_TEST_1: >> >> + case RT5682S_CLK_SW_TEST_2: >> >> + case RT5682S_CLK_SW_TEST_3...RT5682S_CLK_SW_TEST_14: >> >> + case RT5682S_EFUSE_MANU_WRITE_1...RT5682S_EFUSE_MANU_WRITE_6: >> >> + case RT5682S_EFUSE_READ_1...RT5682S_EFUSE_READ_18: >> >> + case RT5682S_EFUSE_TIMING_CTL_1: >> >> + case RT5682S_EFUSE_TIMING_CTL_2: >> >> + case RT5682S_PILOT_DIG_CTL_1: >> >> + case RT5682S_PILOT_DIG_CTL_2: >> >> + case RT5682S_HP_AMP_DET_CTL_1...RT5682S_HP_AMP_DET_CTL_4: >> >> + return true; >> >> + default: >> >> + return false; >> >> + } >> >> +} >> >> + >> >> +static void rt5682s_reset(struct rt5682s_priv *rt5682s) >> >> +{ >> >> + regmap_write(rt5682s->regmap, RT5682S_RESET, 0); >> >> +} >> >> + >> >> +static int rt5682s_button_detect(struct snd_soc_component *component) >> >> +{ >> >> + int btn_type, val; >> >> + >> >> + val = snd_soc_component_read(component, >> RT5682S_4BTN_IL_CMD_1); >> >> + btn_type = val & 0xfff0; >> >> + snd_soc_component_write(component, RT5682S_4BTN_IL_CMD_1, >> val); >> >> + dev_dbg(component->dev, "%s btn_type=%x\n", __func__, >> btn_type); >> >> + snd_soc_component_update_bits(component, >> RT5682S_SAR_IL_CMD_2, >> >> + RT5682S_SAR_ADC_PSV_MASK, >> RT5682S_SAR_ADC_PSV_ENTRY); >> >> + >> >> + return btn_type; >> >> +} >> >> + >> >> +enum { >> >> + SAR_PWR_OFF, >> >> + SAR_PWR_NORMAL, >> >> + SAR_PWR_SAVING, >> >> +}; >> >> + >> >> +static void rt5682s_sar_power_mode(struct snd_soc_component *component, >> >> + int mode, int >> jd_step) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + mutex_lock(&rt5682s->sar_mutex); >> >> + >> >> + switch (mode) { >> >> + case SAR_PWR_SAVING: >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_3, >> >> + RT5682S_CBJ_IN_BUF_MASK, >> RT5682S_CBJ_IN_BUF_DIS); >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_1, >> >> + RT5682S_MB1_PATH_MASK | >> RT5682S_MB2_PATH_MASK, >> >> + RT5682S_CTRL_MB1_REG | >> RT5682S_CTRL_MB2_REG); >> >> + snd_soc_component_update_bits(component, >> RT5682S_SAR_IL_CMD_1, >> >> + RT5682S_SAR_BUTDET_MASK | >> RT5682S_SAR_BUTDET_POW_MASK | >> >> + RT5682S_SAR_SEL_MB1_2_CTL_MASK, >> RT5682S_SAR_BUTDET_DIS | >> >> + RT5682S_SAR_BUTDET_POW_SAV | >> RT5682S_SAR_SEL_MB1_2_MANU); >> >> + usleep_range(5000, 5500); >> >> + snd_soc_component_update_bits(component, >> RT5682S_SAR_IL_CMD_1, >> >> + RT5682S_SAR_BUTDET_MASK, >> RT5682S_SAR_BUTDET_EN); >> >> + usleep_range(5000, 5500); >> >> + snd_soc_component_update_bits(component, >> RT5682S_SAR_IL_CMD_2, >> >> + RT5682S_SAR_ADC_PSV_MASK, >> RT5682S_SAR_ADC_PSV_ENTRY); >> >> + break; >> >> + case SAR_PWR_NORMAL: >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_3, >> >> + RT5682S_CBJ_IN_BUF_MASK, >> RT5682S_CBJ_IN_BUF_EN); >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_1, >> >> + RT5682S_MB1_PATH_MASK | >> RT5682S_MB2_PATH_MASK, >> >> + RT5682S_CTRL_MB1_FSM | >> RT5682S_CTRL_MB2_FSM); >> >> + if (!jd_step) { >> >> + >> snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1, >> >> + >> RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_SEL_MB1_2_AUTO); >> >> + usleep_range(5000, 5500); >> >> + >> snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1, >> >> + >> RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK, >> >> + >> RT5682S_SAR_BUTDET_EN | RT5682S_SAR_BUTDET_POW_NORM); >> >> + } >> >> + break; >> >> + case SAR_PWR_OFF: >> >> + snd_soc_component_update_bits(component, >> RT5682S_SAR_IL_CMD_1, >> >> + RT5682S_SAR_BUTDET_MASK | >> RT5682S_SAR_BUTDET_POW_MASK | >> >> + RT5682S_SAR_SEL_MB1_2_CTL_MASK, >> RT5682S_SAR_BUTDET_DIS | >> >> + RT5682S_SAR_BUTDET_POW_SAV | >> RT5682S_SAR_SEL_MB1_2_MANU); >> >> + break; >> >> + default: >> >> + dev_err(component->dev, "Invalid SAR Power >> mode: %d\n", mode); >> >> + break; >> >> + } >> >> + >> >> + mutex_unlock(&rt5682s->sar_mutex); >> >> +} >> >> + >> >> +static void rt5682s_enable_push_button_irq(struct snd_soc_component >> *component) >> >> +{ >> >> + snd_soc_component_update_bits(component, >> RT5682S_SAR_IL_CMD_13, >> >> + RT5682S_SAR_SOUR_MASK, RT5682S_SAR_SOUR_BTN); >> >> + snd_soc_component_write(component, RT5682S_IL_CMD_1, 0x0040); >> >> + snd_soc_component_update_bits(component, >> RT5682S_4BTN_IL_CMD_2, >> >> + RT5682S_4BTN_IL_MASK | >> RT5682S_4BTN_IL_RST_MASK, >> >> + RT5682S_4BTN_IL_EN | RT5682S_4BTN_IL_NOR); >> >> + snd_soc_component_update_bits(component, RT5682S_IRQ_CTRL_3, >> >> + RT5682S_IL_IRQ_MASK, RT5682S_IL_IRQ_EN); >> >> +} >> >> + >> >> +static void rt5682s_disable_push_button_irq(struct snd_soc_component >> *component) >> >> +{ >> >> + snd_soc_component_update_bits(component, RT5682S_IRQ_CTRL_3, >> >> + RT5682S_IL_IRQ_MASK, RT5682S_IL_IRQ_DIS); >> >> + snd_soc_component_update_bits(component, >> RT5682S_4BTN_IL_CMD_2, >> >> + RT5682S_4BTN_IL_MASK, RT5682S_4BTN_IL_DIS); >> >> + snd_soc_component_update_bits(component, >> RT5682S_SAR_IL_CMD_13, >> >> + RT5682S_SAR_SOUR_MASK, RT5682S_SAR_SOUR_TYPE); >> >> +} >> >> + >> >> +/** >> >> + * rt5682s_headset_detect - Detect headset. >> >> + * @component: SoC audio component device. >> >> + * @jack_insert: Jack insert or not. >> >> + * >> >> + * Detect whether is headset or not when jack inserted. >> >> + * >> >> + * Returns detect status. >> >> + */ >> >> +static int rt5682s_headset_detect(struct snd_soc_component *component, >> int jack_insert) >> >> +{ >> >> + unsigned int val, count; >> >> + int jack_type = 0; >> >> + >> >> + if (jack_insert) { >> >> + rt5682s_disable_push_button_irq(component); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_VREF1 | >> RT5682S_PWR_VREF2 | RT5682S_PWR_MB, >> >> + RT5682S_PWR_VREF1 | >> RT5682S_PWR_VREF2 | RT5682S_PWR_MB); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_FV1 | >> RT5682S_PWR_FV2, 0); >> >> + usleep_range(15000, 20000); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_FV1 | >> RT5682S_PWR_FV2, >> >> + RT5682S_PWR_FV1 | >> RT5682S_PWR_FV2); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_CBJ, >> RT5682S_PWR_CBJ); >> >> + snd_soc_component_write(component, >> RT5682S_SAR_IL_CMD_3, 0x0365); >> >> + snd_soc_component_update_bits(component, >> RT5682S_HP_CHARGE_PUMP_2, >> >> + RT5682S_OSW_L_MASK | >> RT5682S_OSW_R_MASK, >> >> + RT5682S_OSW_L_DIS | >> RT5682S_OSW_R_DIS); >> >> + snd_soc_component_update_bits(component, >> RT5682S_SAR_IL_CMD_13, >> >> + RT5682S_SAR_SOUR_MASK, >> RT5682S_SAR_SOUR_TYPE); >> >> + rt5682s_sar_power_mode(component, >> SAR_PWR_NORMAL, 1); >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_1, >> >> + RT5682S_TRIG_JD_MASK, >> RT5682S_TRIG_JD_LOW); >> >> + usleep_range(45000, 50000); >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_1, >> >> + RT5682S_TRIG_JD_MASK, >> RT5682S_TRIG_JD_HIGH); >> >> + >> >> + count = 0; >> >> + do { >> >> + usleep_range(10000, 15000); >> >> + val = >> snd_soc_component_read(component, RT5682S_CBJ_CTRL_2) >> >> + & >> RT5682S_JACK_TYPE_MASK; >> >> + count++; >> >> + } while (val == 0 && count < 50); >> >> + >> >> + pr_debug("%s, val=%d, count=%d\n", __func__, >> val, count); >> >> + >> >> + switch (val) { >> >> + case 0x1: >> >> + case 0x2: >> >> + jack_type = SND_JACK_HEADSET; >> >> + >> snd_soc_component_write(component, RT5682S_SAR_IL_CMD_3, 0x024c); >> >> + >> snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1, >> >> + >> RT5682S_FAST_OFF_MASK, RT5682S_FAST_OFF_EN); >> >> + >> snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1, >> >> + >> RT5682S_SAR_SEL_MB1_2_MASK, val << RT5682S_SAR_SEL_MB1_2_SFT); >> >> + >> rt5682s_sar_power_mode(component, SAR_PWR_SAVING, 1); >> >> + >> rt5682s_enable_push_button_irq(component); >> >> + break; >> >> + default: >> >> + jack_type = SND_JACK_HEADPHONE; >> >> + break; >> >> + } >> >> + snd_soc_component_update_bits(component, >> RT5682S_HP_CHARGE_PUMP_2, >> >> + RT5682S_OSW_L_MASK | >> RT5682S_OSW_R_MASK, >> >> + RT5682S_OSW_L_EN | >> RT5682S_OSW_R_EN); >> >> + } else { >> >> + rt5682s_sar_power_mode(component, >> SAR_PWR_OFF, 1); >> >> + rt5682s_disable_push_button_irq(component); >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_1, >> >> + RT5682S_TRIG_JD_MASK, >> RT5682S_TRIG_JD_LOW); >> >> + >> >> + if >> (!snd_soc_dapm_get_pin_status(&component->dapm, "MICBIAS")) >> >> + >> snd_soc_component_update_bits(component, >> >> + >> RT5682S_PWR_ANLG_1, RT5682S_PWR_MB, 0); >> >> + if >> (!snd_soc_dapm_get_pin_status(&component->dapm, "Vref2")) >> >> + >> snd_soc_component_update_bits(component, >> >> + >> RT5682S_PWR_ANLG_1, RT5682S_PWR_VREF2, 0); >> >> + >> >> + snd_soc_component_update_bits(component, >> RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_CBJ, 0); >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_1, >> >> + RT5682S_FAST_OFF_MASK, >> RT5682S_FAST_OFF_DIS); >> >> + snd_soc_component_update_bits(component, >> RT5682S_CBJ_CTRL_3, >> >> + RT5682S_CBJ_IN_BUF_MASK, >> RT5682S_CBJ_IN_BUF_DIS); >> >> + jack_type = 0; >> >> + } >> >> + >> >> + dev_dbg(component->dev, "jack_type = %d\n", jack_type); >> >> + >> >> + return jack_type; >> >> +} >> >> + >> >> +static void rt5682s_jack_detect_handler(struct work_struct *work) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(work, struct rt5682s_priv, >> jack_detect_work.work); >> >> + int val, btn_type; >> >> + >> >> + while (!rt5682s->component) >> >> + usleep_range(10000, 15000); >> >> + >> >> + while (!rt5682s->component->card->instantiated) >> >> + usleep_range(10000, 15000); >> >> + >> >> + mutex_lock(&rt5682s->calibrate_mutex); >> >> + >> >> + val = snd_soc_component_read(rt5682s->component, >> RT5682S_AJD1_CTRL) >> >> + & RT5682S_JDH_RS_MASK; >> >> + if (!val) { >> >> + /* jack in */ >> >> + if (rt5682s->jack_type == 0) { >> >> + /* jack was out, report jack >> type */ >> >> + rt5682s->jack_type = >> rt5682s_headset_detect(rt5682s->component, 1); >> >> + rt5682s->irq_work_delay_time = >> 0; >> >> + } else if ((rt5682s->jack_type & >> SND_JACK_HEADSET) == SND_JACK_HEADSET) { >> >> + /* jack is already in, report >> button event */ >> >> + rt5682s->jack_type = >> SND_JACK_HEADSET; >> >> + btn_type = >> rt5682s_button_detect(rt5682s->component); >> >> + /** >> >> + * rt5682s can report three >> kinds of button behavior, >> >> + * one click, double click and >> hold. However, >> >> + * currently we will report >> button pressed/released >> >> + * event. So all the three >> button behaviors are >> >> + * treated as button pressed. >> >> + */ >> >> + switch (btn_type) { >> >> + case 0x8000: >> >> + case 0x4000: >> >> + case 0x2000: >> >> + >> rt5682s->jack_type |= SND_JACK_BTN_0; >> >> + break; >> >> + case 0x1000: >> >> + case 0x0800: >> >> + case 0x0400: >> >> + >> rt5682s->jack_type |= SND_JACK_BTN_1; >> >> + break; >> >> + case 0x0200: >> >> + case 0x0100: >> >> + case 0x0080: >> >> + >> rt5682s->jack_type |= SND_JACK_BTN_2; >> >> + break; >> >> + case 0x0040: >> >> + case 0x0020: >> >> + case 0x0010: >> >> + >> rt5682s->jack_type |= SND_JACK_BTN_3; >> >> + break; >> >> + case 0x0000: /* unpressed */ >> >> + break; >> >> + default: >> >> + >> dev_err(rt5682s->component->dev, >> >> + >> "Unexpected button code 0x%04x\n", btn_type); >> >> + break; >> >> + } >> >> + } >> >> + } else { >> >> + /* jack out */ >> >> + rt5682s->jack_type = >> rt5682s_headset_detect(rt5682s->component, 0); >> >> + rt5682s->irq_work_delay_time = 50; >> >> + } >> >> + >> >> + snd_soc_jack_report(rt5682s->hs_jack, rt5682s->jack_type, >> >> + SND_JACK_HEADSET | SND_JACK_BTN_0 | >> SND_JACK_BTN_1 | >> >> + SND_JACK_BTN_2 | SND_JACK_BTN_3); >> >> + >> >> + if (rt5682s->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 | >> >> + SND_JACK_BTN_2 | SND_JACK_BTN_3)) >> >> + >> schedule_delayed_work(&rt5682s->jd_check_work, 0); >> >> + else >> >> + >> cancel_delayed_work_sync(&rt5682s->jd_check_work); >> >> + >> >> + mutex_unlock(&rt5682s->calibrate_mutex); >> >> +} >> >> + >> >> +static void rt5682s_jd_check_handler(struct work_struct *work) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(work, struct rt5682s_priv, >> jd_check_work.work); >> >> + >> >> + if (snd_soc_component_read(rt5682s->component, >> RT5682S_AJD1_CTRL) >> >> + & RT5682S_JDH_RS_MASK) { >> >> + /* jack out */ >> >> + rt5682s->jack_type = >> rt5682s_headset_detect(rt5682s->component, 0); >> >> + >> >> + snd_soc_jack_report(rt5682s->hs_jack, >> rt5682s->jack_type, >> >> + SND_JACK_HEADSET | >> SND_JACK_BTN_0 | SND_JACK_BTN_1 | >> >> + SND_JACK_BTN_2 | >> SND_JACK_BTN_3); >> >> + } else { >> >> + >> schedule_delayed_work(&rt5682s->jd_check_work, 500); >> >> + } >> >> +} >> >> + >> >> +static irqreturn_t rt5682s_irq(int irq, void *data) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = data; >> >> + >> >> + mod_delayed_work(system_power_efficient_wq, >> &rt5682s->jack_detect_work, >> >> + >> msecs_to_jiffies(rt5682s->irq_work_delay_time)); >> >> + >> >> + return IRQ_HANDLED; >> >> +} >> >> + >> >> +static int rt5682s_set_jack_detect(struct snd_soc_component *component, >> >> + struct snd_soc_jack *hs_jack, void *data) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + int btndet_delay = 16; >> >> + >> >> + rt5682s->hs_jack = hs_jack; >> >> + >> >> + if (!hs_jack) { >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_IRQ_CTRL_2, >> >> + RT5682S_JD1_EN_MASK, >> RT5682S_JD1_DIS); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_RC_CLK_CTRL, >> >> + RT5682S_POW_JDH, 0); >> >> + >> cancel_delayed_work_sync(&rt5682s->jack_detect_work); >> >> + >> >> + return 0; >> >> + } >> >> + >> >> + switch (rt5682s->pdata.jd_src) { >> >> + case RT5682S_JD1: >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_CBJ_CTRL_5, >> >> + RT5682S_JD_FAST_OFF_SRC_MASK, >> RT5682S_JD_FAST_OFF_SRC_JDH); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_CBJ_CTRL_2, >> >> + RT5682S_EXT_JD_SRC, >> RT5682S_EXT_JD_SRC_MANUAL); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_CBJ_CTRL_1, >> >> + RT5682S_EMB_JD_MASK | >> RT5682S_DET_TYPE | >> >> + RT5682S_POL_FAST_OFF_MASK | >> RT5682S_MIC_CAP_MASK, >> >> + RT5682S_EMB_JD_EN | >> RT5682S_DET_TYPE | >> >> + RT5682S_POL_FAST_OFF_HIGH | >> RT5682S_MIC_CAP_HS); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_SAR_IL_CMD_1, >> >> + RT5682S_SAR_POW_MASK, >> RT5682S_SAR_POW_EN); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_GPIO_CTRL_1, >> >> + RT5682S_GP1_PIN_MASK, >> RT5682S_GP1_PIN_IRQ); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_BGLDO, >> RT5682S_PWR_BGLDO); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_PWR_ANLG_2, >> >> + RT5682S_PWR_JD_MASK, >> RT5682S_PWR_JD_ENABLE); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_RC_CLK_CTRL, >> >> + RT5682S_POW_IRQ | >> RT5682S_POW_JDH, RT5682S_POW_IRQ | RT5682S_POW_JDH); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_IRQ_CTRL_2, >> >> + RT5682S_JD1_EN_MASK | >> RT5682S_JD1_POL_MASK, >> >> + RT5682S_JD1_EN | >> RT5682S_JD1_POL_NOR); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_4BTN_IL_CMD_4, >> >> + RT5682S_4BTN_IL_HOLD_WIN_MASK | >> RT5682S_4BTN_IL_CLICK_WIN_MASK, >> >> + (btndet_delay << >> RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay)); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_4BTN_IL_CMD_5, >> >> + RT5682S_4BTN_IL_HOLD_WIN_MASK | >> RT5682S_4BTN_IL_CLICK_WIN_MASK, >> >> + (btndet_delay << >> RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay)); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_4BTN_IL_CMD_6, >> >> + RT5682S_4BTN_IL_HOLD_WIN_MASK | >> RT5682S_4BTN_IL_CLICK_WIN_MASK, >> >> + (btndet_delay << >> RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay)); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_4BTN_IL_CMD_7, >> >> + RT5682S_4BTN_IL_HOLD_WIN_MASK | >> RT5682S_4BTN_IL_CLICK_WIN_MASK, >> >> + (btndet_delay << >> RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay)); >> >> + >> >> + mod_delayed_work(system_power_efficient_wq, >> >> + &rt5682s->jack_detect_work, >> msecs_to_jiffies(250)); >> >> + break; >> >> + >> >> + case RT5682S_JD_NULL: >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_IRQ_CTRL_2, >> >> + RT5682S_JD1_EN_MASK, >> RT5682S_JD1_DIS); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_RC_CLK_CTRL, >> >> + RT5682S_POW_JDH, 0); >> >> + break; >> >> + >> >> + default: >> >> + dev_warn(component->dev, "Wrong JD source\n"); >> >> + break; >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -9450, 150, 0); >> >> +static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0); >> >> +static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); >> >> +static const DECLARE_TLV_DB_SCALE(cbj_bst_tlv, -1200, 150, 0); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_snd_controls[] = { >> >> + /* DAC Digital Volume */ >> >> + SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682S_DAC1_DIG_VOL, >> >> + RT5682S_L_VOL_SFT + 2, RT5682S_R_VOL_SFT + 2, >> 63, 0, dac_vol_tlv), >> >> + >> >> + /* CBJ Boost Volume */ >> >> + SOC_SINGLE_TLV("CBJ Boost Volume", RT5682S_REC_MIXER, >> >> + RT5682S_BST_CBJ_SFT, 35, 0, cbj_bst_tlv), >> >> + >> >> + /* ADC Digital Volume Control */ >> >> + SOC_DOUBLE("STO1 ADC Capture Switch", >> RT5682S_STO1_ADC_DIG_VOL, >> >> + RT5682S_L_MUTE_SFT, RT5682S_R_MUTE_SFT, 1, 1), >> >> + SOC_DOUBLE_TLV("STO1 ADC Capture Volume", >> RT5682S_STO1_ADC_DIG_VOL, >> >> + RT5682S_L_VOL_SFT + 1, RT5682S_R_VOL_SFT + 1, >> 63, 0, adc_vol_tlv), >> >> + >> >> + /* ADC Boost Volume Control */ >> >> + SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", >> RT5682S_STO1_ADC_BOOST, >> >> + RT5682S_STO1_ADC_L_BST_SFT, >> RT5682S_STO1_ADC_R_BST_SFT, 3, 0, adc_bst_tlv), >> >> +}; >> >> + >> >> +/** >> >> + * rt5682s_sel_asrc_clk_src - select ASRC clock source for a set of >> filters >> >> + * @component: SoC audio component device. >> >> + * @filter_mask: mask of filters. >> >> + * @clk_src: clock source >> >> + * >> >> + * The ASRC function is for asynchronous MCLK and LRCK. Also, since >> RT5682S can >> >> + * only support standard 32fs or 64fs i2s format, ASRC should be enabled >> to >> >> + * support special i2s clock format such as Intel's 100fs(100 * sampling >> rate). >> >> + * ASRC function will track i2s clock and generate a corresponding >> system clock >> >> + * for codec. This function provides an API to select the clock source >> for a >> >> + * set of filters specified by the mask. And the component driver will >> turn on >> >> + * ASRC for these filters if ASRC is selected as their clock source. >> >> + */ >> >> +int rt5682s_sel_asrc_clk_src(struct snd_soc_component *component, >> >> + unsigned int filter_mask, unsigned int >> clk_src) >> >> +{ >> >> + switch (clk_src) { >> >> + case RT5682S_CLK_SEL_SYS: >> >> + case RT5682S_CLK_SEL_I2S1_ASRC: >> >> + case RT5682S_CLK_SEL_I2S2_ASRC: >> >> + break; >> >> + >> >> + default: >> >> + return -EINVAL; >> >> + } >> >> + >> >> + if (filter_mask & RT5682S_DA_STEREO1_FILTER) { >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_TRACK_2, >> >> + RT5682S_FILTER_CLK_SEL_MASK, >> clk_src << RT5682S_FILTER_CLK_SEL_SFT); >> >> + } >> >> + >> >> + if (filter_mask & RT5682S_AD_STEREO1_FILTER) { >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_TRACK_3, >> >> + RT5682S_FILTER_CLK_SEL_MASK, >> clk_src << RT5682S_FILTER_CLK_SEL_SFT); >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> +EXPORT_SYMBOL_GPL(rt5682s_sel_asrc_clk_src); >> >> + >> >> +static int rt5682s_div_sel(struct rt5682s_priv *rt5682s, >> >> + int target, const int div[], int size) >> >> +{ >> >> + int i; >> >> + >> >> + if (rt5682s->sysclk < target) { >> >> + dev_err(rt5682s->component->dev, >> >> + "sysclk rate %d is too low\n", >> rt5682s->sysclk); >> >> + return 0; >> >> + } >> >> + >> >> + for (i = 0; i < size - 1; i++) { >> >> + dev_dbg(rt5682s->component->dev, >> "div[%d]=%d\n", i, div[i]); >> >> + if (target * div[i] == rt5682s->sysclk) >> >> + return i; >> >> + if (target * div[i + 1] > rt5682s->sysclk) { >> >> + dev_dbg(rt5682s->component->dev, >> >> + "can't find div >> for sysclk %d\n", rt5682s->sysclk); >> >> + return i; >> >> + } >> >> + } >> >> + >> >> + if (target * div[i] < rt5682s->sysclk) >> >> + dev_err(rt5682s->component->dev, >> >> + "sysclk rate %d is too high\n", >> rt5682s->sysclk); >> >> + >> >> + return size - 1; >> >> +} >> >> + >> >> +static int get_clk_info(int sclk, int rate) >> >> +{ >> >> + int i; >> >> + static const int pd[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, >> 48}; >> >> + >> >> + if (sclk <= 0 || rate <= 0) >> >> + return -EINVAL; >> >> + >> >> + rate = rate << 8; >> >> + for (i = 0; i < ARRAY_SIZE(pd); i++) >> >> + if (sclk == rate * pd[i]) >> >> + return i; >> >> + >> >> + return -EINVAL; >> >> +} >> >> + >> >> +/** >> >> + * set_dmic_clk - Set parameter of dmic. >> >> + * >> >> + * @w: DAPM widget. >> >> + * @kcontrol: The kcontrol of this widget. >> >> + * @event: Event id. >> >> + * >> >> + * Choose dmic clock between 1MHz and 3MHz. >> >> + * It is better for clock to approximate 3MHz. >> >> + */ >> >> +static int set_dmic_clk(struct snd_soc_dapm_widget *w, >> >> + struct snd_kcontrol *kcontrol, int event) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + int idx, dmic_clk_rate = 3072000; >> >> + static const int div[] = {2, 4, 6, 8, 12, 16, 24, 32, 48, >> 64, 96, 128}; >> >> + >> >> + if (rt5682s->pdata.dmic_clk_rate) >> >> + dmic_clk_rate = rt5682s->pdata.dmic_clk_rate; >> >> + >> >> + idx = rt5682s_div_sel(rt5682s, dmic_clk_rate, div, >> ARRAY_SIZE(div)); >> >> + >> >> + snd_soc_component_update_bits(component, RT5682S_DMIC_CTRL_1, >> >> + RT5682S_DMIC_CLK_MASK, idx << >> RT5682S_DMIC_CLK_SFT); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int set_filter_clk(struct snd_soc_dapm_widget *w, >> >> + struct snd_kcontrol *kcontrol, int event) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + int ref, val, reg, idx; >> >> + static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, >> 32, 48}; >> >> + static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, >> 48}; >> >> + >> >> + val = snd_soc_component_read(component, RT5682S_GPIO_CTRL_1) >> >> + & RT5682S_GP4_PIN_MASK; >> >> + >> >> + if (w->shift == RT5682S_PWR_ADC_S1F_BIT && val == >> RT5682S_GP4_PIN_ADCDAT2) >> >> + ref = 256 * rt5682s->lrck[RT5682S_AIF2]; >> >> + else >> >> + ref = 256 * rt5682s->lrck[RT5682S_AIF1]; >> >> + >> >> + idx = rt5682s_div_sel(rt5682s, ref, div_f, >> ARRAY_SIZE(div_f)); >> >> + >> >> + if (w->shift == RT5682S_PWR_ADC_S1F_BIT) >> >> + reg = RT5682S_PLL_TRACK_3; >> >> + else >> >> + reg = RT5682S_PLL_TRACK_2; >> >> + >> >> + snd_soc_component_update_bits(component, reg, >> >> + RT5682S_FILTER_CLK_DIV_MASK, idx << >> RT5682S_FILTER_CLK_DIV_SFT); >> >> + >> >> + /* select over sample rate */ >> >> + for (idx = 0; idx < ARRAY_SIZE(div_o); idx++) { >> >> + if (rt5682s->sysclk <= 12288000 * div_o[idx]) >> >> + break; >> >> + } >> >> + >> >> + snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_1, >> >> + RT5682S_ADC_OSR_MASK | RT5682S_DAC_OSR_MASK, >> >> + (idx << RT5682S_ADC_OSR_SFT) | (idx << >> RT5682S_DAC_OSR_SFT)); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int set_dmic_power(struct snd_soc_dapm_widget *w, >> >> + struct snd_kcontrol *kcontrol, int event) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + unsigned int delay = 50, val; >> >> + >> >> + if (rt5682s->pdata.dmic_delay) >> >> + delay = rt5682s->pdata.dmic_delay; >> >> + >> >> + switch (event) { >> >> + case SND_SOC_DAPM_POST_PMU: >> >> + val = (snd_soc_component_read(component, >> RT5682S_GLB_CLK) >> >> + & RT5682S_SCLK_SRC_MASK) >> >> RT5682S_SCLK_SRC_SFT; >> >> + if (val == RT5682S_CLK_SRC_PLL1 || val == >> RT5682S_CLK_SRC_PLL2) >> >> + >> snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_VREF2 >> | RT5682S_PWR_MB, >> >> + RT5682S_PWR_VREF2 >> | RT5682S_PWR_MB); >> >> + >> >> + /*Add delay to avoid pop noise*/ >> >> + msleep(delay); >> >> + break; >> >> + >> >> + case SND_SOC_DAPM_POST_PMD: >> >> + if (!rt5682s->jack_type) { >> >> + if >> (!snd_soc_dapm_get_pin_status(w->dapm, "MICBIAS")) >> >> + >> snd_soc_component_update_bits(component, >> >> + >> RT5682S_PWR_ANLG_1, RT5682S_PWR_MB, 0); >> >> + if >> (!snd_soc_dapm_get_pin_status(w->dapm, "Vref2")) >> >> + >> snd_soc_component_update_bits(component, >> >> + >> RT5682S_PWR_ANLG_1, RT5682S_PWR_VREF2, 0); >> >> + } >> >> + break; >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int set_i2s_clk(struct snd_soc_dapm_widget *w, >> >> + struct snd_kcontrol *kcontrol, int event) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + int pre_div, id; >> >> + unsigned int reg, mask, sft; >> >> + >> >> + if (event != SND_SOC_DAPM_PRE_PMU) >> >> + return 0; >> >> + >> >> + if (w->shift == RT5682S_PWR_I2S2_BIT) { >> >> + id = RT5682S_AIF2; >> >> + reg = RT5682S_I2S2_M_CLK_CTRL_1; >> >> + mask = RT5682S_I2S2_M_D_MASK; >> >> + sft = RT5682S_I2S2_M_D_SFT; >> >> + } else { >> >> + id = RT5682S_AIF1; >> >> + reg = RT5682S_ADDA_CLK_1; >> >> + mask = RT5682S_I2S_M_D_MASK; >> >> + sft = RT5682S_I2S_M_D_SFT; >> >> + } >> >> + >> >> + if (!rt5682s->master[id]) >> >> + return 0; >> >> + >> >> + pre_div = get_clk_info(rt5682s->sysclk, rt5682s->lrck[id]); >> >> + if (pre_div < 0) { >> >> + dev_err(component->dev, "get pre_div >> failed\n"); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + dev_dbg(component->dev, "lrck is %dHz and pre_div is %d for >> iis %d master\n", >> >> + rt5682s->lrck[id], pre_div, id); >> >> + snd_soc_component_update_bits(component, reg, mask, pre_div >> << sft); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int is_sys_clk_from_plla(struct snd_soc_dapm_widget *w, >> >> + struct snd_soc_dapm_widget *sink) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + if ((rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL1) || >> >> + (rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL2 && >> rt5682s->pll_comb == USE_PLLAB)) >> >> + return 1; >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int is_sys_clk_from_pllb(struct snd_soc_dapm_widget *w, >> >> + struct snd_soc_dapm_widget *sink) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + if (rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL2) >> >> + return 1; >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int is_using_asrc(struct snd_soc_dapm_widget *w, >> >> + struct snd_soc_dapm_widget *sink) >> >> +{ >> >> + unsigned int reg, sft, val; >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + >> >> + switch (w->shift) { >> >> + case RT5682S_ADC_STO1_ASRC_SFT: >> >> + reg = RT5682S_PLL_TRACK_3; >> >> + sft = RT5682S_FILTER_CLK_SEL_SFT; >> >> + break; >> >> + case RT5682S_DAC_STO1_ASRC_SFT: >> >> + reg = RT5682S_PLL_TRACK_2; >> >> + sft = RT5682S_FILTER_CLK_SEL_SFT; >> >> + break; >> >> + default: >> >> + return 0; >> >> + } >> >> + >> >> + val = (snd_soc_component_read(component, reg) >> sft) & 0xf; >> >> + switch (val) { >> >> + case RT5682S_CLK_SEL_I2S1_ASRC: >> >> + case RT5682S_CLK_SEL_I2S2_ASRC: >> >> + return 1; >> >> + default: >> >> + return 0; >> >> + } >> >> +} >> >> + >> >> +static int is_headset_type(struct snd_soc_dapm_widget *w, >> >> + struct snd_soc_dapm_widget *sink) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + if ((rt5682s->jack_type & SND_JACK_HEADSET) == >> SND_JACK_HEADSET) >> >> + return 1; >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_hp_amp_event(struct snd_soc_dapm_widget *w, >> >> + struct snd_kcontrol *kcontrol, int event) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + >> >> + switch (event) { >> >> + case SND_SOC_DAPM_PRE_PMU: >> >> + snd_soc_component_update_bits(component, >> RT5682S_DEPOP_1, >> >> + RT5682S_OUT_HP_L_EN | >> RT5682S_OUT_HP_R_EN, >> >> + RT5682S_OUT_HP_L_EN | >> RT5682S_OUT_HP_R_EN); >> >> + snd_soc_component_update_bits(component, >> RT5682S_DEPOP_1, >> >> + RT5682S_LDO_PUMP_EN | >> RT5682S_PUMP_EN | >> >> + RT5682S_CAPLESS_L_EN | >> RT5682S_CAPLESS_R_EN, >> >> + RT5682S_LDO_PUMP_EN | >> RT5682S_PUMP_EN | >> >> + RT5682S_CAPLESS_L_EN | >> RT5682S_CAPLESS_R_EN); >> >> + break; >> >> + >> >> + case SND_SOC_DAPM_POST_PMU: >> >> + usleep_range(30000, 35000); >> >> + snd_soc_component_write(component, >> RT5682S_BIAS_CUR_CTRL_11, 0x6666); >> >> + snd_soc_component_write(component, >> RT5682S_BIAS_CUR_CTRL_12, 0xa82a); >> >> + snd_soc_component_update_bits(component, >> RT5682S_HP_CTRL_2, >> >> + RT5682S_HPO_L_PATH_MASK | >> RT5682S_HPO_R_PATH_MASK | >> >> + RT5682S_HPO_SEL_IP_EN_SW, >> RT5682S_HPO_L_PATH_EN | >> >> + RT5682S_HPO_R_PATH_EN | >> RT5682S_HPO_IP_EN_GATING); >> >> + snd_soc_component_write(component, >> RT5682S_HP_AMP_DET_CTL_1, 0x3050); >> >> + break; >> >> + >> >> + case SND_SOC_DAPM_POST_PMD: >> >> + snd_soc_component_update_bits(component, >> RT5682S_HP_CTRL_2, >> >> + RT5682S_HPO_L_PATH_MASK | >> RT5682S_HPO_R_PATH_MASK | >> >> + RT5682S_HPO_SEL_IP_EN_SW, 0); >> >> + snd_soc_component_update_bits(component, >> RT5682S_DEPOP_1, >> >> + RT5682S_LDO_PUMP_EN | >> RT5682S_PUMP_EN | >> >> + RT5682S_CAPLESS_L_EN | >> RT5682S_CAPLESS_R_EN, 0); >> >> + snd_soc_component_update_bits(component, >> RT5682S_DEPOP_1, >> >> + RT5682S_OUT_HP_L_EN | >> RT5682S_OUT_HP_R_EN, 0); >> >> + break; >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int sar_power_event(struct snd_soc_dapm_widget *w, >> >> + struct snd_kcontrol *kcontrol, int event) >> >> +{ >> >> + struct snd_soc_component *component = >> snd_soc_dapm_to_component(w->dapm); >> >> + >> >> + switch (event) { >> >> + case SND_SOC_DAPM_PRE_PMU: >> >> + rt5682s_sar_power_mode(component, >> SAR_PWR_NORMAL, 0); >> >> + break; >> >> + case SND_SOC_DAPM_POST_PMD: >> >> + rt5682s_sar_power_mode(component, >> SAR_PWR_SAVING, 0); >> >> + break; >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +/* Interface data select */ >> >> +static const char * const rt5682s_data_select[] = { >> >> + "L/R", "R/L", "L/L", "R/R" >> >> +}; >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_if2_adc_enum, RT5682S_DIG_INF2_DATA, >> >> + RT5682S_IF2_ADC_SEL_SFT, rt5682s_data_select); >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_if1_01_adc_enum, >> RT5682S_TDM_ADDA_CTRL_1, >> >> + RT5682S_IF1_ADC1_SEL_SFT, rt5682s_data_select); >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_if1_23_adc_enum, >> RT5682S_TDM_ADDA_CTRL_1, >> >> + RT5682S_IF1_ADC2_SEL_SFT, rt5682s_data_select); >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_if1_45_adc_enum, >> RT5682S_TDM_ADDA_CTRL_1, >> >> + RT5682S_IF1_ADC3_SEL_SFT, rt5682s_data_select); >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_if1_67_adc_enum, >> RT5682S_TDM_ADDA_CTRL_1, >> >> + RT5682S_IF1_ADC4_SEL_SFT, rt5682s_data_select); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_if2_adc_swap_mux = >> >> + SOC_DAPM_ENUM("IF2 ADC Swap Mux", rt5682s_if2_adc_enum); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_if1_01_adc_swap_mux = >> >> + SOC_DAPM_ENUM("IF1 01 ADC Swap Mux", >> rt5682s_if1_01_adc_enum); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_if1_23_adc_swap_mux = >> >> + SOC_DAPM_ENUM("IF1 23 ADC Swap Mux", >> rt5682s_if1_23_adc_enum); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_if1_45_adc_swap_mux = >> >> + SOC_DAPM_ENUM("IF1 45 ADC Swap Mux", >> rt5682s_if1_45_adc_enum); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_if1_67_adc_swap_mux = >> >> + SOC_DAPM_ENUM("IF1 67 ADC Swap Mux", >> rt5682s_if1_67_adc_enum); >> >> + >> >> +/* Digital Mixer */ >> >> +static const struct snd_kcontrol_new rt5682s_sto1_adc_l_mix[] = { >> >> + SOC_DAPM_SINGLE("ADC1 Switch", RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_M_STO1_ADC_L1_SFT, 1, >> 1), >> >> + SOC_DAPM_SINGLE("ADC2 Switch", RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_M_STO1_ADC_L2_SFT, 1, >> 1), >> >> +}; >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_adc_r_mix[] = { >> >> + SOC_DAPM_SINGLE("ADC1 Switch", RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_M_STO1_ADC_R1_SFT, 1, >> 1), >> >> + SOC_DAPM_SINGLE("ADC2 Switch", RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_M_STO1_ADC_R2_SFT, 1, >> 1), >> >> +}; >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_dac_l_mix[] = { >> >> + SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682S_AD_DA_MIXER, >> >> + RT5682S_M_ADCMIX_L_SFT, 1, 1), >> >> + SOC_DAPM_SINGLE("DAC1 Switch", RT5682S_AD_DA_MIXER, >> >> + RT5682S_M_DAC1_L_SFT, 1, 1), >> >> +}; >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_dac_r_mix[] = { >> >> + SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682S_AD_DA_MIXER, >> >> + RT5682S_M_ADCMIX_R_SFT, 1, 1), >> >> + SOC_DAPM_SINGLE("DAC1 Switch", RT5682S_AD_DA_MIXER, >> >> + RT5682S_M_DAC1_R_SFT, 1, 1), >> >> +}; >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_dac_l_mix[] = { >> >> + SOC_DAPM_SINGLE("DAC L1 Switch", RT5682S_STO1_DAC_MIXER, >> >> + RT5682S_M_DAC_L1_STO_L_SFT, 1, >> 1), >> >> + SOC_DAPM_SINGLE("DAC R1 Switch", RT5682S_STO1_DAC_MIXER, >> >> + RT5682S_M_DAC_R1_STO_L_SFT, 1, >> 1), >> >> +}; >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_dac_r_mix[] = { >> >> + SOC_DAPM_SINGLE("DAC L1 Switch", RT5682S_STO1_DAC_MIXER, >> >> + RT5682S_M_DAC_L1_STO_R_SFT, 1, >> 1), >> >> + SOC_DAPM_SINGLE("DAC R1 Switch", RT5682S_STO1_DAC_MIXER, >> >> + RT5682S_M_DAC_R1_STO_R_SFT, 1, >> 1), >> >> +}; >> >> + >> >> +/* Analog Input Mixer */ >> >> +static const struct snd_kcontrol_new rt5682s_rec1_l_mix[] = { >> >> + SOC_DAPM_SINGLE("CBJ Switch", RT5682S_REC_MIXER, >> >> + RT5682S_M_CBJ_RM1_L_SFT, 1, 1), >> >> +}; >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_rec1_r_mix[] = { >> >> + SOC_DAPM_SINGLE("CBJ Switch", RT5682S_REC_MIXER, >> >> + RT5682S_M_CBJ_RM1_R_SFT, 1, 1), >> >> +}; >> >> + >> >> +/* STO1 ADC1 Source */ >> >> +/* MX-26 [13] [5] */ >> >> +static const char * const rt5682s_sto1_adc1_src[] = { >> >> + "DAC MIX", "ADC" >> >> +}; >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc1l_enum, >> RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_STO1_ADC1L_SRC_SFT, rt5682s_sto1_adc1_src); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_adc1l_mux = >> >> + SOC_DAPM_ENUM("Stereo1 ADC1L Source", >> rt5682s_sto1_adc1l_enum); >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc1r_enum, >> RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_STO1_ADC1R_SRC_SFT, rt5682s_sto1_adc1_src); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_adc1r_mux = >> >> + SOC_DAPM_ENUM("Stereo1 ADC1L Source", >> rt5682s_sto1_adc1r_enum); >> >> + >> >> +/* STO1 ADC Source */ >> >> +/* MX-26 [11:10] [3:2] */ >> >> +static const char * const rt5682s_sto1_adc_src[] = { >> >> + "ADC1 L", "ADC1 R" >> >> +}; >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adcl_enum, >> RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_STO1_ADCL_SRC_SFT, rt5682s_sto1_adc_src); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_adcl_mux = >> >> + SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5682s_sto1_adcl_enum); >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adcr_enum, >> RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_STO1_ADCR_SRC_SFT, rt5682s_sto1_adc_src); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_adcr_mux = >> >> + SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5682s_sto1_adcr_enum); >> >> + >> >> +/* STO1 ADC2 Source */ >> >> +/* MX-26 [12] [4] */ >> >> +static const char * const rt5682s_sto1_adc2_src[] = { >> >> + "DAC MIX", "DMIC" >> >> +}; >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc2l_enum, >> RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_STO1_ADC2L_SRC_SFT, rt5682s_sto1_adc2_src); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_adc2l_mux = >> >> + SOC_DAPM_ENUM("Stereo1 ADC2L Source", >> rt5682s_sto1_adc2l_enum); >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc2r_enum, >> RT5682S_STO1_ADC_MIXER, >> >> + RT5682S_STO1_ADC2R_SRC_SFT, rt5682s_sto1_adc2_src); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_sto1_adc2r_mux = >> >> + SOC_DAPM_ENUM("Stereo1 ADC2R Source", >> rt5682s_sto1_adc2r_enum); >> >> + >> >> +/* MX-79 [6:4] I2S1 ADC data location */ >> >> +static const unsigned int rt5682s_if1_adc_slot_values[] = { >> >> + 0, 2, 4, 6, >> >> +}; >> >> + >> >> +static const char * const rt5682s_if1_adc_slot_src[] = { >> >> + "Slot 0", "Slot 2", "Slot 4", "Slot 6" >> >> +}; >> >> + >> >> +static SOC_VALUE_ENUM_SINGLE_DECL(rt5682s_if1_adc_slot_enum, >> >> + RT5682S_TDM_CTRL, RT5682S_TDM_ADC_LCA_SFT, >> RT5682S_TDM_ADC_LCA_MASK, >> >> + rt5682s_if1_adc_slot_src, rt5682s_if1_adc_slot_values); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_if1_adc_slot_mux = >> >> + SOC_DAPM_ENUM("IF1 ADC Slot location", >> rt5682s_if1_adc_slot_enum); >> >> + >> >> +/* Analog DAC L1 Source, Analog DAC R1 Source*/ >> >> +/* MX-2B [4], MX-2B [0]*/ >> >> +static const char * const rt5682s_alg_dac1_src[] = { >> >> + "Stereo1 DAC Mixer", "DAC1" >> >> +}; >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_alg_dac_l1_enum, RT5682S_A_DAC1_MUX, >> >> + RT5682S_A_DACL1_SFT, rt5682s_alg_dac1_src); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_alg_dac_l1_mux = >> >> + SOC_DAPM_ENUM("Analog DAC L1 Source", >> rt5682s_alg_dac_l1_enum); >> >> + >> >> +static SOC_ENUM_SINGLE_DECL(rt5682s_alg_dac_r1_enum, RT5682S_A_DAC1_MUX, >> >> + RT5682S_A_DACR1_SFT, rt5682s_alg_dac1_src); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_alg_dac_r1_mux = >> >> + SOC_DAPM_ENUM("Analog DAC R1 Source", >> rt5682s_alg_dac_r1_enum); >> >> + >> >> +static const unsigned int rt5682s_adcdat_pin_values[] = { >> >> + 1, 3, >> >> +}; >> >> + >> >> +static const char * const rt5682s_adcdat_pin_select[] = { >> >> + "ADCDAT1", "ADCDAT2", >> >> +}; >> >> + >> >> +static SOC_VALUE_ENUM_SINGLE_DECL(rt5682s_adcdat_pin_enum, >> >> + RT5682S_GPIO_CTRL_1, RT5682S_GP4_PIN_SFT, >> RT5682S_GP4_PIN_MASK, >> >> + rt5682s_adcdat_pin_select, rt5682s_adcdat_pin_values); >> >> + >> >> +static const struct snd_kcontrol_new rt5682s_adcdat_pin_ctrl = >> >> + SOC_DAPM_ENUM("ADCDAT", rt5682s_adcdat_pin_enum); >> >> + >> >> +static const struct snd_soc_dapm_widget rt5682s_dapm_widgets[] = { >> >> + SND_SOC_DAPM_SUPPLY("LDO MB1", RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_LDO_MB1_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("LDO MB2", RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_LDO_MB2_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("LDO", RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_LDO_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("Vref2", SND_SOC_NOPM, 0, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("MICBIAS", SND_SOC_NOPM, 0, 0, NULL, 0), >> >> + >> >> + /* PLL Powers */ >> >> + SND_SOC_DAPM_SUPPLY_S("PLLA_LDO", 0, RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_LDO_PLLA_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("PLLB_LDO", 0, RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_LDO_PLLB_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("PLLA_BIAS", 0, RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_BIAS_PLLA_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("PLLB_BIAS", 0, RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_BIAS_PLLB_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("PLLA", 0, RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_PLLA_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("PLLB", 0, RT5682S_PWR_ANLG_3, >> >> + RT5682S_PWR_PLLB_BIT, 0, set_filter_clk, >> SND_SOC_DAPM_PRE_PMU), >> >> + SND_SOC_DAPM_SUPPLY_S("PLLA_RST", 1, RT5682S_PWR_ANLG_3, >> >> + RT5682S_RSTB_PLLA_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("PLLB_RST", 1, RT5682S_PWR_ANLG_3, >> >> + RT5682S_RSTB_PLLB_BIT, 0, NULL, 0), >> >> + >> >> + /* ASRC */ >> >> + SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, >> RT5682S_PLL_TRACK_1, >> >> + RT5682S_DAC_STO1_ASRC_SFT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, >> RT5682S_PLL_TRACK_1, >> >> + RT5682S_ADC_STO1_ASRC_SFT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("AD ASRC", 1, RT5682S_PLL_TRACK_1, >> >> + RT5682S_AD_ASRC_SFT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("DA ASRC", 1, RT5682S_PLL_TRACK_1, >> >> + RT5682S_DA_ASRC_SFT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY_S("DMIC ASRC", 1, RT5682S_PLL_TRACK_1, >> >> + RT5682S_DMIC_ASRC_SFT, 0, NULL, 0), >> >> + >> >> + /* Input Side */ >> >> + SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5682S_PWR_ANLG_2, >> >> + RT5682S_PWR_MB1_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5682S_PWR_ANLG_2, >> >> + RT5682S_PWR_MB2_BIT, 0, NULL, 0), >> >> + >> >> + /* Input Lines */ >> >> + SND_SOC_DAPM_INPUT("DMIC L1"), >> >> + SND_SOC_DAPM_INPUT("DMIC R1"), >> >> + >> >> + SND_SOC_DAPM_INPUT("IN1P"), >> >> + >> >> + SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0, >> >> + set_dmic_clk, SND_SOC_DAPM_PRE_PMU), >> >> + SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5682S_DMIC_CTRL_1, >> RT5682S_DMIC_1_EN_SFT, 0, >> >> + set_dmic_power, SND_SOC_DAPM_POST_PMU | >> SND_SOC_DAPM_POST_PMD), >> >> + >> >> + /* Boost */ >> >> + SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM, 0, 0, NULL, 0), >> >> + >> >> + /* REC Mixer */ >> >> + SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, >> rt5682s_rec1_l_mix, >> >> + ARRAY_SIZE(rt5682s_rec1_l_mix)), >> >> + SND_SOC_DAPM_MIXER("RECMIX1R", SND_SOC_NOPM, 0, 0, >> rt5682s_rec1_r_mix, >> >> + ARRAY_SIZE(rt5682s_rec1_r_mix)), >> >> + SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5682S_CAL_REC, >> >> + RT5682S_PWR_RM1_L_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("RECMIX1R Power", RT5682S_CAL_REC, >> >> + RT5682S_PWR_RM1_R_BIT, 0, NULL, 0), >> >> + >> >> + /* ADCs */ >> >> + SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0), >> >> + SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0), >> >> + >> >> + SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5682S_PWR_DIG_1, >> >> + RT5682S_PWR_ADC_L1_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5682S_PWR_DIG_1, >> >> + RT5682S_PWR_ADC_R1_BIT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5682S_CHOP_ADC, >> >> + RT5682S_CKGEN_ADC1_SFT, 0, NULL, 0), >> >> + >> >> + /* ADC Mux */ >> >> + SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_sto1_adc1l_mux), >> >> + SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_sto1_adc1r_mux), >> >> + SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_sto1_adc2l_mux), >> >> + SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_sto1_adc2r_mux), >> >> + SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_sto1_adcl_mux), >> >> + SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_sto1_adcr_mux), >> >> + SND_SOC_DAPM_MUX("IF1_ADC Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_if1_adc_slot_mux), >> >> + >> >> + /* ADC Mixer */ >> >> + SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682S_PWR_DIG_2, >> >> + RT5682S_PWR_ADC_S1F_BIT, 0, set_filter_clk, >> SND_SOC_DAPM_PRE_PMU), >> >> + SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", >> RT5682S_STO1_ADC_DIG_VOL, >> >> + RT5682S_L_MUTE_SFT, 1, rt5682s_sto1_adc_l_mix, >> >> + ARRAY_SIZE(rt5682s_sto1_adc_l_mix)), >> >> + SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", >> RT5682S_STO1_ADC_DIG_VOL, >> >> + RT5682S_R_MUTE_SFT, 1, rt5682s_sto1_adc_r_mix, >> >> + ARRAY_SIZE(rt5682s_sto1_adc_r_mix)), >> >> + >> >> + /* ADC PGA */ >> >> + SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, >> NULL, 0), >> >> + >> >> + /* Digital Interface */ >> >> + SND_SOC_DAPM_SUPPLY("I2S1", RT5682S_PWR_DIG_1, >> RT5682S_PWR_I2S1_BIT, >> >> + 0, set_i2s_clk, SND_SOC_DAPM_PRE_PMU), >> >> + SND_SOC_DAPM_SUPPLY("I2S2", RT5682S_PWR_DIG_1, >> RT5682S_PWR_I2S2_BIT, >> >> + 0, set_i2s_clk, SND_SOC_DAPM_PRE_PMU), >> >> + SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0), >> >> + SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0), >> >> + >> >> + /* Digital Interface Select */ >> >> + SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_if1_01_adc_swap_mux), >> >> + SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_if1_23_adc_swap_mux), >> >> + SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_if1_45_adc_swap_mux), >> >> + SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_if1_67_adc_swap_mux), >> >> + SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0, >> >> + &rt5682s_if2_adc_swap_mux), >> >> + >> >> + SND_SOC_DAPM_MUX("ADCDAT Mux", SND_SOC_NOPM, 0, 0, >> &rt5682s_adcdat_pin_ctrl), >> >> + >> >> + /* Audio Interface */ >> >> + SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, >> RT5682S_I2S1_SDP, >> >> + RT5682S_SEL_ADCDAT_SFT, 1), >> >> + SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, >> RT5682S_I2S2_SDP, >> >> + RT5682S_I2S2_PIN_CFG_SFT, 1), >> >> + SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, >> SND_SOC_NOPM, 0, 0), >> >> + >> >> + /* Output Side */ >> >> + /* DAC mixer before sound effect */ >> >> + SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0, >> >> + rt5682s_dac_l_mix, >> ARRAY_SIZE(rt5682s_dac_l_mix)), >> >> + SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0, >> >> + rt5682s_dac_r_mix, >> ARRAY_SIZE(rt5682s_dac_r_mix)), >> >> + >> >> + /* DAC channel Mux */ >> >> + SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0, >> &rt5682s_alg_dac_l1_mux), >> >> + SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0, >> &rt5682s_alg_dac_r1_mux), >> >> + >> >> + /* DAC Mixer */ >> >> + SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5682S_PWR_DIG_2, >> >> + RT5682S_PWR_DAC_S1F_BIT, 0, set_filter_clk, >> SND_SOC_DAPM_PRE_PMU), >> >> + SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0, >> >> + rt5682s_sto1_dac_l_mix, >> ARRAY_SIZE(rt5682s_sto1_dac_l_mix)), >> >> + SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0, >> >> + rt5682s_sto1_dac_r_mix, >> ARRAY_SIZE(rt5682s_sto1_dac_r_mix)), >> >> + >> >> + /* DACs */ >> >> + SND_SOC_DAPM_DAC("DAC L1", NULL, RT5682S_PWR_DIG_1, >> RT5682S_PWR_DAC_L1_BIT, 0), >> >> + SND_SOC_DAPM_DAC("DAC R1", NULL, RT5682S_PWR_DIG_1, >> RT5682S_PWR_DAC_R1_BIT, 0), >> >> + >> >> + /* HPO */ >> >> + SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, >> rt5682s_hp_amp_event, >> >> + SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU >> | SND_SOC_DAPM_POST_PMU), >> >> + >> >> + /* CLK DET */ >> >> + SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682S_CLK_DET, >> >> + RT5682S_SYS_CLK_DET_SFT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("CLKDET PLL1", RT5682S_CLK_DET, >> >> + RT5682S_PLL1_CLK_DET_SFT, 0, NULL, 0), >> >> + SND_SOC_DAPM_SUPPLY("MCLK0 DET PWR", RT5682S_PWR_ANLG_2, >> >> + RT5682S_PWR_MCLK0_WD_BIT, 0, NULL, 0), >> >> + >> >> + /* SAR */ >> >> + SND_SOC_DAPM_SUPPLY("SAR", SND_SOC_NOPM, 0, 0, >> sar_power_event, >> >> + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), >> >> + >> >> + /* Output Lines */ >> >> + SND_SOC_DAPM_OUTPUT("HPOL"), >> >> + SND_SOC_DAPM_OUTPUT("HPOR"), >> >> +}; >> >> + >> >> +static const struct snd_soc_dapm_route rt5682s_dapm_routes[] = { >> >> + /*PLL*/ >> >> + {"ADC Stereo1 Filter", NULL, "PLLA", is_sys_clk_from_plla}, >> >> + {"ADC Stereo1 Filter", NULL, "PLLB", is_sys_clk_from_pllb}, >> >> + {"DAC Stereo1 Filter", NULL, "PLLA", is_sys_clk_from_plla}, >> >> + {"DAC Stereo1 Filter", NULL, "PLLB", is_sys_clk_from_pllb}, >> >> + {"PLLA", NULL, "PLLA_LDO"}, >> >> + {"PLLA", NULL, "PLLA_BIAS"}, >> >> + {"PLLA", NULL, "PLLA_RST"}, >> >> + {"PLLB", NULL, "PLLB_LDO"}, >> >> + {"PLLB", NULL, "PLLB_BIAS"}, >> >> + {"PLLB", NULL, "PLLB_RST"}, >> >> + >> >> + /*ASRC*/ >> >> + {"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc}, >> >> + {"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc}, >> >> + {"ADC STO1 ASRC", NULL, "AD ASRC"}, >> >> + {"ADC STO1 ASRC", NULL, "DA ASRC"}, >> >> + {"DAC STO1 ASRC", NULL, "AD ASRC"}, >> >> + {"DAC STO1 ASRC", NULL, "DA ASRC"}, >> >> + >> >> + {"CLKDET SYS", NULL, "MCLK0 DET PWR"}, >> >> + >> >> + {"BST1 CBJ", NULL, "IN1P"}, >> >> + {"BST1 CBJ", NULL, "SAR", is_headset_type}, >> >> + >> >> + {"RECMIX1L", "CBJ Switch", "BST1 CBJ"}, >> >> + {"RECMIX1L", NULL, "RECMIX1L Power"}, >> >> + {"RECMIX1R", "CBJ Switch", "BST1 CBJ"}, >> >> + {"RECMIX1R", NULL, "RECMIX1R Power"}, >> >> + >> >> + {"ADC1 L", NULL, "RECMIX1L"}, >> >> + {"ADC1 L", NULL, "ADC1 L Power"}, >> >> + {"ADC1 L", NULL, "ADC1 clock"}, >> >> + {"ADC1 R", NULL, "RECMIX1R"}, >> >> + {"ADC1 R", NULL, "ADC1 R Power"}, >> >> + {"ADC1 R", NULL, "ADC1 clock"}, >> >> + >> >> + {"DMIC L1", NULL, "DMIC CLK"}, >> >> + {"DMIC L1", NULL, "DMIC1 Power"}, >> >> + {"DMIC R1", NULL, "DMIC CLK"}, >> >> + {"DMIC R1", NULL, "DMIC1 Power"}, >> >> + {"DMIC CLK", NULL, "DMIC ASRC"}, >> >> + >> >> + {"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"}, >> >> + {"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"}, >> >> + {"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"}, >> >> + {"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"}, >> >> + >> >> + {"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"}, >> >> + {"Stereo1 ADC L1 Mux", "DAC MIX", "Stereo1 DAC MIXL"}, >> >> + {"Stereo1 ADC L2 Mux", "DMIC", "DMIC L1"}, >> >> + {"Stereo1 ADC L2 Mux", "DAC MIX", "Stereo1 DAC MIXL"}, >> >> + >> >> + {"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"}, >> >> + {"Stereo1 ADC R1 Mux", "DAC MIX", "Stereo1 DAC MIXR"}, >> >> + {"Stereo1 ADC R2 Mux", "DMIC", "DMIC R1"}, >> >> + {"Stereo1 ADC R2 Mux", "DAC MIX", "Stereo1 DAC MIXR"}, >> >> + >> >> + {"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"}, >> >> + {"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"}, >> >> + {"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"}, >> >> + >> >> + {"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"}, >> >> + {"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"}, >> >> + {"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"}, >> >> + >> >> + {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"}, >> >> + {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"}, >> >> + >> >> + {"IF1 01 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, >> >> + {"IF1 01 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, >> >> + {"IF1 01 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, >> >> + {"IF1 01 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, >> >> + {"IF1 23 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, >> >> + {"IF1 23 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, >> >> + {"IF1 23 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, >> >> + {"IF1 23 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, >> >> + {"IF1 45 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, >> >> + {"IF1 45 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, >> >> + {"IF1 45 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, >> >> + {"IF1 45 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, >> >> + {"IF1 67 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, >> >> + {"IF1 67 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, >> >> + {"IF1 67 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, >> >> + {"IF1 67 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, >> >> + >> >> + {"IF1_ADC Mux", "Slot 0", "IF1 01 ADC Swap Mux"}, >> >> + {"IF1_ADC Mux", "Slot 2", "IF1 23 ADC Swap Mux"}, >> >> + {"IF1_ADC Mux", "Slot 4", "IF1 45 ADC Swap Mux"}, >> >> + {"IF1_ADC Mux", "Slot 6", "IF1 67 ADC Swap Mux"}, >> >> + {"ADCDAT Mux", "ADCDAT1", "IF1_ADC Mux"}, >> >> + {"AIF1TX", NULL, "I2S1"}, >> >> + {"AIF1TX", NULL, "ADCDAT Mux"}, >> >> + {"IF2 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, >> >> + {"IF2 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, >> >> + {"IF2 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, >> >> + {"IF2 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, >> >> + {"ADCDAT Mux", "ADCDAT2", "IF2 ADC Swap Mux"}, >> >> + {"AIF2TX", NULL, "ADCDAT Mux"}, >> >> + >> >> + {"IF1 DAC1 L", NULL, "AIF1RX"}, >> >> + {"IF1 DAC1 L", NULL, "I2S1"}, >> >> + {"IF1 DAC1 L", NULL, "DAC Stereo1 Filter"}, >> >> + {"IF1 DAC1 R", NULL, "AIF1RX"}, >> >> + {"IF1 DAC1 R", NULL, "I2S1"}, >> >> + {"IF1 DAC1 R", NULL, "DAC Stereo1 Filter"}, >> >> + >> >> + {"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"}, >> >> + {"DAC1 MIXL", "DAC1 Switch", "IF1 DAC1 L"}, >> >> + {"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"}, >> >> + {"DAC1 MIXR", "DAC1 Switch", "IF1 DAC1 R"}, >> >> + >> >> + {"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"}, >> >> + {"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"}, >> >> + >> >> + {"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"}, >> >> + {"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"}, >> >> + >> >> + {"DAC L1 Source", "DAC1", "DAC1 MIXL"}, >> >> + {"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"}, >> >> + {"DAC R1 Source", "DAC1", "DAC1 MIXR"}, >> >> + {"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"}, >> >> + >> >> + {"DAC L1", NULL, "DAC L1 Source"}, >> >> + {"DAC R1", NULL, "DAC R1 Source"}, >> >> + >> >> + {"HP Amp", NULL, "DAC L1"}, >> >> + {"HP Amp", NULL, "DAC R1"}, >> >> + {"HP Amp", NULL, "CLKDET SYS"}, >> >> + {"HP Amp", NULL, "SAR", is_headset_type}, >> >> + >> >> + {"HPOL", NULL, "HP Amp"}, >> >> + {"HPOR", NULL, "HP Amp"}, >> >> +}; >> >> + >> >> +static int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int >> tx_mask, >> >> + unsigned int rx_mask, int slots, int >> slot_width) >> >> +{ >> >> + struct snd_soc_component *component = dai->component; >> >> + unsigned int cl, val = 0; >> >> + >> >> + if (tx_mask || rx_mask) >> >> + snd_soc_component_update_bits(component, >> >> + RT5682S_TDM_ADDA_CTRL_2, >> RT5682S_TDM_EN, RT5682S_TDM_EN); >> >> + else >> >> + snd_soc_component_update_bits(component, >> >> + RT5682S_TDM_ADDA_CTRL_2, >> RT5682S_TDM_EN, 0); >> >> + >> >> + switch (slots) { >> >> + case 4: >> >> + val |= RT5682S_TDM_TX_CH_4; >> >> + val |= RT5682S_TDM_RX_CH_4; >> >> + break; >> >> + case 6: >> >> + val |= RT5682S_TDM_TX_CH_6; >> >> + val |= RT5682S_TDM_RX_CH_6; >> >> + break; >> >> + case 8: >> >> + val |= RT5682S_TDM_TX_CH_8; >> >> + val |= RT5682S_TDM_RX_CH_8; >> >> + break; >> >> + case 2: >> >> + break; >> >> + default: >> >> + return -EINVAL; >> >> + } >> >> + >> >> + snd_soc_component_update_bits(component, RT5682S_TDM_CTRL, >> >> + RT5682S_TDM_TX_CH_MASK | >> RT5682S_TDM_RX_CH_MASK, val); >> >> + >> >> + switch (slot_width) { >> >> + case 8: >> >> + if (tx_mask || rx_mask) >> >> + return -EINVAL; >> >> + cl = RT5682S_I2S1_TX_CHL_8 | >> RT5682S_I2S1_RX_CHL_8; >> >> + break; >> >> + case 16: >> >> + val = RT5682S_TDM_CL_16; >> >> + cl = RT5682S_I2S1_TX_CHL_16 | >> RT5682S_I2S1_RX_CHL_16; >> >> + break; >> >> + case 20: >> >> + val = RT5682S_TDM_CL_20; >> >> + cl = RT5682S_I2S1_TX_CHL_20 | >> RT5682S_I2S1_RX_CHL_20; >> >> + break; >> >> + case 24: >> >> + val = RT5682S_TDM_CL_24; >> >> + cl = RT5682S_I2S1_TX_CHL_24 | >> RT5682S_I2S1_RX_CHL_24; >> >> + break; >> >> + case 32: >> >> + val = RT5682S_TDM_CL_32; >> >> + cl = RT5682S_I2S1_TX_CHL_32 | >> RT5682S_I2S1_RX_CHL_32; >> >> + break; >> >> + default: >> >> + return -EINVAL; >> >> + } >> >> + >> >> + snd_soc_component_update_bits(component, >> RT5682S_TDM_TCON_CTRL_1, >> >> + RT5682S_TDM_CL_MASK, val); >> >> + snd_soc_component_update_bits(component, RT5682S_I2S1_SDP, >> >> + RT5682S_I2S1_TX_CHL_MASK | >> RT5682S_I2S1_RX_CHL_MASK, cl); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_hw_params(struct snd_pcm_substream *substream, >> >> + struct snd_pcm_hw_params *params, struct >> snd_soc_dai *dai) >> >> +{ >> >> + struct snd_soc_component *component = dai->component; >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + unsigned int len_1 = 0, len_2 = 0; >> >> + int frame_size; >> >> + >> >> + rt5682s->lrck[dai->id] = params_rate(params); >> >> + >> >> + frame_size = snd_soc_params_to_frame_size(params); >> >> + if (frame_size < 0) { >> >> + dev_err(component->dev, "Unsupported frame >> size: %d\n", frame_size); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + switch (params_width(params)) { >> >> + case 16: >> >> + break; >> >> + case 20: >> >> + len_1 |= RT5682S_I2S1_DL_20; >> >> + len_2 |= RT5682S_I2S2_DL_20; >> >> + break; >> >> + case 24: >> >> + len_1 |= RT5682S_I2S1_DL_24; >> >> + len_2 |= RT5682S_I2S2_DL_24; >> >> + break; >> >> + case 32: >> >> + len_1 |= RT5682S_I2S1_DL_32; >> >> + len_2 |= RT5682S_I2S2_DL_24; >> >> + break; >> >> + case 8: >> >> + len_1 |= RT5682S_I2S2_DL_8; >> >> + len_2 |= RT5682S_I2S2_DL_8; >> >> + break; >> >> + default: >> >> + return -EINVAL; >> >> + } >> >> + >> >> + switch (dai->id) { >> >> + case RT5682S_AIF1: >> >> + snd_soc_component_update_bits(component, >> RT5682S_I2S1_SDP, >> >> + RT5682S_I2S1_DL_MASK, len_1); >> >> + if (params_channels(params) == 1) /* mono >> mode */ >> >> + >> snd_soc_component_update_bits(component, RT5682S_I2S1_SDP, >> >> + >> RT5682S_I2S1_MONO_MASK, RT5682S_I2S1_MONO_EN); >> >> + else >> >> + >> snd_soc_component_update_bits(component, RT5682S_I2S1_SDP, >> >> + >> RT5682S_I2S1_MONO_MASK, RT5682S_I2S1_MONO_DIS); >> >> + break; >> >> + case RT5682S_AIF2: >> >> + snd_soc_component_update_bits(component, >> RT5682S_I2S2_SDP, >> >> + RT5682S_I2S2_DL_MASK, len_2); >> >> + if (params_channels(params) == 1) /* mono >> mode */ >> >> + >> snd_soc_component_update_bits(component, RT5682S_I2S2_SDP, >> >> + >> RT5682S_I2S2_MONO_MASK, RT5682S_I2S2_MONO_EN); >> >> + else >> >> + >> snd_soc_component_update_bits(component, RT5682S_I2S2_SDP, >> >> + >> RT5682S_I2S2_MONO_MASK, RT5682S_I2S2_MONO_DIS); >> >> + break; >> >> + default: >> >> + dev_err(component->dev, "Invalid dai->id: >> %d\n", dai->id); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) >> >> +{ >> >> + struct snd_soc_component *component = dai->component; >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + unsigned int reg_val = 0, tdm_ctrl = 0; >> >> + >> >> + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { >> >> + case SND_SOC_DAIFMT_CBM_CFM: >> >> + rt5682s->master[dai->id] = 1; >> >> + break; >> >> + case SND_SOC_DAIFMT_CBS_CFS: >> >> + rt5682s->master[dai->id] = 0; >> >> + break; >> >> + default: >> >> + return -EINVAL; >> >> + } >> >> + >> >> + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { >> >> + case SND_SOC_DAIFMT_NB_NF: >> >> + break; >> >> + case SND_SOC_DAIFMT_IB_NF: >> >> + reg_val |= RT5682S_I2S_BP_INV; >> >> + tdm_ctrl |= RT5682S_TDM_S_BP_INV; >> >> + break; >> >> + case SND_SOC_DAIFMT_NB_IF: >> >> + if (dai->id == RT5682S_AIF1) >> >> + tdm_ctrl |= >> RT5682S_TDM_S_LP_INV | RT5682S_TDM_M_BP_INV; >> >> + else >> >> + return -EINVAL; >> >> + break; >> >> + case SND_SOC_DAIFMT_IB_IF: >> >> + if (dai->id == RT5682S_AIF1) >> >> + tdm_ctrl |= >> RT5682S_TDM_S_BP_INV | RT5682S_TDM_S_LP_INV | >> >> + >> RT5682S_TDM_M_BP_INV | RT5682S_TDM_M_LP_INV; >> >> + else >> >> + return -EINVAL; >> >> + break; >> >> + default: >> >> + return -EINVAL; >> >> + } >> >> + >> >> + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { >> >> + case SND_SOC_DAIFMT_I2S: >> >> + break; >> >> + case SND_SOC_DAIFMT_LEFT_J: >> >> + reg_val |= RT5682S_I2S_DF_LEFT; >> >> + tdm_ctrl |= RT5682S_TDM_DF_LEFT; >> >> + break; >> >> + case SND_SOC_DAIFMT_DSP_A: >> >> + reg_val |= RT5682S_I2S_DF_PCM_A; >> >> + tdm_ctrl |= RT5682S_TDM_DF_PCM_A; >> >> + break; >> >> + case SND_SOC_DAIFMT_DSP_B: >> >> + reg_val |= RT5682S_I2S_DF_PCM_B; >> >> + tdm_ctrl |= RT5682S_TDM_DF_PCM_B; >> >> + break; >> >> + default: >> >> + return -EINVAL; >> >> + } >> >> + >> >> + switch (dai->id) { >> >> + case RT5682S_AIF1: >> >> + snd_soc_component_update_bits(component, >> RT5682S_I2S1_SDP, >> >> + RT5682S_I2S_DF_MASK, reg_val); >> >> + snd_soc_component_update_bits(component, >> RT5682S_TDM_TCON_CTRL_1, >> >> + RT5682S_TDM_MS_MASK | >> RT5682S_TDM_S_BP_MASK | >> >> + RT5682S_TDM_DF_MASK | >> RT5682S_TDM_M_BP_MASK | >> >> + RT5682S_TDM_M_LP_MASK | >> RT5682S_TDM_S_LP_MASK, >> >> + tdm_ctrl | >> rt5682s->master[dai->id]); >> >> + break; >> >> + case RT5682S_AIF2: >> >> + if (rt5682s->master[dai->id] == 0) >> >> + reg_val |= RT5682S_I2S2_MS_S; >> >> + snd_soc_component_update_bits(component, >> RT5682S_I2S2_SDP, >> >> + RT5682S_I2S2_MS_MASK | >> RT5682S_I2S_BP_MASK | >> >> + RT5682S_I2S_DF_MASK, reg_val); >> >> + break; >> >> + default: >> >> + dev_err(component->dev, "Invalid dai->id: >> %d\n", dai->id); >> >> + return -EINVAL; >> >> + } >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_set_component_sysclk(struct snd_soc_component >> *component, >> >> + int clk_id, int source, unsigned int freq, >> int dir) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + unsigned int src = 0; >> >> + >> >> + if (freq == rt5682s->sysclk && clk_id == rt5682s->sysclk_src) >> >> + return 0; >> >> + >> >> + switch (clk_id) { >> >> + case RT5682S_SCLK_S_MCLK: >> >> + src = RT5682S_CLK_SRC_MCLK; >> >> + break; >> >> + case RT5682S_SCLK_S_PLL1: >> >> + src = RT5682S_CLK_SRC_PLL1; >> >> + break; >> >> + case RT5682S_SCLK_S_PLL2: >> >> + src = RT5682S_CLK_SRC_PLL2; >> >> + break; >> >> + case RT5682S_SCLK_S_RCCLK: >> >> + src = RT5682S_CLK_SRC_RCCLK; >> >> + break; >> >> + default: >> >> + dev_err(component->dev, "Invalid clock id >> (%d)\n", clk_id); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + snd_soc_component_update_bits(component, RT5682S_GLB_CLK, >> >> + RT5682S_SCLK_SRC_MASK, src << >> RT5682S_SCLK_SRC_SFT); >> >> + snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_1, >> >> + RT5682S_I2S_M_CLK_SRC_MASK, src << >> RT5682S_I2S_M_CLK_SRC_SFT); >> >> + snd_soc_component_update_bits(component, >> RT5682S_I2S2_M_CLK_CTRL_1, >> >> + RT5682S_I2S2_M_CLK_SRC_MASK, src << >> RT5682S_I2S2_M_CLK_SRC_SFT); >> >> + >> >> + rt5682s->sysclk = freq; >> >> + rt5682s->sysclk_src = clk_id; >> >> + >> >> + dev_dbg(component->dev, "Sysclk is %dHz and clock id is >> %d\n", >> >> + freq, clk_id); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static const struct pll_calc_map plla_table[] = { >> >> + {2048000, 24576000, 0, 46, 2, true, false, false, false}, >> >> + {256000, 24576000, 0, 382, 2, true, false, false, false}, >> >> + {512000, 24576000, 0, 190, 2, true, false, false, false}, >> >> + {4096000, 24576000, 0, 22, 2, true, false, false, false}, >> >> + {1024000, 24576000, 0, 94, 2, true, false, false, false}, >> >> + {11289600, 22579200, 1, 22, 2, false, false, false, false}, >> >> + {1411200, 22579200, 0, 62, 2, true, false, false, false}, >> >> + {2822400, 22579200, 0, 30, 2, true, false, false, false}, >> >> + {12288000, 24576000, 1, 22, 2, false, false, false, false}, >> >> + {1536000, 24576000, 0, 62, 2, true, false, false, false}, >> >> + {3072000, 24576000, 0, 30, 2, true, false, false, false}, >> >> + {24576000, 49152000, 4, 22, 0, false, false, false, false}, >> >> + {3072000, 49152000, 0, 30, 0, true, false, false, false}, >> >> + {6144000, 49152000, 0, 30, 0, false, false, false, false}, >> >> + {49152000, 98304000, 10, 22, 0, false, true, false, false}, >> >> + {6144000, 98304000, 0, 30, 0, false, true, false, false}, >> >> + {12288000, 98304000, 1, 22, 0, false, true, false, false}, >> >> + {48000000, 3840000, 10, 22, 23, false, false, false, false}, >> >> + {24000000, 3840000, 4, 22, 23, false, false, false, false}, >> >> + {19200000, 3840000, 3, 23, 23, false, false, false, false}, >> >> + {38400000, 3840000, 8, 23, 23, false, false, false, false}, >> >> +}; >> >> + >> >> +static const struct pll_calc_map pllb_table[] = { >> >> + {48000000, 24576000, 8, 6, 3, false, false, false, false}, >> >> + {48000000, 22579200, 23, 12, 3, false, false, false, true}, >> >> + {24000000, 24576000, 3, 6, 3, false, false, false, false}, >> >> + {24000000, 22579200, 23, 26, 3, false, false, false, true}, >> >> + {19200000, 24576000, 2, 6, 3, false, false, false, false}, >> >> + {19200000, 22579200, 3, 5, 3, false, false, false, true}, >> >> + {38400000, 24576000, 6, 6, 3, false, false, false, false}, >> >> + {38400000, 22579200, 8, 5, 3, false, false, false, true}, >> >> + {3840000, 49152000, 0, 6, 0, true, false, false, false}, >> >> +}; >> >> + >> >> +static int find_pll_inter_combination(unsigned int f_in, unsigned int >> f_out, >> >> + struct pll_calc_map *a, struct pll_calc_map >> *b) >> >> +{ >> >> + int i, j; >> >> + >> >> + /* Look at PLLA table */ >> >> + for (i = 0; i < ARRAY_SIZE(plla_table); i++) { >> >> + if (plla_table[i].freq_in == f_in && >> plla_table[i].freq_out == f_out) { >> >> + memcpy(a, plla_table + i, >> sizeof(*a)); >> >> + return USE_PLLA; >> >> + } >> >> + } >> >> + >> >> + /* Look at PLLB table */ >> >> + for (i = 0; i < ARRAY_SIZE(pllb_table); i++) { >> >> + if (pllb_table[i].freq_in == f_in && >> pllb_table[i].freq_out == f_out) { >> >> + memcpy(b, pllb_table + i, >> sizeof(*b)); >> >> + return USE_PLLB; >> >> + } >> >> + } >> >> + >> >> + /* Find a combination of PLLA & PLLB */ >> >> + for (i = ARRAY_SIZE(plla_table) - 1; i >= 0; i--) { >> >> + if (plla_table[i].freq_in == f_in && >> plla_table[i].freq_out == 3840000) { >> >> + for (j = ARRAY_SIZE(pllb_table) >> - 1; j >= 0; j--) { >> >> + if >> (pllb_table[j].freq_in == 3840000 && >> >> + >> pllb_table[j].freq_out == f_out) { >> >> + >> memcpy(a, plla_table + i, sizeof(*a)); >> >> + >> memcpy(b, pllb_table + j, sizeof(*b)); >> >> + >> return USE_PLLAB; >> >> + } >> >> + } >> >> + } >> >> + } >> >> + >> >> + return -EINVAL; >> >> +} >> >> + >> >> +static int rt5682s_set_component_pll(struct snd_soc_component *component, >> >> + int pll_id, int source, unsigned int freq_in, >> >> + unsigned int freq_out) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + struct pll_calc_map a_map, b_map; >> >> + >> >> + if (source == rt5682s->pll_src[pll_id] && freq_in == >> rt5682s->pll_in[pll_id] && >> >> + freq_out == rt5682s->pll_out[pll_id]) >> >> + return 0; >> >> + >> >> + if (!freq_in || !freq_out) { >> >> + dev_dbg(component->dev, "PLL disabled\n"); >> >> + rt5682s->pll_in[pll_id] = 0; >> >> + rt5682s->pll_out[pll_id] = 0; >> >> + snd_soc_component_update_bits(component, >> RT5682S_GLB_CLK, >> >> + RT5682S_SCLK_SRC_MASK, >> RT5682S_CLK_SRC_MCLK << RT5682S_SCLK_SRC_SFT); >> >> + return 0; >> >> + } >> >> + >> >> + switch (source) { >> >> + case RT5682S_PLL_S_MCLK: >> >> + snd_soc_component_update_bits(component, >> RT5682S_GLB_CLK, >> >> + RT5682S_PLL_SRC_MASK, >> RT5682S_PLL_SRC_MCLK); >> >> + break; >> >> + case RT5682S_PLL_S_BCLK1: >> >> + snd_soc_component_update_bits(component, >> RT5682S_GLB_CLK, >> >> + RT5682S_PLL_SRC_MASK, >> RT5682S_PLL_SRC_BCLK1); >> >> + break; >> >> + default: >> >> + dev_err(component->dev, "Unknown PLL Source >> %d\n", source); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + rt5682s->pll_comb = find_pll_inter_combination(freq_in, >> freq_out, >> >> + >> &a_map, &b_map); >> >> + >> >> + if ((pll_id == RT5682S_PLL1 && rt5682s->pll_comb == >> USE_PLLA) || >> >> + (pll_id == RT5682S_PLL2 && (rt5682s->pll_comb == >> USE_PLLB || >> >> + >> rt5682s->pll_comb == USE_PLLAB))) { >> >> + dev_dbg(component->dev, >> >> + "Supported freq conversion for >> PLL%d:(%d->%d): %d\n", >> >> + pll_id + 1, freq_in, freq_out, >> rt5682s->pll_comb); >> >> + } else { >> >> + dev_err(component->dev, >> >> + "Unsupported freq conversion >> for PLL%d:(%d->%d): %d\n", >> >> + pll_id + 1, freq_in, freq_out, >> rt5682s->pll_comb); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + if (rt5682s->pll_comb == USE_PLLA || rt5682s->pll_comb == >> USE_PLLAB) { >> >> + dev_dbg(component->dev, >> >> + "PLLA: fin=%d fout=%d m_bp=%d >> k_bp=%d m=%d n=%d k=%d\n", >> >> + a_map.freq_in, a_map.freq_out, >> a_map.m_bp, a_map.k_bp, >> >> + (a_map.m_bp ? 0 : a_map.m), >> a_map.n, (a_map.k_bp ? 0 : a_map.k)); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_CTRL_1, >> >> + RT5682S_PLLA_N_MASK, a_map.n); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_CTRL_2, >> >> + RT5682S_PLLA_M_MASK | >> RT5682S_PLLA_K_MASK, >> >> + a_map.m << RT5682S_PLLA_M_SFT | >> a_map.k); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_CTRL_6, >> >> + RT5682S_PLLA_M_BP_MASK | >> RT5682S_PLLA_K_BP_MASK, >> >> + a_map.m_bp << >> RT5682S_PLLA_M_BP_SFT | >> >> + a_map.k_bp << >> RT5682S_PLLA_K_BP_SFT); >> >> + } >> >> + >> >> + if (rt5682s->pll_comb == USE_PLLB || rt5682s->pll_comb == >> USE_PLLAB) { >> >> + dev_dbg(component->dev, >> >> + "PLLB: fin=%d fout=%d m_bp=%d >> k_bp=%d m=%d n=%d k=%d byp_ps=%d sel_ps=%d\n", >> >> + b_map.freq_in, b_map.freq_out, >> b_map.m_bp, b_map.k_bp, >> >> + (b_map.m_bp ? 0 : b_map.m), >> b_map.n, (b_map.k_bp ? 0 : b_map.k), >> >> + b_map.byp_ps, b_map.sel_ps); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_CTRL_3, >> >> + RT5682S_PLLB_N_MASK, b_map.n); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_CTRL_4, >> >> + RT5682S_PLLB_M_MASK | >> RT5682S_PLLB_K_MASK, >> >> + b_map.m << RT5682S_PLLB_M_SFT | >> b_map.k); >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_CTRL_6, >> >> + RT5682S_PLLB_SEL_PS_MASK | >> RT5682S_PLLB_BYP_PS_MASK | >> >> + RT5682S_PLLB_M_BP_MASK | >> RT5682S_PLLB_K_BP_MASK, >> >> + b_map.sel_ps << >> RT5682S_PLLB_SEL_PS_SFT | >> >> + b_map.byp_ps << >> RT5682S_PLLB_BYP_PS_SFT | >> >> + b_map.m_bp << >> RT5682S_PLLB_M_BP_SFT | >> >> + b_map.k_bp << >> RT5682S_PLLB_K_BP_SFT); >> >> + } >> >> + >> >> + if (rt5682s->pll_comb == USE_PLLB) >> >> + snd_soc_component_update_bits(component, >> RT5682S_PLL_CTRL_7, >> >> + RT5682S_PLLB_SRC_MASK, >> RT5682S_PLLB_SRC_DFIN); >> >> + >> >> + rt5682s->pll_in[pll_id] = freq_in; >> >> + rt5682s->pll_out[pll_id] = freq_out; >> >> + rt5682s->pll_src[pll_id] = source; >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_set_bclk1_ratio(struct snd_soc_dai *dai, >> >> + unsigned int ratio) >> >> +{ >> >> + struct snd_soc_component *component = dai->component; >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + rt5682s->bclk[dai->id] = ratio; >> >> + >> >> + switch (ratio) { >> >> + case 256: >> >> + snd_soc_component_update_bits(component, >> RT5682S_TDM_TCON_CTRL_1, >> >> + RT5682S_TDM_BCLK_MS1_MASK, >> RT5682S_TDM_BCLK_MS1_256); >> >> + break; >> >> + case 128: >> >> + snd_soc_component_update_bits(component, >> RT5682S_TDM_TCON_CTRL_1, >> >> + RT5682S_TDM_BCLK_MS1_MASK, >> RT5682S_TDM_BCLK_MS1_128); >> >> + break; >> >> + case 64: >> >> + snd_soc_component_update_bits(component, >> RT5682S_TDM_TCON_CTRL_1, >> >> + RT5682S_TDM_BCLK_MS1_MASK, >> RT5682S_TDM_BCLK_MS1_64); >> >> + break; >> >> + case 32: >> >> + snd_soc_component_update_bits(component, >> RT5682S_TDM_TCON_CTRL_1, >> >> + RT5682S_TDM_BCLK_MS1_MASK, >> RT5682S_TDM_BCLK_MS1_32); >> >> + break; >> >> + default: >> >> + dev_err(dai->dev, "Invalid bclk1 ratio %d\n", >> ratio); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_set_bclk2_ratio(struct snd_soc_dai *dai, unsigned int >> ratio) >> >> +{ >> >> + struct snd_soc_component *component = dai->component; >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + rt5682s->bclk[dai->id] = ratio; >> >> + >> >> + switch (ratio) { >> >> + case 64: >> >> + snd_soc_component_update_bits(component, >> RT5682S_ADDA_CLK_2, >> >> + RT5682S_I2S2_BCLK_MS2_MASK, >> RT5682S_I2S2_BCLK_MS2_64); >> >> + break; >> >> + case 32: >> >> + snd_soc_component_update_bits(component, >> RT5682S_ADDA_CLK_2, >> >> + RT5682S_I2S2_BCLK_MS2_MASK, >> RT5682S_I2S2_BCLK_MS2_32); >> >> + break; >> >> + default: >> >> + dev_err(dai->dev, "Invalid bclk2 ratio %d\n", >> ratio); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_set_bias_level(struct snd_soc_component *component, >> >> + enum snd_soc_bias_level level) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + switch (level) { >> >> + case SND_SOC_BIAS_PREPARE: >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_PWR_DIG_1, >> >> + RT5682S_PWR_LDO, >> RT5682S_PWR_LDO); >> >> + break; >> >> + case SND_SOC_BIAS_STANDBY: >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_PWR_DIG_1, >> >> + RT5682S_DIG_GATE_CTRL, >> RT5682S_DIG_GATE_CTRL); >> >> + break; >> >> + case SND_SOC_BIAS_OFF: >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_PWR_DIG_1, >> >> + RT5682S_DIG_GATE_CTRL | >> RT5682S_PWR_LDO, 0); >> >> + break; >> >> + case SND_SOC_BIAS_ON: >> >> + break; >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +#ifdef CONFIG_COMMON_CLK >> >> +#define CLK_PLL2_FIN 48000000 >> >> +#define CLK_48 48000 >> >> +#define CLK_44 44100 >> >> + >> >> +static bool rt5682s_clk_check(struct rt5682s_priv *rt5682s) >> >> +{ >> >> + if (!rt5682s->master[RT5682S_AIF1]) { >> >> + dev_dbg(rt5682s->component->dev, "dai clk fmt >> not set correctly\n"); >> >> + return false; >> >> + } >> >> + return true; >> >> +} >> >> + >> >> +static int rt5682s_wclk_prepare(struct clk_hw *hw) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(hw, struct rt5682s_priv, >> dai_clks_hw[RT5682S_DAI_WCLK_IDX]); >> >> + struct snd_soc_component *component = rt5682s->component; >> >> + struct snd_soc_dapm_context *dapm = >> snd_soc_component_get_dapm(component); >> >> + >> >> + if (!rt5682s_clk_check(rt5682s)) >> >> + return -EINVAL; >> >> + >> >> + snd_soc_dapm_mutex_lock(dapm); >> >> + >> >> + snd_soc_dapm_force_enable_pin_unlocked(dapm, "MICBIAS"); >> >> + snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_MB, RT5682S_PWR_MB); >> >> + >> >> + snd_soc_dapm_force_enable_pin_unlocked(dapm, "Vref2"); >> >> + snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_VREF2 | RT5682S_PWR_FV2, >> RT5682S_PWR_VREF2); >> >> + usleep_range(15000, 20000); >> >> + snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_FV2, RT5682S_PWR_FV2); >> >> + >> >> + snd_soc_dapm_force_enable_pin_unlocked(dapm, "I2S1"); >> >> + /* Only need to power PLLB due to the rate set restriction */ >> >> + snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLLB"); >> >> + snd_soc_dapm_sync_unlocked(dapm); >> >> + >> >> + snd_soc_dapm_mutex_unlock(dapm); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static void rt5682s_wclk_unprepare(struct clk_hw *hw) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(hw, struct rt5682s_priv, >> dai_clks_hw[RT5682S_DAI_WCLK_IDX]); >> >> + struct snd_soc_component *component = rt5682s->component; >> >> + struct snd_soc_dapm_context *dapm = >> snd_soc_component_get_dapm(component); >> >> + >> >> + if (!rt5682s_clk_check(rt5682s)) >> >> + return; >> >> + >> >> + snd_soc_dapm_mutex_lock(dapm); >> >> + >> >> + snd_soc_dapm_disable_pin_unlocked(dapm, "MICBIAS"); >> >> + snd_soc_dapm_disable_pin_unlocked(dapm, "Vref2"); >> >> + if (!rt5682s->jack_type) >> >> + snd_soc_component_update_bits(component, >> RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_VREF2 | >> RT5682S_PWR_FV2 | RT5682S_PWR_MB, 0); >> >> + >> >> + snd_soc_dapm_disable_pin_unlocked(dapm, "I2S1"); >> >> + snd_soc_dapm_disable_pin_unlocked(dapm, "PLLB"); >> >> + snd_soc_dapm_sync_unlocked(dapm); >> >> + >> >> + snd_soc_dapm_mutex_unlock(dapm); >> >> +} >> >> + >> >> +static unsigned long rt5682s_wclk_recalc_rate(struct clk_hw *hw, >> >> + >> unsigned long parent_rate) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(hw, struct rt5682s_priv, >> dai_clks_hw[RT5682S_DAI_WCLK_IDX]); >> >> + struct snd_soc_component *component = rt5682s->component; >> >> + const char * const clk_name = clk_hw_get_name(hw); >> >> + >> >> + if (!rt5682s_clk_check(rt5682s)) >> >> + return 0; >> >> + /* >> >> + * Only accept to set wclk rate to 44.1k or 48kHz. >> >> + */ >> >> + if (rt5682s->lrck[RT5682S_AIF1] != CLK_48 && >> >> + rt5682s->lrck[RT5682S_AIF1] != CLK_44) { >> >> + dev_warn(component->dev, "%s: clk %s only >> support %d or %d Hz output\n", >> >> + __func__, clk_name, CLK_44, >> CLK_48); >> >> + return 0; >> >> + } >> >> + >> >> + return rt5682s->lrck[RT5682S_AIF1]; >> >> +} >> >> + >> >> +static long rt5682s_wclk_round_rate(struct clk_hw *hw, unsigned long >> rate, >> >> + unsigned long >> *parent_rate) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(hw, struct rt5682s_priv, >> dai_clks_hw[RT5682S_DAI_WCLK_IDX]); >> >> + struct snd_soc_component *component = rt5682s->component; >> >> + const char * const clk_name = clk_hw_get_name(hw); >> >> + >> >> + if (!rt5682s_clk_check(rt5682s)) >> >> + return -EINVAL; >> >> + /* >> >> + * Only accept to set wclk rate to 44.1k or 48kHz. >> >> + * It will force to 48kHz if not both. >> >> + */ >> >> + if (rate != CLK_48 && rate != CLK_44) { >> >> + dev_warn(component->dev, "%s: clk %s only >> support %d or %d Hz output\n", >> >> + __func__, clk_name, CLK_44, >> CLK_48); >> >> + rate = CLK_48; >> >> + } >> >> + >> >> + return rate; >> >> +} >> >> + >> >> +static int rt5682s_wclk_set_rate(struct clk_hw *hw, unsigned long rate, >> >> + unsigned long >> parent_rate) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(hw, struct rt5682s_priv, >> dai_clks_hw[RT5682S_DAI_WCLK_IDX]); >> >> + struct snd_soc_component *component = rt5682s->component; >> >> + struct clk *parent_clk; >> >> + const char * const clk_name = clk_hw_get_name(hw); >> >> + unsigned int clk_pll2_fout; >> >> + >> >> + if (!rt5682s_clk_check(rt5682s)) >> >> + return -EINVAL; >> >> + >> >> + /* >> >> + * Whether the wclk's parent clk (mclk) exists or not, please >> ensure >> >> + * it is fixed or set to 48MHz before setting wclk rate. It's >> a >> >> + * temporary limitation. Only accept 48MHz clk as the clk >> provider. >> >> + * >> >> + * It will set the codec anyway by assuming mclk is 48MHz. >> >> + */ >> >> + parent_clk = clk_get_parent(hw->clk); >> >> + if (!parent_clk) >> >> + dev_warn(component->dev, >> >> + "Parent mclk of wclk not >> acquired in driver. Please ensure mclk was provided as %d Hz.\n", >> >> + CLK_PLL2_FIN); >> >> + >> >> + if (parent_rate != CLK_PLL2_FIN) >> >> + dev_warn(component->dev, "clk %s only support >> %d Hz input\n", >> >> + clk_name, CLK_PLL2_FIN); >> >> + >> >> + /* >> >> + * To achieve the rate conversion from 48MHz to 44.1k or >> 48kHz, >> >> + * PLL2 is needed. >> >> + */ >> >> + clk_pll2_fout = rate * 512; >> >> + rt5682s_set_component_pll(component, RT5682S_PLL2, >> RT5682S_PLL_S_MCLK, >> >> + CLK_PLL2_FIN, clk_pll2_fout); >> >> + >> >> + rt5682s_set_component_sysclk(component, RT5682S_SCLK_S_PLL2, >> 0, >> >> + clk_pll2_fout, SND_SOC_CLOCK_IN); >> >> + >> >> + rt5682s->lrck[RT5682S_AIF1] = rate; >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static unsigned long rt5682s_bclk_recalc_rate(struct clk_hw *hw, >> >> + >> unsigned long parent_rate) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(hw, struct rt5682s_priv, >> dai_clks_hw[RT5682S_DAI_BCLK_IDX]); >> >> + struct snd_soc_component *component = rt5682s->component; >> >> + unsigned int bclks_per_wclk; >> >> + >> >> + bclks_per_wclk = snd_soc_component_read(component, >> RT5682S_TDM_TCON_CTRL_1); >> >> + >> >> + switch (bclks_per_wclk & RT5682S_TDM_BCLK_MS1_MASK) { >> >> + case RT5682S_TDM_BCLK_MS1_256: >> >> + return parent_rate * 256; >> >> + case RT5682S_TDM_BCLK_MS1_128: >> >> + return parent_rate * 128; >> >> + case RT5682S_TDM_BCLK_MS1_64: >> >> + return parent_rate * 64; >> >> + case RT5682S_TDM_BCLK_MS1_32: >> >> + return parent_rate * 32; >> >> + default: >> >> + return 0; >> >> + } >> >> +} >> >> + >> >> +static unsigned long rt5682s_bclk_get_factor(unsigned long rate, >> >> + >> unsigned long parent_rate) >> >> +{ >> >> + unsigned long factor; >> >> + >> >> + factor = rate / parent_rate; >> >> + if (factor < 64) >> >> + return 32; >> >> + else if (factor < 128) >> >> + return 64; >> >> + else if (factor < 256) >> >> + return 128; >> >> + else >> >> + return 256; >> >> +} >> >> + >> >> +static long rt5682s_bclk_round_rate(struct clk_hw *hw, unsigned long >> rate, >> >> + unsigned long >> *parent_rate) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(hw, struct rt5682s_priv, >> dai_clks_hw[RT5682S_DAI_BCLK_IDX]); >> >> + unsigned long factor; >> >> + >> >> + if (!*parent_rate || !rt5682s_clk_check(rt5682s)) >> >> + return -EINVAL; >> >> + >> >> + /* >> >> + * BCLK rates are set as a multiplier of WCLK in HW. >> >> + * We don't allow changing the parent WCLK. We just do >> >> + * some rounding down based on the parent WCLK rate >> >> + * and find the appropriate multiplier of BCLK to >> >> + * get the rounded down BCLK value. >> >> + */ >> >> + factor = rt5682s_bclk_get_factor(rate, *parent_rate); >> >> + >> >> + return *parent_rate * factor; >> >> +} >> >> + >> >> +static int rt5682s_bclk_set_rate(struct clk_hw *hw, unsigned long rate, >> >> + unsigned long >> parent_rate) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> >> + container_of(hw, struct rt5682s_priv, >> dai_clks_hw[RT5682S_DAI_BCLK_IDX]); >> >> + struct snd_soc_component *component = rt5682s->component; >> >> + struct snd_soc_dai *dai; >> >> + unsigned long factor; >> >> + >> >> + if (!rt5682s_clk_check(rt5682s)) >> >> + return -EINVAL; >> >> + >> >> + factor = rt5682s_bclk_get_factor(rate, parent_rate); >> >> + >> >> + for_each_component_dais(component, dai) >> >> + if (dai->id == RT5682S_AIF1) >> >> + break; >> >> + if (!dai) { >> >> + dev_err(component->dev, "dai %d not found in >> component\n", >> >> + RT5682S_AIF1); >> >> + return -ENODEV; >> >> + } >> >> + >> >> + return rt5682s_set_bclk1_ratio(dai, factor); >> >> +} >> >> + >> >> +static const struct clk_ops rt5682s_dai_clk_ops[RT5682S_DAI_NUM_CLKS] = { >> >> + [RT5682S_DAI_WCLK_IDX] = { >> >> + .prepare = rt5682s_wclk_prepare, >> >> + .unprepare = rt5682s_wclk_unprepare, >> >> + .recalc_rate = rt5682s_wclk_recalc_rate, >> >> + .round_rate = rt5682s_wclk_round_rate, >> >> + .set_rate = rt5682s_wclk_set_rate, >> >> + }, >> >> + [RT5682S_DAI_BCLK_IDX] = { >> >> + .recalc_rate = rt5682s_bclk_recalc_rate, >> >> + .round_rate = rt5682s_bclk_round_rate, >> >> + .set_rate = rt5682s_bclk_set_rate, >> >> + }, >> >> +}; >> >> + >> >> +static int rt5682s_register_dai_clks(struct snd_soc_component *component) >> >> +{ >> >> + struct device *dev = component->dev; >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + struct rt5682s_platform_data *pdata = &rt5682s->pdata; >> >> + struct clk_hw *dai_clk_hw; >> >> + int i, ret; >> >> + >> >> + for (i = 0; i < RT5682S_DAI_NUM_CLKS; ++i) { >> >> + struct clk_init_data init = { }; >> >> + >> >> + dai_clk_hw = &rt5682s->dai_clks_hw[i]; >> >> + >> >> + switch (i) { >> >> + case RT5682S_DAI_WCLK_IDX: >> >> + /* Make MCLK the parent of WCLK >> */ >> >> + if (rt5682s->mclk) { >> >> + init.parent_data >> = &(struct clk_parent_data){ >> >> + >> .fw_name = "mclk", >> >> + }; >> >> + init.num_parents >> = 1; >> >> + } >> >> + break; >> >> + case RT5682S_DAI_BCLK_IDX: >> >> + /* Make WCLK the parent of BCLK >> */ >> >> + init.parent_hws = &(const >> struct clk_hw *){ >> >> + >> &rt5682s->dai_clks_hw[RT5682S_DAI_WCLK_IDX] >> >> + }; >> >> + init.num_parents = 1; >> >> + break; >> >> + default: >> >> + dev_err(dev, "Invalid clock >> index\n"); >> >> + return -EINVAL; >> >> + } >> >> + >> >> + init.name = pdata->dai_clk_names[i]; >> >> + init.ops = &rt5682s_dai_clk_ops[i]; >> >> + init.flags = CLK_GET_RATE_NOCACHE | >> CLK_SET_RATE_GATE; >> >> + dai_clk_hw->init = &init; >> >> + >> >> + ret = devm_clk_hw_register(dev, dai_clk_hw); >> >> + if (ret) { >> >> + dev_warn(dev, "Failed to >> register %s: %d\n", init.name, ret); >> >> + return ret; >> >> + } >> >> + >> >> + if (dev->of_node) { >> >> + >> devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, dai_clk_hw); >> >> + } else { >> >> + ret = >> devm_clk_hw_register_clkdev(dev, dai_clk_hw, >> >> + >> init.name, dev_name(dev)); >> >> + if (ret) >> >> + return ret; >> >> + } >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_dai_probe_clks(struct snd_soc_component *component) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + int ret; >> >> + >> >> + /* Check if MCLK provided */ >> >> + rt5682s->mclk = devm_clk_get(component->dev, "mclk"); >> >> + if (IS_ERR(rt5682s->mclk)) { >> >> + if (PTR_ERR(rt5682s->mclk) != -ENOENT) { >> >> + ret = PTR_ERR(rt5682s->mclk); >> >> + return ret; >> >> + } >> >> + rt5682s->mclk = NULL; >> >> + } >> >> + >> >> + /* Register CCF DAI clock control */ >> >> + ret = rt5682s_register_dai_clks(component); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + /* Initial setup for CCF */ >> >> + rt5682s->lrck[RT5682S_AIF1] = CLK_48; >> >> + >> >> + return 0; >> >> +} >> >> +#else >> >> +static inline int rt5682s_dai_probe_clks(struct snd_soc_component >> *component) >> >> +{ >> >> + return 0; >> >> +} >> >> +#endif /* CONFIG_COMMON_CLK */ >> >> + >> >> +static int rt5682s_probe(struct snd_soc_component *component) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + struct snd_soc_dapm_context *dapm = &component->dapm; >> >> + int ret; >> >> + >> >> + rt5682s->component = component; >> >> + >> >> + ret = rt5682s_dai_probe_clks(component); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + snd_soc_dapm_disable_pin(dapm, "MICBIAS"); >> >> + snd_soc_dapm_disable_pin(dapm, "Vref2"); >> >> + snd_soc_dapm_sync(dapm); >> >> + return 0; >> >> +} >> >> + >> >> +static void rt5682s_remove(struct snd_soc_component *component) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + rt5682s_reset(rt5682s); >> >> +} >> >> + >> >> +#ifdef CONFIG_PM >> >> +static int rt5682s_suspend(struct snd_soc_component *component) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + cancel_delayed_work_sync(&rt5682s->jack_detect_work); >> >> + cancel_delayed_work_sync(&rt5682s->jd_check_work); >> >> + >> >> + if (rt5682s->hs_jack && rt5682s->jack_type == >> SND_JACK_HEADSET) >> >> + snd_soc_component_update_bits(component, >> RT5682S_4BTN_IL_CMD_2, >> >> + RT5682S_4BTN_IL_MASK, >> RT5682S_4BTN_IL_DIS); >> >> + >> >> + regcache_cache_only(rt5682s->regmap, true); >> >> + regcache_mark_dirty(rt5682s->regmap); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static int rt5682s_resume(struct snd_soc_component *component) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = >> snd_soc_component_get_drvdata(component); >> >> + >> >> + regcache_cache_only(rt5682s->regmap, false); >> >> + regcache_sync(rt5682s->regmap); >> >> + >> >> + if (rt5682s->hs_jack) { >> >> + rt5682s->jack_type = 0; >> >> + mod_delayed_work(system_power_efficient_wq, >> >> + &rt5682s->jack_detect_work, >> msecs_to_jiffies(250)); >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> +#else >> >> +#define rt5682s_suspend NULL >> >> +#define rt5682s_resume NULL >> >> +#endif >> >> + >> >> +const struct snd_soc_dai_ops rt5682s_aif1_dai_ops = { >> >> + .hw_params = rt5682s_hw_params, >> >> + .set_fmt = rt5682s_set_dai_fmt, >> >> + .set_tdm_slot = rt5682s_set_tdm_slot, >> >> + .set_bclk_ratio = rt5682s_set_bclk1_ratio, >> >> +}; >> >> + >> >> +const struct snd_soc_dai_ops rt5682s_aif2_dai_ops = { >> >> + .hw_params = rt5682s_hw_params, >> >> + .set_fmt = rt5682s_set_dai_fmt, >> >> + .set_bclk_ratio = rt5682s_set_bclk2_ratio, >> >> +}; >> >> + >> >> +const struct snd_soc_component_driver rt5682s_soc_component_dev = { >> >> + .probe = rt5682s_probe, >> >> + .remove = rt5682s_remove, >> >> + .suspend = rt5682s_suspend, >> >> + .resume = rt5682s_resume, >> >> + .set_bias_level = rt5682s_set_bias_level, >> >> + .controls = rt5682s_snd_controls, >> >> + .num_controls = ARRAY_SIZE(rt5682s_snd_controls), >> >> + .dapm_widgets = rt5682s_dapm_widgets, >> >> + .num_dapm_widgets = ARRAY_SIZE(rt5682s_dapm_widgets), >> >> + .dapm_routes = rt5682s_dapm_routes, >> >> + .num_dapm_routes = ARRAY_SIZE(rt5682s_dapm_routes), >> >> + .set_sysclk = rt5682s_set_component_sysclk, >> >> + .set_pll = rt5682s_set_component_pll, >> >> + .set_jack = rt5682s_set_jack_detect, >> >> + .use_pmdown_time = 1, >> >> + .endianness = 1, >> >> + .non_legacy_dai_naming = 1, >> >> +}; >> >> + >> >> +static int rt5682s_parse_dt(struct rt5682s_priv *rt5682s, struct device >> *dev) >> >> +{ >> >> + device_property_read_u32(dev, "realtek,dmic1-data-pin", >> >> + &rt5682s->pdata.dmic1_data_pin); >> >> + device_property_read_u32(dev, "realtek,dmic1-clk-pin", >> >> + &rt5682s->pdata.dmic1_clk_pin); >> >> + device_property_read_u32(dev, "realtek,jd-src", >> >> + &rt5682s->pdata.jd_src); >> >> + device_property_read_u32(dev, "realtek,dmic-clk-rate-hz", >> >> + &rt5682s->pdata.dmic_clk_rate); >> >> + device_property_read_u32(dev, "realtek,dmic-delay-ms", >> >> + &rt5682s->pdata.dmic_delay); >> >> + >> >> + rt5682s->pdata.ldo1_en = of_get_named_gpio(dev->of_node, >> >> + "realtek,ldo1-en-gpios", 0); >> >> + >> >> + if (device_property_read_string_array(dev, >> "clock-output-names", >> >> + >> rt5682s->pdata.dai_clk_names, >> >> + >> RT5682S_DAI_NUM_CLKS) < 0) >> >> + dev_warn(dev, "Using default DAI clk names: >> %s, %s\n", >> >> + >> rt5682s->pdata.dai_clk_names[RT5682S_DAI_WCLK_IDX], >> >> + >> rt5682s->pdata.dai_clk_names[RT5682S_DAI_BCLK_IDX]); >> >> + >> >> + rt5682s->pdata.dmic_clk_driving_high = >> device_property_read_bool(dev, >> >> + "realtek,dmic-clk-driving-high"); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static void rt5682s_calibrate(struct rt5682s_priv *rt5682s) >> >> +{ >> >> + unsigned int count, value; >> >> + >> >> + mutex_lock(&rt5682s->calibrate_mutex); >> >> + >> >> + regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0xaa80); >> >> + usleep_range(15000, 20000); >> >> + regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0xfa80); >> >> + regmap_write(rt5682s->regmap, RT5682S_PWR_DIG_1, 0x01c0); >> >> + regmap_write(rt5682s->regmap, RT5682S_MICBIAS_2, 0x0380); >> >> + regmap_write(rt5682s->regmap, RT5682S_GLB_CLK, 0x8000); >> >> + regmap_write(rt5682s->regmap, RT5682S_ADDA_CLK_1, 0x1001); >> >> + regmap_write(rt5682s->regmap, RT5682S_CHOP_DAC_2, 0x3030); >> >> + regmap_write(rt5682s->regmap, RT5682S_CHOP_ADC, 0xb000); >> >> + regmap_write(rt5682s->regmap, RT5682S_STO1_ADC_MIXER, >> 0x686c); >> >> + regmap_write(rt5682s->regmap, RT5682S_CAL_REC, 0x5151); >> >> + regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_2, >> 0x0321); >> >> + regmap_write(rt5682s->regmap, RT5682S_HP_LOGIC_CTRL_2, >> 0x0004); >> >> + regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_1, >> 0x7c00); >> >> + regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_1, >> 0xfc00); >> >> + >> >> + for (count = 0; count < 60; count++) { >> >> + regmap_read(rt5682s->regmap, >> RT5682S_HP_CALIB_ST_1, &value); >> >> + if (!(value & 0x8000)) >> >> + break; >> >> + >> >> + usleep_range(10000, 10005); >> >> + } >> >> + >> >> + if (count >= 60) >> >> + dev_err(rt5682s->component->dev, "HP >> Calibration Failure\n"); >> >> + >> >> + /* restore settings */ >> >> + regmap_write(rt5682s->regmap, RT5682S_MICBIAS_2, 0x0180); >> >> + regmap_write(rt5682s->regmap, RT5682S_CAL_REC, 0x5858); >> >> + regmap_write(rt5682s->regmap, RT5682S_STO1_ADC_MIXER, >> 0xc0c4); >> >> + regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_2, >> 0x0320); >> >> + regmap_write(rt5682s->regmap, RT5682S_PWR_DIG_1, 0x00c0); >> >> + regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0x0800); >> >> + regmap_write(rt5682s->regmap, RT5682S_GLB_CLK, 0x0000); >> >> + >> >> + mutex_unlock(&rt5682s->calibrate_mutex); >> >> +} >> >> + >> >> +static const struct regmap_config rt5682s_regmap = { >> >> + .reg_bits = 16, >> >> + .val_bits = 16, >> >> + .max_register = RT5682S_MAX_REG, >> >> + .volatile_reg = rt5682s_volatile_register, >> >> + .readable_reg = rt5682s_readable_register, >> >> + .cache_type = REGCACHE_RBTREE, >> >> + .reg_defaults = rt5682s_reg, >> >> + .num_reg_defaults = ARRAY_SIZE(rt5682s_reg), >> >> + .use_single_read = true, >> >> + .use_single_write = true, >> >> +}; >> >> + >> >> +static struct snd_soc_dai_driver rt5682s_dai[] = { >> >> + { >> >> + .name = "rt5682s-aif1", >> >> + .id = RT5682S_AIF1, >> >> + .playback = { >> >> + .stream_name = "AIF1 Playback", >> >> + .channels_min = 1, >> >> + .channels_max = 2, >> >> + .rates = RT5682S_STEREO_RATES, >> >> + .formats = RT5682S_FORMATS, >> >> + }, >> >> + .capture = { >> >> + .stream_name = "AIF1 Capture", >> >> + .channels_min = 1, >> >> + .channels_max = 2, >> >> + .rates = RT5682S_STEREO_RATES, >> >> + .formats = RT5682S_FORMATS, >> >> + }, >> >> + .ops = &rt5682s_aif1_dai_ops, >> >> + }, >> >> + { >> >> + .name = "rt5682s-aif2", >> >> + .id = RT5682S_AIF2, >> >> + .capture = { >> >> + .stream_name = "AIF2 Capture", >> >> + .channels_min = 1, >> >> + .channels_max = 2, >> >> + .rates = RT5682S_STEREO_RATES, >> >> + .formats = RT5682S_FORMATS, >> >> + }, >> >> + .ops = &rt5682s_aif2_dai_ops, >> >> + }, >> >> +}; >> >> + >> >> +static void rt5682s_i2c_disable_regulators(void *data) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = data; >> >> + >> >> + regulator_bulk_disable(ARRAY_SIZE(rt5682s->supplies), >> rt5682s->supplies); >> >> +} >> >> + >> >> +static int rt5682s_i2c_probe(struct i2c_client *i2c, >> >> + const struct i2c_device_id *id) >> >> +{ >> >> + struct rt5682s_platform_data *pdata = >> dev_get_platdata(&i2c->dev); >> >> + struct rt5682s_priv *rt5682s; >> >> + int i, ret; >> >> + unsigned int val; >> >> + >> >> + rt5682s = devm_kzalloc(&i2c->dev, sizeof(struct >> rt5682s_priv), GFP_KERNEL); >> >> + if (!rt5682s) >> >> + return -ENOMEM; >> >> + >> >> + i2c_set_clientdata(i2c, rt5682s); >> >> + >> >> + rt5682s->pdata = i2s_default_platform_data; >> >> + >> >> + if (pdata) >> >> + rt5682s->pdata = *pdata; >> >> + else >> >> + rt5682s_parse_dt(rt5682s, &i2c->dev); >> >> + >> >> + rt5682s->regmap = devm_regmap_init_i2c(i2c, &rt5682s_regmap); >> >> + if (IS_ERR(rt5682s->regmap)) { >> >> + ret = PTR_ERR(rt5682s->regmap); >> >> + dev_err(&i2c->dev, "Failed to allocate >> register map: %d\n", ret); >> >> + return ret; >> >> + } >> >> + >> >> + for (i = 0; i < ARRAY_SIZE(rt5682s->supplies); i++) >> >> + rt5682s->supplies[i].supply = >> rt5682s_supply_names[i]; >> >> + >> >> + ret = devm_regulator_bulk_get(&i2c->dev, >> >> + ARRAY_SIZE(rt5682s->supplies), >> rt5682s->supplies); >> >> + if (ret) { >> >> + dev_err(&i2c->dev, "Failed to request >> supplies: %d\n", ret); >> >> + return ret; >> >> + } >> >> + >> >> + ret = devm_add_action_or_reset(&i2c->dev, >> rt5682s_i2c_disable_regulators, rt5682s); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + ret = regulator_bulk_enable(ARRAY_SIZE(rt5682s->supplies), >> rt5682s->supplies); >> >> + if (ret) { >> >> + dev_err(&i2c->dev, "Failed to enable >> supplies: %d\n", ret); >> >> + return ret; >> >> + } >> >> + >> >> + if (gpio_is_valid(rt5682s->pdata.ldo1_en)) { >> >> + if (devm_gpio_request_one(&i2c->dev, >> rt5682s->pdata.ldo1_en, >> >> + >> GPIOF_OUT_INIT_HIGH, "rt5682s")) >> >> + dev_err(&i2c->dev, "Fail >> gpio_request gpio_ldo\n"); >> >> + } >> >> + >> >> + /* Sleep for 50 ms minimum */ >> >> + usleep_range(50000, 55000); >> >> + >> >> + regmap_read(rt5682s->regmap, RT5682S_DEVICE_ID, &val); >> >> + if (val != DEVICE_ID) { >> >> + dev_err(&i2c->dev, "Device with ID register >> %x is not rt5682s\n", val); >> >> + return -ENODEV; >> >> + } >> >> + >> >> + rt5682s_reset(rt5682s); >> >> + rt5682s_apply_patch_list(rt5682s, &i2c->dev); >> >> + >> >> + regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_2, >> >> + RT5682S_DLDO_I_LIMIT_MASK, >> RT5682S_DLDO_I_LIMIT_DIS); >> >> + usleep_range(20000, 25000); >> >> + >> >> + mutex_init(&rt5682s->calibrate_mutex); >> >> + mutex_init(&rt5682s->sar_mutex); >> >> + rt5682s_calibrate(rt5682s); >> >> + >> >> + regmap_update_bits(rt5682s->regmap, RT5682S_MICBIAS_2, >> >> + RT5682S_PWR_CLK25M_MASK | >> RT5682S_PWR_CLK1M_MASK, >> >> + RT5682S_PWR_CLK25M_PD | RT5682S_PWR_CLK1M_PU); >> >> + regmap_update_bits(rt5682s->regmap, RT5682S_PWR_ANLG_1, >> >> + RT5682S_PWR_BG, RT5682S_PWR_BG); >> >> + regmap_update_bits(rt5682s->regmap, RT5682S_HP_LOGIC_CTRL_2, >> >> + RT5682S_HP_SIG_SRC_MASK, >> RT5682S_HP_SIG_SRC_1BIT_CTL); >> >> + regmap_update_bits(rt5682s->regmap, RT5682S_HP_CHARGE_PUMP_2, >> >> + RT5682S_PM_HP_MASK, RT5682S_PM_HP_HV); >> >> + >> >> + /* DMIC data pin */ >> >> + switch (rt5682s->pdata.dmic1_data_pin) { >> >> + case RT5682S_DMIC1_DATA_NULL: >> >> + break; >> >> + case RT5682S_DMIC1_DATA_GPIO2: /* share with LRCK2 */ >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_DMIC_CTRL_1, >> >> + RT5682S_DMIC_1_DP_MASK, >> RT5682S_DMIC_1_DP_GPIO2); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_GPIO_CTRL_1, >> >> + RT5682S_GP2_PIN_MASK, >> RT5682S_GP2_PIN_DMIC_SDA); >> >> + break; >> >> + case RT5682S_DMIC1_DATA_GPIO5: /* share with DACDAT1 */ >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_DMIC_CTRL_1, >> >> + RT5682S_DMIC_1_DP_MASK, >> RT5682S_DMIC_1_DP_GPIO5); >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_GPIO_CTRL_1, >> >> + RT5682S_GP5_PIN_MASK, >> RT5682S_GP5_PIN_DMIC_SDA); >> >> + break; >> >> + default: >> >> + dev_warn(&i2c->dev, "invalid DMIC_DAT pin\n"); >> >> + break; >> >> + } >> >> + >> >> + /* DMIC clk pin */ >> >> + switch (rt5682s->pdata.dmic1_clk_pin) { >> >> + case RT5682S_DMIC1_CLK_NULL: >> >> + break; >> >> + case RT5682S_DMIC1_CLK_GPIO1: /* share with IRQ */ >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_GPIO_CTRL_1, >> >> + RT5682S_GP1_PIN_MASK, >> RT5682S_GP1_PIN_DMIC_CLK); >> >> + break; >> >> + case RT5682S_DMIC1_CLK_GPIO3: /* share with BCLK2 */ >> >> + regmap_update_bits(rt5682s->regmap, >> RT5682S_GPIO_CTRL_1, >> >> + RT5682S_GP3_PIN_MASK, >> RT5682S_GP3_PIN_DMIC_CLK); >> >> + if (rt5682s->pdata.dmic_clk_driving_high) >> >> + >> regmap_update_bits(rt5682s->regmap, RT5682S_PAD_DRIVING_CTRL, >> >> + >> RT5682S_PAD_DRV_GP3_MASK, RT5682S_PAD_DRV_GP3_HIGH); >> >> + break; >> >> + default: >> >> + dev_warn(&i2c->dev, "invalid DMIC_CLK pin\n"); >> >> + break; >> >> + } >> >> + >> >> + INIT_DELAYED_WORK(&rt5682s->jack_detect_work, >> rt5682s_jack_detect_handler); >> >> + INIT_DELAYED_WORK(&rt5682s->jd_check_work, >> rt5682s_jd_check_handler); >> >> + >> >> + if (i2c->irq) { >> >> + ret = devm_request_threaded_irq(&i2c->dev, >> i2c->irq, NULL, rt5682s_irq, >> >> + IRQF_TRIGGER_RISING | >> IRQF_TRIGGER_FALLING | IRQF_ONESHOT, >> >> + "rt5682s", rt5682s); >> >> + if (ret) >> >> + dev_err(&i2c->dev, "Failed to >> reguest IRQ: %d\n", ret); >> >> + } >> >> + >> >> + return devm_snd_soc_register_component(&i2c->dev, >> &rt5682s_soc_component_dev, >> >> + rt5682s_dai, >> ARRAY_SIZE(rt5682s_dai)); >> >> +} >> >> + >> >> +static void rt5682s_i2c_shutdown(struct i2c_client *client) >> >> +{ >> >> + struct rt5682s_priv *rt5682s = i2c_get_clientdata(client); >> >> + >> >> + disable_irq(client->irq); >> >> + cancel_delayed_work_sync(&rt5682s->jack_detect_work); >> >> + cancel_delayed_work_sync(&rt5682s->jd_check_work); >> >> + >> >> + rt5682s_reset(rt5682s); >> >> +} >> >> + >> >> +static int rt5682s_i2c_remove(struct i2c_client *client) >> >> +{ >> >> + rt5682s_i2c_shutdown(client); >> >> + >> >> + return 0; >> >> +} >> >> + >> >> +static const struct of_device_id rt5682s_of_match[] = { >> >> + {.compatible = "realtek,rt5682s"}, >> >> + {}, >> >> +}; >> >> +MODULE_DEVICE_TABLE(of, rt5682s_of_match); >> >> + >> >> +static const struct acpi_device_id rt5682s_acpi_match[] = { >> >> + {"RTL5682", 0,}, >> >> + {}, >> >> +}; >> >> +MODULE_DEVICE_TABLE(acpi, rt5682s_acpi_match); >> >> + >> >> +static const struct i2c_device_id rt5682s_i2c_id[] = { >> >> + {"rt5682s", 0}, >> >> + {} >> >> +}; >> >> +MODULE_DEVICE_TABLE(i2c, rt5682s_i2c_id); >> >> + >> >> +static struct i2c_driver rt5682s_i2c_driver = { >> >> + .driver = { >> >> + .name = "rt5682s", >> >> + .of_match_table = rt5682s_of_match, >> >> + .acpi_match_table = rt5682s_acpi_match, >> >> + .probe_type = PROBE_PREFER_ASYNCHRONOUS, >> >> + }, >> >> + .probe = rt5682s_i2c_probe, >> >> + .remove = rt5682s_i2c_remove, >> >> + .shutdown = rt5682s_i2c_shutdown, >> >> + .id_table = rt5682s_i2c_id, >> >> +}; >> >> +module_i2c_driver(rt5682s_i2c_driver); >> >> + >> >> +MODULE_DESCRIPTION("ASoC RT5682I-VS driver"); >> >> +MODULE_AUTHOR("Derek Fang <derek.fang@xxxxxxxxxxx>"); >> >> +MODULE_LICENSE("GPL v2"); >> >> diff --git a/sound/soc/codecs/rt5682s.h b/sound/soc/codecs/rt5682s.h >> >> new file mode 100644 >> >> index 000000000000..7c755e5efb81 >> >> --- /dev/null >> >> +++ b/sound/soc/codecs/rt5682s.h >> >> @@ -0,0 +1,1455 @@ >> >> +/* SPDX-License-Identifier: GPL-2.0-only */ >> >> +/* >> >> + * rt5682s.h -- RT5682I-VS ALSA SoC audio driver >> >> + * >> >> + * Copyright 2021 Realtek Microelectronics >> >> + * Author: Derek Fang <derek.fang@xxxxxxxxxxx> >> >> + */ >> >> + >> >> +#ifndef __RT5682S_H__ >> >> +#define __RT5682S_H__ >> >> + >> >> +#include <sound/rt5682s.h> >> >> +#include <linux/regulator/consumer.h> >> >> +#include <linux/clk.h> >> >> +#include <linux/clkdev.h> >> >> +#include <linux/clk-provider.h> >> >> + >> >> + >> >> +/* Info */ >> >> +#define >> RT5682S_RESET 0x0000 >> >> +#define RT5682S_VERSION_ID 0x00fd >> >> +#define RT5682S_VENDOR_ID 0x00fe >> >> +#define RT5682S_DEVICE_ID 0x00ff >> >> +/* I/O - Output */ >> >> +#define RT5682S_HP_CTRL_1 0x0002 >> >> +#define RT5682S_HP_CTRL_2 0x0003 >> >> +#define RT5682S_HPL_GAIN 0x0005 >> >> +#define RT5682S_HPR_GAIN 0x0006 >> >> + >> >> +#define RT5682S_I2C_CTRL 0x0008 >> >> + >> >> +/* I/O - Input */ >> >> +#define RT5682S_CBJ_BST_CTRL >> 0x000b >> >> +#define RT5682S_CBJ_DET_CTRL >> 0x000f >> >> +#define RT5682S_CBJ_CTRL_1 0x0010 >> >> +#define RT5682S_CBJ_CTRL_2 0x0011 >> >> +#define RT5682S_CBJ_CTRL_3 0x0012 >> >> +#define RT5682S_CBJ_CTRL_4 0x0013 >> >> +#define RT5682S_CBJ_CTRL_5 0x0014 >> >> +#define RT5682S_CBJ_CTRL_6 0x0015 >> >> +#define RT5682S_CBJ_CTRL_7 0x0016 >> >> +#define RT5682S_CBJ_CTRL_8 0x0017 >> >> +/* I/O - ADC/DAC/DMIC */ >> >> +#define RT5682S_DAC1_DIG_VOL 0x0019 >> >> +#define RT5682S_STO1_ADC_DIG_VOL 0x001c >> >> +#define RT5682S_STO1_ADC_BOOST 0x001f >> >> +#define RT5682S_HP_IMP_GAIN_1 0x0022 >> >> +#define RT5682S_HP_IMP_GAIN_2 0x0023 >> >> +/* Mixer - D-D */ >> >> +#define RT5682S_SIDETONE_CTRL 0x0024 >> >> +#define RT5682S_STO1_ADC_MIXER 0x0026 >> >> +#define RT5682S_AD_DA_MIXER 0x0029 >> >> +#define RT5682S_STO1_DAC_MIXER 0x002a >> >> +#define RT5682S_A_DAC1_MUX 0x002b >> >> +#define RT5682S_DIG_INF2_DATA 0x0030 >> >> +/* Mixer - ADC */ >> >> +#define RT5682S_REC_MIXER 0x003c >> >> +#define RT5682S_CAL_REC >> 0x0044 >> >> +/* HP Analog Offset Control */ >> >> +#define RT5682S_HP_ANA_OST_CTRL_1 0x004b >> >> +#define RT5682S_HP_ANA_OST_CTRL_2 0x004c >> >> +#define RT5682S_HP_ANA_OST_CTRL_3 0x004d >> >> +/* Power */ >> >> +#define RT5682S_PWR_DIG_1 0x0061 >> >> +#define RT5682S_PWR_DIG_2 0x0062 >> >> +#define RT5682S_PWR_ANLG_1 0x0063 >> >> +#define RT5682S_PWR_ANLG_2 0x0064 >> >> +#define RT5682S_PWR_ANLG_3 0x0065 >> >> +#define RT5682S_PWR_MIXER 0x0066 >> >> + >> >> +#define RT5682S_MB_CTRL >> 0x0067 >> >> +#define RT5682S_CLK_GATE_TCON_1 0x0068 >> >> +#define RT5682S_CLK_GATE_TCON_2 0x0069 >> >> +#define RT5682S_CLK_GATE_TCON_3 0x006a >> >> +/* Clock Detect */ >> >> +#define >> RT5682S_CLK_DET 0x006b >> >> +/* Filter Auto Reset */ >> >> +#define RT5682S_RESET_LPF_CTRL 0x006c >> >> +#define RT5682S_RESET_HPF_CTRL 0x006d >> >> +/* DMIC */ >> >> +#define RT5682S_DMIC_CTRL_1 >> 0x006e >> >> +#define RT5682S_LPF_AD_DMIC 0x006f >> >> +/* Format - ADC/DAC */ >> >> +#define RT5682S_I2S1_SDP 0x0070 >> >> +#define RT5682S_I2S2_SDP 0x0071 >> >> +#define RT5682S_ADDA_CLK_1 >> 0x0073 >> >> +#define RT5682S_ADDA_CLK_2 >> 0x0074 >> >> +#define RT5682S_I2S1_F_DIV_CTRL_1 0x0075 >> >> +#define RT5682S_I2S1_F_DIV_CTRL_2 0x0076 >> >> +/* Format - TDM Control */ >> >> +#define RT5682S_TDM_CTRL 0x0079 >> >> +#define RT5682S_TDM_ADDA_CTRL_1 0x007a >> >> +#define RT5682S_TDM_ADDA_CTRL_2 0x007b >> >> +#define RT5682S_DATA_SEL_CTRL_1 0x007c >> >> +#define RT5682S_TDM_TCON_CTRL_1 0x007e >> >> +#define RT5682S_TDM_TCON_CTRL_2 0x007f >> >> +/* Function - Analog */ >> >> +#define >> RT5682S_GLB_CLK 0x0080 >> >> +#define RT5682S_PLL_TRACK_1 >> 0x0083 >> >> +#define RT5682S_PLL_TRACK_2 >> 0x0084 >> >> +#define RT5682S_PLL_TRACK_3 >> 0x0085 >> >> +#define RT5682S_PLL_TRACK_4 >> 0x0086 >> >> +#define RT5682S_PLL_TRACK_5 >> 0x0087 >> >> +#define RT5682S_PLL_TRACK_6 >> 0x0088 >> >> +#define RT5682S_PLL_TRACK_11 >> 0x008c >> >> +#define RT5682S_DEPOP_1 >> 0x008e >> >> +#define RT5682S_HP_CHARGE_PUMP_1 0x008f >> >> +#define RT5682S_HP_CHARGE_PUMP_2 0x0091 >> >> +#define RT5682S_HP_CHARGE_PUMP_3 0x0092 >> >> +#define RT5682S_MICBIAS_1 0x0093 >> >> +#define RT5682S_MICBIAS_2 0x0094 >> >> +#define RT5682S_MICBIAS_3 0x0095 >> >> + >> >> +#define RT5682S_PLL_TRACK_12 >> 0x0096 >> >> +#define RT5682S_PLL_TRACK_14 >> 0x0097 >> >> +#define RT5682S_PLL_CTRL_1 0x0098 >> >> +#define RT5682S_PLL_CTRL_2 0x0099 >> >> +#define RT5682S_PLL_CTRL_3 0x009a >> >> +#define RT5682S_PLL_CTRL_4 0x009b >> >> +#define RT5682S_PLL_CTRL_5 0x009c >> >> +#define RT5682S_PLL_CTRL_6 0x009d >> >> +#define RT5682S_PLL_CTRL_7 0x009e >> >> + >> >> +#define RT5682S_RC_CLK_CTRL >> 0x009f >> >> +#define RT5682S_I2S2_M_CLK_CTRL_1 0x00a0 >> >> +#define RT5682S_I2S2_F_DIV_CTRL_1 0x00a3 >> >> +#define RT5682S_I2S2_F_DIV_CTRL_2 0x00a4 >> >> + >> >> +#define RT5682S_IRQ_CTRL_1 0x00b6 >> >> +#define RT5682S_IRQ_CTRL_2 0x00b7 >> >> +#define RT5682S_IRQ_CTRL_3 0x00b8 >> >> +#define RT5682S_IRQ_CTRL_4 0x00b9 >> >> +#define RT5682S_INT_ST_1 0x00be >> >> +#define RT5682S_GPIO_CTRL_1 >> 0x00c0 >> >> +#define RT5682S_GPIO_CTRL_2 >> 0x00c1 >> >> +#define >> RT5682S_GPIO_ST 0x00c2 >> >> +#define RT5682S_HP_AMP_DET_CTRL_1 0x00d0 >> >> +#define RT5682S_MID_HP_AMP_DET 0x00d2 >> >> +#define RT5682S_LOW_HP_AMP_DET 0x00d3 >> >> +#define RT5682S_DELAY_BUF_CTRL 0x00d4 >> >> +#define RT5682S_SV_ZCD_1 0x00d9 >> >> +#define RT5682S_SV_ZCD_2 0x00da >> >> +#define RT5682S_IL_CMD_1 0x00db >> >> +#define RT5682S_IL_CMD_2 0x00dc >> >> +#define RT5682S_IL_CMD_3 0x00dd >> >> +#define RT5682S_IL_CMD_4 0x00de >> >> +#define RT5682S_IL_CMD_5 0x00df >> >> +#define RT5682S_IL_CMD_6 0x00e0 >> >> +#define RT5682S_4BTN_IL_CMD_1 0x00e2 >> >> +#define RT5682S_4BTN_IL_CMD_2 0x00e3 >> >> +#define RT5682S_4BTN_IL_CMD_3 0x00e4 >> >> +#define RT5682S_4BTN_IL_CMD_4 0x00e5 >> >> +#define RT5682S_4BTN_IL_CMD_5 0x00e6 >> >> +#define RT5682S_4BTN_IL_CMD_6 0x00e7 >> >> +#define RT5682S_4BTN_IL_CMD_7 0x00e8 >> >> + >> >> +#define RT5682S_ADC_STO1_HP_CTRL_1 0x00ea >> >> +#define RT5682S_ADC_STO1_HP_CTRL_2 0x00eb >> >> +#define RT5682S_AJD1_CTRL 0x00f0 >> >> +#define RT5682S_JD_CTRL_1 0x00f6 >> >> +/* General Control */ >> >> +#define RT5682S_DUMMY_1 >> 0x00fa >> >> +#define RT5682S_DUMMY_2 >> 0x00fb >> >> +#define RT5682S_DUMMY_3 >> 0x00fc >> >> + >> >> +#define RT5682S_DAC_ADC_DIG_VOL1 0x0100 >> >> +#define RT5682S_BIAS_CUR_CTRL_2 0x010b >> >> +#define RT5682S_BIAS_CUR_CTRL_3 0x010c >> >> +#define RT5682S_BIAS_CUR_CTRL_4 0x010d >> >> +#define RT5682S_BIAS_CUR_CTRL_5 0x010e >> >> +#define RT5682S_BIAS_CUR_CTRL_6 0x010f >> >> +#define RT5682S_BIAS_CUR_CTRL_7 0x0110 >> >> +#define RT5682S_BIAS_CUR_CTRL_8 0x0111 >> >> +#define RT5682S_BIAS_CUR_CTRL_9 0x0112 >> >> +#define RT5682S_BIAS_CUR_CTRL_10 0x0113 >> >> +#define RT5682S_VREF_REC_OP_FB_CAP_CTRL_1 0x0117 >> >> +#define RT5682S_VREF_REC_OP_FB_CAP_CTRL_2 0x0118 >> >> +#define RT5682S_CHARGE_PUMP_1 0x0125 >> >> +#define RT5682S_DIG_IN_CTRL_1 0x0132 >> >> +#define RT5682S_PAD_DRIVING_CTRL 0x0136 >> >> +#define RT5682S_CHOP_DAC_1 >> 0x0139 >> >> +#define RT5682S_CHOP_DAC_2 >> 0x013a >> >> +#define RT5682S_CHOP_ADC 0x013b >> >> +#define RT5682S_CALIB_ADC_CTRL 0x013c >> >> +#define RT5682S_VOL_TEST 0x013f >> >> +#define RT5682S_SPKVDD_DET_ST 0x0142 >> >> +#define RT5682S_TEST_MODE_CTRL_1 0x0145 >> >> +#define RT5682S_TEST_MODE_CTRL_2 0x0146 >> >> +#define RT5682S_TEST_MODE_CTRL_3 0x0147 >> >> +#define RT5682S_TEST_MODE_CTRL_4 0x0148 >> >> +#define RT5682S_PLL_INTERNAL_1 0x0156 >> >> +#define RT5682S_PLL_INTERNAL_2 0x0157 >> >> +#define RT5682S_PLL_INTERNAL_3 0x0158 >> >> +#define RT5682S_PLL_INTERNAL_4 0x0159 >> >> +#define RT5682S_STO_NG2_CTRL_1 0x0160 >> >> +#define RT5682S_STO_NG2_CTRL_2 0x0161 >> >> +#define RT5682S_STO_NG2_CTRL_3 0x0162 >> >> +#define RT5682S_STO_NG2_CTRL_4 0x0163 >> >> +#define RT5682S_STO_NG2_CTRL_5 0x0164 >> >> +#define RT5682S_STO_NG2_CTRL_6 0x0165 >> >> +#define RT5682S_STO_NG2_CTRL_7 0x0166 >> >> +#define RT5682S_STO_NG2_CTRL_8 0x0167 >> >> +#define RT5682S_STO_NG2_CTRL_9 0x0168 >> >> +#define RT5682S_STO_NG2_CTRL_10 0x0169 >> >> +#define RT5682S_STO1_DAC_SIL_DET 0x0190 >> >> +#define RT5682S_SIL_PSV_CTRL1 >> 0x0194 >> >> +#define RT5682S_SIL_PSV_CTRL2 >> 0x0195 >> >> +#define RT5682S_SIL_PSV_CTRL3 >> 0x0197 >> >> +#define RT5682S_SIL_PSV_CTRL4 >> 0x0198 >> >> +#define RT5682S_SIL_PSV_CTRL5 >> 0x0199 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_1 0x01ac >> >> +#define RT5682S_HP_IMP_SENS_CTRL_2 0x01ad >> >> +#define RT5682S_HP_IMP_SENS_CTRL_3 0x01ae >> >> +#define RT5682S_HP_IMP_SENS_CTRL_4 0x01af >> >> +#define RT5682S_HP_IMP_SENS_CTRL_5 0x01b0 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_6 0x01b1 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_7 0x01b2 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_8 0x01b3 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_9 0x01b4 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_10 0x01b5 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_11 0x01b6 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_12 0x01b7 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_13 0x01b8 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_14 0x01b9 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_15 0x01ba >> >> +#define RT5682S_HP_IMP_SENS_CTRL_16 0x01bb >> >> +#define RT5682S_HP_IMP_SENS_CTRL_17 0x01bc >> >> +#define RT5682S_HP_IMP_SENS_CTRL_18 0x01bd >> >> +#define RT5682S_HP_IMP_SENS_CTRL_19 0x01be >> >> +#define RT5682S_HP_IMP_SENS_CTRL_20 0x01bf >> >> +#define RT5682S_HP_IMP_SENS_CTRL_21 0x01c0 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_22 0x01c1 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_23 0x01c2 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_24 0x01c3 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_25 0x01c4 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_26 0x01c5 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_27 0x01c6 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_28 0x01c7 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_29 0x01c8 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_30 0x01c9 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_31 0x01ca >> >> +#define RT5682S_HP_IMP_SENS_CTRL_32 0x01cb >> >> +#define RT5682S_HP_IMP_SENS_CTRL_33 0x01cc >> >> +#define RT5682S_HP_IMP_SENS_CTRL_34 0x01cd >> >> +#define RT5682S_HP_IMP_SENS_CTRL_35 0x01ce >> >> +#define RT5682S_HP_IMP_SENS_CTRL_36 0x01cf >> >> +#define RT5682S_HP_IMP_SENS_CTRL_37 0x01d0 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_38 0x01d1 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_39 0x01d2 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_40 0x01d3 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_41 0x01d4 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_42 0x01d5 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_43 0x01d6 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_44 0x01d7 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_45 0x01d8 >> >> +#define RT5682S_HP_IMP_SENS_CTRL_46 0x01d9 >> >> +#define RT5682S_HP_LOGIC_CTRL_1 0x01da >> >> +#define RT5682S_HP_LOGIC_CTRL_2 0x01db >> >> +#define RT5682S_HP_LOGIC_CTRL_3 0x01dc >> >> +#define RT5682S_HP_CALIB_CTRL_1 0x01de >> >> +#define RT5682S_HP_CALIB_CTRL_2 0x01df >> >> +#define RT5682S_HP_CALIB_CTRL_3 0x01e0 >> >> +#define RT5682S_HP_CALIB_CTRL_4 0x01e1 >> >> +#define RT5682S_HP_CALIB_CTRL_5 0x01e2 >> >> +#define RT5682S_HP_CALIB_CTRL_6 0x01e3 >> >> +#define RT5682S_HP_CALIB_CTRL_7 0x01e4 >> >> +#define RT5682S_HP_CALIB_CTRL_8 0x01e5 >> >> +#define RT5682S_HP_CALIB_CTRL_9 0x01e6 >> >> +#define RT5682S_HP_CALIB_CTRL_10 0x01e7 >> >> +#define RT5682S_HP_CALIB_CTRL_11 0x01e8 >> >> +#define RT5682S_HP_CALIB_ST_1 0x01ea >> >> +#define RT5682S_HP_CALIB_ST_2 0x01eb >> >> +#define RT5682S_HP_CALIB_ST_3 0x01ec >> >> +#define RT5682S_HP_CALIB_ST_4 0x01ed >> >> +#define RT5682S_HP_CALIB_ST_5 0x01ee >> >> +#define RT5682S_HP_CALIB_ST_6 0x01ef >> >> +#define RT5682S_HP_CALIB_ST_7 0x01f0 >> >> +#define RT5682S_HP_CALIB_ST_8 0x01f1 >> >> +#define RT5682S_HP_CALIB_ST_9 0x01f2 >> >> +#define RT5682S_HP_CALIB_ST_10 0x01f3 >> >> +#define RT5682S_HP_CALIB_ST_11 0x01f4 >> >> +#define RT5682S_SAR_IL_CMD_1 0x0210 >> >> +#define RT5682S_SAR_IL_CMD_2 0x0211 >> >> +#define RT5682S_SAR_IL_CMD_3 0x0212 >> >> +#define RT5682S_SAR_IL_CMD_4 0x0213 >> >> +#define RT5682S_SAR_IL_CMD_5 0x0214 >> >> +#define RT5682S_SAR_IL_CMD_6 0x0215 >> >> +#define RT5682S_SAR_IL_CMD_7 0x0216 >> >> +#define RT5682S_SAR_IL_CMD_8 0x0217 >> >> +#define RT5682S_SAR_IL_CMD_9 0x0218 >> >> +#define RT5682S_SAR_IL_CMD_10 0x0219 >> >> +#define RT5682S_SAR_IL_CMD_11 0x021a >> >> +#define RT5682S_SAR_IL_CMD_12 0x021b >> >> +#define RT5682S_SAR_IL_CMD_13 0x021c >> >> +#define RT5682S_SAR_IL_CMD_14 0x021d >> >> +#define RT5682S_DUMMY_4 >> 0x02fa >> >> +#define RT5682S_DUMMY_5 >> 0x02fb >> >> +#define RT5682S_DUMMY_6 >> 0x02fc >> >> +#define RT5682S_VERSION_ID_HIDE 0x03fe >> >> +#define RT5682S_VERSION_ID_CUS 0x03ff >> >> +#define RT5682S_SCAN_CTL 0x0500 >> >> +#define RT5682S_HP_AMP_DET 0x0600 >> >> +#define RT5682S_BIAS_CUR_CTRL_11 0x0610 >> >> +#define RT5682S_BIAS_CUR_CTRL_12 0x0611 >> >> +#define RT5682S_BIAS_CUR_CTRL_13 0x0620 >> >> +#define RT5682S_BIAS_CUR_CTRL_14 0x0621 >> >> +#define RT5682S_BIAS_CUR_CTRL_15 0x0630 >> >> +#define RT5682S_BIAS_CUR_CTRL_16 0x0631 >> >> +#define RT5682S_BIAS_CUR_CTRL_17 0x0640 >> >> +#define RT5682S_BIAS_CUR_CTRL_18 0x0641 >> >> +#define RT5682S_I2C_TRANS_CTRL 0x07fa >> >> +#define RT5682S_DUMMY_7 >> 0x08fa >> >> +#define RT5682S_DUMMY_8 >> 0x08fb >> >> +#define RT5682S_DMIC_FLOAT_DET 0x0d00 >> >> +#define RT5682S_HA_CMP_OP_1 0x1100 >> >> +#define RT5682S_HA_CMP_OP_2 0x1101 >> >> +#define RT5682S_HA_CMP_OP_3 0x1102 >> >> +#define RT5682S_HA_CMP_OP_4 0x1103 >> >> +#define RT5682S_HA_CMP_OP_5 0x1104 >> >> +#define RT5682S_HA_CMP_OP_6 0x1105 >> >> +#define RT5682S_HA_CMP_OP_7 0x1106 >> >> +#define RT5682S_HA_CMP_OP_8 0x1107 >> >> +#define RT5682S_HA_CMP_OP_9 0x1108 >> >> +#define RT5682S_HA_CMP_OP_10 0x1109 >> >> +#define RT5682S_HA_CMP_OP_11 0x110a >> >> +#define RT5682S_HA_CMP_OP_12 0x110b >> >> +#define RT5682S_HA_CMP_OP_13 0x110c >> >> +#define RT5682S_HA_CMP_OP_14 0x1111 >> >> +#define RT5682S_HA_CMP_OP_15 0x1112 >> >> +#define RT5682S_HA_CMP_OP_16 0x1113 >> >> +#define RT5682S_HA_CMP_OP_17 0x1114 >> >> +#define RT5682S_HA_CMP_OP_18 0x1115 >> >> +#define RT5682S_HA_CMP_OP_19 0x1116 >> >> +#define RT5682S_HA_CMP_OP_20 0x1117 >> >> +#define RT5682S_HA_CMP_OP_21 0x1118 >> >> +#define RT5682S_HA_CMP_OP_22 0x1119 >> >> +#define RT5682S_HA_CMP_OP_23 0x111a >> >> +#define RT5682S_HA_CMP_OP_24 0x111b >> >> +#define RT5682S_HA_CMP_OP_25 0x111c >> >> +#define RT5682S_NEW_CBJ_DET_CTL_1 0x1401 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_2 0x1402 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_3 0x1403 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_4 0x1404 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_5 0x1406 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_6 0x1407 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_7 0x1408 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_8 0x1409 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_9 0x140a >> >> +#define RT5682S_NEW_CBJ_DET_CTL_10 0x140b >> >> +#define RT5682S_NEW_CBJ_DET_CTL_11 0x140c >> >> +#define RT5682S_NEW_CBJ_DET_CTL_12 0x140d >> >> +#define RT5682S_NEW_CBJ_DET_CTL_13 0x140e >> >> +#define RT5682S_NEW_CBJ_DET_CTL_14 0x140f >> >> +#define RT5682S_NEW_CBJ_DET_CTL_15 0x1410 >> >> +#define RT5682S_NEW_CBJ_DET_CTL_16 0x1411 >> >> +#define RT5682S_DA_FILTER_1 >> 0x1801 >> >> +#define RT5682S_DA_FILTER_2 >> 0x1802 >> >> +#define RT5682S_DA_FILTER_3 >> 0x1803 >> >> +#define RT5682S_DA_FILTER_4 >> 0x1804 >> >> +#define RT5682S_DA_FILTER_5 >> 0x1805 >> >> +#define RT5682S_CLK_SW_TEST_1 0x2c00 >> >> +#define RT5682S_CLK_SW_TEST_2 0x3400 >> >> +#define RT5682S_CLK_SW_TEST_3 0x3404 >> >> +#define RT5682S_CLK_SW_TEST_4 0x3405 >> >> +#define RT5682S_CLK_SW_TEST_5 0x3406 >> >> +#define RT5682S_CLK_SW_TEST_6 0x3407 >> >> +#define RT5682S_CLK_SW_TEST_7 0x3408 >> >> +#define RT5682S_CLK_SW_TEST_8 0x3409 >> >> +#define RT5682S_CLK_SW_TEST_9 0x340a >> >> +#define RT5682S_CLK_SW_TEST_10 0x340b >> >> +#define RT5682S_CLK_SW_TEST_11 0x340c >> >> +#define RT5682S_CLK_SW_TEST_12 0x340d >> >> +#define RT5682S_CLK_SW_TEST_13 0x340e >> >> +#define RT5682S_CLK_SW_TEST_14 0x340f >> >> +#define RT5682S_EFUSE_MANU_WRITE_1 0x3410 >> >> +#define RT5682S_EFUSE_MANU_WRITE_2 0x3411 >> >> +#define RT5682S_EFUSE_MANU_WRITE_3 0x3412 >> >> +#define RT5682S_EFUSE_MANU_WRITE_4 0x3413 >> >> +#define RT5682S_EFUSE_MANU_WRITE_5 0x3414 >> >> +#define RT5682S_EFUSE_MANU_WRITE_6 0x3415 >> >> +#define RT5682S_EFUSE_READ_1 0x3424 >> >> +#define RT5682S_EFUSE_READ_2 0x3425 >> >> +#define RT5682S_EFUSE_READ_3 0x3426 >> >> +#define RT5682S_EFUSE_READ_4 0x3427 >> >> +#define RT5682S_EFUSE_READ_5 0x3428 >> >> +#define RT5682S_EFUSE_READ_6 0x3429 >> >> +#define RT5682S_EFUSE_READ_7 0x342a >> >> +#define RT5682S_EFUSE_READ_8 0x342b >> >> +#define RT5682S_EFUSE_READ_9 0x342c >> >> +#define RT5682S_EFUSE_READ_10 0x342d >> >> +#define RT5682S_EFUSE_READ_11 0x342e >> >> +#define RT5682S_EFUSE_READ_12 0x342f >> >> +#define RT5682S_EFUSE_READ_13 0x3430 >> >> +#define RT5682S_EFUSE_READ_14 0x3431 >> >> +#define RT5682S_EFUSE_READ_15 0x3432 >> >> +#define RT5682S_EFUSE_READ_16 0x3433 >> >> +#define RT5682S_EFUSE_READ_17 0x3434 >> >> +#define RT5682S_EFUSE_READ_18 0x3435 >> >> +#define RT5682S_EFUSE_TIMING_CTL_1 0x3440 >> >> +#define RT5682S_EFUSE_TIMING_CTL_2 0x3441 >> >> +#define RT5682S_PILOT_DIG_CTL_1 0x3500 >> >> +#define RT5682S_PILOT_DIG_CTL_2 0x3501 >> >> +#define RT5682S_HP_AMP_DET_CTL_1 0x3b00 >> >> +#define RT5682S_HP_AMP_DET_CTL_2 0x3b01 >> >> +#define RT5682S_HP_AMP_DET_CTL_3 0x3b02 >> >> +#define RT5682S_HP_AMP_DET_CTL_4 0x3b03 >> >> + >> >> +#define RT5682S_MAX_REG >> (RT5682S_HP_AMP_DET_CTL_4) >> >> + >> >> +/* global definition */ >> >> +#define RT5682S_L_MUTE >> (0x1 << 15) >> >> +#define RT5682S_L_MUTE_SFT 15 >> >> +#define RT5682S_R_MUTE >> (0x1 << 7) >> >> +#define RT5682S_R_MUTE_SFT 7 >> >> +#define RT5682S_L_VOL_SFT 8 >> >> +#define RT5682S_R_VOL_SFT 0 >> >> +#define RT5682S_CLK_SRC_MCLK (0x0) >> >> +#define RT5682S_CLK_SRC_PLL1 >> (0x1) >> >> +#define RT5682S_CLK_SRC_PLL2 >> (0x2) >> >> +#define RT5682S_CLK_SRC_RCCLK (0x4) >> /* 25M */ >> >> + >> >> + >> >> +/* Headphone Amp Control 2 (0x0003) */ >> >> +#define RT5682S_HPO_L_PATH_MASK (0x1 << 14) >> >> +#define RT5682S_HPO_L_PATH_EN (0x1 << >> 14) >> >> +#define RT5682S_HPO_L_PATH_DIS (0x0 << >> 14) >> >> +#define RT5682S_HPO_R_PATH_MASK (0x1 << 13) >> >> +#define RT5682S_HPO_R_PATH_EN (0x1 << >> 13) >> >> +#define RT5682S_HPO_R_PATH_DIS (0x0 << >> 13) >> >> +#define RT5682S_HPO_SEL_IP_EN_SW (0x1) >> >> +#define RT5682S_HPO_IP_EN_GATING (0x1) >> >> +#define RT5682S_HPO_IP_NO_GATING (0x0) >> >> + >> >> +/*Headphone Amp L/R Analog Gain and Digital NG2 Gain Control (0x0005 >> 0x0006)*/ >> >> +#define >> RT5682S_G_HP (0xf << >> 8) >> >> +#define RT5682S_G_HP_SFT 8 >> >> +#define RT5682S_G_STO_DA_DMIX (0xf) >> >> +#define RT5682S_G_STO_DA_SFT 0 >> >> + >> >> +/* Embeeded Jack and Type Detection Control 2 (0x0010) */ >> >> +#define RT5682S_EMB_JD_MASK (0x1 >> << 15) >> >> +#define RT5682S_EMB_JD_EN (0x1 << 15) >> >> +#define RT5682S_EMB_JD_EN_SFT 15 >> >> +#define RT5682S_EMB_JD_RST >> (0x1 << 14) >> >> +#define RT5682S_JD_MODE >> (0x1 << 13) >> >> +#define RT5682S_JD_MODE_SFT 13 >> >> +#define RT5682S_DET_TYPE (0x1 << 12) >> >> +#define RT5682S_DET_TYPE_SFT 12 >> >> +#define RT5682S_POLA_EXT_JD_MASK (0x1 << 11) >> >> +#define RT5682S_POLA_EXT_JD_LOW (0x1 << 11) >> >> +#define RT5682S_POLA_EXT_JD_HIGH (0x0 << 11) >> >> +#define RT5682S_SEL_FAST_OFF_MASK (0x3 << 9) >> >> +#define RT5682S_SEL_FAST_OFF_SFT 9 >> >> +#define RT5682S_POL_FAST_OFF_MASK (0x1 << 8) >> >> +#define RT5682S_POL_FAST_OFF_HIGH (0x1 << 8) >> >> +#define RT5682S_POL_FAST_OFF_LOW (0x0 << 8) >> >> +#define RT5682S_FAST_OFF_MASK (0x1 << >> 7) >> >> +#define RT5682S_FAST_OFF_EN (0x1 >> << 7) >> >> +#define RT5682S_FAST_OFF_DIS (0x0 >> << 7) >> >> +#define RT5682S_VREF_POW_MASK (0x1 << 6) >> >> +#define RT5682S_VREF_POW_FSM (0x0 << >> 6) >> >> +#define RT5682S_VREF_POW_REG (0x1 << >> 6) >> >> +#define RT5682S_MB1_PATH_BIT 5 >> >> +#define RT5682S_MB1_PATH_MASK (0x1 << 5) >> >> +#define RT5682S_CTRL_MB1_REG (0x1 << >> 5) >> >> +#define RT5682S_CTRL_MB1_FSM (0x0 << >> 5) >> >> +#define RT5682S_MB2_PATH_BIT 4 >> >> +#define RT5682S_MB2_PATH_MASK (0x1 << 4) >> >> +#define RT5682S_CTRL_MB2_REG (0x1 << >> 4) >> >> +#define RT5682S_CTRL_MB2_FSM (0x0 << >> 4) >> >> +#define RT5682S_TRIG_JD_MASK (0x1 >> << 3) >> >> +#define RT5682S_TRIG_JD_HIGH (0x1 >> << 3) >> >> +#define RT5682S_TRIG_JD_LOW (0x0 >> << 3) >> >> +#define RT5682S_MIC_CAP_MASK (0x1 << >> 1) >> >> +#define RT5682S_MIC_CAP_HS >> (0x1 << 1) >> >> +#define RT5682S_MIC_CAP_HP (0x0 >> << 1) >> >> +#define RT5682S_MIC_CAP_SRC_MASK (0x1) >> >> +#define RT5682S_MIC_CAP_SRC_REG (0x1) >> >> +#define RT5682S_MIC_CAP_SRC_ANA (0x0) >> >> + >> >> +/* Embeeded Jack and Type Detection Control 3 (0x0011) */ >> >> +#define RT5682S_SEL_CBJ_TYPE_SLOW (0x1 << 15) >> >> +#define RT5682S_SEL_CBJ_TYPE_NORM (0x0 << 15) >> >> +#define RT5682S_SEL_CBJ_TYPE_MASK (0x1 << 15) >> >> +#define RT5682S_POW_BG_MB1_MASK >> (0x1 << 13) >> >> +#define RT5682S_POW_BG_MB1_REG (0x1 << 13) >> >> +#define RT5682S_POW_BG_MB1_FSM (0x0 << 13) >> >> +#define RT5682S_POW_BG_MB2_MASK >> (0x1 << 12) >> >> +#define RT5682S_POW_BG_MB2_REG (0x1 << 12) >> >> +#define RT5682S_POW_BG_MB2_FSM (0x0 << 12) >> >> +#define RT5682S_EXT_JD_SRC (0x7 << 4) >> >> +#define RT5682S_EXT_JD_SRC_SFT 4 >> >> +#define RT5682S_EXT_JD_SRC_GPIO_JD1 (0x0 << 4) >> >> +#define RT5682S_EXT_JD_SRC_GPIO_JD2 (0x1 << 4) >> >> +#define RT5682S_EXT_JD_SRC_JDH (0x2 << >> 4) >> >> +#define RT5682S_EXT_JD_SRC_JDL (0x3 >> << 4) >> >> +#define RT5682S_EXT_JD_SRC_MANUAL (0x4 << 4) >> >> +#define RT5682S_JACK_TYPE_MASK (0x3) >> >> + >> >> +/* Combo Jack and Type Detection Control 4 (0x0012) */ >> >> +#define RT5682S_CBJ_IN_BUF_MASK (0x1 << 7) >> >> +#define RT5682S_CBJ_IN_BUF_EN (0x1 >> << 7) >> >> +#define RT5682S_CBJ_IN_BUF_DIS (0x0 >> << 7) >> >> +#define RT5682S_CBJ_IN_BUF_BIT 7 >> >> + >> >> +/* Combo Jack and Type Detection Control 5 (0x0013) */ >> >> +#define RT5682S_SEL_SHT_MID_TON_MASK (0x3 << 12) >> >> +#define RT5682S_SEL_SHT_MID_TON_2 (0x0 << 12) >> >> +#define RT5682S_SEL_SHT_MID_TON_3 (0x1 << 12) >> >> +#define RT5682S_CBJ_JD_TEST_MASK (0x1 << 6) >> >> +#define RT5682S_CBJ_JD_TEST_NORM (0x0 << 6) >> >> +#define RT5682S_CBJ_JD_TEST_MODE (0x1 << 6) >> >> + >> >> +/* Combo Jack and Type Detection Control 6 (0x0014) */ >> >> +#define RT5682S_JD_FAST_OFF_SRC_MASK (0x7 << 8) >> >> +#define RT5682S_JD_FAST_OFF_SRC_JDH (0x6 << 8) >> >> +#define RT5682S_JD_FAST_OFF_SRC_GPIO6 (0x5 << 8) >> >> +#define RT5682S_JD_FAST_OFF_SRC_GPIO5 (0x4 << 8) >> >> +#define RT5682S_JD_FAST_OFF_SRC_GPIO4 (0x3 << 8) >> >> +#define RT5682S_JD_FAST_OFF_SRC_GPIO3 (0x2 << 8) >> >> +#define RT5682S_JD_FAST_OFF_SRC_GPIO2 (0x1 << 8) >> >> +#define RT5682S_JD_FAST_OFF_SRC_GPIO1 (0x0 << 8) >> >> + >> >> +/* DAC1 Digital Volume (0x0019) */ >> >> +#define RT5682S_DAC_L1_VOL_MASK (0xff << 8) >> >> +#define RT5682S_DAC_L1_VOL_SFT 8 >> >> +#define RT5682S_DAC_R1_VOL_MASK (0xff) >> >> +#define RT5682S_DAC_R1_VOL_SFT 0 >> >> + >> >> +/* ADC Digital Volume Control (0x001c) */ >> >> +#define RT5682S_ADC_L_VOL_MASK (0x7f << 8) >> >> +#define RT5682S_ADC_L_VOL_SFT 8 >> >> +#define RT5682S_ADC_R_VOL_MASK (0x7f) >> >> +#define RT5682S_ADC_R_VOL_SFT 0 >> >> + >> >> +/* Stereo1 ADC Boost Gain Control (0x001f) */ >> >> +#define RT5682S_STO1_ADC_L_BST_MASK (0x3 << 14) >> >> +#define RT5682S_STO1_ADC_L_BST_SFT 14 >> >> +#define RT5682S_STO1_ADC_R_BST_MASK (0x3 << 12) >> >> +#define RT5682S_STO1_ADC_R_BST_SFT 12 >> >> + >> >> +/* Sidetone Control (0x0024) */ >> >> +#define RT5682S_ST_SRC_SEL (0x1 << 8) >> >> +#define RT5682S_ST_SRC_SFT 8 >> >> +#define RT5682S_ST_EN_MASK (0x1 >> << 6) >> >> +#define >> RT5682S_ST_DIS (0x0 << >> 6) >> >> +#define >> RT5682S_ST_EN (0x1 << >> 6) >> >> +#define RT5682S_ST_EN_SFT 6 >> >> + >> >> +/* Stereo1 ADC Mixer Control (0x0026) */ >> >> +#define RT5682S_M_STO1_ADC_L1 (0x1 << >> 15) >> >> +#define RT5682S_M_STO1_ADC_L1_SFT 15 >> >> +#define RT5682S_M_STO1_ADC_L2 (0x1 << >> 14) >> >> +#define RT5682S_M_STO1_ADC_L2_SFT 14 >> >> +#define RT5682S_STO1_ADC1L_SRC_MASK (0x1 << 13) >> >> +#define RT5682S_STO1_ADC1L_SRC_SFT 13 >> >> +#define RT5682S_STO1_ADC1_SRC_ADC (0x1 << 13) >> >> +#define RT5682S_STO1_ADC1_SRC_DACMIX (0x0 << 13) >> >> +#define RT5682S_STO1_ADC2L_SRC_MASK (0x1 << 12) >> >> +#define RT5682S_STO1_ADC2L_SRC_SFT 12 >> >> +#define RT5682S_STO1_ADCL_SRC_MASK (0x3 << 10) >> >> +#define RT5682S_STO1_ADCL_SRC_SFT 10 >> >> +#define RT5682S_M_STO1_ADC_R1 (0x1 << 7) >> >> +#define RT5682S_M_STO1_ADC_R1_SFT 7 >> >> +#define RT5682S_M_STO1_ADC_R2 (0x1 << 6) >> >> +#define RT5682S_M_STO1_ADC_R2_SFT 6 >> >> +#define RT5682S_STO1_ADC1R_SRC_MASK (0x1 << 5) >> >> +#define RT5682S_STO1_ADC1R_SRC_SFT 5 >> >> +#define RT5682S_STO1_ADC2R_SRC_MASK (0x1 << 4) >> >> +#define RT5682S_STO1_ADC2R_SRC_SFT 4 >> >> +#define RT5682S_STO1_ADCR_SRC_MASK (0x3 << 2) >> >> +#define RT5682S_STO1_ADCR_SRC_SFT 2 >> >> + >> >> +/* ADC Mixer to DAC Mixer Control (0x0029) */ >> >> +#define RT5682S_M_ADCMIX_L (0x1 >> << 15) >> >> +#define RT5682S_M_ADCMIX_L_SFT 15 >> >> +#define RT5682S_M_DAC1_L (0x1 << 14) >> >> +#define RT5682S_M_DAC1_L_SFT 14 >> >> +#define RT5682S_M_ADCMIX_R (0x1 >> << 7) >> >> +#define RT5682S_M_ADCMIX_R_SFT 7 >> >> +#define RT5682S_M_DAC1_R (0x1 << 6) >> >> +#define RT5682S_M_DAC1_R_SFT 6 >> >> + >> >> +/* Stereo1 DAC Mixer Control (0x002a) */ >> >> +#define RT5682S_M_DAC_L1_STO_L (0x1 << >> 15) >> >> +#define RT5682S_M_DAC_L1_STO_L_SFT 15 >> >> +#define RT5682S_G_DAC_L1_STO_L_MASK (0x1 << 14) >> >> +#define RT5682S_G_DAC_L1_STO_L_SFT 14 >> >> +#define RT5682S_M_DAC_R1_STO_L (0x1 << 13) >> >> +#define RT5682S_M_DAC_R1_STO_L_SFT 13 >> >> +#define RT5682S_G_DAC_R1_STO_L_MASK (0x1 << 12) >> >> +#define RT5682S_G_DAC_R1_STO_L_SFT 12 >> >> +#define RT5682S_M_DAC_L1_STO_R (0x1 << 7) >> >> +#define RT5682S_M_DAC_L1_STO_R_SFT 7 >> >> +#define RT5682S_G_DAC_L1_STO_R_MASK (0x1 << 6) >> >> +#define RT5682S_G_DAC_L1_STO_R_SFT 6 >> >> +#define RT5682S_M_DAC_R1_STO_R (0x1 << 5) >> >> +#define RT5682S_M_DAC_R1_STO_R_SFT 5 >> >> +#define RT5682S_G_DAC_R1_STO_R_MASK (0x1 << 4) >> >> +#define RT5682S_G_DAC_R1_STO_R_SFT 4 >> >> + >> >> +/* Analog DAC1 Input Source Control (0x002b) */ >> >> +#define RT5682S_M_ST_STO_L >> (0x1 << 9) >> >> +#define RT5682S_M_ST_STO_L_SFT 9 >> >> +#define RT5682S_M_ST_STO_R (0x1 >> << 8) >> >> +#define RT5682S_M_ST_STO_R_SFT 8 >> >> +#define RT5682S_DAC_L1_SRC_MASK (0x1 << 4) >> >> +#define RT5682S_A_DACL1_SFT 4 >> >> +#define RT5682S_DAC_R1_SRC_MASK (0x1) >> >> +#define RT5682S_A_DACR1_SFT 0 >> >> + >> >> +/* Digital Interface Data Control (0x0030) */ >> >> +#define RT5682S_IF2_DAC_SEL_MASK (0x3 << 2) >> >> +#define RT5682S_IF2_DAC_SEL_SFT 2 >> >> +#define RT5682S_IF2_ADC_SEL_MASK (0x3 << 0) >> >> +#define RT5682S_IF2_ADC_SEL_SFT 0 >> >> + >> >> +/* REC Left/Right Mixer Control 2 (0x003c) */ >> >> +#define RT5682S_BST_CBJ_MASK (0x3f >> << 8) >> >> +#define RT5682S_BST_CBJ_SFT 8 >> >> +#define RT5682S_M_CBJ_RM1_L (0x1 >> << 7) >> >> +#define RT5682S_M_CBJ_RM1_L_SFT 7 >> >> +#define RT5682S_M_CBJ_RM1_R (0x1 >> << 6) >> >> +#define RT5682S_M_CBJ_RM1_R_SFT 6 >> >> + >> >> +/* REC Left/Right Mixer Calibration Control(0x0044) */ >> >> +#define RT5682S_PWR_RM1_R_BIT 8 >> >> +#define RT5682S_PWR_RM1_L_BIT 0 >> >> + >> >> +/* Power Management for Digital 1 (0x0061) */ >> >> +#define RT5682S_PWR_I2S1 (0x1 << 15) >> >> +#define RT5682S_PWR_I2S1_BIT 15 >> >> +#define RT5682S_PWR_I2S2 (0x1 << 14) >> >> +#define RT5682S_PWR_I2S2_BIT 14 >> >> +#define RT5682S_PRE_CHR_DAC_L1 (0x1 << >> 13) >> >> +#define RT5682S_PRE_CHR_DAC_L1_BIT 13 >> >> +#define RT5682S_PRE_CHR_DAC_R1 (0x1 << >> 12) >> >> +#define RT5682S_PRE_CHR_DAC_R1_BIT 12 >> >> +#define RT5682S_PWR_DAC_L1 (0x1 >> << 11) >> >> +#define RT5682S_PWR_DAC_L1_BIT 11 >> >> +#define RT5682S_PWR_DAC_R1 (0x1 >> << 10) >> >> +#define RT5682S_PWR_DAC_R1_BIT 10 >> >> +#define RT5682S_PWR_LDO >> (0x1 << 8) >> >> +#define RT5682S_PWR_LDO_BIT 8 >> >> +#define RT5682S_PWR_D2S_L (0x1 << 7) >> >> +#define RT5682S_PWR_D2S_L_BIT 7 >> >> +#define RT5682S_PWR_D2S_R (0x1 << 6) >> >> +#define RT5682S_PWR_D2S_R_BIT 6 >> >> +#define RT5682S_PWR_ADC_L1 (0x1 >> << 4) >> >> +#define RT5682S_PWR_ADC_L1_BIT 4 >> >> +#define RT5682S_PWR_ADC_R1 (0x1 >> << 3) >> >> +#define RT5682S_PWR_ADC_R1_BIT 3 >> >> +#define RT5682S_EFUSE_SW_EN (0x1 >> << 2) >> >> +#define RT5682S_EFUSE_SW_DIS (0x0 >> << 2) >> >> +#define RT5682S_PWR_EFUSE (0x1 << 1) >> >> +#define RT5682S_PWR_EFUSE_BIT 1 >> >> +#define RT5682S_DIG_GATE_CTRL (0x1 >> << 0) >> >> +#define RT5682S_DIG_GATE_CTRL_SFT 0 >> >> + >> >> +/* Power Management for Digital 2 (0x0062) */ >> >> +#define RT5682S_PWR_ADC_S1F (0x1 >> << 15) >> >> +#define RT5682S_PWR_ADC_S1F_BIT 15 >> >> +#define RT5682S_PWR_DAC_S1F (0x1 >> << 10) >> >> +#define RT5682S_PWR_DAC_S1F_BIT 10 >> >> +#define RT5682S_DLDO_I_LIMIT_MASK (0x1 << 7) >> >> +#define RT5682S_DLDO_I_LIMIT_EN (0x1 << >> 7) >> >> +#define RT5682S_DLDO_I_LIMIT_DIS (0x0 << 7) >> >> +#define RT5682S_DLDO_I_BIAS_SEL_4 (0x1 << 6) >> >> +#define RT5682S_DLDO_I_BIAS_SEL_0 (0x0 << 6) >> >> +#define RT5682S_DLDO_REG_TEST_1 (0x1 << 5) >> >> +#define RT5682S_DLDO_REG_TEST_0 (0x0 << 5) >> >> +#define RT5682S_DLDO_SRC_REG (0x1 << >> 4) >> >> +#define RT5682S_DLDO_SRC_EFUSE (0x0 << >> 4) >> >> + >> >> +/* Power Management for Analog 1 (0x0063) */ >> >> +#define RT5682S_PWR_VREF1 (0x1 << 15) >> >> +#define RT5682S_PWR_VREF1_BIT 15 >> >> +#define RT5682S_PWR_FV1 >> (0x1 << 14) >> >> +#define RT5682S_PWR_FV1_BIT 14 >> >> +#define RT5682S_PWR_VREF2 (0x1 << 13) >> >> +#define RT5682S_PWR_VREF2_BIT 13 >> >> +#define RT5682S_PWR_FV2 >> (0x1 << 12) >> >> +#define RT5682S_PWR_FV2_BIT 12 >> >> +#define RT5682S_LDO1_DBG_MASK (0x3 << >> 10) >> >> +#define RT5682S_PWR_MB >> (0x1 << 9) >> >> +#define RT5682S_PWR_MB_BIT 9 >> >> +#define RT5682S_PWR_BG >> (0x1 << 7) >> >> +#define RT5682S_PWR_BG_BIT 7 >> >> +#define RT5682S_LDO1_BYPASS_MASK (0x1 << 6) >> >> +#define RT5682S_LDO1_BYPASS (0x1 >> << 6) >> >> +#define RT5682S_LDO1_NOT_BYPASS (0x0 << 6) >> >> + >> >> +/* Power Management for Analog 2 (0x0064) */ >> >> +#define RT5682S_PWR_MCLK0_WD (0x1 << 15) >> >> +#define RT5682S_PWR_MCLK0_WD_BIT 15 >> >> +#define RT5682S_PWR_MCLK1_WD (0x1 << 14) >> >> +#define RT5682S_PWR_MCLK1_WD_BIT 14 >> >> +#define RT5682S_RST_MCLK0 (0x1 << 13) >> >> +#define RT5682S_RST_MCLK0_BIT 13 >> >> +#define RT5682S_RST_MCLK1 (0x1 << 12) >> >> +#define RT5682S_RST_MCLK1_BIT 12 >> >> +#define RT5682S_PWR_MB1 >> (0x1 << 11) >> >> +#define RT5682S_PWR_MB1_PWR_DOWN (0x0 << 11) >> >> +#define RT5682S_PWR_MB1_BIT 11 >> >> +#define RT5682S_PWR_MB2 >> (0x1 << 10) >> >> +#define RT5682S_PWR_MB2_PWR_DOWN (0x0 << 10) >> >> +#define RT5682S_PWR_MB2_BIT 10 >> >> +#define RT5682S_PWR_JD_MASK (0x1 >> << 0) >> >> +#define RT5682S_PWR_JD_ENABLE (0x1 << >> 0) >> >> +#define RT5682S_PWR_JD_DISABLE (0x0 << >> 0) >> >> + >> >> +/* Power Management for Analog 3 (0x0065) */ >> >> +#define RT5682S_PWR_LDO_PLLA (0x1 << >> 15) >> >> +#define RT5682S_PWR_LDO_PLLA_BIT 15 >> >> +#define RT5682S_PWR_LDO_PLLB (0x1 >> << 14) >> >> +#define RT5682S_PWR_LDO_PLLB_BIT 14 >> >> +#define RT5682S_PWR_BIAS_PLLA (0x1 >> << 13) >> >> +#define RT5682S_PWR_BIAS_PLLA_BIT 13 >> >> +#define RT5682S_PWR_BIAS_PLLB (0x1 >> << 12) >> >> +#define RT5682S_PWR_BIAS_PLLB_BIT 12 >> >> +#define RT5682S_PWR_CBJ >> (0x1 << 9) >> >> +#define RT5682S_PWR_CBJ_BIT 9 >> >> +#define RT5682S_RSTB_PLLB (0x1 << 7) >> >> +#define RT5682S_RSTB_PLLB_BIT 7 >> >> +#define RT5682S_RSTB_PLLA (0x1 << 6) >> >> +#define RT5682S_RSTB_PLLA_BIT 6 >> >> +#define RT5682S_PWR_PLLB (0x1 << 5) >> >> +#define RT5682S_PWR_PLLB_BIT 5 >> >> +#define RT5682S_PWR_PLLA (0x1 << 4) >> >> +#define RT5682S_PWR_PLLA_BIT 4 >> >> +#define RT5682S_PWR_LDO_MB2 (0x1 << >> 2) >> >> +#define RT5682S_PWR_LDO_MB2_BIT 2 >> >> +#define RT5682S_PWR_LDO_MB1 (0x1 << >> 1) >> >> +#define RT5682S_PWR_LDO_MB1_BIT 1 >> >> +#define RT5682S_PWR_BGLDO (0x1 >> << 0) >> >> +#define RT5682S_PWR_BGLDO_BIT 0 >> >> + >> >> +/* Power Management for Mixer (0x0066) */ >> >> +#define RT5682S_PWR_CLK_COMP_8FS (0x1 << 15) >> >> +#define RT5682S_PWR_CLK_COMP_8FS_BIT 15 >> >> +#define RT5682S_DBG_BGLDO_MASK (0x3 << 12) >> >> +#define RT5682S_DBG_BGLDO_SFT 12 >> >> +#define RT5682S_DBG_BGLDO_MB1_MASK (0x3 << 10) >> >> +#define RT5682S_DBG_BGLDO_MB1_SFT 10 >> >> +#define RT5682S_DBG_BGLDO_MB2_MASK (0x3 << 8) >> >> +#define RT5682S_DBG_BGLDO_MB2_SFT 8 >> >> +#define >> RT5682S_DLDO_BGLDO_MASK (0x3 << 6) >> >> +#define RT5682S_DLDO_BGLDO_MB2_SFT 6 >> >> +#define RT5682S_PWR_STO1_DAC_L (0x1 << 5) >> >> +#define RT5682S_PWR_STO1_DAC_L_BIT 5 >> >> +#define RT5682S_PWR_STO1_DAC_R (0x1 << 4) >> >> +#define RT5682S_PWR_STO1_DAC_R_BIT 4 >> >> +#define RT5682S_DVO_BGLDO_MB1_MASK (0x3 << 2) >> >> +#define RT5682S_DVO_BGLDO_MB1_SFT 2 >> >> +#define RT5682S_DVO_BGLDO_MB2_MASK (0x3 << 0) >> >> + >> >> +/* MCLK and System Clock Detection Control (0x006b) */ >> >> +#define RT5682S_SYS_CLK_DET >> (0x1 << 15) >> >> +#define RT5682S_SYS_CLK_DET_SFT 15 >> >> +#define RT5682S_PLL1_CLK_DET (0x1 >> << 14) >> >> +#define RT5682S_PLL1_CLK_DET_SFT 14 >> >> + >> >> +/* Digital Microphone Control 1 (0x006e) */ >> >> +#define RT5682S_DMIC_1_EN_MASK (0x1 << 15) >> >> +#define RT5682S_DMIC_1_EN_SFT 15 >> >> +#define RT5682S_DMIC_1_DIS (0x0 << 15) >> >> +#define RT5682S_DMIC_1_EN (0x1 << 15) >> >> +#define RT5682S_FIFO_CLK_DIV_MASK (0x7 << 12) >> >> +#define RT5682S_FIFO_CLK_DIV_2 (0x1 >> << 12) >> >> +#define RT5682S_DMIC_1_DP_MASK (0x3 << 4) >> >> +#define RT5682S_DMIC_1_DP_SFT 4 >> >> +#define RT5682S_DMIC_1_DP_GPIO2 (0x0 << 4) >> >> +#define RT5682S_DMIC_1_DP_GPIO5 (0x1 << 4) >> >> +#define RT5682S_DMIC_CLK_MASK (0xf << >> 0) >> >> +#define RT5682S_DMIC_CLK_SFT 0 >> >> + >> >> +/* I2S1 Audio Serial Data Port Control (0x0070) */ >> >> +#define RT5682S_SEL_ADCDAT_MASK (0x1 << 15) >> >> +#define RT5682S_SEL_ADCDAT_OUT (0x0 << >> 15) >> >> +#define RT5682S_SEL_ADCDAT_IN (0x1 >> << 15) >> >> +#define RT5682S_SEL_ADCDAT_SFT 15 >> >> +#define RT5682S_I2S1_TX_CHL_MASK (0x7 << 12) >> >> +#define RT5682S_I2S1_TX_CHL_SFT 12 >> >> +#define RT5682S_I2S1_TX_CHL_16 (0x0 >> << 12) >> >> +#define RT5682S_I2S1_TX_CHL_20 (0x1 >> << 12) >> >> +#define RT5682S_I2S1_TX_CHL_24 (0x2 >> << 12) >> >> +#define RT5682S_I2S1_TX_CHL_32 (0x3 >> << 12) >> >> +#define RT5682S_I2S1_TX_CHL_8 (0x4 >> << 12) >> >> +#define RT5682S_I2S1_RX_CHL_MASK (0x7 << 8) >> >> +#define RT5682S_I2S1_RX_CHL_SFT 8 >> >> +#define RT5682S_I2S1_RX_CHL_16 (0x0 >> << 8) >> >> +#define RT5682S_I2S1_RX_CHL_20 (0x1 >> << 8) >> >> +#define RT5682S_I2S1_RX_CHL_24 (0x2 >> << 8) >> >> +#define RT5682S_I2S1_RX_CHL_32 (0x3 >> << 8) >> >> +#define RT5682S_I2S1_RX_CHL_8 (0x4 >> << 8) >> >> +#define RT5682S_I2S1_MONO_MASK (0x1 << 7) >> >> +#define RT5682S_I2S1_MONO_EN (0x1 << >> 7) >> >> +#define RT5682S_I2S1_MONO_DIS (0x0 << >> 7) >> >> +#define RT5682S_I2S1_DL_MASK (0x7 >> << 4) >> >> +#define RT5682S_I2S1_DL_SFT 4 >> >> +#define RT5682S_I2S1_DL_16 (0x0 << 4) >> >> +#define RT5682S_I2S1_DL_20 (0x1 << 4) >> >> +#define RT5682S_I2S1_DL_24 (0x2 << 4) >> >> +#define RT5682S_I2S1_DL_32 (0x3 << 4) >> >> +#define RT5682S_I2S1_DL_8 (0x4 << 4) >> >> + >> >> +/* I2S1/2 Audio Serial Data Port Control (0x0071) */ >> >> +#define RT5682S_I2S2_MS_MASK (0x1 >> << 15) >> >> +#define RT5682S_I2S2_MS_SFT 15 >> >> +#define RT5682S_I2S2_MS_M (0x0 << 15) >> >> +#define RT5682S_I2S2_MS_S (0x1 << 15) >> >> +#define RT5682S_I2S2_PIN_CFG_MASK (0x1 << 14) >> >> +#define RT5682S_I2S2_PIN_CFG_SFT 14 >> >> +#define RT5682S_I2S2_OUT_MASK (0x1 << >> 9) >> >> +#define RT5682S_I2S2_OUT_SFT 9 >> >> +#define RT5682S_I2S2_OUT_UM (0x0 >> << 9) >> >> +#define RT5682S_I2S2_OUT_M >> (0x1 << 9) >> >> +#define RT5682S_I2S_BP_MASK (0x1 >> << 8) >> >> +#define RT5682S_I2S_BP_SFT 8 >> >> +#define RT5682S_I2S_BP_NOR (0x0 << 8) >> >> +#define RT5682S_I2S_BP_INV (0x1 << 8) >> >> +#define RT5682S_I2S2_MONO_MASK (0x1 << 7) >> >> +#define RT5682S_I2S2_MONO_EN (0x1 << >> 7) >> >> +#define RT5682S_I2S2_MONO_DIS (0x0 << >> 7) >> >> +#define RT5682S_I2S2_DL_MASK (0x7 >> << 4) >> >> +#define RT5682S_I2S2_DL_SFT 4 >> >> +#define RT5682S_I2S2_DL_8 (0x0 << 4) >> >> +#define RT5682S_I2S2_DL_16 (0x1 << 4) >> >> +#define RT5682S_I2S2_DL_20 (0x2 << 4) >> >> +#define RT5682S_I2S2_DL_24 (0x3 << 4) >> >> +#define RT5682S_I2S2_DL_32 (0x4 << 4) >> >> +#define RT5682S_I2S_DF_MASK (0x7) >> >> +#define RT5682S_I2S_DF_SFT 0 >> >> +#define RT5682S_I2S_DF_I2S (0x0) >> >> +#define RT5682S_I2S_DF_LEFT (0x1) >> >> +#define RT5682S_I2S_DF_PCM_A (0x2) >> >> +#define RT5682S_I2S_DF_PCM_B (0x3) >> >> +#define RT5682S_I2S_DF_PCM_A_N (0x6) >> >> +#define RT5682S_I2S_DF_PCM_B_N (0x7) >> >> + >> >> +/* ADC/DAC Clock Control 1 (0x0073) */ >> >> +#define RT5682S_ADC_OSR_MASK (0xf << >> 12) >> >> +#define RT5682S_ADC_OSR_SFT 12 >> >> +#define RT5682S_ADC_OSR_D_1 (0x0 >> << 12) >> >> +#define RT5682S_ADC_OSR_D_2 (0x1 >> << 12) >> >> +#define RT5682S_ADC_OSR_D_4 (0x2 >> << 12) >> >> +#define RT5682S_ADC_OSR_D_6 (0x3 >> << 12) >> >> +#define RT5682S_ADC_OSR_D_8 (0x4 >> << 12) >> >> +#define RT5682S_ADC_OSR_D_12 (0x5 << >> 12) >> >> +#define RT5682S_ADC_OSR_D_16 (0x6 << >> 12) >> >> +#define RT5682S_ADC_OSR_D_24 (0x7 << >> 12) >> >> +#define RT5682S_ADC_OSR_D_32 (0x8 << >> 12) >> >> +#define RT5682S_ADC_OSR_D_48 (0x9 << >> 12) >> >> +#define RT5682S_I2S_M_D_MASK (0xf << >> 8) >> >> +#define RT5682S_I2S_M_D_SFT 8 >> >> +#define RT5682S_I2S_M_D_1 (0x0 << 8) >> >> +#define RT5682S_I2S_M_D_2 (0x1 << 8) >> >> +#define RT5682S_I2S_M_D_3 (0x2 << 8) >> >> +#define RT5682S_I2S_M_D_4 (0x3 << 8) >> >> +#define RT5682S_I2S_M_D_6 (0x4 << 8) >> >> +#define RT5682S_I2S_M_D_8 (0x5 << 8) >> >> +#define RT5682S_I2S_M_D_12 (0x6 << 8) >> >> +#define RT5682S_I2S_M_D_16 (0x7 << 8) >> >> +#define RT5682S_I2S_M_D_24 (0x8 << 8) >> >> +#define RT5682S_I2S_M_D_32 (0x9 << 8) >> >> +#define RT5682S_I2S_M_D_48 (0x10 << 8) >> >> +#define RT5682S_I2S_M_CLK_SRC_MASK (0x7 << 4) >> >> +#define RT5682S_I2S_M_CLK_SRC_SFT 4 >> >> +#define RT5682S_DAC_OSR_MASK (0xf << >> 0) >> >> +#define RT5682S_DAC_OSR_SFT 0 >> >> +#define RT5682S_DAC_OSR_D_1 (0x0 >> << 0) >> >> +#define RT5682S_DAC_OSR_D_2 (0x1 >> << 0) >> >> +#define RT5682S_DAC_OSR_D_4 (0x2 >> << 0) >> >> +#define RT5682S_DAC_OSR_D_6 (0x3 >> << 0) >> >> +#define RT5682S_DAC_OSR_D_8 (0x4 >> << 0) >> >> +#define RT5682S_DAC_OSR_D_12 (0x5 >> << 0) >> >> +#define RT5682S_DAC_OSR_D_16 (0x6 << >> 0) >> >> +#define RT5682S_DAC_OSR_D_24 (0x7 << >> 0) >> >> +#define RT5682S_DAC_OSR_D_32 (0x8 << >> 0) >> >> +#define RT5682S_DAC_OSR_D_48 (0x9 << >> 0) >> >> + >> >> +/* ADC/DAC Clock Control 2 (0x0074) */ >> >> +#define RT5682S_I2S2_BCLK_MS2_MASK (0x1 << 11) >> >> +#define RT5682S_I2S2_BCLK_MS2_SFT 11 >> >> +#define RT5682S_I2S2_BCLK_MS2_32 (0x0 << 11) >> >> +#define RT5682S_I2S2_BCLK_MS2_64 (0x1 << 11) >> >> + >> >> + >> >> +/* TDM control 1 (0x0079) */ >> >> +#define RT5682S_TDM_TX_CH_MASK (0x3 << 12) >> >> +#define RT5682S_TDM_TX_CH_2 (0x0 >> << 12) >> >> +#define RT5682S_TDM_TX_CH_4 (0x1 >> << 12) >> >> +#define RT5682S_TDM_TX_CH_6 (0x2 >> << 12) >> >> +#define RT5682S_TDM_TX_CH_8 (0x3 >> << 12) >> >> +#define RT5682S_TDM_RX_CH_MASK (0x3 << 8) >> >> +#define RT5682S_TDM_RX_CH_2 (0x0 >> << 8) >> >> +#define RT5682S_TDM_RX_CH_4 (0x1 >> << 8) >> >> +#define RT5682S_TDM_RX_CH_6 (0x2 >> << 8) >> >> +#define RT5682S_TDM_RX_CH_8 (0x3 >> << 8) >> >> +#define RT5682S_TDM_ADC_LCA_MASK (0x7 << 4) >> >> +#define RT5682S_TDM_ADC_LCA_SFT 4 >> >> +#define RT5682S_TDM_ADC_DL_SFT 0 >> >> + >> >> +/* TDM control 2 (0x007a) */ >> >> +#define RT5682S_IF1_ADC1_SEL_SFT 14 >> >> +#define RT5682S_IF1_ADC2_SEL_SFT 12 >> >> +#define RT5682S_IF1_ADC3_SEL_SFT 10 >> >> +#define RT5682S_IF1_ADC4_SEL_SFT 8 >> >> +#define RT5682S_TDM_ADC_SEL_SFT 3 >> >> + >> >> +/* TDM control 3 (0x007b) */ >> >> +#define RT5682S_TDM_EN >> (0x1 << 7) >> >> + >> >> +/* TDM/I2S control (0x007e) */ >> >> +#define RT5682S_TDM_S_BP_MASK (0x1 << >> 15) >> >> +#define RT5682S_TDM_S_BP_SFT 15 >> >> +#define RT5682S_TDM_S_BP_NOR (0x0 << >> 15) >> >> +#define RT5682S_TDM_S_BP_INV (0x1 >> << 15) >> >> +#define RT5682S_TDM_S_LP_MASK (0x1 << >> 14) >> >> +#define RT5682S_TDM_S_LP_SFT 14 >> >> +#define RT5682S_TDM_S_LP_NOR (0x0 << >> 14) >> >> +#define RT5682S_TDM_S_LP_INV (0x1 >> << 14) >> >> +#define RT5682S_TDM_DF_MASK (0x7 << >> 11) >> >> +#define RT5682S_TDM_DF_SFT 11 >> >> +#define RT5682S_TDM_DF_I2S (0x0 << 11) >> >> +#define RT5682S_TDM_DF_LEFT (0x1 >> << 11) >> >> +#define RT5682S_TDM_DF_PCM_A (0x2 << >> 11) >> >> +#define RT5682S_TDM_DF_PCM_B (0x3 << >> 11) >> >> +#define RT5682S_TDM_DF_PCM_A_N (0x6 << 11) >> >> +#define RT5682S_TDM_DF_PCM_B_N (0x7 << 11) >> >> +#define RT5682S_TDM_BCLK_MS1_MASK (0x3 << 8) >> >> +#define RT5682S_TDM_BCLK_MS1_SFT 8 >> >> +#define RT5682S_TDM_BCLK_MS1_32 (0x0 << 8) >> >> +#define RT5682S_TDM_BCLK_MS1_64 (0x1 << 8) >> >> +#define RT5682S_TDM_BCLK_MS1_128 (0x2 << 8) >> >> +#define RT5682S_TDM_BCLK_MS1_256 (0x3 << 8) >> >> +#define RT5682S_TDM_BCLK_MS1_16 (0x4 << 8) >> >> +#define RT5682S_TDM_CL_MASK (0x3 << >> 4) >> >> +#define RT5682S_TDM_CL_16 (0x0 << 4) >> >> +#define RT5682S_TDM_CL_20 (0x1 << 4) >> >> +#define RT5682S_TDM_CL_24 (0x2 << 4) >> >> +#define RT5682S_TDM_CL_32 (0x3 << 4) >> >> +#define RT5682S_TDM_M_BP_MASK (0x1 << 2) >> >> +#define RT5682S_TDM_M_BP_SFT 2 >> >> +#define RT5682S_TDM_M_BP_NOR (0x0 << 2) >> >> +#define RT5682S_TDM_M_BP_INV (0x1 << >> 2) >> >> +#define RT5682S_TDM_M_LP_MASK (0x1 << 1) >> >> +#define RT5682S_TDM_M_LP_SFT 1 >> >> +#define RT5682S_TDM_M_LP_NOR (0x0 << 1) >> >> +#define RT5682S_TDM_M_LP_INV (0x1 << >> 1) >> >> +#define RT5682S_TDM_MS_MASK (0x1 << >> 0) >> >> +#define RT5682S_TDM_MS_SFT 0 >> >> +#define RT5682S_TDM_MS_S (0x0 << 0) >> >> +#define RT5682S_TDM_MS_M (0x1 << 0) >> >> + >> >> +/* Global Clock Control (0x0080) */ >> >> +#define RT5682S_SCLK_SRC_MASK (0x7 << >> 13) >> >> +#define RT5682S_SCLK_SRC_SFT 13 >> >> +#define RT5682S_PLL_SRC_MASK (0x3 >> << 8) >> >> +#define RT5682S_PLL_SRC_SFT 8 >> >> +#define RT5682S_PLL_SRC_MCLK (0x0 >> << 8) >> >> +#define RT5682S_PLL_SRC_BCLK1 (0x1 >> << 8) >> >> +#define RT5682S_PLL_SRC_RC (0x3 << 8) >> >> + >> >> +/* PLL tracking mode 1 (0x0083) */ >> >> +#define RT5682S_DA_ASRC_MASK (0x1 << >> 13) >> >> +#define RT5682S_DA_ASRC_SFT 13 >> >> +#define RT5682S_DAC_STO1_ASRC_MASK (0x1 << 12) >> >> +#define RT5682S_DAC_STO1_ASRC_SFT 12 >> >> +#define RT5682S_AD_ASRC_MASK (0x1 << >> 8) >> >> +#define RT5682S_AD_ASRC_SFT 8 >> >> +#define RT5682S_AD_ASRC_SEL_MASK (0x1 << 4) >> >> +#define RT5682S_AD_ASRC_SEL_SFT 4 >> >> +#define RT5682S_DMIC_ASRC_MASK (0x1 << 3) >> >> +#define RT5682S_DMIC_ASRC_SFT 3 >> >> +#define RT5682S_ADC_STO1_ASRC_MASK (0x1 << 2) >> >> +#define RT5682S_ADC_STO1_ASRC_SFT 2 >> >> +#define RT5682S_DA_ASRC_SEL_MASK (0x1 << 0) >> >> +#define RT5682S_DA_ASRC_SEL_SFT 0 >> >> + >> >> +/* PLL tracking mode 2 3 (0x0084)(0x0085)*/ >> >> +#define RT5682S_FILTER_CLK_SEL_MASK (0x7 << 12) >> >> +#define RT5682S_FILTER_CLK_SEL_SFT 12 >> >> +#define RT5682S_FILTER_CLK_DIV_MASK (0xf << 8) >> >> +#define RT5682S_FILTER_CLK_DIV_SFT 8 >> >> + >> >> +/* ASRC Control 4 (0x0086) */ >> >> +#define RT5682S_ASRCIN_FTK_N1_MASK (0x3 << 14) >> >> +#define RT5682S_ASRCIN_FTK_N1_SFT 14 >> >> +#define RT5682S_ASRCIN_FTK_N2_MASK (0x3 << 12) >> >> +#define RT5682S_ASRCIN_FTK_N2_SFT 12 >> >> +#define RT5682S_ASRCIN_FTK_M1_MASK (0x7 << 8) >> >> +#define RT5682S_ASRCIN_FTK_M1_SFT 8 >> >> +#define RT5682S_ASRCIN_FTK_M2_MASK (0x7 << 4) >> >> +#define RT5682S_ASRCIN_FTK_M2_SFT 4 >> >> + >> >> +/* Depop Mode Control 1 (0x008e) */ >> >> +#define RT5682S_OUT_HP_L_EN (0x1 >> << 6) >> >> +#define RT5682S_OUT_HP_R_EN (0x1 >> << 5) >> >> +#define RT5682S_LDO_PUMP_EN (0x1 << >> 4) >> >> +#define RT5682S_LDO_PUMP_EN_SFT 4 >> >> +#define RT5682S_PUMP_EN >> (0x1 << 3) >> >> +#define RT5682S_PUMP_EN_SFT 3 >> >> +#define RT5682S_CAPLESS_L_EN (0x1 >> << 1) >> >> +#define RT5682S_CAPLESS_L_EN_SFT 1 >> >> +#define RT5682S_CAPLESS_R_EN (0x1 >> << 0) >> >> +#define RT5682S_CAPLESS_R_EN_SFT 0 >> >> + >> >> +/* Depop Mode Control 2 (0x8f) */ >> >> +#define RT5682S_RAMP_MASK (0x1 >> << 12) >> >> +#define RT5682S_RAMP_SFT 12 >> >> +#define RT5682S_RAMP_DIS (0x0 << 12) >> >> +#define RT5682S_RAMP_EN >> (0x1 << 12) >> >> +#define RT5682S_BPS_MASK (0x1 << 11) >> >> +#define >> RT5682S_BPS_SFT 11 >> >> +#define >> RT5682S_BPS_DIS (0x0 << >> 11) >> >> +#define >> RT5682S_BPS_EN (0x1 << >> 11) >> >> +#define RT5682S_FAST_UPDN_MASK (0x1 << 10) >> >> +#define RT5682S_FAST_UPDN_SFT 10 >> >> +#define RT5682S_FAST_UPDN_DIS (0x0 >> << 10) >> >> +#define RT5682S_FAST_UPDN_EN (0x1 >> << 10) >> >> +#define RT5682S_VLO_MASK (0x1 << 7) >> >> +#define RT5682S_VLO_SFT >> 7 >> >> +#define >> RT5682S_VLO_3V (0x0 << 7) >> >> +#define RT5682S_VLO_33V >> (0x1 << 7) >> >> + >> >> +/* HPOUT charge pump 1 (0x0091) */ >> >> +#define RT5682S_OSW_L_MASK (0x1 >> << 11) >> >> +#define RT5682S_OSW_L_SFT 11 >> >> +#define RT5682S_OSW_L_DIS (0x0 << 11) >> >> +#define RT5682S_OSW_L_EN (0x1 << 11) >> >> +#define RT5682S_OSW_R_MASK (0x1 >> << 10) >> >> +#define RT5682S_OSW_R_SFT 10 >> >> +#define RT5682S_OSW_R_DIS (0x0 << 10) >> >> +#define RT5682S_OSW_R_EN (0x1 << 10) >> >> +#define RT5682S_PM_HP_MASK (0x3 >> << 8) >> >> +#define RT5682S_PM_HP_SFT 8 >> >> +#define RT5682S_PM_HP_LV (0x0 << 8) >> >> +#define RT5682S_PM_HP_MV (0x1 << 8) >> >> +#define RT5682S_PM_HP_HV (0x2 << 8) >> >> + >> >> +/* Micbias Control1 (0x93) */ >> >> +#define RT5682S_MIC1_OV_MASK (0x3 << >> 14) >> >> +#define RT5682S_MIC1_OV_SFT 14 >> >> +#define RT5682S_MIC1_OV_2V7 (0x0 >> << 14) >> >> +#define RT5682S_MIC1_OV_2V4 (0x1 >> << 14) >> >> +#define RT5682S_MIC1_OV_2V25 (0x3 >> << 14) >> >> +#define RT5682S_MIC1_OV_1V8 (0x4 >> << 14) >> >> +#define RT5682S_MIC2_OV_MASK (0x3 << >> 8) >> >> +#define RT5682S_MIC2_OV_SFT 8 >> >> +#define RT5682S_MIC2_OV_2V7 (0x0 >> << 8) >> >> +#define RT5682S_MIC2_OV_2V4 (0x1 >> << 8) >> >> +#define RT5682S_MIC2_OV_2V25 (0x3 >> << 8) >> >> +#define RT5682S_MIC2_OV_1V8 (0x4 >> << 8) >> >> + >> >> +/* Micbias Control2 (0x0094) */ >> >> +#define >> RT5682S_PWR_CLK25M_MASK (0x1 << 9) >> >> +#define RT5682S_PWR_CLK25M_SFT 9 >> >> +#define RT5682S_PWR_CLK25M_PD (0x0 << 9) >> >> +#define RT5682S_PWR_CLK25M_PU (0x1 << 9) >> >> +#define RT5682S_PWR_CLK1M_MASK (0x1 << 8) >> >> +#define RT5682S_PWR_CLK1M_SFT 8 >> >> +#define RT5682S_PWR_CLK1M_PD (0x0 << >> 8) >> >> +#define RT5682S_PWR_CLK1M_PU (0x1 << >> 8) >> >> + >> >> +/* PLL M/N/K Code Control 1 (0x0098) */ >> >> +#define RT5682S_PLLA_N_MASK >> (0x1ff << 0) >> >> + >> >> +/* PLL M/N/K Code Control 2 (0x0099) */ >> >> +#define RT5682S_PLLA_M_MASK (0x1f >> << 8) >> >> +#define RT5682S_PLLA_M_SFT 8 >> >> +#define RT5682S_PLLA_K_MASK >> (0x1f << 0) >> >> + >> >> +/* PLL M/N/K Code Control 3 (0x009a) */ >> >> +#define RT5682S_PLLB_N_MASK >> (0x3ff << 0) >> >> + >> >> +/* PLL M/N/K Code Control 4 (0x009b) */ >> >> +#define RT5682S_PLLB_M_MASK (0x1f >> << 8) >> >> +#define RT5682S_PLLB_M_SFT 8 >> >> +#define RT5682S_PLLB_K_MASK >> (0x1f << 0) >> >> + >> >> +/* PLL M/N/K Code Control 6 (0x009d) */ >> >> +#define RT5682S_PLLB_SEL_PS_MASK (0x1 << 13) >> >> +#define RT5682S_PLLB_SEL_PS_SFT 13 >> >> +#define RT5682S_PLLB_BYP_PS_MASK (0x1 << 12) >> >> +#define RT5682S_PLLB_BYP_PS_SFT 12 >> >> +#define RT5682S_PLLB_M_BP_MASK (0x1 << >> 11) >> >> +#define RT5682S_PLLB_M_BP_SFT 11 >> >> +#define RT5682S_PLLB_K_BP_MASK (0x1 << >> 10) >> >> +#define RT5682S_PLLB_K_BP_SFT 10 >> >> +#define RT5682S_PLLA_M_BP_MASK (0x1 << 7) >> >> +#define RT5682S_PLLA_M_BP_SFT 7 >> >> +#define RT5682S_PLLA_K_BP_MASK (0x1 << >> 6) >> >> +#define RT5682S_PLLA_K_BP_SFT 6 >> >> + >> >> +/* PLL M/N/K Code Control 7 (0x009e) */ >> >> +#define RT5682S_PLLB_SRC_MASK (0x3 << >> 0) >> >> +#define RT5682S_PLLB_SRC_DFIN (0x1) >> >> +#define RT5682S_PLLB_SRC_PLLA (0x0) >> >> + >> >> +/* RC Clock Control (0x009f) */ >> >> +#define RT5682S_POW_IRQ >> (0x1 << 15) >> >> +#define RT5682S_POW_JDH >> (0x1 << 14) >> >> + >> >> +/* I2S2 Master Mode Clock Control 1 (0x00a0) */ >> >> +#define RT5682S_I2S2_M_CLK_SRC_MASK (0x7 << 4) >> >> +#define RT5682S_I2S2_M_CLK_SRC_SFT 4 >> >> +#define RT5682S_I2S2_M_D_MASK (0xf << >> 0) >> >> +#define RT5682S_I2S2_M_D_1 (0x0) >> >> +#define RT5682S_I2S2_M_D_2 (0x1) >> >> +#define RT5682S_I2S2_M_D_3 (0x2) >> >> +#define RT5682S_I2S2_M_D_4 (0x3) >> >> +#define RT5682S_I2S2_M_D_6 (0x4) >> >> +#define RT5682S_I2S2_M_D_8 (0x5) >> >> +#define RT5682S_I2S2_M_D_12 (0x6) >> >> +#define RT5682S_I2S2_M_D_16 (0x7) >> >> +#define RT5682S_I2S2_M_D_24 (0x8) >> >> +#define RT5682S_I2S2_M_D_32 (0x9) >> >> +#define RT5682S_I2S2_M_D_48 (0xa) >> >> +#define RT5682S_I2S2_M_D_SFT 0 >> >> + >> >> +/* IRQ Control 1 (0x00b6) */ >> >> +#define RT5682S_JD1_PULSE_EN_MASK (0x1 << 10) >> >> +#define RT5682S_JD1_PULSE_EN_SFT 10 >> >> +#define RT5682S_JD1_PULSE_DIS (0x0 >> << 10) >> >> +#define RT5682S_JD1_PULSE_EN (0x1 >> << 10) >> >> + >> >> +/* IRQ Control 2 (0x00b7) */ >> >> +#define RT5682S_JD1_EN_MASK (0x1 >> << 15) >> >> +#define RT5682S_JD1_EN_SFT 15 >> >> +#define >> RT5682S_JD1_DIS (0x0 << >> 15) >> >> +#define >> RT5682S_JD1_EN (0x1 << >> 15) >> >> +#define RT5682S_JD1_POL_MASK (0x1 >> << 13) >> >> +#define RT5682S_JD1_POL_NOR (0x0 >> << 13) >> >> +#define RT5682S_JD1_POL_INV >> (0x1 << 13) >> >> +#define RT5682S_JD1_IRQ_MASK (0x1 >> << 10) >> >> +#define RT5682S_JD1_IRQ_LEV >> (0x0 << 10) >> >> +#define RT5682S_JD1_IRQ_PUL >> (0x1 << 10) >> >> + >> >> +/* IRQ Control 3 (0x00b8) */ >> >> +#define RT5682S_IL_IRQ_MASK >> (0x1 << 7) >> >> +#define RT5682S_IL_IRQ_DIS (0x0 << 7) >> >> +#define RT5682S_IL_IRQ_EN (0x1 << 7) >> >> +#define RT5682S_IL_IRQ_TYPE_MASK (0x1 << 4) >> >> +#define RT5682S_IL_IRQ_LEV (0x0 << 4) >> >> +#define RT5682S_IL_IRQ_PUL (0x1 << 4) >> >> + >> >> +/* GPIO Control 1 (0x00c0) */ >> >> +#define RT5682S_GP1_PIN_MASK (0x3 >> << 14) >> >> +#define RT5682S_GP1_PIN_SFT 14 >> >> +#define RT5682S_GP1_PIN_GPIO1 (0x0 >> << 14) >> >> +#define RT5682S_GP1_PIN_IRQ >> (0x1 << 14) >> >> +#define RT5682S_GP1_PIN_DMIC_CLK (0x2 << 14) >> >> +#define RT5682S_GP2_PIN_MASK (0x3 >> << 12) >> >> +#define RT5682S_GP2_PIN_SFT 12 >> >> +#define RT5682S_GP2_PIN_GPIO2 (0x0 >> << 12) >> >> +#define RT5682S_GP2_PIN_LRCK2 (0x1 >> << 12) >> >> +#define RT5682S_GP2_PIN_DMIC_SDA (0x2 << 12) >> >> +#define RT5682S_GP3_PIN_MASK (0x3 >> << 10) >> >> +#define RT5682S_GP3_PIN_SFT 10 >> >> +#define RT5682S_GP3_PIN_GPIO3 (0x0 >> << 10) >> >> +#define RT5682S_GP3_PIN_BCLK2 (0x1 >> << 10) >> >> +#define RT5682S_GP3_PIN_DMIC_CLK (0x2 << 10) >> >> +#define RT5682S_GP4_PIN_MASK (0x3 >> << 8) >> >> +#define RT5682S_GP4_PIN_SFT 8 >> >> +#define RT5682S_GP4_PIN_GPIO4 (0x0 >> << 8) >> >> +#define RT5682S_GP4_PIN_ADCDAT1 (0x1 << 8) >> >> +#define RT5682S_GP4_PIN_DMIC_CLK (0x2 << 8) >> >> +#define RT5682S_GP4_PIN_ADCDAT2 (0x3 << 8) >> >> +#define RT5682S_GP5_PIN_MASK (0x3 >> << 6) >> >> +#define RT5682S_GP5_PIN_SFT 6 >> >> +#define RT5682S_GP5_PIN_GPIO5 (0x0 >> << 6) >> >> +#define RT5682S_GP5_PIN_DACDAT1 (0x1 << 6) >> >> +#define RT5682S_GP5_PIN_DMIC_SDA (0x2 << 6) >> >> +#define RT5682S_GP6_PIN_MASK (0x1 >> << 5) >> >> +#define RT5682S_GP6_PIN_SFT 5 >> >> +#define RT5682S_GP6_PIN_GPIO6 (0x0 >> << 5) >> >> +#define RT5682S_GP6_PIN_LRCK1 (0x1 >> << 5) >> >> + >> >> +/* GPIO Control 2 (0x00c1)*/ >> >> +#define RT5682S_GP1_PF_MASK (0x1 >> << 15) >> >> +#define RT5682S_GP1_PF_IN (0x0 << 15) >> >> +#define RT5682S_GP1_PF_OUT >> (0x1 << 15) >> >> +#define RT5682S_GP1_OUT_MASK (0x1 << >> 14) >> >> +#define RT5682S_GP1_OUT_L (0x0 << 14) >> >> +#define RT5682S_GP1_OUT_H (0x1 << 14) >> >> +#define RT5682S_GP2_PF_MASK (0x1 >> << 13) >> >> +#define RT5682S_GP2_PF_IN (0x0 << 13) >> >> +#define RT5682S_GP2_PF_OUT >> (0x1 << 13) >> >> +#define RT5682S_GP2_OUT_MASK (0x1 << >> 12) >> >> +#define RT5682S_GP2_OUT_L (0x0 << 12) >> >> +#define RT5682S_GP2_OUT_H (0x1 << 12) >> >> +#define RT5682S_GP3_PF_MASK (0x1 >> << 11) >> >> +#define RT5682S_GP3_PF_IN (0x0 << 11) >> >> +#define RT5682S_GP3_PF_OUT >> (0x1 << 11) >> >> +#define RT5682S_GP3_OUT_MASK (0x1 << >> 10) >> >> +#define RT5682S_GP3_OUT_L (0x0 << 10) >> >> +#define RT5682S_GP3_OUT_H (0x1 << 10) >> >> +#define RT5682S_GP4_PF_MASK (0x1 >> << 9) >> >> +#define RT5682S_GP4_PF_IN (0x0 << 9) >> >> +#define RT5682S_GP4_PF_OUT >> (0x1 << 9) >> >> +#define RT5682S_GP4_OUT_MASK (0x1 << >> 8) >> >> +#define RT5682S_GP4_OUT_L (0x0 << 8) >> >> +#define RT5682S_GP4_OUT_H (0x1 << 8) >> >> +#define RT5682S_GP5_PF_MASK (0x1 >> << 7) >> >> +#define RT5682S_GP5_PF_IN (0x0 << 7) >> >> +#define RT5682S_GP5_PF_OUT >> (0x1 << 7) >> >> +#define RT5682S_GP5_OUT_MASK (0x1 << >> 6) >> >> +#define RT5682S_GP5_OUT_L (0x0 << 6) >> >> +#define RT5682S_GP5_OUT_H (0x1 << 6) >> >> +#define RT5682S_GP6_PF_MASK (0x1 >> << 5) >> >> +#define RT5682S_GP6_PF_IN (0x0 << 5) >> >> +#define RT5682S_GP6_PF_OUT >> (0x1 << 5) >> >> +#define RT5682S_GP6_OUT_MASK (0x1 << >> 4) >> >> +#define RT5682S_GP6_OUT_L (0x0 << 4) >> >> +#define RT5682S_GP6_OUT_H (0x1 << 4) >> >> + >> >> +/* GPIO Status (0x00c2) */ >> >> +#define >> RT5682S_GP6_ST (0x1 << >> 6) >> >> +#define >> RT5682S_GP5_ST (0x1 << >> 5) >> >> +#define >> RT5682S_GP4_ST (0x1 << >> 4) >> >> +#define >> RT5682S_GP3_ST (0x1 << >> 3) >> >> +#define >> RT5682S_GP2_ST (0x1 << >> 2) >> >> +#define >> RT5682S_GP1_ST (0x1 << >> 1) >> >> + >> >> +/* Soft volume and zero cross control 1 (0x00d9) */ >> >> +#define RT5682S_ZCD_MASK (0x1 << 10) >> >> +#define >> RT5682S_ZCD_SFT 10 >> >> +#define >> RT5682S_ZCD_PD (0x0 << >> 10) >> >> +#define >> RT5682S_ZCD_PU (0x1 << >> 10) >> >> + >> >> +/* 4 Button Inline Command Control 2 (0x00e3) */ >> >> +#define RT5682S_4BTN_IL_MASK (0x1 >> << 15) >> >> +#define RT5682S_4BTN_IL_EN (0x1 << 15) >> >> +#define RT5682S_4BTN_IL_DIS (0x0 << 15) >> >> +#define RT5682S_4BTN_IL_RST_MASK (0x1 << 14) >> >> +#define RT5682S_4BTN_IL_NOR (0x1 >> << 14) >> >> +#define RT5682S_4BTN_IL_RST >> (0x0 << 14) >> >> + >> >> +/* 4 Button Inline Command Control 3~6 (0x00e5~0x00e8) */ >> >> +#define RT5682S_4BTN_IL_HOLD_WIN_MASK (0x7f << 8) >> >> +#define RT5682S_4BTN_IL_HOLD_WIN_SFT 8 >> >> +#define RT5682S_4BTN_IL_CLICK_WIN_MASK (0x7f) >> >> +#define RT5682S_4BTN_IL_CLICK_WIN_SFT 0 >> >> + >> >> +/* Analog JD Control (0x00f0) */ >> >> +#define RT5682S_JDH_RS_MASK (0x1 >> << 4) >> >> +#define RT5682S_JDH_NO_PLUG (0x1 >> << 4) >> >> +#define RT5682S_JDH_PLUG (0x0 << 4) >> >> + >> >> +/* Charge Pump Internal Register1 (0x0125) */ >> >> +#define RT5682S_CP_CLK_HP_MASK (0x3 << 4) >> >> +#define RT5682S_CP_CLK_HP_100KHZ (0x0 << 4) >> >> +#define RT5682S_CP_CLK_HP_200KHZ (0x1 << 4) >> >> +#define RT5682S_CP_CLK_HP_300KHZ (0x2 << 4) >> >> +#define RT5682S_CP_CLK_HP_600KHZ (0x3 << 4) >> >> + >> >> +/* Pad Driving Control (0x0136) */ >> >> +#define RT5682S_PAD_DRV_GP1_MASK (0x1 << 14) >> >> +#define RT5682S_PAD_DRV_GP1_HIGH (0x1 << 14) >> >> +#define >> RT5682S_PAD_DRV_GP1_LOW (0x0 << >> 14) >> >> +#define RT5682S_PAD_DRV_GP2_MASK (0x1 << 12) >> >> +#define RT5682S_PAD_DRV_GP2_HIGH (0x1 << 12) >> >> +#define >> RT5682S_PAD_DRV_GP2_LOW (0x0 << >> 12) >> >> +#define RT5682S_PAD_DRV_GP3_MASK (0x1 << 10) >> >> +#define RT5682S_PAD_DRV_GP3_HIGH (0x1 << 10) >> >> +#define >> RT5682S_PAD_DRV_GP3_LOW (0x0 << >> 10) >> >> +#define RT5682S_PAD_DRV_GP4_MASK (0x1 << 8) >> >> +#define RT5682S_PAD_DRV_GP4_HIGH (0x1 << 8) >> >> +#define >> RT5682S_PAD_DRV_GP4_LOW (0x0 << 8) >> >> +#define RT5682S_PAD_DRV_GP5_MASK (0x1 << 6) >> >> +#define RT5682S_PAD_DRV_GP5_HIGH (0x1 << 6) >> >> +#define >> RT5682S_PAD_DRV_GP5_LOW (0x0 << 6) >> >> +#define RT5682S_PAD_DRV_GP6_MASK (0x1 << 4) >> >> +#define RT5682S_PAD_DRV_GP6_HIGH (0x1 << 4) >> >> +#define >> RT5682S_PAD_DRV_GP6_LOW (0x0 << 4) >> >> + >> >> +/* Chopper and Clock control for DAC (0x013a)*/ >> >> +#define RT5682S_CKXEN_DAC1_MASK (0x1 << 13) >> >> +#define RT5682S_CKXEN_DAC1_SFT 13 >> >> +#define RT5682S_CKGEN_DAC1_MASK (0x1 << 12) >> >> +#define RT5682S_CKGEN_DAC1_SFT 12 >> >> + >> >> +/* Chopper and Clock control for ADC (0x013b)*/ >> >> +#define RT5682S_CKXEN_ADC1_MASK (0x1 << 13) >> >> +#define RT5682S_CKXEN_ADC1_SFT 13 >> >> +#define RT5682S_CKGEN_ADC1_MASK (0x1 << 12) >> >> +#define RT5682S_CKGEN_ADC1_SFT 12 >> >> + >> >> +/* Volume test (0x013f)*/ >> >> +#define RT5682S_SEL_CLK_VOL_MASK (0x1 << 15) >> >> +#define RT5682S_SEL_CLK_VOL_EN (0x1 << >> 15) >> >> +#define RT5682S_SEL_CLK_VOL_DIS (0x0 << >> 15) >> >> + >> >> +/* Test Mode Control 1 (0x0145) */ >> >> +#define RT5682S_AD2DA_LB_MASK (0x1 << >> 10) >> >> +#define RT5682S_AD2DA_LB_SFT 10 >> >> + >> >> +/* Stereo Noise Gate Control 1 (0x0160) */ >> >> +#define RT5682S_NG2_EN_MASK (0x1 >> << 15) >> >> +#define RT5682S_NG2_EN >> (0x1 << 15) >> >> +#define RT5682S_NG2_DIS >> (0x0 << 15) >> >> + >> >> +/* Stereo1 DAC Silence Detection Control (0x0190) */ >> >> +#define RT5682S_DEB_STO_DAC_MASK (0x7 << 4) >> >> +#define RT5682S_DEB_80_MS (0x0 << 4) >> >> + >> >> +/* HP Behavior Logic Control 2 (0x01db) */ >> >> +#define RT5682S_HP_SIG_SRC_MASK (0x3) >> >> +#define RT5682S_HP_SIG_SRC_1BIT_CTL (0x3) >> >> +#define RT5682S_HP_SIG_SRC_REG (0x2) >> >> +#define RT5682S_HP_SIG_SRC_IMPE_REG (0x1) >> >> +#define RT5682S_HP_SIG_SRC_DC_CALI (0x0) >> >> + >> >> +/* SAR ADC Inline Command Control 1 (0x0210) */ >> >> +#define RT5682S_SAR_BUTDET_MASK (0x1 << 15) >> >> +#define RT5682S_SAR_BUTDET_EN (0x1 << >> 15) >> >> +#define RT5682S_SAR_BUTDET_DIS (0x0 << >> 15) >> >> +#define RT5682S_SAR_BUTDET_POW_MASK (0x1 << 14) >> >> +#define RT5682S_SAR_BUTDET_POW_SAV (0x1 << 14) >> >> +#define RT5682S_SAR_BUTDET_POW_NORM (0x0 << 14) >> >> +#define RT5682S_SAR_BUTDET_RST_MASK (0x1 << 13) >> >> +#define RT5682S_SAR_BUTDET_RST_NORM (0x1 << 13) >> >> +#define RT5682S_SAR_BUTDET_RST (0x0 << >> 13) >> >> +#define RT5682S_SAR_POW_MASK (0x1 << >> 12) >> >> +#define RT5682S_SAR_POW_EN (0x1 >> << 12) >> >> +#define RT5682S_SAR_POW_DIS (0x0 >> << 12) >> >> +#define RT5682S_SAR_RST_MASK (0x1 >> << 11) >> >> +#define RT5682S_SAR_RST_NORMAL (0x1 << 11) >> >> +#define >> RT5682S_SAR_RST (0x0 << >> 11) >> >> +#define RT5682S_SAR_BYPASS_MASK (0x1 << 10) >> >> +#define RT5682S_SAR_BYPASS_EN (0x1 >> << 10) >> >> +#define RT5682S_SAR_BYPASS_DIS (0x0 >> << 10) >> >> +#define RT5682S_SAR_SEL_MB1_2_MASK (0x3 << 8) >> >> +#define RT5682S_SAR_SEL_MB1_2_SFT 8 >> >> +#define RT5682S_SAR_SEL_MODE_MASK (0x1 << 7) >> >> +#define RT5682S_SAR_SEL_MODE_CMP (0x1 << 7) >> >> +#define RT5682S_SAR_SEL_MODE_ADC (0x0 << 7) >> >> +#define RT5682S_SAR_SEL_MB1_2_CTL_MASK (0x1 << 5) >> >> +#define RT5682S_SAR_SEL_MB1_2_AUTO (0x1 << 5) >> >> +#define RT5682S_SAR_SEL_MB1_2_MANU (0x0 << 5) >> >> +#define RT5682S_SAR_SEL_SIGNAL_MASK (0x1 << 4) >> >> +#define RT5682S_SAR_SEL_SIGNAL_AUTO (0x1 << 4) >> >> +#define RT5682S_SAR_SEL_SIGNAL_MANU (0x0 << 4) >> >> + >> >> +/* SAR ADC Inline Command Control 2 (0x0211) */ >> >> +#define RT5682S_SAR_ADC_PSV_MASK (0x1 << 4) >> >> +#define RT5682S_SAR_ADC_PSV_ENTRY (0x1 << 4) >> >> + >> >> + >> >> +/* SAR ADC Inline Command Control 13 (0x021c) */ >> >> +#define RT5682S_SAR_SOUR_MASK (0x3f) >> >> +#define RT5682S_SAR_SOUR_BTN (0x3f) >> >> +#define RT5682S_SAR_SOUR_TYPE (0x0) >> >> + >> >> + >> >> +#define RT5682S_STEREO_RATES SNDRV_PCM_RATE_8000_192000 >> >> +#define RT5682S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | >> SNDRV_PCM_FMTBIT_S20_3LE | \ >> >> + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8) >> >> + >> >> +/* System Clock Source */ >> >> +enum { >> >> + RT5682S_SCLK_S_MCLK, >> >> + RT5682S_SCLK_S_PLL1, >> >> + RT5682S_SCLK_S_PLL2, >> >> + RT5682S_SCLK_S_RCCLK, >> >> +}; >> >> + >> >> +/* PLL Source */ >> >> +enum { >> >> + RT5682S_PLL_S_MCLK, >> >> + RT5682S_PLL_S_BCLK1, >> >> + RT5682S_PLL_S_BCLK2, >> >> + RT5682S_PLL_S_RCCLK, >> >> +}; >> >> + >> >> +enum { >> >> + RT5682S_PLL1, >> >> + RT5682S_PLL2, >> >> + RT5682S_PLLS, >> >> +}; >> >> + >> >> +enum { >> >> + RT5682S_AIF1, >> >> + RT5682S_AIF2, >> >> + RT5682S_AIFS >> >> +}; >> >> + >> >> +/* filter mask */ >> >> +enum { >> >> + RT5682S_DA_STEREO1_FILTER = 0x1, >> >> + RT5682S_AD_STEREO1_FILTER = (0x1 << 1), >> >> +}; >> >> + >> >> +enum { >> >> + RT5682S_CLK_SEL_SYS, >> >> + RT5682S_CLK_SEL_I2S1_ASRC, >> >> + RT5682S_CLK_SEL_I2S2_ASRC, >> >> +}; >> >> + >> >> +enum { >> >> + USE_PLLA, >> >> + USE_PLLB, >> >> + USE_PLLAB, >> >> +}; >> >> + >> >> +struct pll_calc_map { >> >> + unsigned int freq_in; >> >> + unsigned int freq_out; >> >> + int m; >> >> + int n; >> >> + int k; >> >> + bool m_bp; >> >> + bool k_bp; >> >> + bool byp_ps; >> >> + bool sel_ps; >> >> +}; >> >> + >> >> +#define RT5682S_NUM_SUPPLIES 2 >> >> + >> >> +struct rt5682s_priv { >> >> + struct snd_soc_component *component; >> >> + struct rt5682s_platform_data pdata; >> >> + struct regmap *regmap; >> >> + struct snd_soc_jack *hs_jack; >> >> + struct regulator_bulk_data supplies[RT5682S_NUM_SUPPLIES]; >> >> + struct delayed_work jack_detect_work; >> >> + struct delayed_work jd_check_work; >> >> + struct mutex calibrate_mutex; >> >> + struct mutex sar_mutex; >> >> + >> >> +#ifdef CONFIG_COMMON_CLK >> >> + struct clk_hw dai_clks_hw[RT5682S_DAI_NUM_CLKS]; >> >> + struct clk *mclk; >> >> +#endif >> >> + >> >> + int sysclk; >> >> + int sysclk_src; >> >> + int lrck[RT5682S_AIFS]; >> >> + int bclk[RT5682S_AIFS]; >> >> + int master[RT5682S_AIFS]; >> >> + >> >> + int pll_src[RT5682S_PLLS]; >> >> + int pll_in[RT5682S_PLLS]; >> >> + int pll_out[RT5682S_PLLS]; >> >> + int pll_comb; >> >> + >> >> + int jack_type; >> >> + int irq_work_delay_time; >> >> +}; >> >> + >> >> +int rt5682s_sel_asrc_clk_src(struct snd_soc_component *component, >> >> + unsigned int filter_mask, unsigned int >> clk_src); >> >> + >> >> +#endif /* __RT5682S_H__ */ >> >> -- >> >> 2.17.1 >> >> >> >