Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63498e30 authored by Gustavo Padovan's avatar Gustavo Padovan Committed by Inki Dae
Browse files

drm/exynos: atomic dpms support



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

v4: - remove win_commit() call from .enable()

v5: - move .atomic_check() to the atomic PageFlip patch, and transform it
in .atomic_begin()

Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: default avatarJoonyoung Shim <jy0922.shim@samsung.com>
Tested-by: default avatarTobias Jakobi <tjakobi@math.uni-bielefeld.de>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent d6562a29
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -500,7 +500,7 @@ static void ps8622_connector_destroy(struct drm_connector *connector)
}
}


static const struct drm_connector_funcs ps8622_connector_funcs = {
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,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.detect = ps8622_detect,
	.detect = ps8622_detect,
	.destroy = ps8622_connector_destroy,
	.destroy = ps8622_connector_destroy,
+1 −1
Original line number Original line Diff line number Diff line
@@ -259,7 +259,7 @@ static void ptn3460_connector_destroy(struct drm_connector *connector)
}
}


static struct drm_connector_funcs ptn3460_connector_funcs = {
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,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.detect = ptn3460_detect,
	.detect = ptn3460_detect,
	.destroy = ptn3460_connector_destroy,
	.destroy = ptn3460_connector_destroy,
+1 −1
Original line number Original line Diff line number Diff line
@@ -953,7 +953,7 @@ static void exynos_dp_connector_destroy(struct drm_connector *connector)
}
}


static struct drm_connector_funcs exynos_dp_connector_funcs = {
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,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.detect = exynos_dp_detect,
	.detect = exynos_dp_detect,
	.destroy = exynos_dp_connector_destroy,
	.destroy = exynos_dp_connector_destroy,
+23 −35
Original line number Original line Diff line number Diff line
@@ -22,40 +22,41 @@
#include "exynos_drm_encoder.h"
#include "exynos_drm_encoder.h"
#include "exynos_drm_plane.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_crtc *exynos_crtc = to_exynos_crtc(crtc);


	DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode);
	if (exynos_crtc->enabled)

	if (exynos_crtc->dpms == mode) {
		DRM_DEBUG_KMS("desired dpms mode is same as previous one.\n");
		return;
		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)
	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_disable(struct drm_crtc *crtc)
static void exynos_drm_crtc_disable(struct drm_crtc *crtc)
{
{
	struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
	struct drm_plane *plane;
	struct drm_plane *plane;
	int ret;
	int ret;


	exynos_drm_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
	if (!exynos_crtc->enabled)
		return;

	/* 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, DRM_MODE_DPMS_OFF);

	exynos_crtc->enabled = false;


	drm_for_each_legacy_plane(plane, &crtc->dev->mode_config.plane_list) {
	drm_for_each_legacy_plane(plane, &crtc->dev->mode_config.plane_list) {
		if (plane->crtc != crtc)
		if (plane->crtc != crtc)
@@ -67,17 +68,6 @@ static void exynos_drm_crtc_disable(struct drm_crtc *crtc)
	}
	}
}
}


static void exynos_drm_crtc_commit(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);

	exynos_drm_crtc_dpms(crtc, DRM_MODE_DPMS_ON);

	if (exynos_crtc->ops->win_commit)
		exynos_crtc->ops->win_commit(exynos_crtc, exynos_plane->zpos);
}

static bool
static bool
exynos_drm_crtc_mode_fixup(struct drm_crtc *crtc,
exynos_drm_crtc_mode_fixup(struct drm_crtc *crtc,
			    const struct drm_display_mode *mode,
			    const struct drm_display_mode *mode,
@@ -116,9 +106,8 @@ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc)
}
}


static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
	.dpms		= exynos_drm_crtc_dpms,
	.enable		= exynos_drm_crtc_enable,
	.disable	= exynos_drm_crtc_disable,
	.disable	= exynos_drm_crtc_disable,
	.commit		= exynos_drm_crtc_commit,
	.mode_fixup	= exynos_drm_crtc_mode_fixup,
	.mode_fixup	= exynos_drm_crtc_mode_fixup,
	.mode_set_nofb	= exynos_drm_crtc_mode_set_nofb,
	.mode_set_nofb	= exynos_drm_crtc_mode_set_nofb,
	.atomic_begin	= exynos_crtc_atomic_begin,
	.atomic_begin	= exynos_crtc_atomic_begin,
@@ -163,7 +152,6 @@ struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,


	init_waitqueue_head(&exynos_crtc->pending_flip_queue);
	init_waitqueue_head(&exynos_crtc->pending_flip_queue);


	exynos_crtc->dpms = DRM_MODE_DPMS_OFF;
	exynos_crtc->pipe = pipe;
	exynos_crtc->pipe = pipe;
	exynos_crtc->type = type;
	exynos_crtc->type = type;
	exynos_crtc->ops = ops;
	exynos_crtc->ops = ops;
@@ -194,7 +182,7 @@ int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe)
	struct exynos_drm_crtc *exynos_crtc =
	struct exynos_drm_crtc *exynos_crtc =
		to_exynos_crtc(private->crtc[pipe]);
		to_exynos_crtc(private->crtc[pipe]);


	if (exynos_crtc->dpms != DRM_MODE_DPMS_ON)
	if (!exynos_crtc->enabled)
		return -EPERM;
		return -EPERM;


	if (exynos_crtc->ops->enable_vblank)
	if (exynos_crtc->ops->enable_vblank)
@@ -209,7 +197,7 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int pipe)
	struct exynos_drm_crtc *exynos_crtc =
	struct exynos_drm_crtc *exynos_crtc =
		to_exynos_crtc(private->crtc[pipe]);
		to_exynos_crtc(private->crtc[pipe]);


	if (exynos_crtc->dpms != DRM_MODE_DPMS_ON)
	if (!exynos_crtc->enabled)
		return;
		return;


	if (exynos_crtc->ops->disable_vblank)
	if (exynos_crtc->ops->disable_vblank)
+1 −1
Original line number Original line Diff line number Diff line
@@ -60,7 +60,7 @@ static void exynos_dpi_connector_destroy(struct drm_connector *connector)
}
}


static struct drm_connector_funcs exynos_dpi_connector_funcs = {
static struct drm_connector_funcs exynos_dpi_connector_funcs = {
	.dpms = drm_helper_connector_dpms,
	.dpms = drm_atomic_helper_connector_dpms,
	.detect = exynos_dpi_detect,
	.detect = exynos_dpi_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.destroy = exynos_dpi_connector_destroy,
	.destroy = exynos_dpi_connector_destroy,
Loading