ASoC: Fixes for v5.15

A crop of mostly device specific fixes that have been applied since
 the merge window, nothing particularly standout here.
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmFIe80ACgkQJNaLcl1U
 h9DaFAf6A4VlW7tUXJE+JP7eQGEjxhep84wDnSWJDGFccdbGINVumBTmirzutguU
 dhq0NRCZgSDfBqKKP7f6l27yc/2Ei35wN7yK2VzIIdtqtcZ+Ho3ipFpvdqDyzbuf
 DriMTP83qEs9AJve+GMePwB8aUyGj7QKjkIHXj65FsLI+c2KBQkNf127ydwd4faq
 UrFCuYrs11bD0ohx8GDDbdsmz2jriUZBfaesPwuzfy/O/59caaKqt9Uq1qUxqOJ7
 3Gx1xB3mBhg005dezHgAED9coFW2TSAetIcEMnPrHBqzx8MB6DomcK1+Y8pRbekC
 4NoZrRxuTm2o5TGEwi/XPlCnSb7CAw==
 =29Gi
 -----END PGP SIGNATURE-----

Merge tag 'asoc-fix-v5.15-rc2' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Fixes for v5.15

A crop of mostly device specific fixes that have been applied since
the merge window, nothing particularly standout here.
This commit is contained in:
Takashi Iwai 2021-09-21 18:42:14 +02:00
commit 77ff9e7be0
16 changed files with 97 additions and 51 deletions

View File

@ -17891,7 +17891,8 @@ M: Olivier Moysan <olivier.moysan@foss.st.com>
M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com> M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/iio/adc/st,stm32-*.yaml F: Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml
F: Documentation/devicetree/bindings/sound/st,stm32-*.yaml
F: sound/soc/stm/ F: sound/soc/stm/
STM32 TIMER/LPTIMER DRIVERS STM32 TIMER/LPTIMER DRIVERS

View File

@ -1073,6 +1073,16 @@ static int fsl_esai_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto err_pm_get_sync; goto err_pm_get_sync;
/*
* Register platform component before registering cpu dai for there
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
*/
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
if (ret) {
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
goto err_pm_get_sync;
}
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component, ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component,
&fsl_esai_dai, 1); &fsl_esai_dai, 1);
if (ret) { if (ret) {
@ -1082,12 +1092,6 @@ static int fsl_esai_probe(struct platform_device *pdev)
INIT_WORK(&esai_priv->work, fsl_esai_hw_reset); INIT_WORK(&esai_priv->work, fsl_esai_hw_reset);
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
if (ret) {
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
goto err_pm_get_sync;
}
return ret; return ret;
err_pm_get_sync: err_pm_get_sync:

View File

@ -737,18 +737,23 @@ static int fsl_micfil_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
regcache_cache_only(micfil->regmap, true); regcache_cache_only(micfil->regmap, true);
/*
* Register platform component before registering cpu dai for there
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
*/
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
if (ret) {
dev_err(&pdev->dev, "failed to pcm register\n");
return ret;
}
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_micfil_component, ret = devm_snd_soc_register_component(&pdev->dev, &fsl_micfil_component,
&fsl_micfil_dai, 1); &fsl_micfil_dai, 1);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register component %s\n", dev_err(&pdev->dev, "failed to register component %s\n",
fsl_micfil_component.name); fsl_micfil_component.name);
return ret;
} }
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
if (ret)
dev_err(&pdev->dev, "failed to pcm register\n");
return ret; return ret;
} }

View File

@ -1152,11 +1152,10 @@ static int fsl_sai_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto err_pm_get_sync; goto err_pm_get_sync;
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, /*
&sai->cpu_dai_drv, 1); * Register platform component before registering cpu dai for there
if (ret) * is not defer probe for platform component in snd_soc_add_pcm_runtime().
goto err_pm_get_sync; */
if (sai->soc_data->use_imx_pcm) { if (sai->soc_data->use_imx_pcm) {
ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE); ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
if (ret) if (ret)
@ -1167,6 +1166,11 @@ static int fsl_sai_probe(struct platform_device *pdev)
goto err_pm_get_sync; goto err_pm_get_sync;
} }
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
&sai->cpu_dai_drv, 1);
if (ret)
goto err_pm_get_sync;
return ret; return ret;
err_pm_get_sync: err_pm_get_sync:

