2013/10/28 Sean Paul <seanpaul@xxxxxxxxxxxx>: > On Mon, Oct 28, 2013 at 9:35 AM, Inki Dae <inki.dae@xxxxxxxxxxx> wrote: >> 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. >> > > Thanks for posting. Sorry about the breakage. I started fixing this as > part of my patch set on Friday. I think it might be better to fix > these as part of the original patch so we preserve bisectability. Do > you want me to continue this and send a revised patch set? > Ok, go ahead. And please know that I requested this fixup to you two times but I cannot get back from you so I posted this patch instead of you. > Sean > > >> Signed-off-by: Inki Dae <inki.dae@xxxxxxxxxxx> >> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> >> --- >> 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, >> }, >> }; >> -- >> 1.7.9.5 >> >> _______________________________________________ >> dri-devel mailing list >> dri-devel@xxxxxxxxxxxxxxxxxxxxx >> http://lists.freedesktop.org/mailman/listinfo/dri-devel > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel