[PATCH 2/3] i2c: ibm_iic: get the irq early in probe
Rosen Penev <[email protected]>
| Newsgroups | org.kernel.vger.linux-i2c,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
platform_get_irq() can return -EPROBE_DEFER, unlike irq_of_map_and_parse(), which helps reduce work done during probe. Signed-off-by: Rosen Penev <[email protected]> --- drivers/i2c/busses/i2c-ibm_iic.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c index 043cb64a2544..2730c8410167 100644 --- a/drivers/i2c/busses/i2c-ibm_iic.c +++ b/drivers/i2c/busses/i2c-ibm_iic.c @@ -649,20 +649,11 @@ static inline u8 iic_clckdiv(unsigned int opb) } static int iic_request_irq(struct platform_device *ofdev, - struct ibm_iic_private *dev) + struct ibm_iic_private *dev, int irq) { - struct device_node *np = ofdev->dev.of_node; - int irq; - if (iic_force_poll) return 0; - irq = irq_of_parse_and_map(np, 0); - if (!irq) { - dev_err(&ofdev->dev, "irq_of_parse_and_map failed\n"); - return 0; - } - /* Disable interrupts until we finish initialization, assumes * level-sensitive IRQ setup... */ @@ -686,12 +677,19 @@ static int iic_probe(struct platform_device *ofdev) struct i2c_adapter *adap; void __iomem *vaddr; const u32 *freq; + int irq; int ret; vaddr = devm_platform_ioremap_resource(ofdev, 0); if (IS_ERR(vaddr)) return PTR_ERR(vaddr); + irq = platform_get_irq(ofdev, 0); + if (irq == -EPROBE_DEFER) + return irq; + if (irq < 0) + dev_warn(&ofdev->dev, "using polling mode\n"); + dev = kzalloc_obj(*dev); if (!dev) return -ENOMEM; @@ -702,9 +700,8 @@ static int iic_probe(struct platform_device *ofdev) init_waitqueue_head(&dev->wq); - dev->irq = iic_request_irq(ofdev, dev); - if (!dev->irq) - dev_warn(&ofdev->dev, "using polling mode\n"); + if (irq > 0) + dev->irq = iic_request_irq(ofdev, dev, irq); /* Board specific settings */ if (iic_force_fast || of_get_property(np, "fast-mode", NULL)) -- 2.55.0