Commit ed97c988 authored by Takashi Iwai's avatar Takashi Iwai

Merge tag 'asoc-v5.2-5' of...

Merge tag 'asoc-v5.2-5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Fixes for v5.2

A bunch of driver specific fixes that came in since the initial pull
request for v5.2, mainly warning fixes for the newly added Sound Open
Firmware code which people appeared to only start looking at after I'd
sent the pull request.
parents 7f84ff68 7f6647ce
...@@ -455,24 +455,11 @@ static int hdac_hdmi_set_hw_params(struct snd_pcm_substream *substream, ...@@ -455,24 +455,11 @@ static int hdac_hdmi_set_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *hparams, struct snd_soc_dai *dai) struct snd_pcm_hw_params *hparams, struct snd_soc_dai *dai)
{ {
struct hdac_hdmi_priv *hdmi = snd_soc_dai_get_drvdata(dai); struct hdac_hdmi_priv *hdmi = snd_soc_dai_get_drvdata(dai);
struct hdac_device *hdev = hdmi->hdev;
struct hdac_hdmi_dai_port_map *dai_map; struct hdac_hdmi_dai_port_map *dai_map;
struct hdac_hdmi_port *port;
struct hdac_hdmi_pcm *pcm; struct hdac_hdmi_pcm *pcm;
int format; int format;
dai_map = &hdmi->dai_map[dai->id]; dai_map = &hdmi->dai_map[dai->id];
port = dai_map->port;
if (!port)
return -ENODEV;
if ((!port->eld.monitor_present) || (!port->eld.eld_valid)) {
dev_err(&hdev->dev,
"device is not configured for this pin:port%d:%d\n",
port->pin->nid, port->id);
return -ENODEV;
}
format = snd_hdac_calc_stream_format(params_rate(hparams), format = snd_hdac_calc_stream_format(params_rate(hparams),
params_channels(hparams), params_format(hparams), params_channels(hparams), params_format(hparams),
......
...@@ -320,32 +320,6 @@ enum { ...@@ -320,32 +320,6 @@ enum {
#define DL_GAIN_N_40DB_REG (DL_GAIN_N_40DB << 7 | DL_GAIN_N_40DB) #define DL_GAIN_N_40DB_REG (DL_GAIN_N_40DB << 7 | DL_GAIN_N_40DB)
#define DL_GAIN_REG_MASK 0x0f9f #define DL_GAIN_REG_MASK 0x0f9f
static void lo_store_gain(struct mt6358_priv *priv)
{
unsigned int reg;
unsigned int gain_l, gain_r;
regmap_read(priv->regmap, MT6358_ZCD_CON1, &reg);
gain_l = (reg >> RG_AUDLOLGAIN_SFT) & RG_AUDLOLGAIN_MASK;
gain_r = (reg >> RG_AUDLORGAIN_SFT) & RG_AUDLORGAIN_MASK;
priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL] = gain_l;
priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR] = gain_r;
}
static void hp_store_gain(struct mt6358_priv *priv)
{
unsigned int reg;
unsigned int gain_l, gain_r;
regmap_read(priv->regmap, MT6358_ZCD_CON2, &reg);
gain_l = (reg >> RG_AUDHPLGAIN_SFT) & RG_AUDHPLGAIN_MASK;
gain_r = (reg >> RG_AUDHPRGAIN_SFT) & RG_AUDHPRGAIN_MASK;
priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL] = gain_l;
priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR] = gain_r;
}
static void hp_zcd_disable(struct mt6358_priv *priv) static void hp_zcd_disable(struct mt6358_priv *priv)
{ {
regmap_write(priv->regmap, MT6358_ZCD_CON0, 0x0000); regmap_write(priv->regmap, MT6358_ZCD_CON0, 0x0000);
...@@ -405,10 +379,9 @@ static bool is_valid_hp_pga_idx(int reg_idx) ...@@ -405,10 +379,9 @@ static bool is_valid_hp_pga_idx(int reg_idx)
reg_idx == DL_GAIN_N_40DB; reg_idx == DL_GAIN_N_40DB;
} }
static void headset_volume_ramp(struct mt6358_priv *priv, static void headset_volume_ramp(struct mt6358_priv *priv, int from, int to)
int from, int to)
{ {
int offset = 0, count = 1, reg_idx; int offset = 0, count = 0, reg_idx;
if (!is_valid_hp_pga_idx(from) || !is_valid_hp_pga_idx(to)) if (!is_valid_hp_pga_idx(from) || !is_valid_hp_pga_idx(to))
dev_warn(priv->dev, "%s(), volume index is not valid, from %d, to %d\n", dev_warn(priv->dev, "%s(), volume index is not valid, from %d, to %d\n",
...@@ -422,7 +395,7 @@ static void headset_volume_ramp(struct mt6358_priv *priv, ...@@ -422,7 +395,7 @@ static void headset_volume_ramp(struct mt6358_priv *priv,
else else
offset = from - to; offset = from - to;
while (offset > 0) { while (offset >= 0) {
if (to > from) if (to > from)
reg_idx = from + count; reg_idx = from + count;
else else
...@@ -440,25 +413,76 @@ static void headset_volume_ramp(struct mt6358_priv *priv, ...@@ -440,25 +413,76 @@ static void headset_volume_ramp(struct mt6358_priv *priv,
} }
} }
static int mt6358_put_volsw(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component =
snd_soc_kcontrol_component(kcontrol);
struct mt6358_priv *priv = snd_soc_component_get_drvdata(component);
struct soc_mixer_control *mc =
(struct soc_mixer_control *)kcontrol->private_value;
unsigned int reg;
int ret;
ret = snd_soc_put_volsw(kcontrol, ucontrol);
if (ret < 0)
return ret;
switch (mc->reg) {
case MT6358_ZCD_CON2:
regmap_read(priv->regmap, MT6358_ZCD_CON2, &reg);
priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL] =
(reg >> RG_AUDHPLGAIN_SFT) & RG_AUDHPLGAIN_MASK;
priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR] =
(reg >> RG_AUDHPRGAIN_SFT) & RG_AUDHPRGAIN_MASK;
break;
case MT6358_ZCD_CON1:
regmap_read(priv->regmap, MT6358_ZCD_CON1, &reg);
priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL] =
(reg >> RG_AUDLOLGAIN_SFT) & RG_AUDLOLGAIN_MASK;
priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR] =
(reg >> RG_AUDLORGAIN_SFT) & RG_AUDLORGAIN_MASK;
break;
case MT6358_ZCD_CON3:
regmap_read(priv->regmap, MT6358_ZCD_CON3, &reg);
priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL] =
(reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK;
priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTR] =
(reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK;
break;
case MT6358_AUDENC_ANA_CON0:
case MT6358_AUDENC_ANA_CON1:
regmap_read(priv->regmap, MT6358_AUDENC_ANA_CON0, &reg);
priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1] =
(reg >> RG_AUDPREAMPLGAIN_SFT) & RG_AUDPREAMPLGAIN_MASK;
regmap_read(priv->regmap, MT6358_AUDENC_ANA_CON1, &reg);
priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2] =
(reg >> RG_AUDPREAMPRGAIN_SFT) & RG_AUDPREAMPRGAIN_MASK;
break;
}
return ret;
}
static const DECLARE_TLV_DB_SCALE(playback_tlv, -1000, 100, 0); static const DECLARE_TLV_DB_SCALE(playback_tlv, -1000, 100, 0);
static const DECLARE_TLV_DB_SCALE(pga_tlv, 0, 600, 0); static const DECLARE_TLV_DB_SCALE(pga_tlv, 0, 600, 0);
static const struct snd_kcontrol_new mt6358_snd_controls[] = { static const struct snd_kcontrol_new mt6358_snd_controls[] = {
/* dl pga gain */ /* dl pga gain */
SOC_DOUBLE_TLV("Headphone Volume", SOC_DOUBLE_EXT_TLV("Headphone Volume",
MT6358_ZCD_CON2, 0, 7, 0x12, 1, MT6358_ZCD_CON2, 0, 7, 0x12, 1,
playback_tlv), snd_soc_get_volsw, mt6358_put_volsw, playback_tlv),
SOC_DOUBLE_TLV("Lineout Volume", SOC_DOUBLE_EXT_TLV("Lineout Volume",
MT6358_ZCD_CON1, 0, 7, 0x12, 1, MT6358_ZCD_CON1, 0, 7, 0x12, 1,
playback_tlv), snd_soc_get_volsw, mt6358_put_volsw, playback_tlv),
SOC_SINGLE_TLV("Handset Volume", SOC_SINGLE_EXT_TLV("Handset Volume",
MT6358_ZCD_CON3, 0, 0x12, 1, MT6358_ZCD_CON3, 0, 0x12, 1,
playback_tlv), snd_soc_get_volsw, mt6358_put_volsw, playback_tlv),
/* ul pga gain */ /* ul pga gain */
SOC_DOUBLE_R_TLV("PGA Volume", SOC_DOUBLE_R_EXT_TLV("PGA Volume",
MT6358_AUDENC_ANA_CON0, MT6358_AUDENC_ANA_CON1, MT6358_AUDENC_ANA_CON0, MT6358_AUDENC_ANA_CON1,
8, 4, 0, 8, 4, 0,
pga_tlv), snd_soc_get_volsw, mt6358_put_volsw, pga_tlv),
}; };
/* MUX */ /* MUX */
...@@ -832,8 +856,6 @@ static int mtk_hp_enable(struct mt6358_priv *priv) ...@@ -832,8 +856,6 @@ static int mtk_hp_enable(struct mt6358_priv *priv)
/* Reduce ESD resistance of AU_REFN */ /* Reduce ESD resistance of AU_REFN */
regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4000); regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4000);
/* save target gain to restore after hardware open complete */
hp_store_gain(priv);
/* Set HPR/HPL gain as minimum (~ -40dB) */ /* Set HPR/HPL gain as minimum (~ -40dB) */
regmap_write(priv->regmap, MT6358_ZCD_CON2, DL_GAIN_N_40DB_REG); regmap_write(priv->regmap, MT6358_ZCD_CON2, DL_GAIN_N_40DB_REG);
...@@ -1043,8 +1065,6 @@ static int mtk_hp_spk_enable(struct mt6358_priv *priv) ...@@ -1043,8 +1065,6 @@ static int mtk_hp_spk_enable(struct mt6358_priv *priv)
/* Reduce ESD resistance of AU_REFN */ /* Reduce ESD resistance of AU_REFN */
regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4000); regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4000);
/* save target gain to restore after hardware open complete */
hp_store_gain(priv);
/* Set HPR/HPL gain to -10dB */ /* Set HPR/HPL gain to -10dB */
regmap_write(priv->regmap, MT6358_ZCD_CON2, DL_GAIN_N_10DB_REG); regmap_write(priv->regmap, MT6358_ZCD_CON2, DL_GAIN_N_10DB_REG);
...@@ -1104,7 +1124,6 @@ static int mtk_hp_spk_enable(struct mt6358_priv *priv) ...@@ -1104,7 +1124,6 @@ static int mtk_hp_spk_enable(struct mt6358_priv *priv)
hp_main_output_ramp(priv, true); hp_main_output_ramp(priv, true);
/* Set LO gain as minimum (~ -40dB) */ /* Set LO gain as minimum (~ -40dB) */
lo_store_gain(priv);
regmap_write(priv->regmap, MT6358_ZCD_CON1, DL_GAIN_N_40DB_REG); regmap_write(priv->regmap, MT6358_ZCD_CON1, DL_GAIN_N_40DB_REG);
/* apply volume setting */ /* apply volume setting */
headset_volume_ramp(priv, headset_volume_ramp(priv,
...@@ -1740,6 +1759,21 @@ static void mt6358_dmic_disable(struct mt6358_priv *priv) ...@@ -1740,6 +1759,21 @@ static void mt6358_dmic_disable(struct mt6358_priv *priv)
regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0000); regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0000);
} }
static void mt6358_restore_pga(struct mt6358_priv *priv)
{
unsigned int gain_l, gain_r;
gain_l = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1];
gain_r = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2];
regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
RG_AUDPREAMPLGAIN_MASK_SFT,
gain_l << RG_AUDPREAMPLGAIN_SFT);
regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
RG_AUDPREAMPRGAIN_MASK_SFT,
gain_r << RG_AUDPREAMPRGAIN_SFT);
}
static int mt_mic_type_event(struct snd_soc_dapm_widget *w, static int mt_mic_type_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, struct snd_kcontrol *kcontrol,
int event) int event)
...@@ -1764,6 +1798,7 @@ static int mt_mic_type_event(struct snd_soc_dapm_widget *w, ...@@ -1764,6 +1798,7 @@ static int mt_mic_type_event(struct snd_soc_dapm_widget *w,
mt6358_amic_enable(priv); mt6358_amic_enable(priv);
break; break;
} }
mt6358_restore_pga(priv);
break; break;
case SND_SOC_DAPM_POST_PMD: case SND_SOC_DAPM_POST_PMD:
......
...@@ -259,8 +259,10 @@ int snd_sof_create_page_table(struct snd_sof_dev *sdev, ...@@ -259,8 +259,10 @@ int snd_sof_create_page_table(struct snd_sof_dev *sdev,
static int sof_machine_check(struct snd_sof_dev *sdev) static int sof_machine_check(struct snd_sof_dev *sdev)
{ {
struct snd_sof_pdata *plat_data = sdev->pdata; struct snd_sof_pdata *plat_data = sdev->pdata;
#if IS_ENABLED(CONFIG_SND_SOC_SOF_NOCODEC)
struct snd_soc_acpi_mach *machine; struct snd_soc_acpi_mach *machine;
int ret; int ret;
#endif
if (plat_data->machine) if (plat_data->machine)
return 0; return 0;
......
...@@ -731,7 +731,8 @@ static const struct snd_soc_dai_ops stm32_i2s_pcm_dai_ops = { ...@@ -731,7 +731,8 @@ static const struct snd_soc_dai_ops stm32_i2s_pcm_dai_ops = {
static const struct snd_pcm_hardware stm32_i2s_pcm_hw = { static const struct snd_pcm_hardware stm32_i2s_pcm_hw = {
.info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP, .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP,
.buffer_bytes_max = 8 * PAGE_SIZE, .buffer_bytes_max = 8 * PAGE_SIZE,
.period_bytes_max = 2048, .period_bytes_min = 1024,
.period_bytes_max = 4 * PAGE_SIZE,
.periods_min = 2, .periods_min = 2,
.periods_max = 8, .periods_max = 8,
}; };
......
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