Unverified Commit bdb7e192 authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: Merge up workaround for CODECs that play noise on stopped stream

This was sent too late to actually make it for v6.6 but was sent against
v6.6 so merge it up here.
parents 0262a8a0 805ce818
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -370,6 +370,7 @@ struct snd_soc_dai_ops {

	/* bit field */
	unsigned int no_capture_mute:1;
	unsigned int mute_unmute_on_trigger:1;
};

struct snd_soc_cdai_ops {
+1 −6
Original line number Diff line number Diff line
@@ -1203,9 +1203,6 @@ static int wsa883x_spkr_event(struct snd_soc_dapm_widget *w,
			break;
		}

		snd_soc_component_write_field(component, WSA883X_DRE_CTL_1,
					      WSA883X_DRE_GAIN_EN_MASK,
					      WSA883X_DRE_GAIN_FROM_CSR);
		if (wsa883x->port_enable[WSA883X_PORT_COMP])
			snd_soc_component_write_field(component, WSA883X_DRE_CTL_0,
						      WSA883X_DRE_OFFSET_MASK,
@@ -1218,9 +1215,6 @@ static int wsa883x_spkr_event(struct snd_soc_dapm_widget *w,
		snd_soc_component_write_field(component, WSA883X_PDM_WD_CTL,
					      WSA883X_PDM_EN_MASK,
					      WSA883X_PDM_ENABLE);
		snd_soc_component_write_field(component, WSA883X_PA_FSM_CTL,
					      WSA883X_GLOBAL_PA_EN_MASK,
					      WSA883X_GLOBAL_PA_ENABLE);

		break;
	case SND_SOC_DAPM_PRE_PMD:
@@ -1346,6 +1340,7 @@ static const struct snd_soc_dai_ops wsa883x_dai_ops = {
	.hw_free = wsa883x_hw_free,
	.mute_stream = wsa883x_digital_mute,
	.set_stream = wsa883x_set_sdw_stream,
	.mute_unmute_on_trigger = true,
};

static struct snd_soc_dai_driver wsa883x_dais[] = {
+6 −2
Original line number Diff line number Diff line
@@ -1966,17 +1966,21 @@ static int fsl_easrc_probe(struct platform_device *pdev)
					      &fsl_easrc_dai, 1);
	if (ret) {
		dev_err(dev, "failed to register ASoC DAI\n");
		return ret;
		goto err_pm_disable;
	}

	ret = devm_snd_soc_register_component(dev, &fsl_asrc_component,
					      NULL, 0);
	if (ret) {
		dev_err(&pdev->dev, "failed to register ASoC platform\n");
		return ret;
		goto err_pm_disable;
	}

	return 0;

err_pm_disable:
	pm_runtime_disable(&pdev->dev);
	return ret;
}

static void fsl_easrc_remove(struct platform_device *pdev)
+1 −0
Original line number Diff line number Diff line
@@ -299,6 +299,7 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw,
		module->instance_id = devm_kzalloc(ctx->dev, size, GFP_KERNEL);
		if (!module->instance_id) {
			ret = -ENOMEM;
			kfree(module);
			goto free_uuid_list;
		}

+7 −0
Original line number Diff line number Diff line
@@ -658,6 +658,10 @@ int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream,
			ret = soc_dai_trigger(dai, substream, cmd);
			if (ret < 0)
				break;

			if (dai->driver->ops && dai->driver->ops->mute_unmute_on_trigger)
				snd_soc_dai_digital_mute(dai, 0, substream->stream);

			soc_dai_mark_push(dai, substream, trigger);
		}
		break;
@@ -668,6 +672,9 @@ int snd_soc_pcm_dai_trigger(struct snd_pcm_substream *substream,
			if (rollback && !soc_dai_mark_match(dai, substream, trigger))
				continue;

			if (dai->driver->ops && dai->driver->ops->mute_unmute_on_trigger)
				snd_soc_dai_digital_mute(dai, 1, substream->stream);

			r = soc_dai_trigger(dai, substream, cmd);
			if (r < 0)
				ret = r; /* use last ret */
Loading