Message ID | 1382967331-6243-2-git-send-email-inki.dae@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Oct 28, 2013 at 9:35 AM, Inki Dae <inki.dae@samsung.com> 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@samsung.com> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> > --- > 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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
2013/10/28 Sean Paul <seanpaul@chromium.org>: > On Mon, Oct 28, 2013 at 9:35 AM, Inki Dae <inki.dae@samsung.com> 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@samsung.com> >> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> >> --- >> 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@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/dri-devel > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
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, }, };