Skip to contentSkip to conversation

dmaengine: shdma: modify the DMAC Address Error registration

PATCH In review Shimoda, Yoshihiro 2 participants 2 messages Jan 11, 2012 – Jan 12, 2012

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v4 4/6 dmaengine: shdma: modify the DMAC Address Error registration

The USB-DMAC/SUDMAC don't have the interrupt of DMAC Address Error. So, only if the IRQ resource has a name of SH_DMA_IRQ_ERROR, the driver calls request_irq() for DMAC Address Error.

This patch is also useful for the generic DMAC which doesn't have DMAC Address Error. So, we can get rid of the "CPU_SH4 || ARCH_SHMOBILE" ifdefs.
This patch also changes the IRQF_DISABLED to 0.

---
about v4:
- use defination macros for IRQ resource

 drivers/dma/shdma.c |   73 +++++++++++++++++++++++++--------------------------
 1 files changed, 36 insertions(+), 37 deletions(-)
drivers/dma/shdma.c +36 -37
index 81809c2..5260dac 100644
@@ -1149,9 +1149,9 @@ static void sh_dmae_chan_remove(struct sh_dmae_device *shdev)
 static int __init sh_dmae_probe(struct platform_device *pdev)
 {
 	struct sh_dmae_pdata *pdata = pdev->dev.platform_data;
-	unsigned long irqflags = IRQF_DISABLED,
+	unsigned long irqflags = 0,
 		chan_flag[SH_DMAC_MAX_CHANNELS] = {};
-	int errirq, chan_irq[SH_DMAC_MAX_CHANNELS];
+	int errirq = 0, chan_irq[SH_DMAC_MAX_CHANNELS];
 	int err, i, irq_cnt = 0, irqres = 0, irq_cap = 0;
 	struct sh_dmae_device *shdev;
 	struct resource *chan, *dmars, *errirq_res, *chanirq_res;
@@ -1179,8 +1179,11 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
 	 *    specify IORESOURCE_IRQ_SHAREABLE in their resources, they will be
 	 *    requested with the IRQF_SHARED flag
 	 */
-	errirq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-	if (!chan || !errirq_res)
+	errirq_res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
+						  SH_DMA_IRQ_ERROR);
+	chanirq_res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
+						   SH_DMA_IRQ_CHANNEL);
+	if (!chan || (!errirq_res && !chanirq_res))
 		return -ENODEV;
 
 	if (!request_mem_region(chan->start, resource_size(chan), pdev->name)) {
@@ -1258,33 +1261,29 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
 	/* Default transfer size of 32 bytes requires 32-byte alignment */
 	shdev->common.copy_align = LOG2_DEFAULT_XFER_SIZE;
 
-#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
-	chanirq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
-
-	if (!chanirq_res)
-		chanirq_res = errirq_res;
-	else
-		irqres++;
-
-	if (chanirq_res = errirq_res ||
-	    (errirq_res->flags & IORESOURCE_BITS) = IORESOURCE_IRQ_SHAREABLE)
-		irqflags = IRQF_SHARED;
-
-	errirq = errirq_res->start;
-
-	err = request_irq(errirq, sh_dmae_err, irqflags,
-			  "DMAC Address Error", shdev);
-	if (err) {
-		dev_err(&pdev->dev,
-			"DMA failed requesting irq #%d, error %d\n",
-			errirq, err);
-		goto eirq_err;
+	if (errirq_res) {
+		if (!chanirq_res)
+			chanirq_res = errirq_res;
+		else
+			irqres++;
+
+		if (chanirq_res = errirq_res ||
+		    (errirq_res->flags & IORESOURCE_BITS) =
+		    IORESOURCE_IRQ_SHAREABLE)
+			irqflags = IRQF_SHARED;
+
+		errirq = errirq_res->start;
+
+		err = request_irq(errirq, sh_dmae_err, irqflags,
+				  "DMAC Address Error", shdev);
+		if (err) {
+			dev_err(&pdev->dev,
+				"DMA failed requesting irq #%d, error %d\n",
+				errirq, err);
+			goto eirq_err;
+		}
 	}
 
-#else
-	chanirq_res = errirq_res;
-#endif /* CONFIG_CPU_SH4 || CONFIG_ARCH_SHMOBILE */
-
 	if (chanirq_res->start = chanirq_res->end &&
 	    !platform_get_resource(pdev, IORESOURCE_IRQ, 1)) {
 		/* Special case - all multiplexed */
@@ -1305,11 +1304,11 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
 					break;
 				}
 
-				if ((errirq_res->flags & IORESOURCE_BITS) =
+				if ((chanirq_res->flags & IORESOURCE_BITS) =
 				    IORESOURCE_IRQ_SHAREABLE)
 					chan_flag[irq_cnt] = IRQF_SHARED;
 				else
-					chan_flag[irq_cnt] = IRQF_DISABLED;
+					chan_flag[irq_cnt] = 0;
 				dev_dbg(&pdev->dev,
 					"Found IRQ %d for channel %d\n",
 					i, irq_cnt);
@@ -1345,10 +1344,9 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
 chan_probe_err:
 	sh_dmae_chan_remove(shdev);
 
-#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
-	free_irq(errirq, shdev);
+	if (errirq_res)
+		free_irq(errirq, shdev);
 eirq_err:
-#endif
 rst_err:
 	spin_lock_irq(&sh_dmae_lock);
 	list_del_rcu(&shdev->node);
@@ -1379,12 +1377,13 @@ static int __exit sh_dmae_remove(struct platform_device *pdev)
 {
 	struct sh_dmae_device *shdev = platform_get_drvdata(pdev);
 	struct resource *res;
-	int errirq = platform_get_irq(pdev, 0);
+	struct resource *errirq_res = platform_get_resource_byname(pdev,
+					IORESOURCE_IRQ, SH_DMA_IRQ_ERROR);
 
 	dma_async_device_unregister(&shdev->common);
 
-	if (errirq > 0)
-		free_irq(errirq, shdev);
+	if (errirq_res)
+		free_irq(errirq_res->start, shdev);
 
 	spin_lock_irq(&sh_dmae_lock);
 	list_del_rcu(&shdev->node);
Signature · 1 line
1.7.1
#1 lore raw
Quoted 9 lines · Yoshihiro

The USB-DMAC/SUDMAC don't have the interrupt of DMAC Address Error. So, only if the IRQ resource has a name of SH_DMA_IRQ_ERROR, the driver calls request_irq() for DMAC Address Error.

This patch is also useful for the generic DMAC which doesn't have DMAC Address Error. So, we can get rid of the "CPU_SH4 || ARCH_SHMOBILE" ifdefs.
This patch also changes the IRQF_DISABLED to 0.

Quoted 8 lines

---
about v4:
- use defination macros for IRQ resource

 drivers/dma/shdma.c |   73 +++++++++++++++++++++++++--------------------------
 1 files changed, 36 insertions(+), 37 deletions(-)

I do like the idea of the _byname() variants for the channel and error resource at least, but they are separate patches. I don't particularly like mixing the channel stuff in with the DMA address error changes, since they are fundamentally different changes.

If we go with the v3 patches for fixing up the address error case then you should be able to trivially layer on the channel resource cleanup on top of that, which in turn will require another string patch for ARM/sh naming the channel resources explicitly.