View File

@ -1434,6 +1434,16 @@ static int fsl_spdif_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
regcache_cache_only(spdif_priv->regmap, true); regcache_cache_only(spdif_priv->regmap, true);
/*
* Register platform component before registering cpu dai for there
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
*/
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
if (ret) {
dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n");
goto err_pm_disable;
}
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_spdif_component, ret = devm_snd_soc_register_component(&pdev->dev, &fsl_spdif_component,
&spdif_priv->cpu_dai_drv, 1); &spdif_priv->cpu_dai_drv, 1);
if (ret) { if (ret) {
@ -1441,12 +1451,6 @@ static int fsl_spdif_probe(struct platform_device *pdev)
goto err_pm_disable; goto err_pm_disable;
} }
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
if (ret) {
dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n");
goto err_pm_disable;
}
return ret; return ret;
err_pm_disable: err_pm_disable:

View File

@ -1215,18 +1215,23 @@ static int fsl_xcvr_probe(struct platform_device *pdev)
pm_runtime_enable(dev); pm_runtime_enable(dev);
regcache_cache_only(xcvr->regmap, true); regcache_cache_only(xcvr->regmap, true);
/*
* Register platform component before registering cpu dai for there
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
*/
ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0);
if (ret) {
dev_err(dev, "failed to pcm register\n");
return ret;
}
ret = devm_snd_soc_register_component(dev, &fsl_xcvr_comp, ret = devm_snd_soc_register_component(dev, &fsl_xcvr_comp,
&fsl_xcvr_dai, 1); &fsl_xcvr_dai, 1);
if (ret) { if (ret) {
dev_err(dev, "failed to register component %s\n", dev_err(dev, "failed to register component %s\n",
fsl_xcvr_comp.name); fsl_xcvr_comp.name);
return ret;
} }
ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0);
if (ret)
dev_err(dev, "failed to pcm register\n");
return ret; return ret;
} }

View File

@ -929,6 +929,11 @@ static int create_sdw_dailink(struct snd_soc_card *card,
cpus + *cpu_id, cpu_dai_num, cpus + *cpu_id, cpu_dai_num,
codecs, codec_num, codecs, codec_num,
NULL, &sdw_ops); NULL, &sdw_ops);
/*
* SoundWire DAILINKs use 'stream' functions and Bank Switch operations
* based on wait_for_completion(), tag them as 'nonatomic'.
*/
dai_links[*be_index].nonatomic = true;
ret = set_codec_init_func(card, link, dai_links + (*be_index)++, ret = set_codec_init_func(card, link, dai_links + (*be_index)++,
playback, group_id); playback, group_id);

View File

@ -1,6 +1,7 @@
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
config SND_SOC_MEDIATEK config SND_SOC_MEDIATEK
tristate tristate
select REGMAP_MMIO
config SND_SOC_MT2701 config SND_SOC_MT2701
tristate "ASoC support for Mediatek MT2701 chip" tristate "ASoC support for Mediatek MT2701 chip"
@ -188,7 +189,9 @@ config SND_SOC_MT8192_MT6359_RT1015_RT5682
config SND_SOC_MT8195 config SND_SOC_MT8195
tristate "ASoC support for Mediatek MT8195 chip" tristate "ASoC support for Mediatek MT8195 chip"
depends on ARCH_MEDIATEK || COMPILE_TEST depends on ARCH_MEDIATEK || COMPILE_TEST
depends on COMMON_CLK
select SND_SOC_MEDIATEK select SND_SOC_MEDIATEK
select MFD_SYSCON if SND_SOC_MT6359
help help
This adds ASoC platform driver support for Mediatek MT8195 chip This adds ASoC platform driver support for Mediatek MT8195 chip
that can be used with other codecs. that can be used with other codecs.

