From patchwork Fri Oct 11 00:30:19 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Paul X-Patchwork-Id: 3019741 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 8AF68BF924 for ; Fri, 11 Oct 2013 00:39:55 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BC2CE20253 for ; Fri, 11 Oct 2013 00:39:53 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id DB4D52024C for ; Fri, 11 Oct 2013 00:39:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CDF28E5F36 for ; Thu, 10 Oct 2013 17:39:51 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-ie0-f174.google.com (mail-ie0-f174.google.com [209.85.223.174]) by gabe.freedesktop.org (Postfix) with ESMTP id 24DB4E763F for ; Thu, 10 Oct 2013 17:31:00 -0700 (PDT) Received: by mail-ie0-f174.google.com with SMTP id qd12so2315725ieb.5 for ; Thu, 10 Oct 2013 17:30:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=vgccwB2WwhCp5gUFUicoKMxWpPeLNb6JEhZUCV8mOng=; b=cUGqy620Q+OmjW6WCg24tGAJ438Y4vz/zQ9X82gdPPK62v/jHPNheA/XAaKflq5uvj W6fWEB9nwuFJS88bj+hIi+HyTZcipdqkej8SeMCJq+51jKnoNUeeMG67NKarRNlZRxkr zn1wrbzs2tO+pvep9BpHJ8Ut3IXtjeIsn7gJo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=vgccwB2WwhCp5gUFUicoKMxWpPeLNb6JEhZUCV8mOng=; b=U9ALQeD+CXSVq32XpPH7makjBjmEHYgq83hOmEtdIcHHAy8LrhaGghDR9xLb6bd3eU PVPx2Fz/lycpQ1/U9qBB0ciN6qlyjxeajEblrLuME9nU5VQo+bUHMW+q4Mssqxog5wmf i4DGSLPpDsMxnyQfdWW3j1+4x3yEOCQ4/yrNsJbUOPjNFLKPrK09Krk5I07dxHi4m8ag UblMMGdOaddyPVgIU3wTEgeInOypWfCUTlfthv9aK1n6keSnw7l1gqfvz0ysT+5knOXU pFoOjURNhZkH/zCA0WBLwy/PsXML+oGwCfMpQvMLW8aLhxaqi+mMi2CUsYMCDgR/rjaO dLsQ== X-Gm-Message-State: ALoCoQnJPAjk4BLDag2nVCQHtUa1TcnoWUEcCAdpo+YQkbce9cFG5BbA9TlbvFoBLb0zQK3PxUrJ X-Received: by 10.42.159.136 with SMTP id l8mr9904182icx.14.1381451459675; Thu, 10 Oct 2013 17:30:59 -0700 (PDT) Received: from seanpaul-glaptop.corp.google.com (dhcp-172-19-29-233.mtv.corp.google.com [172.19.29.233]) by mx.google.com with ESMTPSA id p7sm420421iga.3.1969.12.31.16.00.00 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 10 Oct 2013 17:30:59 -0700 (PDT) From: Sean Paul To: dri-devel@lists.freedesktop.org, inki.dae@samsung.com Subject: [PATCH 06/23] drm/exynos: Pass context in manager ops instead of dev Date: Thu, 10 Oct 2013 20:30:19 -0400 Message-Id: <1381451436-10089-7-git-send-email-seanpaul@chromium.org> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1381451436-10089-1-git-send-email-seanpaul@chromium.org> References: <1381451436-10089-1-git-send-email-seanpaul@chromium.org> Cc: marcheu@chromium.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch changes the manager ops callbacks from accepting the subdrv device pointer to taking a context pointer. This will allow us to move closer to decoupling manager/display from subdrv, and subsequently decoupling the crtc/plane from the encoder. Signed-off-by: Sean Paul --- drivers/gpu/drm/exynos/exynos_drm_connector.c | 2 +- drivers/gpu/drm/exynos/exynos_drm_drv.h | 33 ++++++------ drivers/gpu/drm/exynos/exynos_drm_encoder.c | 24 ++++----- drivers/gpu/drm/exynos/exynos_drm_fimd.c | 71 +++++++++++++------------ drivers/gpu/drm/exynos/exynos_drm_hdmi.c | 75 +++++++++++++++------------ drivers/gpu/drm/exynos/exynos_drm_vidi.c | 49 ++++++++--------- 6 files changed, 130 insertions(+), 124 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index e082efb..b70b123 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c @@ -198,7 +198,7 @@ static int exynos_drm_connector_fill_modes(struct drm_connector *connector, * resolution then get max width and height from that driver. */ if (ops && ops->get_max_resol) - ops->get_max_resol(manager->dev, &width, &height); + ops->get_max_resol(manager->ctx, &width, &height); return drm_helper_probe_single_connector_modes(connector, width, height); diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index 09bfe60..0bd444f 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h @@ -162,26 +162,23 @@ struct exynos_drm_display_ops { * @win_disable: disable hardware specific overlay. */ struct exynos_drm_manager_ops { - int (*initialize)(struct device *subdrv_dev, - struct drm_device *drm_dev); - void (*dpms)(struct device *subdrv_dev, int mode); - void (*apply)(struct device *subdrv_dev); - void (*mode_fixup)(struct device *subdrv_dev, - struct drm_connector *connector, + int (*initialize)(void *ctx, struct drm_device *drm_dev); + void (*dpms)(void *ctx, int mode); + void (*apply)(void *ctx); + void (*mode_fixup)(void *ctx, struct drm_connector *connector, const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode); - void (*mode_set)(struct device *subdrv_dev, void *mode); - void (*get_max_resol)(struct device *subdrv_dev, unsigned int *width, + void (*mode_set)(void *ctx, void *mode); + void (*get_max_resol)(void *ctx, unsigned int *width, unsigned int *height); - void (*commit)(struct device *subdrv_dev); - int (*enable_vblank)(struct device *subdrv_dev); - void (*disable_vblank)(struct device *subdrv_dev); - void (*wait_for_vblank)(struct device *subdrv_dev); - void (*win_mode_set)(struct device *subdrv_dev, - struct exynos_drm_overlay *overlay); - void (*win_commit)(struct device *subdrv_dev, int zpos); - void (*win_enable)(struct device *subdrv_dev, int zpos); - void (*win_disable)(struct device *subdrv_dev, int zpos); + void (*commit)(void *ctx); + int (*enable_vblank)(void *ctx); + void (*disable_vblank)(void *ctx); + void (*wait_for_vblank)(void *ctx); + void (*win_mode_set)(void *ctx, struct exynos_drm_overlay *overlay); + void (*win_commit)(void *ctx, int zpos); + void (*win_enable)(void *ctx, int zpos); + void (*win_disable)(void *ctx, int zpos); }; /* @@ -197,12 +194,14 @@ struct exynos_drm_manager_ops { * these callbacks should be set by specific drivers such fimd * or hdmi driver and are used to control display devices such as * analog tv, digital tv and lcd panel and also get timing data for them. + * @ctx: A pointer to the manager's implementation specific context */ struct exynos_drm_manager { struct device *dev; int pipe; struct exynos_drm_manager_ops *ops; struct exynos_drm_display_ops *display_ops; + void *ctx; }; struct exynos_drm_g2d_private { diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index a9eb2b0..24484ae 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c @@ -74,7 +74,7 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode) case DRM_MODE_DPMS_ON: if (manager_ops && manager_ops->apply) if (!exynos_encoder->updated) - manager_ops->apply(manager->dev); + manager_ops->apply(manager->ctx); exynos_drm_connector_power(encoder, mode); exynos_encoder->dpms = mode; @@ -107,7 +107,7 @@ exynos_drm_encoder_mode_fixup(struct drm_encoder *encoder, list_for_each_entry(connector, &dev->mode_config.connector_list, head) { if (connector->encoder == encoder) if (manager_ops && manager_ops->mode_fixup) - manager_ops->mode_fixup(manager->dev, connector, + manager_ops->mode_fixup(manager->ctx, connector, mode, adjusted_mode); } @@ -175,7 +175,7 @@ static void exynos_drm_encoder_mode_set(struct drm_encoder *encoder, manager_ops = manager->ops; if (manager_ops && manager_ops->mode_set) - manager_ops->mode_set(manager->dev, + manager_ops->mode_set(manager->ctx, adjusted_mode); exynos_encoder->old_crtc = encoder->crtc; @@ -195,7 +195,7 @@ static void exynos_drm_encoder_commit(struct drm_encoder *encoder) struct exynos_drm_manager_ops *manager_ops = manager->ops; if (manager_ops && manager_ops->commit) - manager_ops->commit(manager->dev); + manager_ops->commit(manager->ctx); /* * this will avoid one issue that overlay data is updated to @@ -341,7 +341,7 @@ exynos_drm_encoder_create(struct drm_device *dev, drm_encoder_helper_add(encoder, &exynos_encoder_helper_funcs); if (manager->ops && manager->ops->initialize) { - ret = manager->ops->initialize(manager->dev, dev); + ret = manager->ops->initialize(manager->ctx, dev); if (ret) { DRM_ERROR("Manager initialize failed %d\n", ret); goto error; @@ -408,7 +408,7 @@ void exynos_drm_enable_vblank(struct drm_encoder *encoder, void *data) return; if (manager_ops->enable_vblank) - manager_ops->enable_vblank(manager->dev); + manager_ops->enable_vblank(manager->ctx); } void exynos_drm_disable_vblank(struct drm_encoder *encoder, void *data) @@ -422,7 +422,7 @@ void exynos_drm_disable_vblank(struct drm_encoder *encoder, void *data) return; if (manager_ops->disable_vblank) - manager_ops->disable_vblank(manager->dev); + manager_ops->disable_vblank(manager->ctx); } void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data) @@ -433,7 +433,7 @@ void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data) int mode = *(int *)data; if (manager_ops && manager_ops->dpms) - manager_ops->dpms(manager->dev, mode); + manager_ops->dpms(manager->ctx, mode); /* * if this condition is ok then it means that the crtc is already @@ -467,7 +467,7 @@ void exynos_drm_encoder_plane_mode_set(struct drm_encoder *encoder, void *data) struct exynos_drm_overlay *overlay = data; if (manager_ops && manager_ops->win_mode_set) - manager_ops->win_mode_set(manager->dev, overlay); + manager_ops->win_mode_set(manager->ctx, overlay); } void exynos_drm_encoder_plane_commit(struct drm_encoder *encoder, void *data) @@ -481,7 +481,7 @@ void exynos_drm_encoder_plane_commit(struct drm_encoder *encoder, void *data) zpos = *(int *)data; if (manager_ops && manager_ops->win_commit) - manager_ops->win_commit(manager->dev, zpos); + manager_ops->win_commit(manager->ctx, zpos); } void exynos_drm_encoder_plane_enable(struct drm_encoder *encoder, void *data) @@ -495,7 +495,7 @@ void exynos_drm_encoder_plane_enable(struct drm_encoder *encoder, void *data) zpos = *(int *)data; if (manager_ops && manager_ops->win_enable) - manager_ops->win_enable(manager->dev, zpos); + manager_ops->win_enable(manager->ctx, zpos); } void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data) @@ -509,5 +509,5 @@ void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data) zpos = *(int *)data; if (manager_ops && manager_ops->win_disable) - manager_ops->win_disable(manager->dev, zpos); + manager_ops->win_disable(manager->ctx, zpos); } diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 90fcd6f..9c2720a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -106,6 +106,7 @@ struct fimd_win_data { struct fimd_context { struct exynos_drm_subdrv subdrv; + struct device *dev; struct drm_device *drm_dev; int irq; struct drm_crtc *crtc; @@ -182,16 +183,15 @@ static struct exynos_drm_display_ops fimd_display_ops = { .power_on = fimd_display_power_on, }; -static void fimd_win_mode_set(struct device *dev, - struct exynos_drm_overlay *overlay) +static void fimd_win_mode_set(void *in_ctx, struct exynos_drm_overlay *overlay) { - struct fimd_context *ctx = get_fimd_context(dev); + struct fimd_context *ctx = in_ctx; struct fimd_win_data *win_data; int win; unsigned long offset; if (!overlay) { - dev_err(dev, "overlay is NULL\n"); + DRM_ERROR("overlay is NULL\n"); return; } @@ -231,9 +231,8 @@ static void fimd_win_mode_set(struct device *dev, overlay->fb_width, overlay->crtc_width); } -static void fimd_win_set_pixfmt(struct device *dev, unsigned int win) +static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win) { - struct fimd_context *ctx = get_fimd_context(dev); struct fimd_win_data *win_data = &ctx->win_data[win]; unsigned long val; @@ -289,9 +288,8 @@ static void fimd_win_set_pixfmt(struct device *dev, unsigned int win) writel(val, ctx->regs + WINCON(win)); } -static void fimd_win_set_colkey(struct device *dev, unsigned int win) +static void fimd_win_set_colkey(struct fimd_context *ctx, unsigned int win) { - struct fimd_context *ctx = get_fimd_context(dev); unsigned int keycon0 = 0, keycon1 = 0; keycon0 = ~(WxKEYCON0_KEYBL_EN | WxKEYCON0_KEYEN_F | @@ -330,9 +328,9 @@ static void fimd_shadow_protect_win(struct fimd_context *ctx, writel(val, ctx->regs + reg); } -static void fimd_win_commit(struct device *dev, int zpos) +static void fimd_win_commit(void *in_ctx, int zpos) { - struct fimd_context *ctx = get_fimd_context(dev); + struct fimd_context *ctx = in_ctx; struct fimd_win_data *win_data; int win = zpos; unsigned long val, alpha, size; @@ -427,11 +425,11 @@ static void fimd_win_commit(struct device *dev, int zpos) DRM_DEBUG_KMS("osd size = 0x%x\n", (unsigned int)val); } - fimd_win_set_pixfmt(dev, win); + fimd_win_set_pixfmt(ctx, win); /* hardware window 0 doesn't support color key. */ if (win != 0) - fimd_win_set_colkey(dev, win); + fimd_win_set_colkey(ctx, win); /* wincon */ val = readl(ctx->regs + WINCON(win)); @@ -450,9 +448,9 @@ static void fimd_win_commit(struct device *dev, int zpos) win_data->enabled = true; } -static void fimd_win_disable(struct device *dev, int zpos) +static void fimd_win_disable(void *in_ctx, int zpos) { - struct fimd_context *ctx = get_fimd_context(dev); + struct fimd_context *ctx = in_ctx; struct fimd_win_data *win_data; int win = zpos; u32 val; @@ -491,19 +489,18 @@ static void fimd_win_disable(struct device *dev, int zpos) win_data->enabled = false; } -static int fimd_mgr_initialize(struct device *subdrv_dev, - struct drm_device *drm_dev) +static int fimd_mgr_initialize(void *in_ctx, struct drm_device *drm_dev) { - struct fimd_context *ctx = get_fimd_context(subdrv_dev); + struct fimd_context *ctx = in_ctx; ctx->drm_dev = drm_dev; return 0; } -static void fimd_dpms(struct device *subdrv_dev, int mode) +static void fimd_dpms(void *in_ctx, int mode) { - struct fimd_context *ctx = get_fimd_context(subdrv_dev); + struct fimd_context *ctx = in_ctx; DRM_DEBUG_KMS("%d\n", mode); @@ -518,13 +515,13 @@ static void fimd_dpms(struct device *subdrv_dev, int mode) * clk_enable could be called double time. */ if (ctx->suspended) - pm_runtime_get_sync(subdrv_dev); + pm_runtime_get_sync(ctx->dev); break; case DRM_MODE_DPMS_STANDBY: case DRM_MODE_DPMS_SUSPEND: case DRM_MODE_DPMS_OFF: if (!ctx->suspended) - pm_runtime_put_sync(subdrv_dev); + pm_runtime_put_sync(ctx->dev); break; default: DRM_DEBUG_KMS("unspecified mode %d\n", mode); @@ -534,9 +531,9 @@ static void fimd_dpms(struct device *subdrv_dev, int mode) mutex_unlock(&ctx->lock); } -static void fimd_apply(struct device *subdrv_dev) +static void fimd_apply(void *in_ctx) { - struct fimd_context *ctx = get_fimd_context(subdrv_dev); + struct fimd_context *ctx = in_ctx; struct exynos_drm_manager *mgr = ctx->subdrv.manager; struct exynos_drm_manager_ops *mgr_ops = mgr->ops; struct fimd_win_data *win_data; @@ -545,16 +542,16 @@ static void fimd_apply(struct device *subdrv_dev) for (i = 0; i < WINDOWS_NR; i++) { win_data = &ctx->win_data[i]; if (win_data->enabled && (mgr_ops && mgr_ops->win_commit)) - mgr_ops->win_commit(subdrv_dev, i); + mgr_ops->win_commit(ctx, i); } if (mgr_ops && mgr_ops->commit) - mgr_ops->commit(subdrv_dev); + mgr_ops->commit(ctx); } -static void fimd_commit(struct device *dev) +static void fimd_commit(void *in_ctx) { - struct fimd_context *ctx = get_fimd_context(dev); + struct fimd_context *ctx = in_ctx; struct exynos_drm_panel_info *panel = &ctx->panel; struct videomode *vm = &panel->vm; struct fimd_driver_data *driver_data; @@ -608,9 +605,9 @@ static void fimd_commit(struct device *dev) writel(val, ctx->regs + VIDCON0); } -static int fimd_enable_vblank(struct device *dev) +static int fimd_enable_vblank(void *in_ctx) { - struct fimd_context *ctx = get_fimd_context(dev); + struct fimd_context *ctx = in_ctx; u32 val; if (ctx->suspended) @@ -633,9 +630,9 @@ static int fimd_enable_vblank(struct device *dev) return 0; } -static void fimd_disable_vblank(struct device *dev) +static void fimd_disable_vblank(void *in_ctx) { - struct fimd_context *ctx = get_fimd_context(dev); + struct fimd_context *ctx = in_ctx; u32 val; if (ctx->suspended) @@ -651,9 +648,9 @@ static void fimd_disable_vblank(struct device *dev) } } -static void fimd_wait_for_vblank(struct device *dev) +static void fimd_wait_for_vblank(void *in_ctx) { - struct fimd_context *ctx = get_fimd_context(dev); + struct fimd_context *ctx = in_ctx; if (ctx->suspended) return; @@ -845,9 +842,9 @@ static void fimd_window_suspend(struct device *dev) for (i = 0; i < WINDOWS_NR; i++) { win_data = &ctx->win_data[i]; win_data->resume = win_data->enabled; - fimd_win_disable(dev, i); + fimd_win_disable(ctx, i); } - fimd_wait_for_vblank(dev); + fimd_wait_for_vblank(ctx); } static void fimd_window_resume(struct device *dev) @@ -963,6 +960,8 @@ static int fimd_probe(struct platform_device *pdev) DRM_INIT_WAITQUEUE(&ctx->wait_vsync_queue); atomic_set(&ctx->wait_vsync_event, 0); + fimd_manager.ctx = ctx; + subdrv = &ctx->subdrv; subdrv->dev = dev; @@ -1042,7 +1041,7 @@ static int fimd_resume(struct device *dev) * registers but in case of sleep wakeup, it's not. * so fimd_apply function should be called at here. */ - fimd_apply(dev); + fimd_apply(ctx); } return 0; diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c index aebcc0e..cddb0c8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c @@ -129,11 +129,9 @@ static struct edid *drm_hdmi_get_edid(struct device *dev, return NULL; } - -static int drm_hdmi_check_mode(struct device *dev, +static int drm_hdmi_check_mode_ctx(struct drm_hdmi_context *ctx, struct drm_display_mode *mode) { - struct drm_hdmi_context *ctx = to_context(dev); int ret = 0; /* @@ -153,6 +151,14 @@ static int drm_hdmi_check_mode(struct device *dev, return 0; } +static int drm_hdmi_check_mode(struct device *dev, + struct drm_display_mode *mode) +{ + struct drm_hdmi_context *ctx = to_context(dev); + + return drm_hdmi_check_mode_ctx(ctx, mode); +} + static int drm_hdmi_power_on(struct device *dev, int mode) { struct drm_hdmi_context *ctx = to_context(dev); @@ -172,9 +178,9 @@ static struct exynos_drm_display_ops drm_hdmi_display_ops = { .power_on = drm_hdmi_power_on, }; -static int drm_hdmi_enable_vblank(struct device *subdrv_dev) +static int drm_hdmi_enable_vblank(void *in_ctx) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; struct exynos_drm_subdrv *subdrv = &ctx->subdrv; struct exynos_drm_manager *manager = subdrv->manager; @@ -185,33 +191,33 @@ static int drm_hdmi_enable_vblank(struct device *subdrv_dev) return 0; } -static void drm_hdmi_disable_vblank(struct device *subdrv_dev) +static void drm_hdmi_disable_vblank(void *in_ctx) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; if (mixer_ops && mixer_ops->disable_vblank) return mixer_ops->disable_vblank(ctx->mixer_ctx->ctx); } -static void drm_hdmi_wait_for_vblank(struct device *subdrv_dev) +static void drm_hdmi_wait_for_vblank(void *in_ctx) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; if (mixer_ops && mixer_ops->wait_for_vblank) mixer_ops->wait_for_vblank(ctx->mixer_ctx->ctx); } -static void drm_hdmi_mode_fixup(struct device *subdrv_dev, - struct drm_connector *connector, +static void drm_hdmi_mode_fixup(void *in_ctx, struct drm_connector *connector, const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { + struct drm_hdmi_context *ctx = in_ctx; struct drm_display_mode *m; int mode_ok; drm_mode_set_crtcinfo(adjusted_mode, 0); - mode_ok = drm_hdmi_check_mode(subdrv_dev, adjusted_mode); + mode_ok = drm_hdmi_check_mode_ctx(ctx, adjusted_mode); /* just return if user desired mode exists. */ if (mode_ok == 0) @@ -222,7 +228,7 @@ static void drm_hdmi_mode_fixup(struct device *subdrv_dev, * to adjusted_mode. */ list_for_each_entry(m, &connector->modes, head) { - mode_ok = drm_hdmi_check_mode(subdrv_dev, m); + mode_ok = drm_hdmi_check_mode_ctx(ctx, m); if (mode_ok == 0) { struct drm_mode_object base; @@ -245,35 +251,34 @@ static void drm_hdmi_mode_fixup(struct device *subdrv_dev, } } -static void drm_hdmi_mode_set(struct device *subdrv_dev, void *mode) +static void drm_hdmi_mode_set(void *in_ctx, void *mode) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; if (hdmi_ops && hdmi_ops->mode_set) hdmi_ops->mode_set(ctx->hdmi_ctx->ctx, mode); } -static void drm_hdmi_get_max_resol(struct device *subdrv_dev, - unsigned int *width, unsigned int *height) +static void drm_hdmi_get_max_resol(void *in_ctx, unsigned int *width, + unsigned int *height) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; if (hdmi_ops && hdmi_ops->get_max_resol) hdmi_ops->get_max_resol(ctx->hdmi_ctx->ctx, width, height); } -static void drm_hdmi_commit(struct device *subdrv_dev) +static void drm_hdmi_commit(void *in_ctx) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; if (hdmi_ops && hdmi_ops->commit) hdmi_ops->commit(ctx->hdmi_ctx->ctx); } -static int drm_hdmi_mgr_initialize(struct device *subdrv_dev, - struct drm_device *drm_dev) +static int drm_hdmi_mgr_initialize(void *in_ctx, struct drm_device *drm_dev) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; int ret = 0; if (mixer_ops && mixer_ops->initialize) @@ -285,9 +290,9 @@ static int drm_hdmi_mgr_initialize(struct device *subdrv_dev, return ret; } -static void drm_hdmi_dpms(struct device *subdrv_dev, int mode) +static void drm_hdmi_dpms(void *in_ctx, int mode) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; if (mixer_ops && mixer_ops->dpms) mixer_ops->dpms(ctx->mixer_ctx->ctx, mode); @@ -296,9 +301,9 @@ static void drm_hdmi_dpms(struct device *subdrv_dev, int mode) hdmi_ops->dpms(ctx->hdmi_ctx->ctx, mode); } -static void drm_hdmi_apply(struct device *subdrv_dev) +static void drm_hdmi_apply(void *in_ctx) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; int i; for (i = 0; i < MIXER_WIN_NR; i++) { @@ -312,18 +317,18 @@ static void drm_hdmi_apply(struct device *subdrv_dev) hdmi_ops->commit(ctx->hdmi_ctx->ctx); } -static void drm_mixer_win_mode_set(struct device *subdrv_dev, - struct exynos_drm_overlay *overlay) +static void drm_mixer_win_mode_set(void *in_ctx, + struct exynos_drm_overlay *overlay) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; if (mixer_ops && mixer_ops->win_mode_set) mixer_ops->win_mode_set(ctx->mixer_ctx->ctx, overlay); } -static void drm_mixer_win_commit(struct device *subdrv_dev, int zpos) +static void drm_mixer_win_commit(void *in_ctx, int zpos) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; int win = (zpos == DEFAULT_ZPOS) ? MIXER_DEFAULT_WIN : zpos; if (win < 0 || win >= MIXER_WIN_NR) { @@ -337,9 +342,9 @@ static void drm_mixer_win_commit(struct device *subdrv_dev, int zpos) ctx->enabled[win] = true; } -static void drm_mixer_win_disable(struct device *subdrv_dev, int zpos) +static void drm_mixer_win_disable(void *in_ctx, int zpos) { - struct drm_hdmi_context *ctx = to_context(subdrv_dev); + struct drm_hdmi_context *ctx = in_ctx; int win = (zpos == DEFAULT_ZPOS) ? MIXER_DEFAULT_WIN : zpos; if (win < 0 || win >= MIXER_WIN_NR) { @@ -425,6 +430,8 @@ static int exynos_drm_hdmi_probe(struct platform_device *pdev) if (!ctx) return -ENOMEM; + hdmi_manager.ctx = ctx; + subdrv = &ctx->subdrv; subdrv->dev = dev; diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index 15a97ce..a583a74 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c @@ -152,9 +152,9 @@ static struct exynos_drm_display_ops vidi_display_ops = { .power_on = vidi_display_power_on, }; -static void vidi_dpms(struct device *subdrv_dev, int mode) +static void vidi_dpms(void *in_ctx, int mode) { - struct vidi_context *ctx = get_vidi_context(subdrv_dev); + struct vidi_context *ctx = in_ctx; DRM_DEBUG_KMS("%d\n", mode); @@ -177,9 +177,9 @@ static void vidi_dpms(struct device *subdrv_dev, int mode) mutex_unlock(&ctx->lock); } -static void vidi_apply(struct device *subdrv_dev) +static void vidi_apply(void *in_ctx) { - struct vidi_context *ctx = get_vidi_context(subdrv_dev); + struct vidi_context *ctx = in_ctx; struct exynos_drm_manager *mgr = ctx->subdrv.manager; struct exynos_drm_manager_ops *mgr_ops = mgr->ops; struct vidi_win_data *win_data; @@ -188,24 +188,24 @@ static void vidi_apply(struct device *subdrv_dev) for (i = 0; i < WINDOWS_NR; i++) { win_data = &ctx->win_data[i]; if (win_data->enabled && (mgr_ops && mgr_ops->win_commit)) - mgr_ops->win_commit(subdrv_dev, i); + mgr_ops->win_commit(ctx, i); } if (mgr_ops && mgr_ops->commit) - mgr_ops->commit(subdrv_dev); + mgr_ops->commit(ctx); } -static void vidi_commit(struct device *dev) +static void vidi_commit(void *in_ctx) { - struct vidi_context *ctx = get_vidi_context(dev); + struct vidi_context *ctx = in_ctx; if (ctx->suspended) return; } -static int vidi_enable_vblank(struct device *dev) +static int vidi_enable_vblank(void *in_ctx) { - struct vidi_context *ctx = get_vidi_context(dev); + struct vidi_context *ctx = in_ctx; if (ctx->suspended) return -EPERM; @@ -225,9 +225,9 @@ static int vidi_enable_vblank(struct device *dev) return 0; } -static void vidi_disable_vblank(struct device *dev) +static void vidi_disable_vblank(void *in_ctx) { - struct vidi_context *ctx = get_vidi_context(dev); + struct vidi_context *ctx = in_ctx; if (ctx->suspended) return; @@ -236,16 +236,15 @@ static void vidi_disable_vblank(struct device *dev) ctx->vblank_on = false; } -static void vidi_win_mode_set(struct device *dev, - struct exynos_drm_overlay *overlay) +static void vidi_win_mode_set(void *in_ctx, struct exynos_drm_overlay *overlay) { - struct vidi_context *ctx = get_vidi_context(dev); + struct vidi_context *ctx = in_ctx; struct vidi_win_data *win_data; int win; unsigned long offset; if (!overlay) { - dev_err(dev, "overlay is NULL\n"); + DRM_ERROR("overlay is NULL\n"); return; } @@ -289,9 +288,9 @@ static void vidi_win_mode_set(struct device *dev, overlay->fb_width, overlay->crtc_width); } -static void vidi_win_commit(struct device *dev, int zpos) +static void vidi_win_commit(void *in_ctx, int zpos) { - struct vidi_context *ctx = get_vidi_context(dev); + struct vidi_context *ctx = in_ctx; struct vidi_win_data *win_data; int win = zpos; @@ -314,9 +313,9 @@ static void vidi_win_commit(struct device *dev, int zpos) schedule_work(&ctx->work); } -static void vidi_win_disable(struct device *dev, int zpos) +static void vidi_win_disable(void *in_ctx, int zpos) { - struct vidi_context *ctx = get_vidi_context(dev); + struct vidi_context *ctx = in_ctx; struct vidi_win_data *win_data; int win = zpos; @@ -405,17 +404,19 @@ static void vidi_subdrv_remove(struct drm_device *drm_dev, struct device *dev) static int vidi_power_on(struct vidi_context *ctx, bool enable) { - struct exynos_drm_subdrv *subdrv = &ctx->subdrv; - struct device *dev = subdrv->dev; + DRM_DEBUG_KMS("%s\n", __FILE__); + + if (enable != false && enable != true) + return -EINVAL; if (enable) { ctx->suspended = false; /* if vblank was enabled status, enable it again. */ if (test_and_clear_bit(0, &ctx->irq_flags)) - vidi_enable_vblank(dev); + vidi_enable_vblank(ctx); - vidi_apply(dev); + vidi_apply(ctx); } else { ctx->suspended = true; }