mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
sound fixes for 5.18-rc4
At this time, the majority of changes are for pending ASoC fixes while a few usual HD-audio and USB-audio quirks are found. Almost all patches are small device-specific fixes, and nothing worrisome stands out, so far. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmJiTF0OHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+e4g/+N6gH6sux6UqWPtcTQPJMHOyEPPS7mevOkiJG vrBjsVBKu3m2wJ53mjeh1y+AftCNw0d6dRs1BzvSwLh8XNTAeONr4TP1qKiBQvHt R42HMlRkMLyzmqmtL5CHL12qhumaNy0fCP4B3dELTqQ/iS8H9te7fkM/mITejisP 5acQWOhtbefb2WfwgdoJUJQ5xAg0e1Dd4V0e/aJklIGqZ1FFP+rCi3hshjKlM1tt /U041ml/uqgKasj9O0x1/Ij7Gdcc5LN8NbveAsVwL1Sloiels6y14vvy26GBrzHO +jd/c5q6fpPzpOYJo9XfcNqvfkZp/w++UUV0K6y9ZsKvXzjestIRRMSOPy4e15Q7 NSTv49pSRfNf2eIEtCCQi71U2WjQ7F/aoJhpNch72WOGR5n8AgEtLYOW0WKhMlAn t23PI+rOEvv2xVH03NPQTNUVGswJZufgnY+Eh9gM2946xEXlvmujNm7q5pJMoSKZ uaTaxJ+yBeLZvZElkNsZmaqS+GGtZ3RRbSeIilT50KPICKMp3DFFLoxmBhka0PmS uecwDRvAjSk/ombsciMyj7hgH/BdVuL3V8bMTsOcxDprEqdk9gT7v5wMPJrqD+pR OdggO9f+HSfXPblLH8izeSKPYOWB3iBStSXWX3u6+sTYg2xigF5Wso35xPx5I5To 4qqJt/E= =Iwzh -----END PGP SIGNATURE----- Merge tag 'sound-5.18-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "At this time, the majority of changes are for pending ASoC fixes while a few usual HD-audio and USB-audio quirks are found. Almost all patches are small device-specific fixes, and nothing worrisome stands out, so far" * tag 'sound-5.18-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (37 commits) ALSA: hda/realtek: Add quirk for Clevo NP70PNP ALSA: hda: intel-dsp-config: Add RaptorLake PCI IDs ALSA: hda/realtek: Enable mute/micmute LEDs and limit mic boost on EliteBook 845/865 G9 ALSA: usb-audio: Clear MIDI port active flag after draining ALSA: usb-audio: add mapping for MSI MAG X570S Torpedo MAX. ALSA: hda/i915: Fix one too many pci_dev_put() ALSA: hda/hdmi: add HDMI codec VID for Raptorlake-P ALSA: hda/hdmi: fix warning about PCM count when used with SOF sound/oss/dmasound: fix 'dmasound_setup' defined but not used firmware: cs_dsp: Fix overrun of unterminated control name string ASoC: codecs: Fix an error handling path in (rx|tx|va)_macro_probe() ASoC: Intel: sof_es8336: Add a quirk for Huawei Matebook D15 ASoC: Intel: sof_es8336: add a quirk for headset at mic1 port ASoC: Intel: sof_es8336: support a separate gpio to control headphone ASoC: Intel: sof_es8336: simplify speaker gpio naming ASoC: wm8731: Disable the regulator when probing fails ASoC: Intel: soc-acpi: correct device endpoints for max98373 ASoC: codecs: wcd934x: do not switch off SIDO Buck when codec is in use ASoC: SOF: topology: Fix memory leak in sof_control_load() ASoC: SOF: topology: cleanup dailinks on widget unload ...
This commit is contained in:
commit
2d230968ad
@ -955,8 +955,7 @@ static int cs_dsp_create_control(struct cs_dsp *dsp,
|
||||
ctl->alg_region = *alg_region;
|
||||
if (subname && dsp->fw_ver >= 2) {
|
||||
ctl->subname_len = subname_len;
|
||||
ctl->subname = kmemdup(subname,
|
||||
strlen(subname) + 1, GFP_KERNEL);
|
||||
ctl->subname = kasprintf(GFP_KERNEL, "%.*s", subname_len, subname);
|
||||
if (!ctl->subname) {
|
||||
ret = -ENOMEM;
|
||||
goto err_ctl;
|
||||
|
@ -179,6 +179,10 @@ struct snd_soc_component_driver {
|
||||
struct snd_pcm_hw_params *params);
|
||||
bool use_dai_pcm_id; /* use DAI link PCM ID as PCM device number */
|
||||
int be_pcm_base; /* base device ID for all BE PCMs */
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
const char *debugfs_prefix;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct snd_soc_component {
|
||||
|
@ -127,11 +127,10 @@ static int i915_gfx_present(struct pci_dev *hdac_pci)
|
||||
display_dev = pci_get_class(class, display_dev);
|
||||
|
||||
if (display_dev && display_dev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||
connectivity_check(display_dev, hdac_pci))
|
||||
connectivity_check(display_dev, hdac_pci)) {
|
||||
pci_dev_put(display_dev);
|
||||
match = true;
|
||||
|
||||
pci_dev_put(display_dev);
|
||||
|
||||
}
|
||||
} while (!match && display_dev);
|
||||
|
||||
return match;
|
||||
|
@ -424,6 +424,15 @@ static const struct config_entry config_table[] = {
|
||||
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
|
||||
.device = 0x54c8,
|
||||
},
|
||||
/* RaptorLake-P */
|
||||
{
|
||||
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
|
||||
.device = 0x51ca,
|
||||
},
|
||||
{
|
||||
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
|
||||
.device = 0x51cb,
|
||||
},
|
||||
#endif
|
||||
|
||||
};
|
||||
|
@ -1428,7 +1428,7 @@ void dmasound_deinit(void)
|
||||
unregister_sound_dsp(sq_unit);
|
||||
}
|
||||
|
||||
static int dmasound_setup(char *str)
|
||||
static int __maybe_unused dmasound_setup(char *str)
|
||||
{
|
||||
int ints[6], size;
|
||||
|
||||
|
@ -1395,7 +1395,7 @@ static int hdmi_find_pcm_slot(struct hdmi_spec *spec,
|
||||
|
||||
last_try:
|
||||
/* the last try; check the empty slots in pins */
|
||||
for (i = 0; i < spec->num_nids; i++) {
|
||||
for (i = 0; i < spec->pcm_used; i++) {
|
||||
if (!test_bit(i, &spec->pcm_bitmap))
|
||||
return i;
|
||||
}
|
||||
@ -2325,7 +2325,9 @@ static int generic_hdmi_build_pcms(struct hda_codec *codec)
|
||||
* dev_num is the device entry number in a pin
|
||||
*/
|
||||
|
||||
if (codec->mst_no_extra_pcms)
|
||||
if (spec->dyn_pcm_no_legacy && codec->mst_no_extra_pcms)
|
||||
pcm_num = spec->num_cvts;
|
||||
else if (codec->mst_no_extra_pcms)
|
||||
pcm_num = spec->num_nids;
|
||||
else
|
||||
pcm_num = spec->num_nids + spec->dev_num - 1;
|
||||
@ -4551,6 +4553,7 @@ HDA_CODEC_ENTRY(0x80862819, "DG2 HDMI", patch_i915_adlp_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086281a, "Jasperlake HDMI", patch_i915_icl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086281b, "Elkhartlake HDMI", patch_i915_icl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086281c, "Alderlake-P HDMI", patch_i915_adlp_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086281f, "Raptorlake-P HDMI", patch_i915_adlp_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi),
|
||||
|
@ -7006,6 +7006,7 @@ enum {
|
||||
ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
|
||||
ALC287_FIXUP_LEGION_16ACHG6,
|
||||
ALC287_FIXUP_CS35L41_I2C_2,
|
||||
ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
|
||||
ALC245_FIXUP_CS35L41_SPI_2,
|
||||
ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
|
||||
ALC245_FIXUP_CS35L41_SPI_4,
|
||||
@ -8769,6 +8770,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cs35l41_fixup_i2c_two,
|
||||
},
|
||||
[ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cs35l41_fixup_i2c_two,
|
||||
.chained = true,
|
||||
.chain_id = ALC285_FIXUP_HP_MUTE_LED,
|
||||
},
|
||||
[ALC245_FIXUP_CS35L41_SPI_2] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cs35l41_fixup_spi_two,
|
||||
@ -9025,9 +9032,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
|
||||
SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
|
||||
@ -9163,6 +9170,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
|
||||
|
@ -46,35 +46,6 @@
|
||||
*/
|
||||
#undef ENABLE_MIC_INPUT
|
||||
|
||||
static struct clk *mclk;
|
||||
|
||||
static int at91sam9g20ek_set_bias_level(struct snd_soc_card *card,
|
||||
struct snd_soc_dapm_context *dapm,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
static int mclk_on;
|
||||
int ret = 0;
|
||||
|
||||
switch (level) {
|
||||
case SND_SOC_BIAS_ON:
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
if (!mclk_on)
|
||||
ret = clk_enable(mclk);
|
||||
if (ret == 0)
|
||||
mclk_on = 1;
|
||||
break;
|
||||
|
||||
case SND_SOC_BIAS_OFF:
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
if (mclk_on)
|
||||
clk_disable(mclk);
|
||||
mclk_on = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_widget at91sam9g20ek_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_MIC("Int Mic", NULL),
|
||||
SND_SOC_DAPM_SPK("Ext Spk", NULL),
|
||||
@ -135,7 +106,6 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = {
|
||||
.owner = THIS_MODULE,
|
||||
.dai_link = &at91sam9g20ek_dai,
|
||||
.num_links = 1,
|
||||
.set_bias_level = at91sam9g20ek_set_bias_level,
|
||||
|
||||
.dapm_widgets = at91sam9g20ek_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(at91sam9g20ek_dapm_widgets),
|
||||
@ -148,7 +118,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *codec_np, *cpu_np;
|
||||
struct clk *pllb;
|
||||
struct snd_soc_card *card = &snd_soc_at91sam9g20ek;
|
||||
int ret;
|
||||
|
||||
@ -162,31 +131,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Codec MCLK is supplied by PCK0 - set it up.
|
||||
*/
|
||||
mclk = clk_get(NULL, "pck0");
|
||||
if (IS_ERR(mclk)) {
|
||||
dev_err(&pdev->dev, "Failed to get MCLK\n");
|
||||
ret = PTR_ERR(mclk);
|
||||
goto err;
|
||||
}
|
||||
|
||||
pllb = clk_get(NULL, "pllb");
|
||||
if (IS_ERR(pllb)) {
|
||||
dev_err(&pdev->dev, "Failed to get PLLB\n");
|
||||
ret = PTR_ERR(pllb);
|
||||
goto err_mclk;
|
||||
}
|
||||
ret = clk_set_parent(mclk, pllb);
|
||||
clk_put(pllb);
|
||||
if (ret != 0) {
|
||||
dev_err(&pdev->dev, "Failed to set MCLK parent\n");
|
||||
goto err_mclk;
|
||||
}
|
||||
|
||||
clk_set_rate(mclk, MCLK_RATE);
|
||||
|
||||
card->dev = &pdev->dev;
|
||||
|
||||
/* Parse device node info */
|
||||
@ -230,9 +174,6 @@ static int at91sam9g20ek_audio_probe(struct platform_device *pdev)
|
||||
|
||||
return ret;
|
||||
|
||||
err_mclk:
|
||||
clk_put(mclk);
|
||||
mclk = NULL;
|
||||
err:
|
||||
atmel_ssc_put_audio(0);
|
||||
return ret;
|
||||
@ -242,8 +183,6 @@ static int at91sam9g20ek_audio_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
|
||||
clk_disable(mclk);
|
||||
mclk = NULL;
|
||||
snd_soc_unregister_card(card);
|
||||
atmel_ssc_put_audio(0);
|
||||
|
||||
|
@ -822,8 +822,8 @@ int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
|
||||
word_offset = otp_map_match->word_offset;
|
||||
|
||||
for (i = 0; i < otp_map_match->num_elements; i++) {
|
||||
dev_dbg(dev, "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d\n",
|
||||
bit_offset, word_offset, bit_sum % 32);
|
||||
dev_dbg(dev, "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d otp_map[i].size = %d\n",
|
||||
bit_offset, word_offset, bit_sum % 32, otp_map[i].size);
|
||||
if (bit_offset + otp_map[i].size - 1 >= 32) {
|
||||
otp_val = (otp_mem[word_offset] &
|
||||
GENMASK(31, bit_offset)) >> bit_offset;
|
||||
@ -831,12 +831,14 @@ int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
|
||||
GENMASK(bit_offset + otp_map[i].size - 33, 0)) <<
|
||||
(32 - bit_offset);
|
||||
bit_offset += otp_map[i].size - 32;
|
||||
} else {
|
||||
} else if (bit_offset + otp_map[i].size - 1 >= 0) {
|
||||
otp_val = (otp_mem[word_offset] &
|
||||
GENMASK(bit_offset + otp_map[i].size - 1, bit_offset)
|
||||
) >> bit_offset;
|
||||
bit_offset += otp_map[i].size;
|
||||
}
|
||||
} else /* both bit_offset and otp_map[i].size are 0 */
|
||||
otp_val = 0;
|
||||
|
||||
bit_sum += otp_map[i].size;
|
||||
|
||||
if (bit_offset == 32) {
|
||||
|
@ -3566,12 +3566,16 @@ static int rx_macro_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(rx->pds);
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
if (IS_ERR(base)) {
|
||||
ret = PTR_ERR(base);
|
||||
goto err;
|
||||
}
|
||||
|
||||
rx->regmap = devm_regmap_init_mmio(dev, base, &rx_regmap_config);
|
||||
if (IS_ERR(rx->regmap))
|
||||
return PTR_ERR(rx->regmap);
|
||||
if (IS_ERR(rx->regmap)) {
|
||||
ret = PTR_ERR(rx->regmap);
|
||||
goto err;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, rx);
|
||||
|
||||
@ -3632,6 +3636,8 @@ err_mclk:
|
||||
err_dcodec:
|
||||
clk_disable_unprepare(rx->macro);
|
||||
err:
|
||||
lpass_macro_pds_exit(rx->pds);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1828,8 +1828,10 @@ static int tx_macro_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(tx->pds);
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
if (IS_ERR(base)) {
|
||||
ret = PTR_ERR(base);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Update defaults for lpass sc7280 */
|
||||
if (of_device_is_compatible(np, "qcom,sc7280-lpass-tx-macro")) {
|
||||
@ -1846,8 +1848,10 @@ static int tx_macro_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
tx->regmap = devm_regmap_init_mmio(dev, base, &tx_regmap_config);
|
||||
if (IS_ERR(tx->regmap))
|
||||
return PTR_ERR(tx->regmap);
|
||||
if (IS_ERR(tx->regmap)) {
|
||||
ret = PTR_ERR(tx->regmap);
|
||||
goto err;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, tx);
|
||||
|
||||
@ -1907,6 +1911,8 @@ err_mclk:
|
||||
err_dcodec:
|
||||
clk_disable_unprepare(tx->macro);
|
||||
err:
|
||||
lpass_macro_pds_exit(tx->pds);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1434,8 +1434,10 @@ static int va_macro_probe(struct platform_device *pdev)
|
||||
va->dmic_clk_div = VA_MACRO_CLK_DIV_2;
|
||||
} else {
|
||||
ret = va_macro_validate_dmic_sample_rate(sample_rate, va);
|
||||
if (!ret)
|
||||
return -EINVAL;
|
||||
if (!ret) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
@ -1492,6 +1494,8 @@ err_mclk:
|
||||
err_dcodec:
|
||||
clk_disable_unprepare(va->macro);
|
||||
err:
|
||||
lpass_macro_pds_exit(va->pds);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1206,9 +1206,16 @@ static int msm8916_wcd_digital_probe(struct platform_device *pdev)
|
||||
|
||||
dev_set_drvdata(dev, priv);
|
||||
|
||||
return devm_snd_soc_register_component(dev, &msm8916_wcd_digital,
|
||||
ret = devm_snd_soc_register_component(dev, &msm8916_wcd_digital,
|
||||
msm8916_wcd_digital_dai,
|
||||
ARRAY_SIZE(msm8916_wcd_digital_dai));
|
||||
if (ret)
|
||||
goto err_mclk;
|
||||
|
||||
return 0;
|
||||
|
||||
err_mclk:
|
||||
clk_disable_unprepare(priv->mclk);
|
||||
err_clk:
|
||||
clk_disable_unprepare(priv->ahbclk);
|
||||
return ret;
|
||||
|
@ -489,7 +489,7 @@ static int rk817_platform_probe(struct platform_device *pdev)
|
||||
|
||||
rk817_codec_parse_dt_property(&pdev->dev, rk817_codec_data);
|
||||
|
||||
rk817_codec_data->mclk = clk_get(pdev->dev.parent, "mclk");
|
||||
rk817_codec_data->mclk = devm_clk_get(pdev->dev.parent, "mclk");
|
||||
if (IS_ERR(rk817_codec_data->mclk)) {
|
||||
dev_dbg(&pdev->dev, "Unable to get mclk\n");
|
||||
ret = -ENXIO;
|
||||
|
@ -1100,6 +1100,15 @@ void rt5682_jack_detect_handler(struct work_struct *work)
|
||||
return;
|
||||
}
|
||||
|
||||
if (rt5682->is_sdw) {
|
||||
if (pm_runtime_status_suspended(rt5682->slave->dev.parent)) {
|
||||
dev_dbg(&rt5682->slave->dev,
|
||||
"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
dapm = snd_soc_component_get_dapm(rt5682->component);
|
||||
|
||||
snd_soc_dapm_mutex_lock(dapm);
|
||||
@ -2822,14 +2831,11 @@ static int rt5682_bclk_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
|
||||
for_each_component_dais(component, dai)
|
||||
if (dai->id == RT5682_AIF1)
|
||||
break;
|
||||
if (!dai) {
|
||||
dev_err(rt5682->i2c_dev, "dai %d not found in component\n",
|
||||
RT5682_AIF1);
|
||||
return -ENODEV;
|
||||
}
|
||||
return rt5682_set_bclk1_ratio(dai, factor);
|
||||
|
||||
return rt5682_set_bclk1_ratio(dai, factor);
|
||||
dev_err(rt5682->i2c_dev, "dai %d not found in component\n",
|
||||
RT5682_AIF1);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static const struct clk_ops rt5682_dai_clk_ops[RT5682_DAI_NUM_CLKS] = {
|
||||
|
@ -2687,14 +2687,11 @@ static int rt5682s_bclk_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
|
||||
for_each_component_dais(component, dai)
|
||||
if (dai->id == RT5682S_AIF1)
|
||||
break;
|
||||
if (!dai) {
|
||||
dev_err(component->dev, "dai %d not found in component\n",
|
||||
RT5682S_AIF1);
|
||||
return -ENODEV;
|
||||
}
|
||||
return rt5682s_set_bclk1_ratio(dai, factor);
|
||||
|
||||
return rt5682s_set_bclk1_ratio(dai, factor);
|
||||
dev_err(component->dev, "dai %d not found in component\n",
|
||||
RT5682S_AIF1);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static const struct clk_ops rt5682s_dai_clk_ops[RT5682S_DAI_NUM_CLKS] = {
|
||||
|
@ -245,6 +245,13 @@ static void rt711_jack_detect_handler(struct work_struct *work)
|
||||
if (!rt711->component->card->instantiated)
|
||||
return;
|
||||
|
||||
if (pm_runtime_status_suspended(rt711->slave->dev.parent)) {
|
||||
dev_dbg(&rt711->slave->dev,
|
||||
"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
|
||||
ret = regmap_read(rt711->regmap, reg, &jack_status);
|
||||
if (ret < 0)
|
||||
|
@ -1274,29 +1274,7 @@ static int wcd934x_set_sido_input_src(struct wcd934x_codec *wcd, int sido_src)
|
||||
if (sido_src == wcd->sido_input_src)
|
||||
return 0;
|
||||
|
||||
if (sido_src == SIDO_SOURCE_INTERNAL) {
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
|
||||
WCD934X_ANA_BUCK_HI_ACCU_EN_MASK, 0);
|
||||
usleep_range(100, 110);
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
|
||||
WCD934X_ANA_BUCK_HI_ACCU_PRE_ENX_MASK, 0x0);
|
||||
usleep_range(100, 110);
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
|
||||
WCD934X_ANA_RCO_BG_EN_MASK, 0);
|
||||
usleep_range(100, 110);
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
|
||||
WCD934X_ANA_BUCK_PRE_EN1_MASK,
|
||||
WCD934X_ANA_BUCK_PRE_EN1_ENABLE);
|
||||
usleep_range(100, 110);
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
|
||||
WCD934X_ANA_BUCK_PRE_EN2_MASK,
|
||||
WCD934X_ANA_BUCK_PRE_EN2_ENABLE);
|
||||
usleep_range(100, 110);
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
|
||||
WCD934X_ANA_BUCK_HI_ACCU_EN_MASK,
|
||||
WCD934X_ANA_BUCK_HI_ACCU_ENABLE);
|
||||
usleep_range(100, 110);
|
||||
} else if (sido_src == SIDO_SOURCE_RCO_BG) {
|
||||
if (sido_src == SIDO_SOURCE_RCO_BG) {
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
|
||||
WCD934X_ANA_RCO_BG_EN_MASK,
|
||||
WCD934X_ANA_RCO_BG_ENABLE);
|
||||
@ -1382,8 +1360,6 @@ static int wcd934x_disable_ana_bias_and_syclk(struct wcd934x_codec *wcd)
|
||||
regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
|
||||
WCD934X_EXT_CLK_BUF_EN_MASK |
|
||||
WCD934X_MCLK_EN_MASK, 0x0);
|
||||
wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_INTERNAL);
|
||||
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
|
||||
WCD934X_ANA_BIAS_EN_MASK, 0);
|
||||
regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
|
||||
|
@ -602,7 +602,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731)
|
||||
ret = wm8731_reset(wm8731->regmap);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to issue reset: %d\n", ret);
|
||||
goto err_regulator_enable;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Clear POWEROFF, keep everything else disabled */
|
||||
@ -619,10 +619,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731)
|
||||
|
||||
regcache_mark_dirty(wm8731->regmap);
|
||||
|
||||
err_regulator_enable:
|
||||
/* Regulators will be enabled by bias management */
|
||||
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
|
||||
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -760,21 +757,27 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,
|
||||
ret = PTR_ERR(wm8731->regmap);
|
||||
dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
goto err_regulator_enable;
|
||||
}
|
||||
|
||||
ret = wm8731_hw_init(&i2c->dev, wm8731);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
goto err_regulator_enable;
|
||||
|
||||
ret = devm_snd_soc_register_component(&i2c->dev,
|
||||
&soc_component_dev_wm8731, &wm8731_dai, 1);
|
||||
if (ret != 0) {
|
||||
dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret);
|
||||
return ret;
|
||||
goto err_regulator_enable;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_regulator_enable:
|
||||
/* Regulators will be enabled by bias management */
|
||||
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id wm8731_i2c_id[] = {
|
||||
|
@ -372,7 +372,7 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq)
|
||||
continue;
|
||||
if (ratio == 1 && !support_1_1_ratio)
|
||||
continue;
|
||||
else if (ratio & 1)
|
||||
if ((ratio & 1) && ratio > 1)
|
||||
continue;
|
||||
|
||||
diff = abs((long)clk_rate - ratio * freq);
|
||||
|
@ -364,13 +364,15 @@ static int asoc_simple_set_tdm(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
int sample_bits = params_width(params);
|
||||
int slot_width = simple_dai->slot_width;
|
||||
int slot_count = simple_dai->slots;
|
||||
int slot_width, slot_count;
|
||||
int i, ret;
|
||||
|
||||
if (!simple_dai || !simple_dai->tdm_width_map)
|
||||
return 0;
|
||||
|
||||
slot_width = simple_dai->slot_width;
|
||||
slot_count = simple_dai->slots;
|
||||
|
||||
if (slot_width == 0)
|
||||
slot_width = sample_bits;
|
||||
|
||||
|
@ -27,9 +27,11 @@
|
||||
#define SOF_ES8336_SSP_CODEC(quirk) ((quirk) & GENMASK(3, 0))
|
||||
#define SOF_ES8336_SSP_CODEC_MASK (GENMASK(3, 0))
|
||||
|
||||
#define SOF_ES8336_TGL_GPIO_QUIRK BIT(4)
|
||||
#define SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK BIT(4)
|
||||
#define SOF_ES8336_ENABLE_DMIC BIT(5)
|
||||
#define SOF_ES8336_JD_INVERTED BIT(6)
|
||||
#define SOF_ES8336_HEADPHONE_GPIO BIT(7)
|
||||
#define SOC_ES8336_HEADSET_MIC1 BIT(8)
|
||||
|
||||
static unsigned long quirk;
|
||||
|
||||
@ -39,7 +41,7 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override");
|
||||
|
||||
struct sof_es8336_private {
|
||||
struct device *codec_dev;
|
||||
struct gpio_desc *gpio_pa;
|
||||
struct gpio_desc *gpio_speakers, *gpio_headphone;
|
||||
struct snd_soc_jack jack;
|
||||
struct list_head hdmi_pcm_list;
|
||||
bool speaker_en;
|
||||
@ -51,19 +53,31 @@ struct sof_hdmi_pcm {
|
||||
int device;
|
||||
};
|
||||
|
||||
static const struct acpi_gpio_params pa_enable_gpio = { 0, 0, true };
|
||||
static const struct acpi_gpio_mapping acpi_es8336_gpios[] = {
|
||||
{ "pa-enable-gpios", &pa_enable_gpio, 1 },
|
||||
static const struct acpi_gpio_params enable_gpio0 = { 0, 0, true };
|
||||
static const struct acpi_gpio_params enable_gpio1 = { 1, 0, true };
|
||||
|
||||
static const struct acpi_gpio_mapping acpi_speakers_enable_gpio0[] = {
|
||||
{ "speakers-enable-gpios", &enable_gpio0, 1 },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct acpi_gpio_params quirk_pa_enable_gpio = { 1, 0, true };
|
||||
static const struct acpi_gpio_mapping quirk_acpi_es8336_gpios[] = {
|
||||
{ "pa-enable-gpios", &quirk_pa_enable_gpio, 1 },
|
||||
static const struct acpi_gpio_mapping acpi_speakers_enable_gpio1[] = {
|
||||
{ "speakers-enable-gpios", &enable_gpio1, 1 },
|
||||
};
|
||||
|
||||
static const struct acpi_gpio_mapping acpi_enable_both_gpios[] = {
|
||||
{ "speakers-enable-gpios", &enable_gpio0, 1 },
|
||||
{ "headphone-enable-gpios", &enable_gpio1, 1 },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct acpi_gpio_mapping *gpio_mapping = acpi_es8336_gpios;
|
||||
static const struct acpi_gpio_mapping acpi_enable_both_gpios_rev_order[] = {
|
||||
{ "speakers-enable-gpios", &enable_gpio1, 1 },
|
||||
{ "headphone-enable-gpios", &enable_gpio0, 1 },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct acpi_gpio_mapping *gpio_mapping = acpi_speakers_enable_gpio0;
|
||||
|
||||
static void log_quirks(struct device *dev)
|
||||
{
|
||||
@ -71,10 +85,14 @@ static void log_quirks(struct device *dev)
|
||||
dev_info(dev, "quirk SSP%ld\n", SOF_ES8336_SSP_CODEC(quirk));
|
||||
if (quirk & SOF_ES8336_ENABLE_DMIC)
|
||||
dev_info(dev, "quirk DMIC enabled\n");
|
||||
if (quirk & SOF_ES8336_TGL_GPIO_QUIRK)
|
||||
dev_info(dev, "quirk TGL GPIO enabled\n");
|
||||
if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
|
||||
dev_info(dev, "Speakers GPIO1 quirk enabled\n");
|
||||
if (quirk & SOF_ES8336_HEADPHONE_GPIO)
|
||||
dev_info(dev, "quirk headphone GPIO enabled\n");
|
||||
if (quirk & SOF_ES8336_JD_INVERTED)
|
||||
dev_info(dev, "quirk JD inverted enabled\n");
|
||||
if (quirk & SOC_ES8336_HEADSET_MIC1)
|
||||
dev_info(dev, "quirk headset at mic1 port enabled\n");
|
||||
}
|
||||
|
||||
static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
|
||||
@ -83,12 +101,23 @@ static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_soc_card *card = w->dapm->card;
|
||||
struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
|
||||
|
||||
if (SND_SOC_DAPM_EVENT_ON(event))
|
||||
priv->speaker_en = false;
|
||||
else
|
||||
priv->speaker_en = true;
|
||||
if (priv->speaker_en == !SND_SOC_DAPM_EVENT_ON(event))
|
||||
return 0;
|
||||
|
||||
gpiod_set_value_cansleep(priv->gpio_pa, priv->speaker_en);
|
||||
priv->speaker_en = !SND_SOC_DAPM_EVENT_ON(event);
|
||||
|
||||
if (SND_SOC_DAPM_EVENT_ON(event))
|
||||
msleep(70);
|
||||
|
||||
gpiod_set_value_cansleep(priv->gpio_speakers, priv->speaker_en);
|
||||
|
||||
if (!(quirk & SOF_ES8336_HEADPHONE_GPIO))
|
||||
return 0;
|
||||
|
||||
if (SND_SOC_DAPM_EVENT_ON(event))
|
||||
msleep(70);
|
||||
|
||||
gpiod_set_value_cansleep(priv->gpio_headphone, priv->speaker_en);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -114,18 +143,23 @@ static const struct snd_soc_dapm_route sof_es8316_audio_map[] = {
|
||||
|
||||
/*
|
||||
* There is no separate speaker output instead the speakers are muxed to
|
||||
* the HP outputs. The mux is controlled by the "Speaker Power" supply.
|
||||
* the HP outputs. The mux is controlled Speaker and/or headphone switch.
|
||||
*/
|
||||
{"Speaker", NULL, "HPOL"},
|
||||
{"Speaker", NULL, "HPOR"},
|
||||
{"Speaker", NULL, "Speaker Power"},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route sof_es8316_intmic_in1_map[] = {
|
||||
static const struct snd_soc_dapm_route sof_es8316_headset_mic2_map[] = {
|
||||
{"MIC1", NULL, "Internal Mic"},
|
||||
{"MIC2", NULL, "Headset Mic"},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route sof_es8316_headset_mic1_map[] = {
|
||||
{"MIC2", NULL, "Internal Mic"},
|
||||
{"MIC1", NULL, "Headset Mic"},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route dmic_map[] = {
|
||||
/* digital mics */
|
||||
{"DMic", NULL, "SoC DMIC"},
|
||||
@ -199,8 +233,13 @@ static int sof_es8316_init(struct snd_soc_pcm_runtime *runtime)
|
||||
|
||||
card->dapm.idle_bias_off = true;
|
||||
|
||||
custom_map = sof_es8316_intmic_in1_map;
|
||||
num_routes = ARRAY_SIZE(sof_es8316_intmic_in1_map);
|
||||
if (quirk & SOC_ES8336_HEADSET_MIC1) {
|
||||
custom_map = sof_es8316_headset_mic1_map;
|
||||
num_routes = ARRAY_SIZE(sof_es8316_headset_mic1_map);
|
||||
} else {
|
||||
custom_map = sof_es8316_headset_mic2_map;
|
||||
num_routes = ARRAY_SIZE(sof_es8316_headset_mic2_map);
|
||||
}
|
||||
|
||||
ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
|
||||
if (ret)
|
||||
@ -233,8 +272,14 @@ static int sof_es8336_quirk_cb(const struct dmi_system_id *id)
|
||||
{
|
||||
quirk = (unsigned long)id->driver_data;
|
||||
|
||||
if (quirk & SOF_ES8336_TGL_GPIO_QUIRK)
|
||||
gpio_mapping = quirk_acpi_es8336_gpios;
|
||||
if (quirk & SOF_ES8336_HEADPHONE_GPIO) {
|
||||
if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
|
||||
gpio_mapping = acpi_enable_both_gpios;
|
||||
else
|
||||
gpio_mapping = acpi_enable_both_gpios_rev_order;
|
||||
} else if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK) {
|
||||
gpio_mapping = acpi_speakers_enable_gpio1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -257,7 +302,16 @@ static const struct dmi_system_id sof_es8336_quirk_table[] = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "IP3 tech"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "WN1"),
|
||||
},
|
||||
.driver_data = (void *)(SOF_ES8336_TGL_GPIO_QUIRK)
|
||||
.driver_data = (void *)(SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
|
||||
},
|
||||
{
|
||||
.callback = sof_es8336_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HUAWEI"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "BOHB-WAX9-PCB-B2"),
|
||||
},
|
||||
.driver_data = (void *)(SOF_ES8336_HEADPHONE_GPIO |
|
||||
SOC_ES8336_HEADSET_MIC1)
|
||||
},
|
||||
{}
|
||||
};
|
||||
@ -585,10 +639,17 @@ static int sof_es8336_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
dev_warn(codec_dev, "unable to add GPIO mapping table\n");
|
||||
|
||||
priv->gpio_pa = gpiod_get_optional(codec_dev, "pa-enable", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(priv->gpio_pa)) {
|
||||
ret = dev_err_probe(dev, PTR_ERR(priv->gpio_pa),
|
||||
"could not get pa-enable GPIO\n");
|
||||
priv->gpio_speakers = gpiod_get_optional(codec_dev, "speakers-enable", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(priv->gpio_speakers)) {
|
||||
ret = dev_err_probe(dev, PTR_ERR(priv->gpio_speakers),
|
||||
"could not get speakers-enable GPIO\n");
|
||||
goto err_put_codec;
|
||||
}
|
||||
|
||||
priv->gpio_headphone = gpiod_get_optional(codec_dev, "headphone-enable", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(priv->gpio_headphone)) {
|
||||
ret = dev_err_probe(dev, PTR_ERR(priv->gpio_headphone),
|
||||
"could not get headphone-enable GPIO\n");
|
||||
goto err_put_codec;
|
||||
}
|
||||
|
||||
@ -604,7 +665,7 @@ static int sof_es8336_probe(struct platform_device *pdev)
|
||||
|
||||
ret = devm_snd_soc_register_card(dev, card);
|
||||
if (ret) {
|
||||
gpiod_put(priv->gpio_pa);
|
||||
gpiod_put(priv->gpio_speakers);
|
||||
dev_err(dev, "snd_soc_register_card failed: %d\n", ret);
|
||||
goto err_put_codec;
|
||||
}
|
||||
@ -622,7 +683,7 @@ static int sof_es8336_remove(struct platform_device *pdev)
|
||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
|
||||
|
||||
gpiod_put(priv->gpio_pa);
|
||||
gpiod_put(priv->gpio_speakers);
|
||||
device_remove_software_node(priv->codec_dev);
|
||||
put_device(priv->codec_dev);
|
||||
|
||||
|
@ -212,6 +212,19 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
|
||||
SOF_SSP_BT_OFFLOAD_PRESENT),
|
||||
|
||||
},
|
||||
{
|
||||
.callback = sof_rt5682_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya"),
|
||||
DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98360_ALC5682I_I2S_AMP_SSP2"),
|
||||
},
|
||||
.driver_data = (void *)(SOF_RT5682_MCLK_EN |
|
||||
SOF_RT5682_SSP_CODEC(0) |
|
||||
SOF_SPEAKER_AMP_PRESENT |
|
||||
SOF_MAX98360A_SPEAKER_AMP_PRESENT |
|
||||
SOF_RT5682_SSP_AMP(2) |
|
||||
SOF_RT5682_NUM_HDMIDEV(4)),
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -132,13 +132,13 @@ static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = {
|
||||
{
|
||||
.adr = 0x000123019F837300ull,
|
||||
.num_endpoints = 1,
|
||||
.endpoints = &spk_l_endpoint,
|
||||
.endpoints = &spk_r_endpoint,
|
||||
.name_prefix = "Right"
|
||||
},
|
||||
{
|
||||
.adr = 0x000127019F837300ull,
|
||||
.num_endpoints = 1,
|
||||
.endpoints = &spk_r_endpoint,
|
||||
.endpoints = &spk_l_endpoint,
|
||||
.name_prefix = "Left"
|
||||
}
|
||||
};
|
||||
|
@ -193,6 +193,9 @@ static const struct snd_soc_component_driver aiu_acodec_ctrl_component = {
|
||||
.of_xlate_dai_name = aiu_acodec_of_xlate_dai_name,
|
||||
.endianness = 1,
|
||||
.non_legacy_dai_naming = 1,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_prefix = "acodec",
|
||||
#endif
|
||||
};
|
||||
|
||||
int aiu_acodec_ctrl_register_component(struct device *dev)
|
||||
|
@ -140,6 +140,9 @@ static const struct snd_soc_component_driver aiu_hdmi_ctrl_component = {
|
||||
.of_xlate_dai_name = aiu_hdmi_of_xlate_dai_name,
|
||||
.endianness = 1,
|
||||
.non_legacy_dai_naming = 1,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_prefix = "hdmi",
|
||||
#endif
|
||||
};
|
||||
|
||||
int aiu_hdmi_ctrl_register_component(struct device *dev)
|
||||
|
@ -103,6 +103,9 @@ static const struct snd_soc_component_driver aiu_cpu_component = {
|
||||
.pointer = aiu_fifo_pointer,
|
||||
.probe = aiu_cpu_component_probe,
|
||||
.remove = aiu_cpu_component_remove,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_prefix = "cpu",
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver aiu_cpu_dai_drv[] = {
|
||||
|
@ -2587,6 +2587,11 @@ int snd_soc_component_initialize(struct snd_soc_component *component,
|
||||
component->dev = dev;
|
||||
component->driver = driver;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
if (!component->debugfs_prefix)
|
||||
component->debugfs_prefix = driver->debugfs_prefix;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_initialize);
|
||||
|
@ -1687,8 +1687,7 @@ static void dapm_seq_run(struct snd_soc_card *card,
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_pre:
|
||||
if (!w->event)
|
||||
list_for_each_entry_safe_continue(w, n, list,
|
||||
power_list);
|
||||
continue;
|
||||
|
||||
if (event == SND_SOC_DAPM_STREAM_START)
|
||||
ret = w->event(w,
|
||||
@ -1700,8 +1699,7 @@ static void dapm_seq_run(struct snd_soc_card *card,
|
||||
|
||||
case snd_soc_dapm_post:
|
||||
if (!w->event)
|
||||
list_for_each_entry_safe_continue(w, n, list,
|
||||
power_list);
|
||||
continue;
|
||||
|
||||
if (event == SND_SOC_DAPM_STREAM_START)
|
||||
ret = w->event(w,
|
||||
|
@ -1214,7 +1214,7 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
|
||||
be_substream->pcm->nonatomic = 1;
|
||||
}
|
||||
|
||||
dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_ATOMIC);
|
||||
dpcm = kzalloc(sizeof(struct snd_soc_dpcm), GFP_KERNEL);
|
||||
if (!dpcm)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -1436,12 +1436,12 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
|
||||
template.num_kcontrols = le32_to_cpu(w->num_kcontrols);
|
||||
kc = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(*kc), GFP_KERNEL);
|
||||
if (!kc)
|
||||
goto err;
|
||||
goto hdr_err;
|
||||
|
||||
kcontrol_type = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(unsigned int),
|
||||
GFP_KERNEL);
|
||||
if (!kcontrol_type)
|
||||
goto err;
|
||||
goto hdr_err;
|
||||
|
||||
for (i = 0; i < le32_to_cpu(w->num_kcontrols); i++) {
|
||||
control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
|
||||
|
@ -83,7 +83,14 @@ static const struct dmi_system_id sof_tplg_table[] = {
|
||||
},
|
||||
.driver_data = "sof-adl-max98357a-rt5682-2way.tplg",
|
||||
},
|
||||
|
||||
{
|
||||
.callback = sof_tplg_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya"),
|
||||
DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98360_ALC5682I_I2S_AMP_SSP2"),
|
||||
},
|
||||
.driver_data = "sof-adl-max98357a-rt5682.tplg",
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -904,8 +904,10 @@ static int sof_control_load(struct snd_soc_component *scomp, int index,
|
||||
return -ENOMEM;
|
||||
|
||||
scontrol->name = kstrdup(hdr->name, GFP_KERNEL);
|
||||
if (!scontrol->name)
|
||||
if (!scontrol->name) {
|
||||
kfree(scontrol);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
scontrol->scomp = scomp;
|
||||
scontrol->access = kc->access;
|
||||
@ -941,11 +943,13 @@ static int sof_control_load(struct snd_soc_component *scomp, int index,
|
||||
default:
|
||||
dev_warn(scomp->dev, "control type not supported %d:%d:%d\n",
|
||||
hdr->ops.get, hdr->ops.put, hdr->ops.info);
|
||||
kfree(scontrol->name);
|
||||
kfree(scontrol);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
kfree(scontrol->name);
|
||||
kfree(scontrol);
|
||||
return ret;
|
||||
}
|
||||
@ -1068,6 +1072,46 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sof_disconnect_dai_widget(struct snd_soc_component *scomp,
|
||||
struct snd_soc_dapm_widget *w)
|
||||
{
|
||||
struct snd_soc_card *card = scomp->card;
|
||||
struct snd_soc_pcm_runtime *rtd;
|
||||
struct snd_soc_dai *cpu_dai;
|
||||
int i;
|
||||
|
||||
if (!w->sname)
|
||||
return;
|
||||
|
||||
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||
/* does stream match DAI link ? */
|
||||
if (!rtd->dai_link->stream_name ||
|
||||
strcmp(w->sname, rtd->dai_link->stream_name))
|
||||
continue;
|
||||
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_dai_out:
|
||||
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
|
||||
if (cpu_dai->capture_widget == w) {
|
||||
cpu_dai->capture_widget = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case snd_soc_dapm_dai_in:
|
||||
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
|
||||
if (cpu_dai->playback_widget == w) {
|
||||
cpu_dai->playback_widget = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* bind PCM ID to host component ID */
|
||||
static int spcm_bind(struct snd_soc_component *scomp, struct snd_sof_pcm *spcm,
|
||||
int dir)
|
||||
@ -1353,6 +1397,9 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
|
||||
|
||||
if (dai)
|
||||
list_del(&dai->list);
|
||||
|
||||
sof_disconnect_dai_widget(scomp, widget);
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1380,6 +1427,7 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
|
||||
}
|
||||
kfree(scontrol->ipc_control_data);
|
||||
list_del(&scontrol->list);
|
||||
kfree(scontrol->name);
|
||||
kfree(scontrol);
|
||||
}
|
||||
|
||||
|
@ -1194,6 +1194,7 @@ static void snd_usbmidi_output_drain(struct snd_rawmidi_substream *substream)
|
||||
} while (drain_urbs && timeout);
|
||||
finish_wait(&ep->drain_wait, &wait);
|
||||
}
|
||||
port->active = 0;
|
||||
spin_unlock_irq(&ep->buffer_lock);
|
||||
}
|
||||
|
||||
|
@ -599,6 +599,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
||||
.id = USB_ID(0x0db0, 0x419c),
|
||||
.map = msi_mpg_x570s_carbon_max_wifi_alc4080_map,
|
||||
},
|
||||
{ /* MSI MAG X570S Torpedo Max */
|
||||
.id = USB_ID(0x0db0, 0xa073),
|
||||
.map = msi_mpg_x570s_carbon_max_wifi_alc4080_map,
|
||||
},
|
||||
{ /* MSI TRX40 */
|
||||
.id = USB_ID(0x0db0, 0x543d),
|
||||
.map = trx40_mobo_map,
|
||||
|
Loading…
Reference in New Issue
Block a user