View File

@ -334,9 +334,11 @@ int mtk_afe_suspend(struct snd_soc_component *component)
devm_kcalloc(dev, afe->reg_back_up_list_num, devm_kcalloc(dev, afe->reg_back_up_list_num,
sizeof(unsigned int), GFP_KERNEL); sizeof(unsigned int), GFP_KERNEL);
for (i = 0; i < afe->reg_back_up_list_num; i++) if (afe->reg_back_up) {
regmap_read(regmap, afe->reg_back_up_list[i], for (i = 0; i < afe->reg_back_up_list_num; i++)
&afe->reg_back_up[i]); regmap_read(regmap, afe->reg_back_up_list[i],
&afe->reg_back_up[i]);
}
afe->suspended = true; afe->suspended = true;
afe->runtime_suspend(dev); afe->runtime_suspend(dev);
@ -356,12 +358,13 @@ int mtk_afe_resume(struct snd_soc_component *component)
afe->runtime_resume(dev); afe->runtime_resume(dev);
if (!afe->reg_back_up) if (!afe->reg_back_up) {
dev_dbg(dev, "%s no reg_backup\n", __func__); dev_dbg(dev, "%s no reg_backup\n", __func__);
} else {
for (i = 0; i < afe->reg_back_up_list_num; i++) for (i = 0; i < afe->reg_back_up_list_num; i++)
mtk_regmap_write(regmap, afe->reg_back_up_list[i], mtk_regmap_write(regmap, afe->reg_back_up_list[i],
afe->reg_back_up[i]); afe->reg_back_up[i]);
}
afe->suspended = false; afe->suspended = false;
return 0; return 0;

View File

@ -424,8 +424,8 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL); return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
} }
static int mt8195_hdmitx_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params) struct snd_pcm_hw_params *params)
{ {
/* fix BE i2s format to 32bit, clean param mask first */ /* fix BE i2s format to 32bit, clean param mask first */
@ -902,7 +902,7 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
.no_pcm = 1, .no_pcm = 1,
.dpcm_playback = 1, .dpcm_playback = 1,
.ops = &mt8195_dptx_ops, .ops = &mt8195_dptx_ops,
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup, .be_hw_params_fixup = mt8195_dptx_hw_params_fixup,
SND_SOC_DAILINK_REG(DPTX_BE), SND_SOC_DAILINK_REG(DPTX_BE),
}, },
[DAI_LINK_ETDM1_IN_BE] = { [DAI_LINK_ETDM1_IN_BE] = {
@ -953,7 +953,6 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS, SND_SOC_DAIFMT_CBS_CFS,
.dpcm_playback = 1, .dpcm_playback = 1,
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup,
SND_SOC_DAILINK_REG(ETDM3_OUT_BE), SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
}, },
[DAI_LINK_PCM1_BE] = { [DAI_LINK_PCM1_BE] = {

View File

@ -371,7 +371,6 @@ int snd_sof_device_remove(struct device *dev)
dev_warn(dev, "error: %d failed to prepare DSP for device removal", dev_warn(dev, "error: %d failed to prepare DSP for device removal",
ret); ret);
snd_sof_fw_unload(sdev);
snd_sof_ipc_free(sdev); snd_sof_ipc_free(sdev);
snd_sof_free_debug(sdev); snd_sof_free_debug(sdev);
snd_sof_free_trace(sdev); snd_sof_free_trace(sdev);
@ -394,8 +393,7 @@ int snd_sof_device_remove(struct device *dev)
snd_sof_remove(sdev); snd_sof_remove(sdev);
/* release firmware */ /* release firmware */
release_firmware(pdata->fw); snd_sof_fw_unload(sdev);
pdata->fw = NULL;
return 0; return 0;
} }

View File

