drm/exynos: vidi: fix build error

Inki Dae inki.dae at samsung.com
Tue Oct 29 07:40:14 CET 2013


2013/10/28 Sean Paul <seanpaul at chromium.org>:
> On Mon, Oct 28, 2013 at 9:35 AM, Inki Dae <inki.dae at 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 at samsung.com>
>> Signed-off-by: Kyungmin Park <kyungmin.park at 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 at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list