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