Commit 36f8d22d authored by Xu YiPing's avatar Xu YiPing Committed by Sam Ravnborg

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: default avatarXinliang Liu <z.liuxinliang@hisilicon.com>
Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
Signed-off-by: default avatarXu YiPing <xuyiping@hisilicon.com>
[jstultz: reworded commit message]
Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190820230626.23253-10-john.stultz@linaro.org
parent 43774b0e
...@@ -54,6 +54,8 @@ struct ade_hw_ctx { ...@@ -54,6 +54,8 @@ struct ade_hw_ctx {
struct reset_control *reset; struct reset_control *reset;
bool power_on; bool power_on;
int irq; int irq;
struct drm_crtc *crtc;
}; };
struct kirin_crtc { struct kirin_crtc {
...@@ -358,9 +360,9 @@ static void drm_underflow_wq(struct work_struct *work) ...@@ -358,9 +360,9 @@ static void drm_underflow_wq(struct work_struct *work)
static irqreturn_t ade_irq_handler(int irq, void *data) static irqreturn_t ade_irq_handler(int irq, void *data)
{ {
struct kirin_crtc *kcrtc = data; struct ade_hw_ctx *ctx = data;
struct ade_hw_ctx *ctx = kcrtc->hw_ctx; struct drm_crtc *crtc = ctx->crtc;
struct drm_crtc *crtc = &kcrtc->base; struct kirin_crtc *kcrtc = to_kirin_crtc(crtc);
void __iomem *base = ctx->base; void __iomem *base = ctx->base;
u32 status; u32 status;
...@@ -951,12 +953,14 @@ static int ade_plane_init(struct drm_device *dev, struct kirin_plane *kplane, ...@@ -951,12 +953,14 @@ static int ade_plane_init(struct drm_device *dev, struct kirin_plane *kplane,
return 0; 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 resource *res;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct ade_hw_ctx *ctx = NULL; struct ade_hw_ctx *ctx = NULL;
int ret;
ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
if (!ctx) { if (!ctx) {
...@@ -1006,6 +1010,14 @@ static void *ade_hw_ctx_alloc(struct platform_device *pdev) ...@@ -1006,6 +1010,14 @@ static void *ade_hw_ctx_alloc(struct platform_device *pdev)
return ERR_PTR(-ENODEV); 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; return ctx;
} }
...@@ -1027,7 +1039,7 @@ static int ade_drm_init(struct platform_device *pdev) ...@@ -1027,7 +1039,7 @@ static int ade_drm_init(struct platform_device *pdev)
} }
platform_set_drvdata(pdev, ade); platform_set_drvdata(pdev, ade);
ctx = ade_hw_ctx_alloc(pdev); ctx = ade_hw_ctx_alloc(pdev, &ade->crtc.base);
if (IS_ERR(ctx)) { if (IS_ERR(ctx)) {
DRM_ERROR("failed to initialize kirin_priv hw ctx\n"); DRM_ERROR("failed to initialize kirin_priv hw ctx\n");
return -EINVAL; return -EINVAL;
...@@ -1059,15 +1071,8 @@ static int ade_drm_init(struct platform_device *pdev) ...@@ -1059,15 +1071,8 @@ static int ade_drm_init(struct platform_device *pdev)
if (ret) if (ret)
return 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); INIT_WORK(&kcrtc->display_reset_wq, drm_underflow_wq);
if (ret)
return ret;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment