dmaengine: ppc4xx: convert irq_of_parse_and_map to platform_get_irq
PATCH v4 1/1 dmaengine: ppc4xx: convert irq_of_parse_and_map to platform_get_irq
Replace irq_of_parse_and_map() with platform_get_irq(), which is the preferred way to obtain IRQ resources from platform devices. This eliminates the corresponding irq_dispose_mapping() calls since the framework manages the mapping. Also allows dealing with -EPROBE_DEFER.
While here, fix a latent bug in the err_req2 error path: the error IRQ was not freed when a subsequent step (I2O setup) failed.
The struct device_node *np declaration is moved to the scope where it is still needed (I2O register lookup).
---
v4: handle -EPROBE_DEFER
v3: use _optional
v2: fix missing free_irq in remove and fix description
drivers/dma/ppc4xx/adma.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-)
drivers/dma/ppc4xx/adma.c +18 -21
@@ -3865,28 +3865,28 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev, int *initcode) {struct platform_device *ofdev; -struct device_node *np;int ret; ofdev = container_of(adev->dev, struct platform_device, dev); - np = ofdev->dev.of_node;if (adev->id !=PPC440SPE_XOR_ID ) { - adev->err_irq =irq_of_parse_and_map (np,1 ); -if (!adev->err_irq) { + adev->err_irq =platform_get_irq_optional (ofdev,1 ); +if (adev->err_irq == -EPROBE_DEFER ) { + ret = adev->err_irq; + goto err_irq_map; + } +if (adev->err_irq <=0 ) {dev_warn (adev->dev,"no err irq resource?\n" ); *initcode =PPC_ADMA_INIT_IRQ2 ; - adev->err_irq = -ENXIO ; }else atomic_inc (&ppc440spe_adma_err_irq_ref); }else { adev->err_irq = -ENXIO ; } - adev->irq =irq_of_parse_and_map (np,0 ); -if (!adev->irq) { -dev_err (adev->dev,"no irq resource\n" ); + adev->irq =platform_get_irq (ofdev,0 ); +if (adev->irq <0 ) { *initcode =PPC_ADMA_INIT_IRQ1 ; - ret = -ENXIO ; + ret = adev->irq; goto err_irq_map; } dev_dbg(adev->dev, "irq %d, err irq %d\n",
@@ -3899,7 +3899,7 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev, adev->irq); *initcode =PPC_ADMA_INIT_IRQ1 ; ret = -EIO ; - goto err_req1; + goto err_irq_map; }/* only DMA engines have a separate error IRQ
@@ -3917,7 +3917,7 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev, adev->err_irq); *initcode =PPC_ADMA_INIT_IRQ2 ; ret = -EIO ; - goto err_req2; + goto err_req1; } }
@@ -3927,6 +3927,7 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev,XOR_IE_ICIE_BIT |XOR_IE_RPTIE_BIT , &adev->xor_reg->ier); }else { +struct device_node *np;u32 mask, enable; np =of_find_compatible_node (NULL ,NULL ,"ibm,i2o-440spe" );
@@ -3956,14 +3957,13 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev,return 0 ; err_req2: -free_irq (adev->irq, chan); +if (adev->err_irq >0 ) +free_irq (adev->err_irq, chan); err_req1: -irq_dispose_mapping (adev->irq); +free_irq (adev->irq, chan); err_irq_map: -if (adev->err_irq >0 ) { -if (atomic_dec_and_test (&ppc440spe_adma_err_irq_ref)) -irq_dispose_mapping (adev->err_irq); - } +if (adev->err_irq >0 ) +atomic_dec (&ppc440spe_adma_err_irq_ref);return ret; }
@@ -3987,13 +3987,10 @@ static void ppc440spe_adma_release_irqs(struct ppc440spe_adma_device *adev,iowrite32 (mask, &adev->i2o_reg->iopim); }free_irq (adev->irq, chan); -irq_dispose_mapping (adev->irq);if (adev->err_irq >0 ) {free_irq (adev->err_irq, chan); -if (atomic_dec_and_test (&ppc440spe_adma_err_irq_ref)) { -irq_dispose_mapping (adev->err_irq); +if (atomic_dec_and_test (&ppc440spe_adma_err_irq_ref))iounmap (adev->i2o_reg); - } } }
Signature · 1 line
2.55.0
Quoted 8 lines · Rosen Penev
Replace
irq_of_parse_and_map()withplatform_get_irq(), which is the preferred way to obtain IRQ resources from platform devices. This eliminates the correspondingirq_dispose_mapping()calls since the framework manages the mapping. Also allows dealing with -EPROBE_DEFER.While here, fix a latent bug in the
err_req2error path: the error IRQ was not freed when a subsequent step (I2O setup) failed.
Quoted 6 lines
The struct
device_node*np declaration is moved to the scope where it is still needed (I2O register lookup).Assisted-by opencode:big-pickleSigned-off-by Rosen Penev <[email protected]>---
Quoted 112 lines
v4: handle -EPROBE_DEFER
v3: use_optional
v2: fix missingfree_irqin remove and fix descriptiondrivers/dma/ppc4xx/adma.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-)drivers/dma/ppc4xx/adma.c +18
-22@@ -3865,28 +3865,28 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev, int *initcode) {struct platform_device *ofdev; -struct device_node *np;int ret; ofdev = container_of(adev->dev, struct platform_device, dev); - np = ofdev->dev.of_node;if (adev->id !=PPC440SPE_XOR_ID ) { - adev->err_irq =irq_of_parse_and_map (np,1 ); -if (!adev->err_irq) { + adev->err_irq =platform_get_irq_optional (ofdev,1 ); +if (adev->err_irq == -EPROBE_DEFER ) { + ret = adev->err_irq; + goto err_irq_map; + } +if (adev->err_irq <=0 ) {dev_warn (adev->dev,"no err irq resource?\n" ); *initcode =PPC_ADMA_INIT_IRQ2 ; - adev->err_irq = -ENXIO ; }else atomic_inc (&ppc440spe_adma_err_irq_ref); }else { adev->err_irq = -ENXIO ; } - adev->irq =irq_of_parse_and_map (np,0 ); -if (!adev->irq) { -dev_err (adev->dev,"no irq resource\n" ); + adev->irq =platform_get_irq (ofdev,0 ); +if (adev->irq <0 ) { *initcode =PPC_ADMA_INIT_IRQ1 ; - ret = -ENXIO ; + ret = adev->irq; goto err_irq_map; } dev_dbg(adev->dev, "irq %d, err irq %d\n",@@ -3899,7 +3899,7 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev, adev->irq); *initcode =PPC_ADMA_INIT_IRQ1 ; ret = -EIO ; - goto err_req1; + goto err_irq_map; }/* only DMA engines have a separate error IRQ @@ -3917,7 +3917,7 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev, adev->err_irq); *initcode =PPC_ADMA_INIT_IRQ2 ; ret = -EIO ; - goto err_req2; + goto err_req1; } }@@ -3927,6 +3927,7 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev,XOR_IE_ICIE_BIT |XOR_IE_RPTIE_BIT , &adev->xor_reg->ier); }else { +struct device_node *np;u32 mask, enable; np =of_find_compatible_node (NULL ,NULL ,"ibm,i2o-440spe" );@@ -3956,14 +3957,13 @@ static int ppc440spe_adma_setup_irqs(struct ppc440spe_adma_device *adev,return 0 ; err_req2: -free_irq (adev->irq, chan); +if (adev->err_irq >0 ) +free_irq (adev->err_irq, chan); err_req1: -irq_dispose_mapping (adev->irq); +free_irq (adev->irq, chan); err_irq_map: -if (adev->err_irq >0 ) { -if (atomic_dec_and_test (&ppc440spe_adma_err_irq_ref)) -irq_dispose_mapping (adev->err_irq); - } +if (adev->err_irq >0 ) +atomic_dec (&ppc440spe_adma_err_irq_ref);return ret; }@@ -3987,13 +3987,10 @@ static void ppc440spe_adma_release_irqs(struct ppc440spe_adma_device *adev,iowrite32 (mask, &adev->i2o_reg->iopim); }free_irq (adev->irq, chan); -irq_dispose_mapping (adev->irq);if (adev->err_irq >0 ) {free_irq (adev->err_irq, chan); -if (atomic_dec_and_test (&ppc440spe_adma_err_irq_ref)) { -irq_dispose_mapping (adev->err_irq); +if (atomic_dec_and_test (&ppc440spe_adma_err_irq_ref))iounmap (adev->i2o_reg); - } } } --2.55.0