Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b1a46b8 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "asoc: qcs405: fix pop at end of DSD playback"

parents ebc5c9c0 fa2b1d30
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
 */
#include <linux/init.h>
#include <linux/delay.h>
@@ -602,6 +602,25 @@ static const struct snd_soc_dapm_route csra66x0_dapm_routes[] = {
	{"PGA", NULL, "DAC"},
	{"SPKR", NULL, "PGA"},
};
/*
 * csra66x0_hw_free_mute - Update csra66x0 mute register
 *
 * @component - csra66x0 component
 *
 */
void csra66x0_hw_free_mute(struct snd_soc_component *component)
{
	int val = 0;

	if (component == NULL)
		return;

	val = snd_soc_component_read32(component,
			CSRA66X0_MISC_CONTROL_STATUS_1_FA);
	snd_soc_component_write(component, CSRA66X0_MISC_CONTROL_STATUS_1_FA,
			val | 0x04);
}
EXPORT_SYMBOL(csra66x0_hw_free_mute);

static int csra66x0_wait_for_config_state(struct snd_soc_component *component)
{
+3 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
 */

#ifndef _CSRA66X0_H
@@ -226,4 +226,6 @@
#define FAULT_STATUS_TEMP           0x10
#define FAULT_STATUS_PROTECT        0x20


void csra66x0_hw_free_mute(struct snd_soc_component *component);
#endif /* _CSRA66X0_H */
+31 −0
Original line number Diff line number Diff line
@@ -6177,6 +6177,36 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
	return ret;
}

static int msm_mi2s_snd_hw_free(struct snd_pcm_substream *substream)
{
	int i, data_format = 0;
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	int index = rtd->cpu_dai->id;
	struct snd_soc_card *card = rtd->card;
	struct snd_soc_component *component;

	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		data_format = mi2s_rx_cfg[index].data_format;
	else
		data_format = mi2s_tx_cfg[index].data_format;

	pr_debug("%s(): substream = %s  stream = %d\n", __func__,
		 substream->name, substream->stream);

	/* Call csra mute function if data format is DSD, else return */
	if (data_format != AFE_DSD_DATA)
		return 0;

	for (i = 0; i < card->num_aux_devs; i++) {
		component =
			soc_find_component(card->aux_dev[i].codec_of_node,
					NULL);
		csra66x0_hw_free_mute(component);
	}

	return 0;
}

static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
{
	int ret;
@@ -6504,6 +6534,7 @@ static void msm_spdif_snd_shutdown(struct snd_pcm_substream *substream)

static struct snd_soc_ops msm_mi2s_be_ops = {
	.startup = msm_mi2s_snd_startup,
	.hw_free = msm_mi2s_snd_hw_free,
	.shutdown = msm_mi2s_snd_shutdown,
};