drm/v3d: Handle errors from IRQ setup.
authorEric Anholt <eric@anholt.net>
Fri, 8 Mar 2019 17:43:35 +0000 (09:43 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 8 Mar 2019 23:09:42 +0000 (15:09 -0800)
Noted in review by Dave Emett for V3D 4.2 support.

Signed-off-by: Eric Anholt <eric@anholt.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20190308174336.7866-1-eric@anholt.net
Reviewed-by: Dave Emett <david.emett@broadcom.com>
drivers/gpu/drm/v3d/v3d_drv.c
drivers/gpu/drm/v3d/v3d_drv.h
drivers/gpu/drm/v3d/v3d_irq.c

index 3680ebd..f9906ca 100644 (file)
@@ -311,14 +311,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:
index d856159..bb58ecb 100644 (file)
@@ -304,7 +304,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);
index 69338da..29d746c 100644 (file)
@@ -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