Commit 7027eee0 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge tag 'asoc-fix-v6.12-rc5' of...

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

ASoC: Fixes for v6.12

The biggest set of changes here is Hans' fixes and quirks for various
Baytrail based platforms with RT5640 CODECs, and there's one core fix
for a missed length assignment for __counted_by() checking.  Otherwise
it's small device specific fixes, several of them in the DT bindings.
parents ef5fbdf7 2db63e92
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -48,6 +48,10 @@ properties:
      - const: mclk_rx
      - const: hclk

  port:
    $ref: audio-graph-port.yaml#
    unevaluatedProperties: false

  resets:
    maxItems: 1

+4 −0
Original line number Diff line number Diff line
@@ -721,6 +721,10 @@ static const struct config_entry acpi_config_table[] = {
#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
    IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
/* BayTrail */
	{
		.flags = FLAG_SST_OR_SOF_BYT,
		.acpi_hid = "LPE0F28",
	},
	{
		.flags = FLAG_SST_OR_SOF_BYT,
		.acpi_hid = "80860F28",
+5 −2
Original line number Diff line number Diff line
@@ -747,8 +747,10 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap)

	cs42l51->reset_gpio = devm_gpiod_get_optional(dev, "reset",
						      GPIOD_OUT_LOW);
	if (IS_ERR(cs42l51->reset_gpio))
		return PTR_ERR(cs42l51->reset_gpio);
	if (IS_ERR(cs42l51->reset_gpio)) {
		ret = PTR_ERR(cs42l51->reset_gpio);
		goto error;
	}

	if (cs42l51->reset_gpio) {
		dev_dbg(dev, "Release reset gpio\n");
@@ -780,6 +782,7 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap)
	return 0;

error:
	gpiod_set_value_cansleep(cs42l51->reset_gpio, 1);
	regulator_bulk_disable(ARRAY_SIZE(cs42l51->supplies),
			       cs42l51->supplies);
	return ret;
+15 −12
Original line number Diff line number Diff line
@@ -2419,10 +2419,20 @@ static irqreturn_t rt5640_jd_gpio_irq(int irq, void *data)
	return IRQ_HANDLED;
}

static void rt5640_cancel_work(void *data)
static void rt5640_disable_irq_and_cancel_work(void *data)
{
	struct rt5640_priv *rt5640 = data;

	if (rt5640->jd_gpio_irq_requested) {
		free_irq(rt5640->jd_gpio_irq, rt5640);
		rt5640->jd_gpio_irq_requested = false;
	}

	if (rt5640->irq_requested) {
		free_irq(rt5640->irq, rt5640);
		rt5640->irq_requested = false;
	}

	cancel_delayed_work_sync(&rt5640->jack_work);
	cancel_delayed_work_sync(&rt5640->bp_work);
}
@@ -2463,13 +2473,7 @@ static void rt5640_disable_jack_detect(struct snd_soc_component *component)
	if (!rt5640->jack)
		return;

	if (rt5640->jd_gpio_irq_requested)
		free_irq(rt5640->jd_gpio_irq, rt5640);

	if (rt5640->irq_requested)
		free_irq(rt5640->irq, rt5640);

	rt5640_cancel_work(rt5640);
	rt5640_disable_irq_and_cancel_work(rt5640);

	if (rt5640->jack->status & SND_JACK_MICROPHONE) {
		rt5640_disable_micbias1_ovcd_irq(component);
@@ -2477,8 +2481,6 @@ static void rt5640_disable_jack_detect(struct snd_soc_component *component)
		snd_soc_jack_report(rt5640->jack, 0, SND_JACK_BTN_0);
	}

	rt5640->jd_gpio_irq_requested = false;
	rt5640->irq_requested = false;
	rt5640->jd_gpio = NULL;
	rt5640->jack = NULL;
}
@@ -2798,7 +2800,8 @@ static int rt5640_suspend(struct snd_soc_component *component)
	if (rt5640->jack) {
		/* disable jack interrupts during system suspend */
		disable_irq(rt5640->irq);
		rt5640_cancel_work(rt5640);
		cancel_delayed_work_sync(&rt5640->jack_work);
		cancel_delayed_work_sync(&rt5640->bp_work);
	}

	snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);
@@ -3032,7 +3035,7 @@ static int rt5640_i2c_probe(struct i2c_client *i2c)
	INIT_DELAYED_WORK(&rt5640->jack_work, rt5640_jack_work);

	/* Make sure work is stopped on probe-error / remove */
	ret = devm_add_action_or_reset(&i2c->dev, rt5640_cancel_work, rt5640);
	ret = devm_add_action_or_reset(&i2c->dev, rt5640_disable_irq_and_cancel_work, rt5640);
	if (ret)
		return ret;

+10 −2
Original line number Diff line number Diff line
@@ -715,12 +715,17 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w,
	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
	struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component);
	int hph_mode = wcd937x->hph_mode;
	u8 val;

	switch (event) {
	case SND_SOC_DAPM_PRE_PMU:
		val = WCD937X_DIGITAL_PDM_WD_CTL2_EN |
		      WCD937X_DIGITAL_PDM_WD_CTL2_TIMEOUT_SEL |
		      WCD937X_DIGITAL_PDM_WD_CTL2_HOLD_OFF;
		snd_soc_component_update_bits(component,
					      WCD937X_DIGITAL_PDM_WD_CTL2,
					      BIT(0), BIT(0));
					      WCD937X_DIGITAL_PDM_WD_CTL2_MASK,
					      val);
		break;
	case SND_SOC_DAPM_POST_PMU:
		usleep_range(1000, 1010);
@@ -741,7 +746,8 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w,
					hph_mode);
		snd_soc_component_update_bits(component,
					      WCD937X_DIGITAL_PDM_WD_CTL2,
					      BIT(0), 0x00);
					      WCD937X_DIGITAL_PDM_WD_CTL2_MASK,
					      0x00);
		break;
	}

@@ -2049,6 +2055,8 @@ static const struct snd_kcontrol_new wcd937x_snd_controls[] = {
		       wcd937x_get_swr_port, wcd937x_set_swr_port),
	SOC_SINGLE_EXT("HPHR Switch", WCD937X_HPH_R, 0, 1, 0,
		       wcd937x_get_swr_port, wcd937x_set_swr_port),
	SOC_SINGLE_EXT("LO Switch", WCD937X_LO, 0, 1, 0,
		       wcd937x_get_swr_port, wcd937x_set_swr_port),

	SOC_SINGLE_EXT("ADC1 Switch", WCD937X_ADC1, 1, 1, 0,
		       wcd937x_get_swr_port, wcd937x_set_swr_port),
Loading