Commit d001e978 authored by Takashi Iwai's avatar Takashi Iwai

Merge tag 'asoc-fix-v6.10-merge-window' of...

Merge tag 'asoc-fix-v6.10-merge-window' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Fixes for v6.10

A bunch of fixes that came in during the merge window, all driver
specific and none of them especially remarkable.
parents b3b6f125 737ce4fb
...@@ -68,7 +68,7 @@ patternProperties: ...@@ -68,7 +68,7 @@ patternProperties:
properties: properties:
compatible: compatible:
description: Compatible for SAI sub-block A or B. description: Compatible for SAI sub-block A or B.
pattern: "st,stm32-sai-sub-[ab]" pattern: "^st,stm32-sai-sub-[ab]$"
"#sound-dai-cells": "#sound-dai-cells":
const: 0 const: 0
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// //
// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier // ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
// //
// Copyright (C) 2022 - 2023 Texas Instruments Incorporated // Copyright (C) 2022 - 2024 Texas Instruments Incorporated
// https://www.ti.com // https://www.ti.com
// //
// The TAS2781 driver implements a flexible and configurable // The TAS2781 driver implements a flexible and configurable
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
// Author: Kevin Lu <kevin-lu@ti.com> // Author: Kevin Lu <kevin-lu@ti.com>
// //
#ifndef __TASDEVICE_DSP_H__ #ifndef __TAS2781_DSP_H__
#define __TASDEVICE_DSP_H__ #define __TAS2781_DSP_H__
#define MAIN_ALL_DEVICES 0x0d #define MAIN_ALL_DEVICES 0x0d
#define MAIN_DEVICE_A 0x01 #define MAIN_DEVICE_A 0x01
...@@ -180,7 +180,6 @@ void tasdevice_calbin_remove(void *context); ...@@ -180,7 +180,6 @@ void tasdevice_calbin_remove(void *context);
int tasdevice_select_tuningprm_cfg(void *context, int prm, int tasdevice_select_tuningprm_cfg(void *context, int prm,
int cfg_no, int rca_conf_no); int cfg_no, int rca_conf_no);
int tasdevice_prmg_load(void *context, int prm_no); int tasdevice_prmg_load(void *context, int prm_no);
int tasdevice_prmg_calibdata_load(void *context, int prm_no);
void tasdevice_tuning_switch(void *context, int state); void tasdevice_tuning_switch(void *context, int state);
int tas2781_load_calibration(void *context, char *file_name, int tas2781_load_calibration(void *context, char *file_name,
unsigned short i); unsigned short i);
......
...@@ -829,8 +829,8 @@ static void es8326_jack_detect_handler(struct work_struct *work) ...@@ -829,8 +829,8 @@ static void es8326_jack_detect_handler(struct work_struct *work)
/* mute adc when mic path switch */ /* mute adc when mic path switch */
regmap_write(es8326->regmap, ES8326_ADC1_SRC, 0x44); regmap_write(es8326->regmap, ES8326_ADC1_SRC, 0x44);
regmap_write(es8326->regmap, ES8326_ADC2_SRC, 0x66); regmap_write(es8326->regmap, ES8326_ADC2_SRC, 0x66);
es8326->hp = 0;
} }
es8326->hp = 0;
regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x01); regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x01);
regmap_write(es8326->regmap, ES8326_SYS_BIAS, 0x0a); regmap_write(es8326->regmap, ES8326_SYS_BIAS, 0x0a);
regmap_update_bits(es8326->regmap, ES8326_HP_DRIVER_REF, 0x0f, 0x03); regmap_update_bits(es8326->regmap, ES8326_HP_DRIVER_REF, 0x0f, 0x03);
...@@ -981,7 +981,7 @@ static int es8326_resume(struct snd_soc_component *component) ...@@ -981,7 +981,7 @@ static int es8326_resume(struct snd_soc_component *component)
regmap_write(es8326->regmap, ES8326_ANA_LP, 0xf0); regmap_write(es8326->regmap, ES8326_ANA_LP, 0xf0);
usleep_range(10000, 15000); usleep_range(10000, 15000);
regmap_write(es8326->regmap, ES8326_HPJACK_TIMER, 0xd9); regmap_write(es8326->regmap, ES8326_HPJACK_TIMER, 0xd9);
regmap_write(es8326->regmap, ES8326_ANA_MICBIAS, 0xcb); regmap_write(es8326->regmap, ES8326_ANA_MICBIAS, 0xd8);
/* set headphone default type and detect pin */ /* set headphone default type and detect pin */
regmap_write(es8326->regmap, ES8326_HPDET_TYPE, 0x83); regmap_write(es8326->regmap, ES8326_HPDET_TYPE, 0x83);
regmap_write(es8326->regmap, ES8326_CLK_RESAMPLE, 0x05); regmap_write(es8326->regmap, ES8326_CLK_RESAMPLE, 0x05);
...@@ -1018,7 +1018,7 @@ static int es8326_resume(struct snd_soc_component *component) ...@@ -1018,7 +1018,7 @@ static int es8326_resume(struct snd_soc_component *component)
regmap_write(es8326->regmap, ES8326_ANA_VSEL, 0x7F); regmap_write(es8326->regmap, ES8326_ANA_VSEL, 0x7F);
/* select vdda as micbias source */ /* select vdda as micbias source */
regmap_write(es8326->regmap, ES8326_VMIDLOW, 0x23); regmap_write(es8326->regmap, ES8326_VMIDLOW, 0x03);
/* set dac dsmclip = 1 */ /* set dac dsmclip = 1 */
regmap_write(es8326->regmap, ES8326_DAC_DSM, 0x08); regmap_write(es8326->regmap, ES8326_DAC_DSM, 0x08);
regmap_write(es8326->regmap, ES8326_DAC_VPPSCALE, 0x15); regmap_write(es8326->regmap, ES8326_DAC_VPPSCALE, 0x15);
......
...@@ -81,6 +81,7 @@ static const struct reg_sequence init_list[] = { ...@@ -81,6 +81,7 @@ static const struct reg_sequence init_list[] = {
static const struct reg_sequence rt5650_init_list[] = { static const struct reg_sequence rt5650_init_list[] = {
{0xf6, 0x0100}, {0xf6, 0x0100},
{RT5645_PWR_ANLG1, 0x02}, {RT5645_PWR_ANLG1, 0x02},
{RT5645_IL_CMD3, 0x0018},
}; };
static const struct reg_default rt5645_reg[] = { static const struct reg_default rt5645_reg[] = {
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
/* /*
* tas2552.c - ALSA SoC Texas Instruments TAS2552 Mono Audio Amplifier * tas2552.c - ALSA SoC Texas Instruments TAS2552 Mono Audio Amplifier
* *
* Copyright (C) 2014 Texas Instruments Incorporated - https://www.ti.com * Copyright (C) 2014 - 2024 Texas Instruments Incorporated -
* https://www.ti.com
* *
* Author: Dan Murphy <dmurphy@ti.com> * Author: Dan Murphy <dmurphy@ti.com>
*/ */
...@@ -119,12 +120,14 @@ static const struct snd_soc_dapm_widget tas2552_dapm_widgets[] = ...@@ -119,12 +120,14 @@ static const struct snd_soc_dapm_widget tas2552_dapm_widgets[] =
&tas2552_input_mux_control), &tas2552_input_mux_control),
SND_SOC_DAPM_AIF_IN("DAC IN", "DAC Playback", 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_AIF_IN("DAC IN", "DAC Playback", 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("ASI OUT", "DAC Capture", 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_OUT_DRV("ClassD", TAS2552_CFG_2, 7, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("ClassD", TAS2552_CFG_2, 7, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("PLL", TAS2552_CFG_2, 3, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("PLL", TAS2552_CFG_2, 3, 0, NULL, 0),
SND_SOC_DAPM_POST("Post Event", tas2552_post_event), SND_SOC_DAPM_POST("Post Event", tas2552_post_event),
SND_SOC_DAPM_OUTPUT("OUT") SND_SOC_DAPM_OUTPUT("OUT"),
SND_SOC_DAPM_INPUT("DMIC")
}; };
static const struct snd_soc_dapm_route tas2552_audio_map[] = { static const struct snd_soc_dapm_route tas2552_audio_map[] = {
...@@ -134,6 +137,7 @@ static const struct snd_soc_dapm_route tas2552_audio_map[] = { ...@@ -134,6 +137,7 @@ static const struct snd_soc_dapm_route tas2552_audio_map[] = {
{"ClassD", NULL, "Input selection"}, {"ClassD", NULL, "Input selection"},
{"OUT", NULL, "ClassD"}, {"OUT", NULL, "ClassD"},
{"ClassD", NULL, "PLL"}, {"ClassD", NULL, "PLL"},
{"ASI OUT", NULL, "DMIC"}
}; };
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -538,6 +542,13 @@ static struct snd_soc_dai_driver tas2552_dai[] = { ...@@ -538,6 +542,13 @@ static struct snd_soc_dai_driver tas2552_dai[] = {
.rates = SNDRV_PCM_RATE_8000_192000, .rates = SNDRV_PCM_RATE_8000_192000,
.formats = TAS2552_FORMATS, .formats = TAS2552_FORMATS,
}, },
.capture = {
.stream_name = "Capture",
.channels_min = 2,
.channels_max = 2,
.rates = SNDRV_PCM_RATE_8000_192000,
.formats = TAS2552_FORMATS,
},
.ops = &tas2552_speaker_dai_ops, .ops = &tas2552_speaker_dai_ops,
}, },
}; };
......
...@@ -2151,6 +2151,24 @@ static int tasdevice_load_data(struct tasdevice_priv *tas_priv, ...@@ -2151,6 +2151,24 @@ static int tasdevice_load_data(struct tasdevice_priv *tas_priv,
return ret; return ret;
} }
static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i)
{
struct tasdevice_calibration *cal;
struct tasdevice_fw *cal_fmw;
cal_fmw = priv->tasdevice[i].cali_data_fmw;
/* No calibrated data for current devices, playback will go ahead. */
if (!cal_fmw)
return;
cal = cal_fmw->calibrations;
if (cal)
return;
load_calib_data(priv, &cal->dev_data);
}
int tasdevice_select_tuningprm_cfg(void *context, int prm_no, int tasdevice_select_tuningprm_cfg(void *context, int prm_no,
int cfg_no, int rca_conf_no) int cfg_no, int rca_conf_no)
{ {
...@@ -2210,23 +2228,11 @@ int tasdevice_select_tuningprm_cfg(void *context, int prm_no, ...@@ -2210,23 +2228,11 @@ int tasdevice_select_tuningprm_cfg(void *context, int prm_no,
for (i = 0; i < tas_priv->ndev; i++) { for (i = 0; i < tas_priv->ndev; i++) {
if (tas_priv->tasdevice[i].is_loaderr == true) if (tas_priv->tasdevice[i].is_loaderr == true)
continue; continue;
else if (tas_priv->tasdevice[i].is_loaderr == false if (tas_priv->tasdevice[i].is_loaderr == false &&
&& tas_priv->tasdevice[i].is_loading == true) { tas_priv->tasdevice[i].is_loading == true)
struct tasdevice_fw *cal_fmw =
tas_priv->tasdevice[i].cali_data_fmw;
if (cal_fmw) {
struct tasdevice_calibration
*cal = cal_fmw->calibrations;
if (cal)
load_calib_data(tas_priv,
&(cal->dev_data));
}
tas_priv->tasdevice[i].cur_prog = prm_no; tas_priv->tasdevice[i].cur_prog = prm_no;
} }
} }
}
for (i = 0, status = 0; i < tas_priv->ndev; i++) { for (i = 0, status = 0; i < tas_priv->ndev; i++) {
if (cfg_no >= 0 if (cfg_no >= 0
...@@ -2245,12 +2251,16 @@ int tasdevice_select_tuningprm_cfg(void *context, int prm_no, ...@@ -2245,12 +2251,16 @@ int tasdevice_select_tuningprm_cfg(void *context, int prm_no,
tasdevice_load_data(tas_priv, &(conf->dev_data)); tasdevice_load_data(tas_priv, &(conf->dev_data));
for (i = 0; i < tas_priv->ndev; i++) { for (i = 0; i < tas_priv->ndev; i++) {
if (tas_priv->tasdevice[i].is_loaderr == true) { if (tas_priv->tasdevice[i].is_loaderr == true) {
status |= 1 << (i + 4); status |= BIT(i + 4);
continue; continue;
} else if (tas_priv->tasdevice[i].is_loaderr == false }
&& tas_priv->tasdevice[i].is_loading == true)
if (tas_priv->tasdevice[i].is_loaderr == false &&
tas_priv->tasdevice[i].is_loading == true) {
tasdev_load_calibrated_data(tas_priv, i);
tas_priv->tasdevice[i].cur_conf = cfg_no; tas_priv->tasdevice[i].cur_conf = cfg_no;
} }
}
} else } else
dev_dbg(tas_priv->dev, "%s: Unneeded loading dsp conf %d\n", dev_dbg(tas_priv->dev, "%s: Unneeded loading dsp conf %d\n",
__func__, cfg_no); __func__, cfg_no);
...@@ -2308,65 +2318,6 @@ int tasdevice_prmg_load(void *context, int prm_no) ...@@ -2308,65 +2318,6 @@ int tasdevice_prmg_load(void *context, int prm_no)
} }
EXPORT_SYMBOL_NS_GPL(tasdevice_prmg_load, SND_SOC_TAS2781_FMWLIB); EXPORT_SYMBOL_NS_GPL(tasdevice_prmg_load, SND_SOC_TAS2781_FMWLIB);
int tasdevice_prmg_calibdata_load(void *context, int prm_no)
{
struct tasdevice_priv *tas_priv = (struct tasdevice_priv *) context;
struct tasdevice_fw *tas_fmw = tas_priv->fmw;
struct tasdevice_prog *program;
int prog_status = 0;
int i;
if (!tas_fmw) {
dev_err(tas_priv->dev, "%s: Firmware is NULL\n", __func__);
goto out;
}
if (prm_no >= tas_fmw->nr_programs) {
dev_err(tas_priv->dev,
"%s: prm(%d) is not in range of Programs %u\n",
__func__, prm_no, tas_fmw->nr_programs);
goto out;
}
for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) {
if (prm_no >= 0 && tas_priv->tasdevice[i].cur_prog != prm_no) {
tas_priv->tasdevice[i].cur_conf = -1;
tas_priv->tasdevice[i].is_loading = true;
prog_status++;
}
tas_priv->tasdevice[i].is_loaderr = false;
}
if (prog_status) {
program = &(tas_fmw->programs[prm_no]);
tasdevice_load_data(tas_priv, &(program->dev_data));
for (i = 0; i < tas_priv->ndev; i++) {
if (tas_priv->tasdevice[i].is_loaderr == true)
continue;
else if (tas_priv->tasdevice[i].is_loaderr == false
&& tas_priv->tasdevice[i].is_loading == true) {
struct tasdevice_fw *cal_fmw =
tas_priv->tasdevice[i].cali_data_fmw;
if (cal_fmw) {
struct tasdevice_calibration *cal =
cal_fmw->calibrations;
if (cal)
load_calib_data(tas_priv,
&(cal->dev_data));
}
tas_priv->tasdevice[i].cur_prog = prm_no;
}
}
}
out:
return prog_status;
}
EXPORT_SYMBOL_NS_GPL(tasdevice_prmg_calibdata_load,
SND_SOC_TAS2781_FMWLIB);
void tasdevice_tuning_switch(void *context, int state) void tasdevice_tuning_switch(void *context, int state)
{ {
struct tasdevice_priv *tas_priv = (struct tasdevice_priv *) context; struct tasdevice_priv *tas_priv = (struct tasdevice_priv *) context;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// //
// ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier // ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
// //
// Copyright (C) 2022 - 2023 Texas Instruments Incorporated // Copyright (C) 2022 - 2024 Texas Instruments Incorporated
// https://www.ti.com // https://www.ti.com
// //
// The TAS2563/TAS2781 driver implements a flexible and configurable // The TAS2563/TAS2781 driver implements a flexible and configurable
...@@ -414,7 +414,7 @@ static void tasdevice_fw_ready(const struct firmware *fmw, ...@@ -414,7 +414,7 @@ static void tasdevice_fw_ready(const struct firmware *fmw,
__func__, tas_priv->cal_binaryname[i]); __func__, tas_priv->cal_binaryname[i]);
} }
tasdevice_prmg_calibdata_load(tas_priv, 0); tasdevice_prmg_load(tas_priv, 0);
tas_priv->cur_prog = 0; tas_priv->cur_prog = 0;
out: out:
if (tas_priv->fw_state == TASDEVICE_DSP_FW_FAIL) { if (tas_priv->fw_state == TASDEVICE_DSP_FW_FAIL) {
......
...@@ -109,7 +109,7 @@ int rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *d ...@@ -109,7 +109,7 @@ int rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *d
return -ENOMEM; return -ENOMEM;
for (i = 0; i < ARRAY_SIZE(need_sdca_suffix); i++) { for (i = 0; i < ARRAY_SIZE(need_sdca_suffix); i++) {
if (strstr(codec_dai->name, need_sdca_suffix[i])) { if (strstr(component->name_prefix, need_sdca_suffix[i])) {
/* Add -sdca suffix for existing UCMs */ /* Add -sdca suffix for existing UCMs */
card->components = devm_kasprintf(card->dev, GFP_KERNEL, card->components = devm_kasprintf(card->dev, GFP_KERNEL,
"%s-sdca", card->components); "%s-sdca", card->components);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment