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? 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