| From b19e2374889be93c1094a41683a67e586ed53e22 Mon Sep 17 00:00:00 2001 |
| From: Eric Anholt <eric@anholt.net> |
| Date: Fri, 8 Mar 2019 09:43:35 -0800 |
| Subject: drm/v3d: Handle errors from IRQ setup. |
| |
| [ 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 | 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 |
| |