ASoC: fsl: fix snd-soc-imx-pcm module build
When building modules with CONFIG_SND_IMX_SOC=m in imx_v6_v7_defconfig, we will see the following link error. LD [M] sound/soc/fsl/snd-soc-fsl-ssi.o LD [M] sound/soc/fsl/snd-soc-fsl-utils.o LD [M] sound/soc/fsl/snd-soc-imx-ssi.o LD [M] sound/soc/fsl/snd-soc-imx-audmux.o LD [M] sound/soc/fsl/snd-soc-imx-pcm.o sound/soc/fsl/imx-pcm-dma.o: In function `init_module': imx-pcm-dma.c:(.init.text+0x0): multiple definition of `init_module' sound/soc/fsl/imx-pcm-fiq.o:imx-pcm-fiq.c:(.init.text+0x0): first defined here sound/soc/fsl/imx-pcm-dma.o: In function `cleanup_module': imx-pcm-dma.c:(.exit.text+0x0): multiple definition of `cleanup_module' sound/soc/fsl/imx-pcm-fiq.o:imx-pcm-fiq.c:(.exit.text+0x0): first defined here make[4]: *** [sound/soc/fsl/snd-soc-imx-pcm.o] Error 1 The module snd-soc-imx-pcm is designed to link imx-pcm.o with imx-pcm-dma.o or imx-pcm-fiq.o depending on if option SND_SOC_IMX_PCM_DMA or SND_SOC_IMX_PCM_FIQ is enabled. Both imx-pcm-dma and imx-pcm-fiq register their own module_platform_driver. However, these two options are not mutually exclusive and can be enabled together. And that's why we see above multiple init_module definition error. Instead of having both imx-pcm-dma and imx-pcm-fiq register their own platform_driver, we should do only once in imx-pcm.c. Using platform_device_id to distinguish between imx-pcm-dma and imx-pcm-fiq, we can run-time call imx-pcm-dma/fiq specific initialization in .probe hook to have module snd-soc-imx-pcm work for both cases. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
93d7b7622c
commit
1927661b17
|
@ -154,26 +154,7 @@ static struct snd_soc_platform_driver imx_soc_platform_mx2 = {
|
|||
.pcm_free = imx_pcm_free,
|
||||
};
|
||||
|
||||
static int imx_soc_platform_probe(struct platform_device *pdev)
|
||||
int imx_pcm_dma_init(struct platform_device *pdev)
|
||||
{
|
||||
return snd_soc_register_platform(&pdev->dev, &imx_soc_platform_mx2);
|
||||
}
|
||||
|
||||
static int imx_soc_platform_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_platform(&pdev->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver imx_pcm_driver = {
|
||||
.driver = {
|
||||
.name = "imx-pcm-audio",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = imx_soc_platform_probe,
|
||||
.remove = imx_soc_platform_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(imx_pcm_driver);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:imx-pcm-audio");
|
||||
|
|
|
@ -281,7 +281,7 @@ static struct snd_soc_platform_driver imx_soc_platform_fiq = {
|
|||
.pcm_free = imx_pcm_fiq_free,
|
||||
};
|
||||
|
||||
static int imx_soc_platform_probe(struct platform_device *pdev)
|
||||
int imx_pcm_fiq_init(struct platform_device *pdev)
|
||||
{
|
||||
struct imx_ssi *ssi = platform_get_drvdata(pdev);
|
||||
int ret;
|
||||
|
@ -314,23 +314,3 @@ failed_register:
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int imx_soc_platform_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_platform(&pdev->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver imx_pcm_driver = {
|
||||
.driver = {
|
||||
.name = "imx-fiq-pcm-audio",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
|
||||
.probe = imx_soc_platform_probe,
|
||||
.remove = imx_soc_platform_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(imx_pcm_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -104,6 +104,38 @@ void imx_pcm_free(struct snd_pcm *pcm)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(imx_pcm_free);
|
||||
|
||||
static int imx_pcm_probe(struct platform_device *pdev)
|
||||
{
|
||||
if (strcmp(pdev->id_entry->name, "imx-fiq-pcm-audio") == 0)
|
||||
return imx_pcm_fiq_init(pdev);
|
||||
|
||||
return imx_pcm_dma_init(pdev);
|
||||
}
|
||||
|
||||
static int imx_pcm_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_platform(&pdev->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_device_id imx_pcm_devtype[] = {
|
||||
{ .name = "imx-pcm-audio", },
|
||||
{ .name = "imx-fiq-pcm-audio", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(platform, imx_pcm_devtype);
|
||||
|
||||
static struct platform_driver imx_pcm_driver = {
|
||||
.driver = {
|
||||
.name = "imx-pcm",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.id_table = imx_pcm_devtype,
|
||||
.probe = imx_pcm_probe,
|
||||
.remove = imx_pcm_remove,
|
||||
};
|
||||
module_platform_driver(imx_pcm_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Freescale i.MX PCM driver");
|
||||
MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -30,4 +30,22 @@ int snd_imx_pcm_mmap(struct snd_pcm_substream *substream,
|
|||
int imx_pcm_new(struct snd_soc_pcm_runtime *rtd);
|
||||
void imx_pcm_free(struct snd_pcm *pcm);
|
||||
|
||||
#ifdef CONFIG_SND_SOC_IMX_PCM_DMA
|
||||
int imx_pcm_dma_init(struct platform_device *pdev);
|
||||
#else
|
||||
static inline int imx_pcm_dma_init(struct platform_device *pdev)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SND_SOC_IMX_PCM_FIQ
|
||||
int imx_pcm_fiq_init(struct platform_device *pdev);
|
||||
#else
|
||||
static inline int imx_pcm_fiq_init(struct platform_device *pdev)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _IMX_PCM_H */
|
||||
|
|
Loading…
Reference in New Issue