Hi,

On 02/04/2015 04:14 AM, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.padovan at collabora.co.uk>
> 
> The new atomic infrastructure needs the .mode_set_nofb() callback to
> update CRTC timings before setting any plane.
> 
> Signed-off-by: Gustavo Padovan <gustavo.padovan at collabora.co.uk>
> 
> Conflicts:
>       drivers/gpu/drm/exynos/exynos_drm_crtc.c
> ---
>  drivers/gpu/drm/exynos/exynos_drm_crtc.c | 55 
> +++++++-------------------------
>  1 file changed, 11 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
> b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> index be36cca..17b64f8 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> @@ -81,53 +81,19 @@ exynos_drm_crtc_mode_fixup(struct drm_crtc *crtc,
>       return true;
>  }
>  
> -static int
> -exynos_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode 
> *mode,
> -                       struct drm_display_mode *adjusted_mode, int x, int y,
> -                       struct drm_framebuffer *old_fb)
> -{
> -     struct drm_framebuffer *fb = crtc->primary->fb;
> -     unsigned int crtc_w;
> -     unsigned int crtc_h;
> -     int ret;
> -
> -     ret = exynos_check_plane(crtc->primary, fb);
> -     if (ret < 0)
> -             return ret;
> -
> -     crtc_w = fb->width - x;
> -     crtc_h = fb->height - y;
> -     exynos_plane_mode_set(crtc->primary, crtc, fb, 0, 0,
> -                           crtc_w, crtc_h, x, y, crtc_w, crtc_h);
> -
> -     return 0;
> -}
> -
> -static int exynos_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
> -                                       struct drm_framebuffer *old_fb)
> +static void
> +exynos_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
>  {
>       struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
> -     struct drm_framebuffer *fb = crtc->primary->fb;
> -     unsigned int crtc_w;
> -     unsigned int crtc_h;
> -     int ret;
> +     struct drm_display_mode *adjusted_mode;
>  
> -     /* when framebuffer changing is requested, crtc's dpms should be on */
> -     if (exynos_crtc->dpms > DRM_MODE_DPMS_ON) {
> -             DRM_ERROR("failed framebuffer changing request.\n");
> -             return -EPERM;
> -     }
> -
> -     ret = exynos_check_plane(crtc->primary, fb);
> -     if (ret)
> -             return ret;
> +     if (WARN_ON(!crtc->state))
> +             return;
>  
> -     crtc_w = fb->width - x;
> -     crtc_h = fb->height - y;
> -     exynos_update_plane(crtc->primary, crtc, fb, 0, 0,
> -                         crtc_w, crtc_h, x, y, crtc_w, crtc_h);
> +     adjusted_mode = &crtc->state->adjusted_mode;
>  
> -     return 0;
> +     if (exynos_crtc->ops->commit)
> +             exynos_crtc->ops->commit(exynos_crtc);

This already should be executed by .commit of struct
drm_crtc_helper_funcs, not here.

Thanks.

>  }
>  
>  static void exynos_drm_crtc_disable(struct drm_crtc *crtc)
> @@ -184,8 +150,9 @@ static struct drm_crtc_helper_funcs 
> exynos_crtc_helper_funcs = {
>       .prepare        = exynos_drm_crtc_prepare,
>       .commit         = exynos_drm_crtc_commit,
>       .mode_fixup     = exynos_drm_crtc_mode_fixup,
> -     .mode_set       = exynos_drm_crtc_mode_set,
> -     .mode_set_base  = exynos_drm_crtc_mode_set_base,
> +     .mode_set       = drm_helper_crtc_mode_set,
> +     .mode_set_nofb  = exynos_drm_crtc_mode_set_nofb,
> +     .mode_set_base  = drm_helper_crtc_mode_set_base,
>       .disable        = exynos_drm_crtc_disable,
>       .atomic_begin   = exynos_crtc_atomic_begin,
>       .atomic_flush   = exynos_crtc_atomic_flush,
> 

Reply via email to