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

Commit f026eb6e authored by Sylvain Rochet's avatar Sylvain Rochet Committed by Boris Brezillon
Browse files

drm: atmel-hlcdc: use appropriate enabled flag in suspend/resume



Unfortunately we used the enabled flag in struct drm_crtc instead of the
enabled flag in struct atmel_hlcdc_crtc. This obviously leads to
discrepancies on crtc enable state.

This patch fixes the issue by using the struct atmel_hlcdc_crtc enabled
flag in PM support.

Signed-off-by: default avatarSylvain Rochet <sylvain.rochet@finsecur.com>
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
parent 03be7005
Loading
Loading
Loading
Loading
+21 −0
Original line number Original line Diff line number Diff line
@@ -207,6 +207,27 @@ static void atmel_hlcdc_crtc_enable(struct drm_crtc *c)
	crtc->enabled = true;
	crtc->enabled = true;
}
}


void atmel_hlcdc_crtc_suspend(struct drm_crtc *c)
{
	struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);

	if (crtc->enabled) {
		atmel_hlcdc_crtc_disable(c);
		/* save enable state for resume */
		crtc->enabled = true;
	}
}

void atmel_hlcdc_crtc_resume(struct drm_crtc *c)
{
	struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);

	if (crtc->enabled) {
		crtc->enabled = false;
		atmel_hlcdc_crtc_enable(c);
	}
}

static int atmel_hlcdc_crtc_atomic_check(struct drm_crtc *c,
static int atmel_hlcdc_crtc_atomic_check(struct drm_crtc *c,
					 struct drm_crtc_state *s)
					 struct drm_crtc_state *s)
{
{
+4 −15
Original line number Original line Diff line number Diff line
@@ -569,14 +569,8 @@ static int atmel_hlcdc_dc_drm_suspend(struct device *dev)
		return 0;
		return 0;


	drm_modeset_lock_all(drm_dev);
	drm_modeset_lock_all(drm_dev);
	list_for_each_entry(crtc, &drm_dev->mode_config.crtc_list, head) {
	list_for_each_entry(crtc, &drm_dev->mode_config.crtc_list, head)
		struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
		atmel_hlcdc_crtc_suspend(crtc);
		if (crtc->enabled) {
			crtc_funcs->disable(crtc);
			/* save enable state for resume */
			crtc->enabled = true;
		}
	}
	drm_modeset_unlock_all(drm_dev);
	drm_modeset_unlock_all(drm_dev);
	return 0;
	return 0;
}
}
@@ -590,13 +584,8 @@ static int atmel_hlcdc_dc_drm_resume(struct device *dev)
		return 0;
		return 0;


	drm_modeset_lock_all(drm_dev);
	drm_modeset_lock_all(drm_dev);
	list_for_each_entry(crtc, &drm_dev->mode_config.crtc_list, head) {
	list_for_each_entry(crtc, &drm_dev->mode_config.crtc_list, head)
		struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
		atmel_hlcdc_crtc_resume(crtc);
		if (crtc->enabled) {
			crtc->enabled = false;
			crtc_funcs->enable(crtc);
		}
	}
	drm_modeset_unlock_all(drm_dev);
	drm_modeset_unlock_all(drm_dev);
	return 0;
	return 0;
}
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -155,6 +155,9 @@ void atmel_hlcdc_crtc_irq(struct drm_crtc *c);
void atmel_hlcdc_crtc_cancel_page_flip(struct drm_crtc *crtc,
void atmel_hlcdc_crtc_cancel_page_flip(struct drm_crtc *crtc,
				       struct drm_file *file);
				       struct drm_file *file);


void atmel_hlcdc_crtc_suspend(struct drm_crtc *crtc);
void atmel_hlcdc_crtc_resume(struct drm_crtc *crtc);

int atmel_hlcdc_crtc_create(struct drm_device *dev);
int atmel_hlcdc_crtc_create(struct drm_device *dev);


int atmel_hlcdc_create_outputs(struct drm_device *dev);
int atmel_hlcdc_create_outputs(struct drm_device *dev);