mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
sound fixes for 6.15-rc3
A collection of small fixes since the previous PR. All are device-specific like quirks, new IDs, and other safe (or rather boring) changes. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmgA4nQOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9NLBAAwZZ+0VdCFG0MwIjCIKnHemmtZ23q7yD9f7Qp xFH/AoOk3N/BNtyjD23NtC1RM1utA7wcCUfPu45tAXsg0NJDgb6q/yWDhATImTLt exRZORJpatvveu19WPGOV2u/P+PLEQxW7EsYx8niK7Nxh+f8GiSNboMIVdCgKk1X yycuZqLAmpSlNSk2VD2qaZu5KBcdAfsvhr1qeidF3LOFSQL6j9r8R2xbB6FW4eDX ol1QRWq303wNaPQ6/YvyvSceqGIwX8yOtwT0QHzRIyFus1qPH4wsSsovOYml3Jci VOt0c+XBuJm02d0KSZvaaNU8G52/8HJWl9J+uirPLy9GIupXj9tue43gL0rD1CXQ XkEWenRK5MgO6WWRqnUWdWqkFcIupXWQDl7qXEgwlhVme7J+t4PspTaUImflnLAn LoCLBCmsCV56LGTk0LZ8TUqM90lAvhmo1vE2EIwCI6Ut/AcmSOQrd3j9BhjaHjBp 801ROeGNKZYmWs23Rs5SFER4xx4lLXah0fNPMpWaw5MkTT9oPaPj+46OmaxK6T0a 7yWMg8kgPuKajtTgXMCI3EkfNK8k/fxQfEgxiGTal/T9A5nEuVa9dJK7AmwHHuk9 QfKQHDwG/+1/5ZhC8NIgkMAxoRHUE9sq0vNgyRizHqJzhpEfJBbFZmSuhdRDvbkv 9isx+Ic= =MjEv -----END PGP SIGNATURE----- Merge tag 'sound-6.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of small fixes. All are device-specific like quirks, new IDs, and other safe (or rather boring) changes" * tag 'sound-6.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: firmware: cs_dsp: test_bin_error: Fix uninitialized data used as fw version ASoC: codecs: Add of_match_table for aw888081 driver ASoC: fsl: fsl_qmc_audio: Reset audio data pointers on TRIGGER_START event mailmap: Add entry for Srinivas Kandagatla MAINTAINERS: use kernel.org alias ASoC: cs42l43: Reset clamp override on jack removal ALSA: hda/realtek - Fixed ASUS platform headset Mic issue ALSA: hda/cirrus_scodec_test: Don't select dependencies ALSA: azt2320: Replace deprecated strcpy() with strscpy() ASoC: hdmi-codec: use RTD ID instead of DAI ID for ELD entry ASoC: Intel: avs: Constrain path based on BE capabilities ALSA: hda/tas2781: Remove unnecessary NULL check before release_firmware() ASoC: Intel: avs: Fix null-ptr-deref in avs_component_probe() ASoC: fsl_asrc_dma: get codec or cpu dai from backend ASoC: qcom: Fix sc7280 lpass potential buffer overflow ASoC: dwc: always enable/disable i2s irqs ASoC: Intel: sof_sdw: Add quirk for Asus Zenbook S16 ASoC: codecs:lpass-wsa-macro: Fix logic of enabling vi channels ASoC: codecs:lpass-wsa-macro: Fix vi feedback rate
This commit is contained in:
commit
8176e776cb
2
.mailmap
2
.mailmap
@ -688,6 +688,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>
|
||||||
|
@ -17374,7 +17374,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
|
||||||
@ -19579,7 +19579,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
|
||||||
@ -19879,7 +19879,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
|
||||||
@ -21927,7 +21927,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);
|
||||||
|
@ -189,8 +189,8 @@ static int snd_card_azt2320_probe(int dev,
|
|||||||
if (error < 0)
|
if (error < 0)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
strcpy(card->driver, "AZT2320");
|
strscpy(card->driver, "AZT2320");
|
||||||
strcpy(card->shortname, "Aztech AZT2320");
|
strscpy(card->shortname, "Aztech AZT2320");
|
||||||
sprintf(card->longname, "%s, WSS at 0x%lx, irq %i, dma %i&%i",
|
sprintf(card->longname, "%s, WSS at 0x%lx, irq %i, dma %i&%i",
|
||||||
card->shortname, chip->port, irq[dev], dma1[dev], dma2[dev]);
|
card->shortname, chip->port, irq[dev], dma1[dev], dma2[dev]);
|
||||||
|
|
||||||
|
@ -96,9 +96,7 @@ config SND_HDA_CIRRUS_SCODEC
|
|||||||
|
|
||||||
config SND_HDA_CIRRUS_SCODEC_KUNIT_TEST
|
config SND_HDA_CIRRUS_SCODEC_KUNIT_TEST
|
||||||
tristate "KUnit test for Cirrus side-codec library" if !KUNIT_ALL_TESTS
|
tristate "KUnit test for Cirrus side-codec library" if !KUNIT_ALL_TESTS
|
||||||
select SND_HDA_CIRRUS_SCODEC
|
depends on SND_HDA_CIRRUS_SCODEC && GPIOLIB && KUNIT
|
||||||
select GPIOLIB
|
|
||||||
depends on KUNIT
|
|
||||||
default KUNIT_ALL_TESTS
|
default KUNIT_ALL_TESTS
|
||||||
help
|
help
|
||||||
This builds KUnit tests for the cirrus side-codec library.
|
This builds KUnit tests for the cirrus side-codec library.
|
||||||
|
@ -7969,6 +7969,7 @@ enum {
|
|||||||
ALC233_FIXUP_MEDION_MTL_SPK,
|
ALC233_FIXUP_MEDION_MTL_SPK,
|
||||||
ALC294_FIXUP_BASS_SPEAKER_15,
|
ALC294_FIXUP_BASS_SPEAKER_15,
|
||||||
ALC283_FIXUP_DELL_HP_RESUME,
|
ALC283_FIXUP_DELL_HP_RESUME,
|
||||||
|
ALC294_FIXUP_ASUS_CS35L41_SPI_2,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A special fixup for Lenovo C940 and Yoga Duet 7;
|
/* A special fixup for Lenovo C940 and Yoga Duet 7;
|
||||||
@ -10333,6 +10334,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = alc283_fixup_dell_hp_resume,
|
.v.func = alc283_fixup_dell_hp_resume,
|
||||||
},
|
},
|
||||||
|
[ALC294_FIXUP_ASUS_CS35L41_SPI_2] = {
|
||||||
|
.type = HDA_FIXUP_FUNC,
|
||||||
|
.v.func = cs35l41_fixup_spi_two,
|
||||||
|
.chained = true,
|
||||||
|
.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct hda_quirk alc269_fixup_tbl[] = {
|
static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||||
@ -10835,7 +10842,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
|
SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12b4, "ASUS B3405CCA / P3405CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x12b4, "ASUS B3405CCA / P3405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
|
||||||
SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
|
SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||||
@ -10925,14 +10932,14 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x1043, 0x1fb3, "ASUS ROG Flow Z13 GZ302EA", ALC287_FIXUP_CS35L41_I2C_2),
|
SND_PCI_QUIRK(0x1043, 0x1fb3, "ASUS ROG Flow Z13 GZ302EA", ALC287_FIXUP_CS35L41_I2C_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x3011, "ASUS B5605CVA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x3011, "ASUS B5605CVA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
|
SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x3061, "ASUS B3405CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x3061, "ASUS B3405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x3071, "ASUS B5405CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x3071, "ASUS B5405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x30c1, "ASUS B3605CCA / P3605CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x30c1, "ASUS B3605CCA / P3605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x30d1, "ASUS B5405CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x30d1, "ASUS B5405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x30e1, "ASUS B5605CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x30e1, "ASUS B5605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x31d0, "ASUS Zen AIO 27 Z272SD_A272SD", ALC274_FIXUP_ASUS_ZEN_AIO_27),
|
SND_PCI_QUIRK(0x1043, 0x31d0, "ASUS Zen AIO 27 Z272SD_A272SD", ALC274_FIXUP_ASUS_ZEN_AIO_27),
|
||||||
SND_PCI_QUIRK(0x1043, 0x31e1, "ASUS B5605CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x31e1, "ASUS B5605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x31f1, "ASUS B3605CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
SND_PCI_QUIRK(0x1043, 0x31f1, "ASUS B3605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||||
SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||||
SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||||
SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||||
|
@ -1003,7 +1003,6 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (fmw)
|
|
||||||
release_firmware(fmw);
|
release_firmware(fmw);
|
||||||
pm_runtime_mark_last_busy(tas_hda->priv->dev);
|
pm_runtime_mark_last_busy(tas_hda->priv->dev);
|
||||||
pm_runtime_put_autosuspend(tas_hda->priv->dev);
|
pm_runtime_put_autosuspend(tas_hda->priv->dev);
|
||||||
|
@ -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
Block a user