[ Upstream commit fc22771547e7e8a63679f0218e943d72b107de65 ]

Noted in review by Dave Emett for V3D 4.2 support.

Signed-off-by: Eric Anholt <e...@anholt.net>
Link: 
https://patchwork.freedesktop.org/patch/msgid/20190308174336.7866-1-e...@anholt.net
Reviewed-by: Dave Emett <david.em...@broadcom.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/gpu/drm/v3d/v3d_drv.c |  8 ++++++--
 drivers/gpu/drm/v3d/v3d_drv.h |  2 +-
 drivers/gpu/drm/v3d/v3d_irq.c | 13 +++++++++++--
 3 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index f0afcec72c348..30ae1c74edaa8 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -312,14 +312,18 @@ static int v3d_platform_drm_probe(struct platform_device 
*pdev)
        if (ret)
                goto dev_destroy;
 
-       v3d_irq_init(v3d);
+       ret = v3d_irq_init(v3d);
+       if (ret)
+               goto gem_destroy;
 
        ret = drm_dev_register(drm, 0);
        if (ret)
-               goto gem_destroy;
+               goto irq_disable;
 
        return 0;
 
+irq_disable:
+       v3d_irq_disable(v3d);
 gem_destroy:
        v3d_gem_destroy(drm);
 dev_destroy:
diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h
index fdda3037f7af7..2fdb456b72d32 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
@@ -310,7 +310,7 @@ void v3d_reset(struct v3d_dev *v3d);
 void v3d_invalidate_caches(struct v3d_dev *v3d);
 
 /* v3d_irq.c */
-void v3d_irq_init(struct v3d_dev *v3d);
+int v3d_irq_init(struct v3d_dev *v3d);
 void v3d_irq_enable(struct v3d_dev *v3d);
 void v3d_irq_disable(struct v3d_dev *v3d);
 void v3d_irq_reset(struct v3d_dev *v3d);
diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c
index 69338da70ddce..29d746cfce572 100644
--- a/drivers/gpu/drm/v3d/v3d_irq.c
+++ b/drivers/gpu/drm/v3d/v3d_irq.c
@@ -156,7 +156,7 @@ v3d_hub_irq(int irq, void *arg)
        return status;
 }
 
-void
+int
 v3d_irq_init(struct v3d_dev *v3d)
 {
        int ret, core;
@@ -173,13 +173,22 @@ v3d_irq_init(struct v3d_dev *v3d)
        ret = devm_request_irq(v3d->dev, platform_get_irq(v3d->pdev, 0),
                               v3d_hub_irq, IRQF_SHARED,
                               "v3d_hub", v3d);
+       if (ret)
+               goto fail;
+
        ret = devm_request_irq(v3d->dev, platform_get_irq(v3d->pdev, 1),
                               v3d_irq, IRQF_SHARED,
                               "v3d_core0", v3d);
        if (ret)
-               dev_err(v3d->dev, "IRQ setup failed: %d\n", ret);
+               goto fail;
 
        v3d_irq_enable(v3d);
+       return 0;
+
+fail:
+       if (ret != -EPROBE_DEFER)
+               dev_err(v3d->dev, "IRQ setup failed: %d\n", ret);
+       return ret;
 }
 
 void
-- 
2.20.1



Reply via email to