Commit 25a3b959 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge tag 'asoc-fix-v6.0-rc1' of...

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

ASoC: Fixes for v6.0

A relatively large batch of fixes that came in since my pull request,
none of them too major and mostly device specific apart from a series of
security/robustness improvements from Takashi.
parents 461122b9 b4b5f29a
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -143,6 +143,34 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
			DMI_MATCH(DMI_PRODUCT_NAME, "21CL"),
		}
	},
	{
		.driver_data = &acp6x_card,
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
			DMI_MATCH(DMI_PRODUCT_NAME, "21EM"),
		}
	},
	{
		.driver_data = &acp6x_card,
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
			DMI_MATCH(DMI_PRODUCT_NAME, "21EN"),
		}
	},
	{
		.driver_data = &acp6x_card,
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
			DMI_MATCH(DMI_PRODUCT_NAME, "21J5"),
		}
	},
	{
		.driver_data = &acp6x_card,
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
			DMI_MATCH(DMI_PRODUCT_NAME, "21J6"),
		}
	},
	{}
};

+3 −2
Original line number Diff line number Diff line
@@ -1986,7 +1986,7 @@ static int rt5640_set_bias_level(struct snd_soc_component *component,
		snd_soc_component_write(component, RT5640_PWR_MIXER, 0x0000);
		if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER)
			snd_soc_component_write(component, RT5640_PWR_ANLG1,
				0x0018);
				0x2818);
		else
			snd_soc_component_write(component, RT5640_PWR_ANLG1,
				0x0000);
@@ -2600,7 +2600,8 @@ static void rt5640_enable_hda_jack_detect(
	snd_soc_component_update_bits(component, RT5640_DUMMY1, 0x400, 0x0);

	snd_soc_component_update_bits(component, RT5640_PWR_ANLG1,
		RT5640_PWR_VREF2, RT5640_PWR_VREF2);
		RT5640_PWR_VREF2 | RT5640_PWR_MB | RT5640_PWR_BG,
		RT5640_PWR_VREF2 | RT5640_PWR_MB | RT5640_PWR_BG);
	usleep_range(10000, 15000);
	snd_soc_component_update_bits(component, RT5640_PWR_ANLG1,
		RT5640_PWR_FV2, RT5640_PWR_FV2);
+43 −55
Original line number Diff line number Diff line
@@ -46,34 +46,22 @@ static void tas2770_reset(struct tas2770_priv *tas2770)
	usleep_range(1000, 2000);
}

static int tas2770_set_bias_level(struct snd_soc_component *component,
				 enum snd_soc_bias_level level)
static int tas2770_update_pwr_ctrl(struct tas2770_priv *tas2770)
{
	struct tas2770_priv *tas2770 =
			snd_soc_component_get_drvdata(component);
	struct snd_soc_component *component = tas2770->component;
	unsigned int val;
	int ret;

	switch (level) {
	case SND_SOC_BIAS_ON:
		snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
					      TAS2770_PWR_CTRL_MASK,
					      TAS2770_PWR_CTRL_ACTIVE);
		break;
	case SND_SOC_BIAS_STANDBY:
	case SND_SOC_BIAS_PREPARE:
		snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
					      TAS2770_PWR_CTRL_MASK,
					      TAS2770_PWR_CTRL_MUTE);
		break;
	case SND_SOC_BIAS_OFF:
		snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
					      TAS2770_PWR_CTRL_MASK,
					      TAS2770_PWR_CTRL_SHUTDOWN);
		break;
	if (tas2770->dac_powered)
		val = tas2770->unmuted ?
			TAS2770_PWR_CTRL_ACTIVE : TAS2770_PWR_CTRL_MUTE;
	else
		val = TAS2770_PWR_CTRL_SHUTDOWN;

	default:
		dev_err(tas2770->dev, "wrong power level setting %d\n", level);
		return -EINVAL;
	}
	ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
					    TAS2770_PWR_CTRL_MASK, val);
	if (ret < 0)
		return ret;

	return 0;
}
@@ -114,9 +102,7 @@ static int tas2770_codec_resume(struct snd_soc_component *component)
		gpiod_set_value_cansleep(tas2770->sdz_gpio, 1);
		usleep_range(1000, 2000);
	} else {
		ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
						    TAS2770_PWR_CTRL_MASK,
						    TAS2770_PWR_CTRL_ACTIVE);
		ret = tas2770_update_pwr_ctrl(tas2770);
		if (ret < 0)
			return ret;
	}
@@ -152,24 +138,19 @@ static int tas2770_dac_event(struct snd_soc_dapm_widget *w,

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
						    TAS2770_PWR_CTRL_MASK,
						    TAS2770_PWR_CTRL_MUTE);
		tas2770->dac_powered = 1;
		ret = tas2770_update_pwr_ctrl(tas2770);
		break;
	case SND_SOC_DAPM_PRE_PMD:
		ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
						    TAS2770_PWR_CTRL_MASK,
						    TAS2770_PWR_CTRL_SHUTDOWN);
		tas2770->dac_powered = 0;
		ret = tas2770_update_pwr_ctrl(tas2770);
		break;
	default:
		dev_err(tas2770->dev, "Not supported evevt\n");
		return -EINVAL;
	}

	if (ret < 0)
	return ret;

	return 0;
}

static const struct snd_kcontrol_new isense_switch =
@@ -203,21 +184,11 @@ static const struct snd_soc_dapm_route tas2770_audio_map[] = {
static int tas2770_mute(struct snd_soc_dai *dai, int mute, int direction)
{
	struct snd_soc_component *component = dai->component;
	int ret;

	if (mute)
		ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
						    TAS2770_PWR_CTRL_MASK,
						    TAS2770_PWR_CTRL_MUTE);
	else
		ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
						    TAS2770_PWR_CTRL_MASK,
						    TAS2770_PWR_CTRL_ACTIVE);

	if (ret < 0)
		return ret;
	struct tas2770_priv *tas2770 =
			snd_soc_component_get_drvdata(component);

	return 0;
	tas2770->unmuted = !mute;
	return tas2770_update_pwr_ctrl(tas2770);
}

