summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/hisilicon/kirin
diff options
context:
space:
mode:
authorXu YiPing <xuyiping@hisilicon.com>2019-08-21 02:06:10 +0300
committerSam Ravnborg <sam@ravnborg.org>2019-08-21 20:15:36 +0300
commit36f8d22dbcd9bdbe0a6751defaaccbe97843e140 (patch)
treedb5fb3fba18dc27a3e9f83671cd55cdc414e6928 /drivers/gpu/drm/hisilicon/kirin
parent43774b0eed5612a8830b82cb7122beb6d05b5ac5 (diff)
downloadlinux-36f8d22dbcd9bdbe0a6751defaaccbe97843e140.tar.xz
drm: kirin: Move request irq handle in ade hw ctx alloc
As part of refactoring the kirin driver to better support different hardware revisions, this patch modifies the initialization routines so the devm_request_irq() function is called as part of the allocation function. This will be needed in the future when we will have different allocation functions to allocate hardware specific hw_ctx structures, which will setup the vblank irq differently. Cc: Rongrong Zou <zourongrong@gmail.com> Cc: Xinliang Liu <z.liuxinliang@hisilicon.com> Cc: David Airlie <airlied@linux.ie> Cc: Daniel Vetter <daniel@ffwll.ch> Cc: dri-devel <dri-devel@lists.freedesktop.org> Cc: Sam Ravnborg <sam@ravnborg.org> Acked-by: Xinliang Liu <z.liuxinliang@hisilicon.com> Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Xu YiPing <xuyiping@hisilicon.com> [jstultz: reworded commit message] Signed-off-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Link: https://patchwork.freedesktop.org/patch/msgid/20190820230626.23253-10-john.stultz@linaro.org
Diffstat (limited to 'drivers/gpu/drm/hisilicon/kirin')
-rw-r--r--drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
index ecb507985fea..d0a7c1d0adbe 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
@@ -54,6 +54,8 @@ struct ade_hw_ctx {
struct reset_control *reset;
bool power_on;
int irq;
+
+ struct drm_crtc *crtc;
};
struct kirin_crtc {
@@ -358,9 +360,9 @@ static void drm_underflow_wq(struct work_struct *work)
static irqreturn_t ade_irq_handler(int irq, void *data)
{
- struct kirin_crtc *kcrtc = data;
- struct ade_hw_ctx *ctx = kcrtc->hw_ctx;
- struct drm_crtc *crtc = &kcrtc->base;
+ struct ade_hw_ctx *ctx = data;
+ struct drm_crtc *crtc = ctx->crtc;
+ struct kirin_crtc *kcrtc = to_kirin_crtc(crtc);
void __iomem *base = ctx->base;
u32 status;
@@ -951,12 +953,14 @@ static int ade_plane_init(struct drm_device *dev, struct kirin_plane *kplane,
return 0;
}
-static void *ade_hw_ctx_alloc(struct platform_device *pdev)
+static void *ade_hw_ctx_alloc(struct platform_device *pdev,
+ struct drm_crtc *crtc)
{
struct resource *res;
struct device *dev = &pdev->dev;
struct device_node *np = pdev->dev.of_node;
struct ade_hw_ctx *ctx = NULL;
+ int ret;
ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
if (!ctx) {
@@ -1006,6 +1010,14 @@ static void *ade_hw_ctx_alloc(struct platform_device *pdev)
return ERR_PTR(-ENODEV);
}
+ /* vblank irq init */
+ ret = devm_request_irq(dev, ctx->irq, ade_irq_handler,
+ IRQF_SHARED, dev->driver->name, ctx);
+ if (ret)
+ return ERR_PTR(-EIO);
+
+ ctx->crtc = crtc;
+
return ctx;
}
@@ -1027,7 +1039,7 @@ static int ade_drm_init(struct platform_device *pdev)
}
platform_set_drvdata(pdev, ade);
- ctx = ade_hw_ctx_alloc(pdev);
+ ctx = ade_hw_ctx_alloc(pdev, &ade->crtc.base);
if (IS_ERR(ctx)) {
DRM_ERROR("failed to initialize kirin_priv hw ctx\n");
return -EINVAL;
@@ -1059,15 +1071,8 @@ static int ade_drm_init(struct platform_device *pdev)
if (ret)
return ret;
- /* vblank irq init */
- ret = devm_request_irq(dev->dev, ctx->irq, ade_irq_handler,
- IRQF_SHARED, dev->driver->name, kcrtc);
-
INIT_WORK(&kcrtc->display_reset_wq, drm_underflow_wq);
- if (ret)
- return ret;
-
return 0;
}