@ -365,7 +365,14 @@ static int imx8_remove(struct snd_sof_dev *sdev)
/* on i.MX8 there is 1 to 1 match between type and BAR idx */ /* on i.MX8 there is 1 to 1 match between type and BAR idx */
static int imx8_get_bar_index(struct snd_sof_dev *sdev, u32 type) static int imx8_get_bar_index(struct snd_sof_dev *sdev, u32 type)
{ {
return type; /* Only IRAM and SRAM bars are valid */
switch (type) {
case SOF_FW_BLK_TYPE_IRAM:
case SOF_FW_BLK_TYPE_SRAM:
return type;
default:
return -EINVAL;
}
} }
static void imx8_ipc_msg_data(struct snd_sof_dev *sdev, static void imx8_ipc_msg_data(struct snd_sof_dev *sdev,

View File

@ -228,7 +228,14 @@ static int imx8m_remove(struct snd_sof_dev *sdev)
/* on i.MX8 there is 1 to 1 match between type and BAR idx */ /* on i.MX8 there is 1 to 1 match between type and BAR idx */
static int imx8m_get_bar_index(struct snd_sof_dev *sdev, u32 type) static int imx8m_get_bar_index(struct snd_sof_dev *sdev, u32 type)
{ {
return type; /* Only IRAM and SRAM bars are valid */
switch (type) {
case SOF_FW_BLK_TYPE_IRAM:
case SOF_FW_BLK_TYPE_SRAM:
return type;
default:
return -EINVAL;
}
} }
static void imx8m_ipc_msg_data(struct snd_sof_dev *sdev, static void imx8m_ipc_msg_data(struct snd_sof_dev *sdev,

View File

@ -729,10 +729,10 @@ int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev)
ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev); ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev);
if (ret < 0) { if (ret < 0) {
dev_err(sdev->dev, "error: request firmware %s failed err: %d\n",
fw_filename, ret);
dev_err(sdev->dev, dev_err(sdev->dev,
"you may need to download the firmware from https://github.com/thesofproject/sof-bin/\n"); "error: sof firmware file is missing, you might need to\n");
dev_err(sdev->dev,
" download it from https://github.com/thesofproject/sof-bin/\n");
goto err; goto err;
} else { } else {
dev_dbg(sdev->dev, "request_firmware %s successful\n", dev_dbg(sdev->dev, "request_firmware %s successful\n",
@ -880,5 +880,7 @@ EXPORT_SYMBOL(snd_sof_run_firmware);
void snd_sof_fw_unload(struct snd_sof_dev *sdev) void snd_sof_fw_unload(struct snd_sof_dev *sdev)
{ {
/* TODO: support module unloading at runtime */ /* TODO: support module unloading at runtime */
release_firmware(sdev->pdata->fw);
sdev->pdata->fw = NULL;
} }
EXPORT_SYMBOL(snd_sof_fw_unload); EXPORT_SYMBOL(snd_sof_fw_unload);

View File

@ -530,7 +530,6 @@ void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev)
return; return;
if (sdev->dtrace_is_enabled) { if (sdev->dtrace_is_enabled) {
dev_err(sdev->dev, "error: waking up any trace sleepers\n");
sdev->dtrace_error = true; sdev->dtrace_error = true;
wake_up(&sdev->trace_sleep); wake_up(&sdev->trace_sleep);
} }

View File

@ -122,9 +122,9 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
* 0x0049fbb0: 8000f2d0 0049fc00 6f6c6c61 00632e63 * 0x0049fbb0: 8000f2d0 0049fc00 6f6c6c61 00632e63
*/ */
for (i = 0; i < stack_words; i += 4) { for (i = 0; i < stack_words; i += 4) {
hex_dump_to_buffer(stack + i * 4, 16, 16, 4, hex_dump_to_buffer(stack + i, 16, 16, 4,
buf, sizeof(buf), false); buf, sizeof(buf), false);
dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i, buf); dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i * 4, buf);
} }
} }