]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/v3d: Handle errors from IRQ setup.
authorEric Anholt <eric@anholt.net>
Fri, 8 Mar 2019 17:43:35 +0000 (09:43 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 31 May 2019 13:46:34 +0000 (06:46 -0700)
[ Upstream commit fc22771547e7e8a63679f0218e943d72b107de65 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/v3d/v3d_drv.c
drivers/gpu/drm/v3d/v3d_drv.h
drivers/gpu/drm/v3d/v3d_irq.c

index 2a85fa68ffea51042b4c08dd8dc3497153590197..2a4c6187e675f713204efee885f0d97c6c568546 100644 (file)
@@ -305,14 +305,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 e6fed696ad869e2d700a94c2e6f4a10d36bf7529..0ad73f4b7509a08bff4c558f602c5db7a604a038 100644 (file)
@@ -284,7 +284,7 @@ void v3d_invalidate_caches(struct v3d_dev *v3d);
 void v3d_flush_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 e07514eb11b511ddaacd9ddd0cf0c3e3fbbbb1a7..22be0f2dff99c79010f9cd4f05ef669a5a20c4af 100644 (file)
@@ -137,7 +137,7 @@ v3d_hub_irq(int irq, void *arg)
        return status;
 }
 
-void
+int
 v3d_irq_init(struct v3d_dev *v3d)
 {
        int ret, core;
@@ -154,13 +154,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