Lines Matching +full:static +full:- +full:enable
2 * Copyright (C) ST-Ericsson SA 2012
7 * for ST-Ericsson.
13 * for ST-Ericsson.
34 #include <linux/mfd/abx500/ab8500-sysctrl.h>
35 #include <linux/mfd/abx500/ab8500-codec.h>
44 #include <sound/soc-dapm.h>
47 #include "ab8500-codec.h"
61 /* Nr of FIR/IIR-coeff banks in ANC-block */
82 static const char * const enum_sid_state[] = {
93 static const char * const enum_anc_state[] = {
126 /* Private data for AB8500 device-driver */
141 static inline const char *amic_micbias_str(enum amic_micbias micbias) in amic_micbias_str()
153 static inline const char *amic_type_str(enum amic_type type) in amic_type_str()
169 /* Read a register from the audio-bank of AB8500 */
170 static int ab8500_codec_read_reg(void *context, unsigned int reg, in ab8500_codec_read_reg()
184 /* Write to a register in the audio-bank of AB8500 */
185 static int ab8500_codec_write_reg(void *context, unsigned int reg, in ab8500_codec_write_reg()
194 static const struct regmap_config ab8500_codec_regmap = {
200 * Controls - DAPM
206 static const char * const enum_ear_lineout_source[] = {"Headset Left",
208 static SOC_ENUM_SINGLE_DECL(dapm_enum_ear_lineout_source, AB8500_DMICFILTCONF,
210 static const struct snd_kcontrol_new dapm_ear_lineout_source =
217 static const char * const enum_lineout_source[] = {"Mono Path", "Stereo Path"};
218 static SOC_ENUM_DOUBLE_DECL(dapm_enum_lineout_source, AB8500_ANACONF5,
221 static const struct snd_kcontrol_new dapm_lineout_source[] = {
227 /* Speaker Left - ANC selector */
228 static const char * const enum_HFx_sel[] = {"Audio Path", "ANC"};
229 static SOC_ENUM_SINGLE_DECL(dapm_enum_HFl_sel, AB8500_DIGMULTCONF2,
231 static const struct snd_kcontrol_new dapm_HFl_select[] = {
235 /* Speaker Right - ANC selector */
236 static SOC_ENUM_SINGLE_DECL(dapm_enum_HFr_sel, AB8500_DIGMULTCONF2,
238 static const struct snd_kcontrol_new dapm_HFr_select[] = {
244 /* Mic 1 - Mic 1a or 1b selector */
245 static const char * const enum_mic1ab_sel[] = {"Mic 1b", "Mic 1a"};
246 static SOC_ENUM_SINGLE_DECL(dapm_enum_mic1ab_sel, AB8500_ANACONF3,
248 static const struct snd_kcontrol_new dapm_mic1ab_mux[] = {
252 /* Mic 1 - AD3 - Mic 1 or DMic 3 selector */
253 static const char * const enum_ad3_sel[] = {"Mic 1", "DMic 3"};
254 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad3_sel, AB8500_DIGMULTCONF1,
256 static const struct snd_kcontrol_new dapm_ad3_select[] = {
260 /* Mic 1 - AD6 - Mic 1 or DMic 6 selector */
261 static const char * const enum_ad6_sel[] = {"Mic 1", "DMic 6"};
262 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad6_sel, AB8500_DIGMULTCONF1,
264 static const struct snd_kcontrol_new dapm_ad6_select[] = {
270 /* Mic 2 - AD5 - Mic 2 or DMic 5 selector */
271 static const char * const enum_ad5_sel[] = {"Mic 2", "DMic 5"};
272 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad5_sel, AB8500_DIGMULTCONF1,
274 static const struct snd_kcontrol_new dapm_ad5_select[] = {
280 /* LineIn left - AD1 - LineIn Left or DMic 1 selector */
281 static const char * const enum_ad1_sel[] = {"LineIn Left", "DMic 1"};
282 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad1_sel, AB8500_DIGMULTCONF1,
284 static const struct snd_kcontrol_new dapm_ad1_select[] = {
288 /* LineIn right - Mic 2 or LineIn Right selector */
289 static const char * const enum_mic2lr_sel[] = {"Mic 2", "LineIn Right"};
290 static SOC_ENUM_SINGLE_DECL(dapm_enum_mic2lr_sel, AB8500_ANACONF3,
292 static const struct snd_kcontrol_new dapm_mic2lr_select[] = {
296 /* LineIn right - AD2 - LineIn Right or DMic2 selector */
297 static const char * const enum_ad2_sel[] = {"LineIn Right", "DMic 2"};
298 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad2_sel, AB8500_DIGMULTCONF1,
300 static const struct snd_kcontrol_new dapm_ad2_select[] = {
307 static const char * const enum_anc_in_sel[] = {"Mic 1 / DMic 6",
309 static SOC_ENUM_SINGLE_DECL(dapm_enum_anc_in_sel, AB8500_DMICFILTCONF,
311 static const struct snd_kcontrol_new dapm_anc_in_select[] = {
315 /* ANC - Enable/Disable */
316 static const struct snd_kcontrol_new dapm_anc_enable[] = {
321 /* ANC to Earpiece - Mute */
322 static const struct snd_kcontrol_new dapm_anc_ear_mute[] = {
331 /* Sidetone left - Input selector */
332 static const char * const enum_stfir1_in_sel[] = {
335 static SOC_ENUM_SINGLE_DECL(dapm_enum_stfir1_in_sel, AB8500_DIGMULTCONF2,
337 static const struct snd_kcontrol_new dapm_stfir1_in_select[] = {
343 /* Sidetone right - Input selector */
344 static const char * const enum_stfir2_in_sel[] = {
347 static SOC_ENUM_SINGLE_DECL(dapm_enum_stfir2_in_sel, AB8500_DIGMULTCONF2,
349 static const struct snd_kcontrol_new dapm_stfir2_in_select[] = {
355 static const char * const enum_pwm2vibx[] = {"Audio Path", "PWM Generator"};
357 static SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib1, AB8500_PWMGENCONF1,
360 static const struct snd_kcontrol_new dapm_pwm2vib1[] = {
364 static SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib2, AB8500_PWMGENCONF1,
367 static const struct snd_kcontrol_new dapm_pwm2vib2[] = {
372 * DAPM-widgets
375 static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
381 SND_SOC_DAPM_REGULATOR_SUPPLY("V-AUD", 0, 0),
382 SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC1", 0, 0),
383 SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC2", 0, 0),
384 SND_SOC_DAPM_REGULATOR_SUPPLY("V-DMIC", 0, 0),
424 SND_SOC_DAPM_DAC("DA1 Enable", "ab8500_0p",
426 SND_SOC_DAPM_DAC("DA2 Enable", "ab8500_0p",
455 SND_SOC_DAPM_MIXER("HSL Enable",
458 SND_SOC_DAPM_MIXER("HSR Enable",
483 SND_SOC_DAPM_MIXER("LOL Enable",
486 SND_SOC_DAPM_MIXER("LOR Enable",
503 SND_SOC_DAPM_MIXER("EAR Enable",
533 SND_SOC_DAPM_MIXER("HFL Enable",
536 SND_SOC_DAPM_MIXER("HFR Enable",
564 SND_SOC_DAPM_MIXER("VIB1 Enable",
567 SND_SOC_DAPM_MIXER("VIB2 Enable",
583 SND_SOC_DAPM_MIXER("MIC1A V-AMICx Enable",
586 SND_SOC_DAPM_MIXER("MIC1B V-AMICx Enable",
597 SND_SOC_DAPM_MIXER("AD3 Enable",
608 SND_SOC_DAPM_MIXER("MIC2 V-AMICx Enable", AB8500_ANACONF2,
623 SND_SOC_DAPM_MIXER("LINL Enable", AB8500_ANACONF2,
626 SND_SOC_DAPM_MIXER("LINR Enable", AB8500_ANACONF2,
658 SND_SOC_DAPM_MIXER("AD12 Enable",
674 SND_SOC_DAPM_MIXER("AD57 Enable",
677 SND_SOC_DAPM_MIXER("AD68 Enable",
711 SND_SOC_DAPM_MIXER("AD4 Enable",
753 * DAPM-routes
755 static const struct snd_soc_dapm_route ab8500_dapm_routes[] = {
756 /* Power AB8500 audio-block when AD/DA is active */
757 {"Main Supply", NULL, "V-AUD"},
784 {"DA1 Enable", NULL, "DA_IN1"},
785 {"DA2 Enable", NULL, "DA_IN2"},
787 {"HSL Digital Volume", NULL, "DA1 Enable"},
788 {"HSR Digital Volume", NULL, "DA2 Enable"},
802 {"HSL Enable", NULL, "HSL Mute"},
803 {"HSR Enable", NULL, "HSR Mute"},
805 {"HSL Volume", NULL, "HSL Enable"},
806 {"HSR Volume", NULL, "HSR Enable"},
829 {"HFL Enable", NULL, "HFL DAC"},
830 {"HFR Enable", NULL, "HFR DAC"},
832 {"Speaker Left", NULL, "HFL Enable"},
833 {"Speaker Right", NULL, "HFR Enable"},
846 {"EAR Enable", NULL, "EAR Mute"},
848 {"Earpiece", NULL, "EAR Enable"},
864 {"LOL Enable", NULL, "LOL Disable HFL"},
865 {"LOR Enable", NULL, "LOR Disable HFR"},
867 {"LineOut Left", NULL, "LOL Enable"},
868 {"LineOut Right", NULL, "LOR Enable"},
885 {"VIB1 Enable", NULL, "Vibra 1 Controller"},
886 {"VIB2 Enable", NULL, "Vibra 2 Controller"},
888 {"Vibra 1", NULL, "VIB1 Enable"},
889 {"Vibra 2", NULL, "VIB2 Enable"},
894 {"MIC2 V-AMICx Enable", NULL, "Mic 2"},
900 {"LINL Enable", NULL, "LINL Mute"},
901 {"LINR Enable", NULL, "LINR Mute"},
904 {"Mic 2 or LINR Select", "LineIn Right", "LINR Enable"},
905 {"Mic 2 or LINR Select", "Mic 2", "MIC2 V-AMICx Enable"},
907 {"LINL ADC", NULL, "LINL Enable"},
916 {"AD12 Enable", NULL, "AD1 Channel Volume"},
917 {"AD12 Enable", NULL, "AD2 Channel Volume"},
920 {"AD_OUT1", NULL, "AD12 Enable"},
922 {"AD_OUT2", NULL, "AD12 Enable"},
928 {"MIC1A V-AMICx Enable", NULL, "MIC1 Mute"},
929 {"MIC1B V-AMICx Enable", NULL, "MIC1 Mute"},
931 {"Mic 1a or 1b Select", "Mic 1a", "MIC1A V-AMICx Enable"},
932 {"Mic 1a or 1b Select", "Mic 1b", "MIC1B V-AMICx Enable"},
940 {"AD3 Enable", NULL, "AD3 Channel Volume"},
943 {"AD_OUT3", NULL, "AD3 Enable"},
953 {"AD57 Enable", NULL, "AD5 Channel Volume"},
954 {"AD68 Enable", NULL, "AD6 Channel Volume"},
957 {"AD_OUT57", NULL, "AD57 Enable"},
959 {"AD_OUT68", NULL, "AD68 Enable"},
963 {"DMic 1", NULL, "V-DMIC"},
964 {"DMic 2", NULL, "V-DMIC"},
965 {"DMic 3", NULL, "V-DMIC"},
966 {"DMic 4", NULL, "V-DMIC"},
967 {"DMic 5", NULL, "V-DMIC"},
968 {"DMic 6", NULL, "V-DMIC"},
977 {"AD4 Enable", NULL, "AD4 Channel Volume"},
980 {"AD_OUT4", NULL, "AD4 Enable"},
984 {"LINL to HSL Volume", NULL, "LINL Enable"},
985 {"LINR to HSR Volume", NULL, "LINR Enable"},
1005 {"Sidetone Left Source", "LineIn Left", "AD12 Enable"},
1006 {"Sidetone Left Source", "LineIn Right", "AD12 Enable"},
1007 {"Sidetone Left Source", "Mic 1", "AD3 Enable"},
1009 {"Sidetone Right Source", "LineIn Right", "AD12 Enable"},
1010 {"Sidetone Right Source", "Mic 1", "AD3 Enable"},
1011 {"Sidetone Right Source", "DMic 4", "AD4 Enable"},
1020 {"DA1 Enable", NULL, "STFIR1 Volume"},
1021 {"DA2 Enable", NULL, "STFIR2 Volume"},
1024 static const struct snd_soc_dapm_route ab8500_dapm_routes_mic1a_vamicx[] = {
1025 {"MIC1A V-AMICx Enable", NULL, "V-AMIC1"},
1026 {"MIC1A V-AMICx Enable", NULL, "V-AMIC2"},
1029 static const struct snd_soc_dapm_route ab8500_dapm_routes_mic1b_vamicx[] = {
1030 {"MIC1B V-AMICx Enable", NULL, "V-AMIC1"},
1031 {"MIC1B V-AMICx Enable", NULL, "V-AMIC2"},
1034 static const struct snd_soc_dapm_route ab8500_dapm_routes_mic2_vamicx[] = {
1035 {"MIC2 V-AMICx Enable", NULL, "V-AMIC1"},
1036 {"MIC2 V-AMICx Enable", NULL, "V-AMIC2"},
1039 /* ANC FIR-coefficients configuration sequence */
1040 static void anc_fir(struct snd_soc_component *component, in anc_fir()
1051 if (par == AB8500_ANC_FIR_COEFFS - 1 && bnk == 1) in anc_fir()
1056 /* ANC IIR-coefficients configuration sequence */
1057 static void anc_iir(struct snd_soc_component *component, unsigned int bnk, in anc_iir()
1082 if (par == AB8500_ANC_IIR_COEFFS - 1 && bnk == 1) in anc_iir()
1087 /* ANC IIR-/FIR-coefficients configuration sequence */
1088 static void anc_configure(struct snd_soc_component *component, in anc_configure()
1091 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); in anc_configure()
1094 dev_dbg(component->dev, "%s: Enter.\n", __func__); in anc_configure()
1107 drvdata->anc_fir_values[par]); in anc_configure()
1115 drvdata->anc_iir_values[par]); in anc_configure()
1119 dev_dbg(component->dev, "%s: Exit.\n", __func__); in anc_configure()
1123 * Control-events
1126 static int sid_status_control_get(struct snd_kcontrol *kcontrol, in sid_status_control_get()
1130 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); in sid_status_control_get()
1132 mutex_lock(&drvdata->ctrl_lock); in sid_status_control_get()
1133 ucontrol->value.enumerated.item[0] = drvdata->sid_status; in sid_status_control_get()
1134 mutex_unlock(&drvdata->ctrl_lock); in sid_status_control_get()
1139 /* Write sidetone FIR-coefficients configuration sequence */
1140 static int sid_status_control_put(struct snd_kcontrol *kcontrol, in sid_status_control_put()
1144 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); in sid_status_control_put()
1148 dev_dbg(component->dev, "%s: Enter\n", __func__); in sid_status_control_put()
1150 if (ucontrol->value.enumerated.item[0] != SID_APPLY_FIR) { in sid_status_control_put()
1151 dev_err(component->dev, in sid_status_control_put()
1154 return -EIO; in sid_status_control_put()
1157 mutex_lock(&drvdata->ctrl_lock); in sid_status_control_put()
1162 dev_err(component->dev, "%s: Sidetone busy while off!\n", in sid_status_control_put()
1164 status = -EPERM; in sid_status_control_put()
1166 status = -EBUSY; in sid_status_control_put()
1174 val = snd_soc_component_read32(component, drvdata->sid_fir_values[param]); in sid_status_control_put()
1185 drvdata->sid_status = SID_FIR_CONFIGURED; in sid_status_control_put()
1188 mutex_unlock(&drvdata->ctrl_lock); in sid_status_control_put()
1190 dev_dbg(component->dev, "%s: Exit\n", __func__); in sid_status_control_put()
1195 static int anc_status_control_get(struct snd_kcontrol *kcontrol, in anc_status_control_get()
1199 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); in anc_status_control_get()
1201 mutex_lock(&drvdata->ctrl_lock); in anc_status_control_get()
1202 ucontrol->value.enumerated.item[0] = drvdata->anc_status; in anc_status_control_get()
1203 mutex_unlock(&drvdata->ctrl_lock); in anc_status_control_get()
1208 static int anc_status_control_put(struct snd_kcontrol *kcontrol, in anc_status_control_put()
1213 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); in anc_status_control_put()
1214 struct device *dev = component->dev; in anc_status_control_put()
1221 mutex_lock(&drvdata->ctrl_lock); in anc_status_control_put()
1223 req = ucontrol->value.enumerated.item[0]; in anc_status_control_put()
1225 status = -EINVAL; in anc_status_control_put()
1232 status = -EINVAL; in anc_status_control_put()
1241 "%s: ERROR: Failed to enable power (status = %d)!\n", in anc_status_control_put()
1250 if (drvdata->anc_status == ANC_IIR_CONFIGURED) in anc_status_control_put()
1251 drvdata->anc_status = ANC_FIR_IIR_CONFIGURED; in anc_status_control_put()
1252 else if (drvdata->anc_status != ANC_FIR_IIR_CONFIGURED) in anc_status_control_put()
1253 drvdata->anc_status = ANC_FIR_CONFIGURED; in anc_status_control_put()
1256 if (drvdata->anc_status == ANC_FIR_CONFIGURED) in anc_status_control_put()
1257 drvdata->anc_status = ANC_FIR_IIR_CONFIGURED; in anc_status_control_put()
1258 else if (drvdata->anc_status != ANC_FIR_IIR_CONFIGURED) in anc_status_control_put()
1259 drvdata->anc_status = ANC_IIR_CONFIGURED; in anc_status_control_put()
1266 mutex_unlock(&drvdata->ctrl_lock); in anc_status_control_put()
1277 static int filter_control_info(struct snd_kcontrol *kcontrol, in filter_control_info()
1281 (struct filter_control *)kcontrol->private_value; in filter_control_info()
1283 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in filter_control_info()
1284 uinfo->count = fc->count; in filter_control_info()
1285 uinfo->value.integer.min = fc->min; in filter_control_info()
1286 uinfo->value.integer.max = fc->max; in filter_control_info()
1291 static int filter_control_get(struct snd_kcontrol *kcontrol, in filter_control_get()
1297 (struct filter_control *)kcontrol->private_value; in filter_control_get()
1300 mutex_lock(&drvdata->ctrl_lock); in filter_control_get()
1301 for (i = 0; i < fc->count; i++) in filter_control_get()
1302 ucontrol->value.integer.value[i] = fc->value[i]; in filter_control_get()
1303 mutex_unlock(&drvdata->ctrl_lock); in filter_control_get()
1308 static int filter_control_put(struct snd_kcontrol *kcontrol, in filter_control_put()
1314 (struct filter_control *)kcontrol->private_value; in filter_control_put()
1317 mutex_lock(&drvdata->ctrl_lock); in filter_control_put()
1318 for (i = 0; i < fc->count; i++) in filter_control_put()
1319 fc->value[i] = ucontrol->value.integer.value[i]; in filter_control_put()
1320 mutex_unlock(&drvdata->ctrl_lock); in filter_control_put()
1326 * Controls - Non-DAPM ASoC
1329 static DECLARE_TLV_DB_SCALE(adx_dig_gain_tlv, -3200, 100, 1);
1330 /* -32dB = Mute */
1332 static DECLARE_TLV_DB_SCALE(dax_dig_gain_tlv, -6300, 100, 1);
1333 /* -63dB = Mute */
1335 static DECLARE_TLV_DB_SCALE(hs_ear_dig_gain_tlv, -100, 100, 1);
1336 /* -1dB = Mute */
1338 static const DECLARE_TLV_DB_RANGE(hs_gain_tlv,
1339 0, 3, TLV_DB_SCALE_ITEM(-3200, 400, 0),
1340 4, 15, TLV_DB_SCALE_ITEM(-1800, 200, 0)
1343 static DECLARE_TLV_DB_SCALE(mic_gain_tlv, 0, 100, 0);
1345 static DECLARE_TLV_DB_SCALE(lin_gain_tlv, -1000, 200, 0);
1347 static DECLARE_TLV_DB_SCALE(lin2hs_gain_tlv, -3800, 200, 1);
1348 /* -38dB = Mute */
1350 static const char * const enum_hsfadspeed[] = {"2ms", "0.5ms", "10.6ms",
1352 static SOC_ENUM_SINGLE_DECL(soc_enum_hsfadspeed,
1355 static const char * const enum_envdetthre[] = {
1360 static SOC_ENUM_SINGLE_DECL(soc_enum_envdeththre,
1362 static SOC_ENUM_SINGLE_DECL(soc_enum_envdetlthre,
1364 static const char * const enum_envdettime[] = {
1369 static SOC_ENUM_SINGLE_DECL(soc_enum_envdettime,
1372 static const char * const enum_sinc31[] = {"Sinc 3", "Sinc 1"};
1373 static SOC_ENUM_SINGLE_DECL(soc_enum_hsesinc, AB8500_HSLEARDIGGAIN,
1376 static const char * const enum_fadespeed[] = {"1ms", "4ms", "8ms", "16ms"};
1377 static SOC_ENUM_SINGLE_DECL(soc_enum_fadespeed, AB8500_HSRDIGGAIN,
1382 static const char * const enum_lowpow[] = {"Normal", "Low Power"};
1383 static SOC_ENUM_SINGLE_DECL(soc_enum_eardaclowpow, AB8500_ANACONF1,
1385 static SOC_ENUM_SINGLE_DECL(soc_enum_eardrvlowpow, AB8500_ANACONF1,
1388 static const char * const enum_av_mode[] = {"Audio", "Voice"};
1389 static SOC_ENUM_DOUBLE_DECL(soc_enum_ad12voice, AB8500_ADFILTCONF,
1391 static SOC_ENUM_DOUBLE_DECL(soc_enum_ad34voice, AB8500_ADFILTCONF,
1396 static SOC_ENUM_SINGLE_DECL(soc_enum_da12voice,
1399 static SOC_ENUM_SINGLE_DECL(soc_enum_da34voice,
1402 static SOC_ENUM_SINGLE_DECL(soc_enum_da56voice,
1406 static const char * const enum_da2hslr[] = {"Sidetone", "Audio Path"};
1407 static SOC_ENUM_DOUBLE_DECL(soc_enum_da2hslr, AB8500_DIGMULTCONF1,
1411 static const char * const enum_sinc53[] = {"Sinc 5", "Sinc 3"};
1412 static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic12sinc, AB8500_DMICFILTCONF,
1415 static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic34sinc, AB8500_DMICFILTCONF,
1418 static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic56sinc, AB8500_DMICFILTCONF,
1422 /* Digital interface - DA from slot mapping */
1423 static const char * const enum_da_from_slot_map[] = {"SLOT0",
1455 static SOC_ENUM_SINGLE_DECL(soc_enum_da1slotmap,
1458 static SOC_ENUM_SINGLE_DECL(soc_enum_da2slotmap,
1461 static SOC_ENUM_SINGLE_DECL(soc_enum_da3slotmap,
1464 static SOC_ENUM_SINGLE_DECL(soc_enum_da4slotmap,
1467 static SOC_ENUM_SINGLE_DECL(soc_enum_da5slotmap,
1470 static SOC_ENUM_SINGLE_DECL(soc_enum_da6slotmap,
1473 static SOC_ENUM_SINGLE_DECL(soc_enum_da7slotmap,
1476 static SOC_ENUM_SINGLE_DECL(soc_enum_da8slotmap,
1480 /* Digital interface - AD to slot mapping */
1481 static const char * const enum_ad_to_slot_map[] = {"AD_OUT1",
1497 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot0map,
1500 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot1map,
1503 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot2map,
1506 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot3map,
1509 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot4map,
1512 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot5map,
1515 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot6map,
1518 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot7map,
1521 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot8map,
1524 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot9map,
1527 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot10map,
1530 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot11map,
1533 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot12map,
1536 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot13map,
1539 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot14map,
1542 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot15map,
1545 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot16map,
1548 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot17map,
1551 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot18map,
1554 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot19map,
1557 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot20map,
1560 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot21map,
1563 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot22map,
1566 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot23map,
1569 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot24map,
1572 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot25map,
1575 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot26map,
1578 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot27map,
1581 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot28map,
1584 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot29map,
1587 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot30map,
1590 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot31map,
1594 /* Digital interface - Burst mode */
1595 static const char * const enum_mask[] = {"Unmasked", "Masked"};
1596 static SOC_ENUM_SINGLE_DECL(soc_enum_bfifomask,
1599 static const char * const enum_bitclk0[] = {"19_2_MHz", "38_4_MHz"};
1600 static SOC_ENUM_SINGLE_DECL(soc_enum_bfifo19m2,
1603 static const char * const enum_slavemaster[] = {"Slave", "Master"};
1604 static SOC_ENUM_SINGLE_DECL(soc_enum_bfifomast,
1609 static SOC_ENUM_SINGLE_EXT_DECL(soc_enum_sidstate, enum_sid_state);
1612 static SOC_ENUM_SINGLE_EXT_DECL(soc_enum_ancstate, enum_anc_state);
1614 static struct snd_kcontrol_new ab8500_ctrls[] = {
1784 /* Digital interface - DA from slot mapping */
1794 /* Digital interface - AD to slot mapping */
1828 /* Digital interface - Loopback */
1854 /* Digital interface - Burst FIFO */
1855 SOC_SINGLE("Digital Interface 0 FIFO Enable Switch",
1859 SOC_ENUM("Burst FIFO Bit-clock Frequency", soc_enum_bfifo19m2),
1869 SOC_SINGLE("Burst FIFO FS Extra Bit-clocks",
1910 static struct snd_kcontrol_new ab8500_filter_controls[] = {
1926 * Extended interface for codec-driver
1929 static int ab8500_audio_init_audioblock(struct snd_soc_component *component) in ab8500_audio_init_audioblock()
1933 dev_dbg(component->dev, "%s: Enter.\n", __func__); in ab8500_audio_init_audioblock()
1935 /* Reset audio-registers and disable 32kHz-clock output 2 */ in ab8500_audio_init_audioblock()
1946 static int ab8500_audio_setup_mics(struct snd_soc_component *component, in ab8500_audio_setup_mics()
1955 dev_dbg(component->dev, "%s: Enter.\n", __func__); in ab8500_audio_setup_mics()
1957 /* Set DMic-clocks to outputs */ in ab8500_audio_setup_mics()
1958 status = abx500_get_register_interruptible(component->dev, AB8500_MISC, in ab8500_audio_setup_mics()
1965 status = abx500_set_register_interruptible(component->dev, in ab8500_audio_setup_mics()
1972 /* Attach regulators to AMic DAPM-paths */ in ab8500_audio_setup_mics()
1973 dev_dbg(component->dev, "%s: Mic 1a regulator: %s\n", __func__, in ab8500_audio_setup_mics()
1974 amic_micbias_str(amics->mic1a_micbias)); in ab8500_audio_setup_mics()
1975 route = &ab8500_dapm_routes_mic1a_vamicx[amics->mic1a_micbias]; in ab8500_audio_setup_mics()
1977 dev_dbg(component->dev, "%s: Mic 1b regulator: %s\n", __func__, in ab8500_audio_setup_mics()
1978 amic_micbias_str(amics->mic1b_micbias)); in ab8500_audio_setup_mics()
1979 route = &ab8500_dapm_routes_mic1b_vamicx[amics->mic1b_micbias]; in ab8500_audio_setup_mics()
1981 dev_dbg(component->dev, "%s: Mic 2 regulator: %s\n", __func__, in ab8500_audio_setup_mics()
1982 amic_micbias_str(amics->mic2_micbias)); in ab8500_audio_setup_mics()
1983 route = &ab8500_dapm_routes_mic2_vamicx[amics->mic2_micbias]; in ab8500_audio_setup_mics()
1986 dev_err(component->dev, in ab8500_audio_setup_mics()
1987 "%s: Failed to add AMic-regulator DAPM-routes (%d).\n", in ab8500_audio_setup_mics()
1992 /* Set AMic-configuration */ in ab8500_audio_setup_mics()
1993 dev_dbg(component->dev, "%s: Mic 1 mic-type: %s\n", __func__, in ab8500_audio_setup_mics()
1994 amic_type_str(amics->mic1_type)); in ab8500_audio_setup_mics()
1996 amics->mic1_type == AMIC_TYPE_DIFFERENTIAL ? in ab8500_audio_setup_mics()
1998 dev_dbg(component->dev, "%s: Mic 2 mic-type: %s\n", __func__, in ab8500_audio_setup_mics()
1999 amic_type_str(amics->mic2_type)); in ab8500_audio_setup_mics()
2001 amics->mic2_type == AMIC_TYPE_DIFFERENTIAL ? in ab8500_audio_setup_mics()
2007 static int ab8500_audio_set_ear_cmv(struct snd_soc_component *component, in ab8500_audio_set_ear_cmv()
2026 dev_err(component->dev, in ab8500_audio_set_ear_cmv()
2027 "%s: Unknown earpiece CM-voltage (%d)!\n", in ab8500_audio_set_ear_cmv()
2029 return -EINVAL; in ab8500_audio_set_ear_cmv()
2031 dev_dbg(component->dev, "%s: Earpiece CM-voltage: %s\n", __func__, in ab8500_audio_set_ear_cmv()
2039 static int ab8500_audio_set_bit_delay(struct snd_soc_dai *dai, in ab8500_audio_set_bit_delay()
2043 struct snd_soc_component *component = dai->component; in ab8500_audio_set_bit_delay()
2055 dev_err(dai->component->dev, in ab8500_audio_set_bit_delay()
2056 "%s: ERROR: Unsupported bit-delay (0x%x)!\n", in ab8500_audio_set_bit_delay()
2058 return -EINVAL; in ab8500_audio_set_bit_delay()
2061 dev_dbg(dai->component->dev, "%s: IF0 Bit-delay: %d bits.\n", in ab8500_audio_set_bit_delay()
2069 static int ab8500_codec_set_dai_clock_gate(struct snd_soc_component *component, in ab8500_codec_set_dai_clock_gate()
2082 dev_dbg(component->dev, "%s: IF0 Clock is continuous.\n", in ab8500_codec_set_dai_clock_gate()
2087 dev_dbg(component->dev, "%s: IF0 Clock is gated.\n", in ab8500_codec_set_dai_clock_gate()
2091 dev_err(component->dev, in ab8500_codec_set_dai_clock_gate()
2094 return -EINVAL; in ab8500_codec_set_dai_clock_gate()
2102 static int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) in ab8500_codec_set_dai_fmt()
2106 struct snd_soc_component *component = dai->component; in ab8500_codec_set_dai_fmt()
2109 dev_dbg(component->dev, "%s: Enter (fmt = 0x%x)\n", __func__, fmt); in ab8500_codec_set_dai_fmt()
2119 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_fmt()
2120 "%s: IF0 Master-mode: AB8500 master.\n", __func__); in ab8500_codec_set_dai_fmt()
2124 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_fmt()
2125 "%s: IF0 Master-mode: AB8500 slave.\n", __func__); in ab8500_codec_set_dai_fmt()
2129 dev_err(dai->component->dev, in ab8500_codec_set_dai_fmt()
2133 dev_err(dai->component->dev, in ab8500_codec_set_dai_fmt()
2136 return -EINVAL; in ab8500_codec_set_dai_fmt()
2144 dev_err(dai->component->dev, in ab8500_codec_set_dai_fmt()
2160 dev_dbg(dai->component->dev, "%s: IF0 Protocol: I2S\n", __func__); in ab8500_codec_set_dai_fmt()
2166 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_fmt()
2173 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_fmt()
2180 dev_err(dai->component->dev, in ab8500_codec_set_dai_fmt()
2183 return -EINVAL; in ab8500_codec_set_dai_fmt()
2188 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_fmt()
2193 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_fmt()
2199 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_fmt()
2205 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_fmt()
2212 dev_err(dai->component->dev, in ab8500_codec_set_dai_fmt()
2215 return -EINVAL; in ab8500_codec_set_dai_fmt()
2223 static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai, in ab8500_codec_set_dai_tdm_slot()
2227 struct snd_soc_component *component = dai->component; in ab8500_codec_set_dai_tdm_slot()
2248 dev_err(dai->component->dev, "%s: Unsupported slot-width 0x%x\n", in ab8500_codec_set_dai_tdm_slot()
2250 return -EINVAL; in ab8500_codec_set_dai_tdm_slot()
2253 dev_dbg(dai->component->dev, "%s: IF0 slot-width: %d bits.\n", in ab8500_codec_set_dai_tdm_slot()
2258 dev_dbg(dai->component->dev, "%s: Slots, total: %d\n", __func__, slots); in ab8500_codec_set_dai_tdm_slot()
2276 dev_err(dai->component->dev, in ab8500_codec_set_dai_tdm_slot()
2279 return -EINVAL; in ab8500_codec_set_dai_tdm_slot()
2286 return -EINVAL; in ab8500_codec_set_dai_tdm_slot()
2292 dev_dbg(dai->component->dev, "%s: Slots, active, TX: %d\n", __func__, in ab8500_codec_set_dai_tdm_slot()
2314 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_tdm_slot()
2315 "%s: In 8-channel mode DA-from-slot mapping is set manually.", in ab8500_codec_set_dai_tdm_slot()
2319 dev_err(dai->component->dev, in ab8500_codec_set_dai_tdm_slot()
2320 "%s: Unsupported number of active TX-slots (%d)!\n", in ab8500_codec_set_dai_tdm_slot()
2322 return -EINVAL; in ab8500_codec_set_dai_tdm_slot()
2325 /* Setup TDM AD according to active RX-slots */ in ab8500_codec_set_dai_tdm_slot()
2328 return -EINVAL; in ab8500_codec_set_dai_tdm_slot()
2333 dev_dbg(dai->component->dev, "%s: Slots, active, RX: %d\n", __func__, in ab8500_codec_set_dai_tdm_slot()
2358 dev_dbg(dai->component->dev, in ab8500_codec_set_dai_tdm_slot()
2359 "%s: In 8-channel mode AD-to-slot mapping is set manually.", in ab8500_codec_set_dai_tdm_slot()
2363 dev_err(dai->component->dev, in ab8500_codec_set_dai_tdm_slot()
2364 "%s: Unsupported number of active RX-slots (%d)!\n", in ab8500_codec_set_dai_tdm_slot()
2366 return -EINVAL; in ab8500_codec_set_dai_tdm_slot()
2372 static const struct snd_soc_dai_ops ab8500_codec_ops = {
2377 static struct snd_soc_dai_driver ab8500_codec_dai[] = {
2379 .name = "ab8500-codec-dai.0",
2392 .name = "ab8500-codec-dai.1",
2406 static void ab8500_codec_of_probe(struct device *dev, struct device_node *np, in ab8500_codec_of_probe()
2411 if (of_property_read_bool(np, "stericsson,amic1-type-single-ended")) in ab8500_codec_of_probe()
2412 codec->amics.mic1_type = AMIC_TYPE_SINGLE_ENDED; in ab8500_codec_of_probe()
2414 codec->amics.mic1_type = AMIC_TYPE_DIFFERENTIAL; in ab8500_codec_of_probe()
2416 if (of_property_read_bool(np, "stericsson,amic2-type-single-ended")) in ab8500_codec_of_probe()
2417 codec->amics.mic2_type = AMIC_TYPE_SINGLE_ENDED; in ab8500_codec_of_probe()
2419 codec->amics.mic2_type = AMIC_TYPE_DIFFERENTIAL; in ab8500_codec_of_probe()
2421 /* Has a non-standard Vamic been requested? */ in ab8500_codec_of_probe()
2422 if (of_property_read_bool(np, "stericsson,amic1a-bias-vamic2")) in ab8500_codec_of_probe()
2423 codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC2; in ab8500_codec_of_probe()
2425 codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC1; in ab8500_codec_of_probe()
2427 if (of_property_read_bool(np, "stericsson,amic1b-bias-vamic2")) in ab8500_codec_of_probe()
2428 codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC2; in ab8500_codec_of_probe()
2430 codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC1; in ab8500_codec_of_probe()
2432 if (of_property_read_bool(np, "stericsson,amic2-bias-vamic1")) in ab8500_codec_of_probe()
2433 codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC1; in ab8500_codec_of_probe()
2435 codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC2; in ab8500_codec_of_probe()
2437 if (!of_property_read_u32(np, "stericsson,earpeice-cmv", &value)) { in ab8500_codec_of_probe()
2440 codec->ear_cmv = EAR_CMV_0_95V; in ab8500_codec_of_probe()
2443 codec->ear_cmv = EAR_CMV_1_10V; in ab8500_codec_of_probe()
2446 codec->ear_cmv = EAR_CMV_1_27V; in ab8500_codec_of_probe()
2449 codec->ear_cmv = EAR_CMV_1_58V; in ab8500_codec_of_probe()
2452 codec->ear_cmv = EAR_CMV_UNKNOWN; in ab8500_codec_of_probe()
2456 dev_warn(dev, "No earpiece voltage found in DT - using default\n"); in ab8500_codec_of_probe()
2457 codec->ear_cmv = EAR_CMV_0_95V; in ab8500_codec_of_probe()
2461 static int ab8500_codec_probe(struct snd_soc_component *component) in ab8500_codec_probe()
2464 struct device *dev = component->dev; in ab8500_codec_probe()
2465 struct device_node *np = dev->of_node; in ab8500_codec_probe()
2482 pr_err("%s: Failed to set earpiece CM-voltage (%d)!\n", in ab8500_codec_probe()
2489 dev_err(dev, "%s: failed to init audio-block (%d)!\n", in ab8500_codec_probe()
2494 /* Override HW-defaults */ in ab8500_codec_probe()
2511 drvdata->anc_fir_values = (long *)fc->value; in ab8500_codec_probe()
2514 drvdata->anc_iir_values = (long *)fc->value; in ab8500_codec_probe()
2517 drvdata->sid_fir_values = (long *)fc->value; in ab8500_codec_probe()
2521 mutex_init(&drvdata->ctrl_lock); in ab8500_codec_probe()
2526 static const struct snd_soc_component_driver ab8500_component_driver = {
2540 static int ab8500_codec_driver_probe(struct platform_device *pdev) in ab8500_codec_driver_probe()
2545 dev_dbg(&pdev->dev, "%s: Enter.\n", __func__); in ab8500_codec_driver_probe()
2547 /* Create driver private-data struct */ in ab8500_codec_driver_probe()
2548 drvdata = devm_kzalloc(&pdev->dev, sizeof(struct ab8500_codec_drvdata), in ab8500_codec_driver_probe()
2551 return -ENOMEM; in ab8500_codec_driver_probe()
2552 drvdata->sid_status = SID_UNCONFIGURED; in ab8500_codec_driver_probe()
2553 drvdata->anc_status = ANC_UNCONFIGURED; in ab8500_codec_driver_probe()
2554 dev_set_drvdata(&pdev->dev, drvdata); in ab8500_codec_driver_probe()
2556 drvdata->regmap = devm_regmap_init(&pdev->dev, NULL, &pdev->dev, in ab8500_codec_driver_probe()
2558 if (IS_ERR(drvdata->regmap)) { in ab8500_codec_driver_probe()
2559 status = PTR_ERR(drvdata->regmap); in ab8500_codec_driver_probe()
2560 dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n", in ab8500_codec_driver_probe()
2565 dev_dbg(&pdev->dev, "%s: Register codec.\n", __func__); in ab8500_codec_driver_probe()
2566 status = devm_snd_soc_register_component(&pdev->dev, in ab8500_codec_driver_probe()
2571 dev_err(&pdev->dev, in ab8500_codec_driver_probe()
2578 static struct platform_driver ab8500_codec_platform_driver = {
2580 .name = "ab8500-codec",