Unverified Commit 0cbf1ecd authored by Stephan Gerhold's avatar Stephan Gerhold Committed by Mark Brown
Browse files

ASoC: qcom: Fix building APQ8016 machine driver without SOUNDWIRE



Older Qualcomm platforms like APQ8016 do not have hardware support for
SoundWire, so kernel configurations made specifically for those platforms
will usually not have CONFIG_SOUNDWIRE enabled.

Unfortunately commit 8d89cf6f ("ASoC: qcom: cleanup and fix
dependency of QCOM_COMMON") breaks those kernel configurations, because
SOUNDWIRE is now a required dependency for SND_SOC_QCOM_COMMON (and in
turn also SND_SOC_APQ8016_SBC). Trying to migrate such a kernel config
silently disables SND_SOC_APQ8016_SBC and breaks audio functionality.

The soundwire helpers in common.c are only used by two of the Qualcomm
audio machine drivers, so building and requiring CONFIG_SOUNDWIRE for
all platforms is unnecessary.

There is no need to stuff all common code into a single module. Fix the
issue by moving the soundwire helpers to a separate SND_SOC_QCOM_SDW
module/option that is selected only by the machine drivers that make
use of them. This also allows reverting the imply/depends changes from
the previous fix because both SM8250 and SC8280XP already depend on
SOUNDWIRE, so the soundwire helpers will be only built if SOUNDWIRE
is really enabled.

Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Fixes: 8d89cf6f ("ASoC: qcom: cleanup and fix dependency of QCOM_COMMON")
Signed-off-by: default avatarStephan Gerhold <stephan@gerhold.net>
Link: https://lore.kernel.org/r/20221231115506.82991-1-stephan@gerhold.net


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent cdfa92eb
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@
menuconfig SND_SOC_QCOM
	tristate "ASoC support for QCOM platforms"
	depends on ARCH_QCOM || COMPILE_TEST
	imply SND_SOC_QCOM_COMMON
	help
	  Say Y or M if you want to add support to use audio devices
	  in Qualcomm Technologies SOC-based platforms.
@@ -60,14 +59,16 @@ config SND_SOC_STORM
config SND_SOC_APQ8016_SBC
	tristate "SoC Audio support for APQ8016 SBC platforms"
	select SND_SOC_LPASS_APQ8016
	depends on SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_COMMON
	help
	  Support for Qualcomm Technologies LPASS audio block in
	  APQ8016 SOC-based systems.
	  Say Y if you want to use audio devices on MI2S.

config SND_SOC_QCOM_COMMON
	depends on SOUNDWIRE
	tristate

config SND_SOC_QCOM_SDW
	tristate

config SND_SOC_QDSP6_COMMON
@@ -144,7 +145,7 @@ config SND_SOC_MSM8996
	depends on QCOM_APR
	depends on COMMON_CLK
	select SND_SOC_QDSP6
	depends on SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_COMMON
	help
	  Support for Qualcomm Technologies LPASS audio block in
	  APQ8096 SoC-based systems.
@@ -155,7 +156,7 @@ config SND_SOC_SDM845
	depends on QCOM_APR && I2C && SOUNDWIRE
	depends on COMMON_CLK
	select SND_SOC_QDSP6
	depends on SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_COMMON
	select SND_SOC_RT5663
	select SND_SOC_MAX98927
	imply SND_SOC_CROS_EC_CODEC
@@ -169,7 +170,8 @@ config SND_SOC_SM8250
	depends on QCOM_APR && SOUNDWIRE
	depends on COMMON_CLK
	select SND_SOC_QDSP6
	depends on SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_SDW
	help
	  To add support for audio on Qualcomm Technologies Inc.
	  SM8250 SoC-based systems.
@@ -180,7 +182,8 @@ config SND_SOC_SC8280XP
	depends on QCOM_APR && SOUNDWIRE
	depends on COMMON_CLK
	select SND_SOC_QDSP6
	depends on SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_SDW
	help
	  To add support for audio on Qualcomm Technologies Inc.
	  SC8280XP SoC-based systems.
@@ -190,7 +193,7 @@ config SND_SOC_SC7180
	tristate "SoC Machine driver for SC7180 boards"
	depends on I2C && GPIOLIB
	depends on SOUNDWIRE || SOUNDWIRE=n
	depends on SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_COMMON
	select SND_SOC_LPASS_SC7180
	select SND_SOC_MAX98357A
	select SND_SOC_RT5682_I2C
@@ -204,7 +207,7 @@ config SND_SOC_SC7180
config SND_SOC_SC7280
	tristate "SoC Machine driver for SC7280 boards"
	depends on I2C && SOUNDWIRE
	depends on SND_SOC_QCOM_COMMON
	select SND_SOC_QCOM_COMMON
	select SND_SOC_LPASS_SC7280
	select SND_SOC_MAX98357A
	select SND_SOC_WCD938X_SDW
+2 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ snd-soc-sdm845-objs := sdm845.o
snd-soc-sm8250-objs := sm8250.o
snd-soc-sc8280xp-objs := sc8280xp.o
snd-soc-qcom-common-objs := common.o
snd-soc-qcom-sdw-objs := sdw.o

obj-$(CONFIG_SND_SOC_STORM) += snd-soc-storm.o
obj-$(CONFIG_SND_SOC_APQ8016_SBC) += snd-soc-apq8016-sbc.o
@@ -38,6 +39,7 @@ obj-$(CONFIG_SND_SOC_SC8280XP) += snd-soc-sc8280xp.o
obj-$(CONFIG_SND_SOC_SDM845) += snd-soc-sdm845.o
obj-$(CONFIG_SND_SOC_SM8250) += snd-soc-sm8250.o
obj-$(CONFIG_SND_SOC_QCOM_COMMON) += snd-soc-qcom-common.o
obj-$(CONFIG_SND_SOC_QCOM_SDW) += snd-soc-qcom-sdw.o

#DSP lib
obj-$(CONFIG_SND_SOC_QDSP6) += qdsp6/
+0 −114
Original line number Diff line number Diff line
@@ -180,120 +180,6 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
}
EXPORT_SYMBOL_GPL(qcom_snd_parse_of);

