mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
ASoC: qcom: Fix building APQ8016 machine driver without SOUNDWIRE
[ Upstream commit0cbf1ecd8c] 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 commit8d89cf6ff2("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:8d89cf6ff2("ASoC: qcom: cleanup and fix dependency of QCOM_COMMON") Signed-off-by: Stephan Gerhold <stephan@gerhold.net> Link: https://lore.kernel.org/r/20221231115506.82991-1-stephan@gerhold.net Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
31a997c40a
commit
c878ac66db
@@ -2,7 +2,6 @@
|
|||||||
menuconfig SND_SOC_QCOM
|
menuconfig SND_SOC_QCOM
|
||||||
tristate "ASoC support for QCOM platforms"
|
tristate "ASoC support for QCOM platforms"
|
||||||
depends on ARCH_QCOM || COMPILE_TEST
|
depends on ARCH_QCOM || COMPILE_TEST
|
||||||
imply SND_SOC_QCOM_COMMON
|
|
||||||
help
|
help
|
||||||
Say Y or M if you want to add support to use audio devices
|
Say Y or M if you want to add support to use audio devices
|
||||||
in Qualcomm Technologies SOC-based platforms.
|
in Qualcomm Technologies SOC-based platforms.
|
||||||
@@ -60,14 +59,16 @@ config SND_SOC_STORM
|
|||||||
config SND_SOC_APQ8016_SBC
|
config SND_SOC_APQ8016_SBC
|
||||||
tristate "SoC Audio support for APQ8016 SBC platforms"
|
tristate "SoC Audio support for APQ8016 SBC platforms"
|
||||||
select SND_SOC_LPASS_APQ8016
|
select SND_SOC_LPASS_APQ8016
|
||||||
depends on SND_SOC_QCOM_COMMON
|
select SND_SOC_QCOM_COMMON
|
||||||
help
|
help
|
||||||
Support for Qualcomm Technologies LPASS audio block in
|
Support for Qualcomm Technologies LPASS audio block in
|
||||||
APQ8016 SOC-based systems.
|
APQ8016 SOC-based systems.
|
||||||
Say Y if you want to use audio devices on MI2S.
|
Say Y if you want to use audio devices on MI2S.
|
||||||
|
|
||||||
config SND_SOC_QCOM_COMMON
|
config SND_SOC_QCOM_COMMON
|
||||||
depends on SOUNDWIRE
|
tristate
|
||||||
|
|
||||||
|
config SND_SOC_QCOM_SDW
|
||||||
tristate
|
tristate
|
||||||
|
|
||||||
config SND_SOC_QDSP6_COMMON
|
config SND_SOC_QDSP6_COMMON
|
||||||
@@ -144,7 +145,7 @@ config SND_SOC_MSM8996
|
|||||||
depends on QCOM_APR
|
depends on QCOM_APR
|
||||||
depends on COMMON_CLK
|
depends on COMMON_CLK
|
||||||
select SND_SOC_QDSP6
|
select SND_SOC_QDSP6
|
||||||
depends on SND_SOC_QCOM_COMMON
|
select SND_SOC_QCOM_COMMON
|
||||||
help
|
help
|
||||||
Support for Qualcomm Technologies LPASS audio block in
|
Support for Qualcomm Technologies LPASS audio block in
|
||||||
APQ8096 SoC-based systems.
|
APQ8096 SoC-based systems.
|
||||||
@@ -155,7 +156,7 @@ config SND_SOC_SDM845
|
|||||||
depends on QCOM_APR && I2C && SOUNDWIRE
|
depends on QCOM_APR && I2C && SOUNDWIRE
|
||||||
depends on COMMON_CLK
|
depends on COMMON_CLK
|
||||||
select SND_SOC_QDSP6
|
select SND_SOC_QDSP6
|
||||||
depends on SND_SOC_QCOM_COMMON
|
select SND_SOC_QCOM_COMMON
|
||||||
select SND_SOC_RT5663
|
select SND_SOC_RT5663
|
||||||
select SND_SOC_MAX98927
|
select SND_SOC_MAX98927
|
||||||
imply SND_SOC_CROS_EC_CODEC
|
imply SND_SOC_CROS_EC_CODEC
|
||||||
@@ -169,7 +170,8 @@ config SND_SOC_SM8250
|
|||||||
depends on QCOM_APR && SOUNDWIRE
|
depends on QCOM_APR && SOUNDWIRE
|
||||||
depends on COMMON_CLK
|
depends on COMMON_CLK
|
||||||
select SND_SOC_QDSP6
|
select SND_SOC_QDSP6
|
||||||
depends on SND_SOC_QCOM_COMMON
|
select SND_SOC_QCOM_COMMON
|
||||||
|
select SND_SOC_QCOM_SDW
|
||||||
help
|
help
|
||||||
To add support for audio on Qualcomm Technologies Inc.
|
To add support for audio on Qualcomm Technologies Inc.
|
||||||
SM8250 SoC-based systems.
|
SM8250 SoC-based systems.
|
||||||
@@ -180,7 +182,8 @@ config SND_SOC_SC8280XP
|
|||||||
depends on QCOM_APR && SOUNDWIRE
|
depends on QCOM_APR && SOUNDWIRE
|
||||||
depends on COMMON_CLK
|
depends on COMMON_CLK
|
||||||
select SND_SOC_QDSP6
|
select SND_SOC_QDSP6
|
||||||
depends on SND_SOC_QCOM_COMMON
|
select SND_SOC_QCOM_COMMON
|
||||||
|
select SND_SOC_QCOM_SDW
|
||||||
help
|
help
|
||||||
To add support for audio on Qualcomm Technologies Inc.
|
To add support for audio on Qualcomm Technologies Inc.
|
||||||
SC8280XP SoC-based systems.
|
SC8280XP SoC-based systems.
|
||||||
@@ -190,7 +193,7 @@ config SND_SOC_SC7180
|
|||||||
tristate "SoC Machine driver for SC7180 boards"
|
tristate "SoC Machine driver for SC7180 boards"
|
||||||
depends on I2C && GPIOLIB
|
depends on I2C && GPIOLIB
|
||||||
depends on SOUNDWIRE || SOUNDWIRE=n
|
depends on SOUNDWIRE || SOUNDWIRE=n
|
||||||
depends on SND_SOC_QCOM_COMMON
|
select SND_SOC_QCOM_COMMON
|
||||||
select SND_SOC_LPASS_SC7180
|
select SND_SOC_LPASS_SC7180
|
||||||
select SND_SOC_MAX98357A
|
select SND_SOC_MAX98357A
|
||||||
select SND_SOC_RT5682_I2C
|
select SND_SOC_RT5682_I2C
|
||||||
@@ -204,7 +207,7 @@ config SND_SOC_SC7180
|
|||||||
config SND_SOC_SC7280
|
config SND_SOC_SC7280
|
||||||
tristate "SoC Machine driver for SC7280 boards"
|
tristate "SoC Machine driver for SC7280 boards"
|
||||||
depends on I2C && SOUNDWIRE
|
depends on I2C && SOUNDWIRE
|
||||||
depends on SND_SOC_QCOM_COMMON
|
select SND_SOC_QCOM_COMMON
|
||||||
select SND_SOC_LPASS_SC7280
|
select SND_SOC_LPASS_SC7280
|
||||||
select SND_SOC_MAX98357A
|
select SND_SOC_MAX98357A
|
||||||
select SND_SOC_WCD938X_SDW
|
select SND_SOC_WCD938X_SDW
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ snd-soc-sdm845-objs := sdm845.o
|
|||||||
snd-soc-sm8250-objs := sm8250.o
|
snd-soc-sm8250-objs := sm8250.o
|
||||||
snd-soc-sc8280xp-objs := sc8280xp.o
|
snd-soc-sc8280xp-objs := sc8280xp.o
|
||||||
snd-soc-qcom-common-objs := common.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_STORM) += snd-soc-storm.o
|
||||||
obj-$(CONFIG_SND_SOC_APQ8016_SBC) += snd-soc-apq8016-sbc.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_SDM845) += snd-soc-sdm845.o
|
||||||
obj-$(CONFIG_SND_SOC_SM8250) += snd-soc-sm8250.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_COMMON) += snd-soc-qcom-common.o
|
||||||
|
obj-$(CONFIG_SND_SOC_QCOM_SDW) += snd-soc-qcom-sdw.o
|
||||||
|
|
||||||
#DSP lib
|
#DSP lib
|
||||||
obj-$(CONFIG_SND_SOC_QDSP6) += qdsp6/
|
obj-$(CONFIG_SND_SOC_QDSP6) += qdsp6/
|
||||||
|
|||||||
@@ -180,120 +180,6 @@ err_put_np:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(qcom_snd_parse_of);
|
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,
|
int qcom_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd,
|
||||||
struct snd_soc_jack *jack, bool *jack_setup)
|
struct snd_soc_jack *jack, bool *jack_setup)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,19 +5,9 @@
|
|||||||
#define __QCOM_SND_COMMON_H__
|
#define __QCOM_SND_COMMON_H__
|
||||||
|
|
||||||
#include <sound/soc.h>
|
#include <sound/soc.h>
|
||||||
#include <linux/soundwire/sdw.h>
|
|
||||||
|
|
||||||
int qcom_snd_parse_of(struct snd_soc_card *card);
|
int qcom_snd_parse_of(struct snd_soc_card *card);
|
||||||
int qcom_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd,
|
int qcom_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd,
|
||||||
struct snd_soc_jack *jack, bool *jack_setup);
|
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
|
#endif
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <linux/input-event-codes.h>
|
#include <linux/input-event-codes.h>
|
||||||
#include "qdsp6/q6afe.h"
|
#include "qdsp6/q6afe.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "sdw.h"
|
||||||
|
|
||||||
#define DRIVER_NAME "sc8280xp"
|
#define DRIVER_NAME "sc8280xp"
|
||||||
|
|
||||||
|
|||||||
123
sound/soc/qcom/sdw.c
Normal file
123
sound/soc/qcom/sdw.c
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
// Copyright (c) 2018, Linaro Limited.
|
||||||
|
// Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||||
|
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <sound/soc.h>
|
||||||
|
#include "qdsp6/q6afe.h"
|
||||||
|
#include "sdw.h"
|
||||||
|
|
||||||
|
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);
|
||||||
|
MODULE_LICENSE("GPL v2");
|
||||||
18
sound/soc/qcom/sdw.h
Normal file
18
sound/soc/qcom/sdw.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
// Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||||
|
|
||||||
|
#ifndef __QCOM_SND_SDW_H__
|
||||||
|
#define __QCOM_SND_SDW_H__
|
||||||
|
|
||||||
|
#include <linux/soundwire/sdw.h>
|
||||||
|
|
||||||
|
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
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <linux/input-event-codes.h>
|
#include <linux/input-event-codes.h>
|
||||||
#include "qdsp6/q6afe.h"
|
#include "qdsp6/q6afe.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "sdw.h"
|
||||||
|
|
||||||
#define DRIVER_NAME "sm8250"
|
#define DRIVER_NAME "sm8250"
|
||||||
#define MI2S_BCLK_RATE 1536000
|
#define MI2S_BCLK_RATE 1536000
|
||||||
|
|||||||
Reference in New Issue
Block a user