dmaengine: shdma: modify the DMAC Address Error registration
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
@@ -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
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 callsrequest_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 theIRQF_DISABLEDto 0.
Quoted 8 lines
Signed-off-by Yoshihiro Shimoda <[email protected]>---
about v4:
- use defination macros for IRQ resourcedrivers/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.