From patchwork Mon Oct 28 13:35:31 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Inki Dae X-Patchwork-Id: 3102301 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 29E839F2B7 for ; Mon, 28 Oct 2013 14:28:41 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 80F1F2020A for ; Mon, 28 Oct 2013 14:28:39 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 56D9E201CD for ; Mon, 28 Oct 2013 14:28:37 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2840BE5FCA for ; Mon, 28 Oct 2013 07:28:37 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by gabe.freedesktop.org (Postfix) with ESMTP id D3526E686B for ; Mon, 28 Oct 2013 06:35:39 -0700 (PDT) Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MVD00FRESF9CCP0@mailout4.samsung.com> for dri-devel@lists.freedesktop.org; Mon, 28 Oct 2013 22:35:33 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.116]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 92.80.07052.5286E625; Mon, 28 Oct 2013 22:35:33 +0900 (KST) X-AuditID: cbfee691-b7f866d000001b8c-30-526e6825424e Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 9D.B0.08134.5286E625; Mon, 28 Oct 2013 22:35:33 +0900 (KST) Received: from daeinki-desktop.10.32.193.11 ([10.252.75.62]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MVD008CBSF8WD70@mmp2.samsung.com>; Mon, 28 Oct 2013 22:35:33 +0900 (KST) From: Inki Dae To: airlied@linux.ie, dri-devel@lists.freedesktop.org Subject: drm/exynos: vidi: fix build error Date: Mon, 28 Oct 2013 22:35:31 +0900 Message-id: <1382967331-6243-2-git-send-email-inki.dae@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1382967331-6243-1-git-send-email-inki.dae@samsung.com> References: <1382967331-6243-1-git-send-email-inki.dae@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrHLMWRmVeSWpSXmKPExsWyRsSkRFc1Iy/IoOWomEXvuZNMFle+vmez mHR/AovF2aY37A4sHtu/PWD1uN99nMmjb8sqxgDmKC6blNSczLLUIn27BK6MB923GAsOJldM ft7L3sA4M7CLkZNDQsBEYtqhq6wQtpjEhXvr2boYuTiEBJYySrxfvIEdpujSeZAikMR0Rok7 l4+wQzjdTBL7Du9jBKliE1CVmLjiPhuILSJgKtExaSkLiM0s4Cdx4vxKMFtYQEvi6qbzzCA2 C1D95Lv/mEBsXgFniUlNH4BsDqBtChJzJtmAhDkFXCTOHXwENl4IqOT/in6wvRICv9kkzrzs ZoGYIyDxbfIhFoheWYlNB5ghjpaUOLjiBssERuEFjAyrGEVTC5ILipPSi0z1ihNzi0vz0vWS 83M3MQLD9vS/ZxN3MN4/YH2IMRlo3ERmKdHkfGDY55XEGxqbGVmYmpgaG5lbmpEmrCTOm/4o KUhIID2xJDU7NbUgtSi+qDQntfgQIxMHp1QDo06O8Z5b51JF0hj3W897zuAtc01w5q/n522P Lf2u4KDW52D3ZtKd1e0blb3646JeP5U7vJdbU+o3h2vTuZOSQm7uvqebN+VluDWyCSxovvAs 4fyPH47OIXMzD3CueZ9w5fnFpqZbO18V1ez+WvTX5OraTAV+s3U7nr07eHzjvmc+UtF5srvT ZiuxFGckGmoxFxUnAgD3IJPAcQIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrNIsWRmVeSWpSXmKPExsVy+t9jQV3VjLwgg+nfuS16z51ksrjy9T2b xaT7E1gszja9YXdg8dj+7QGrx/3u40wefVtWMQYwRzUw2mSkJqakFimk5iXnp2TmpdsqeQfH O8ebmhkY6hpaWpgrKeQl5qbaKrn4BOi6ZeYA7VNSKEvMKQUKBSQWFyvp22GaEBripmsB0xih 6xsSBNdjZIAGEtYwZjzovsVYcDC5YvLzXvYGxpmBXYycHBICJhKXzl9lhbDFJC7cW8/WxcjF ISQwnVHizuUj7BBON5PEvsP7GEGq2ARUJSauuM8GYosImEp0TFrKAmIzC/hJnDi/EswWFtCS uLrpPDOIzQJUP/nuPyYQm1fAWWJS0wcgmwNom4LEnEk2IGFOAReJcwcfgY0XAir5v6KffQIj 7wJGhlWMoqkFyQXFSem5RnrFibnFpXnpesn5uZsYwVHxTHoH46oGi0OMAhyMSjy8G9bmBgmx JpYVV+YeYpTgYFYS4Z0alxckxJuSWFmVWpQfX1Sak1p8iDEZ6KiJzFKiyfnAiM0riTc0NjEz sjQyN7QwMjYnTVhJnPdgq3WgkEB6YklqdmpqQWoRzBYmDk6pBkbzArVtp0XdVZdIhP+tetF5 anNzx4HfDVZb7rJbrXaQExMOSApb8iBJnelNvk5d6HxHJekrjRenud5585Gj4emm1oCvE6+b d1lYfAqVPx+k882o+ZmN0Fl7seytfP+eeMa2bpJbKrNv2ucvOv28Lcce7+MOX5F0evO1k6cu WUW29yWVli6eU6/EUpyRaKjFXFScCACzlSnrzgIAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Cc: Kyungmin Park 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.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, 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 fixes build error incurred by the re-factoring patch applying. The re-factoring patch set from Sean missed to apply the update to vidi module so this patch applies the update so that vidi module is also built correctly. Signed-off-by: Inki Dae Signed-off-by: Kyungmin Park --- drivers/gpu/drm/exynos/exynos_drm_vidi.c | 265 ++++++++++++++---------------- 1 file changed, 119 insertions(+), 146 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index d734098..669eba5 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c @@ -45,7 +45,8 @@ struct vidi_win_data { }; struct vidi_context { - struct exynos_drm_subdrv subdrv; + struct device *dev; + struct drm_device *drm_dev; struct drm_crtc *crtc; struct vidi_win_data win_data[WINDOWS_NR]; struct edid *raw_edid; @@ -55,6 +56,7 @@ struct vidi_context { unsigned int connected; bool vblank_on; bool suspended; + int pipe; bool direct_vblank; struct work_struct work; struct mutex lock; @@ -137,67 +139,28 @@ static int vidi_check_mode(struct device *dev, struct drm_display_mode *mode) } static struct exynos_drm_display_ops vidi_display_ops = { - .type = EXYNOS_DISPLAY_TYPE_VIDI, .is_connected = vidi_display_is_connected, .get_edid = vidi_get_edid, .get_panel = vidi_get_panel, .check_mode = vidi_check_mode, }; -static void vidi_dpms(void *in_ctx, int mode) -{ - struct vidi_context *ctx = in_ctx; - - DRM_DEBUG_KMS("%d\n", mode); - - mutex_lock(&ctx->lock); - - switch (mode) { - case DRM_MODE_DPMS_ON: - /* TODO. */ - break; - case DRM_MODE_DPMS_STANDBY: - case DRM_MODE_DPMS_SUSPEND: - case DRM_MODE_DPMS_OFF: - /* TODO. */ - break; - default: - DRM_DEBUG_KMS("unspecified mode %d\n", mode); - break; - } - - mutex_unlock(&ctx->lock); -} - -static void vidi_apply(void *in_ctx) -{ - 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; - int i; - - 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(ctx, i); - } - - if (mgr_ops && mgr_ops->commit) - mgr_ops->commit(ctx); -} +static struct exynos_drm_display vidi_display = { + .type = EXYNOS_DISPLAY_TYPE_VIDI, + .ops = &vidi_display_ops, +}; -static void vidi_commit(void *in_ctx) +static void vidi_commit(struct device *dev) { - struct vidi_context *ctx = in_ctx; + struct vidi_context *ctx = get_vidi_context(dev); if (ctx->suspended) return; } -static int vidi_enable_vblank(void *in_ctx) +static int vidi_enable_vblank(struct device *dev) { - struct vidi_context *ctx = in_ctx; + struct vidi_context *ctx = get_vidi_context(dev); if (ctx->suspended) return -EPERM; @@ -217,9 +180,9 @@ static int vidi_enable_vblank(void *in_ctx) return 0; } -static void vidi_disable_vblank(void *in_ctx) +static void vidi_disable_vblank(struct device *dev) { - struct vidi_context *ctx = in_ctx; + struct vidi_context *ctx = get_vidi_context(dev); if (ctx->suspended) return; @@ -228,9 +191,10 @@ static void vidi_disable_vblank(void *in_ctx) ctx->vblank_on = false; } -static void vidi_win_mode_set(void *in_ctx, struct exynos_drm_overlay *overlay) +static void vidi_win_mode_set(struct device *dev, + struct exynos_drm_overlay *overlay) { - struct vidi_context *ctx = in_ctx; + struct vidi_context *ctx = get_vidi_context(dev); struct vidi_win_data *win_data; int win; unsigned long offset; @@ -280,9 +244,9 @@ static void vidi_win_mode_set(void *in_ctx, struct exynos_drm_overlay *overlay) overlay->fb_width, overlay->crtc_width); } -static void vidi_win_commit(void *in_ctx, int zpos) +static void vidi_win_commit(struct device *dev, int zpos) { - struct vidi_context *ctx = in_ctx; + struct vidi_context *ctx = get_vidi_context(dev); struct vidi_win_data *win_data; int win = zpos; @@ -305,9 +269,9 @@ static void vidi_win_commit(void *in_ctx, int zpos) schedule_work(&ctx->work); } -static void vidi_win_disable(void *in_ctx, int zpos) +static void vidi_win_disable(struct device *dev, int zpos) { - struct vidi_context *ctx = in_ctx; + struct vidi_context *ctx = get_vidi_context(dev); struct vidi_win_data *win_data; int win = zpos; @@ -323,31 +287,75 @@ static void vidi_win_disable(void *in_ctx, int zpos) /* TODO. */ } -static struct exynos_drm_manager_ops vidi_manager_ops = { - .dpms = vidi_dpms, - .apply = vidi_apply, - .commit = vidi_commit, - .enable_vblank = vidi_enable_vblank, - .disable_vblank = vidi_disable_vblank, - .win_mode_set = vidi_win_mode_set, - .win_commit = vidi_win_commit, - .win_disable = vidi_win_disable, -}; +static void vidi_apply(struct device *dev) +{ + struct vidi_context *ctx = get_vidi_context(dev); + struct vidi_win_data *win_data; + int i; + + for (i = 0; i < WINDOWS_NR; i++) { + win_data = &ctx->win_data[i]; + if (win_data->enabled) + vidi_win_commit(dev, i); + } + + vidi_commit(dev); +} + +static int vidi_power_on(struct vidi_context *ctx, bool enable) +{ + 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(ctx->dev); + + vidi_apply(ctx->dev); + } else { + ctx->suspended = true; + } + + return 0; +} + +static void vidi_dpms(struct device *dev, int mode) +{ + struct vidi_context *ctx = get_vidi_context(dev); + + DRM_DEBUG_KMS("%d\n", mode); + + mutex_lock(&ctx->lock); + + switch (mode) { + case DRM_MODE_DPMS_ON: + vidi_power_on(ctx, true); + break; + case DRM_MODE_DPMS_STANDBY: + case DRM_MODE_DPMS_SUSPEND: + case DRM_MODE_DPMS_OFF: + vidi_power_on(ctx, false); + break; + default: + DRM_DEBUG_KMS("unspecified mode %d\n", mode); + break; + } + + mutex_unlock(&ctx->lock); +} -static struct exynos_drm_manager vidi_manager = { - .pipe = -1, - .ops = &vidi_manager_ops, - .display_ops = &vidi_display_ops, -}; static void vidi_fake_vblank_handler(struct work_struct *work) { struct vidi_context *ctx = container_of(work, struct vidi_context, work); - struct exynos_drm_subdrv *subdrv = &ctx->subdrv; - struct exynos_drm_manager *manager = subdrv->manager; - if (manager->pipe < 0) + if (ctx->pipe < 0 || !ctx->drm_dev) return; /* refresh rate is about 50Hz. */ @@ -356,7 +364,7 @@ static void vidi_fake_vblank_handler(struct work_struct *work) mutex_lock(&ctx->lock); if (ctx->direct_vblank) { - drm_handle_vblank(subdrv->drm_dev, manager->pipe); + drm_handle_vblank(ctx->drm_dev, ctx->pipe); ctx->direct_vblank = false; mutex_unlock(&ctx->lock); return; @@ -364,11 +372,17 @@ static void vidi_fake_vblank_handler(struct work_struct *work) mutex_unlock(&ctx->lock); - exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe); + exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe); } -static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev) +static int vidi_mgr_initialize(struct device *dev, struct drm_device *drm_dev, + int pipe) { + struct vidi_context *ctx = get_vidi_context(dev); + + ctx->drm_dev = drm_dev; + ctx->pipe = pipe; + /* * enable drm irq mode. * - with irq_enabled = 1, we can use the vblank feature. @@ -389,32 +403,27 @@ static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev) return 0; } -static void vidi_subdrv_remove(struct drm_device *drm_dev, struct device *dev) +static void vidi_mgr_remove(struct device *dev) { /* TODO. */ } -static int vidi_power_on(struct vidi_context *ctx, bool enable) -{ - 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(ctx); - - vidi_apply(ctx); - } else { - ctx->suspended = true; - } +static struct exynos_drm_manager_ops vidi_manager_ops = { + .initialize = vidi_mgr_initialize, + .remove = vidi_mgr_remove, + .dpms = vidi_dpms, + .commit = vidi_commit, + .enable_vblank = vidi_enable_vblank, + .disable_vblank = vidi_disable_vblank, + .win_mode_set = vidi_win_mode_set, + .win_commit = vidi_win_commit, + .win_disable = vidi_win_disable, +}; - return 0; -} +static struct exynos_drm_manager vidi_manager = { + .type = EXYNOS_DISPLAY_TYPE_VIDI, + .ops = &vidi_manager_ops, +}; static int vidi_show_connection(struct device *dev, struct device_attribute *attr, char *buf) @@ -457,7 +466,7 @@ static int vidi_store_connection(struct device *dev, DRM_DEBUG_KMS("requested connection.\n"); - drm_helper_hpd_irq_event(ctx->subdrv.drm_dev); + drm_helper_hpd_irq_event(ctx->drm_dev); return len; } @@ -468,10 +477,7 @@ static DEVICE_ATTR(connection, 0644, vidi_show_connection, int vidi_connection_ioctl(struct drm_device *drm_dev, void *data, struct drm_file *file_priv) { - struct vidi_context *ctx = NULL; - struct drm_encoder *encoder; - struct exynos_drm_manager *manager; - struct exynos_drm_display_ops *display_ops; + struct vidi_context *ctx; struct drm_exynos_vidi_connection *vidi = data; int edid_len; @@ -485,17 +491,7 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data, return -EINVAL; } - list_for_each_entry(encoder, &drm_dev->mode_config.encoder_list, - head) { - manager = exynos_drm_get_manager(encoder); - display_ops = manager->display_ops; - - if (display_ops->type == EXYNOS_DISPLAY_TYPE_VIDI) { - ctx = get_vidi_context(manager->dev); - break; - } - } - + ctx = get_vidi_context(vidi_manager.dev); if (!ctx) { DRM_DEBUG_KMS("not found virtual device type encoder.\n"); return -EINVAL; @@ -531,7 +527,7 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data, } ctx->connected = vidi->connection; - drm_helper_hpd_irq_event(ctx->subdrv.drm_dev); + drm_helper_hpd_irq_event(ctx->drm_dev); return 0; } @@ -540,7 +536,6 @@ static int vidi_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct vidi_context *ctx; - struct exynos_drm_subdrv *subdrv; int ret; ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); @@ -551,22 +546,20 @@ static int vidi_probe(struct platform_device *pdev) INIT_WORK(&ctx->work, vidi_fake_vblank_handler); - subdrv = &ctx->subdrv; - subdrv->dev = dev; - subdrv->manager = &vidi_manager; - subdrv->probe = vidi_subdrv_probe; - subdrv->remove = vidi_subdrv_remove; - mutex_init(&ctx->lock); platform_set_drvdata(pdev, ctx); + vidi_manager.dev = dev; + exynos_drm_manager_register(&vidi_manager); + + vidi_display.dev = dev; + exynos_drm_display_register(&vidi_display); + ret = device_create_file(dev, &dev_attr_connection); if (ret < 0) DRM_INFO("failed to create connection sysfs.\n"); - exynos_drm_subdrv_register(subdrv); - return 0; } @@ -574,7 +567,8 @@ static int vidi_remove(struct platform_device *pdev) { struct vidi_context *ctx = platform_get_drvdata(pdev); - exynos_drm_subdrv_unregister(&ctx->subdrv); + exynos_drm_display_unregister(&vidi_display); + exynos_drm_manager_unregister(&vidi_manager); if (ctx->raw_edid != (struct edid *)fake_edid_info) { kfree(ctx->raw_edid); @@ -584,32 +578,11 @@ static int vidi_remove(struct platform_device *pdev) return 0; } -#ifdef CONFIG_PM_SLEEP -static int vidi_suspend(struct device *dev) -{ - struct vidi_context *ctx = get_vidi_context(dev); - - return vidi_power_on(ctx, false); -} - -static int vidi_resume(struct device *dev) -{ - struct vidi_context *ctx = get_vidi_context(dev); - - return vidi_power_on(ctx, true); -} -#endif - -static const struct dev_pm_ops vidi_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(vidi_suspend, vidi_resume) -}; - struct platform_driver vidi_driver = { .probe = vidi_probe, .remove = vidi_remove, .driver = { .name = "exynos-drm-vidi", .owner = THIS_MODULE, - .pm = &vidi_pm_ops, }, };