18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) ST-Ericsson SA 2012
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Author: Ola Lilja <ola.o.lilja@stericsson.com>,
68c2ecf20Sopenharmony_ci *         Kristoffer Karlsson <kristoffer.karlsson@stericsson.com>,
78c2ecf20Sopenharmony_ci *         Roger Nilsson <roger.xr.nilsson@stericsson.com>,
88c2ecf20Sopenharmony_ci *         for ST-Ericsson.
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci *         Based on the early work done by:
118c2ecf20Sopenharmony_ci *         Mikko J. Lehto <mikko.lehto@symbio.com>,
128c2ecf20Sopenharmony_ci *         Mikko Sarmanne <mikko.sarmanne@symbio.com>,
138c2ecf20Sopenharmony_ci *         Jarmo K. Kuronen <jarmo.kuronen@symbio.com>,
148c2ecf20Sopenharmony_ci *         for ST-Ericsson.
158c2ecf20Sopenharmony_ci *
168c2ecf20Sopenharmony_ci * License terms:
178c2ecf20Sopenharmony_ci */
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#include <linux/kernel.h>
208c2ecf20Sopenharmony_ci#include <linux/module.h>
218c2ecf20Sopenharmony_ci#include <linux/device.h>
228c2ecf20Sopenharmony_ci#include <linux/slab.h>
238c2ecf20Sopenharmony_ci#include <linux/moduleparam.h>
248c2ecf20Sopenharmony_ci#include <linux/init.h>
258c2ecf20Sopenharmony_ci#include <linux/delay.h>
268c2ecf20Sopenharmony_ci#include <linux/pm.h>
278c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
288c2ecf20Sopenharmony_ci#include <linux/mutex.h>
298c2ecf20Sopenharmony_ci#include <linux/mfd/abx500/ab8500.h>
308c2ecf20Sopenharmony_ci#include <linux/mfd/abx500.h>
318c2ecf20Sopenharmony_ci#include <linux/mfd/abx500/ab8500-sysctrl.h>
328c2ecf20Sopenharmony_ci#include <linux/mfd/abx500/ab8500-codec.h>
338c2ecf20Sopenharmony_ci#include <linux/regulator/consumer.h>
348c2ecf20Sopenharmony_ci#include <linux/of.h>
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#include <sound/core.h>
378c2ecf20Sopenharmony_ci#include <sound/pcm.h>
388c2ecf20Sopenharmony_ci#include <sound/pcm_params.h>
398c2ecf20Sopenharmony_ci#include <sound/initval.h>
408c2ecf20Sopenharmony_ci#include <sound/soc.h>
418c2ecf20Sopenharmony_ci#include <sound/soc-dapm.h>
428c2ecf20Sopenharmony_ci#include <sound/tlv.h>
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#include "ab8500-codec.h"
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci/* Macrocell value definitions */
478c2ecf20Sopenharmony_ci#define CLK_32K_OUT2_DISABLE			0x01
488c2ecf20Sopenharmony_ci#define INACTIVE_RESET_AUDIO			0x02
498c2ecf20Sopenharmony_ci#define ENABLE_AUDIO_CLK_TO_AUDIO_BLK		0x10
508c2ecf20Sopenharmony_ci#define ENABLE_VINTCORE12_SUPPLY		0x04
518c2ecf20Sopenharmony_ci#define GPIO27_DIR_OUTPUT			0x04
528c2ecf20Sopenharmony_ci#define GPIO29_DIR_OUTPUT			0x10
538c2ecf20Sopenharmony_ci#define GPIO31_DIR_OUTPUT			0x40
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci/* Macrocell register definitions */
568c2ecf20Sopenharmony_ci#define AB8500_GPIO_DIR4_REG			0x13 /* Bank AB8500_MISC */
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci/* Nr of FIR/IIR-coeff banks in ANC-block */
598c2ecf20Sopenharmony_ci#define AB8500_NR_OF_ANC_COEFF_BANKS		2
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci/* Minimum duration to keep ANC IIR Init bit high or
628c2ecf20Sopenharmony_cilow before proceeding with the configuration sequence */
638c2ecf20Sopenharmony_ci#define AB8500_ANC_SM_DELAY			2000
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci#define AB8500_FILTER_CONTROL(xname, xcount, xmin, xmax) \
668c2ecf20Sopenharmony_ci{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
678c2ecf20Sopenharmony_ci	.info = filter_control_info, \
688c2ecf20Sopenharmony_ci	.get = filter_control_get, .put = filter_control_put, \
698c2ecf20Sopenharmony_ci	.private_value = (unsigned long)&(struct filter_control) \
708c2ecf20Sopenharmony_ci		{.count = xcount, .min = xmin, .max = xmax} }
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistruct filter_control {
738c2ecf20Sopenharmony_ci	long min, max;
748c2ecf20Sopenharmony_ci	unsigned int count;
758c2ecf20Sopenharmony_ci	long value[128];
768c2ecf20Sopenharmony_ci};
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci/* Sidetone states */
798c2ecf20Sopenharmony_cistatic const char * const enum_sid_state[] = {
808c2ecf20Sopenharmony_ci	"Unconfigured",
818c2ecf20Sopenharmony_ci	"Apply FIR",
828c2ecf20Sopenharmony_ci	"FIR is configured",
838c2ecf20Sopenharmony_ci};
848c2ecf20Sopenharmony_cienum sid_state {
858c2ecf20Sopenharmony_ci	SID_UNCONFIGURED = 0,
868c2ecf20Sopenharmony_ci	SID_APPLY_FIR = 1,
878c2ecf20Sopenharmony_ci	SID_FIR_CONFIGURED = 2,
888c2ecf20Sopenharmony_ci};
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_cistatic const char * const enum_anc_state[] = {
918c2ecf20Sopenharmony_ci	"Unconfigured",
928c2ecf20Sopenharmony_ci	"Apply FIR and IIR",
938c2ecf20Sopenharmony_ci	"FIR and IIR are configured",
948c2ecf20Sopenharmony_ci	"Apply FIR",
958c2ecf20Sopenharmony_ci	"FIR is configured",
968c2ecf20Sopenharmony_ci	"Apply IIR",
978c2ecf20Sopenharmony_ci	"IIR is configured"
988c2ecf20Sopenharmony_ci};
998c2ecf20Sopenharmony_cienum anc_state {
1008c2ecf20Sopenharmony_ci	ANC_UNCONFIGURED = 0,
1018c2ecf20Sopenharmony_ci	ANC_APPLY_FIR_IIR = 1,
1028c2ecf20Sopenharmony_ci	ANC_FIR_IIR_CONFIGURED = 2,
1038c2ecf20Sopenharmony_ci	ANC_APPLY_FIR = 3,
1048c2ecf20Sopenharmony_ci	ANC_FIR_CONFIGURED = 4,
1058c2ecf20Sopenharmony_ci	ANC_APPLY_IIR = 5,
1068c2ecf20Sopenharmony_ci	ANC_IIR_CONFIGURED = 6
1078c2ecf20Sopenharmony_ci};
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci/* Analog microphones */
1108c2ecf20Sopenharmony_cienum amic_idx {
1118c2ecf20Sopenharmony_ci	AMIC_IDX_1A,
1128c2ecf20Sopenharmony_ci	AMIC_IDX_1B,
1138c2ecf20Sopenharmony_ci	AMIC_IDX_2
1148c2ecf20Sopenharmony_ci};
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_cistruct ab8500_codec_drvdata_dbg {
1178c2ecf20Sopenharmony_ci	struct regulator *vaud;
1188c2ecf20Sopenharmony_ci	struct regulator *vamic1;
1198c2ecf20Sopenharmony_ci	struct regulator *vamic2;
1208c2ecf20Sopenharmony_ci	struct regulator *vdmic;
1218c2ecf20Sopenharmony_ci};
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci/* Private data for AB8500 device-driver */
1248c2ecf20Sopenharmony_cistruct ab8500_codec_drvdata {
1258c2ecf20Sopenharmony_ci	struct regmap *regmap;
1268c2ecf20Sopenharmony_ci	struct mutex ctrl_lock;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	/* Sidetone */
1298c2ecf20Sopenharmony_ci	long *sid_fir_values;
1308c2ecf20Sopenharmony_ci	enum sid_state sid_status;
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci	/* ANC */
1338c2ecf20Sopenharmony_ci	long *anc_fir_values;
1348c2ecf20Sopenharmony_ci	long *anc_iir_values;
1358c2ecf20Sopenharmony_ci	enum anc_state anc_status;
1368c2ecf20Sopenharmony_ci};
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_cistatic inline const char *amic_micbias_str(enum amic_micbias micbias)
1398c2ecf20Sopenharmony_ci{
1408c2ecf20Sopenharmony_ci	switch (micbias) {
1418c2ecf20Sopenharmony_ci	case AMIC_MICBIAS_VAMIC1:
1428c2ecf20Sopenharmony_ci		return "VAMIC1";
1438c2ecf20Sopenharmony_ci	case AMIC_MICBIAS_VAMIC2:
1448c2ecf20Sopenharmony_ci		return "VAMIC2";
1458c2ecf20Sopenharmony_ci	default:
1468c2ecf20Sopenharmony_ci		return "Unknown";
1478c2ecf20Sopenharmony_ci	}
1488c2ecf20Sopenharmony_ci}
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_cistatic inline const char *amic_type_str(enum amic_type type)
1518c2ecf20Sopenharmony_ci{
1528c2ecf20Sopenharmony_ci	switch (type) {
1538c2ecf20Sopenharmony_ci	case AMIC_TYPE_DIFFERENTIAL:
1548c2ecf20Sopenharmony_ci		return "DIFFERENTIAL";
1558c2ecf20Sopenharmony_ci	case AMIC_TYPE_SINGLE_ENDED:
1568c2ecf20Sopenharmony_ci		return "SINGLE ENDED";
1578c2ecf20Sopenharmony_ci	default:
1588c2ecf20Sopenharmony_ci		return "Unknown";
1598c2ecf20Sopenharmony_ci	}
1608c2ecf20Sopenharmony_ci}
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci/*
1638c2ecf20Sopenharmony_ci * Read'n'write functions
1648c2ecf20Sopenharmony_ci */
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci/* Read a register from the audio-bank of AB8500 */
1678c2ecf20Sopenharmony_cistatic int ab8500_codec_read_reg(void *context, unsigned int reg,
1688c2ecf20Sopenharmony_ci				 unsigned int *value)
1698c2ecf20Sopenharmony_ci{
1708c2ecf20Sopenharmony_ci	struct device *dev = context;
1718c2ecf20Sopenharmony_ci	int status;
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci	u8 value8;
1748c2ecf20Sopenharmony_ci	status = abx500_get_register_interruptible(dev, AB8500_AUDIO,
1758c2ecf20Sopenharmony_ci						   reg, &value8);
1768c2ecf20Sopenharmony_ci	*value = (unsigned int)value8;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	return status;
1798c2ecf20Sopenharmony_ci}
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci/* Write to a register in the audio-bank of AB8500 */
1828c2ecf20Sopenharmony_cistatic int ab8500_codec_write_reg(void *context, unsigned int reg,
1838c2ecf20Sopenharmony_ci				  unsigned int value)
1848c2ecf20Sopenharmony_ci{
1858c2ecf20Sopenharmony_ci	struct device *dev = context;
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	return abx500_set_register_interruptible(dev, AB8500_AUDIO,
1888c2ecf20Sopenharmony_ci						 reg, value);
1898c2ecf20Sopenharmony_ci}
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_cistatic const struct regmap_config ab8500_codec_regmap = {
1928c2ecf20Sopenharmony_ci	.reg_read = ab8500_codec_read_reg,
1938c2ecf20Sopenharmony_ci	.reg_write = ab8500_codec_write_reg,
1948c2ecf20Sopenharmony_ci};
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci/*
1978c2ecf20Sopenharmony_ci * Controls - DAPM
1988c2ecf20Sopenharmony_ci */
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci/* Earpiece */
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci/* Earpiece source selector */
2038c2ecf20Sopenharmony_cistatic const char * const enum_ear_lineout_source[] = {"Headset Left",
2048c2ecf20Sopenharmony_ci						"Speaker Left"};
2058c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_ear_lineout_source, AB8500_DMICFILTCONF,
2068c2ecf20Sopenharmony_ci			AB8500_DMICFILTCONF_DA3TOEAR, enum_ear_lineout_source);
2078c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_ear_lineout_source =
2088c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Earpiece or LineOut Mono Source",
2098c2ecf20Sopenharmony_ci		dapm_enum_ear_lineout_source);
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci/* LineOut */
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci/* LineOut source selector */
2148c2ecf20Sopenharmony_cistatic const char * const enum_lineout_source[] = {"Mono Path", "Stereo Path"};
2158c2ecf20Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(dapm_enum_lineout_source, AB8500_ANACONF5,
2168c2ecf20Sopenharmony_ci			AB8500_ANACONF5_HSLDACTOLOL,
2178c2ecf20Sopenharmony_ci			AB8500_ANACONF5_HSRDACTOLOR, enum_lineout_source);
2188c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_lineout_source[] = {
2198c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("LineOut Source", dapm_enum_lineout_source),
2208c2ecf20Sopenharmony_ci};
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci/* Handsfree */
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci/* Speaker Left - ANC selector */
2258c2ecf20Sopenharmony_cistatic const char * const enum_HFx_sel[] = {"Audio Path", "ANC"};
2268c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_HFl_sel, AB8500_DIGMULTCONF2,
2278c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF2_HFLSEL, enum_HFx_sel);
2288c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_HFl_select[] = {
2298c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Speaker Left Source", dapm_enum_HFl_sel),
2308c2ecf20Sopenharmony_ci};
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci/* Speaker Right - ANC selector */
2338c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_HFr_sel, AB8500_DIGMULTCONF2,
2348c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF2_HFRSEL, enum_HFx_sel);
2358c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_HFr_select[] = {
2368c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Speaker Right Source", dapm_enum_HFr_sel),
2378c2ecf20Sopenharmony_ci};
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_ci/* Mic 1 */
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci/* Mic 1 - Mic 1a or 1b selector */
2428c2ecf20Sopenharmony_cistatic const char * const enum_mic1ab_sel[] = {"Mic 1b", "Mic 1a"};
2438c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_mic1ab_sel, AB8500_ANACONF3,
2448c2ecf20Sopenharmony_ci			AB8500_ANACONF3_MIC1SEL, enum_mic1ab_sel);
2458c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_mic1ab_mux[] = {
2468c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Mic 1a or 1b Select", dapm_enum_mic1ab_sel),
2478c2ecf20Sopenharmony_ci};
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci/* Mic 1 - AD3 - Mic 1 or DMic 3 selector */
2508c2ecf20Sopenharmony_cistatic const char * const enum_ad3_sel[] = {"Mic 1", "DMic 3"};
2518c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_ad3_sel, AB8500_DIGMULTCONF1,
2528c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF1_AD3SEL, enum_ad3_sel);
2538c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_ad3_select[] = {
2548c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("AD3 Source Select", dapm_enum_ad3_sel),
2558c2ecf20Sopenharmony_ci};
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci/* Mic 1 - AD6 - Mic 1 or DMic 6 selector */
2588c2ecf20Sopenharmony_cistatic const char * const enum_ad6_sel[] = {"Mic 1", "DMic 6"};
2598c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_ad6_sel, AB8500_DIGMULTCONF1,
2608c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF1_AD6SEL, enum_ad6_sel);
2618c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_ad6_select[] = {
2628c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("AD6 Source Select", dapm_enum_ad6_sel),
2638c2ecf20Sopenharmony_ci};
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci/* Mic 2 */
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci/* Mic 2 - AD5 - Mic 2 or DMic 5 selector */
2688c2ecf20Sopenharmony_cistatic const char * const enum_ad5_sel[] = {"Mic 2", "DMic 5"};
2698c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_ad5_sel, AB8500_DIGMULTCONF1,
2708c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF1_AD5SEL, enum_ad5_sel);
2718c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_ad5_select[] = {
2728c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("AD5 Source Select", dapm_enum_ad5_sel),
2738c2ecf20Sopenharmony_ci};
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci/* LineIn */
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci/* LineIn left - AD1 - LineIn Left or DMic 1 selector */
2788c2ecf20Sopenharmony_cistatic const char * const enum_ad1_sel[] = {"LineIn Left", "DMic 1"};
2798c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_ad1_sel, AB8500_DIGMULTCONF1,
2808c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF1_AD1SEL, enum_ad1_sel);
2818c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_ad1_select[] = {
2828c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("AD1 Source Select", dapm_enum_ad1_sel),
2838c2ecf20Sopenharmony_ci};
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci/* LineIn right - Mic 2 or LineIn Right selector */
2868c2ecf20Sopenharmony_cistatic const char * const enum_mic2lr_sel[] = {"Mic 2", "LineIn Right"};
2878c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_mic2lr_sel, AB8500_ANACONF3,
2888c2ecf20Sopenharmony_ci			AB8500_ANACONF3_LINRSEL, enum_mic2lr_sel);
2898c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_mic2lr_select[] = {
2908c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Mic 2 or LINR Select", dapm_enum_mic2lr_sel),
2918c2ecf20Sopenharmony_ci};
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ci/* LineIn right - AD2 - LineIn Right or DMic2 selector */
2948c2ecf20Sopenharmony_cistatic const char * const enum_ad2_sel[] = {"LineIn Right", "DMic 2"};
2958c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_ad2_sel, AB8500_DIGMULTCONF1,
2968c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF1_AD2SEL, enum_ad2_sel);
2978c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_ad2_select[] = {
2988c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("AD2 Source Select", dapm_enum_ad2_sel),
2998c2ecf20Sopenharmony_ci};
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci/* ANC */
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_cistatic const char * const enum_anc_in_sel[] = {"Mic 1 / DMic 6",
3058c2ecf20Sopenharmony_ci					"Mic 2 / DMic 5"};
3068c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_anc_in_sel, AB8500_DMICFILTCONF,
3078c2ecf20Sopenharmony_ci			AB8500_DMICFILTCONF_ANCINSEL, enum_anc_in_sel);
3088c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_anc_in_select[] = {
3098c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("ANC Source", dapm_enum_anc_in_sel),
3108c2ecf20Sopenharmony_ci};
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_ci/* ANC - Enable/Disable */
3138c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_anc_enable[] = {
3148c2ecf20Sopenharmony_ci	SOC_DAPM_SINGLE("Switch", AB8500_ANCCONF1,
3158c2ecf20Sopenharmony_ci			AB8500_ANCCONF1_ENANC, 0, 0),
3168c2ecf20Sopenharmony_ci};
3178c2ecf20Sopenharmony_ci
3188c2ecf20Sopenharmony_ci/* ANC to Earpiece - Mute */
3198c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_anc_ear_mute[] = {
3208c2ecf20Sopenharmony_ci	SOC_DAPM_SINGLE("Switch", AB8500_DIGMULTCONF1,
3218c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF1_ANCSEL, 1, 0),
3228c2ecf20Sopenharmony_ci};
3238c2ecf20Sopenharmony_ci
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ci/* Sidetone left */
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci/* Sidetone left - Input selector */
3298c2ecf20Sopenharmony_cistatic const char * const enum_stfir1_in_sel[] = {
3308c2ecf20Sopenharmony_ci	"LineIn Left", "LineIn Right", "Mic 1", "Headset Left"
3318c2ecf20Sopenharmony_ci};
3328c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_stfir1_in_sel, AB8500_DIGMULTCONF2,
3338c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF2_FIRSID1SEL, enum_stfir1_in_sel);
3348c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_stfir1_in_select[] = {
3358c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Sidetone Left Source", dapm_enum_stfir1_in_sel),
3368c2ecf20Sopenharmony_ci};
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci/* Sidetone right path */
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_ci/* Sidetone right - Input selector */
3418c2ecf20Sopenharmony_cistatic const char * const enum_stfir2_in_sel[] = {
3428c2ecf20Sopenharmony_ci	"LineIn Right", "Mic 1", "DMic 4", "Headset Right"
3438c2ecf20Sopenharmony_ci};
3448c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_stfir2_in_sel, AB8500_DIGMULTCONF2,
3458c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF2_FIRSID2SEL, enum_stfir2_in_sel);
3468c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_stfir2_in_select[] = {
3478c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Sidetone Right Source", dapm_enum_stfir2_in_sel),
3488c2ecf20Sopenharmony_ci};
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci/* Vibra */
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_cistatic const char * const enum_pwm2vibx[] = {"Audio Path", "PWM Generator"};
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib1, AB8500_PWMGENCONF1,
3558c2ecf20Sopenharmony_ci			AB8500_PWMGENCONF1_PWMTOVIB1, enum_pwm2vibx);
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_pwm2vib1[] = {
3588c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Vibra 1 Controller", dapm_enum_pwm2vib1),
3598c2ecf20Sopenharmony_ci};
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib2, AB8500_PWMGENCONF1,
3628c2ecf20Sopenharmony_ci			AB8500_PWMGENCONF1_PWMTOVIB2, enum_pwm2vibx);
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new dapm_pwm2vib2[] = {
3658c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM("Vibra 2 Controller", dapm_enum_pwm2vib2),
3668c2ecf20Sopenharmony_ci};
3678c2ecf20Sopenharmony_ci
3688c2ecf20Sopenharmony_ci/*
3698c2ecf20Sopenharmony_ci * DAPM-widgets
3708c2ecf20Sopenharmony_ci */
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
3738c2ecf20Sopenharmony_ci
3748c2ecf20Sopenharmony_ci	/* Clocks */
3758c2ecf20Sopenharmony_ci	SND_SOC_DAPM_CLOCK_SUPPLY("audioclk"),
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci	/* Regulators */
3788c2ecf20Sopenharmony_ci	SND_SOC_DAPM_REGULATOR_SUPPLY("V-AUD", 0, 0),
3798c2ecf20Sopenharmony_ci	SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC1", 0, 0),
3808c2ecf20Sopenharmony_ci	SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC2", 0, 0),
3818c2ecf20Sopenharmony_ci	SND_SOC_DAPM_REGULATOR_SUPPLY("V-DMIC", 0, 0),
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	/* Power */
3848c2ecf20Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("Audio Power",
3858c2ecf20Sopenharmony_ci			AB8500_POWERUP, AB8500_POWERUP_POWERUP, 0,
3868c2ecf20Sopenharmony_ci			NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
3878c2ecf20Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("Audio Analog Power",
3888c2ecf20Sopenharmony_ci			AB8500_POWERUP, AB8500_POWERUP_ENANA, 0,
3898c2ecf20Sopenharmony_ci			NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_ci	/* Main supply node */
3928c2ecf20Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("Main Supply", SND_SOC_NOPM, 0, 0,
3938c2ecf20Sopenharmony_ci			NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
3948c2ecf20Sopenharmony_ci
3958c2ecf20Sopenharmony_ci	/* DA/AD */
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("ADC Input"),
3988c2ecf20Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC", "ab8500_0c", SND_SOC_NOPM, 0, 0),
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0),
4018c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("DAC Output"),
4028c2ecf20Sopenharmony_ci
4038c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("DA_IN1", NULL, 0, SND_SOC_NOPM, 0, 0),
4048c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("DA_IN2", NULL, 0, SND_SOC_NOPM, 0, 0),
4058c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("DA_IN3", NULL, 0, SND_SOC_NOPM, 0, 0),
4068c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("DA_IN4", NULL, 0, SND_SOC_NOPM, 0, 0),
4078c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("DA_IN5", NULL, 0, SND_SOC_NOPM, 0, 0),
4088c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("DA_IN6", NULL, 0, SND_SOC_NOPM, 0, 0),
4098c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AD_OUT1", NULL, 0, SND_SOC_NOPM, 0, 0),
4108c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AD_OUT2", NULL, 0, SND_SOC_NOPM, 0, 0),
4118c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AD_OUT3", NULL, 0, SND_SOC_NOPM, 0, 0),
4128c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AD_OUT4", NULL, 0, SND_SOC_NOPM, 0, 0),
4138c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AD_OUT57", NULL, 0, SND_SOC_NOPM, 0, 0),
4148c2ecf20Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AD_OUT68", NULL, 0, SND_SOC_NOPM, 0, 0),
4158c2ecf20Sopenharmony_ci
4168c2ecf20Sopenharmony_ci	/* Headset path */
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("Charge Pump", AB8500_ANACONF5,
4198c2ecf20Sopenharmony_ci			AB8500_ANACONF5_ENCPHS, 0, NULL, 0),
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci	SND_SOC_DAPM_DAC("DA1 Enable", "ab8500_0p",
4228c2ecf20Sopenharmony_ci			AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA1, 0),
4238c2ecf20Sopenharmony_ci	SND_SOC_DAPM_DAC("DA2 Enable", "ab8500_0p",
4248c2ecf20Sopenharmony_ci			AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA2, 0),
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci	SND_SOC_DAPM_PGA("HSL Digital Volume", SND_SOC_NOPM, 0, 0,
4278c2ecf20Sopenharmony_ci			NULL, 0),
4288c2ecf20Sopenharmony_ci	SND_SOC_DAPM_PGA("HSR Digital Volume", SND_SOC_NOPM, 0, 0,
4298c2ecf20Sopenharmony_ci			NULL, 0),
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_ci	SND_SOC_DAPM_DAC("HSL DAC", "ab8500_0p",
4328c2ecf20Sopenharmony_ci			AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHSL, 0),
4338c2ecf20Sopenharmony_ci	SND_SOC_DAPM_DAC("HSR DAC", "ab8500_0p",
4348c2ecf20Sopenharmony_ci			AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHSR, 0),
4358c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HSL DAC Mute", AB8500_MUTECONF,
4368c2ecf20Sopenharmony_ci			AB8500_MUTECONF_MUTDACHSL, 1,
4378c2ecf20Sopenharmony_ci			NULL, 0),
4388c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HSR DAC Mute", AB8500_MUTECONF,
4398c2ecf20Sopenharmony_ci			AB8500_MUTECONF_MUTDACHSR, 1,
4408c2ecf20Sopenharmony_ci			NULL, 0),
4418c2ecf20Sopenharmony_ci	SND_SOC_DAPM_DAC("HSL DAC Driver", "ab8500_0p",
4428c2ecf20Sopenharmony_ci			AB8500_ANACONF3, AB8500_ANACONF3_ENDRVHSL, 0),
4438c2ecf20Sopenharmony_ci	SND_SOC_DAPM_DAC("HSR DAC Driver", "ab8500_0p",
4448c2ecf20Sopenharmony_ci			AB8500_ANACONF3, AB8500_ANACONF3_ENDRVHSR, 0),
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HSL Mute",
4478c2ecf20Sopenharmony_ci			AB8500_MUTECONF, AB8500_MUTECONF_MUTHSL, 1,
4488c2ecf20Sopenharmony_ci			NULL, 0),
4498c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HSR Mute",
4508c2ecf20Sopenharmony_ci			AB8500_MUTECONF, AB8500_MUTECONF_MUTHSR, 1,
4518c2ecf20Sopenharmony_ci			NULL, 0),
4528c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HSL Enable",
4538c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENHSL, 0,
4548c2ecf20Sopenharmony_ci			NULL, 0),
4558c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HSR Enable",
4568c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENHSR, 0,
4578c2ecf20Sopenharmony_ci			NULL, 0),
4588c2ecf20Sopenharmony_ci	SND_SOC_DAPM_PGA("HSL Volume",
4598c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
4608c2ecf20Sopenharmony_ci			NULL, 0),
4618c2ecf20Sopenharmony_ci	SND_SOC_DAPM_PGA("HSR Volume",
4628c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
4638c2ecf20Sopenharmony_ci			NULL, 0),
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Headset Left"),
4668c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Headset Right"),
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ci	/* LineOut path */
4698c2ecf20Sopenharmony_ci
4708c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("LineOut Source",
4718c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_lineout_source),
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LOL Disable HFL",
4748c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENHFL, 1,
4758c2ecf20Sopenharmony_ci			NULL, 0),
4768c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LOR Disable HFR",
4778c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENHFR, 1,
4788c2ecf20Sopenharmony_ci			NULL, 0),
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LOL Enable",
4818c2ecf20Sopenharmony_ci			AB8500_ANACONF5, AB8500_ANACONF5_ENLOL, 0,
4828c2ecf20Sopenharmony_ci			NULL, 0),
4838c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LOR Enable",
4848c2ecf20Sopenharmony_ci			AB8500_ANACONF5, AB8500_ANACONF5_ENLOR, 0,
4858c2ecf20Sopenharmony_ci			NULL, 0),
4868c2ecf20Sopenharmony_ci
4878c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LineOut Left"),
4888c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LineOut Right"),
4898c2ecf20Sopenharmony_ci
4908c2ecf20Sopenharmony_ci	/* Earpiece path */
4918c2ecf20Sopenharmony_ci
4928c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Earpiece or LineOut Mono Source",
4938c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, &dapm_ear_lineout_source),
4948c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("EAR DAC",
4958c2ecf20Sopenharmony_ci			AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACEAR, 0,
4968c2ecf20Sopenharmony_ci			NULL, 0),
4978c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("EAR Mute",
4988c2ecf20Sopenharmony_ci			AB8500_MUTECONF, AB8500_MUTECONF_MUTEAR, 1,
4998c2ecf20Sopenharmony_ci			NULL, 0),
5008c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("EAR Enable",
5018c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENEAR, 0,
5028c2ecf20Sopenharmony_ci			NULL, 0),
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Earpiece"),
5058c2ecf20Sopenharmony_ci
5068c2ecf20Sopenharmony_ci	/* Handsfree path */
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DA3 Channel Volume",
5098c2ecf20Sopenharmony_ci			AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA3, 0,
5108c2ecf20Sopenharmony_ci			NULL, 0),
5118c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DA4 Channel Volume",
5128c2ecf20Sopenharmony_ci			AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA4, 0,
5138c2ecf20Sopenharmony_ci			NULL, 0),
5148c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Speaker Left Source",
5158c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_HFl_select),
5168c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Speaker Right Source",
5178c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_HFr_select),
5188c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HFL DAC", AB8500_DAPATHCONF,
5198c2ecf20Sopenharmony_ci			AB8500_DAPATHCONF_ENDACHFL, 0,
5208c2ecf20Sopenharmony_ci			NULL, 0),
5218c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HFR DAC",
5228c2ecf20Sopenharmony_ci			AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHFR, 0,
5238c2ecf20Sopenharmony_ci			NULL, 0),
5248c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DA4 or ANC path to HfR",
5258c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF2, AB8500_DIGMULTCONF2_DATOHFREN, 0,
5268c2ecf20Sopenharmony_ci			NULL, 0),
5278c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DA3 or ANC path to HfL",
5288c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF2, AB8500_DIGMULTCONF2_DATOHFLEN, 0,
5298c2ecf20Sopenharmony_ci			NULL, 0),
5308c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HFL Enable",
5318c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENHFL, 0,
5328c2ecf20Sopenharmony_ci			NULL, 0),
5338c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("HFR Enable",
5348c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENHFR, 0,
5358c2ecf20Sopenharmony_ci			NULL, 0),
5368c2ecf20Sopenharmony_ci
5378c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Speaker Left"),
5388c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Speaker Right"),
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_ci	/* Vibrator path */
5418c2ecf20Sopenharmony_ci
5428c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("PWMGEN1"),
5438c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("PWMGEN2"),
5448c2ecf20Sopenharmony_ci
5458c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DA5 Channel Volume",
5468c2ecf20Sopenharmony_ci			AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA5, 0,
5478c2ecf20Sopenharmony_ci			NULL, 0),
5488c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DA6 Channel Volume",
5498c2ecf20Sopenharmony_ci			AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA6, 0,
5508c2ecf20Sopenharmony_ci			NULL, 0),
5518c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("VIB1 DAC",
5528c2ecf20Sopenharmony_ci			AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACVIB1, 0,
5538c2ecf20Sopenharmony_ci			NULL, 0),
5548c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("VIB2 DAC",
5558c2ecf20Sopenharmony_ci			AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACVIB2, 0,
5568c2ecf20Sopenharmony_ci			NULL, 0),
5578c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Vibra 1 Controller",
5588c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_pwm2vib1),
5598c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Vibra 2 Controller",
5608c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_pwm2vib2),
5618c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("VIB1 Enable",
5628c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENVIB1, 0,
5638c2ecf20Sopenharmony_ci			NULL, 0),
5648c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("VIB2 Enable",
5658c2ecf20Sopenharmony_ci			AB8500_ANACONF4, AB8500_ANACONF4_ENVIB2, 0,
5668c2ecf20Sopenharmony_ci			NULL, 0),
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Vibra 1"),
5698c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Vibra 2"),
5708c2ecf20Sopenharmony_ci
5718c2ecf20Sopenharmony_ci	/* Mic 1 */
5728c2ecf20Sopenharmony_ci
5738c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("Mic 1"),
5748c2ecf20Sopenharmony_ci
5758c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Mic 1a or 1b Select",
5768c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_mic1ab_mux),
5778c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("MIC1 Mute",
5788c2ecf20Sopenharmony_ci			AB8500_ANACONF2, AB8500_ANACONF2_MUTMIC1, 1,
5798c2ecf20Sopenharmony_ci			NULL, 0),
5808c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("MIC1A V-AMICx Enable",
5818c2ecf20Sopenharmony_ci			AB8500_ANACONF2, AB8500_ANACONF2_ENMIC1, 0,
5828c2ecf20Sopenharmony_ci			NULL, 0),
5838c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("MIC1B V-AMICx Enable",
5848c2ecf20Sopenharmony_ci			AB8500_ANACONF2, AB8500_ANACONF2_ENMIC1, 0,
5858c2ecf20Sopenharmony_ci			NULL, 0),
5868c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("MIC1 ADC",
5878c2ecf20Sopenharmony_ci			AB8500_ANACONF3, AB8500_ANACONF3_ENADCMIC, 0,
5888c2ecf20Sopenharmony_ci			NULL, 0),
5898c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("AD3 Source Select",
5908c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_ad3_select),
5918c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD3 Channel Volume",
5928c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
5938c2ecf20Sopenharmony_ci			NULL, 0),
5948c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD3 Enable",
5958c2ecf20Sopenharmony_ci			AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD34, 0,
5968c2ecf20Sopenharmony_ci			NULL, 0),
5978c2ecf20Sopenharmony_ci
5988c2ecf20Sopenharmony_ci	/* Mic 2 */
5998c2ecf20Sopenharmony_ci
6008c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("Mic 2"),
6018c2ecf20Sopenharmony_ci
6028c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("MIC2 Mute",
6038c2ecf20Sopenharmony_ci			AB8500_ANACONF2, AB8500_ANACONF2_MUTMIC2, 1,
6048c2ecf20Sopenharmony_ci			NULL, 0),
6058c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("MIC2 V-AMICx Enable", AB8500_ANACONF2,
6068c2ecf20Sopenharmony_ci			AB8500_ANACONF2_ENMIC2, 0,
6078c2ecf20Sopenharmony_ci			NULL, 0),
6088c2ecf20Sopenharmony_ci
6098c2ecf20Sopenharmony_ci	/* LineIn */
6108c2ecf20Sopenharmony_ci
6118c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("LineIn Left"),
6128c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("LineIn Right"),
6138c2ecf20Sopenharmony_ci
6148c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LINL Mute",
6158c2ecf20Sopenharmony_ci			AB8500_ANACONF2, AB8500_ANACONF2_MUTLINL, 1,
6168c2ecf20Sopenharmony_ci			NULL, 0),
6178c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LINR Mute",
6188c2ecf20Sopenharmony_ci			AB8500_ANACONF2, AB8500_ANACONF2_MUTLINR, 1,
6198c2ecf20Sopenharmony_ci			NULL, 0),
6208c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LINL Enable", AB8500_ANACONF2,
6218c2ecf20Sopenharmony_ci			AB8500_ANACONF2_ENLINL, 0,
6228c2ecf20Sopenharmony_ci			NULL, 0),
6238c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LINR Enable", AB8500_ANACONF2,
6248c2ecf20Sopenharmony_ci			AB8500_ANACONF2_ENLINR, 0,
6258c2ecf20Sopenharmony_ci			NULL, 0),
6268c2ecf20Sopenharmony_ci
6278c2ecf20Sopenharmony_ci	/* LineIn Bypass path */
6288c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LINL to HSL Volume",
6298c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
6308c2ecf20Sopenharmony_ci			NULL, 0),
6318c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LINR to HSR Volume",
6328c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
6338c2ecf20Sopenharmony_ci			NULL, 0),
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_ci	/* LineIn, Mic 2 */
6368c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Mic 2 or LINR Select",
6378c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_mic2lr_select),
6388c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LINL ADC", AB8500_ANACONF3,
6398c2ecf20Sopenharmony_ci			AB8500_ANACONF3_ENADCLINL, 0,
6408c2ecf20Sopenharmony_ci			NULL, 0),
6418c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("LINR ADC", AB8500_ANACONF3,
6428c2ecf20Sopenharmony_ci			AB8500_ANACONF3_ENADCLINR, 0,
6438c2ecf20Sopenharmony_ci			NULL, 0),
6448c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("AD1 Source Select",
6458c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_ad1_select),
6468c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("AD2 Source Select",
6478c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_ad2_select),
6488c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD1 Channel Volume",
6498c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
6508c2ecf20Sopenharmony_ci			NULL, 0),
6518c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD2 Channel Volume",
6528c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
6538c2ecf20Sopenharmony_ci			NULL, 0),
6548c2ecf20Sopenharmony_ci
6558c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD12 Enable",
6568c2ecf20Sopenharmony_ci			AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD12, 0,
6578c2ecf20Sopenharmony_ci			NULL, 0),
6588c2ecf20Sopenharmony_ci
6598c2ecf20Sopenharmony_ci	/* HD Capture path */
6608c2ecf20Sopenharmony_ci
6618c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("AD5 Source Select",
6628c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_ad5_select),
6638c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("AD6 Source Select",
6648c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0, dapm_ad6_select),
6658c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD5 Channel Volume",
6668c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
6678c2ecf20Sopenharmony_ci			NULL, 0),
6688c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD6 Channel Volume",
6698c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
6708c2ecf20Sopenharmony_ci			NULL, 0),
6718c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD57 Enable",
6728c2ecf20Sopenharmony_ci			AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD5768, 0,
6738c2ecf20Sopenharmony_ci			NULL, 0),
6748c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD68 Enable",
6758c2ecf20Sopenharmony_ci			AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD5768, 0,
6768c2ecf20Sopenharmony_ci			NULL, 0),
6778c2ecf20Sopenharmony_ci
6788c2ecf20Sopenharmony_ci	/* Digital Microphone path */
6798c2ecf20Sopenharmony_ci
6808c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMic 1"),
6818c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMic 2"),
6828c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMic 3"),
6838c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMic 4"),
6848c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMic 5"),
6858c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMic 6"),
6868c2ecf20Sopenharmony_ci
6878c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DMIC1",
6888c2ecf20Sopenharmony_ci			AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC1, 0,
6898c2ecf20Sopenharmony_ci			NULL, 0),
6908c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DMIC2",
6918c2ecf20Sopenharmony_ci			AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC2, 0,
6928c2ecf20Sopenharmony_ci			NULL, 0),
6938c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DMIC3",
6948c2ecf20Sopenharmony_ci			AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC3, 0,
6958c2ecf20Sopenharmony_ci			NULL, 0),
6968c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DMIC4",
6978c2ecf20Sopenharmony_ci			AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC4, 0,
6988c2ecf20Sopenharmony_ci			NULL, 0),
6998c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DMIC5",
7008c2ecf20Sopenharmony_ci			AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC5, 0,
7018c2ecf20Sopenharmony_ci			NULL, 0),
7028c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("DMIC6",
7038c2ecf20Sopenharmony_ci			AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC6, 0,
7048c2ecf20Sopenharmony_ci			NULL, 0),
7058c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD4 Channel Volume",
7068c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7078c2ecf20Sopenharmony_ci			NULL, 0),
7088c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("AD4 Enable",
7098c2ecf20Sopenharmony_ci			AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD34,
7108c2ecf20Sopenharmony_ci			0, NULL, 0),
7118c2ecf20Sopenharmony_ci
7128c2ecf20Sopenharmony_ci	/* Acoustical Noise Cancellation path */
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci	SND_SOC_DAPM_INPUT("ANC Configure Input"),
7158c2ecf20Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("ANC Configure Output"),
7168c2ecf20Sopenharmony_ci
7178c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("ANC Source",
7188c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7198c2ecf20Sopenharmony_ci			dapm_anc_in_select),
7208c2ecf20Sopenharmony_ci	SND_SOC_DAPM_SWITCH("ANC",
7218c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7228c2ecf20Sopenharmony_ci			dapm_anc_enable),
7238c2ecf20Sopenharmony_ci	SND_SOC_DAPM_SWITCH("ANC to Earpiece",
7248c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7258c2ecf20Sopenharmony_ci			dapm_anc_ear_mute),
7268c2ecf20Sopenharmony_ci
7278c2ecf20Sopenharmony_ci	/* Sidetone Filter path */
7288c2ecf20Sopenharmony_ci
7298c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Sidetone Left Source",
7308c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7318c2ecf20Sopenharmony_ci			dapm_stfir1_in_select),
7328c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("Sidetone Right Source",
7338c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7348c2ecf20Sopenharmony_ci			dapm_stfir2_in_select),
7358c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("STFIR1 Control",
7368c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7378c2ecf20Sopenharmony_ci			NULL, 0),
7388c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("STFIR2 Control",
7398c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7408c2ecf20Sopenharmony_ci			NULL, 0),
7418c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("STFIR1 Volume",
7428c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7438c2ecf20Sopenharmony_ci			NULL, 0),
7448c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MIXER("STFIR2 Volume",
7458c2ecf20Sopenharmony_ci			SND_SOC_NOPM, 0, 0,
7468c2ecf20Sopenharmony_ci			NULL, 0),
7478c2ecf20Sopenharmony_ci};
7488c2ecf20Sopenharmony_ci
7498c2ecf20Sopenharmony_ci/*
7508c2ecf20Sopenharmony_ci * DAPM-routes
7518c2ecf20Sopenharmony_ci */
7528c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route ab8500_dapm_routes[] = {
7538c2ecf20Sopenharmony_ci	/* Power AB8500 audio-block when AD/DA is active */
7548c2ecf20Sopenharmony_ci	{"Main Supply", NULL, "V-AUD"},
7558c2ecf20Sopenharmony_ci	{"Main Supply", NULL, "audioclk"},
7568c2ecf20Sopenharmony_ci	{"Main Supply", NULL, "Audio Power"},
7578c2ecf20Sopenharmony_ci	{"Main Supply", NULL, "Audio Analog Power"},
7588c2ecf20Sopenharmony_ci
7598c2ecf20Sopenharmony_ci	{"DAC", NULL, "ab8500_0p"},
7608c2ecf20Sopenharmony_ci	{"DAC", NULL, "Main Supply"},
7618c2ecf20Sopenharmony_ci	{"ADC", NULL, "ab8500_0c"},
7628c2ecf20Sopenharmony_ci	{"ADC", NULL, "Main Supply"},
7638c2ecf20Sopenharmony_ci
7648c2ecf20Sopenharmony_ci	/* ANC Configure */
7658c2ecf20Sopenharmony_ci	{"ANC Configure Input", NULL, "Main Supply"},
7668c2ecf20Sopenharmony_ci	{"ANC Configure Output", NULL, "ANC Configure Input"},
7678c2ecf20Sopenharmony_ci
7688c2ecf20Sopenharmony_ci	/* AD/DA */
7698c2ecf20Sopenharmony_ci	{"ADC", NULL, "ADC Input"},
7708c2ecf20Sopenharmony_ci	{"DAC Output", NULL, "DAC"},
7718c2ecf20Sopenharmony_ci
7728c2ecf20Sopenharmony_ci	/* Powerup charge pump if DA1/2 is in use */
7738c2ecf20Sopenharmony_ci
7748c2ecf20Sopenharmony_ci	{"DA_IN1", NULL, "ab8500_0p"},
7758c2ecf20Sopenharmony_ci	{"DA_IN1", NULL, "Charge Pump"},
7768c2ecf20Sopenharmony_ci	{"DA_IN2", NULL, "ab8500_0p"},
7778c2ecf20Sopenharmony_ci	{"DA_IN2", NULL, "Charge Pump"},
7788c2ecf20Sopenharmony_ci
7798c2ecf20Sopenharmony_ci	/* Headset path */
7808c2ecf20Sopenharmony_ci
7818c2ecf20Sopenharmony_ci	{"DA1 Enable", NULL, "DA_IN1"},
7828c2ecf20Sopenharmony_ci	{"DA2 Enable", NULL, "DA_IN2"},
7838c2ecf20Sopenharmony_ci
7848c2ecf20Sopenharmony_ci	{"HSL Digital Volume", NULL, "DA1 Enable"},
7858c2ecf20Sopenharmony_ci	{"HSR Digital Volume", NULL, "DA2 Enable"},
7868c2ecf20Sopenharmony_ci
7878c2ecf20Sopenharmony_ci	{"HSL DAC", NULL, "HSL Digital Volume"},
7888c2ecf20Sopenharmony_ci	{"HSR DAC", NULL, "HSR Digital Volume"},
7898c2ecf20Sopenharmony_ci
7908c2ecf20Sopenharmony_ci	{"HSL DAC Mute", NULL, "HSL DAC"},
7918c2ecf20Sopenharmony_ci	{"HSR DAC Mute", NULL, "HSR DAC"},
7928c2ecf20Sopenharmony_ci
7938c2ecf20Sopenharmony_ci	{"HSL DAC Driver", NULL, "HSL DAC Mute"},
7948c2ecf20Sopenharmony_ci	{"HSR DAC Driver", NULL, "HSR DAC Mute"},
7958c2ecf20Sopenharmony_ci
7968c2ecf20Sopenharmony_ci	{"HSL Mute", NULL, "HSL DAC Driver"},
7978c2ecf20Sopenharmony_ci	{"HSR Mute", NULL, "HSR DAC Driver"},
7988c2ecf20Sopenharmony_ci
7998c2ecf20Sopenharmony_ci	{"HSL Enable", NULL, "HSL Mute"},
8008c2ecf20Sopenharmony_ci	{"HSR Enable", NULL, "HSR Mute"},
8018c2ecf20Sopenharmony_ci
8028c2ecf20Sopenharmony_ci	{"HSL Volume", NULL, "HSL Enable"},
8038c2ecf20Sopenharmony_ci	{"HSR Volume", NULL, "HSR Enable"},
8048c2ecf20Sopenharmony_ci
8058c2ecf20Sopenharmony_ci	{"Headset Left", NULL, "HSL Volume"},
8068c2ecf20Sopenharmony_ci	{"Headset Right", NULL, "HSR Volume"},
8078c2ecf20Sopenharmony_ci
8088c2ecf20Sopenharmony_ci	/* HF or LineOut path */
8098c2ecf20Sopenharmony_ci
8108c2ecf20Sopenharmony_ci	{"DA_IN3", NULL, "ab8500_0p"},
8118c2ecf20Sopenharmony_ci	{"DA3 Channel Volume", NULL, "DA_IN3"},
8128c2ecf20Sopenharmony_ci	{"DA_IN4", NULL, "ab8500_0p"},
8138c2ecf20Sopenharmony_ci	{"DA4 Channel Volume", NULL, "DA_IN4"},
8148c2ecf20Sopenharmony_ci
8158c2ecf20Sopenharmony_ci	{"Speaker Left Source", "Audio Path", "DA3 Channel Volume"},
8168c2ecf20Sopenharmony_ci	{"Speaker Right Source", "Audio Path", "DA4 Channel Volume"},
8178c2ecf20Sopenharmony_ci
8188c2ecf20Sopenharmony_ci	{"DA3 or ANC path to HfL", NULL, "Speaker Left Source"},
8198c2ecf20Sopenharmony_ci	{"DA4 or ANC path to HfR", NULL, "Speaker Right Source"},
8208c2ecf20Sopenharmony_ci
8218c2ecf20Sopenharmony_ci	/* HF path */
8228c2ecf20Sopenharmony_ci
8238c2ecf20Sopenharmony_ci	{"HFL DAC", NULL, "DA3 or ANC path to HfL"},
8248c2ecf20Sopenharmony_ci	{"HFR DAC", NULL, "DA4 or ANC path to HfR"},
8258c2ecf20Sopenharmony_ci
8268c2ecf20Sopenharmony_ci	{"HFL Enable", NULL, "HFL DAC"},
8278c2ecf20Sopenharmony_ci	{"HFR Enable", NULL, "HFR DAC"},
8288c2ecf20Sopenharmony_ci
8298c2ecf20Sopenharmony_ci	{"Speaker Left", NULL, "HFL Enable"},
8308c2ecf20Sopenharmony_ci	{"Speaker Right", NULL, "HFR Enable"},
8318c2ecf20Sopenharmony_ci
8328c2ecf20Sopenharmony_ci	/* Earpiece path */
8338c2ecf20Sopenharmony_ci
8348c2ecf20Sopenharmony_ci	{"Earpiece or LineOut Mono Source", "Headset Left",
8358c2ecf20Sopenharmony_ci		"HSL Digital Volume"},
8368c2ecf20Sopenharmony_ci	{"Earpiece or LineOut Mono Source", "Speaker Left",
8378c2ecf20Sopenharmony_ci		"DA3 or ANC path to HfL"},
8388c2ecf20Sopenharmony_ci
8398c2ecf20Sopenharmony_ci	{"EAR DAC", NULL, "Earpiece or LineOut Mono Source"},
8408c2ecf20Sopenharmony_ci
8418c2ecf20Sopenharmony_ci	{"EAR Mute", NULL, "EAR DAC"},
8428c2ecf20Sopenharmony_ci
8438c2ecf20Sopenharmony_ci	{"EAR Enable", NULL, "EAR Mute"},
8448c2ecf20Sopenharmony_ci
8458c2ecf20Sopenharmony_ci	{"Earpiece", NULL, "EAR Enable"},
8468c2ecf20Sopenharmony_ci
8478c2ecf20Sopenharmony_ci	/* LineOut path stereo */
8488c2ecf20Sopenharmony_ci
8498c2ecf20Sopenharmony_ci	{"LineOut Source", "Stereo Path", "HSL DAC Driver"},
8508c2ecf20Sopenharmony_ci	{"LineOut Source", "Stereo Path", "HSR DAC Driver"},
8518c2ecf20Sopenharmony_ci
8528c2ecf20Sopenharmony_ci	/* LineOut path mono */
8538c2ecf20Sopenharmony_ci
8548c2ecf20Sopenharmony_ci	{"LineOut Source", "Mono Path", "EAR DAC"},
8558c2ecf20Sopenharmony_ci
8568c2ecf20Sopenharmony_ci	/* LineOut path */
8578c2ecf20Sopenharmony_ci
8588c2ecf20Sopenharmony_ci	{"LOL Disable HFL", NULL, "LineOut Source"},
8598c2ecf20Sopenharmony_ci	{"LOR Disable HFR", NULL, "LineOut Source"},
8608c2ecf20Sopenharmony_ci
8618c2ecf20Sopenharmony_ci	{"LOL Enable", NULL, "LOL Disable HFL"},
8628c2ecf20Sopenharmony_ci	{"LOR Enable", NULL, "LOR Disable HFR"},
8638c2ecf20Sopenharmony_ci
8648c2ecf20Sopenharmony_ci	{"LineOut Left", NULL, "LOL Enable"},
8658c2ecf20Sopenharmony_ci	{"LineOut Right", NULL, "LOR Enable"},
8668c2ecf20Sopenharmony_ci
8678c2ecf20Sopenharmony_ci	/* Vibrator path */
8688c2ecf20Sopenharmony_ci
8698c2ecf20Sopenharmony_ci	{"DA_IN5", NULL, "ab8500_0p"},
8708c2ecf20Sopenharmony_ci	{"DA5 Channel Volume", NULL, "DA_IN5"},
8718c2ecf20Sopenharmony_ci	{"DA_IN6", NULL, "ab8500_0p"},
8728c2ecf20Sopenharmony_ci	{"DA6 Channel Volume", NULL, "DA_IN6"},
8738c2ecf20Sopenharmony_ci
8748c2ecf20Sopenharmony_ci	{"VIB1 DAC", NULL, "DA5 Channel Volume"},
8758c2ecf20Sopenharmony_ci	{"VIB2 DAC", NULL, "DA6 Channel Volume"},
8768c2ecf20Sopenharmony_ci
8778c2ecf20Sopenharmony_ci	{"Vibra 1 Controller", "Audio Path", "VIB1 DAC"},
8788c2ecf20Sopenharmony_ci	{"Vibra 2 Controller", "Audio Path", "VIB2 DAC"},
8798c2ecf20Sopenharmony_ci	{"Vibra 1 Controller", "PWM Generator", "PWMGEN1"},
8808c2ecf20Sopenharmony_ci	{"Vibra 2 Controller", "PWM Generator", "PWMGEN2"},
8818c2ecf20Sopenharmony_ci
8828c2ecf20Sopenharmony_ci	{"VIB1 Enable", NULL, "Vibra 1 Controller"},
8838c2ecf20Sopenharmony_ci	{"VIB2 Enable", NULL, "Vibra 2 Controller"},
8848c2ecf20Sopenharmony_ci
8858c2ecf20Sopenharmony_ci	{"Vibra 1", NULL, "VIB1 Enable"},
8868c2ecf20Sopenharmony_ci	{"Vibra 2", NULL, "VIB2 Enable"},
8878c2ecf20Sopenharmony_ci
8888c2ecf20Sopenharmony_ci
8898c2ecf20Sopenharmony_ci	/* Mic 2 */
8908c2ecf20Sopenharmony_ci
8918c2ecf20Sopenharmony_ci	{"MIC2 V-AMICx Enable", NULL, "Mic 2"},
8928c2ecf20Sopenharmony_ci
8938c2ecf20Sopenharmony_ci	/* LineIn */
8948c2ecf20Sopenharmony_ci	{"LINL Mute", NULL, "LineIn Left"},
8958c2ecf20Sopenharmony_ci	{"LINR Mute", NULL, "LineIn Right"},
8968c2ecf20Sopenharmony_ci
8978c2ecf20Sopenharmony_ci	{"LINL Enable", NULL, "LINL Mute"},
8988c2ecf20Sopenharmony_ci	{"LINR Enable", NULL, "LINR Mute"},
8998c2ecf20Sopenharmony_ci
9008c2ecf20Sopenharmony_ci	/* LineIn, Mic 2 */
9018c2ecf20Sopenharmony_ci	{"Mic 2 or LINR Select", "LineIn Right", "LINR Enable"},
9028c2ecf20Sopenharmony_ci	{"Mic 2 or LINR Select", "Mic 2", "MIC2 V-AMICx Enable"},
9038c2ecf20Sopenharmony_ci
9048c2ecf20Sopenharmony_ci	{"LINL ADC", NULL, "LINL Enable"},
9058c2ecf20Sopenharmony_ci	{"LINR ADC", NULL, "Mic 2 or LINR Select"},
9068c2ecf20Sopenharmony_ci
9078c2ecf20Sopenharmony_ci	{"AD1 Source Select", "LineIn Left", "LINL ADC"},
9088c2ecf20Sopenharmony_ci	{"AD2 Source Select", "LineIn Right", "LINR ADC"},
9098c2ecf20Sopenharmony_ci
9108c2ecf20Sopenharmony_ci	{"AD1 Channel Volume", NULL, "AD1 Source Select"},
9118c2ecf20Sopenharmony_ci	{"AD2 Channel Volume", NULL, "AD2 Source Select"},
9128c2ecf20Sopenharmony_ci
9138c2ecf20Sopenharmony_ci	{"AD12 Enable", NULL, "AD1 Channel Volume"},
9148c2ecf20Sopenharmony_ci	{"AD12 Enable", NULL, "AD2 Channel Volume"},
9158c2ecf20Sopenharmony_ci
9168c2ecf20Sopenharmony_ci	{"AD_OUT1", NULL, "ab8500_0c"},
9178c2ecf20Sopenharmony_ci	{"AD_OUT1", NULL, "AD12 Enable"},
9188c2ecf20Sopenharmony_ci	{"AD_OUT2", NULL, "ab8500_0c"},
9198c2ecf20Sopenharmony_ci	{"AD_OUT2", NULL, "AD12 Enable"},
9208c2ecf20Sopenharmony_ci
9218c2ecf20Sopenharmony_ci	/* Mic 1 */
9228c2ecf20Sopenharmony_ci
9238c2ecf20Sopenharmony_ci	{"MIC1 Mute", NULL, "Mic 1"},
9248c2ecf20Sopenharmony_ci
9258c2ecf20Sopenharmony_ci	{"MIC1A V-AMICx Enable", NULL, "MIC1 Mute"},
9268c2ecf20Sopenharmony_ci	{"MIC1B V-AMICx Enable", NULL, "MIC1 Mute"},
9278c2ecf20Sopenharmony_ci
9288c2ecf20Sopenharmony_ci	{"Mic 1a or 1b Select", "Mic 1a", "MIC1A V-AMICx Enable"},
9298c2ecf20Sopenharmony_ci	{"Mic 1a or 1b Select", "Mic 1b", "MIC1B V-AMICx Enable"},
9308c2ecf20Sopenharmony_ci
9318c2ecf20Sopenharmony_ci	{"MIC1 ADC", NULL, "Mic 1a or 1b Select"},
9328c2ecf20Sopenharmony_ci
9338c2ecf20Sopenharmony_ci	{"AD3 Source Select", "Mic 1", "MIC1 ADC"},
9348c2ecf20Sopenharmony_ci
9358c2ecf20Sopenharmony_ci	{"AD3 Channel Volume", NULL, "AD3 Source Select"},
9368c2ecf20Sopenharmony_ci
9378c2ecf20Sopenharmony_ci	{"AD3 Enable", NULL, "AD3 Channel Volume"},
9388c2ecf20Sopenharmony_ci
9398c2ecf20Sopenharmony_ci	{"AD_OUT3", NULL, "ab8500_0c"},
9408c2ecf20Sopenharmony_ci	{"AD_OUT3", NULL, "AD3 Enable"},
9418c2ecf20Sopenharmony_ci
9428c2ecf20Sopenharmony_ci	/* HD Capture path */
9438c2ecf20Sopenharmony_ci
9448c2ecf20Sopenharmony_ci	{"AD5 Source Select", "Mic 2", "LINR ADC"},
9458c2ecf20Sopenharmony_ci	{"AD6 Source Select", "Mic 1", "MIC1 ADC"},
9468c2ecf20Sopenharmony_ci
9478c2ecf20Sopenharmony_ci	{"AD5 Channel Volume", NULL, "AD5 Source Select"},
9488c2ecf20Sopenharmony_ci	{"AD6 Channel Volume", NULL, "AD6 Source Select"},
9498c2ecf20Sopenharmony_ci
9508c2ecf20Sopenharmony_ci	{"AD57 Enable", NULL, "AD5 Channel Volume"},
9518c2ecf20Sopenharmony_ci	{"AD68 Enable", NULL, "AD6 Channel Volume"},
9528c2ecf20Sopenharmony_ci
9538c2ecf20Sopenharmony_ci	{"AD_OUT57", NULL, "ab8500_0c"},
9548c2ecf20Sopenharmony_ci	{"AD_OUT57", NULL, "AD57 Enable"},
9558c2ecf20Sopenharmony_ci	{"AD_OUT68", NULL, "ab8500_0c"},
9568c2ecf20Sopenharmony_ci	{"AD_OUT68", NULL, "AD68 Enable"},
9578c2ecf20Sopenharmony_ci
9588c2ecf20Sopenharmony_ci	/* Digital Microphone path */
9598c2ecf20Sopenharmony_ci
9608c2ecf20Sopenharmony_ci	{"DMic 1", NULL, "V-DMIC"},
9618c2ecf20Sopenharmony_ci	{"DMic 2", NULL, "V-DMIC"},
9628c2ecf20Sopenharmony_ci	{"DMic 3", NULL, "V-DMIC"},
9638c2ecf20Sopenharmony_ci	{"DMic 4", NULL, "V-DMIC"},
9648c2ecf20Sopenharmony_ci	{"DMic 5", NULL, "V-DMIC"},
9658c2ecf20Sopenharmony_ci	{"DMic 6", NULL, "V-DMIC"},
9668c2ecf20Sopenharmony_ci
9678c2ecf20Sopenharmony_ci	{"AD1 Source Select", NULL, "DMic 1"},
9688c2ecf20Sopenharmony_ci	{"AD2 Source Select", NULL, "DMic 2"},
9698c2ecf20Sopenharmony_ci	{"AD3 Source Select", NULL, "DMic 3"},
9708c2ecf20Sopenharmony_ci	{"AD5 Source Select", NULL, "DMic 5"},
9718c2ecf20Sopenharmony_ci	{"AD6 Source Select", NULL, "DMic 6"},
9728c2ecf20Sopenharmony_ci
9738c2ecf20Sopenharmony_ci	{"AD4 Channel Volume", NULL, "DMic 4"},
9748c2ecf20Sopenharmony_ci	{"AD4 Enable", NULL, "AD4 Channel Volume"},
9758c2ecf20Sopenharmony_ci
9768c2ecf20Sopenharmony_ci	{"AD_OUT4", NULL, "ab8500_0c"},
9778c2ecf20Sopenharmony_ci	{"AD_OUT4", NULL, "AD4 Enable"},
9788c2ecf20Sopenharmony_ci
9798c2ecf20Sopenharmony_ci	/* LineIn Bypass path */
9808c2ecf20Sopenharmony_ci
9818c2ecf20Sopenharmony_ci	{"LINL to HSL Volume", NULL, "LINL Enable"},
9828c2ecf20Sopenharmony_ci	{"LINR to HSR Volume", NULL, "LINR Enable"},
9838c2ecf20Sopenharmony_ci
9848c2ecf20Sopenharmony_ci	{"HSL DAC Driver", NULL, "LINL to HSL Volume"},
9858c2ecf20Sopenharmony_ci	{"HSR DAC Driver", NULL, "LINR to HSR Volume"},
9868c2ecf20Sopenharmony_ci
9878c2ecf20Sopenharmony_ci	/* ANC path (Acoustic Noise Cancellation) */
9888c2ecf20Sopenharmony_ci
9898c2ecf20Sopenharmony_ci	{"ANC Source", "Mic 2 / DMic 5", "AD5 Channel Volume"},
9908c2ecf20Sopenharmony_ci	{"ANC Source", "Mic 1 / DMic 6", "AD6 Channel Volume"},
9918c2ecf20Sopenharmony_ci
9928c2ecf20Sopenharmony_ci	{"ANC", "Switch", "ANC Source"},
9938c2ecf20Sopenharmony_ci
9948c2ecf20Sopenharmony_ci	{"Speaker Left Source", "ANC", "ANC"},
9958c2ecf20Sopenharmony_ci	{"Speaker Right Source", "ANC", "ANC"},
9968c2ecf20Sopenharmony_ci	{"ANC to Earpiece", "Switch", "ANC"},
9978c2ecf20Sopenharmony_ci
9988c2ecf20Sopenharmony_ci	{"HSL Digital Volume", NULL, "ANC to Earpiece"},
9998c2ecf20Sopenharmony_ci
10008c2ecf20Sopenharmony_ci	/* Sidetone Filter path */
10018c2ecf20Sopenharmony_ci
10028c2ecf20Sopenharmony_ci	{"Sidetone Left Source", "LineIn Left", "AD12 Enable"},
10038c2ecf20Sopenharmony_ci	{"Sidetone Left Source", "LineIn Right", "AD12 Enable"},
10048c2ecf20Sopenharmony_ci	{"Sidetone Left Source", "Mic 1", "AD3 Enable"},
10058c2ecf20Sopenharmony_ci	{"Sidetone Left Source", "Headset Left", "DA_IN1"},
10068c2ecf20Sopenharmony_ci	{"Sidetone Right Source", "LineIn Right", "AD12 Enable"},
10078c2ecf20Sopenharmony_ci	{"Sidetone Right Source", "Mic 1", "AD3 Enable"},
10088c2ecf20Sopenharmony_ci	{"Sidetone Right Source", "DMic 4", "AD4 Enable"},
10098c2ecf20Sopenharmony_ci	{"Sidetone Right Source", "Headset Right", "DA_IN2"},
10108c2ecf20Sopenharmony_ci
10118c2ecf20Sopenharmony_ci	{"STFIR1 Control", NULL, "Sidetone Left Source"},
10128c2ecf20Sopenharmony_ci	{"STFIR2 Control", NULL, "Sidetone Right Source"},
10138c2ecf20Sopenharmony_ci
10148c2ecf20Sopenharmony_ci	{"STFIR1 Volume", NULL, "STFIR1 Control"},
10158c2ecf20Sopenharmony_ci	{"STFIR2 Volume", NULL, "STFIR2 Control"},
10168c2ecf20Sopenharmony_ci
10178c2ecf20Sopenharmony_ci	{"DA1 Enable", NULL, "STFIR1 Volume"},
10188c2ecf20Sopenharmony_ci	{"DA2 Enable", NULL, "STFIR2 Volume"},
10198c2ecf20Sopenharmony_ci};
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route ab8500_dapm_routes_mic1a_vamicx[] = {
10228c2ecf20Sopenharmony_ci	{"MIC1A V-AMICx Enable", NULL, "V-AMIC1"},
10238c2ecf20Sopenharmony_ci	{"MIC1A V-AMICx Enable", NULL, "V-AMIC2"},
10248c2ecf20Sopenharmony_ci};
10258c2ecf20Sopenharmony_ci
10268c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route ab8500_dapm_routes_mic1b_vamicx[] = {
10278c2ecf20Sopenharmony_ci	{"MIC1B V-AMICx Enable", NULL, "V-AMIC1"},
10288c2ecf20Sopenharmony_ci	{"MIC1B V-AMICx Enable", NULL, "V-AMIC2"},
10298c2ecf20Sopenharmony_ci};
10308c2ecf20Sopenharmony_ci
10318c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route ab8500_dapm_routes_mic2_vamicx[] = {
10328c2ecf20Sopenharmony_ci	{"MIC2 V-AMICx Enable", NULL, "V-AMIC1"},
10338c2ecf20Sopenharmony_ci	{"MIC2 V-AMICx Enable", NULL, "V-AMIC2"},
10348c2ecf20Sopenharmony_ci};
10358c2ecf20Sopenharmony_ci
10368c2ecf20Sopenharmony_ci/* ANC FIR-coefficients configuration sequence */
10378c2ecf20Sopenharmony_cistatic void anc_fir(struct snd_soc_component *component,
10388c2ecf20Sopenharmony_ci		unsigned int bnk, unsigned int par, unsigned int val)
10398c2ecf20Sopenharmony_ci{
10408c2ecf20Sopenharmony_ci	if (par == 0 && bnk == 0)
10418c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_ANCCONF1,
10428c2ecf20Sopenharmony_ci			BIT(AB8500_ANCCONF1_ANCFIRUPDATE),
10438c2ecf20Sopenharmony_ci			BIT(AB8500_ANCCONF1_ANCFIRUPDATE));
10448c2ecf20Sopenharmony_ci
10458c2ecf20Sopenharmony_ci	snd_soc_component_write(component, AB8500_ANCCONF5, val >> 8 & 0xff);
10468c2ecf20Sopenharmony_ci	snd_soc_component_write(component, AB8500_ANCCONF6, val &  0xff);
10478c2ecf20Sopenharmony_ci
10488c2ecf20Sopenharmony_ci	if (par == AB8500_ANC_FIR_COEFFS - 1 && bnk == 1)
10498c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_ANCCONF1,
10508c2ecf20Sopenharmony_ci			BIT(AB8500_ANCCONF1_ANCFIRUPDATE), 0);
10518c2ecf20Sopenharmony_ci}
10528c2ecf20Sopenharmony_ci
10538c2ecf20Sopenharmony_ci/* ANC IIR-coefficients configuration sequence */
10548c2ecf20Sopenharmony_cistatic void anc_iir(struct snd_soc_component *component, unsigned int bnk,
10558c2ecf20Sopenharmony_ci		unsigned int par, unsigned int val)
10568c2ecf20Sopenharmony_ci{
10578c2ecf20Sopenharmony_ci	if (par == 0) {
10588c2ecf20Sopenharmony_ci		if (bnk == 0) {
10598c2ecf20Sopenharmony_ci			snd_soc_component_update_bits(component, AB8500_ANCCONF1,
10608c2ecf20Sopenharmony_ci					BIT(AB8500_ANCCONF1_ANCIIRINIT),
10618c2ecf20Sopenharmony_ci					BIT(AB8500_ANCCONF1_ANCIIRINIT));
10628c2ecf20Sopenharmony_ci			usleep_range(AB8500_ANC_SM_DELAY, AB8500_ANC_SM_DELAY*2);
10638c2ecf20Sopenharmony_ci			snd_soc_component_update_bits(component, AB8500_ANCCONF1,
10648c2ecf20Sopenharmony_ci					BIT(AB8500_ANCCONF1_ANCIIRINIT), 0);
10658c2ecf20Sopenharmony_ci			usleep_range(AB8500_ANC_SM_DELAY, AB8500_ANC_SM_DELAY*2);
10668c2ecf20Sopenharmony_ci		} else {
10678c2ecf20Sopenharmony_ci			snd_soc_component_update_bits(component, AB8500_ANCCONF1,
10688c2ecf20Sopenharmony_ci					BIT(AB8500_ANCCONF1_ANCIIRUPDATE),
10698c2ecf20Sopenharmony_ci					BIT(AB8500_ANCCONF1_ANCIIRUPDATE));
10708c2ecf20Sopenharmony_ci		}
10718c2ecf20Sopenharmony_ci	} else if (par > 3) {
10728c2ecf20Sopenharmony_ci		snd_soc_component_write(component, AB8500_ANCCONF7, 0);
10738c2ecf20Sopenharmony_ci		snd_soc_component_write(component, AB8500_ANCCONF8, val >> 16 & 0xff);
10748c2ecf20Sopenharmony_ci	}
10758c2ecf20Sopenharmony_ci
10768c2ecf20Sopenharmony_ci	snd_soc_component_write(component, AB8500_ANCCONF7, val >> 8 & 0xff);
10778c2ecf20Sopenharmony_ci	snd_soc_component_write(component, AB8500_ANCCONF8, val & 0xff);
10788c2ecf20Sopenharmony_ci
10798c2ecf20Sopenharmony_ci	if (par == AB8500_ANC_IIR_COEFFS - 1 && bnk == 1)
10808c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_ANCCONF1,
10818c2ecf20Sopenharmony_ci			BIT(AB8500_ANCCONF1_ANCIIRUPDATE), 0);
10828c2ecf20Sopenharmony_ci}
10838c2ecf20Sopenharmony_ci
10848c2ecf20Sopenharmony_ci/* ANC IIR-/FIR-coefficients configuration sequence */
10858c2ecf20Sopenharmony_cistatic void anc_configure(struct snd_soc_component *component,
10868c2ecf20Sopenharmony_ci			bool apply_fir, bool apply_iir)
10878c2ecf20Sopenharmony_ci{
10888c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
10898c2ecf20Sopenharmony_ci	unsigned int bnk, par, val;
10908c2ecf20Sopenharmony_ci
10918c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Enter.\n", __func__);
10928c2ecf20Sopenharmony_ci
10938c2ecf20Sopenharmony_ci	if (apply_fir)
10948c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_ANCCONF1,
10958c2ecf20Sopenharmony_ci			BIT(AB8500_ANCCONF1_ENANC), 0);
10968c2ecf20Sopenharmony_ci
10978c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_ANCCONF1,
10988c2ecf20Sopenharmony_ci		BIT(AB8500_ANCCONF1_ENANC), BIT(AB8500_ANCCONF1_ENANC));
10998c2ecf20Sopenharmony_ci
11008c2ecf20Sopenharmony_ci	if (apply_fir)
11018c2ecf20Sopenharmony_ci		for (bnk = 0; bnk < AB8500_NR_OF_ANC_COEFF_BANKS; bnk++)
11028c2ecf20Sopenharmony_ci			for (par = 0; par < AB8500_ANC_FIR_COEFFS; par++) {
11038c2ecf20Sopenharmony_ci				val = snd_soc_component_read(component,
11048c2ecf20Sopenharmony_ci						drvdata->anc_fir_values[par]);
11058c2ecf20Sopenharmony_ci				anc_fir(component, bnk, par, val);
11068c2ecf20Sopenharmony_ci			}
11078c2ecf20Sopenharmony_ci
11088c2ecf20Sopenharmony_ci	if (apply_iir)
11098c2ecf20Sopenharmony_ci		for (bnk = 0; bnk < AB8500_NR_OF_ANC_COEFF_BANKS; bnk++)
11108c2ecf20Sopenharmony_ci			for (par = 0; par < AB8500_ANC_IIR_COEFFS; par++) {
11118c2ecf20Sopenharmony_ci				val = snd_soc_component_read(component,
11128c2ecf20Sopenharmony_ci						drvdata->anc_iir_values[par]);
11138c2ecf20Sopenharmony_ci				anc_iir(component, bnk, par, val);
11148c2ecf20Sopenharmony_ci			}
11158c2ecf20Sopenharmony_ci
11168c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Exit.\n", __func__);
11178c2ecf20Sopenharmony_ci}
11188c2ecf20Sopenharmony_ci
11198c2ecf20Sopenharmony_ci/*
11208c2ecf20Sopenharmony_ci * Control-events
11218c2ecf20Sopenharmony_ci */
11228c2ecf20Sopenharmony_ci
11238c2ecf20Sopenharmony_cistatic int sid_status_control_get(struct snd_kcontrol *kcontrol,
11248c2ecf20Sopenharmony_ci		struct snd_ctl_elem_value *ucontrol)
11258c2ecf20Sopenharmony_ci{
11268c2ecf20Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
11278c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
11288c2ecf20Sopenharmony_ci
11298c2ecf20Sopenharmony_ci	mutex_lock(&drvdata->ctrl_lock);
11308c2ecf20Sopenharmony_ci	ucontrol->value.enumerated.item[0] = drvdata->sid_status;
11318c2ecf20Sopenharmony_ci	mutex_unlock(&drvdata->ctrl_lock);
11328c2ecf20Sopenharmony_ci
11338c2ecf20Sopenharmony_ci	return 0;
11348c2ecf20Sopenharmony_ci}
11358c2ecf20Sopenharmony_ci
11368c2ecf20Sopenharmony_ci/* Write sidetone FIR-coefficients configuration sequence */
11378c2ecf20Sopenharmony_cistatic int sid_status_control_put(struct snd_kcontrol *kcontrol,
11388c2ecf20Sopenharmony_ci				struct snd_ctl_elem_value *ucontrol)
11398c2ecf20Sopenharmony_ci{
11408c2ecf20Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
11418c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
11428c2ecf20Sopenharmony_ci	unsigned int param, sidconf, val;
11438c2ecf20Sopenharmony_ci	int status = 1;
11448c2ecf20Sopenharmony_ci
11458c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Enter\n", __func__);
11468c2ecf20Sopenharmony_ci
11478c2ecf20Sopenharmony_ci	if (ucontrol->value.enumerated.item[0] != SID_APPLY_FIR) {
11488c2ecf20Sopenharmony_ci		dev_err(component->dev,
11498c2ecf20Sopenharmony_ci			"%s: ERROR: This control supports '%s' only!\n",
11508c2ecf20Sopenharmony_ci			__func__, enum_sid_state[SID_APPLY_FIR]);
11518c2ecf20Sopenharmony_ci		return -EIO;
11528c2ecf20Sopenharmony_ci	}
11538c2ecf20Sopenharmony_ci
11548c2ecf20Sopenharmony_ci	mutex_lock(&drvdata->ctrl_lock);
11558c2ecf20Sopenharmony_ci
11568c2ecf20Sopenharmony_ci	sidconf = snd_soc_component_read(component, AB8500_SIDFIRCONF);
11578c2ecf20Sopenharmony_ci	if (((sidconf & BIT(AB8500_SIDFIRCONF_FIRSIDBUSY)) != 0)) {
11588c2ecf20Sopenharmony_ci		if ((sidconf & BIT(AB8500_SIDFIRCONF_ENFIRSIDS)) == 0) {
11598c2ecf20Sopenharmony_ci			dev_err(component->dev, "%s: Sidetone busy while off!\n",
11608c2ecf20Sopenharmony_ci				__func__);
11618c2ecf20Sopenharmony_ci			status = -EPERM;
11628c2ecf20Sopenharmony_ci		} else {
11638c2ecf20Sopenharmony_ci			status = -EBUSY;
11648c2ecf20Sopenharmony_ci		}
11658c2ecf20Sopenharmony_ci		goto out;
11668c2ecf20Sopenharmony_ci	}
11678c2ecf20Sopenharmony_ci
11688c2ecf20Sopenharmony_ci	snd_soc_component_write(component, AB8500_SIDFIRADR, 0);
11698c2ecf20Sopenharmony_ci
11708c2ecf20Sopenharmony_ci	for (param = 0; param < AB8500_SID_FIR_COEFFS; param++) {
11718c2ecf20Sopenharmony_ci		val = snd_soc_component_read(component, drvdata->sid_fir_values[param]);
11728c2ecf20Sopenharmony_ci		snd_soc_component_write(component, AB8500_SIDFIRCOEF1, val >> 8 & 0xff);
11738c2ecf20Sopenharmony_ci		snd_soc_component_write(component, AB8500_SIDFIRCOEF2, val & 0xff);
11748c2ecf20Sopenharmony_ci	}
11758c2ecf20Sopenharmony_ci
11768c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_SIDFIRADR,
11778c2ecf20Sopenharmony_ci		BIT(AB8500_SIDFIRADR_FIRSIDSET),
11788c2ecf20Sopenharmony_ci		BIT(AB8500_SIDFIRADR_FIRSIDSET));
11798c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_SIDFIRADR,
11808c2ecf20Sopenharmony_ci		BIT(AB8500_SIDFIRADR_FIRSIDSET), 0);
11818c2ecf20Sopenharmony_ci
11828c2ecf20Sopenharmony_ci	drvdata->sid_status = SID_FIR_CONFIGURED;
11838c2ecf20Sopenharmony_ci
11848c2ecf20Sopenharmony_ciout:
11858c2ecf20Sopenharmony_ci	mutex_unlock(&drvdata->ctrl_lock);
11868c2ecf20Sopenharmony_ci
11878c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Exit\n", __func__);
11888c2ecf20Sopenharmony_ci
11898c2ecf20Sopenharmony_ci	return status;
11908c2ecf20Sopenharmony_ci}
11918c2ecf20Sopenharmony_ci
11928c2ecf20Sopenharmony_cistatic int anc_status_control_get(struct snd_kcontrol *kcontrol,
11938c2ecf20Sopenharmony_ci				struct snd_ctl_elem_value *ucontrol)
11948c2ecf20Sopenharmony_ci{
11958c2ecf20Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
11968c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
11978c2ecf20Sopenharmony_ci
11988c2ecf20Sopenharmony_ci	mutex_lock(&drvdata->ctrl_lock);
11998c2ecf20Sopenharmony_ci	ucontrol->value.enumerated.item[0] = drvdata->anc_status;
12008c2ecf20Sopenharmony_ci	mutex_unlock(&drvdata->ctrl_lock);
12018c2ecf20Sopenharmony_ci
12028c2ecf20Sopenharmony_ci	return 0;
12038c2ecf20Sopenharmony_ci}
12048c2ecf20Sopenharmony_ci
12058c2ecf20Sopenharmony_cistatic int anc_status_control_put(struct snd_kcontrol *kcontrol,
12068c2ecf20Sopenharmony_ci				struct snd_ctl_elem_value *ucontrol)
12078c2ecf20Sopenharmony_ci{
12088c2ecf20Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
12098c2ecf20Sopenharmony_ci	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
12108c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
12118c2ecf20Sopenharmony_ci	struct device *dev = component->dev;
12128c2ecf20Sopenharmony_ci	bool apply_fir, apply_iir;
12138c2ecf20Sopenharmony_ci	unsigned int req;
12148c2ecf20Sopenharmony_ci	int status;
12158c2ecf20Sopenharmony_ci
12168c2ecf20Sopenharmony_ci	dev_dbg(dev, "%s: Enter.\n", __func__);
12178c2ecf20Sopenharmony_ci
12188c2ecf20Sopenharmony_ci	mutex_lock(&drvdata->ctrl_lock);
12198c2ecf20Sopenharmony_ci
12208c2ecf20Sopenharmony_ci	req = ucontrol->value.enumerated.item[0];
12218c2ecf20Sopenharmony_ci	if (req >= ARRAY_SIZE(enum_anc_state)) {
12228c2ecf20Sopenharmony_ci		status = -EINVAL;
12238c2ecf20Sopenharmony_ci		goto cleanup;
12248c2ecf20Sopenharmony_ci	}
12258c2ecf20Sopenharmony_ci	if (req != ANC_APPLY_FIR_IIR && req != ANC_APPLY_FIR &&
12268c2ecf20Sopenharmony_ci		req != ANC_APPLY_IIR) {
12278c2ecf20Sopenharmony_ci		dev_err(dev, "%s: ERROR: Unsupported status to set '%s'!\n",
12288c2ecf20Sopenharmony_ci			__func__, enum_anc_state[req]);
12298c2ecf20Sopenharmony_ci		status = -EINVAL;
12308c2ecf20Sopenharmony_ci		goto cleanup;
12318c2ecf20Sopenharmony_ci	}
12328c2ecf20Sopenharmony_ci	apply_fir = req == ANC_APPLY_FIR || req == ANC_APPLY_FIR_IIR;
12338c2ecf20Sopenharmony_ci	apply_iir = req == ANC_APPLY_IIR || req == ANC_APPLY_FIR_IIR;
12348c2ecf20Sopenharmony_ci
12358c2ecf20Sopenharmony_ci	status = snd_soc_dapm_force_enable_pin(dapm, "ANC Configure Input");
12368c2ecf20Sopenharmony_ci	if (status < 0) {
12378c2ecf20Sopenharmony_ci		dev_err(dev,
12388c2ecf20Sopenharmony_ci			"%s: ERROR: Failed to enable power (status = %d)!\n",
12398c2ecf20Sopenharmony_ci			__func__, status);
12408c2ecf20Sopenharmony_ci		goto cleanup;
12418c2ecf20Sopenharmony_ci	}
12428c2ecf20Sopenharmony_ci	snd_soc_dapm_sync(dapm);
12438c2ecf20Sopenharmony_ci
12448c2ecf20Sopenharmony_ci	anc_configure(component, apply_fir, apply_iir);
12458c2ecf20Sopenharmony_ci
12468c2ecf20Sopenharmony_ci	if (apply_fir) {
12478c2ecf20Sopenharmony_ci		if (drvdata->anc_status == ANC_IIR_CONFIGURED)
12488c2ecf20Sopenharmony_ci			drvdata->anc_status = ANC_FIR_IIR_CONFIGURED;
12498c2ecf20Sopenharmony_ci		else if (drvdata->anc_status != ANC_FIR_IIR_CONFIGURED)
12508c2ecf20Sopenharmony_ci			drvdata->anc_status =  ANC_FIR_CONFIGURED;
12518c2ecf20Sopenharmony_ci	}
12528c2ecf20Sopenharmony_ci	if (apply_iir) {
12538c2ecf20Sopenharmony_ci		if (drvdata->anc_status == ANC_FIR_CONFIGURED)
12548c2ecf20Sopenharmony_ci			drvdata->anc_status = ANC_FIR_IIR_CONFIGURED;
12558c2ecf20Sopenharmony_ci		else if (drvdata->anc_status != ANC_FIR_IIR_CONFIGURED)
12568c2ecf20Sopenharmony_ci			drvdata->anc_status =  ANC_IIR_CONFIGURED;
12578c2ecf20Sopenharmony_ci	}
12588c2ecf20Sopenharmony_ci
12598c2ecf20Sopenharmony_ci	status = snd_soc_dapm_disable_pin(dapm, "ANC Configure Input");
12608c2ecf20Sopenharmony_ci	snd_soc_dapm_sync(dapm);
12618c2ecf20Sopenharmony_ci
12628c2ecf20Sopenharmony_cicleanup:
12638c2ecf20Sopenharmony_ci	mutex_unlock(&drvdata->ctrl_lock);
12648c2ecf20Sopenharmony_ci
12658c2ecf20Sopenharmony_ci	if (status < 0)
12668c2ecf20Sopenharmony_ci		dev_err(dev, "%s: Unable to configure ANC! (status = %d)\n",
12678c2ecf20Sopenharmony_ci			__func__, status);
12688c2ecf20Sopenharmony_ci
12698c2ecf20Sopenharmony_ci	dev_dbg(dev, "%s: Exit.\n", __func__);
12708c2ecf20Sopenharmony_ci
12718c2ecf20Sopenharmony_ci	return (status < 0) ? status : 1;
12728c2ecf20Sopenharmony_ci}
12738c2ecf20Sopenharmony_ci
12748c2ecf20Sopenharmony_cistatic int filter_control_info(struct snd_kcontrol *kcontrol,
12758c2ecf20Sopenharmony_ci			struct snd_ctl_elem_info *uinfo)
12768c2ecf20Sopenharmony_ci{
12778c2ecf20Sopenharmony_ci	struct filter_control *fc =
12788c2ecf20Sopenharmony_ci			(struct filter_control *)kcontrol->private_value;
12798c2ecf20Sopenharmony_ci
12808c2ecf20Sopenharmony_ci	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
12818c2ecf20Sopenharmony_ci	uinfo->count = fc->count;
12828c2ecf20Sopenharmony_ci	uinfo->value.integer.min = fc->min;
12838c2ecf20Sopenharmony_ci	uinfo->value.integer.max = fc->max;
12848c2ecf20Sopenharmony_ci
12858c2ecf20Sopenharmony_ci	return 0;
12868c2ecf20Sopenharmony_ci}
12878c2ecf20Sopenharmony_ci
12888c2ecf20Sopenharmony_cistatic int filter_control_get(struct snd_kcontrol *kcontrol,
12898c2ecf20Sopenharmony_ci			struct snd_ctl_elem_value *ucontrol)
12908c2ecf20Sopenharmony_ci{
12918c2ecf20Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
12928c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata = snd_soc_component_get_drvdata(component);
12938c2ecf20Sopenharmony_ci	struct filter_control *fc =
12948c2ecf20Sopenharmony_ci			(struct filter_control *)kcontrol->private_value;
12958c2ecf20Sopenharmony_ci	unsigned int i;
12968c2ecf20Sopenharmony_ci
12978c2ecf20Sopenharmony_ci	mutex_lock(&drvdata->ctrl_lock);
12988c2ecf20Sopenharmony_ci	for (i = 0; i < fc->count; i++)
12998c2ecf20Sopenharmony_ci		ucontrol->value.integer.value[i] = fc->value[i];
13008c2ecf20Sopenharmony_ci	mutex_unlock(&drvdata->ctrl_lock);
13018c2ecf20Sopenharmony_ci
13028c2ecf20Sopenharmony_ci	return 0;
13038c2ecf20Sopenharmony_ci}
13048c2ecf20Sopenharmony_ci
13058c2ecf20Sopenharmony_cistatic int filter_control_put(struct snd_kcontrol *kcontrol,
13068c2ecf20Sopenharmony_ci		struct snd_ctl_elem_value *ucontrol)
13078c2ecf20Sopenharmony_ci{
13088c2ecf20Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
13098c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata = snd_soc_component_get_drvdata(component);
13108c2ecf20Sopenharmony_ci	struct filter_control *fc =
13118c2ecf20Sopenharmony_ci			(struct filter_control *)kcontrol->private_value;
13128c2ecf20Sopenharmony_ci	unsigned int i;
13138c2ecf20Sopenharmony_ci
13148c2ecf20Sopenharmony_ci	mutex_lock(&drvdata->ctrl_lock);
13158c2ecf20Sopenharmony_ci	for (i = 0; i < fc->count; i++)
13168c2ecf20Sopenharmony_ci		fc->value[i] = ucontrol->value.integer.value[i];
13178c2ecf20Sopenharmony_ci	mutex_unlock(&drvdata->ctrl_lock);
13188c2ecf20Sopenharmony_ci
13198c2ecf20Sopenharmony_ci	return 0;
13208c2ecf20Sopenharmony_ci}
13218c2ecf20Sopenharmony_ci
13228c2ecf20Sopenharmony_ci/*
13238c2ecf20Sopenharmony_ci * Controls - Non-DAPM ASoC
13248c2ecf20Sopenharmony_ci */
13258c2ecf20Sopenharmony_ci
13268c2ecf20Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(adx_dig_gain_tlv, -3200, 100, 1);
13278c2ecf20Sopenharmony_ci/* -32dB = Mute */
13288c2ecf20Sopenharmony_ci
13298c2ecf20Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(dax_dig_gain_tlv, -6300, 100, 1);
13308c2ecf20Sopenharmony_ci/* -63dB = Mute */
13318c2ecf20Sopenharmony_ci
13328c2ecf20Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(hs_ear_dig_gain_tlv, -100, 100, 1);
13338c2ecf20Sopenharmony_ci/* -1dB = Mute */
13348c2ecf20Sopenharmony_ci
13358c2ecf20Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(hs_gain_tlv,
13368c2ecf20Sopenharmony_ci	0, 3, TLV_DB_SCALE_ITEM(-3200, 400, 0),
13378c2ecf20Sopenharmony_ci	4, 15, TLV_DB_SCALE_ITEM(-1800, 200, 0)
13388c2ecf20Sopenharmony_ci);
13398c2ecf20Sopenharmony_ci
13408c2ecf20Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(mic_gain_tlv, 0, 100, 0);
13418c2ecf20Sopenharmony_ci
13428c2ecf20Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(lin_gain_tlv, -1000, 200, 0);
13438c2ecf20Sopenharmony_ci
13448c2ecf20Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(lin2hs_gain_tlv, -3800, 200, 1);
13458c2ecf20Sopenharmony_ci/* -38dB = Mute */
13468c2ecf20Sopenharmony_ci
13478c2ecf20Sopenharmony_cistatic const char * const enum_hsfadspeed[] = {"2ms", "0.5ms", "10.6ms",
13488c2ecf20Sopenharmony_ci					"5ms"};
13498c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_hsfadspeed,
13508c2ecf20Sopenharmony_ci	AB8500_DIGMICCONF, AB8500_DIGMICCONF_HSFADSPEED, enum_hsfadspeed);
13518c2ecf20Sopenharmony_ci
13528c2ecf20Sopenharmony_cistatic const char * const enum_envdetthre[] = {
13538c2ecf20Sopenharmony_ci	"250mV", "300mV", "350mV", "400mV",
13548c2ecf20Sopenharmony_ci	"450mV", "500mV", "550mV", "600mV",
13558c2ecf20Sopenharmony_ci	"650mV", "700mV", "750mV", "800mV",
13568c2ecf20Sopenharmony_ci	"850mV", "900mV", "950mV", "1.00V" };
13578c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_envdeththre,
13588c2ecf20Sopenharmony_ci	AB8500_ENVCPCONF, AB8500_ENVCPCONF_ENVDETHTHRE, enum_envdetthre);
13598c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_envdetlthre,
13608c2ecf20Sopenharmony_ci	AB8500_ENVCPCONF, AB8500_ENVCPCONF_ENVDETLTHRE, enum_envdetthre);
13618c2ecf20Sopenharmony_cistatic const char * const enum_envdettime[] = {
13628c2ecf20Sopenharmony_ci	"26.6us", "53.2us", "106us",  "213us",
13638c2ecf20Sopenharmony_ci	"426us",  "851us",  "1.70ms", "3.40ms",
13648c2ecf20Sopenharmony_ci	"6.81ms", "13.6ms", "27.2ms", "54.5ms",
13658c2ecf20Sopenharmony_ci	"109ms",  "218ms",  "436ms",  "872ms" };
13668c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_envdettime,
13678c2ecf20Sopenharmony_ci	AB8500_SIGENVCONF, AB8500_SIGENVCONF_ENVDETTIME, enum_envdettime);
13688c2ecf20Sopenharmony_ci
13698c2ecf20Sopenharmony_cistatic const char * const enum_sinc31[] = {"Sinc 3", "Sinc 1"};
13708c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_hsesinc, AB8500_HSLEARDIGGAIN,
13718c2ecf20Sopenharmony_ci			AB8500_HSLEARDIGGAIN_HSSINC1, enum_sinc31);
13728c2ecf20Sopenharmony_ci
13738c2ecf20Sopenharmony_cistatic const char * const enum_fadespeed[] = {"1ms", "4ms", "8ms", "16ms"};
13748c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_fadespeed, AB8500_HSRDIGGAIN,
13758c2ecf20Sopenharmony_ci			AB8500_HSRDIGGAIN_FADESPEED, enum_fadespeed);
13768c2ecf20Sopenharmony_ci
13778c2ecf20Sopenharmony_ci/* Earpiece */
13788c2ecf20Sopenharmony_ci
13798c2ecf20Sopenharmony_cistatic const char * const enum_lowpow[] = {"Normal", "Low Power"};
13808c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_eardaclowpow, AB8500_ANACONF1,
13818c2ecf20Sopenharmony_ci			AB8500_ANACONF1_EARDACLOWPOW, enum_lowpow);
13828c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_eardrvlowpow, AB8500_ANACONF1,
13838c2ecf20Sopenharmony_ci			AB8500_ANACONF1_EARDRVLOWPOW, enum_lowpow);
13848c2ecf20Sopenharmony_ci
13858c2ecf20Sopenharmony_cistatic const char * const enum_av_mode[] = {"Audio", "Voice"};
13868c2ecf20Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(soc_enum_ad12voice, AB8500_ADFILTCONF,
13878c2ecf20Sopenharmony_ci	AB8500_ADFILTCONF_AD1VOICE, AB8500_ADFILTCONF_AD2VOICE, enum_av_mode);
13888c2ecf20Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(soc_enum_ad34voice, AB8500_ADFILTCONF,
13898c2ecf20Sopenharmony_ci	AB8500_ADFILTCONF_AD3VOICE, AB8500_ADFILTCONF_AD4VOICE, enum_av_mode);
13908c2ecf20Sopenharmony_ci
13918c2ecf20Sopenharmony_ci/* DA */
13928c2ecf20Sopenharmony_ci
13938c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da12voice,
13948c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_DA12VOICE,
13958c2ecf20Sopenharmony_ci			enum_av_mode);
13968c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da34voice,
13978c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF3, AB8500_DASLOTCONF3_DA34VOICE,
13988c2ecf20Sopenharmony_ci			enum_av_mode);
13998c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da56voice,
14008c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF5, AB8500_DASLOTCONF5_DA56VOICE,
14018c2ecf20Sopenharmony_ci			enum_av_mode);
14028c2ecf20Sopenharmony_ci
14038c2ecf20Sopenharmony_cistatic const char * const enum_da2hslr[] = {"Sidetone", "Audio Path"};
14048c2ecf20Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(soc_enum_da2hslr, AB8500_DIGMULTCONF1,
14058c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF1_DATOHSLEN,
14068c2ecf20Sopenharmony_ci			AB8500_DIGMULTCONF1_DATOHSREN, enum_da2hslr);
14078c2ecf20Sopenharmony_ci
14088c2ecf20Sopenharmony_cistatic const char * const enum_sinc53[] = {"Sinc 5", "Sinc 3"};
14098c2ecf20Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(soc_enum_dmic12sinc, AB8500_DMICFILTCONF,
14108c2ecf20Sopenharmony_ci			AB8500_DMICFILTCONF_DMIC1SINC3,
14118c2ecf20Sopenharmony_ci			AB8500_DMICFILTCONF_DMIC2SINC3, enum_sinc53);
14128c2ecf20Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(soc_enum_dmic34sinc, AB8500_DMICFILTCONF,
14138c2ecf20Sopenharmony_ci			AB8500_DMICFILTCONF_DMIC3SINC3,
14148c2ecf20Sopenharmony_ci			AB8500_DMICFILTCONF_DMIC4SINC3, enum_sinc53);
14158c2ecf20Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(soc_enum_dmic56sinc, AB8500_DMICFILTCONF,
14168c2ecf20Sopenharmony_ci			AB8500_DMICFILTCONF_DMIC5SINC3,
14178c2ecf20Sopenharmony_ci			AB8500_DMICFILTCONF_DMIC6SINC3, enum_sinc53);
14188c2ecf20Sopenharmony_ci
14198c2ecf20Sopenharmony_ci/* Digital interface - DA from slot mapping */
14208c2ecf20Sopenharmony_cistatic const char * const enum_da_from_slot_map[] = {"SLOT0",
14218c2ecf20Sopenharmony_ci					"SLOT1",
14228c2ecf20Sopenharmony_ci					"SLOT2",
14238c2ecf20Sopenharmony_ci					"SLOT3",
14248c2ecf20Sopenharmony_ci					"SLOT4",
14258c2ecf20Sopenharmony_ci					"SLOT5",
14268c2ecf20Sopenharmony_ci					"SLOT6",
14278c2ecf20Sopenharmony_ci					"SLOT7",
14288c2ecf20Sopenharmony_ci					"SLOT8",
14298c2ecf20Sopenharmony_ci					"SLOT9",
14308c2ecf20Sopenharmony_ci					"SLOT10",
14318c2ecf20Sopenharmony_ci					"SLOT11",
14328c2ecf20Sopenharmony_ci					"SLOT12",
14338c2ecf20Sopenharmony_ci					"SLOT13",
14348c2ecf20Sopenharmony_ci					"SLOT14",
14358c2ecf20Sopenharmony_ci					"SLOT15",
14368c2ecf20Sopenharmony_ci					"SLOT16",
14378c2ecf20Sopenharmony_ci					"SLOT17",
14388c2ecf20Sopenharmony_ci					"SLOT18",
14398c2ecf20Sopenharmony_ci					"SLOT19",
14408c2ecf20Sopenharmony_ci					"SLOT20",
14418c2ecf20Sopenharmony_ci					"SLOT21",
14428c2ecf20Sopenharmony_ci					"SLOT22",
14438c2ecf20Sopenharmony_ci					"SLOT23",
14448c2ecf20Sopenharmony_ci					"SLOT24",
14458c2ecf20Sopenharmony_ci					"SLOT25",
14468c2ecf20Sopenharmony_ci					"SLOT26",
14478c2ecf20Sopenharmony_ci					"SLOT27",
14488c2ecf20Sopenharmony_ci					"SLOT28",
14498c2ecf20Sopenharmony_ci					"SLOT29",
14508c2ecf20Sopenharmony_ci					"SLOT30",
14518c2ecf20Sopenharmony_ci					"SLOT31"};
14528c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da1slotmap,
14538c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF1, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
14548c2ecf20Sopenharmony_ci			enum_da_from_slot_map);
14558c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da2slotmap,
14568c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF2, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
14578c2ecf20Sopenharmony_ci			enum_da_from_slot_map);
14588c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da3slotmap,
14598c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF3, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
14608c2ecf20Sopenharmony_ci			enum_da_from_slot_map);
14618c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da4slotmap,
14628c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF4, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
14638c2ecf20Sopenharmony_ci			enum_da_from_slot_map);
14648c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da5slotmap,
14658c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF5, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
14668c2ecf20Sopenharmony_ci			enum_da_from_slot_map);
14678c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da6slotmap,
14688c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF6, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
14698c2ecf20Sopenharmony_ci			enum_da_from_slot_map);
14708c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da7slotmap,
14718c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF7, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
14728c2ecf20Sopenharmony_ci			enum_da_from_slot_map);
14738c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_da8slotmap,
14748c2ecf20Sopenharmony_ci			AB8500_DASLOTCONF8, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
14758c2ecf20Sopenharmony_ci			enum_da_from_slot_map);
14768c2ecf20Sopenharmony_ci
14778c2ecf20Sopenharmony_ci/* Digital interface - AD to slot mapping */
14788c2ecf20Sopenharmony_cistatic const char * const enum_ad_to_slot_map[] = {"AD_OUT1",
14798c2ecf20Sopenharmony_ci					"AD_OUT2",
14808c2ecf20Sopenharmony_ci					"AD_OUT3",
14818c2ecf20Sopenharmony_ci					"AD_OUT4",
14828c2ecf20Sopenharmony_ci					"AD_OUT5",
14838c2ecf20Sopenharmony_ci					"AD_OUT6",
14848c2ecf20Sopenharmony_ci					"AD_OUT7",
14858c2ecf20Sopenharmony_ci					"AD_OUT8",
14868c2ecf20Sopenharmony_ci					"zeroes",
14878c2ecf20Sopenharmony_ci					"zeroes",
14888c2ecf20Sopenharmony_ci					"zeroes",
14898c2ecf20Sopenharmony_ci					"zeroes",
14908c2ecf20Sopenharmony_ci					"tristate",
14918c2ecf20Sopenharmony_ci					"tristate",
14928c2ecf20Sopenharmony_ci					"tristate",
14938c2ecf20Sopenharmony_ci					"tristate"};
14948c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot0map,
14958c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL1, AB8500_ADSLOTSELX_EVEN_SHIFT,
14968c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
14978c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot1map,
14988c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL1, AB8500_ADSLOTSELX_ODD_SHIFT,
14998c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15008c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot2map,
15018c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL2, AB8500_ADSLOTSELX_EVEN_SHIFT,
15028c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15038c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot3map,
15048c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL2, AB8500_ADSLOTSELX_ODD_SHIFT,
15058c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15068c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot4map,
15078c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL3, AB8500_ADSLOTSELX_EVEN_SHIFT,
15088c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15098c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot5map,
15108c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL3, AB8500_ADSLOTSELX_ODD_SHIFT,
15118c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15128c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot6map,
15138c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL4, AB8500_ADSLOTSELX_EVEN_SHIFT,
15148c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15158c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot7map,
15168c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL4, AB8500_ADSLOTSELX_ODD_SHIFT,
15178c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15188c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot8map,
15198c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL5, AB8500_ADSLOTSELX_EVEN_SHIFT,
15208c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15218c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot9map,
15228c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL5, AB8500_ADSLOTSELX_ODD_SHIFT,
15238c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15248c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot10map,
15258c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL6, AB8500_ADSLOTSELX_EVEN_SHIFT,
15268c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15278c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot11map,
15288c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL6, AB8500_ADSLOTSELX_ODD_SHIFT,
15298c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15308c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot12map,
15318c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL7, AB8500_ADSLOTSELX_EVEN_SHIFT,
15328c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15338c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot13map,
15348c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL7, AB8500_ADSLOTSELX_ODD_SHIFT,
15358c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15368c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot14map,
15378c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL8, AB8500_ADSLOTSELX_EVEN_SHIFT,
15388c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15398c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot15map,
15408c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL8, AB8500_ADSLOTSELX_ODD_SHIFT,
15418c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15428c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot16map,
15438c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL9, AB8500_ADSLOTSELX_EVEN_SHIFT,
15448c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15458c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot17map,
15468c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL9, AB8500_ADSLOTSELX_ODD_SHIFT,
15478c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15488c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot18map,
15498c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL10, AB8500_ADSLOTSELX_EVEN_SHIFT,
15508c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15518c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot19map,
15528c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL10, AB8500_ADSLOTSELX_ODD_SHIFT,
15538c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15548c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot20map,
15558c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL11, AB8500_ADSLOTSELX_EVEN_SHIFT,
15568c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15578c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot21map,
15588c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL11, AB8500_ADSLOTSELX_ODD_SHIFT,
15598c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15608c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot22map,
15618c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL12, AB8500_ADSLOTSELX_EVEN_SHIFT,
15628c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15638c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot23map,
15648c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL12, AB8500_ADSLOTSELX_ODD_SHIFT,
15658c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15668c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot24map,
15678c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL13, AB8500_ADSLOTSELX_EVEN_SHIFT,
15688c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15698c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot25map,
15708c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL13, AB8500_ADSLOTSELX_ODD_SHIFT,
15718c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15728c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot26map,
15738c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL14, AB8500_ADSLOTSELX_EVEN_SHIFT,
15748c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15758c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot27map,
15768c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL14, AB8500_ADSLOTSELX_ODD_SHIFT,
15778c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15788c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot28map,
15798c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL15, AB8500_ADSLOTSELX_EVEN_SHIFT,
15808c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15818c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot29map,
15828c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL15, AB8500_ADSLOTSELX_ODD_SHIFT,
15838c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15848c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot30map,
15858c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL16, AB8500_ADSLOTSELX_EVEN_SHIFT,
15868c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15878c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_adslot31map,
15888c2ecf20Sopenharmony_ci			AB8500_ADSLOTSEL16, AB8500_ADSLOTSELX_ODD_SHIFT,
15898c2ecf20Sopenharmony_ci			enum_ad_to_slot_map);
15908c2ecf20Sopenharmony_ci
15918c2ecf20Sopenharmony_ci/* Digital interface - Burst mode */
15928c2ecf20Sopenharmony_cistatic const char * const enum_mask[] = {"Unmasked", "Masked"};
15938c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_bfifomask,
15948c2ecf20Sopenharmony_ci			AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFOMASK,
15958c2ecf20Sopenharmony_ci			enum_mask);
15968c2ecf20Sopenharmony_cistatic const char * const enum_bitclk0[] = {"19_2_MHz", "38_4_MHz"};
15978c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_bfifo19m2,
15988c2ecf20Sopenharmony_ci			AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFO19M2,
15998c2ecf20Sopenharmony_ci			enum_bitclk0);
16008c2ecf20Sopenharmony_cistatic const char * const enum_slavemaster[] = {"Slave", "Master"};
16018c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(soc_enum_bfifomast,
16028c2ecf20Sopenharmony_ci			AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFOMAST_SHIFT,
16038c2ecf20Sopenharmony_ci			enum_slavemaster);
16048c2ecf20Sopenharmony_ci
16058c2ecf20Sopenharmony_ci/* Sidetone */
16068c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_EXT_DECL(soc_enum_sidstate, enum_sid_state);
16078c2ecf20Sopenharmony_ci
16088c2ecf20Sopenharmony_ci/* ANC */
16098c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_EXT_DECL(soc_enum_ancstate, enum_anc_state);
16108c2ecf20Sopenharmony_ci
16118c2ecf20Sopenharmony_cistatic struct snd_kcontrol_new ab8500_ctrls[] = {
16128c2ecf20Sopenharmony_ci	/* Charge pump */
16138c2ecf20Sopenharmony_ci	SOC_ENUM("Charge Pump High Threshold For Low Voltage",
16148c2ecf20Sopenharmony_ci		soc_enum_envdeththre),
16158c2ecf20Sopenharmony_ci	SOC_ENUM("Charge Pump Low Threshold For Low Voltage",
16168c2ecf20Sopenharmony_ci		soc_enum_envdetlthre),
16178c2ecf20Sopenharmony_ci	SOC_SINGLE("Charge Pump Envelope Detection Switch",
16188c2ecf20Sopenharmony_ci		AB8500_SIGENVCONF, AB8500_SIGENVCONF_ENVDETCPEN,
16198c2ecf20Sopenharmony_ci		1, 0),
16208c2ecf20Sopenharmony_ci	SOC_ENUM("Charge Pump Envelope Detection Decay Time",
16218c2ecf20Sopenharmony_ci		soc_enum_envdettime),
16228c2ecf20Sopenharmony_ci
16238c2ecf20Sopenharmony_ci	/* Headset */
16248c2ecf20Sopenharmony_ci	SOC_ENUM("Headset Mode", soc_enum_da12voice),
16258c2ecf20Sopenharmony_ci	SOC_SINGLE("Headset High Pass Switch",
16268c2ecf20Sopenharmony_ci		AB8500_ANACONF1, AB8500_ANACONF1_HSHPEN,
16278c2ecf20Sopenharmony_ci		1, 0),
16288c2ecf20Sopenharmony_ci	SOC_SINGLE("Headset Low Power Switch",
16298c2ecf20Sopenharmony_ci		AB8500_ANACONF1, AB8500_ANACONF1_HSLOWPOW,
16308c2ecf20Sopenharmony_ci		1, 0),
16318c2ecf20Sopenharmony_ci	SOC_SINGLE("Headset DAC Low Power Switch",
16328c2ecf20Sopenharmony_ci		AB8500_ANACONF1, AB8500_ANACONF1_DACLOWPOW1,
16338c2ecf20Sopenharmony_ci		1, 0),
16348c2ecf20Sopenharmony_ci	SOC_SINGLE("Headset DAC Drv Low Power Switch",
16358c2ecf20Sopenharmony_ci		AB8500_ANACONF1, AB8500_ANACONF1_DACLOWPOW0,
16368c2ecf20Sopenharmony_ci		1, 0),
16378c2ecf20Sopenharmony_ci	SOC_ENUM("Headset Fade Speed", soc_enum_hsfadspeed),
16388c2ecf20Sopenharmony_ci	SOC_ENUM("Headset Source", soc_enum_da2hslr),
16398c2ecf20Sopenharmony_ci	SOC_ENUM("Headset Filter", soc_enum_hsesinc),
16408c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("Headset Master Volume",
16418c2ecf20Sopenharmony_ci		AB8500_DADIGGAIN1, AB8500_DADIGGAIN2,
16428c2ecf20Sopenharmony_ci		0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
16438c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("Headset Digital Volume",
16448c2ecf20Sopenharmony_ci		AB8500_HSLEARDIGGAIN, AB8500_HSRDIGGAIN,
16458c2ecf20Sopenharmony_ci		0, AB8500_HSLEARDIGGAIN_HSLDGAIN_MAX, 1, hs_ear_dig_gain_tlv),
16468c2ecf20Sopenharmony_ci	SOC_DOUBLE_TLV("Headset Volume",
16478c2ecf20Sopenharmony_ci		AB8500_ANAGAIN3,
16488c2ecf20Sopenharmony_ci		AB8500_ANAGAIN3_HSLGAIN, AB8500_ANAGAIN3_HSRGAIN,
16498c2ecf20Sopenharmony_ci		AB8500_ANAGAIN3_HSXGAIN_MAX, 1, hs_gain_tlv),
16508c2ecf20Sopenharmony_ci
16518c2ecf20Sopenharmony_ci	/* Earpiece */
16528c2ecf20Sopenharmony_ci	SOC_ENUM("Earpiece DAC Mode",
16538c2ecf20Sopenharmony_ci		soc_enum_eardaclowpow),
16548c2ecf20Sopenharmony_ci	SOC_ENUM("Earpiece DAC Drv Mode",
16558c2ecf20Sopenharmony_ci		soc_enum_eardrvlowpow),
16568c2ecf20Sopenharmony_ci
16578c2ecf20Sopenharmony_ci	/* HandsFree */
16588c2ecf20Sopenharmony_ci	SOC_ENUM("HF Mode", soc_enum_da34voice),
16598c2ecf20Sopenharmony_ci	SOC_SINGLE("HF and Headset Swap Switch",
16608c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_SWAPDA12_34,
16618c2ecf20Sopenharmony_ci		1, 0),
16628c2ecf20Sopenharmony_ci	SOC_DOUBLE("HF Low EMI Mode Switch",
16638c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF1,
16648c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF1_HFLSWAPEN, AB8500_CLASSDCONF1_HFRSWAPEN,
16658c2ecf20Sopenharmony_ci		1, 0),
16668c2ecf20Sopenharmony_ci	SOC_DOUBLE("HF FIR Bypass Switch",
16678c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF2,
16688c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF2_FIRBYP0, AB8500_CLASSDCONF2_FIRBYP1,
16698c2ecf20Sopenharmony_ci		1, 0),
16708c2ecf20Sopenharmony_ci	SOC_DOUBLE("HF High Volume Switch",
16718c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF2,
16728c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF2_HIGHVOLEN0, AB8500_CLASSDCONF2_HIGHVOLEN1,
16738c2ecf20Sopenharmony_ci		1, 0),
16748c2ecf20Sopenharmony_ci	SOC_SINGLE("HF L and R Bridge Switch",
16758c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF1, AB8500_CLASSDCONF1_PARLHF,
16768c2ecf20Sopenharmony_ci		1, 0),
16778c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("HF Master Volume",
16788c2ecf20Sopenharmony_ci		AB8500_DADIGGAIN3, AB8500_DADIGGAIN4,
16798c2ecf20Sopenharmony_ci		0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
16808c2ecf20Sopenharmony_ci
16818c2ecf20Sopenharmony_ci	/* Vibra */
16828c2ecf20Sopenharmony_ci	SOC_DOUBLE("Vibra High Volume Switch",
16838c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF2,
16848c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF2_HIGHVOLEN2, AB8500_CLASSDCONF2_HIGHVOLEN3,
16858c2ecf20Sopenharmony_ci		1, 0),
16868c2ecf20Sopenharmony_ci	SOC_DOUBLE("Vibra Low EMI Mode Switch",
16878c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF1,
16888c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF1_VIB1SWAPEN, AB8500_CLASSDCONF1_VIB2SWAPEN,
16898c2ecf20Sopenharmony_ci		1, 0),
16908c2ecf20Sopenharmony_ci	SOC_DOUBLE("Vibra FIR Bypass Switch",
16918c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF2,
16928c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF2_FIRBYP2, AB8500_CLASSDCONF2_FIRBYP3,
16938c2ecf20Sopenharmony_ci		1, 0),
16948c2ecf20Sopenharmony_ci	SOC_ENUM("Vibra Mode", soc_enum_da56voice),
16958c2ecf20Sopenharmony_ci	SOC_DOUBLE_R("Vibra PWM Duty Cycle N",
16968c2ecf20Sopenharmony_ci		AB8500_PWMGENCONF3, AB8500_PWMGENCONF5,
16978c2ecf20Sopenharmony_ci		AB8500_PWMGENCONFX_PWMVIBXDUTCYC,
16988c2ecf20Sopenharmony_ci		AB8500_PWMGENCONFX_PWMVIBXDUTCYC_MAX, 0),
16998c2ecf20Sopenharmony_ci	SOC_DOUBLE_R("Vibra PWM Duty Cycle P",
17008c2ecf20Sopenharmony_ci		AB8500_PWMGENCONF2, AB8500_PWMGENCONF4,
17018c2ecf20Sopenharmony_ci		AB8500_PWMGENCONFX_PWMVIBXDUTCYC,
17028c2ecf20Sopenharmony_ci		AB8500_PWMGENCONFX_PWMVIBXDUTCYC_MAX, 0),
17038c2ecf20Sopenharmony_ci	SOC_SINGLE("Vibra 1 and 2 Bridge Switch",
17048c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF1, AB8500_CLASSDCONF1_PARLVIB,
17058c2ecf20Sopenharmony_ci		1, 0),
17068c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("Vibra Master Volume",
17078c2ecf20Sopenharmony_ci		AB8500_DADIGGAIN5, AB8500_DADIGGAIN6,
17088c2ecf20Sopenharmony_ci		0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
17098c2ecf20Sopenharmony_ci
17108c2ecf20Sopenharmony_ci	/* HandsFree, Vibra */
17118c2ecf20Sopenharmony_ci	SOC_SINGLE("ClassD High Pass Volume",
17128c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF3, AB8500_CLASSDCONF3_DITHHPGAIN,
17138c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF3_DITHHPGAIN_MAX, 0),
17148c2ecf20Sopenharmony_ci	SOC_SINGLE("ClassD White Volume",
17158c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF3, AB8500_CLASSDCONF3_DITHWGAIN,
17168c2ecf20Sopenharmony_ci		AB8500_CLASSDCONF3_DITHWGAIN_MAX, 0),
17178c2ecf20Sopenharmony_ci
17188c2ecf20Sopenharmony_ci	/* Mic 1, Mic 2, LineIn */
17198c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("Mic Master Volume",
17208c2ecf20Sopenharmony_ci		AB8500_ADDIGGAIN3, AB8500_ADDIGGAIN4,
17218c2ecf20Sopenharmony_ci		0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
17228c2ecf20Sopenharmony_ci
17238c2ecf20Sopenharmony_ci	/* Mic 1 */
17248c2ecf20Sopenharmony_ci	SOC_SINGLE_TLV("Mic 1",
17258c2ecf20Sopenharmony_ci		AB8500_ANAGAIN1,
17268c2ecf20Sopenharmony_ci		AB8500_ANAGAINX_MICXGAIN,
17278c2ecf20Sopenharmony_ci		AB8500_ANAGAINX_MICXGAIN_MAX, 0, mic_gain_tlv),
17288c2ecf20Sopenharmony_ci	SOC_SINGLE("Mic 1 Low Power Switch",
17298c2ecf20Sopenharmony_ci		AB8500_ANAGAIN1, AB8500_ANAGAINX_LOWPOWMICX,
17308c2ecf20Sopenharmony_ci		1, 0),
17318c2ecf20Sopenharmony_ci
17328c2ecf20Sopenharmony_ci	/* Mic 2 */
17338c2ecf20Sopenharmony_ci	SOC_DOUBLE("Mic High Pass Switch",
17348c2ecf20Sopenharmony_ci		AB8500_ADFILTCONF,
17358c2ecf20Sopenharmony_ci		AB8500_ADFILTCONF_AD3NH, AB8500_ADFILTCONF_AD4NH,
17368c2ecf20Sopenharmony_ci		1, 1),
17378c2ecf20Sopenharmony_ci	SOC_ENUM("Mic Mode", soc_enum_ad34voice),
17388c2ecf20Sopenharmony_ci	SOC_ENUM("Mic Filter", soc_enum_dmic34sinc),
17398c2ecf20Sopenharmony_ci	SOC_SINGLE_TLV("Mic 2",
17408c2ecf20Sopenharmony_ci		AB8500_ANAGAIN2,
17418c2ecf20Sopenharmony_ci		AB8500_ANAGAINX_MICXGAIN,
17428c2ecf20Sopenharmony_ci		AB8500_ANAGAINX_MICXGAIN_MAX, 0, mic_gain_tlv),
17438c2ecf20Sopenharmony_ci	SOC_SINGLE("Mic 2 Low Power Switch",
17448c2ecf20Sopenharmony_ci		AB8500_ANAGAIN2, AB8500_ANAGAINX_LOWPOWMICX,
17458c2ecf20Sopenharmony_ci		1, 0),
17468c2ecf20Sopenharmony_ci
17478c2ecf20Sopenharmony_ci	/* LineIn */
17488c2ecf20Sopenharmony_ci	SOC_DOUBLE("LineIn High Pass Switch",
17498c2ecf20Sopenharmony_ci		AB8500_ADFILTCONF,
17508c2ecf20Sopenharmony_ci		AB8500_ADFILTCONF_AD1NH, AB8500_ADFILTCONF_AD2NH,
17518c2ecf20Sopenharmony_ci		1, 1),
17528c2ecf20Sopenharmony_ci	SOC_ENUM("LineIn Filter", soc_enum_dmic12sinc),
17538c2ecf20Sopenharmony_ci	SOC_ENUM("LineIn Mode", soc_enum_ad12voice),
17548c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("LineIn Master Volume",
17558c2ecf20Sopenharmony_ci		AB8500_ADDIGGAIN1, AB8500_ADDIGGAIN2,
17568c2ecf20Sopenharmony_ci		0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
17578c2ecf20Sopenharmony_ci	SOC_DOUBLE_TLV("LineIn",
17588c2ecf20Sopenharmony_ci		AB8500_ANAGAIN4,
17598c2ecf20Sopenharmony_ci		AB8500_ANAGAIN4_LINLGAIN, AB8500_ANAGAIN4_LINRGAIN,
17608c2ecf20Sopenharmony_ci		AB8500_ANAGAIN4_LINXGAIN_MAX, 0, lin_gain_tlv),
17618c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("LineIn to Headset Volume",
17628c2ecf20Sopenharmony_ci		AB8500_DIGLINHSLGAIN, AB8500_DIGLINHSRGAIN,
17638c2ecf20Sopenharmony_ci		AB8500_DIGLINHSXGAIN_LINTOHSXGAIN,
17648c2ecf20Sopenharmony_ci		AB8500_DIGLINHSXGAIN_LINTOHSXGAIN_MAX,
17658c2ecf20Sopenharmony_ci		1, lin2hs_gain_tlv),
17668c2ecf20Sopenharmony_ci
17678c2ecf20Sopenharmony_ci	/* DMic */
17688c2ecf20Sopenharmony_ci	SOC_ENUM("DMic Filter", soc_enum_dmic56sinc),
17698c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("DMic Master Volume",
17708c2ecf20Sopenharmony_ci		AB8500_ADDIGGAIN5, AB8500_ADDIGGAIN6,
17718c2ecf20Sopenharmony_ci		0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
17728c2ecf20Sopenharmony_ci
17738c2ecf20Sopenharmony_ci	/* Digital gains */
17748c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Gain Fade Speed", soc_enum_fadespeed),
17758c2ecf20Sopenharmony_ci
17768c2ecf20Sopenharmony_ci	/* Analog loopback */
17778c2ecf20Sopenharmony_ci	SOC_DOUBLE_R_TLV("Analog Loopback Volume",
17788c2ecf20Sopenharmony_ci		AB8500_ADDIGLOOPGAIN1, AB8500_ADDIGLOOPGAIN2,
17798c2ecf20Sopenharmony_ci		0, AB8500_ADDIGLOOPGAINX_ADXLBGAIN_MAX, 1, dax_dig_gain_tlv),
17808c2ecf20Sopenharmony_ci
17818c2ecf20Sopenharmony_ci	/* Digital interface - DA from slot mapping */
17828c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface DA 1 From Slot Map", soc_enum_da1slotmap),
17838c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface DA 2 From Slot Map", soc_enum_da2slotmap),
17848c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface DA 3 From Slot Map", soc_enum_da3slotmap),
17858c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface DA 4 From Slot Map", soc_enum_da4slotmap),
17868c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface DA 5 From Slot Map", soc_enum_da5slotmap),
17878c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface DA 6 From Slot Map", soc_enum_da6slotmap),
17888c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface DA 7 From Slot Map", soc_enum_da7slotmap),
17898c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface DA 8 From Slot Map", soc_enum_da8slotmap),
17908c2ecf20Sopenharmony_ci
17918c2ecf20Sopenharmony_ci	/* Digital interface - AD to slot mapping */
17928c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 0 Map", soc_enum_adslot0map),
17938c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 1 Map", soc_enum_adslot1map),
17948c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 2 Map", soc_enum_adslot2map),
17958c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 3 Map", soc_enum_adslot3map),
17968c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 4 Map", soc_enum_adslot4map),
17978c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 5 Map", soc_enum_adslot5map),
17988c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 6 Map", soc_enum_adslot6map),
17998c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 7 Map", soc_enum_adslot7map),
18008c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 8 Map", soc_enum_adslot8map),
18018c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 9 Map", soc_enum_adslot9map),
18028c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 10 Map", soc_enum_adslot10map),
18038c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 11 Map", soc_enum_adslot11map),
18048c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 12 Map", soc_enum_adslot12map),
18058c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 13 Map", soc_enum_adslot13map),
18068c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 14 Map", soc_enum_adslot14map),
18078c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 15 Map", soc_enum_adslot15map),
18088c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 16 Map", soc_enum_adslot16map),
18098c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 17 Map", soc_enum_adslot17map),
18108c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 18 Map", soc_enum_adslot18map),
18118c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 19 Map", soc_enum_adslot19map),
18128c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 20 Map", soc_enum_adslot20map),
18138c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 21 Map", soc_enum_adslot21map),
18148c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 22 Map", soc_enum_adslot22map),
18158c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 23 Map", soc_enum_adslot23map),
18168c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 24 Map", soc_enum_adslot24map),
18178c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 25 Map", soc_enum_adslot25map),
18188c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 26 Map", soc_enum_adslot26map),
18198c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 27 Map", soc_enum_adslot27map),
18208c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 28 Map", soc_enum_adslot28map),
18218c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 29 Map", soc_enum_adslot29map),
18228c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 30 Map", soc_enum_adslot30map),
18238c2ecf20Sopenharmony_ci	SOC_ENUM("Digital Interface AD To Slot 31 Map", soc_enum_adslot31map),
18248c2ecf20Sopenharmony_ci
18258c2ecf20Sopenharmony_ci	/* Digital interface - Loopback */
18268c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface AD 1 Loopback Switch",
18278c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_DAI7TOADO1,
18288c2ecf20Sopenharmony_ci		1, 0),
18298c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface AD 2 Loopback Switch",
18308c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF2, AB8500_DASLOTCONF2_DAI8TOADO2,
18318c2ecf20Sopenharmony_ci		1, 0),
18328c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface AD 3 Loopback Switch",
18338c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF3, AB8500_DASLOTCONF3_DAI7TOADO3,
18348c2ecf20Sopenharmony_ci		1, 0),
18358c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface AD 4 Loopback Switch",
18368c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF4, AB8500_DASLOTCONF4_DAI8TOADO4,
18378c2ecf20Sopenharmony_ci		1, 0),
18388c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface AD 5 Loopback Switch",
18398c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF5, AB8500_DASLOTCONF5_DAI7TOADO5,
18408c2ecf20Sopenharmony_ci		1, 0),
18418c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface AD 6 Loopback Switch",
18428c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF6, AB8500_DASLOTCONF6_DAI8TOADO6,
18438c2ecf20Sopenharmony_ci		1, 0),
18448c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface AD 7 Loopback Switch",
18458c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF7, AB8500_DASLOTCONF7_DAI8TOADO7,
18468c2ecf20Sopenharmony_ci		1, 0),
18478c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface AD 8 Loopback Switch",
18488c2ecf20Sopenharmony_ci		AB8500_DASLOTCONF8, AB8500_DASLOTCONF8_DAI7TOADO8,
18498c2ecf20Sopenharmony_ci		1, 0),
18508c2ecf20Sopenharmony_ci
18518c2ecf20Sopenharmony_ci	/* Digital interface - Burst FIFO */
18528c2ecf20Sopenharmony_ci	SOC_SINGLE("Digital Interface 0 FIFO Enable Switch",
18538c2ecf20Sopenharmony_ci		AB8500_DIGIFCONF3, AB8500_DIGIFCONF3_IF0BFIFOEN,
18548c2ecf20Sopenharmony_ci		1, 0),
18558c2ecf20Sopenharmony_ci	SOC_ENUM("Burst FIFO Mask", soc_enum_bfifomask),
18568c2ecf20Sopenharmony_ci	SOC_ENUM("Burst FIFO Bit-clock Frequency", soc_enum_bfifo19m2),
18578c2ecf20Sopenharmony_ci	SOC_SINGLE("Burst FIFO Threshold",
18588c2ecf20Sopenharmony_ci		AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFOINT_SHIFT,
18598c2ecf20Sopenharmony_ci		AB8500_FIFOCONF1_BFIFOINT_MAX, 0),
18608c2ecf20Sopenharmony_ci	SOC_SINGLE("Burst FIFO Length",
18618c2ecf20Sopenharmony_ci		AB8500_FIFOCONF2, AB8500_FIFOCONF2_BFIFOTX_SHIFT,
18628c2ecf20Sopenharmony_ci		AB8500_FIFOCONF2_BFIFOTX_MAX, 0),
18638c2ecf20Sopenharmony_ci	SOC_SINGLE("Burst FIFO EOS Extra Slots",
18648c2ecf20Sopenharmony_ci		AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFOEXSL_SHIFT,
18658c2ecf20Sopenharmony_ci		AB8500_FIFOCONF3_BFIFOEXSL_MAX, 0),
18668c2ecf20Sopenharmony_ci	SOC_SINGLE("Burst FIFO FS Extra Bit-clocks",
18678c2ecf20Sopenharmony_ci		AB8500_FIFOCONF3, AB8500_FIFOCONF3_PREBITCLK0_SHIFT,
18688c2ecf20Sopenharmony_ci		AB8500_FIFOCONF3_PREBITCLK0_MAX, 0),
18698c2ecf20Sopenharmony_ci	SOC_ENUM("Burst FIFO Interface Mode", soc_enum_bfifomast),
18708c2ecf20Sopenharmony_ci
18718c2ecf20Sopenharmony_ci	SOC_SINGLE("Burst FIFO Interface Switch",
18728c2ecf20Sopenharmony_ci		AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFORUN_SHIFT,
18738c2ecf20Sopenharmony_ci		1, 0),
18748c2ecf20Sopenharmony_ci	SOC_SINGLE("Burst FIFO Switch Frame Number",
18758c2ecf20Sopenharmony_ci		AB8500_FIFOCONF4, AB8500_FIFOCONF4_BFIFOFRAMSW_SHIFT,
18768c2ecf20Sopenharmony_ci		AB8500_FIFOCONF4_BFIFOFRAMSW_MAX, 0),
18778c2ecf20Sopenharmony_ci	SOC_SINGLE("Burst FIFO Wake Up Delay",
18788c2ecf20Sopenharmony_ci		AB8500_FIFOCONF5, AB8500_FIFOCONF5_BFIFOWAKEUP_SHIFT,
18798c2ecf20Sopenharmony_ci		AB8500_FIFOCONF5_BFIFOWAKEUP_MAX, 0),
18808c2ecf20Sopenharmony_ci	SOC_SINGLE("Burst FIFO Samples In FIFO",
18818c2ecf20Sopenharmony_ci		AB8500_FIFOCONF6, AB8500_FIFOCONF6_BFIFOSAMPLE_SHIFT,
18828c2ecf20Sopenharmony_ci		AB8500_FIFOCONF6_BFIFOSAMPLE_MAX, 0),
18838c2ecf20Sopenharmony_ci
18848c2ecf20Sopenharmony_ci	/* ANC */
18858c2ecf20Sopenharmony_ci	SOC_ENUM_EXT("ANC Status", soc_enum_ancstate,
18868c2ecf20Sopenharmony_ci		anc_status_control_get, anc_status_control_put),
18878c2ecf20Sopenharmony_ci	SOC_SINGLE_XR_SX("ANC Warp Delay Shift",
18888c2ecf20Sopenharmony_ci		AB8500_ANCCONF2, 1, AB8500_ANCCONF2_SHIFT,
18898c2ecf20Sopenharmony_ci		AB8500_ANCCONF2_MIN, AB8500_ANCCONF2_MAX, 0),
18908c2ecf20Sopenharmony_ci	SOC_SINGLE_XR_SX("ANC FIR Output Shift",
18918c2ecf20Sopenharmony_ci		AB8500_ANCCONF3, 1, AB8500_ANCCONF3_SHIFT,
18928c2ecf20Sopenharmony_ci		AB8500_ANCCONF3_MIN, AB8500_ANCCONF3_MAX, 0),
18938c2ecf20Sopenharmony_ci	SOC_SINGLE_XR_SX("ANC IIR Output Shift",
18948c2ecf20Sopenharmony_ci		AB8500_ANCCONF4, 1, AB8500_ANCCONF4_SHIFT,
18958c2ecf20Sopenharmony_ci		AB8500_ANCCONF4_MIN, AB8500_ANCCONF4_MAX, 0),
18968c2ecf20Sopenharmony_ci	SOC_SINGLE_XR_SX("ANC Warp Delay",
18978c2ecf20Sopenharmony_ci		AB8500_ANCCONF9, 2, AB8500_ANC_WARP_DELAY_SHIFT,
18988c2ecf20Sopenharmony_ci		AB8500_ANC_WARP_DELAY_MIN, AB8500_ANC_WARP_DELAY_MAX, 0),
18998c2ecf20Sopenharmony_ci
19008c2ecf20Sopenharmony_ci	/* Sidetone */
19018c2ecf20Sopenharmony_ci	SOC_ENUM_EXT("Sidetone Status", soc_enum_sidstate,
19028c2ecf20Sopenharmony_ci		sid_status_control_get, sid_status_control_put),
19038c2ecf20Sopenharmony_ci	SOC_SINGLE_STROBE("Sidetone Reset",
19048c2ecf20Sopenharmony_ci		AB8500_SIDFIRADR, AB8500_SIDFIRADR_FIRSIDSET, 0),
19058c2ecf20Sopenharmony_ci};
19068c2ecf20Sopenharmony_ci
19078c2ecf20Sopenharmony_cistatic struct snd_kcontrol_new ab8500_filter_controls[] = {
19088c2ecf20Sopenharmony_ci	AB8500_FILTER_CONTROL("ANC FIR Coefficients", AB8500_ANC_FIR_COEFFS,
19098c2ecf20Sopenharmony_ci		AB8500_ANC_FIR_COEFF_MIN, AB8500_ANC_FIR_COEFF_MAX),
19108c2ecf20Sopenharmony_ci	AB8500_FILTER_CONTROL("ANC IIR Coefficients", AB8500_ANC_IIR_COEFFS,
19118c2ecf20Sopenharmony_ci		AB8500_ANC_IIR_COEFF_MIN, AB8500_ANC_IIR_COEFF_MAX),
19128c2ecf20Sopenharmony_ci	AB8500_FILTER_CONTROL("Sidetone FIR Coefficients",
19138c2ecf20Sopenharmony_ci			AB8500_SID_FIR_COEFFS, AB8500_SID_FIR_COEFF_MIN,
19148c2ecf20Sopenharmony_ci			AB8500_SID_FIR_COEFF_MAX)
19158c2ecf20Sopenharmony_ci};
19168c2ecf20Sopenharmony_cienum ab8500_filter {
19178c2ecf20Sopenharmony_ci	AB8500_FILTER_ANC_FIR = 0,
19188c2ecf20Sopenharmony_ci	AB8500_FILTER_ANC_IIR = 1,
19198c2ecf20Sopenharmony_ci	AB8500_FILTER_SID_FIR = 2,
19208c2ecf20Sopenharmony_ci};
19218c2ecf20Sopenharmony_ci
19228c2ecf20Sopenharmony_ci/*
19238c2ecf20Sopenharmony_ci * Extended interface for codec-driver
19248c2ecf20Sopenharmony_ci */
19258c2ecf20Sopenharmony_ci
19268c2ecf20Sopenharmony_cistatic int ab8500_audio_init_audioblock(struct snd_soc_component *component)
19278c2ecf20Sopenharmony_ci{
19288c2ecf20Sopenharmony_ci	int status;
19298c2ecf20Sopenharmony_ci
19308c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Enter.\n", __func__);
19318c2ecf20Sopenharmony_ci
19328c2ecf20Sopenharmony_ci	/* Reset audio-registers and disable 32kHz-clock output 2 */
19338c2ecf20Sopenharmony_ci	status = ab8500_sysctrl_write(AB8500_STW4500CTRL3,
19348c2ecf20Sopenharmony_ci				AB8500_STW4500CTRL3_CLK32KOUT2DIS |
19358c2ecf20Sopenharmony_ci					AB8500_STW4500CTRL3_RESETAUDN,
19368c2ecf20Sopenharmony_ci				AB8500_STW4500CTRL3_RESETAUDN);
19378c2ecf20Sopenharmony_ci	if (status < 0)
19388c2ecf20Sopenharmony_ci		return status;
19398c2ecf20Sopenharmony_ci
19408c2ecf20Sopenharmony_ci	return 0;
19418c2ecf20Sopenharmony_ci}
19428c2ecf20Sopenharmony_ci
19438c2ecf20Sopenharmony_cistatic int ab8500_audio_setup_mics(struct snd_soc_component *component,
19448c2ecf20Sopenharmony_ci			struct amic_settings *amics)
19458c2ecf20Sopenharmony_ci{
19468c2ecf20Sopenharmony_ci	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
19478c2ecf20Sopenharmony_ci	u8 value8;
19488c2ecf20Sopenharmony_ci	unsigned int value;
19498c2ecf20Sopenharmony_ci	int status;
19508c2ecf20Sopenharmony_ci	const struct snd_soc_dapm_route *route;
19518c2ecf20Sopenharmony_ci
19528c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Enter.\n", __func__);
19538c2ecf20Sopenharmony_ci
19548c2ecf20Sopenharmony_ci	/* Set DMic-clocks to outputs */
19558c2ecf20Sopenharmony_ci	status = abx500_get_register_interruptible(component->dev, AB8500_MISC,
19568c2ecf20Sopenharmony_ci						AB8500_GPIO_DIR4_REG,
19578c2ecf20Sopenharmony_ci						&value8);
19588c2ecf20Sopenharmony_ci	if (status < 0)
19598c2ecf20Sopenharmony_ci		return status;
19608c2ecf20Sopenharmony_ci	value = value8 | GPIO27_DIR_OUTPUT | GPIO29_DIR_OUTPUT |
19618c2ecf20Sopenharmony_ci		GPIO31_DIR_OUTPUT;
19628c2ecf20Sopenharmony_ci	status = abx500_set_register_interruptible(component->dev,
19638c2ecf20Sopenharmony_ci						AB8500_MISC,
19648c2ecf20Sopenharmony_ci						AB8500_GPIO_DIR4_REG,
19658c2ecf20Sopenharmony_ci						value);
19668c2ecf20Sopenharmony_ci	if (status < 0)
19678c2ecf20Sopenharmony_ci		return status;
19688c2ecf20Sopenharmony_ci
19698c2ecf20Sopenharmony_ci	/* Attach regulators to AMic DAPM-paths */
19708c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Mic 1a regulator: %s\n", __func__,
19718c2ecf20Sopenharmony_ci		amic_micbias_str(amics->mic1a_micbias));
19728c2ecf20Sopenharmony_ci	route = &ab8500_dapm_routes_mic1a_vamicx[amics->mic1a_micbias];
19738c2ecf20Sopenharmony_ci	status = snd_soc_dapm_add_routes(dapm, route, 1);
19748c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Mic 1b regulator: %s\n", __func__,
19758c2ecf20Sopenharmony_ci		amic_micbias_str(amics->mic1b_micbias));
19768c2ecf20Sopenharmony_ci	route = &ab8500_dapm_routes_mic1b_vamicx[amics->mic1b_micbias];
19778c2ecf20Sopenharmony_ci	status |= snd_soc_dapm_add_routes(dapm, route, 1);
19788c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Mic 2 regulator: %s\n", __func__,
19798c2ecf20Sopenharmony_ci		amic_micbias_str(amics->mic2_micbias));
19808c2ecf20Sopenharmony_ci	route = &ab8500_dapm_routes_mic2_vamicx[amics->mic2_micbias];
19818c2ecf20Sopenharmony_ci	status |= snd_soc_dapm_add_routes(dapm, route, 1);
19828c2ecf20Sopenharmony_ci	if (status < 0) {
19838c2ecf20Sopenharmony_ci		dev_err(component->dev,
19848c2ecf20Sopenharmony_ci			"%s: Failed to add AMic-regulator DAPM-routes (%d).\n",
19858c2ecf20Sopenharmony_ci			__func__, status);
19868c2ecf20Sopenharmony_ci		return status;
19878c2ecf20Sopenharmony_ci	}
19888c2ecf20Sopenharmony_ci
19898c2ecf20Sopenharmony_ci	/* Set AMic-configuration */
19908c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Mic 1 mic-type: %s\n", __func__,
19918c2ecf20Sopenharmony_ci		amic_type_str(amics->mic1_type));
19928c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_ANAGAIN1, AB8500_ANAGAINX_ENSEMICX,
19938c2ecf20Sopenharmony_ci			amics->mic1_type == AMIC_TYPE_DIFFERENTIAL ?
19948c2ecf20Sopenharmony_ci				0 : AB8500_ANAGAINX_ENSEMICX);
19958c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Mic 2 mic-type: %s\n", __func__,
19968c2ecf20Sopenharmony_ci		amic_type_str(amics->mic2_type));
19978c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_ANAGAIN2, AB8500_ANAGAINX_ENSEMICX,
19988c2ecf20Sopenharmony_ci			amics->mic2_type == AMIC_TYPE_DIFFERENTIAL ?
19998c2ecf20Sopenharmony_ci				0 : AB8500_ANAGAINX_ENSEMICX);
20008c2ecf20Sopenharmony_ci
20018c2ecf20Sopenharmony_ci	return 0;
20028c2ecf20Sopenharmony_ci}
20038c2ecf20Sopenharmony_ci
20048c2ecf20Sopenharmony_cistatic int ab8500_audio_set_ear_cmv(struct snd_soc_component *component,
20058c2ecf20Sopenharmony_ci				enum ear_cm_voltage ear_cmv)
20068c2ecf20Sopenharmony_ci{
20078c2ecf20Sopenharmony_ci	char *cmv_str;
20088c2ecf20Sopenharmony_ci
20098c2ecf20Sopenharmony_ci	switch (ear_cmv) {
20108c2ecf20Sopenharmony_ci	case EAR_CMV_0_95V:
20118c2ecf20Sopenharmony_ci		cmv_str = "0.95V";
20128c2ecf20Sopenharmony_ci		break;
20138c2ecf20Sopenharmony_ci	case EAR_CMV_1_10V:
20148c2ecf20Sopenharmony_ci		cmv_str = "1.10V";
20158c2ecf20Sopenharmony_ci		break;
20168c2ecf20Sopenharmony_ci	case EAR_CMV_1_27V:
20178c2ecf20Sopenharmony_ci		cmv_str = "1.27V";
20188c2ecf20Sopenharmony_ci		break;
20198c2ecf20Sopenharmony_ci	case EAR_CMV_1_58V:
20208c2ecf20Sopenharmony_ci		cmv_str = "1.58V";
20218c2ecf20Sopenharmony_ci		break;
20228c2ecf20Sopenharmony_ci	default:
20238c2ecf20Sopenharmony_ci		dev_err(component->dev,
20248c2ecf20Sopenharmony_ci			"%s: Unknown earpiece CM-voltage (%d)!\n",
20258c2ecf20Sopenharmony_ci			__func__, (int)ear_cmv);
20268c2ecf20Sopenharmony_ci		return -EINVAL;
20278c2ecf20Sopenharmony_ci	}
20288c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Earpiece CM-voltage: %s\n", __func__,
20298c2ecf20Sopenharmony_ci		cmv_str);
20308c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_ANACONF1, AB8500_ANACONF1_EARSELCM,
20318c2ecf20Sopenharmony_ci			ear_cmv);
20328c2ecf20Sopenharmony_ci
20338c2ecf20Sopenharmony_ci	return 0;
20348c2ecf20Sopenharmony_ci}
20358c2ecf20Sopenharmony_ci
20368c2ecf20Sopenharmony_cistatic int ab8500_audio_set_bit_delay(struct snd_soc_dai *dai,
20378c2ecf20Sopenharmony_ci				unsigned int delay)
20388c2ecf20Sopenharmony_ci{
20398c2ecf20Sopenharmony_ci	unsigned int mask, val;
20408c2ecf20Sopenharmony_ci	struct snd_soc_component *component = dai->component;
20418c2ecf20Sopenharmony_ci
20428c2ecf20Sopenharmony_ci	mask = BIT(AB8500_DIGIFCONF2_IF0DEL);
20438c2ecf20Sopenharmony_ci	val = 0;
20448c2ecf20Sopenharmony_ci
20458c2ecf20Sopenharmony_ci	switch (delay) {
20468c2ecf20Sopenharmony_ci	case 0:
20478c2ecf20Sopenharmony_ci		break;
20488c2ecf20Sopenharmony_ci	case 1:
20498c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_IF0DEL);
20508c2ecf20Sopenharmony_ci		break;
20518c2ecf20Sopenharmony_ci	default:
20528c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
20538c2ecf20Sopenharmony_ci			"%s: ERROR: Unsupported bit-delay (0x%x)!\n",
20548c2ecf20Sopenharmony_ci			__func__, delay);
20558c2ecf20Sopenharmony_ci		return -EINVAL;
20568c2ecf20Sopenharmony_ci	}
20578c2ecf20Sopenharmony_ci
20588c2ecf20Sopenharmony_ci	dev_dbg(dai->component->dev, "%s: IF0 Bit-delay: %d bits.\n",
20598c2ecf20Sopenharmony_ci		__func__, delay);
20608c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
20618c2ecf20Sopenharmony_ci
20628c2ecf20Sopenharmony_ci	return 0;
20638c2ecf20Sopenharmony_ci}
20648c2ecf20Sopenharmony_ci
20658c2ecf20Sopenharmony_ci/* Gates clocking according format mask */
20668c2ecf20Sopenharmony_cistatic int ab8500_codec_set_dai_clock_gate(struct snd_soc_component *component,
20678c2ecf20Sopenharmony_ci					unsigned int fmt)
20688c2ecf20Sopenharmony_ci{
20698c2ecf20Sopenharmony_ci	unsigned int mask;
20708c2ecf20Sopenharmony_ci	unsigned int val;
20718c2ecf20Sopenharmony_ci
20728c2ecf20Sopenharmony_ci	mask = BIT(AB8500_DIGIFCONF1_ENMASTGEN) |
20738c2ecf20Sopenharmony_ci			BIT(AB8500_DIGIFCONF1_ENFSBITCLK0);
20748c2ecf20Sopenharmony_ci
20758c2ecf20Sopenharmony_ci	val = BIT(AB8500_DIGIFCONF1_ENMASTGEN);
20768c2ecf20Sopenharmony_ci
20778c2ecf20Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
20788c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_CONT: /* continuous clock */
20798c2ecf20Sopenharmony_ci		dev_dbg(component->dev, "%s: IF0 Clock is continuous.\n",
20808c2ecf20Sopenharmony_ci			__func__);
20818c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF1_ENFSBITCLK0);
20828c2ecf20Sopenharmony_ci		break;
20838c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_GATED: /* clock is gated */
20848c2ecf20Sopenharmony_ci		dev_dbg(component->dev, "%s: IF0 Clock is gated.\n",
20858c2ecf20Sopenharmony_ci			__func__);
20868c2ecf20Sopenharmony_ci		break;
20878c2ecf20Sopenharmony_ci	default:
20888c2ecf20Sopenharmony_ci		dev_err(component->dev,
20898c2ecf20Sopenharmony_ci			"%s: ERROR: Unsupported clock mask (0x%x)!\n",
20908c2ecf20Sopenharmony_ci			__func__, fmt & SND_SOC_DAIFMT_CLOCK_MASK);
20918c2ecf20Sopenharmony_ci		return -EINVAL;
20928c2ecf20Sopenharmony_ci	}
20938c2ecf20Sopenharmony_ci
20948c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_DIGIFCONF1, mask, val);
20958c2ecf20Sopenharmony_ci
20968c2ecf20Sopenharmony_ci	return 0;
20978c2ecf20Sopenharmony_ci}
20988c2ecf20Sopenharmony_ci
20998c2ecf20Sopenharmony_cistatic int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
21008c2ecf20Sopenharmony_ci{
21018c2ecf20Sopenharmony_ci	unsigned int mask;
21028c2ecf20Sopenharmony_ci	unsigned int val;
21038c2ecf20Sopenharmony_ci	struct snd_soc_component *component = dai->component;
21048c2ecf20Sopenharmony_ci	int status;
21058c2ecf20Sopenharmony_ci
21068c2ecf20Sopenharmony_ci	dev_dbg(component->dev, "%s: Enter (fmt = 0x%x)\n", __func__, fmt);
21078c2ecf20Sopenharmony_ci
21088c2ecf20Sopenharmony_ci	mask = BIT(AB8500_DIGIFCONF3_IF1DATOIF0AD) |
21098c2ecf20Sopenharmony_ci			BIT(AB8500_DIGIFCONF3_IF1CLKTOIF0CLK) |
21108c2ecf20Sopenharmony_ci			BIT(AB8500_DIGIFCONF3_IF0BFIFOEN) |
21118c2ecf20Sopenharmony_ci			BIT(AB8500_DIGIFCONF3_IF0MASTER);
21128c2ecf20Sopenharmony_ci	val = 0;
21138c2ecf20Sopenharmony_ci
21148c2ecf20Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
21158c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & FRM master */
21168c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
21178c2ecf20Sopenharmony_ci			"%s: IF0 Master-mode: AB8500 master.\n", __func__);
21188c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF3_IF0MASTER);
21198c2ecf20Sopenharmony_ci		break;
21208c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_CBS_CFS: /* codec clk & FRM slave */
21218c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
21228c2ecf20Sopenharmony_ci			"%s: IF0 Master-mode: AB8500 slave.\n", __func__);
21238c2ecf20Sopenharmony_ci		break;
21248c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_CBS_CFM: /* codec clk slave & FRM master */
21258c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_CBM_CFS: /* codec clk master & frame slave */
21268c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
21278c2ecf20Sopenharmony_ci			"%s: ERROR: The device is either a master or a slave.\n",
21288c2ecf20Sopenharmony_ci			__func__);
21298c2ecf20Sopenharmony_ci		fallthrough;
21308c2ecf20Sopenharmony_ci	default:
21318c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
21328c2ecf20Sopenharmony_ci			"%s: ERROR: Unsupporter master mask 0x%x\n",
21338c2ecf20Sopenharmony_ci			__func__, fmt & SND_SOC_DAIFMT_MASTER_MASK);
21348c2ecf20Sopenharmony_ci		return -EINVAL;
21358c2ecf20Sopenharmony_ci	}
21368c2ecf20Sopenharmony_ci
21378c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_DIGIFCONF3, mask, val);
21388c2ecf20Sopenharmony_ci
21398c2ecf20Sopenharmony_ci	/* Set clock gating */
21408c2ecf20Sopenharmony_ci	status = ab8500_codec_set_dai_clock_gate(component, fmt);
21418c2ecf20Sopenharmony_ci	if (status) {
21428c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
21438c2ecf20Sopenharmony_ci			"%s: ERROR: Failed to set clock gate (%d).\n",
21448c2ecf20Sopenharmony_ci			__func__, status);
21458c2ecf20Sopenharmony_ci		return status;
21468c2ecf20Sopenharmony_ci	}
21478c2ecf20Sopenharmony_ci
21488c2ecf20Sopenharmony_ci	/* Setting data transfer format */
21498c2ecf20Sopenharmony_ci
21508c2ecf20Sopenharmony_ci	mask = BIT(AB8500_DIGIFCONF2_IF0FORMAT0) |
21518c2ecf20Sopenharmony_ci		BIT(AB8500_DIGIFCONF2_IF0FORMAT1) |
21528c2ecf20Sopenharmony_ci		BIT(AB8500_DIGIFCONF2_FSYNC0P) |
21538c2ecf20Sopenharmony_ci		BIT(AB8500_DIGIFCONF2_BITCLK0P);
21548c2ecf20Sopenharmony_ci	val = 0;
21558c2ecf20Sopenharmony_ci
21568c2ecf20Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
21578c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_I2S: /* I2S mode */
21588c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev, "%s: IF0 Protocol: I2S\n", __func__);
21598c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT1);
21608c2ecf20Sopenharmony_ci		ab8500_audio_set_bit_delay(dai, 0);
21618c2ecf20Sopenharmony_ci		break;
21628c2ecf20Sopenharmony_ci
21638c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_A: /* L data MSB after FRM LRC */
21648c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
21658c2ecf20Sopenharmony_ci			"%s: IF0 Protocol: DSP A (TDM)\n", __func__);
21668c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT0);
21678c2ecf20Sopenharmony_ci		ab8500_audio_set_bit_delay(dai, 1);
21688c2ecf20Sopenharmony_ci		break;
21698c2ecf20Sopenharmony_ci
21708c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_B: /* L data MSB during FRM LRC */
21718c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
21728c2ecf20Sopenharmony_ci			"%s: IF0 Protocol: DSP B (TDM)\n", __func__);
21738c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT0);
21748c2ecf20Sopenharmony_ci		ab8500_audio_set_bit_delay(dai, 0);
21758c2ecf20Sopenharmony_ci		break;
21768c2ecf20Sopenharmony_ci
21778c2ecf20Sopenharmony_ci	default:
21788c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
21798c2ecf20Sopenharmony_ci			"%s: ERROR: Unsupported format (0x%x)!\n",
21808c2ecf20Sopenharmony_ci			__func__, fmt & SND_SOC_DAIFMT_FORMAT_MASK);
21818c2ecf20Sopenharmony_ci		return -EINVAL;
21828c2ecf20Sopenharmony_ci	}
21838c2ecf20Sopenharmony_ci
21848c2ecf20Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
21858c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */
21868c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
21878c2ecf20Sopenharmony_ci			"%s: IF0: Normal bit clock, normal frame\n",
21888c2ecf20Sopenharmony_ci			__func__);
21898c2ecf20Sopenharmony_ci		break;
21908c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_NB_IF: /* normal BCLK + inv FRM */
21918c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
21928c2ecf20Sopenharmony_ci			"%s: IF0: Normal bit clock, inverted frame\n",
21938c2ecf20Sopenharmony_ci			__func__);
21948c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_FSYNC0P);
21958c2ecf20Sopenharmony_ci		break;
21968c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_IB_NF: /* invert BCLK + nor FRM */
21978c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
21988c2ecf20Sopenharmony_ci			"%s: IF0: Inverted bit clock, normal frame\n",
21998c2ecf20Sopenharmony_ci			__func__);
22008c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_BITCLK0P);
22018c2ecf20Sopenharmony_ci		break;
22028c2ecf20Sopenharmony_ci	case SND_SOC_DAIFMT_IB_IF: /* invert BCLK + FRM */
22038c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
22048c2ecf20Sopenharmony_ci			"%s: IF0: Inverted bit clock, inverted frame\n",
22058c2ecf20Sopenharmony_ci			__func__);
22068c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_FSYNC0P);
22078c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_BITCLK0P);
22088c2ecf20Sopenharmony_ci		break;
22098c2ecf20Sopenharmony_ci	default:
22108c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
22118c2ecf20Sopenharmony_ci			"%s: ERROR: Unsupported INV mask 0x%x\n",
22128c2ecf20Sopenharmony_ci			__func__, fmt & SND_SOC_DAIFMT_INV_MASK);
22138c2ecf20Sopenharmony_ci		return -EINVAL;
22148c2ecf20Sopenharmony_ci	}
22158c2ecf20Sopenharmony_ci
22168c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
22178c2ecf20Sopenharmony_ci
22188c2ecf20Sopenharmony_ci	return 0;
22198c2ecf20Sopenharmony_ci}
22208c2ecf20Sopenharmony_ci
22218c2ecf20Sopenharmony_cistatic int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai,
22228c2ecf20Sopenharmony_ci		unsigned int tx_mask, unsigned int rx_mask,
22238c2ecf20Sopenharmony_ci		int slots, int slot_width)
22248c2ecf20Sopenharmony_ci{
22258c2ecf20Sopenharmony_ci	struct snd_soc_component *component = dai->component;
22268c2ecf20Sopenharmony_ci	unsigned int val, mask, slot, slots_active;
22278c2ecf20Sopenharmony_ci
22288c2ecf20Sopenharmony_ci	mask = BIT(AB8500_DIGIFCONF2_IF0WL0) |
22298c2ecf20Sopenharmony_ci		BIT(AB8500_DIGIFCONF2_IF0WL1);
22308c2ecf20Sopenharmony_ci	val = 0;
22318c2ecf20Sopenharmony_ci
22328c2ecf20Sopenharmony_ci	switch (slot_width) {
22338c2ecf20Sopenharmony_ci	case 16:
22348c2ecf20Sopenharmony_ci		break;
22358c2ecf20Sopenharmony_ci	case 20:
22368c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_IF0WL0);
22378c2ecf20Sopenharmony_ci		break;
22388c2ecf20Sopenharmony_ci	case 24:
22398c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_IF0WL1);
22408c2ecf20Sopenharmony_ci		break;
22418c2ecf20Sopenharmony_ci	case 32:
22428c2ecf20Sopenharmony_ci		val |= BIT(AB8500_DIGIFCONF2_IF0WL1) |
22438c2ecf20Sopenharmony_ci			BIT(AB8500_DIGIFCONF2_IF0WL0);
22448c2ecf20Sopenharmony_ci		break;
22458c2ecf20Sopenharmony_ci	default:
22468c2ecf20Sopenharmony_ci		dev_err(dai->component->dev, "%s: Unsupported slot-width 0x%x\n",
22478c2ecf20Sopenharmony_ci			__func__, slot_width);
22488c2ecf20Sopenharmony_ci		return -EINVAL;
22498c2ecf20Sopenharmony_ci	}
22508c2ecf20Sopenharmony_ci
22518c2ecf20Sopenharmony_ci	dev_dbg(dai->component->dev, "%s: IF0 slot-width: %d bits.\n",
22528c2ecf20Sopenharmony_ci		__func__, slot_width);
22538c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
22548c2ecf20Sopenharmony_ci
22558c2ecf20Sopenharmony_ci	/* Setup TDM clocking according to slot count */
22568c2ecf20Sopenharmony_ci	dev_dbg(dai->component->dev, "%s: Slots, total: %d\n", __func__, slots);
22578c2ecf20Sopenharmony_ci	mask = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0) |
22588c2ecf20Sopenharmony_ci			BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
22598c2ecf20Sopenharmony_ci	switch (slots) {
22608c2ecf20Sopenharmony_ci	case 2:
22618c2ecf20Sopenharmony_ci		val = AB8500_MASK_NONE;
22628c2ecf20Sopenharmony_ci		break;
22638c2ecf20Sopenharmony_ci	case 4:
22648c2ecf20Sopenharmony_ci		val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0);
22658c2ecf20Sopenharmony_ci		break;
22668c2ecf20Sopenharmony_ci	case 8:
22678c2ecf20Sopenharmony_ci		val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
22688c2ecf20Sopenharmony_ci		break;
22698c2ecf20Sopenharmony_ci	case 16:
22708c2ecf20Sopenharmony_ci		val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0) |
22718c2ecf20Sopenharmony_ci			BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
22728c2ecf20Sopenharmony_ci		break;
22738c2ecf20Sopenharmony_ci	default:
22748c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
22758c2ecf20Sopenharmony_ci			"%s: ERROR: Unsupported number of slots (%d)!\n",
22768c2ecf20Sopenharmony_ci			__func__, slots);
22778c2ecf20Sopenharmony_ci		return -EINVAL;
22788c2ecf20Sopenharmony_ci	}
22798c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, AB8500_DIGIFCONF1, mask, val);
22808c2ecf20Sopenharmony_ci
22818c2ecf20Sopenharmony_ci	/* Setup TDM DA according to active tx slots */
22828c2ecf20Sopenharmony_ci
22838c2ecf20Sopenharmony_ci	if (tx_mask & ~0xff)
22848c2ecf20Sopenharmony_ci		return -EINVAL;
22858c2ecf20Sopenharmony_ci
22868c2ecf20Sopenharmony_ci	mask = AB8500_DASLOTCONFX_SLTODAX_MASK;
22878c2ecf20Sopenharmony_ci	tx_mask = tx_mask << AB8500_DA_DATA0_OFFSET;
22888c2ecf20Sopenharmony_ci	slots_active = hweight32(tx_mask);
22898c2ecf20Sopenharmony_ci
22908c2ecf20Sopenharmony_ci	dev_dbg(dai->component->dev, "%s: Slots, active, TX: %d\n", __func__,
22918c2ecf20Sopenharmony_ci		slots_active);
22928c2ecf20Sopenharmony_ci
22938c2ecf20Sopenharmony_ci	switch (slots_active) {
22948c2ecf20Sopenharmony_ci	case 0:
22958c2ecf20Sopenharmony_ci		break;
22968c2ecf20Sopenharmony_ci	case 1:
22978c2ecf20Sopenharmony_ci		slot = ffs(tx_mask);
22988c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_DASLOTCONF1, mask, slot);
22998c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_DASLOTCONF3, mask, slot);
23008c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_DASLOTCONF2, mask, slot);
23018c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_DASLOTCONF4, mask, slot);
23028c2ecf20Sopenharmony_ci		break;
23038c2ecf20Sopenharmony_ci	case 2:
23048c2ecf20Sopenharmony_ci		slot = ffs(tx_mask);
23058c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_DASLOTCONF1, mask, slot);
23068c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_DASLOTCONF3, mask, slot);
23078c2ecf20Sopenharmony_ci		slot = fls(tx_mask);
23088c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_DASLOTCONF2, mask, slot);
23098c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_DASLOTCONF4, mask, slot);
23108c2ecf20Sopenharmony_ci		break;
23118c2ecf20Sopenharmony_ci	case 8:
23128c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
23138c2ecf20Sopenharmony_ci			"%s: In 8-channel mode DA-from-slot mapping is set manually.",
23148c2ecf20Sopenharmony_ci			__func__);
23158c2ecf20Sopenharmony_ci		break;
23168c2ecf20Sopenharmony_ci	default:
23178c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
23188c2ecf20Sopenharmony_ci			"%s: Unsupported number of active TX-slots (%d)!\n",
23198c2ecf20Sopenharmony_ci			__func__, slots_active);
23208c2ecf20Sopenharmony_ci		return -EINVAL;
23218c2ecf20Sopenharmony_ci	}
23228c2ecf20Sopenharmony_ci
23238c2ecf20Sopenharmony_ci	/* Setup TDM AD according to active RX-slots */
23248c2ecf20Sopenharmony_ci
23258c2ecf20Sopenharmony_ci	if (rx_mask & ~0xff)
23268c2ecf20Sopenharmony_ci		return -EINVAL;
23278c2ecf20Sopenharmony_ci
23288c2ecf20Sopenharmony_ci	rx_mask = rx_mask << AB8500_AD_DATA0_OFFSET;
23298c2ecf20Sopenharmony_ci	slots_active = hweight32(rx_mask);
23308c2ecf20Sopenharmony_ci
23318c2ecf20Sopenharmony_ci	dev_dbg(dai->component->dev, "%s: Slots, active, RX: %d\n", __func__,
23328c2ecf20Sopenharmony_ci		slots_active);
23338c2ecf20Sopenharmony_ci
23348c2ecf20Sopenharmony_ci	switch (slots_active) {
23358c2ecf20Sopenharmony_ci	case 0:
23368c2ecf20Sopenharmony_ci		break;
23378c2ecf20Sopenharmony_ci	case 1:
23388c2ecf20Sopenharmony_ci		slot = ffs(rx_mask);
23398c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component, AB8500_ADSLOTSEL(slot),
23408c2ecf20Sopenharmony_ci				AB8500_MASK_SLOT(slot),
23418c2ecf20Sopenharmony_ci				AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
23428c2ecf20Sopenharmony_ci		break;
23438c2ecf20Sopenharmony_ci	case 2:
23448c2ecf20Sopenharmony_ci		slot = ffs(rx_mask);
23458c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component,
23468c2ecf20Sopenharmony_ci				AB8500_ADSLOTSEL(slot),
23478c2ecf20Sopenharmony_ci				AB8500_MASK_SLOT(slot),
23488c2ecf20Sopenharmony_ci				AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
23498c2ecf20Sopenharmony_ci		slot = fls(rx_mask);
23508c2ecf20Sopenharmony_ci		snd_soc_component_update_bits(component,
23518c2ecf20Sopenharmony_ci				AB8500_ADSLOTSEL(slot),
23528c2ecf20Sopenharmony_ci				AB8500_MASK_SLOT(slot),
23538c2ecf20Sopenharmony_ci				AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT2, slot));
23548c2ecf20Sopenharmony_ci		break;
23558c2ecf20Sopenharmony_ci	case 8:
23568c2ecf20Sopenharmony_ci		dev_dbg(dai->component->dev,
23578c2ecf20Sopenharmony_ci			"%s: In 8-channel mode AD-to-slot mapping is set manually.",
23588c2ecf20Sopenharmony_ci			__func__);
23598c2ecf20Sopenharmony_ci		break;
23608c2ecf20Sopenharmony_ci	default:
23618c2ecf20Sopenharmony_ci		dev_err(dai->component->dev,
23628c2ecf20Sopenharmony_ci			"%s: Unsupported number of active RX-slots (%d)!\n",
23638c2ecf20Sopenharmony_ci			__func__, slots_active);
23648c2ecf20Sopenharmony_ci		return -EINVAL;
23658c2ecf20Sopenharmony_ci	}
23668c2ecf20Sopenharmony_ci
23678c2ecf20Sopenharmony_ci	return 0;
23688c2ecf20Sopenharmony_ci}
23698c2ecf20Sopenharmony_ci
23708c2ecf20Sopenharmony_cistatic const struct snd_soc_dai_ops ab8500_codec_ops = {
23718c2ecf20Sopenharmony_ci	.set_fmt = ab8500_codec_set_dai_fmt,
23728c2ecf20Sopenharmony_ci	.set_tdm_slot = ab8500_codec_set_dai_tdm_slot,
23738c2ecf20Sopenharmony_ci};
23748c2ecf20Sopenharmony_ci
23758c2ecf20Sopenharmony_cistatic struct snd_soc_dai_driver ab8500_codec_dai[] = {
23768c2ecf20Sopenharmony_ci	{
23778c2ecf20Sopenharmony_ci		.name = "ab8500-codec-dai.0",
23788c2ecf20Sopenharmony_ci		.id = 0,
23798c2ecf20Sopenharmony_ci		.playback = {
23808c2ecf20Sopenharmony_ci			.stream_name = "ab8500_0p",
23818c2ecf20Sopenharmony_ci			.channels_min = 1,
23828c2ecf20Sopenharmony_ci			.channels_max = 8,
23838c2ecf20Sopenharmony_ci			.rates = AB8500_SUPPORTED_RATE,
23848c2ecf20Sopenharmony_ci			.formats = AB8500_SUPPORTED_FMT,
23858c2ecf20Sopenharmony_ci		},
23868c2ecf20Sopenharmony_ci		.ops = &ab8500_codec_ops,
23878c2ecf20Sopenharmony_ci		.symmetric_rates = 1
23888c2ecf20Sopenharmony_ci	},
23898c2ecf20Sopenharmony_ci	{
23908c2ecf20Sopenharmony_ci		.name = "ab8500-codec-dai.1",
23918c2ecf20Sopenharmony_ci		.id = 1,
23928c2ecf20Sopenharmony_ci		.capture = {
23938c2ecf20Sopenharmony_ci			.stream_name = "ab8500_0c",
23948c2ecf20Sopenharmony_ci			.channels_min = 1,
23958c2ecf20Sopenharmony_ci			.channels_max = 8,
23968c2ecf20Sopenharmony_ci			.rates = AB8500_SUPPORTED_RATE,
23978c2ecf20Sopenharmony_ci			.formats = AB8500_SUPPORTED_FMT,
23988c2ecf20Sopenharmony_ci		},
23998c2ecf20Sopenharmony_ci		.ops = &ab8500_codec_ops,
24008c2ecf20Sopenharmony_ci		.symmetric_rates = 1
24018c2ecf20Sopenharmony_ci	}
24028c2ecf20Sopenharmony_ci};
24038c2ecf20Sopenharmony_ci
24048c2ecf20Sopenharmony_cistatic void ab8500_codec_of_probe(struct device *dev, struct device_node *np,
24058c2ecf20Sopenharmony_ci				struct ab8500_codec_platform_data *codec)
24068c2ecf20Sopenharmony_ci{
24078c2ecf20Sopenharmony_ci	u32 value;
24088c2ecf20Sopenharmony_ci
24098c2ecf20Sopenharmony_ci	if (of_property_read_bool(np, "stericsson,amic1-type-single-ended"))
24108c2ecf20Sopenharmony_ci		codec->amics.mic1_type = AMIC_TYPE_SINGLE_ENDED;
24118c2ecf20Sopenharmony_ci	else
24128c2ecf20Sopenharmony_ci		codec->amics.mic1_type = AMIC_TYPE_DIFFERENTIAL;
24138c2ecf20Sopenharmony_ci
24148c2ecf20Sopenharmony_ci	if (of_property_read_bool(np, "stericsson,amic2-type-single-ended"))
24158c2ecf20Sopenharmony_ci		codec->amics.mic2_type = AMIC_TYPE_SINGLE_ENDED;
24168c2ecf20Sopenharmony_ci	else
24178c2ecf20Sopenharmony_ci		codec->amics.mic2_type = AMIC_TYPE_DIFFERENTIAL;
24188c2ecf20Sopenharmony_ci
24198c2ecf20Sopenharmony_ci	/* Has a non-standard Vamic been requested? */
24208c2ecf20Sopenharmony_ci	if (of_property_read_bool(np, "stericsson,amic1a-bias-vamic2"))
24218c2ecf20Sopenharmony_ci		codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC2;
24228c2ecf20Sopenharmony_ci	else
24238c2ecf20Sopenharmony_ci		codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC1;
24248c2ecf20Sopenharmony_ci
24258c2ecf20Sopenharmony_ci	if (of_property_read_bool(np, "stericsson,amic1b-bias-vamic2"))
24268c2ecf20Sopenharmony_ci		codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC2;
24278c2ecf20Sopenharmony_ci	else
24288c2ecf20Sopenharmony_ci		codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC1;
24298c2ecf20Sopenharmony_ci
24308c2ecf20Sopenharmony_ci	if (of_property_read_bool(np, "stericsson,amic2-bias-vamic1"))
24318c2ecf20Sopenharmony_ci		codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC1;
24328c2ecf20Sopenharmony_ci	else
24338c2ecf20Sopenharmony_ci		codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC2;
24348c2ecf20Sopenharmony_ci
24358c2ecf20Sopenharmony_ci	if (!of_property_read_u32(np, "stericsson,earpeice-cmv", &value)) {
24368c2ecf20Sopenharmony_ci		switch (value) {
24378c2ecf20Sopenharmony_ci		case 950 :
24388c2ecf20Sopenharmony_ci			codec->ear_cmv = EAR_CMV_0_95V;
24398c2ecf20Sopenharmony_ci			break;
24408c2ecf20Sopenharmony_ci		case 1100 :
24418c2ecf20Sopenharmony_ci			codec->ear_cmv = EAR_CMV_1_10V;
24428c2ecf20Sopenharmony_ci			break;
24438c2ecf20Sopenharmony_ci		case 1270 :
24448c2ecf20Sopenharmony_ci			codec->ear_cmv = EAR_CMV_1_27V;
24458c2ecf20Sopenharmony_ci			break;
24468c2ecf20Sopenharmony_ci		case 1580 :
24478c2ecf20Sopenharmony_ci			codec->ear_cmv = EAR_CMV_1_58V;
24488c2ecf20Sopenharmony_ci			break;
24498c2ecf20Sopenharmony_ci		default :
24508c2ecf20Sopenharmony_ci			codec->ear_cmv = EAR_CMV_UNKNOWN;
24518c2ecf20Sopenharmony_ci			dev_err(dev, "Unsuitable earpiece voltage found in DT\n");
24528c2ecf20Sopenharmony_ci		}
24538c2ecf20Sopenharmony_ci	} else {
24548c2ecf20Sopenharmony_ci		dev_warn(dev, "No earpiece voltage found in DT - using default\n");
24558c2ecf20Sopenharmony_ci		codec->ear_cmv = EAR_CMV_0_95V;
24568c2ecf20Sopenharmony_ci	}
24578c2ecf20Sopenharmony_ci}
24588c2ecf20Sopenharmony_ci
24598c2ecf20Sopenharmony_cistatic int ab8500_codec_probe(struct snd_soc_component *component)
24608c2ecf20Sopenharmony_ci{
24618c2ecf20Sopenharmony_ci	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
24628c2ecf20Sopenharmony_ci	struct device *dev = component->dev;
24638c2ecf20Sopenharmony_ci	struct device_node *np = dev->of_node;
24648c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(dev);
24658c2ecf20Sopenharmony_ci	struct ab8500_codec_platform_data codec_pdata;
24668c2ecf20Sopenharmony_ci	struct filter_control *fc;
24678c2ecf20Sopenharmony_ci	int status;
24688c2ecf20Sopenharmony_ci
24698c2ecf20Sopenharmony_ci	dev_dbg(dev, "%s: Enter.\n", __func__);
24708c2ecf20Sopenharmony_ci
24718c2ecf20Sopenharmony_ci	ab8500_codec_of_probe(dev, np, &codec_pdata);
24728c2ecf20Sopenharmony_ci
24738c2ecf20Sopenharmony_ci	status = ab8500_audio_setup_mics(component, &codec_pdata.amics);
24748c2ecf20Sopenharmony_ci	if (status < 0) {
24758c2ecf20Sopenharmony_ci		pr_err("%s: Failed to setup mics (%d)!\n", __func__, status);
24768c2ecf20Sopenharmony_ci		return status;
24778c2ecf20Sopenharmony_ci	}
24788c2ecf20Sopenharmony_ci	status = ab8500_audio_set_ear_cmv(component, codec_pdata.ear_cmv);
24798c2ecf20Sopenharmony_ci	if (status < 0) {
24808c2ecf20Sopenharmony_ci		pr_err("%s: Failed to set earpiece CM-voltage (%d)!\n",
24818c2ecf20Sopenharmony_ci			__func__, status);
24828c2ecf20Sopenharmony_ci		return status;
24838c2ecf20Sopenharmony_ci	}
24848c2ecf20Sopenharmony_ci
24858c2ecf20Sopenharmony_ci	status = ab8500_audio_init_audioblock(component);
24868c2ecf20Sopenharmony_ci	if (status < 0) {
24878c2ecf20Sopenharmony_ci		dev_err(dev, "%s: failed to init audio-block (%d)!\n",
24888c2ecf20Sopenharmony_ci			__func__, status);
24898c2ecf20Sopenharmony_ci		return status;
24908c2ecf20Sopenharmony_ci	}
24918c2ecf20Sopenharmony_ci
24928c2ecf20Sopenharmony_ci	/* Override HW-defaults */
24938c2ecf20Sopenharmony_ci	snd_soc_component_write(component, AB8500_ANACONF5,
24948c2ecf20Sopenharmony_ci		      BIT(AB8500_ANACONF5_HSAUTOEN));
24958c2ecf20Sopenharmony_ci	snd_soc_component_write(component, AB8500_SHORTCIRCONF,
24968c2ecf20Sopenharmony_ci		      BIT(AB8500_SHORTCIRCONF_HSZCDDIS));
24978c2ecf20Sopenharmony_ci
24988c2ecf20Sopenharmony_ci	/* Add filter controls */
24998c2ecf20Sopenharmony_ci	status = snd_soc_add_component_controls(component, ab8500_filter_controls,
25008c2ecf20Sopenharmony_ci				ARRAY_SIZE(ab8500_filter_controls));
25018c2ecf20Sopenharmony_ci	if (status < 0) {
25028c2ecf20Sopenharmony_ci		dev_err(dev,
25038c2ecf20Sopenharmony_ci			"%s: failed to add ab8500 filter controls (%d).\n",
25048c2ecf20Sopenharmony_ci			__func__, status);
25058c2ecf20Sopenharmony_ci		return status;
25068c2ecf20Sopenharmony_ci	}
25078c2ecf20Sopenharmony_ci	fc = (struct filter_control *)
25088c2ecf20Sopenharmony_ci		&ab8500_filter_controls[AB8500_FILTER_ANC_FIR].private_value;
25098c2ecf20Sopenharmony_ci	drvdata->anc_fir_values = (long *)fc->value;
25108c2ecf20Sopenharmony_ci	fc = (struct filter_control *)
25118c2ecf20Sopenharmony_ci		&ab8500_filter_controls[AB8500_FILTER_ANC_IIR].private_value;
25128c2ecf20Sopenharmony_ci	drvdata->anc_iir_values = (long *)fc->value;
25138c2ecf20Sopenharmony_ci	fc = (struct filter_control *)
25148c2ecf20Sopenharmony_ci		&ab8500_filter_controls[AB8500_FILTER_SID_FIR].private_value;
25158c2ecf20Sopenharmony_ci	drvdata->sid_fir_values = (long *)fc->value;
25168c2ecf20Sopenharmony_ci
25178c2ecf20Sopenharmony_ci	snd_soc_dapm_disable_pin(dapm, "ANC Configure Input");
25188c2ecf20Sopenharmony_ci
25198c2ecf20Sopenharmony_ci	mutex_init(&drvdata->ctrl_lock);
25208c2ecf20Sopenharmony_ci
25218c2ecf20Sopenharmony_ci	return status;
25228c2ecf20Sopenharmony_ci}
25238c2ecf20Sopenharmony_ci
25248c2ecf20Sopenharmony_cistatic const struct snd_soc_component_driver ab8500_component_driver = {
25258c2ecf20Sopenharmony_ci	.probe			= ab8500_codec_probe,
25268c2ecf20Sopenharmony_ci	.controls		= ab8500_ctrls,
25278c2ecf20Sopenharmony_ci	.num_controls		= ARRAY_SIZE(ab8500_ctrls),
25288c2ecf20Sopenharmony_ci	.dapm_widgets		= ab8500_dapm_widgets,
25298c2ecf20Sopenharmony_ci	.num_dapm_widgets	= ARRAY_SIZE(ab8500_dapm_widgets),
25308c2ecf20Sopenharmony_ci	.dapm_routes		= ab8500_dapm_routes,
25318c2ecf20Sopenharmony_ci	.num_dapm_routes	= ARRAY_SIZE(ab8500_dapm_routes),
25328c2ecf20Sopenharmony_ci	.idle_bias_on		= 1,
25338c2ecf20Sopenharmony_ci	.use_pmdown_time	= 1,
25348c2ecf20Sopenharmony_ci	.endianness		= 1,
25358c2ecf20Sopenharmony_ci	.non_legacy_dai_naming	= 1,
25368c2ecf20Sopenharmony_ci};
25378c2ecf20Sopenharmony_ci
25388c2ecf20Sopenharmony_cistatic int ab8500_codec_driver_probe(struct platform_device *pdev)
25398c2ecf20Sopenharmony_ci{
25408c2ecf20Sopenharmony_ci	int status;
25418c2ecf20Sopenharmony_ci	struct ab8500_codec_drvdata *drvdata;
25428c2ecf20Sopenharmony_ci
25438c2ecf20Sopenharmony_ci	dev_dbg(&pdev->dev, "%s: Enter.\n", __func__);
25448c2ecf20Sopenharmony_ci
25458c2ecf20Sopenharmony_ci	/* Create driver private-data struct */
25468c2ecf20Sopenharmony_ci	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct ab8500_codec_drvdata),
25478c2ecf20Sopenharmony_ci			GFP_KERNEL);
25488c2ecf20Sopenharmony_ci	if (!drvdata)
25498c2ecf20Sopenharmony_ci		return -ENOMEM;
25508c2ecf20Sopenharmony_ci	drvdata->sid_status = SID_UNCONFIGURED;
25518c2ecf20Sopenharmony_ci	drvdata->anc_status = ANC_UNCONFIGURED;
25528c2ecf20Sopenharmony_ci	dev_set_drvdata(&pdev->dev, drvdata);
25538c2ecf20Sopenharmony_ci
25548c2ecf20Sopenharmony_ci	drvdata->regmap = devm_regmap_init(&pdev->dev, NULL, &pdev->dev,
25558c2ecf20Sopenharmony_ci					   &ab8500_codec_regmap);
25568c2ecf20Sopenharmony_ci	if (IS_ERR(drvdata->regmap)) {
25578c2ecf20Sopenharmony_ci		status = PTR_ERR(drvdata->regmap);
25588c2ecf20Sopenharmony_ci		dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n",
25598c2ecf20Sopenharmony_ci			__func__, status);
25608c2ecf20Sopenharmony_ci		return status;
25618c2ecf20Sopenharmony_ci	}
25628c2ecf20Sopenharmony_ci
25638c2ecf20Sopenharmony_ci	dev_dbg(&pdev->dev, "%s: Register codec.\n", __func__);
25648c2ecf20Sopenharmony_ci	status = devm_snd_soc_register_component(&pdev->dev,
25658c2ecf20Sopenharmony_ci				&ab8500_component_driver,
25668c2ecf20Sopenharmony_ci				ab8500_codec_dai,
25678c2ecf20Sopenharmony_ci				ARRAY_SIZE(ab8500_codec_dai));
25688c2ecf20Sopenharmony_ci	if (status < 0)
25698c2ecf20Sopenharmony_ci		dev_err(&pdev->dev,
25708c2ecf20Sopenharmony_ci			"%s: Error: Failed to register codec (%d).\n",
25718c2ecf20Sopenharmony_ci			__func__, status);
25728c2ecf20Sopenharmony_ci
25738c2ecf20Sopenharmony_ci	return status;
25748c2ecf20Sopenharmony_ci}
25758c2ecf20Sopenharmony_ci
25768c2ecf20Sopenharmony_cistatic struct platform_driver ab8500_codec_platform_driver = {
25778c2ecf20Sopenharmony_ci	.driver	= {
25788c2ecf20Sopenharmony_ci		.name	= "ab8500-codec",
25798c2ecf20Sopenharmony_ci	},
25808c2ecf20Sopenharmony_ci	.probe		= ab8500_codec_driver_probe,
25818c2ecf20Sopenharmony_ci};
25828c2ecf20Sopenharmony_cimodule_platform_driver(ab8500_codec_platform_driver);
25838c2ecf20Sopenharmony_ci
25848c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2");
2585