static int tas2770_set_bitwidth(struct tas2770_priv *tas2770, int bitwidth)
@@ -337,7 +308,7 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
	struct snd_soc_component *component = dai->component;
	struct tas2770_priv *tas2770 =
			snd_soc_component_get_drvdata(component);
	u8 tdm_rx_start_slot = 0, asi_cfg_1 = 0;
	u8 tdm_rx_start_slot = 0, invert_fpol = 0, fpol_preinv = 0, asi_cfg_1 = 0;
	int ret;

	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
@@ -349,9 +320,15 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
	}

	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
	case SND_SOC_DAIFMT_NB_IF:
		invert_fpol = 1;
		fallthrough;
	case SND_SOC_DAIFMT_NB_NF:
		asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_RSING;
		break;
	case SND_SOC_DAIFMT_IB_IF:
		invert_fpol = 1;
		fallthrough;
	case SND_SOC_DAIFMT_IB_NF:
		asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_FALING;
		break;
@@ -369,15 +346,19 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
	case SND_SOC_DAIFMT_I2S:
		tdm_rx_start_slot = 1;
		fpol_preinv = 0;
		break;
	case SND_SOC_DAIFMT_DSP_A:
		tdm_rx_start_slot = 0;
		fpol_preinv = 1;
		break;
	case SND_SOC_DAIFMT_DSP_B:
		tdm_rx_start_slot = 1;
		fpol_preinv = 1;
		break;
	case SND_SOC_DAIFMT_LEFT_J:
		tdm_rx_start_slot = 0;
		fpol_preinv = 1;
		break;
	default:
		dev_err(tas2770->dev,
@@ -391,6 +372,14 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
	if (ret < 0)
		return ret;

	ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG0,
					    TAS2770_TDM_CFG_REG0_FPOL_MASK,
					    (fpol_preinv ^ invert_fpol)
					     ? TAS2770_TDM_CFG_REG0_FPOL_RSING
					     : TAS2770_TDM_CFG_REG0_FPOL_FALING);
	if (ret < 0)
		return ret;

	return 0;
}

@@ -489,7 +478,7 @@ static struct snd_soc_dai_driver tas2770_dai_driver[] = {
		.id = 0,
		.playback = {
			.stream_name    = "ASI1 Playback",
			.channels_min   = 2,
			.channels_min   = 1,
			.channels_max   = 2,
			.rates      = TAS2770_RATES,
			.formats    = TAS2770_FORMATS,
@@ -537,7 +526,6 @@ static const struct snd_soc_component_driver soc_component_driver_tas2770 = {
	.probe			= tas2770_codec_probe,
	.suspend		= tas2770_codec_suspend,
	.resume			= tas2770_codec_resume,
	.set_bias_level = tas2770_set_bias_level,
	.controls		= tas2770_snd_controls,
	.num_controls		= ARRAY_SIZE(tas2770_snd_controls),
	.dapm_widgets		= tas2770_dapm_widgets,
+5 −0
Original line number Diff line number Diff line
@@ -41,6 +41,9 @@
#define TAS2770_TDM_CFG_REG0_31_44_1_48KHZ  0x6
#define TAS2770_TDM_CFG_REG0_31_88_2_96KHZ  0x8
#define TAS2770_TDM_CFG_REG0_31_176_4_192KHZ  0xa
#define TAS2770_TDM_CFG_REG0_FPOL_MASK  BIT(0)
#define TAS2770_TDM_CFG_REG0_FPOL_RSING  0
#define TAS2770_TDM_CFG_REG0_FPOL_FALING  1
    /* TDM Configuration Reg1 */
#define TAS2770_TDM_CFG_REG1  TAS2770_REG(0X0, 0x0B)
#define TAS2770_TDM_CFG_REG1_MASK	GENMASK(5, 1)
@@ -135,6 +138,8 @@ struct tas2770_priv {
	struct device *dev;
	int v_sense_slot;
	int i_sense_slot;
	bool dac_powered;
	bool unmuted;
};

#endif /* __TAS2770__ */
+9 −0
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ struct aic32x4_priv {
	struct aic32x4_setup_data *setup;
	struct device *dev;
	enum aic32x4_type type;

	unsigned int fmt;
};

static int aic32x4_reset_adc(struct snd_soc_dapm_widget *w,
@@ -611,6 +613,7 @@ static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai,
static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
{
	struct snd_soc_component *component = codec_dai->component;
	struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component);
	u8 iface_reg_1 = 0;
	u8 iface_reg_2 = 0;
	u8 iface_reg_3 = 0;
@@ -653,6 +656,8 @@ static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
		return -EINVAL;
	}

	aic32x4->fmt = fmt;

	snd_soc_component_update_bits(component, AIC32X4_IFACE1,
				AIC32X4_IFACE1_DATATYPE_MASK |
				AIC32X4_IFACE1_MASTER_MASK, iface_reg_1);
@@ -757,6 +762,10 @@ static int aic32x4_setup_clocks(struct snd_soc_component *component,
		return -EINVAL;
	}

	/* PCM over I2S is always 2-channel */
	if ((aic32x4->fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S)
		channels = 2;

	madc = DIV_ROUND_UP((32 * adc_resource_class), aosr);
	max_dosr = (AIC32X4_MAX_DOSR_FREQ / sample_rate / dosr_increment) *
			dosr_increment;
Loading