Hi,

On 2015년 05월 22일 05:02, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.padovan at collabora.co.uk>
> 
> Run dpms operations through the atomic intefaces. This basically removes
> the .dpms() callback from econders and crtcs and use .disable() and
> .enable() to turn the crtc on and off.
> 
> v2: Address comments by Joonyoung:
>       - make hdmi code call ->disable() instead of ->dpms()
>       - do not use WARN_ON on crtc enable/disable
> 
> v3: - Fix build failure after the hdmi change in v2
>     - Change dpms helper of ptn3460 bridge
> 
> Signed-off-by: Gustavo Padovan <gustavo.padovan at collabora.co.uk>
> ---
>  drivers/gpu/drm/bridge/ps8622.c             |  2 +-
>  drivers/gpu/drm/bridge/ptn3460.c            |  2 +-
>  drivers/gpu/drm/exynos/exynos_dp_core.c     |  2 +-
>  drivers/gpu/drm/exynos/exynos_drm_crtc.c    | 99 
> ++++++++++++++++-------------
>  drivers/gpu/drm/exynos/exynos_drm_dpi.c     |  2 +-
>  drivers/gpu/drm/exynos/exynos_drm_drv.h     |  4 +-
>  drivers/gpu/drm/exynos/exynos_drm_dsi.c     |  2 +-
>  drivers/gpu/drm/exynos/exynos_drm_encoder.c | 27 ++------
>  drivers/gpu/drm/exynos/exynos_drm_vidi.c    |  2 +-
>  drivers/gpu/drm/exynos/exynos_hdmi.c        |  6 +-
>  10 files changed, 71 insertions(+), 77 deletions(-)
> 
> diff --git a/drivers/gpu/drm/bridge/ps8622.c b/drivers/gpu/drm/bridge/ps8622.c
> index b604326..d686235 100644
> --- a/drivers/gpu/drm/bridge/ps8622.c
> +++ b/drivers/gpu/drm/bridge/ps8622.c
> @@ -499,7 +499,7 @@ static void ps8622_connector_destroy(struct drm_connector 
> *connector)
>  }
>  
>  static const struct drm_connector_funcs ps8622_connector_funcs = {
> -     .dpms = drm_helper_connector_dpms,
> +     .dpms = drm_atomic_helper_connector_dpms,
>       .fill_modes = drm_helper_probe_single_connector_modes,
>       .detect = ps8622_detect,
>       .destroy = ps8622_connector_destroy,
> diff --git a/drivers/gpu/drm/bridge/ptn3460.c 
> b/drivers/gpu/drm/bridge/ptn3460.c
> index 8ed3617..260bc9f 100644
> --- a/drivers/gpu/drm/bridge/ptn3460.c
> +++ b/drivers/gpu/drm/bridge/ptn3460.c
> @@ -260,7 +260,7 @@ static void ptn3460_connector_destroy(struct 
> drm_connector *connector)
>  }
>  
>  static struct drm_connector_funcs ptn3460_connector_funcs = {
> -     .dpms = drm_helper_connector_dpms,
> +     .dpms = drm_atomic_helper_connector_dpms,
>       .fill_modes = drm_helper_probe_single_connector_modes,
>       .detect = ptn3460_detect,
>       .destroy = ptn3460_connector_destroy,
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c 
> b/drivers/gpu/drm/exynos/exynos_dp_core.c
> index 195fe60..c9995b1 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.c
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
> @@ -954,7 +954,7 @@ static void exynos_dp_connector_destroy(struct 
> drm_connector *connector)
>  }
>  
>  static struct drm_connector_funcs exynos_dp_connector_funcs = {
> -     .dpms = drm_helper_connector_dpms,
> +     .dpms = drm_atomic_helper_connector_dpms,
>       .fill_modes = drm_helper_probe_single_connector_modes,
>       .detect = exynos_dp_detect,
>       .destroy = exynos_dp_connector_destroy,
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
> b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> index 3251652..92a5595 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> @@ -22,51 +22,57 @@
>  #include "exynos_drm_encoder.h"
>  #include "exynos_drm_plane.h"
>  
> -static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode)
> +static void exynos_drm_crtc_enable(struct drm_crtc *crtc)
>  {
>       struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
> +     struct exynos_drm_plane *exynos_plane = to_exynos_plane(crtc->primary);
>  
> -     DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode);
> -
> -     if (exynos_crtc->dpms == mode) {
> -             DRM_DEBUG_KMS("desired dpms mode is same as previous one.\n");
> +     if (exynos_crtc->enabled)
>               return;
> -     }
> -
> -     if (mode > DRM_MODE_DPMS_ON) {
> -             /* wait for the completion of page flip. */
> -             if (!wait_event_timeout(exynos_crtc->pending_flip_queue,
> -                             (exynos_crtc->event == NULL), HZ/20))
> -                     exynos_crtc->event = NULL;
> -             drm_crtc_vblank_off(crtc);
> -     }
>  
>       if (exynos_crtc->ops->dpms)
> -             exynos_crtc->ops->dpms(exynos_crtc, mode);
> +             exynos_crtc->ops->dpms(exynos_crtc, DRM_MODE_DPMS_ON);
>  
> -     exynos_crtc->dpms = mode;
> +     exynos_crtc->enabled = true;
>  
> -     if (mode == DRM_MODE_DPMS_ON)
> -             drm_crtc_vblank_on(crtc);
> -}
> +     drm_crtc_vblank_on(crtc);
>  
> -static void exynos_drm_crtc_prepare(struct drm_crtc *crtc)
> -{
> -     /* drm framework doesn't check NULL. */
> +     if (exynos_crtc->ops->win_commit)
> +             exynos_crtc->ops->win_commit(exynos_crtc, exynos_plane->zpos);
> +
> +     if (exynos_crtc->ops->commit)
> +             exynos_crtc->ops->commit(exynos_crtc);

crtc commit already was called by mode_set_nofb callback as soon as it
disables crtc and encoder devices so I think unnecessary. Please see the
drm_atomic_helper_commit_modeset_disable function.

<--snip-->

Thanks,
Inki Dae

Reply via email to