OSDN Git Service

ASoC: samsung: use irq resource for idma
authorArnd Bergmann <arnd@arndb.de>
Thu, 11 Apr 2013 00:05:01 +0000 (02:05 +0200)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 11 Apr 2013 16:51:30 +0000 (17:51 +0100)
With multiplatform kernels, we cannot use hardwired IRQ
numbers in device drivers. This changes the idma driver
to use a proper resource, like all other drivers do.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
arch/arm/plat-samsung/devs.c
sound/soc/samsung/idma.c

index 51afedd..d81d9fb 100644 (file)
@@ -146,14 +146,20 @@ struct platform_device s3c_device_camif = {
 
 /* ASOC DMA */
 
+#ifdef CONFIG_PLAT_S5P 
+static struct resource samsung_asoc_idma_resource = DEFINE_RES_IRQ(IRQ_I2S0);
+
 struct platform_device samsung_asoc_idma = {
        .name           = "samsung-idma",
        .id             = -1,
+       .num_resources  = 1,
+       .resource       = &samsung_asoc_idma_resource,
        .dev            = {
                .dma_mask               = &samsung_device_dma_mask,
                .coherent_dma_mask      = DMA_BIT_MASK(32),
        }
 };
+#endif
 
 /* FB */
 
index a07950b..f36a541 100644 (file)
@@ -68,6 +68,8 @@ static struct idma_info {
        dma_addr_t      lp_tx_addr;
 } idma;
 
+static int idma_irq;
+
 static void idma_getpos(dma_addr_t *src)
 {
        *src = idma.lp_tx_addr +
@@ -305,7 +307,7 @@ static int idma_open(struct snd_pcm_substream *substream)
        if (prtd == NULL)
                return -ENOMEM;
 
-       ret = request_irq(IRQ_I2S0, iis_irq, 0, "i2s", prtd);
+       ret = request_irq(idma_irq, iis_irq, 0, "i2s", prtd);
        if (ret < 0) {
                pr_err("fail to claim i2s irq , ret = %d\n", ret);
                kfree(prtd);
@@ -324,7 +326,7 @@ static int idma_close(struct snd_pcm_substream *substream)
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct idma_ctrl *prtd = runtime->private_data;
 
-       free_irq(IRQ_I2S0, prtd);
+       free_irq(idma_irq, prtd);
 
        if (!prtd)
                pr_err("idma_close called with prtd == NULL\n");
@@ -418,6 +420,10 @@ static struct snd_soc_platform_driver asoc_idma_platform = {
 
 static int asoc_idma_platform_probe(struct platform_device *pdev)
 {
+       idma_irq = platform_get_irq(pdev, 0);
+       if (idma_irq < 0)
+               return idma_irq;
+
        return snd_soc_register_platform(&pdev->dev, &asoc_idma_platform);
 }