On Mon, 18 May 2009 15:23:05 +0100, Mark Brown broonie@opensource.wolfsonmicro.com wrote:
+static int txx9aclc_ac97_probe(struct platform_device *pdev,
struct snd_soc_dai *dai)
...
- irq = platform_get_irq(aclc_pdev, 0);
This isn't what I meant by moving the resources to the DAI and DMA drivers. You have moved the calls to read the resources to these drivers (which is good) but the resources are still being obtained from the main ASoC device rather than by themselves from the device code.
There aren't too many platforms using this approach yet but take a look at the way the pxa2xx-ac97 driver deals with registering the DAI (it doesn't do anything with resources ATM) - you want to be registering your DAI and grabbing the resources from a platform driver probe like it does.
Thank you for elaboration. Then, this untested patch (on top of the last patch) is what you mean? If yes, I will split this into arch part and driver part, and then update both patches.
arch/mips/txx9/generic/setup.c | 6 +++--- arch/mips/txx9/rbtx4927/setup.c | 1 + arch/mips/txx9/rbtx4938/setup.c | 1 + arch/mips/txx9/rbtx4939/setup.c | 1 + sound/soc/txx9/txx9aclc-ac97.c | 28 +++++++++++++++++++++++++--- sound/soc/txx9/txx9aclc-generic.c | 1 - 6 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index bc358ab..7f91012 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c @@ -882,8 +882,8 @@ void __init txx9_aclc_init(unsigned long baseaddr, int irq, unsigned int dma_chan_out, unsigned int dma_chan_in) { -#if defined(CONFIG_SND_SOC_TXX9ACLC_GENERIC) || \ - defined(CONFIG_SND_SOC_TXX9ACLC_GENERIC_MODULE) +#if defined(CONFIG_SND_SOC_TXX9ACLC) || \ + defined(CONFIG_SND_SOC_TXX9ACLC_MODULE) unsigned int dma_base = dmac_id * TXX9_DMA_MAX_NR_CHANNELS; struct resource res[] = { { @@ -904,7 +904,7 @@ void __init txx9_aclc_init(unsigned long baseaddr, int irq, } }; struct platform_device *pdev = - platform_device_alloc("txx9aclc-generic", -1); + platform_device_alloc("txx9aclc-ac97", -1);
if (!pdev || platform_device_add_resources(pdev, res, ARRAY_SIZE(res)) || diff --git a/arch/mips/txx9/rbtx4927/setup.c b/arch/mips/txx9/rbtx4927/setup.c index ece43db..ee468ea 100644 --- a/arch/mips/txx9/rbtx4927/setup.c +++ b/arch/mips/txx9/rbtx4927/setup.c @@ -344,6 +344,7 @@ static void __init rbtx4927_device_init(void) tx4938_dmac_init(0, 2); tx4938_aclc_init(); } + platform_device_register_simple("txx9aclc-generic", -1, NULL, 0); txx9_iocled_init(RBTX4927_LED_ADDR - IO_BASE, -1, 3, 1, "green", NULL); rbtx4927_gpioled_init(); } diff --git a/arch/mips/txx9/rbtx4938/setup.c b/arch/mips/txx9/rbtx4938/setup.c index c0aa889..8da66e9 100644 --- a/arch/mips/txx9/rbtx4938/setup.c +++ b/arch/mips/txx9/rbtx4938/setup.c @@ -357,6 +357,7 @@ static void __init rbtx4938_device_init(void) tx4938_ata_init(RBTX4938_IRQ_IOC_ATA, 0, 1); tx4938_dmac_init(0, 2); tx4938_aclc_init(); + platform_device_register_simple("txx9aclc-generic", -1, NULL, 0); txx9_iocled_init(RBTX4938_LED_ADDR - IO_BASE, -1, 8, 1, "green", NULL); }
diff --git a/arch/mips/txx9/rbtx4939/setup.c b/arch/mips/txx9/rbtx4939/setup.c index 1d01126..d5ad5ab 100644 --- a/arch/mips/txx9/rbtx4939/setup.c +++ b/arch/mips/txx9/rbtx4939/setup.c @@ -500,6 +500,7 @@ static void __init rbtx4939_device_init(void) tx4939_rtc_init(); tx4939_dmac_init(0, 2); tx4939_aclc_init(); + platform_device_register_simple("txx9aclc-generic", -1, NULL, 0); }
static void __init rbtx4939_setup(void) diff --git a/sound/soc/txx9/txx9aclc-ac97.c b/sound/soc/txx9/txx9aclc-ac97.c index 5e04409..f198104 100644 --- a/sound/soc/txx9/txx9aclc-ac97.c +++ b/sound/soc/txx9/txx9aclc-ac97.c @@ -155,11 +155,12 @@ static int txx9aclc_ac97_probe(struct platform_device *pdev, struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct txx9aclc_soc_device *dev = container_of(socdev, struct txx9aclc_soc_device, soc_dev); - struct platform_device *aclc_pdev = dev->aclc_pdev; + struct platform_device *aclc_pdev = to_platform_device(dai->dev); struct resource *r; int err; int irq;
+ dev->aclc_pdev = aclc_pdev; dev->irq = -1; irq = platform_get_irq(aclc_pdev, 0); if (irq < 0) @@ -225,14 +226,35 @@ struct snd_soc_dai txx9aclc_ac97_dai = { }; EXPORT_SYMBOL_GPL(txx9aclc_ac97_dai);
-static int __init txx9aclc_ac97_init(void) +static int __devinit txx9aclc_ac97_dev_probe(struct platform_device *pdev) { + txx9aclc_ac97_dai.dev = &pdev->dev; return snd_soc_register_dai(&txx9aclc_ac97_dai); }
-static void __exit txx9aclc_ac97_exit(void) +static int __devexit txx9aclc_ac97_dev_remove(struct platform_device *pdev) { snd_soc_unregister_dai(&txx9aclc_ac97_dai); + return 0; +} + +static struct platform_driver txx9aclc_ac97_driver = { + .probe = txx9aclc_ac97_dev_probe, + .remove = __devexit_p(txx9aclc_ac97_dev_remove), + .driver = { + .name = "txx9aclc-ac97", + .owner = THIS_MODULE, + }, +}; + +static int __init txx9aclc_ac97_init(void) +{ + return platform_driver_register(&txx9aclc_ac97_driver); +} + +static void __exit txx9aclc_ac97_exit(void) +{ + platform_driver_unregister(&txx9aclc_ac97_driver); }
module_init(txx9aclc_ac97_init); diff --git a/sound/soc/txx9/txx9aclc-generic.c b/sound/soc/txx9/txx9aclc-generic.c index d27aba6..3175de9 100644 --- a/sound/soc/txx9/txx9aclc-generic.c +++ b/sound/soc/txx9/txx9aclc-generic.c @@ -54,7 +54,6 @@ static int __init txx9aclc_generic_probe(struct platform_device *pdev) return -ENOMEM; platform_set_drvdata(soc_pdev, &dev->soc_dev); dev->soc_dev.dev = &soc_pdev->dev; - dev->aclc_pdev = pdev; ret = platform_device_add(soc_pdev); if (ret) { platform_device_put(soc_pdev);
--- Atsushi Nemoto