* [PATCH 0/2] ASoC: au1x: update PSC AC97/I2S code @ 2011-07-24 13:11 ` Manuel Lauss 0 siblings, 0 replies; 8+ messages in thread From: Manuel Lauss @ 2011-07-24 13:11 UTC (permalink / raw) To: alsa-devel, Mark Brown; +Cc: Liam Girdwood, Linux-MIPS, Manuel Lauss The following two patches depend on patchset "ASoC for Alchemy Au1000/1500/1100" to apply and work. Patch #1 moves the DBDMA (PCM) device registration from the AC97/I2S drivers into the board code. Patch #2 changes use of "soc-audio" platform device int db1200 machine code to the new way. Run-tested on DB1200, DB1300 and DB1550 boards. Manuel Lauss (2): ASoC: au1x: remove automatic DMA device registration from PSC drivers ASoC: au1x: update db1200 machine to the new way of things arch/mips/alchemy/devboards/db1200/platform.c | 16 +++++ sound/soc/au1x/db1200.c | 64 +++++++++++++------ sound/soc/au1x/dbdma2.c | 83 ++++--------------------- sound/soc/au1x/psc-ac97.c | 34 +++++++--- sound/soc/au1x/psc-i2s.c | 32 +++++++--- sound/soc/au1x/psc.h | 5 -- 6 files changed, 117 insertions(+), 117 deletions(-) -- 1.7.6 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 0/2] ASoC: au1x: update PSC AC97/I2S code @ 2011-07-24 13:11 ` Manuel Lauss 0 siblings, 0 replies; 8+ messages in thread From: Manuel Lauss @ 2011-07-24 13:11 UTC (permalink / raw) To: alsa-devel; +Cc: Linux-MIPS, Manuel Lauss, Liam Girdwood The following two patches depend on patchset "ASoC for Alchemy Au1000/1500/1100" to apply and work. Patch #1 moves the DBDMA (PCM) device registration from the AC97/I2S drivers into the board code. Patch #2 changes use of "soc-audio" platform device int db1200 machine code to the new way. Run-tested on DB1200, DB1300 and DB1550 boards. Manuel Lauss (2): ASoC: au1x: remove automatic DMA device registration from PSC drivers ASoC: au1x: update db1200 machine to the new way of things arch/mips/alchemy/devboards/db1200/platform.c | 16 +++++ sound/soc/au1x/db1200.c | 64 +++++++++++++------ sound/soc/au1x/dbdma2.c | 83 ++++--------------------- sound/soc/au1x/psc-ac97.c | 34 +++++++--- sound/soc/au1x/psc-i2s.c | 32 +++++++--- sound/soc/au1x/psc.h | 5 -- 6 files changed, 117 insertions(+), 117 deletions(-) -- 1.7.6 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] ASoC: au1x: remove automatic DMA device registration from PSC drivers 2011-07-24 13:11 ` Manuel Lauss @ 2011-07-24 13:11 ` Manuel Lauss -1 siblings, 0 replies; 8+ messages in thread From: Manuel Lauss @ 2011-07-24 13:11 UTC (permalink / raw) To: alsa-devel, Mark Brown; +Cc: Liam Girdwood, Linux-MIPS, Manuel Lauss The PSC audio drivers (psc-ac97/psc-i2s) register the DMA platform_device on their own. This is frowned upon, from now on board code must register a simple pcm dma platform device for each PSC with sound duties. Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com> --- arch/mips/alchemy/devboards/db1200/platform.c | 6 ++ sound/soc/au1x/dbdma2.c | 83 ++++--------------------- sound/soc/au1x/psc-ac97.c | 34 +++++++--- sound/soc/au1x/psc-i2s.c | 32 +++++++--- sound/soc/au1x/psc.h | 5 -- 5 files changed, 64 insertions(+), 96 deletions(-) diff --git a/arch/mips/alchemy/devboards/db1200/platform.c b/arch/mips/alchemy/devboards/db1200/platform.c index fbb5593..cfb71ae 100644 --- a/arch/mips/alchemy/devboards/db1200/platform.c +++ b/arch/mips/alchemy/devboards/db1200/platform.c @@ -434,12 +434,18 @@ static struct platform_device db1200_stac_dev = { .id = 1, /* on PSC1 */ }; +static struct platform_device db1200_audiodma_dev = { + .name = "au1xpsc-pcm", + .id = 1, /* PSC ID */ +}; + static struct platform_device *db1200_devs[] __initdata = { NULL, /* PSC0, selected by S6.8 */ &db1200_ide_dev, &db1200_eth_dev, &db1200_rtc_dev, &db1200_nand_dev, + &db1200_audiodma_dev, &db1200_audio_dev, &db1200_stac_dev, }; diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c index 10fdd28..cc53607 100644 --- a/sound/soc/au1x/dbdma2.c +++ b/sound/soc/au1x/dbdma2.c @@ -293,6 +293,16 @@ au1xpsc_pcm_pointer(struct snd_pcm_substream *substream) static int au1xpsc_pcm_open(struct snd_pcm_substream *substream) { + struct au1xpsc_audio_dmadata *pcd = to_dmadata(substream); + struct snd_soc_pcm_runtime *rtd = substream->private_data; + int stype = SUBSTREAM_TYPE(substream), *dmaids; + + dmaids = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); + if (!dmaids) + return -ENODEV; /* whoa, has ordering changed? */ + + pcd->ddma_id = dmaids[stype]; + snd_soc_set_runtime_hwparams(substream, &au1xpsc_pcm_hardware); return 0; } @@ -339,36 +349,18 @@ struct snd_soc_platform_driver au1xpsc_soc_platform = { static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) { struct au1xpsc_audio_dmadata *dmadata; - struct resource *r; int ret; dmadata = kzalloc(2 * sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); if (!dmadata) return -ENOMEM; - r = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!r) { - ret = -ENODEV; - goto out1; - } - dmadata[PCM_TX].ddma_id = r->start; - - /* RX DMA */ - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); - if (!r) { - ret = -ENODEV; - goto out1; - } - dmadata[PCM_RX].ddma_id = r->start; - platform_set_drvdata(pdev, dmadata); ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform); - if (!ret) - return ret; + if (ret) + kfree(dmadata); -out1: - kfree(dmadata); return ret; } @@ -404,57 +396,6 @@ static void __exit au1xpsc_audio_dbdma_unload(void) module_init(au1xpsc_audio_dbdma_load); module_exit(au1xpsc_audio_dbdma_unload); - -struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev) -{ - struct resource *res, *r; - struct platform_device *pd; - int id[2]; - int ret; - - r = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!r) - return NULL; - id[0] = r->start; - - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); - if (!r) - return NULL; - id[1] = r->start; - - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); - if (!res) - return NULL; - - res[0].start = res[0].end = id[0]; - res[1].start = res[1].end = id[1]; - res[0].flags = res[1].flags = IORESOURCE_DMA; - - pd = platform_device_alloc("au1xpsc-pcm", pdev->id); - if (!pd) - goto out; - - pd->resource = res; - pd->num_resources = 2; - - ret = platform_device_add(pd); - if (!ret) - return pd; - - platform_device_put(pd); -out: - kfree(res); - return NULL; -} -EXPORT_SYMBOL_GPL(au1xpsc_pcm_add); - -void au1xpsc_pcm_destroy(struct platform_device *dmapd) -{ - if (dmapd) - platform_device_unregister(dmapd); -} -EXPORT_SYMBOL_GPL(au1xpsc_pcm_destroy); - MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Au12x0/Au1550 PSC Audio DMA driver"); MODULE_AUTHOR("Manuel Lauss"); diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c index d0db66f..44296ab 100644 --- a/sound/soc/au1x/psc-ac97.c +++ b/sound/soc/au1x/psc-ac97.c @@ -324,12 +324,21 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream, return ret; } +static int au1xpsc_ac97_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); + snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); + return 0; +} + static int au1xpsc_ac97_probe(struct snd_soc_dai *dai) { return au1xpsc_ac97_workdata ? 0 : -ENODEV; } static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { + .startup = au1xpsc_ac97_startup, .trigger = au1xpsc_ac97_trigger, .hw_params = au1xpsc_ac97_hw_params, }; @@ -379,6 +388,16 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) if (!wd->mmio) goto out1; + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); + if (!r) + goto out2; + wd->dmaids[PCM_TX] = r->start; + + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); + if (!r) + goto out2; + wd->dmaids[PCM_RX] = r->start; + /* configuration: max dma trigger threshold, enable ac97 */ wd->cfg = PSC_AC97CFG_RT_FIFO8 | PSC_AC97CFG_TT_FIFO8 | PSC_AC97CFG_DE_ENABLE; @@ -401,15 +420,13 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); if (ret) - goto out1; + goto out2; - wd->dmapd = au1xpsc_pcm_add(pdev); - if (wd->dmapd) { - au1xpsc_ac97_workdata = wd; - return 0; - } + au1xpsc_ac97_workdata = wd; + return 0; - snd_soc_unregister_dai(&pdev->dev); +out2: + iounmap(wd->mmio); out1: release_mem_region(r->start, resource_size(r)); out0: @@ -422,9 +439,6 @@ static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev) struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (wd->dmapd) - au1xpsc_pcm_destroy(wd->dmapd); - snd_soc_unregister_dai(&pdev->dev); /* disable PSC completely */ diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c index fca0912..1b7ab5d 100644 --- a/sound/soc/au1x/psc-i2s.c +++ b/sound/soc/au1x/psc-i2s.c @@ -257,7 +257,16 @@ static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, return ret; } +static int au1xpsc_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); + snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); + return 0; +} + static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = { + .startup = au1xpsc_i2s_startup, .trigger = au1xpsc_i2s_trigger, .hw_params = au1xpsc_i2s_hw_params, .set_fmt = au1xpsc_i2s_set_fmt, @@ -304,6 +313,16 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) if (!wd->mmio) goto out1; + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); + if (!r) + goto out2; + wd->dmaids[PCM_TX] = r->start; + + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); + if (!r) + goto out2; + wd->dmaids[PCM_RX] = r->start; + /* preserve PSC clock source set up by platform (dev.platform_data * is already occupied by soc layer) */ @@ -330,15 +349,11 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) platform_set_drvdata(pdev, wd); ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); - if (ret) - goto out1; - - /* finally add the DMA device for this PSC */ - wd->dmapd = au1xpsc_pcm_add(pdev); - if (wd->dmapd) + if (!ret) return 0; - snd_soc_unregister_dai(&pdev->dev); +out2: + iounmap(wd->mmio); out1: release_mem_region(r->start, resource_size(r)); out0: @@ -351,9 +366,6 @@ static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev) struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (wd->dmapd) - au1xpsc_pcm_destroy(wd->dmapd); - snd_soc_unregister_dai(&pdev->dev); au_writel(0, I2S_CFG(wd)); diff --git a/sound/soc/au1x/psc.h b/sound/soc/au1x/psc.h index c59b9e5..1b21c4f 100644 --- a/sound/soc/au1x/psc.h +++ b/sound/soc/au1x/psc.h @@ -19,10 +19,6 @@ #define SUBSTREAM_TYPE(substream) \ ((substream)->stream == SNDRV_PCM_STREAM_PLAYBACK ? PCM_TX : PCM_RX) -/* PSC/DBDMA helpers */ -extern struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev); -extern void au1xpsc_pcm_destroy(struct platform_device *dmapd); - struct au1xpsc_audio_data { void __iomem *mmio; @@ -34,7 +30,6 @@ struct au1xpsc_audio_data { unsigned long pm[2]; struct mutex lock; int dmaids[2]; - struct platform_device *dmapd; }; /* easy access macros */ -- 1.7.6 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 1/2] ASoC: au1x: remove automatic DMA device registration from PSC drivers @ 2011-07-24 13:11 ` Manuel Lauss 0 siblings, 0 replies; 8+ messages in thread From: Manuel Lauss @ 2011-07-24 13:11 UTC (permalink / raw) To: alsa-devel; +Cc: Linux-MIPS, Manuel Lauss, Liam Girdwood The PSC audio drivers (psc-ac97/psc-i2s) register the DMA platform_device on their own. This is frowned upon, from now on board code must register a simple pcm dma platform device for each PSC with sound duties. Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com> --- arch/mips/alchemy/devboards/db1200/platform.c | 6 ++ sound/soc/au1x/dbdma2.c | 83 ++++--------------------- sound/soc/au1x/psc-ac97.c | 34 +++++++--- sound/soc/au1x/psc-i2s.c | 32 +++++++--- sound/soc/au1x/psc.h | 5 -- 5 files changed, 64 insertions(+), 96 deletions(-) diff --git a/arch/mips/alchemy/devboards/db1200/platform.c b/arch/mips/alchemy/devboards/db1200/platform.c index fbb5593..cfb71ae 100644 --- a/arch/mips/alchemy/devboards/db1200/platform.c +++ b/arch/mips/alchemy/devboards/db1200/platform.c @@ -434,12 +434,18 @@ static struct platform_device db1200_stac_dev = { .id = 1, /* on PSC1 */ }; +static struct platform_device db1200_audiodma_dev = { + .name = "au1xpsc-pcm", + .id = 1, /* PSC ID */ +}; + static struct platform_device *db1200_devs[] __initdata = { NULL, /* PSC0, selected by S6.8 */ &db1200_ide_dev, &db1200_eth_dev, &db1200_rtc_dev, &db1200_nand_dev, + &db1200_audiodma_dev, &db1200_audio_dev, &db1200_stac_dev, }; diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c index 10fdd28..cc53607 100644 --- a/sound/soc/au1x/dbdma2.c +++ b/sound/soc/au1x/dbdma2.c @@ -293,6 +293,16 @@ au1xpsc_pcm_pointer(struct snd_pcm_substream *substream) static int au1xpsc_pcm_open(struct snd_pcm_substream *substream) { + struct au1xpsc_audio_dmadata *pcd = to_dmadata(substream); + struct snd_soc_pcm_runtime *rtd = substream->private_data; + int stype = SUBSTREAM_TYPE(substream), *dmaids; + + dmaids = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); + if (!dmaids) + return -ENODEV; /* whoa, has ordering changed? */ + + pcd->ddma_id = dmaids[stype]; + snd_soc_set_runtime_hwparams(substream, &au1xpsc_pcm_hardware); return 0; } @@ -339,36 +349,18 @@ struct snd_soc_platform_driver au1xpsc_soc_platform = { static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) { struct au1xpsc_audio_dmadata *dmadata; - struct resource *r; int ret; dmadata = kzalloc(2 * sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); if (!dmadata) return -ENOMEM; - r = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!r) { - ret = -ENODEV; - goto out1; - } - dmadata[PCM_TX].ddma_id = r->start; - - /* RX DMA */ - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); - if (!r) { - ret = -ENODEV; - goto out1; - } - dmadata[PCM_RX].ddma_id = r->start; - platform_set_drvdata(pdev, dmadata); ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform); - if (!ret) - return ret; + if (ret) + kfree(dmadata); -out1: - kfree(dmadata); return ret; } @@ -404,57 +396,6 @@ static void __exit au1xpsc_audio_dbdma_unload(void) module_init(au1xpsc_audio_dbdma_load); module_exit(au1xpsc_audio_dbdma_unload); - -struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev) -{ - struct resource *res, *r; - struct platform_device *pd; - int id[2]; - int ret; - - r = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!r) - return NULL; - id[0] = r->start; - - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); - if (!r) - return NULL; - id[1] = r->start; - - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); - if (!res) - return NULL; - - res[0].start = res[0].end = id[0]; - res[1].start = res[1].end = id[1]; - res[0].flags = res[1].flags = IORESOURCE_DMA; - - pd = platform_device_alloc("au1xpsc-pcm", pdev->id); - if (!pd) - goto out; - - pd->resource = res; - pd->num_resources = 2; - - ret = platform_device_add(pd); - if (!ret) - return pd; - - platform_device_put(pd); -out: - kfree(res); - return NULL; -} -EXPORT_SYMBOL_GPL(au1xpsc_pcm_add); - -void au1xpsc_pcm_destroy(struct platform_device *dmapd) -{ - if (dmapd) - platform_device_unregister(dmapd); -} -EXPORT_SYMBOL_GPL(au1xpsc_pcm_destroy); - MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Au12x0/Au1550 PSC Audio DMA driver"); MODULE_AUTHOR("Manuel Lauss"); diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c index d0db66f..44296ab 100644 --- a/sound/soc/au1x/psc-ac97.c +++ b/sound/soc/au1x/psc-ac97.c @@ -324,12 +324,21 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream, return ret; } +static int au1xpsc_ac97_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); + snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); + return 0; +} + static int au1xpsc_ac97_probe(struct snd_soc_dai *dai) { return au1xpsc_ac97_workdata ? 0 : -ENODEV; } static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { + .startup = au1xpsc_ac97_startup, .trigger = au1xpsc_ac97_trigger, .hw_params = au1xpsc_ac97_hw_params, }; @@ -379,6 +388,16 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) if (!wd->mmio) goto out1; + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); + if (!r) + goto out2; + wd->dmaids[PCM_TX] = r->start; + + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); + if (!r) + goto out2; + wd->dmaids[PCM_RX] = r->start; + /* configuration: max dma trigger threshold, enable ac97 */ wd->cfg = PSC_AC97CFG_RT_FIFO8 | PSC_AC97CFG_TT_FIFO8 | PSC_AC97CFG_DE_ENABLE; @@ -401,15 +420,13 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); if (ret) - goto out1; + goto out2; - wd->dmapd = au1xpsc_pcm_add(pdev); - if (wd->dmapd) { - au1xpsc_ac97_workdata = wd; - return 0; - } + au1xpsc_ac97_workdata = wd; + return 0; - snd_soc_unregister_dai(&pdev->dev); +out2: + iounmap(wd->mmio); out1: release_mem_region(r->start, resource_size(r)); out0: @@ -422,9 +439,6 @@ static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev) struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (wd->dmapd) - au1xpsc_pcm_destroy(wd->dmapd); - snd_soc_unregister_dai(&pdev->dev); /* disable PSC completely */ diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c index fca0912..1b7ab5d 100644 --- a/sound/soc/au1x/psc-i2s.c +++ b/sound/soc/au1x/psc-i2s.c @@ -257,7 +257,16 @@ static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, return ret; } +static int au1xpsc_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); + snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); + return 0; +} + static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = { + .startup = au1xpsc_i2s_startup, .trigger = au1xpsc_i2s_trigger, .hw_params = au1xpsc_i2s_hw_params, .set_fmt = au1xpsc_i2s_set_fmt, @@ -304,6 +313,16 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) if (!wd->mmio) goto out1; + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); + if (!r) + goto out2; + wd->dmaids[PCM_TX] = r->start; + + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); + if (!r) + goto out2; + wd->dmaids[PCM_RX] = r->start; + /* preserve PSC clock source set up by platform (dev.platform_data * is already occupied by soc layer) */ @@ -330,15 +349,11 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) platform_set_drvdata(pdev, wd); ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); - if (ret) - goto out1; - - /* finally add the DMA device for this PSC */ - wd->dmapd = au1xpsc_pcm_add(pdev); - if (wd->dmapd) + if (!ret) return 0; - snd_soc_unregister_dai(&pdev->dev); +out2: + iounmap(wd->mmio); out1: release_mem_region(r->start, resource_size(r)); out0: @@ -351,9 +366,6 @@ static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev) struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (wd->dmapd) - au1xpsc_pcm_destroy(wd->dmapd); - snd_soc_unregister_dai(&pdev->dev); au_writel(0, I2S_CFG(wd)); diff --git a/sound/soc/au1x/psc.h b/sound/soc/au1x/psc.h index c59b9e5..1b21c4f 100644 --- a/sound/soc/au1x/psc.h +++ b/sound/soc/au1x/psc.h @@ -19,10 +19,6 @@ #define SUBSTREAM_TYPE(substream) \ ((substream)->stream == SNDRV_PCM_STREAM_PLAYBACK ? PCM_TX : PCM_RX) -/* PSC/DBDMA helpers */ -extern struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev); -extern void au1xpsc_pcm_destroy(struct platform_device *dmapd); - struct au1xpsc_audio_data { void __iomem *mmio; @@ -34,7 +30,6 @@ struct au1xpsc_audio_data { unsigned long pm[2]; struct mutex lock; int dmaids[2]; - struct platform_device *dmapd; }; /* easy access macros */ -- 1.7.6 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] ASoC: au1x: remove automatic DMA device registration from PSC drivers 2011-07-24 13:11 ` Manuel Lauss @ 2011-07-25 9:41 ` Liam Girdwood -1 siblings, 0 replies; 8+ messages in thread From: Liam Girdwood @ 2011-07-25 9:41 UTC (permalink / raw) To: Manuel Lauss; +Cc: alsa-devel, Mark Brown, Linux-MIPS On 24/07/11 14:11, Manuel Lauss wrote: > The PSC audio drivers (psc-ac97/psc-i2s) register the DMA platform_device > on their own. This is frowned upon, from now on board code must > register a simple pcm dma platform device for each PSC with sound duties. > > Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com> > --- > arch/mips/alchemy/devboards/db1200/platform.c | 6 ++ > sound/soc/au1x/dbdma2.c | 83 ++++--------------------- > sound/soc/au1x/psc-ac97.c | 34 +++++++--- > sound/soc/au1x/psc-i2s.c | 32 +++++++--- > sound/soc/au1x/psc.h | 5 -- > 5 files changed, 64 insertions(+), 96 deletions(-) > > diff --git a/arch/mips/alchemy/devboards/db1200/platform.c b/arch/mips/alchemy/devboards/db1200/platform.c > index fbb5593..cfb71ae 100644 > --- a/arch/mips/alchemy/devboards/db1200/platform.c > +++ b/arch/mips/alchemy/devboards/db1200/platform.c > @@ -434,12 +434,18 @@ static struct platform_device db1200_stac_dev = { > .id = 1, /* on PSC1 */ > }; > > +static struct platform_device db1200_audiodma_dev = { > + .name = "au1xpsc-pcm", > + .id = 1, /* PSC ID */ > +}; > + > static struct platform_device *db1200_devs[] __initdata = { > NULL, /* PSC0, selected by S6.8 */ > &db1200_ide_dev, > &db1200_eth_dev, > &db1200_rtc_dev, > &db1200_nand_dev, > + &db1200_audiodma_dev, > &db1200_audio_dev, > &db1200_stac_dev, > }; > diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c > index 10fdd28..cc53607 100644 > --- a/sound/soc/au1x/dbdma2.c > +++ b/sound/soc/au1x/dbdma2.c > @@ -293,6 +293,16 @@ au1xpsc_pcm_pointer(struct snd_pcm_substream *substream) > > static int au1xpsc_pcm_open(struct snd_pcm_substream *substream) > { > + struct au1xpsc_audio_dmadata *pcd = to_dmadata(substream); > + struct snd_soc_pcm_runtime *rtd = substream->private_data; > + int stype = SUBSTREAM_TYPE(substream), *dmaids; > + > + dmaids = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); > + if (!dmaids) > + return -ENODEV; /* whoa, has ordering changed? */ > + > + pcd->ddma_id = dmaids[stype]; > + > snd_soc_set_runtime_hwparams(substream, &au1xpsc_pcm_hardware); > return 0; > } > @@ -339,36 +349,18 @@ struct snd_soc_platform_driver au1xpsc_soc_platform = { > static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) > { > struct au1xpsc_audio_dmadata *dmadata; > - struct resource *r; > int ret; > > dmadata = kzalloc(2 * sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); > if (!dmadata) > return -ENOMEM; > > - r = platform_get_resource(pdev, IORESOURCE_DMA, 0); > - if (!r) { > - ret = -ENODEV; > - goto out1; > - } > - dmadata[PCM_TX].ddma_id = r->start; > - > - /* RX DMA */ > - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); > - if (!r) { > - ret = -ENODEV; > - goto out1; > - } > - dmadata[PCM_RX].ddma_id = r->start; > - > platform_set_drvdata(pdev, dmadata); > > ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform); > - if (!ret) > - return ret; > + if (ret) > + kfree(dmadata); > > -out1: > - kfree(dmadata); > return ret; > } > > @@ -404,57 +396,6 @@ static void __exit au1xpsc_audio_dbdma_unload(void) > module_init(au1xpsc_audio_dbdma_load); > module_exit(au1xpsc_audio_dbdma_unload); > > - > -struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev) > -{ > - struct resource *res, *r; > - struct platform_device *pd; > - int id[2]; > - int ret; > - > - r = platform_get_resource(pdev, IORESOURCE_DMA, 0); > - if (!r) > - return NULL; > - id[0] = r->start; > - > - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); > - if (!r) > - return NULL; > - id[1] = r->start; > - > - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); > - if (!res) > - return NULL; > - > - res[0].start = res[0].end = id[0]; > - res[1].start = res[1].end = id[1]; > - res[0].flags = res[1].flags = IORESOURCE_DMA; > - > - pd = platform_device_alloc("au1xpsc-pcm", pdev->id); > - if (!pd) > - goto out; > - > - pd->resource = res; > - pd->num_resources = 2; > - > - ret = platform_device_add(pd); > - if (!ret) > - return pd; > - > - platform_device_put(pd); > -out: > - kfree(res); > - return NULL; > -} > -EXPORT_SYMBOL_GPL(au1xpsc_pcm_add); > - > -void au1xpsc_pcm_destroy(struct platform_device *dmapd) > -{ > - if (dmapd) > - platform_device_unregister(dmapd); > -} > -EXPORT_SYMBOL_GPL(au1xpsc_pcm_destroy); > - > MODULE_LICENSE("GPL"); > MODULE_DESCRIPTION("Au12x0/Au1550 PSC Audio DMA driver"); > MODULE_AUTHOR("Manuel Lauss"); > diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c > index d0db66f..44296ab 100644 > --- a/sound/soc/au1x/psc-ac97.c > +++ b/sound/soc/au1x/psc-ac97.c > @@ -324,12 +324,21 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream, > return ret; > } > > +static int au1xpsc_ac97_startup(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); > + snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); > + return 0; > +} > + > static int au1xpsc_ac97_probe(struct snd_soc_dai *dai) > { > return au1xpsc_ac97_workdata ? 0 : -ENODEV; > } > > static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { > + .startup = au1xpsc_ac97_startup, > .trigger = au1xpsc_ac97_trigger, > .hw_params = au1xpsc_ac97_hw_params, > }; > @@ -379,6 +388,16 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) > if (!wd->mmio) > goto out1; > > + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); > + if (!r) > + goto out2; > + wd->dmaids[PCM_TX] = r->start; > + > + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); > + if (!r) > + goto out2; > + wd->dmaids[PCM_RX] = r->start; > + > /* configuration: max dma trigger threshold, enable ac97 */ > wd->cfg = PSC_AC97CFG_RT_FIFO8 | PSC_AC97CFG_TT_FIFO8 | > PSC_AC97CFG_DE_ENABLE; > @@ -401,15 +420,13 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) > > ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); > if (ret) > - goto out1; > + goto out2; > > - wd->dmapd = au1xpsc_pcm_add(pdev); > - if (wd->dmapd) { > - au1xpsc_ac97_workdata = wd; > - return 0; > - } > + au1xpsc_ac97_workdata = wd; > + return 0; > > - snd_soc_unregister_dai(&pdev->dev); > +out2: > + iounmap(wd->mmio); > out1: > release_mem_region(r->start, resource_size(r)); > out0: > @@ -422,9 +439,6 @@ static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev) > struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); > struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > - if (wd->dmapd) > - au1xpsc_pcm_destroy(wd->dmapd); > - > snd_soc_unregister_dai(&pdev->dev); > > /* disable PSC completely */ > diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c > index fca0912..1b7ab5d 100644 > --- a/sound/soc/au1x/psc-i2s.c > +++ b/sound/soc/au1x/psc-i2s.c > @@ -257,7 +257,16 @@ static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, > return ret; > } > > +static int au1xpsc_i2s_startup(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); > + snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); > + return 0; > +} > + > static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = { > + .startup = au1xpsc_i2s_startup, > .trigger = au1xpsc_i2s_trigger, > .hw_params = au1xpsc_i2s_hw_params, > .set_fmt = au1xpsc_i2s_set_fmt, > @@ -304,6 +313,16 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) > if (!wd->mmio) > goto out1; > > + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); > + if (!r) > + goto out2; > + wd->dmaids[PCM_TX] = r->start; It's best to use the SNDRV_PCM_STREAM_PLAYBACK and CAPTURE for these indexes. Makes the code easier to read :) > + > + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); > + if (!r) > + goto out2; > + wd->dmaids[PCM_RX] = r->start; > + > /* preserve PSC clock source set up by platform (dev.platform_data > * is already occupied by soc layer) > */ > @@ -330,15 +349,11 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) > platform_set_drvdata(pdev, wd); > > ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); > - if (ret) > - goto out1; > - > - /* finally add the DMA device for this PSC */ > - wd->dmapd = au1xpsc_pcm_add(pdev); > - if (wd->dmapd) > + if (!ret) > return 0; > > - snd_soc_unregister_dai(&pdev->dev); > +out2: > + iounmap(wd->mmio); > out1: > release_mem_region(r->start, resource_size(r)); > out0: > @@ -351,9 +366,6 @@ static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev) > struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); > struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > - if (wd->dmapd) > - au1xpsc_pcm_destroy(wd->dmapd); > - > snd_soc_unregister_dai(&pdev->dev); > > au_writel(0, I2S_CFG(wd)); > diff --git a/sound/soc/au1x/psc.h b/sound/soc/au1x/psc.h > index c59b9e5..1b21c4f 100644 > --- a/sound/soc/au1x/psc.h > +++ b/sound/soc/au1x/psc.h > @@ -19,10 +19,6 @@ > #define SUBSTREAM_TYPE(substream) \ > ((substream)->stream == SNDRV_PCM_STREAM_PLAYBACK ? PCM_TX : PCM_RX) > > -/* PSC/DBDMA helpers */ > -extern struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev); > -extern void au1xpsc_pcm_destroy(struct platform_device *dmapd); > - > struct au1xpsc_audio_data { > void __iomem *mmio; > > @@ -34,7 +30,6 @@ struct au1xpsc_audio_data { > unsigned long pm[2]; > struct mutex lock; > int dmaids[2]; > - struct platform_device *dmapd; > }; > > /* easy access macros */ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] ASoC: au1x: remove automatic DMA device registration from PSC drivers @ 2011-07-25 9:41 ` Liam Girdwood 0 siblings, 0 replies; 8+ messages in thread From: Liam Girdwood @ 2011-07-25 9:41 UTC (permalink / raw) To: alsa-devel; +Cc: Linux-MIPS, Mark Brown, alsa-devel On 24/07/11 14:11, Manuel Lauss wrote: > The PSC audio drivers (psc-ac97/psc-i2s) register the DMA platform_device > on their own. This is frowned upon, from now on board code must > register a simple pcm dma platform device for each PSC with sound duties. > > Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com> > --- > arch/mips/alchemy/devboards/db1200/platform.c | 6 ++ > sound/soc/au1x/dbdma2.c | 83 ++++--------------------- > sound/soc/au1x/psc-ac97.c | 34 +++++++--- > sound/soc/au1x/psc-i2s.c | 32 +++++++--- > sound/soc/au1x/psc.h | 5 -- > 5 files changed, 64 insertions(+), 96 deletions(-) > > diff --git a/arch/mips/alchemy/devboards/db1200/platform.c b/arch/mips/alchemy/devboards/db1200/platform.c > index fbb5593..cfb71ae 100644 > --- a/arch/mips/alchemy/devboards/db1200/platform.c > +++ b/arch/mips/alchemy/devboards/db1200/platform.c > @@ -434,12 +434,18 @@ static struct platform_device db1200_stac_dev = { > .id = 1, /* on PSC1 */ > }; > > +static struct platform_device db1200_audiodma_dev = { > + .name = "au1xpsc-pcm", > + .id = 1, /* PSC ID */ > +}; > + > static struct platform_device *db1200_devs[] __initdata = { > NULL, /* PSC0, selected by S6.8 */ > &db1200_ide_dev, > &db1200_eth_dev, > &db1200_rtc_dev, > &db1200_nand_dev, > + &db1200_audiodma_dev, > &db1200_audio_dev, > &db1200_stac_dev, > }; > diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c > index 10fdd28..cc53607 100644 > --- a/sound/soc/au1x/dbdma2.c > +++ b/sound/soc/au1x/dbdma2.c > @@ -293,6 +293,16 @@ au1xpsc_pcm_pointer(struct snd_pcm_substream *substream) > > static int au1xpsc_pcm_open(struct snd_pcm_substream *substream) > { > + struct au1xpsc_audio_dmadata *pcd = to_dmadata(substream); > + struct snd_soc_pcm_runtime *rtd = substream->private_data; > + int stype = SUBSTREAM_TYPE(substream), *dmaids; > + > + dmaids = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); > + if (!dmaids) > + return -ENODEV; /* whoa, has ordering changed? */ > + > + pcd->ddma_id = dmaids[stype]; > + > snd_soc_set_runtime_hwparams(substream, &au1xpsc_pcm_hardware); > return 0; > } > @@ -339,36 +349,18 @@ struct snd_soc_platform_driver au1xpsc_soc_platform = { > static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) > { > struct au1xpsc_audio_dmadata *dmadata; > - struct resource *r; > int ret; > > dmadata = kzalloc(2 * sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); > if (!dmadata) > return -ENOMEM; > > - r = platform_get_resource(pdev, IORESOURCE_DMA, 0); > - if (!r) { > - ret = -ENODEV; > - goto out1; > - } > - dmadata[PCM_TX].ddma_id = r->start; > - > - /* RX DMA */ > - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); > - if (!r) { > - ret = -ENODEV; > - goto out1; > - } > - dmadata[PCM_RX].ddma_id = r->start; > - > platform_set_drvdata(pdev, dmadata); > > ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform); > - if (!ret) > - return ret; > + if (ret) > + kfree(dmadata); > > -out1: > - kfree(dmadata); > return ret; > } > > @@ -404,57 +396,6 @@ static void __exit au1xpsc_audio_dbdma_unload(void) > module_init(au1xpsc_audio_dbdma_load); > module_exit(au1xpsc_audio_dbdma_unload); > > - > -struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev) > -{ > - struct resource *res, *r; > - struct platform_device *pd; > - int id[2]; > - int ret; > - > - r = platform_get_resource(pdev, IORESOURCE_DMA, 0); > - if (!r) > - return NULL; > - id[0] = r->start; > - > - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); > - if (!r) > - return NULL; > - id[1] = r->start; > - > - res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); > - if (!res) > - return NULL; > - > - res[0].start = res[0].end = id[0]; > - res[1].start = res[1].end = id[1]; > - res[0].flags = res[1].flags = IORESOURCE_DMA; > - > - pd = platform_device_alloc("au1xpsc-pcm", pdev->id); > - if (!pd) > - goto out; > - > - pd->resource = res; > - pd->num_resources = 2; > - > - ret = platform_device_add(pd); > - if (!ret) > - return pd; > - > - platform_device_put(pd); > -out: > - kfree(res); > - return NULL; > -} > -EXPORT_SYMBOL_GPL(au1xpsc_pcm_add); > - > -void au1xpsc_pcm_destroy(struct platform_device *dmapd) > -{ > - if (dmapd) > - platform_device_unregister(dmapd); > -} > -EXPORT_SYMBOL_GPL(au1xpsc_pcm_destroy); > - > MODULE_LICENSE("GPL"); > MODULE_DESCRIPTION("Au12x0/Au1550 PSC Audio DMA driver"); > MODULE_AUTHOR("Manuel Lauss"); > diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c > index d0db66f..44296ab 100644 > --- a/sound/soc/au1x/psc-ac97.c > +++ b/sound/soc/au1x/psc-ac97.c > @@ -324,12 +324,21 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream, > return ret; > } > > +static int au1xpsc_ac97_startup(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); > + snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); > + return 0; > +} > + > static int au1xpsc_ac97_probe(struct snd_soc_dai *dai) > { > return au1xpsc_ac97_workdata ? 0 : -ENODEV; > } > > static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { > + .startup = au1xpsc_ac97_startup, > .trigger = au1xpsc_ac97_trigger, > .hw_params = au1xpsc_ac97_hw_params, > }; > @@ -379,6 +388,16 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) > if (!wd->mmio) > goto out1; > > + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); > + if (!r) > + goto out2; > + wd->dmaids[PCM_TX] = r->start; > + > + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); > + if (!r) > + goto out2; > + wd->dmaids[PCM_RX] = r->start; > + > /* configuration: max dma trigger threshold, enable ac97 */ > wd->cfg = PSC_AC97CFG_RT_FIFO8 | PSC_AC97CFG_TT_FIFO8 | > PSC_AC97CFG_DE_ENABLE; > @@ -401,15 +420,13 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) > > ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); > if (ret) > - goto out1; > + goto out2; > > - wd->dmapd = au1xpsc_pcm_add(pdev); > - if (wd->dmapd) { > - au1xpsc_ac97_workdata = wd; > - return 0; > - } > + au1xpsc_ac97_workdata = wd; > + return 0; > > - snd_soc_unregister_dai(&pdev->dev); > +out2: > + iounmap(wd->mmio); > out1: > release_mem_region(r->start, resource_size(r)); > out0: > @@ -422,9 +439,6 @@ static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev) > struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); > struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > - if (wd->dmapd) > - au1xpsc_pcm_destroy(wd->dmapd); > - > snd_soc_unregister_dai(&pdev->dev); > > /* disable PSC completely */ > diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c > index fca0912..1b7ab5d 100644 > --- a/sound/soc/au1x/psc-i2s.c > +++ b/sound/soc/au1x/psc-i2s.c > @@ -257,7 +257,16 @@ static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, > return ret; > } > > +static int au1xpsc_i2s_startup(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); > + snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); > + return 0; > +} > + > static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = { > + .startup = au1xpsc_i2s_startup, > .trigger = au1xpsc_i2s_trigger, > .hw_params = au1xpsc_i2s_hw_params, > .set_fmt = au1xpsc_i2s_set_fmt, > @@ -304,6 +313,16 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) > if (!wd->mmio) > goto out1; > > + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); > + if (!r) > + goto out2; > + wd->dmaids[PCM_TX] = r->start; It's best to use the SNDRV_PCM_STREAM_PLAYBACK and CAPTURE for these indexes. Makes the code easier to read :) > + > + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); > + if (!r) > + goto out2; > + wd->dmaids[PCM_RX] = r->start; > + > /* preserve PSC clock source set up by platform (dev.platform_data > * is already occupied by soc layer) > */ > @@ -330,15 +349,11 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) > platform_set_drvdata(pdev, wd); > > ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); > - if (ret) > - goto out1; > - > - /* finally add the DMA device for this PSC */ > - wd->dmapd = au1xpsc_pcm_add(pdev); > - if (wd->dmapd) > + if (!ret) > return 0; > > - snd_soc_unregister_dai(&pdev->dev); > +out2: > + iounmap(wd->mmio); > out1: > release_mem_region(r->start, resource_size(r)); > out0: > @@ -351,9 +366,6 @@ static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev) > struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); > struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > - if (wd->dmapd) > - au1xpsc_pcm_destroy(wd->dmapd); > - > snd_soc_unregister_dai(&pdev->dev); > > au_writel(0, I2S_CFG(wd)); > diff --git a/sound/soc/au1x/psc.h b/sound/soc/au1x/psc.h > index c59b9e5..1b21c4f 100644 > --- a/sound/soc/au1x/psc.h > +++ b/sound/soc/au1x/psc.h > @@ -19,10 +19,6 @@ > #define SUBSTREAM_TYPE(substream) \ > ((substream)->stream == SNDRV_PCM_STREAM_PLAYBACK ? PCM_TX : PCM_RX) > > -/* PSC/DBDMA helpers */ > -extern struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev); > -extern void au1xpsc_pcm_destroy(struct platform_device *dmapd); > - > struct au1xpsc_audio_data { > void __iomem *mmio; > > @@ -34,7 +30,6 @@ struct au1xpsc_audio_data { > unsigned long pm[2]; > struct mutex lock; > int dmaids[2]; > - struct platform_device *dmapd; > }; > > /* easy access macros */ ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/2] ASoC: au1x: update db1200 machine to the new way of things 2011-07-24 13:11 ` Manuel Lauss @ 2011-07-24 13:11 ` Manuel Lauss -1 siblings, 0 replies; 8+ messages in thread From: Manuel Lauss @ 2011-07-24 13:11 UTC (permalink / raw) To: alsa-devel, Mark Brown; +Cc: Liam Girdwood, Linux-MIPS, Manuel Lauss The use of the "soc-audio" platform device is no longer en vogue, update the code to the newer, simpler way of doing things. Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com> --- arch/mips/alchemy/devboards/db1200/platform.c | 10 ++++ sound/soc/au1x/db1200.c | 64 +++++++++++++++++-------- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/arch/mips/alchemy/devboards/db1200/platform.c b/arch/mips/alchemy/devboards/db1200/platform.c index cfb71ae..dda090b 100644 --- a/arch/mips/alchemy/devboards/db1200/platform.c +++ b/arch/mips/alchemy/devboards/db1200/platform.c @@ -422,6 +422,7 @@ static struct resource au1200_psc1_res[] = { }, }; +/* AC97 or I2S device */ static struct platform_device db1200_audio_dev = { /* name assigned later based on switch setting */ .id = 1, /* PSC ID */ @@ -429,6 +430,12 @@ static struct platform_device db1200_audio_dev = { .resource = au1200_psc1_res, }; +/* DB1200 ASoC card device */ +static struct platform_device db1200_sound_dev = { + /* name assigned later based on switch setting */ + .id = 1, /* PSC ID */ +}; + static struct platform_device db1200_stac_dev = { .name = "ac97-codec", .id = 1, /* on PSC1 */ @@ -448,6 +455,7 @@ static struct platform_device *db1200_devs[] __initdata = { &db1200_audiodma_dev, &db1200_audio_dev, &db1200_stac_dev, + &db1200_sound_dev, }; static int __init db1200_dev_init(void) @@ -507,10 +515,12 @@ static int __init db1200_dev_init(void) if (sw == BCSR_SWITCHES_DIP_8) { bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_PSC1MUX); db1200_audio_dev.name = "au1xpsc_i2s"; + db1200_sound_dev.name = "db1200-i2s"; printk(KERN_INFO " S6.7 ON : PSC1 mode I2S\n"); } else { bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC1MUX, 0); db1200_audio_dev.name = "au1xpsc_ac97"; + db1200_sound_dev.name = "db1200-ac97"; printk(KERN_INFO " S6.7 OFF: PSC1 mode AC97\n"); } diff --git a/sound/soc/au1x/db1200.c b/sound/soc/au1x/db1200.c index 1d3e258..289312c 100644 --- a/sound/soc/au1x/db1200.c +++ b/sound/soc/au1x/db1200.c @@ -1,7 +1,7 @@ /* * DB1200 ASoC audio fabric support code. * - * (c) 2008-9 Manuel Lauss <manuel.lauss@gmail.com> + * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com> * */ @@ -21,6 +21,17 @@ #include "../codecs/wm8731.h" #include "psc.h" +static struct platform_device_id db1200_pids[] = { + { + .name = "db1200-ac97", + .driver_data = 0, + }, { + .name = "db1200-i2s", + .driver_data = 1, + }, + {}, +}; + /*------------------------- AC97 PART ---------------------------*/ static struct snd_soc_dai_link db1200_ac97_dai = { @@ -89,36 +100,47 @@ static struct snd_soc_card db1200_i2s_machine = { /*------------------------- COMMON PART ---------------------------*/ -static struct platform_device *db1200_asoc_dev; +static struct snd_soc_card *db1200_cards[] __devinitdata = { + &db1200_ac97_machine, + &db1200_i2s_machine, +}; -static int __init db1200_audio_load(void) +static int __devinit db1200_audio_probe(struct platform_device *pdev) { - int ret; + const struct platform_device_id *pid = platform_get_device_id(pdev); + struct snd_soc_card *card; - ret = -ENOMEM; - db1200_asoc_dev = platform_device_alloc("soc-audio", 1); /* PSC1 */ - if (!db1200_asoc_dev) - goto out; + card = db1200_cards[pid->driver_data]; + card->dev = &pdev->dev; + return snd_soc_register_card(card); +} - /* DB1200 board setup set PSC1MUX to preferred audio device */ - if (bcsr_read(BCSR_RESETS) & BCSR_RESETS_PSC1MUX) - platform_set_drvdata(db1200_asoc_dev, &db1200_i2s_machine); - else - platform_set_drvdata(db1200_asoc_dev, &db1200_ac97_machine); +static int __devexit db1200_audio_remove(struct platform_device *pdev) +{ + struct snd_soc_card *card = platform_get_drvdata(pdev); + snd_soc_unregister_card(card); + return 0; +} - ret = platform_device_add(db1200_asoc_dev); +static struct platform_driver db1200_audio_driver = { + .driver = { + .name = "db1200-ac97", + .owner = THIS_MODULE, + .pm = &snd_soc_pm_ops, + }, + .id_table = db1200_pids, + .probe = db1200_audio_probe, + .remove = __devexit_p(db1200_audio_remove), +}; - if (ret) { - platform_device_put(db1200_asoc_dev); - db1200_asoc_dev = NULL; - } -out: - return ret; +static int __init db1200_audio_load(void) +{ + return platform_driver_register(&db1200_audio_driver); } static void __exit db1200_audio_unload(void) { - platform_device_unregister(db1200_asoc_dev); + platform_driver_unregister(&db1200_audio_driver); } module_init(db1200_audio_load); -- 1.7.6 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] ASoC: au1x: update db1200 machine to the new way of things @ 2011-07-24 13:11 ` Manuel Lauss 0 siblings, 0 replies; 8+ messages in thread From: Manuel Lauss @ 2011-07-24 13:11 UTC (permalink / raw) To: alsa-devel; +Cc: Linux-MIPS, Manuel Lauss, Liam Girdwood The use of the "soc-audio" platform device is no longer en vogue, update the code to the newer, simpler way of doing things. Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com> --- arch/mips/alchemy/devboards/db1200/platform.c | 10 ++++ sound/soc/au1x/db1200.c | 64 +++++++++++++++++-------- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/arch/mips/alchemy/devboards/db1200/platform.c b/arch/mips/alchemy/devboards/db1200/platform.c index cfb71ae..dda090b 100644 --- a/arch/mips/alchemy/devboards/db1200/platform.c +++ b/arch/mips/alchemy/devboards/db1200/platform.c @@ -422,6 +422,7 @@ static struct resource au1200_psc1_res[] = { }, }; +/* AC97 or I2S device */ static struct platform_device db1200_audio_dev = { /* name assigned later based on switch setting */ .id = 1, /* PSC ID */ @@ -429,6 +430,12 @@ static struct platform_device db1200_audio_dev = { .resource = au1200_psc1_res, }; +/* DB1200 ASoC card device */ +static struct platform_device db1200_sound_dev = { + /* name assigned later based on switch setting */ + .id = 1, /* PSC ID */ +}; + static struct platform_device db1200_stac_dev = { .name = "ac97-codec", .id = 1, /* on PSC1 */ @@ -448,6 +455,7 @@ static struct platform_device *db1200_devs[] __initdata = { &db1200_audiodma_dev, &db1200_audio_dev, &db1200_stac_dev, + &db1200_sound_dev, }; static int __init db1200_dev_init(void) @@ -507,10 +515,12 @@ static int __init db1200_dev_init(void) if (sw == BCSR_SWITCHES_DIP_8) { bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_PSC1MUX); db1200_audio_dev.name = "au1xpsc_i2s"; + db1200_sound_dev.name = "db1200-i2s"; printk(KERN_INFO " S6.7 ON : PSC1 mode I2S\n"); } else { bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC1MUX, 0); db1200_audio_dev.name = "au1xpsc_ac97"; + db1200_sound_dev.name = "db1200-ac97"; printk(KERN_INFO " S6.7 OFF: PSC1 mode AC97\n"); } diff --git a/sound/soc/au1x/db1200.c b/sound/soc/au1x/db1200.c index 1d3e258..289312c 100644 --- a/sound/soc/au1x/db1200.c +++ b/sound/soc/au1x/db1200.c @@ -1,7 +1,7 @@ /* * DB1200 ASoC audio fabric support code. * - * (c) 2008-9 Manuel Lauss <manuel.lauss@gmail.com> + * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com> * */ @@ -21,6 +21,17 @@ #include "../codecs/wm8731.h" #include "psc.h" +static struct platform_device_id db1200_pids[] = { + { + .name = "db1200-ac97", + .driver_data = 0, + }, { + .name = "db1200-i2s", + .driver_data = 1, + }, + {}, +}; + /*------------------------- AC97 PART ---------------------------*/ static struct snd_soc_dai_link db1200_ac97_dai = { @@ -89,36 +100,47 @@ static struct snd_soc_card db1200_i2s_machine = { /*------------------------- COMMON PART ---------------------------*/ -static struct platform_device *db1200_asoc_dev; +static struct snd_soc_card *db1200_cards[] __devinitdata = { + &db1200_ac97_machine, + &db1200_i2s_machine, +}; -static int __init db1200_audio_load(void) +static int __devinit db1200_audio_probe(struct platform_device *pdev) { - int ret; + const struct platform_device_id *pid = platform_get_device_id(pdev); + struct snd_soc_card *card; - ret = -ENOMEM; - db1200_asoc_dev = platform_device_alloc("soc-audio", 1); /* PSC1 */ - if (!db1200_asoc_dev) - goto out; + card = db1200_cards[pid->driver_data]; + card->dev = &pdev->dev; + return snd_soc_register_card(card); +} - /* DB1200 board setup set PSC1MUX to preferred audio device */ - if (bcsr_read(BCSR_RESETS) & BCSR_RESETS_PSC1MUX) - platform_set_drvdata(db1200_asoc_dev, &db1200_i2s_machine); - else - platform_set_drvdata(db1200_asoc_dev, &db1200_ac97_machine); +static int __devexit db1200_audio_remove(struct platform_device *pdev) +{ + struct snd_soc_card *card = platform_get_drvdata(pdev); + snd_soc_unregister_card(card); + return 0; +} - ret = platform_device_add(db1200_asoc_dev); +static struct platform_driver db1200_audio_driver = { + .driver = { + .name = "db1200-ac97", + .owner = THIS_MODULE, + .pm = &snd_soc_pm_ops, + }, + .id_table = db1200_pids, + .probe = db1200_audio_probe, + .remove = __devexit_p(db1200_audio_remove), +}; - if (ret) { - platform_device_put(db1200_asoc_dev); - db1200_asoc_dev = NULL; - } -out: - return ret; +static int __init db1200_audio_load(void) +{ + return platform_driver_register(&db1200_audio_driver); } static void __exit db1200_audio_unload(void) { - platform_device_unregister(db1200_asoc_dev); + platform_driver_unregister(&db1200_audio_driver); } module_init(db1200_audio_load); -- 1.7.6 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2011-07-25 9:41 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-07-24 13:11 [PATCH 0/2] ASoC: au1x: update PSC AC97/I2S code Manuel Lauss 2011-07-24 13:11 ` Manuel Lauss 2011-07-24 13:11 ` [PATCH 1/2] ASoC: au1x: remove automatic DMA device registration from PSC drivers Manuel Lauss 2011-07-24 13:11 ` Manuel Lauss 2011-07-25 9:41 ` Liam Girdwood 2011-07-25 9:41 ` Liam Girdwood 2011-07-24 13:11 ` [PATCH 2/2] ASoC: au1x: update db1200 machine to the new way of things Manuel Lauss 2011-07-24 13:11 ` Manuel Lauss
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.