int qcom_snd_sdw_prepare(struct snd_pcm_substream *substream,
			 struct sdw_stream_runtime *sruntime,
			 bool *stream_prepared)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
	int ret;

	if (!sruntime)
		return 0;

	switch (cpu_dai->id) {
	case WSA_CODEC_DMA_RX_0:
	case WSA_CODEC_DMA_RX_1:
	case RX_CODEC_DMA_RX_0:
	case RX_CODEC_DMA_RX_1:
	case TX_CODEC_DMA_TX_0:
	case TX_CODEC_DMA_TX_1:
	case TX_CODEC_DMA_TX_2:
	case TX_CODEC_DMA_TX_3:
		break;
	default:
		return 0;
	}

	if (*stream_prepared) {
		sdw_disable_stream(sruntime);
		sdw_deprepare_stream(sruntime);
		*stream_prepared = false;
	}

	ret = sdw_prepare_stream(sruntime);
	if (ret)
		return ret;

	/**
	 * NOTE: there is a strict hw requirement about the ordering of port
	 * enables and actual WSA881x PA enable. PA enable should only happen
	 * after soundwire ports are enabled if not DC on the line is
	 * accumulated resulting in Click/Pop Noise
	 * PA enable/mute are handled as part of codec DAPM and digital mute.
	 */

	ret = sdw_enable_stream(sruntime);
	if (ret) {
		sdw_deprepare_stream(sruntime);
		return ret;
	}
	*stream_prepared  = true;

	return ret;
}
EXPORT_SYMBOL_GPL(qcom_snd_sdw_prepare);

int qcom_snd_sdw_hw_params(struct snd_pcm_substream *substream,
			   struct snd_pcm_hw_params *params,
			   struct sdw_stream_runtime **psruntime)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_dai *codec_dai;
	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
	struct sdw_stream_runtime *sruntime;
	int i;

	switch (cpu_dai->id) {
	case WSA_CODEC_DMA_RX_0:
	case RX_CODEC_DMA_RX_0:
	case RX_CODEC_DMA_RX_1:
	case TX_CODEC_DMA_TX_0:
	case TX_CODEC_DMA_TX_1:
	case TX_CODEC_DMA_TX_2:
	case TX_CODEC_DMA_TX_3:
		for_each_rtd_codec_dais(rtd, i, codec_dai) {
			sruntime = snd_soc_dai_get_stream(codec_dai, substream->stream);
			if (sruntime != ERR_PTR(-ENOTSUPP))
				*psruntime = sruntime;
		}
		break;
	}

	return 0;

}
EXPORT_SYMBOL_GPL(qcom_snd_sdw_hw_params);

int qcom_snd_sdw_hw_free(struct snd_pcm_substream *substream,
			 struct sdw_stream_runtime *sruntime, bool *stream_prepared)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);

	switch (cpu_dai->id) {
	case WSA_CODEC_DMA_RX_0:
	case WSA_CODEC_DMA_RX_1:
	case RX_CODEC_DMA_RX_0:
	case RX_CODEC_DMA_RX_1:
	case TX_CODEC_DMA_TX_0:
	case TX_CODEC_DMA_TX_1:
	case TX_CODEC_DMA_TX_2:
	case TX_CODEC_DMA_TX_3:
		if (sruntime && *stream_prepared) {
			sdw_disable_stream(sruntime);
			sdw_deprepare_stream(sruntime);
			*stream_prepared = false;
		}
		break;
	default:
		break;
	}

	return 0;
}
EXPORT_SYMBOL_GPL(qcom_snd_sdw_hw_free);

int qcom_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd,
			    struct snd_soc_jack *jack, bool *jack_setup)
{
+0 −10
Original line number Diff line number Diff line
@@ -5,19 +5,9 @@
#define __QCOM_SND_COMMON_H__

#include <sound/soc.h>
#include <linux/soundwire/sdw.h>

int qcom_snd_parse_of(struct snd_soc_card *card);
int qcom_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd,
			    struct snd_soc_jack *jack, bool *jack_setup);

int qcom_snd_sdw_prepare(struct snd_pcm_substream *substream,
			 struct sdw_stream_runtime *runtime,
			 bool *stream_prepared);
int qcom_snd_sdw_hw_params(struct snd_pcm_substream *substream,
			   struct snd_pcm_hw_params *params,
			   struct sdw_stream_runtime **psruntime);
int qcom_snd_sdw_hw_free(struct snd_pcm_substream *substream,
			 struct sdw_stream_runtime *sruntime,
			 bool *stream_prepared);
#endif
+1 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <linux/input-event-codes.h>
#include "qdsp6/q6afe.h"
#include "common.h"
#include "sdw.h"

#define DRIVER_NAME		"sc8280xp"

Loading