Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ struct fimd_win_data {

struct fimd_context {
	struct exynos_drm_subdrv	subdrv;
	struct drm_device		*drm_dev;
	int				irq;
	struct drm_crtc			*crtc;
	struct clk			*bus_clk;
@@ -181,6 +182,16 @@ static struct exynos_drm_display_ops fimd_display_ops = {
	.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)
{
	struct fimd_context *ctx = get_fimd_context(subdrv_dev);
@@ -660,6 +671,7 @@ static void fimd_win_disable(struct device *dev, int zpos)
}

static struct exynos_drm_manager_ops fimd_manager_ops = {
	.initialize = fimd_mgr_initialize,
	.dpms = fimd_dpms,
	.apply = fimd_apply,
	.commit = fimd_commit,
@@ -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 exynos_drm_subdrv *subdrv = &ctx->subdrv;
	struct drm_device *drm_dev = subdrv->drm_dev;
	struct exynos_drm_manager *manager = subdrv->manager;
	u32 val;

@@ -692,11 +703,11 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
		writel(VIDINTCON1_INT_FRAME, ctx->regs + VIDINTCON1);

	/* check the crtc is detached already from encoder */
	if (manager->pipe < 0)
	if (manager->pipe < 0 || !ctx->drm_dev)
		goto out;

	drm_handle_vblank(drm_dev, manager->pipe);
	exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);
	drm_handle_vblank(ctx->drm_dev, manager->pipe);
	exynos_drm_crtc_finish_pageflip(ctx->drm_dev, manager->pipe);

	/* set wait vsync event to zero and wake up queue. */
	if (atomic_read(&ctx->wait_vsync_event)) {