ASoC: Fixes for v6.15
A set of small fixes, quirks and device ID additions that came in since -rc1, none of them super stand out. There's also a change to Srini's email address in MAINTAINERS. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmf5Aj8ACgkQJNaLcl1U h9CpLAf9FE8grQXtlVv5DcIXCvmE4ZXLp3A+UKyuSzU5R0CYvbQ/eS+1pAYsSXzz alXILKp/4lBxPxUjQdMUCw9uGX3Px+VX64IoNWZcvEqUNHlvqXcyAlIqN9UmWyWq aX55h+gJdYuRj+6R/qPtQroqeqimcVAFi/iggeYJjiuKL2W9Bdy054Z0UgT2TtUC Tw5e+9qinrHred8MoCe+FD0w0PKAsMSXVWNm2XSnwBUzURI4OWdD338kK8rODgFn /7j75wX9FyJnnB+RZrju7H1fkIj+b+y1+7pLPHbZt9dyen2W/ftcdKexT7JtlQES Ss/Pi4gVDRqT+2UEbEXz7MlhT2hXSw== =7hPh -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v6.15-rc1' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v6.15 A set of small fixes, quirks and device ID additions that came in since -rc1, none of them super stand out. There's also a change to Srini's email address in MAINTAINERS.pull/1203/head
commit
7338856257
2
.mailmap
2
.mailmap
|
|
@ -685,6 +685,8 @@ Simon Wunderlich <sw@simonwunderlich.de> <simon.wunderlich@saxnet.de>
|
||||||
Simon Wunderlich <sw@simonwunderlich.de> <simon@open-mesh.com>
|
Simon Wunderlich <sw@simonwunderlich.de> <simon@open-mesh.com>
|
||||||
Simon Wunderlich <sw@simonwunderlich.de> <siwu@hrz.tu-chemnitz.de>
|
Simon Wunderlich <sw@simonwunderlich.de> <siwu@hrz.tu-chemnitz.de>
|
||||||
Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org>
|
Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org>
|
||||||
|
Srinivas Kandagatla <srini@kernel.org> <srinivas.kandagatla@st.com>
|
||||||
|
Srinivas Kandagatla <srini@kernel.org> <srinivas.kandagatla@linaro.org>
|
||||||
Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org>
|
Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org>
|
||||||
Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org>
|
Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org>
|
||||||
Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> <sriram.yagnaraman@est.tech>
|
Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> <sriram.yagnaraman@est.tech>
|
||||||
|
|
|
||||||
|
|
@ -17368,7 +17368,7 @@ T: git git://git.infradead.org/nvme.git
|
||||||
F: drivers/nvme/target/
|
F: drivers/nvme/target/
|
||||||
|
|
||||||
NVMEM FRAMEWORK
|
NVMEM FRAMEWORK
|
||||||
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
M: Srinivas Kandagatla <srini@kernel.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git
|
||||||
F: Documentation/ABI/stable/sysfs-bus-nvmem
|
F: Documentation/ABI/stable/sysfs-bus-nvmem
|
||||||
|
|
@ -19573,7 +19573,7 @@ S: Supported
|
||||||
F: drivers/crypto/intel/qat/
|
F: drivers/crypto/intel/qat/
|
||||||
|
|
||||||
QCOM AUDIO (ASoC) DRIVERS
|
QCOM AUDIO (ASoC) DRIVERS
|
||||||
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
M: Srinivas Kandagatla <srini@kernel.org>
|
||||||
L: linux-sound@vger.kernel.org
|
L: linux-sound@vger.kernel.org
|
||||||
L: linux-arm-msm@vger.kernel.org
|
L: linux-arm-msm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
@ -19873,7 +19873,7 @@ F: Documentation/devicetree/bindings/net/qcom,ethqos.yaml
|
||||||
F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
|
F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
|
||||||
|
|
||||||
QUALCOMM FASTRPC DRIVER
|
QUALCOMM FASTRPC DRIVER
|
||||||
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
M: Srinivas Kandagatla <srini@kernel.org>
|
||||||
M: Amol Maheshwari <amahesh@qti.qualcomm.com>
|
M: Amol Maheshwari <amahesh@qti.qualcomm.com>
|
||||||
L: linux-arm-msm@vger.kernel.org
|
L: linux-arm-msm@vger.kernel.org
|
||||||
L: dri-devel@lists.freedesktop.org
|
L: dri-devel@lists.freedesktop.org
|
||||||
|
|
@ -21921,7 +21921,7 @@ S: Maintained
|
||||||
F: drivers/media/rc/serial_ir.c
|
F: drivers/media/rc/serial_ir.c
|
||||||
|
|
||||||
SERIAL LOW-POWER INTER-CHIP MEDIA BUS (SLIMbus)
|
SERIAL LOW-POWER INTER-CHIP MEDIA BUS (SLIMbus)
|
||||||
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
M: Srinivas Kandagatla <srini@kernel.org>
|
||||||
L: linux-sound@vger.kernel.org
|
L: linux-sound@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/devicetree/bindings/slimbus/
|
F: Documentation/devicetree/bindings/slimbus/
|
||||||
|
|
|
||||||
|
|
@ -461,36 +461,6 @@ unsigned int cs_dsp_mock_xm_header_get_alg_base_in_words(struct cs_dsp_test *pri
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_xm_header_get_alg_base_in_words, "FW_CS_DSP_KUNIT_TEST_UTILS");
|
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_xm_header_get_alg_base_in_words, "FW_CS_DSP_KUNIT_TEST_UTILS");
|
||||||
|
|
||||||
/**
|
|
||||||
* cs_dsp_mock_xm_header_get_fw_version_from_regmap() - Firmware version.
|
|
||||||
*
|
|
||||||
* @priv: Pointer to struct cs_dsp_test.
|
|
||||||
*
|
|
||||||
* Return: Firmware version word value.
|
|
||||||
*/
|
|
||||||
unsigned int cs_dsp_mock_xm_header_get_fw_version_from_regmap(struct cs_dsp_test *priv)
|
|
||||||
{
|
|
||||||
unsigned int xm = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_XM);
|
|
||||||
union {
|
|
||||||
struct wmfw_id_hdr adsp2;
|
|
||||||
struct wmfw_v3_id_hdr halo;
|
|
||||||
} hdr;
|
|
||||||
|
|
||||||
switch (priv->dsp->type) {
|
|
||||||
case WMFW_ADSP2:
|
|
||||||
regmap_raw_read(priv->dsp->regmap, xm, &hdr.adsp2, sizeof(hdr.adsp2));
|
|
||||||
return be32_to_cpu(hdr.adsp2.ver);
|
|
||||||
case WMFW_HALO:
|
|
||||||
regmap_raw_read(priv->dsp->regmap, xm, &hdr.halo, sizeof(hdr.halo));
|
|
||||||
return be32_to_cpu(hdr.halo.ver);
|
|
||||||
default:
|
|
||||||
KUNIT_FAIL(priv->test, NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_xm_header_get_fw_version_from_regmap,
|
|
||||||
"FW_CS_DSP_KUNIT_TEST_UTILS");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cs_dsp_mock_xm_header_get_fw_version() - Firmware version.
|
* cs_dsp_mock_xm_header_get_fw_version() - Firmware version.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -2198,7 +2198,7 @@ static int cs_dsp_bin_test_common_init(struct kunit *test, struct cs_dsp *dsp)
|
||||||
|
|
||||||
priv->local->bin_builder =
|
priv->local->bin_builder =
|
||||||
cs_dsp_mock_bin_init(priv, 1,
|
cs_dsp_mock_bin_init(priv, 1,
|
||||||
cs_dsp_mock_xm_header_get_fw_version_from_regmap(priv));
|
cs_dsp_mock_xm_header_get_fw_version(xm_hdr));
|
||||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->local->bin_builder);
|
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->local->bin_builder);
|
||||||
|
|
||||||
/* We must provide a dummy wmfw to load */
|
/* We must provide a dummy wmfw to load */
|
||||||
|
|
|
||||||
|
|
@ -451,7 +451,7 @@ static int cs_dsp_bin_err_test_common_init(struct kunit *test, struct cs_dsp *ds
|
||||||
|
|
||||||
local->bin_builder =
|
local->bin_builder =
|
||||||
cs_dsp_mock_bin_init(priv, 1,
|
cs_dsp_mock_bin_init(priv, 1,
|
||||||
cs_dsp_mock_xm_header_get_fw_version_from_regmap(priv));
|
cs_dsp_mock_xm_header_get_fw_version(local->xm_header));
|
||||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, local->bin_builder);
|
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, local->bin_builder);
|
||||||
|
|
||||||
/* Init cs_dsp */
|
/* Init cs_dsp */
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,6 @@ unsigned int cs_dsp_mock_num_dsp_words_to_num_packed_regs(unsigned int num_dsp_w
|
||||||
unsigned int cs_dsp_mock_xm_header_get_alg_base_in_words(struct cs_dsp_test *priv,
|
unsigned int cs_dsp_mock_xm_header_get_alg_base_in_words(struct cs_dsp_test *priv,
|
||||||
unsigned int alg_id,
|
unsigned int alg_id,
|
||||||
int mem_type);
|
int mem_type);
|
||||||
unsigned int cs_dsp_mock_xm_header_get_fw_version_from_regmap(struct cs_dsp_test *priv);
|
|
||||||
unsigned int cs_dsp_mock_xm_header_get_fw_version(struct cs_dsp_mock_xm_header *header);
|
unsigned int cs_dsp_mock_xm_header_get_fw_version(struct cs_dsp_mock_xm_header *header);
|
||||||
void cs_dsp_mock_xm_header_drop_from_regmap_cache(struct cs_dsp_test *priv);
|
void cs_dsp_mock_xm_header_drop_from_regmap_cache(struct cs_dsp_test *priv);
|
||||||
int cs_dsp_mock_xm_header_write_to_regmap(struct cs_dsp_mock_xm_header *header);
|
int cs_dsp_mock_xm_header_write_to_regmap(struct cs_dsp_mock_xm_header *header);
|
||||||
|
|
|
||||||
|
|
@ -1295,9 +1295,19 @@ static int aw88081_i2c_probe(struct i2c_client *i2c)
|
||||||
aw88081_dai, ARRAY_SIZE(aw88081_dai));
|
aw88081_dai, ARRAY_SIZE(aw88081_dai));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_OF)
|
||||||
|
static const struct of_device_id aw88081_of_match[] = {
|
||||||
|
{ .compatible = "awinic,aw88081" },
|
||||||
|
{ .compatible = "awinic,aw88083" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, aw88081_of_match);
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct i2c_driver aw88081_i2c_driver = {
|
static struct i2c_driver aw88081_i2c_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = AW88081_I2C_NAME,
|
.name = AW88081_I2C_NAME,
|
||||||
|
.of_match_table = of_match_ptr(aw88081_of_match),
|
||||||
},
|
},
|
||||||
.probe = aw88081_i2c_probe,
|
.probe = aw88081_i2c_probe,
|
||||||
.id_table = aw88081_i2c_id,
|
.id_table = aw88081_i2c_id,
|
||||||
|
|
|
||||||
|
|
@ -702,6 +702,9 @@ static void cs42l43_clear_jack(struct cs42l43_codec *priv)
|
||||||
CS42L43_PGA_WIDESWING_MODE_EN_MASK, 0);
|
CS42L43_PGA_WIDESWING_MODE_EN_MASK, 0);
|
||||||
regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CTRL,
|
regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CTRL,
|
||||||
CS42L43_JACK_STEREO_CONFIG_MASK, 0);
|
CS42L43_JACK_STEREO_CONFIG_MASK, 0);
|
||||||
|
regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
|
||||||
|
CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
|
||||||
|
CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK);
|
||||||
regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
|
regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
|
||||||
CS42L43_HSDET_MODE_MASK | CS42L43_HSDET_MANUAL_MODE_MASK,
|
CS42L43_HSDET_MODE_MASK | CS42L43_HSDET_MANUAL_MODE_MASK,
|
||||||
0x2 << CS42L43_HSDET_MODE_SHIFT);
|
0x2 << CS42L43_HSDET_MODE_SHIFT);
|
||||||
|
|
|
||||||
|
|
@ -842,12 +842,28 @@ static void print_eld_info(struct snd_info_entry *entry,
|
||||||
static int hdmi_dai_proc_new(struct hdmi_codec_priv *hcp,
|
static int hdmi_dai_proc_new(struct hdmi_codec_priv *hcp,
|
||||||
struct snd_soc_dai *dai)
|
struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
|
struct snd_soc_component *component = dai->component;
|
||||||
|
struct snd_soc_card *card = component->card;
|
||||||
|
struct snd_soc_dai *d;
|
||||||
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_info_entry *entry;
|
struct snd_info_entry *entry;
|
||||||
char name[32];
|
char name[32];
|
||||||
int err;
|
int err, i, id = 0;
|
||||||
|
|
||||||
snprintf(name, sizeof(name), "eld#%d", dai->id);
|
/*
|
||||||
err = snd_card_proc_new(dai->component->card->snd_card, name, &entry);
|
* To avoid duplicate proc entry, find its rtd and use rtd->id
|
||||||
|
* instead of dai->id
|
||||||
|
*/
|
||||||
|
for_each_card_rtds(card, rtd) {
|
||||||
|
for_each_rtd_dais(rtd, i, d)
|
||||||
|
if (d == dai) {
|
||||||
|
id = rtd->id;
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
found:
|
||||||
|
snprintf(name, sizeof(name), "eld#%d", id);
|
||||||
|
err = snd_card_proc_new(card->snd_card, name, &entry);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,10 @@
|
||||||
#define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE 0
|
#define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE 0
|
||||||
#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK GENMASK(3, 0)
|
#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK GENMASK(3, 0)
|
||||||
#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K 0
|
#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K 0
|
||||||
|
#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_16K 1
|
||||||
|
#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_24K 2
|
||||||
|
#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_32K 3
|
||||||
|
#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_48K 4
|
||||||
#define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (0x0248)
|
#define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (0x0248)
|
||||||
#define CDC_WSA_TX1_SPKR_PROT_PATH_CTL (0x0264)
|
#define CDC_WSA_TX1_SPKR_PROT_PATH_CTL (0x0264)
|
||||||
#define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268)
|
#define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268)
|
||||||
|
|
@ -407,6 +411,7 @@ struct wsa_macro {
|
||||||
int ear_spkr_gain;
|
int ear_spkr_gain;
|
||||||
int spkr_gain_offset;
|
int spkr_gain_offset;
|
||||||
int spkr_mode;
|
int spkr_mode;
|
||||||
|
u32 pcm_rate_vi;
|
||||||
int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX];
|
int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX];
|
||||||
int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX];
|
int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX];
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
|
|
@ -1280,6 +1285,7 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_soc_dai *dai)
|
struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct snd_soc_component *component = dai->component;
|
struct snd_soc_component *component = dai->component;
|
||||||
|
struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
switch (substream->stream) {
|
switch (substream->stream) {
|
||||||
|
|
@ -1291,6 +1297,11 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream,
|
||||||
__func__, params_rate(params));
|
__func__, params_rate(params));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case SNDRV_PCM_STREAM_CAPTURE:
|
||||||
|
if (dai->id == WSA_MACRO_AIF_VI)
|
||||||
|
wsa->pcm_rate_vi = params_rate(params);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
@ -1448,6 +1459,67 @@ static void wsa_macro_mclk_enable(struct wsa_macro *wsa, bool mclk_enable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void wsa_macro_enable_disable_vi_sense(struct snd_soc_component *component, bool enable,
|
||||||
|
u32 tx_reg0, u32 tx_reg1, u32 val)
|
||||||
|
{
|
||||||
|
if (enable) {
|
||||||
|
/* Enable V&I sensing */
|
||||||
|
snd_soc_component_update_bits(component, tx_reg0,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg1,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg0,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
|
||||||
|
val);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg1,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
|
||||||
|
val);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg0,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg1,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg0,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_NO_RESET);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg1,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_NO_RESET);
|
||||||
|
} else {
|
||||||
|
snd_soc_component_update_bits(component, tx_reg0,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg1,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg0,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
|
||||||
|
snd_soc_component_update_bits(component, tx_reg1,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||||
|
CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wsa_macro_enable_disable_vi_feedback(struct snd_soc_component *component,
|
||||||
|
bool enable, u32 rate)
|
||||||
|
{
|
||||||
|
struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
|
||||||
|
|
||||||
|
if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI]))
|
||||||
|
wsa_macro_enable_disable_vi_sense(component, enable,
|
||||||
|
CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
||||||
|
CDC_WSA_TX1_SPKR_PROT_PATH_CTL, rate);
|
||||||
|
|
||||||
|
if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI]))
|
||||||
|
wsa_macro_enable_disable_vi_sense(component, enable,
|
||||||
|
CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
||||||
|
CDC_WSA_TX3_SPKR_PROT_PATH_CTL, rate);
|
||||||
|
}
|
||||||
|
|
||||||
static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w,
|
static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w,
|
||||||
struct snd_kcontrol *kcontrol, int event)
|
struct snd_kcontrol *kcontrol, int event)
|
||||||
{
|
{
|
||||||
|
|
@ -1464,58 +1536,37 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
|
||||||
{
|
{
|
||||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||||
struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
|
struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
|
||||||
u32 tx_reg0, tx_reg1;
|
u32 rate_val;
|
||||||
|
|
||||||
if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
|
switch (wsa->pcm_rate_vi) {
|
||||||
tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL;
|
case 8000:
|
||||||
tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL;
|
rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K;
|
||||||
} else if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
|
break;
|
||||||
tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL;
|
case 16000:
|
||||||
tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL;
|
rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_16K;
|
||||||
|
break;
|
||||||
|
case 24000:
|
||||||
|
rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_24K;
|
||||||
|
break;
|
||||||
|
case 32000:
|
||||||
|
rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_32K;
|
||||||
|
break;
|
||||||
|
case 48000:
|
||||||
|
rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_48K;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_POST_PMU:
|
case SND_SOC_DAPM_POST_PMU:
|
||||||
/* Enable V&I sensing */
|
/* Enable V&I sensing */
|
||||||
snd_soc_component_update_bits(component, tx_reg0,
|
wsa_macro_enable_disable_vi_feedback(component, true, rate_val);
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg1,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg0,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg1,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg0,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg1,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg0,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_NO_RESET);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg1,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_NO_RESET);
|
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAPM_POST_PMD:
|
case SND_SOC_DAPM_POST_PMD:
|
||||||
/* Disable V&I sensing */
|
/* Disable V&I sensing */
|
||||||
snd_soc_component_update_bits(component, tx_reg0,
|
wsa_macro_enable_disable_vi_feedback(component, false, rate_val);
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg1,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg0,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
|
|
||||||
snd_soc_component_update_bits(component, tx_reg1,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
|
||||||
CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -199,12 +199,10 @@ static void i2s_start(struct dw_i2s_dev *dev,
|
||||||
else
|
else
|
||||||
i2s_write_reg(dev->i2s_base, IRER, 1);
|
i2s_write_reg(dev->i2s_base, IRER, 1);
|
||||||
|
|
||||||
/* I2S needs to enable IRQ to make a handshake with DMAC on the JH7110 SoC */
|
if (!(dev->use_pio || dev->is_jh7110))
|
||||||
if (dev->use_pio || dev->is_jh7110)
|
|
||||||
i2s_enable_irqs(dev, substream->stream, config->chan_nr);
|
|
||||||
else
|
|
||||||
i2s_enable_dma(dev, substream->stream);
|
i2s_enable_dma(dev, substream->stream);
|
||||||
|
|
||||||
|
i2s_enable_irqs(dev, substream->stream, config->chan_nr);
|
||||||
i2s_write_reg(dev->i2s_base, CER, 1);
|
i2s_write_reg(dev->i2s_base, CER, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -218,11 +216,12 @@ static void i2s_stop(struct dw_i2s_dev *dev,
|
||||||
else
|
else
|
||||||
i2s_write_reg(dev->i2s_base, IRER, 0);
|
i2s_write_reg(dev->i2s_base, IRER, 0);
|
||||||
|
|
||||||
if (dev->use_pio || dev->is_jh7110)
|
if (!(dev->use_pio || dev->is_jh7110))
|
||||||
i2s_disable_irqs(dev, substream->stream, 8);
|
|
||||||
else
|
|
||||||
i2s_disable_dma(dev, substream->stream);
|
i2s_disable_dma(dev, substream->stream);
|
||||||
|
|
||||||
|
i2s_disable_irqs(dev, substream->stream, 8);
|
||||||
|
|
||||||
|
|
||||||
if (!dev->active) {
|
if (!dev->active) {
|
||||||
i2s_write_reg(dev->i2s_base, CER, 0);
|
i2s_write_reg(dev->i2s_base, CER, 0);
|
||||||
i2s_write_reg(dev->i2s_base, IER, 0);
|
i2s_write_reg(dev->i2s_base, IER, 0);
|
||||||
|
|
|
||||||
|
|
@ -156,11 +156,24 @@ static int fsl_asrc_dma_hw_params(struct snd_soc_component *component,
|
||||||
for_each_dpcm_be(rtd, stream, dpcm) {
|
for_each_dpcm_be(rtd, stream, dpcm) {
|
||||||
struct snd_soc_pcm_runtime *be = dpcm->be;
|
struct snd_soc_pcm_runtime *be = dpcm->be;
|
||||||
struct snd_pcm_substream *substream_be;
|
struct snd_pcm_substream *substream_be;
|
||||||
struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(be, 0);
|
struct snd_soc_dai *dai_cpu = snd_soc_rtd_to_cpu(be, 0);
|
||||||
|
struct snd_soc_dai *dai_codec = snd_soc_rtd_to_codec(be, 0);
|
||||||
|
struct snd_soc_dai *dai;
|
||||||
|
|
||||||
if (dpcm->fe != rtd)
|
if (dpcm->fe != rtd)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* With audio graph card, original cpu dai is changed to codec
|
||||||
|
* device in backend, so if cpu dai is dummy device in backend,
|
||||||
|
* get the codec dai device, which is the real hardware device
|
||||||
|
* connected.
|
||||||
|
*/
|
||||||
|
if (!snd_soc_dai_is_dummy(dai_cpu))
|
||||||
|
dai = dai_cpu;
|
||||||
|
else
|
||||||
|
dai = dai_codec;
|
||||||
|
|
||||||
substream_be = snd_soc_dpcm_get_substream(be, stream);
|
substream_be = snd_soc_dpcm_get_substream(be, stream);
|
||||||
dma_params_be = snd_soc_dai_get_dma_data(dai, substream_be);
|
dma_params_be = snd_soc_dai_get_dma_data(dai, substream_be);
|
||||||
dev_be = dai->dev;
|
dev_be = dai->dev;
|
||||||
|
|
|
||||||
|
|
@ -250,6 +250,9 @@ static int qmc_audio_pcm_trigger(struct snd_soc_component *component,
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
bitmap_zero(prtd->chans_pending, 64);
|
bitmap_zero(prtd->chans_pending, 64);
|
||||||
|
prtd->buffer_ended = 0;
|
||||||
|
prtd->ch_dma_addr_current = prtd->ch_dma_addr_start;
|
||||||
|
|
||||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||||
for (i = 0; i < prtd->channels; i++)
|
for (i = 0; i < prtd->channels; i++)
|
||||||
prtd->qmc_dai->chans[i].prtd_tx = prtd;
|
prtd->qmc_dai->chans[i].prtd_tx = prtd;
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,78 @@ avs_path_find_variant(struct avs_dev *adev,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct acpi_nhlt_config *
|
||||||
|
avs_nhlt_config_or_default(struct avs_dev *adev, struct avs_tplg_module *t);
|
||||||
|
|
||||||
|
int avs_path_set_constraint(struct avs_dev *adev, struct avs_tplg_path_template *template,
|
||||||
|
struct snd_pcm_hw_constraint_list *rate_list,
|
||||||
|
struct snd_pcm_hw_constraint_list *channels_list,
|
||||||
|
struct snd_pcm_hw_constraint_list *sample_bits_list)
|
||||||
|
{
|
||||||
|
struct avs_tplg_path *path_template;
|
||||||
|
unsigned int *rlist, *clist, *slist;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
list_for_each_entry(path_template, &template->path_list, node)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
rlist = kcalloc(i, sizeof(rlist), GFP_KERNEL);
|
||||||
|
clist = kcalloc(i, sizeof(clist), GFP_KERNEL);
|
||||||
|
slist = kcalloc(i, sizeof(slist), GFP_KERNEL);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
list_for_each_entry(path_template, &template->path_list, node) {
|
||||||
|
struct avs_tplg_pipeline *pipeline_template;
|
||||||
|
|
||||||
|
list_for_each_entry(pipeline_template, &path_template->ppl_list, node) {
|
||||||
|
struct avs_tplg_module *module_template;
|
||||||
|
|
||||||
|
list_for_each_entry(module_template, &pipeline_template->mod_list, node) {
|
||||||
|
const guid_t *type = &module_template->cfg_ext->type;
|
||||||
|
struct acpi_nhlt_config *blob;
|
||||||
|
|
||||||
|
if (!guid_equal(type, &AVS_COPIER_MOD_UUID) &&
|
||||||
|
!guid_equal(type, &AVS_WOVHOSTM_MOD_UUID))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (module_template->cfg_ext->copier.dma_type) {
|
||||||
|
case AVS_DMA_DMIC_LINK_INPUT:
|
||||||
|
case AVS_DMA_I2S_LINK_OUTPUT:
|
||||||
|
case AVS_DMA_I2S_LINK_INPUT:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
blob = avs_nhlt_config_or_default(adev, module_template);
|
||||||
|
if (IS_ERR(blob))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
rlist[i] = path_template->fe_fmt->sampling_freq;
|
||||||
|
clist[i] = path_template->fe_fmt->num_channels;
|
||||||
|
slist[i] = path_template->fe_fmt->bit_depth;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i) {
|
||||||
|
rate_list->count = i;
|
||||||
|
rate_list->list = rlist;
|
||||||
|
channels_list->count = i;
|
||||||
|
channels_list->list = clist;
|
||||||
|
sample_bits_list->count = i;
|
||||||
|
sample_bits_list->list = slist;
|
||||||
|
} else {
|
||||||
|
kfree(rlist);
|
||||||
|
kfree(clist);
|
||||||
|
kfree(slist);
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
static void avs_init_node_id(union avs_connector_node_id *node_id,
|
static void avs_init_node_id(union avs_connector_node_id *node_id,
|
||||||
struct avs_tplg_modcfg_ext *te, u32 dma_id)
|
struct avs_tplg_modcfg_ext *te, u32 dma_id)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,11 @@ int avs_path_reset(struct avs_path *path);
|
||||||
int avs_path_pause(struct avs_path *path);
|
int avs_path_pause(struct avs_path *path);
|
||||||
int avs_path_run(struct avs_path *path, int trigger);
|
int avs_path_run(struct avs_path *path, int trigger);
|
||||||
|
|
||||||
|
int avs_path_set_constraint(struct avs_dev *adev, struct avs_tplg_path_template *template,
|
||||||
|
struct snd_pcm_hw_constraint_list *rate_list,
|
||||||
|
struct snd_pcm_hw_constraint_list *channels_list,
|
||||||
|
struct snd_pcm_hw_constraint_list *sample_bits_list);
|
||||||
|
|
||||||
int avs_peakvol_set_volume(struct avs_dev *adev, struct avs_path_module *mod,
|
int avs_peakvol_set_volume(struct avs_dev *adev, struct avs_path_module *mod,
|
||||||
struct soc_mixer_control *mc, long *input);
|
struct soc_mixer_control *mc, long *input);
|
||||||
int avs_peakvol_set_mute(struct avs_dev *adev, struct avs_path_module *mod,
|
int avs_peakvol_set_mute(struct avs_dev *adev, struct avs_path_module *mod,
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,10 @@ struct avs_dma_data {
|
||||||
struct hdac_ext_stream *host_stream;
|
struct hdac_ext_stream *host_stream;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct snd_pcm_hw_constraint_list rate_list;
|
||||||
|
struct snd_pcm_hw_constraint_list channels_list;
|
||||||
|
struct snd_pcm_hw_constraint_list sample_bits_list;
|
||||||
|
|
||||||
struct work_struct period_elapsed_work;
|
struct work_struct period_elapsed_work;
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
};
|
};
|
||||||
|
|
@ -74,6 +78,45 @@ void avs_period_elapsed(struct snd_pcm_substream *substream)
|
||||||
schedule_work(&data->period_elapsed_work);
|
schedule_work(&data->period_elapsed_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hw_rule_param_size(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule);
|
||||||
|
static int avs_hw_constraints_init(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
|
||||||
|
{
|
||||||
|
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||||
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||||
|
struct snd_pcm_hw_constraint_list *r, *c, *s;
|
||||||
|
struct avs_tplg_path_template *template;
|
||||||
|
struct avs_dma_data *data;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
data = snd_soc_dai_get_dma_data(dai, substream);
|
||||||
|
r = &(data->rate_list);
|
||||||
|
c = &(data->channels_list);
|
||||||
|
s = &(data->sample_bits_list);
|
||||||
|
|
||||||
|
template = avs_dai_find_path_template(dai, !rtd->dai_link->no_pcm, substream->stream);
|
||||||
|
ret = avs_path_set_constraint(data->adev, template, r, c, s);
|
||||||
|
if (ret <= 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, r);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, c);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_SAMPLE_BITS, s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int avs_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
|
static int avs_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||||
|
|
@ -101,7 +144,7 @@ static int avs_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_d
|
||||||
if (rtd->dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
adev->num_lp_paths++;
|
adev->num_lp_paths++;
|
||||||
|
|
||||||
return 0;
|
return avs_hw_constraints_init(substream, dai);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avs_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
|
static void avs_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
|
||||||
|
|
@ -114,6 +157,10 @@ static void avs_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc
|
||||||
if (rtd->dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
data->adev->num_lp_paths--;
|
data->adev->num_lp_paths--;
|
||||||
|
|
||||||
|
kfree(data->rate_list.list);
|
||||||
|
kfree(data->channels_list.list);
|
||||||
|
kfree(data->sample_bits_list.list);
|
||||||
|
|
||||||
snd_soc_dai_set_dma_data(dai, substream, NULL);
|
snd_soc_dai_set_dma_data(dai, substream, NULL);
|
||||||
kfree(data);
|
kfree(data);
|
||||||
}
|
}
|
||||||
|
|
@ -927,7 +974,8 @@ static int avs_component_probe(struct snd_soc_component *component)
|
||||||
else
|
else
|
||||||
mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
|
mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
|
||||||
"hda-generic-tplg.bin");
|
"hda-generic-tplg.bin");
|
||||||
|
if (!mach->tplg_filename)
|
||||||
|
return -ENOMEM;
|
||||||
filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix,
|
filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix,
|
||||||
mach->tplg_filename);
|
mach->tplg_filename);
|
||||||
if (!filename)
|
if (!filename)
|
||||||
|
|
|
||||||
|
|
@ -764,6 +764,7 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {
|
||||||
|
|
||||||
static const struct snd_pci_quirk sof_sdw_ssid_quirk_table[] = {
|
static const struct snd_pci_quirk sof_sdw_ssid_quirk_table[] = {
|
||||||
SND_PCI_QUIRK(0x1043, 0x1e13, "ASUS Zenbook S14", SOC_SDW_CODEC_MIC),
|
SND_PCI_QUIRK(0x1043, 0x1e13, "ASUS Zenbook S14", SOC_SDW_CODEC_MIC),
|
||||||
|
SND_PCI_QUIRK(0x1043, 0x1f43, "ASUS Zenbook S16", SOC_SDW_CODEC_MIC),
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,11 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
#include <dt-bindings/sound/qcom,lpass.h>
|
#include <dt-bindings/sound/qcom,lpass.h>
|
||||||
|
#include <dt-bindings/sound/qcom,q6afe.h>
|
||||||
#include "lpass-hdmi.h"
|
#include "lpass-hdmi.h"
|
||||||
|
|
||||||
#define LPASS_AHBIX_CLOCK_FREQUENCY 131072000
|
#define LPASS_AHBIX_CLOCK_FREQUENCY 131072000
|
||||||
#define LPASS_MAX_PORTS (LPASS_CDC_DMA_VA_TX8 + 1)
|
#define LPASS_MAX_PORTS (DISPLAY_PORT_RX_7 + 1)
|
||||||
#define LPASS_MAX_MI2S_PORTS (8)
|
#define LPASS_MAX_MI2S_PORTS (8)
|
||||||
#define LPASS_MAX_DMA_CHANNELS (8)
|
#define LPASS_MAX_DMA_CHANNELS (8)
|
||||||
#define LPASS_MAX_HDMI_DMA_CHANNELS (4)
|
#define LPASS_MAX_HDMI_DMA_CHANNELS (4)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue