mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09: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> <siwu@hrz.tu-chemnitz.de>
|
||||
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>
|
||||
Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org>
|
||||
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/
|
||||
|
||||
NVMEM FRAMEWORK
|
||||
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
M: Srinivas Kandagatla <srini@kernel.org>
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git
|
||||
F: Documentation/ABI/stable/sysfs-bus-nvmem
|
||||
@ -19579,7 +19579,7 @@ S: Supported
|
||||
F: drivers/crypto/intel/qat/
|
||||
|
||||
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-arm-msm@vger.kernel.org
|
||||
S: Supported
|
||||
@ -19879,7 +19879,7 @@ F: Documentation/devicetree/bindings/net/qcom,ethqos.yaml
|
||||
F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
|
||||
|
||||
QUALCOMM FASTRPC DRIVER
|
||||
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
M: Srinivas Kandagatla <srini@kernel.org>
|
||||
M: Amol Maheshwari <amahesh@qti.qualcomm.com>
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
@ -21927,7 +21927,7 @@ S: Maintained
|
||||
F: drivers/media/rc/serial_ir.c
|
||||
|
||||
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
|
||||
S: Maintained
|
||||
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");
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
@ -2198,7 +2198,7 @@ static int cs_dsp_bin_test_common_init(struct kunit *test, struct cs_dsp *dsp)
|
||||
|
||||
priv->local->bin_builder =
|
||||
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);
|
||||
|
||||
/* 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 =
|
||||
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);
|
||||
|
||||
/* 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 alg_id,
|
||||
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);
|
||||
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);
|
||||
|
@ -189,8 +189,8 @@ static int snd_card_azt2320_probe(int dev,
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
strcpy(card->driver, "AZT2320");
|
||||
strcpy(card->shortname, "Aztech AZT2320");
|
||||
strscpy(card->driver, "AZT2320");
|
||||
strscpy(card->shortname, "Aztech AZT2320");
|
||||
sprintf(card->longname, "%s, WSS at 0x%lx, irq %i, dma %i&%i",
|
||||
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
|
||||
tristate "KUnit test for Cirrus side-codec library" if !KUNIT_ALL_TESTS
|
||||
select SND_HDA_CIRRUS_SCODEC
|
||||
select GPIOLIB
|
||||
depends on KUNIT
|
||||
depends on SND_HDA_CIRRUS_SCODEC && GPIOLIB && KUNIT
|
||||
default KUNIT_ALL_TESTS
|
||||
help
|
||||
This builds KUnit tests for the cirrus side-codec library.
|
||||
|
@ -7969,6 +7969,7 @@ enum {
|
||||
ALC233_FIXUP_MEDION_MTL_SPK,
|
||||
ALC294_FIXUP_BASS_SPEAKER_15,
|
||||
ALC283_FIXUP_DELL_HP_RESUME,
|
||||
ALC294_FIXUP_ASUS_CS35L41_SPI_2,
|
||||
};
|
||||
|
||||
/* 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,
|
||||
.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[] = {
|
||||
@ -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, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
|
||||
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, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
|
||||
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, 0x3011, "ASUS B5605CVA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
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, 0x3071, "ASUS B5405CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x30c1, "ASUS B3605CCA / P3605CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x30d1, "ASUS B5405CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x30e1, "ASUS B5605CCA", 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", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x30c1, "ASUS B3605CCA / P3605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x30d1, "ASUS B5405CCA", ALC294_FIXUP_ASUS_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, 0x31e1, "ASUS B5605CCA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x31f1, "ASUS B3605CCA", 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", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
|
||||
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, 0x3a40, "ASUS G814JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||
|
@ -1003,8 +1003,7 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
|
||||
*/
|
||||
|
||||
out:
|
||||
if (fmw)
|
||||
release_firmware(fmw);
|
||||
release_firmware(fmw);
|
||||
pm_runtime_mark_last_busy(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));
|
||||
}
|
||||
|
||||
#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 = {
|
||||
.driver = {
|
||||
.name = AW88081_I2C_NAME,
|
||||
.of_match_table = of_match_ptr(aw88081_of_match),
|
||||
},
|
||||
.probe = aw88081_i2c_probe,
|
||||
.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);
|
||||
regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CTRL,
|
||||
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,
|
||||
CS42L43_HSDET_MODE_MASK | CS42L43_HSDET_MANUAL_MODE_MASK,
|
||||
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,
|
||||
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;
|
||||
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)
|
||||
return err;
|
||||
|
||||
|
@ -63,6 +63,10 @@
|
||||
#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_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_TX1_SPKR_PROT_PATH_CTL (0x0264)
|
||||
#define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268)
|
||||
@ -407,6 +411,7 @@ struct wsa_macro {
|
||||
int ear_spkr_gain;
|
||||
int spkr_gain_offset;
|
||||
int spkr_mode;
|
||||
u32 pcm_rate_vi;
|
||||
int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX];
|
||||
int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX];
|
||||
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_component *component = dai->component;
|
||||
struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
|
||||
int ret;
|
||||
|
||||
switch (substream->stream) {
|
||||
@ -1291,6 +1297,11 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream,
|
||||
__func__, params_rate(params));
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
case SNDRV_PCM_STREAM_CAPTURE:
|
||||
if (dai->id == WSA_MACRO_AIF_VI)
|
||||
wsa->pcm_rate_vi = params_rate(params);
|
||||
|
||||
break;
|
||||
default:
|
||||
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,
|
||||
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 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])) {
|
||||
tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL;
|
||||
tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL;
|
||||
} else if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
|
||||
tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL;
|
||||
tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL;
|
||||
switch (wsa->pcm_rate_vi) {
|
||||
case 8000:
|
||||
rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K;
|
||||
break;
|
||||
case 16000:
|
||||
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) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
/* 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,
|
||||
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);
|
||||
/* Enable V&I sensing */
|
||||
wsa_macro_enable_disable_vi_feedback(component, true, rate_val);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
/* Disable 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_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);
|
||||
wsa_macro_enable_disable_vi_feedback(component, false, rate_val);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -199,12 +199,10 @@ static void i2s_start(struct dw_i2s_dev *dev,
|
||||
else
|
||||
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)
|
||||
i2s_enable_irqs(dev, substream->stream, config->chan_nr);
|
||||
else
|
||||
if (!(dev->use_pio || dev->is_jh7110))
|
||||
i2s_enable_dma(dev, substream->stream);
|
||||
|
||||
i2s_enable_irqs(dev, substream->stream, config->chan_nr);
|
||||
i2s_write_reg(dev->i2s_base, CER, 1);
|
||||
}
|
||||
|
||||
@ -218,11 +216,12 @@ static void i2s_stop(struct dw_i2s_dev *dev,
|
||||
else
|
||||
i2s_write_reg(dev->i2s_base, IRER, 0);
|
||||
|
||||
if (dev->use_pio || dev->is_jh7110)
|
||||
i2s_disable_irqs(dev, substream->stream, 8);
|
||||
else
|
||||
if (!(dev->use_pio || dev->is_jh7110))
|
||||
i2s_disable_dma(dev, substream->stream);
|
||||
|
||||
i2s_disable_irqs(dev, substream->stream, 8);
|
||||
|
||||
|
||||
if (!dev->active) {
|
||||
i2s_write_reg(dev->i2s_base, CER, 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) {
|
||||
struct snd_soc_pcm_runtime *be = dpcm->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)
|
||||
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);
|
||||
dma_params_be = snd_soc_dai_get_dma_data(dai, substream_be);
|
||||
dev_be = dai->dev;
|
||||
|
@ -250,6 +250,9 @@ static int qmc_audio_pcm_trigger(struct snd_soc_component *component,
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
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) {
|
||||
for (i = 0; i < prtd->channels; i++)
|
||||
prtd->qmc_dai->chans[i].prtd_tx = prtd;
|
||||
|
@ -115,6 +115,78 @@ avs_path_find_variant(struct avs_dev *adev,
|
||||
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,
|
||||
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_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,
|
||||
struct soc_mixer_control *mc, long *input);
|
||||
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 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 snd_pcm_substream *substream;
|
||||
};
|
||||
@ -74,6 +78,45 @@ void avs_period_elapsed(struct snd_pcm_substream *substream)
|
||||
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)
|
||||
{
|
||||
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)
|
||||
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)
|
||||
@ -114,6 +157,10 @@ static void avs_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc
|
||||
if (rtd->dai_link->ignore_suspend)
|
||||
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);
|
||||
kfree(data);
|
||||
}
|
||||
@ -927,7 +974,8 @@ static int avs_component_probe(struct snd_soc_component *component)
|
||||
else
|
||||
mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
|
||||
"hda-generic-tplg.bin");
|
||||
|
||||
if (!mach->tplg_filename)
|
||||
return -ENOMEM;
|
||||
filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix,
|
||||
mach->tplg_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[] = {
|
||||
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/regmap.h>
|
||||
#include <dt-bindings/sound/qcom,lpass.h>
|
||||
#include <dt-bindings/sound/qcom,q6afe.h>
|
||||
#include "lpass-hdmi.h"
|
||||
|
||||
#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_DMA_CHANNELS (8)
|
||||
#define LPASS_MAX_HDMI_DMA_CHANNELS (4)
|
||||
|
Loading…
x
Reference in New Issue
Block a user