Commit 40c8ab4b authored by Sean Paul's avatar Sean Paul Committed by Inki Dae

drm/exynos: Use manager_op initialize in fimd

This patch implements the intitialize manager op in fimd. This will
allow us to keep track of drm_dev in context instead of using subdev,
which in turn makes it easier to remove subdev from fimd.
Signed-off-by: default avatarSean Paul <seanpaul@chromium.org>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 1f9cafc3
...@@ -106,6 +106,7 @@ struct fimd_win_data { ...@@ -106,6 +106,7 @@ struct fimd_win_data {
struct fimd_context { struct fimd_context {
struct exynos_drm_subdrv subdrv; struct exynos_drm_subdrv subdrv;
struct drm_device *drm_dev;
int irq; int irq;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct clk *bus_clk; struct clk *bus_clk;
...@@ -181,6 +182,16 @@ static struct exynos_drm_display_ops fimd_display_ops = { ...@@ -181,6 +182,16 @@ static struct exynos_drm_display_ops fimd_display_ops = {
.power_on = fimd_display_power_on, .power_on = fimd_display_power_on,
}; };
static int fimd_mgr_initialize(struct device *subdrv_dev,
struct drm_device *drm_dev)
{
struct fimd_context *ctx = get_fimd_context(subdrv_dev);
ctx->drm_dev = drm_dev;
return 0;
}
static void fimd_dpms(struct device *subdrv_dev, int mode) static void fimd_dpms(struct device *subdrv_dev, int mode)
{ {
struct fimd_context *ctx = get_fimd_context(subdrv_dev); struct fimd_context *ctx = get_fimd_context(subdrv_dev);
...@@ -660,6 +671,7 @@ static void fimd_win_disable(struct device *dev, int zpos) ...@@ -660,6 +671,7 @@ static void fimd_win_disable(struct device *dev, int zpos)
} }
static struct exynos_drm_manager_ops fimd_manager_ops = { static struct exynos_drm_manager_ops fimd_manager_ops = {
.initialize = fimd_mgr_initialize,
.dpms = fimd_dpms, .dpms = fimd_dpms,
.apply = fimd_apply, .apply = fimd_apply,
.commit = fimd_commit, .commit = fimd_commit,
...@@ -681,7 +693,6 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id) ...@@ -681,7 +693,6 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
{ {
struct fimd_context *ctx = (struct fimd_context *)dev_id; struct fimd_context *ctx = (struct fimd_context *)dev_id;
struct exynos_drm_subdrv *subdrv = &ctx->subdrv; struct exynos_drm_subdrv *subdrv = &ctx->subdrv;
struct drm_device *drm_dev = subdrv->drm_dev;
struct exynos_drm_manager *manager = subdrv->manager; struct exynos_drm_manager *manager = subdrv->manager;
u32 val; u32 val;
...@@ -692,11 +703,11 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id) ...@@ -692,11 +703,11 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
writel(VIDINTCON1_INT_FRAME, ctx->regs + VIDINTCON1); writel(VIDINTCON1_INT_FRAME, ctx->regs + VIDINTCON1);
/* check the crtc is detached already from encoder */ /* check the crtc is detached already from encoder */
if (manager->pipe < 0) if (manager->pipe < 0 || !ctx->drm_dev)
goto out; goto out;
drm_handle_vblank(drm_dev, manager->pipe); drm_handle_vblank(ctx->drm_dev, manager->pipe);
exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe); exynos_drm_crtc_finish_pageflip(ctx->drm_dev, manager->pipe);
/* set wait vsync event to zero and wake up queue. */ /* set wait vsync event to zero and wake up queue. */
if (atomic_read(&ctx->wait_vsync_event)) { if (atomic_read(&ctx->wait_vsync_event)) {
......
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