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

Commit 3a8148c5 authored by Sascha Hauer's avatar Sascha Hauer Committed by Dave Airlie
Browse files

drm fb helper: use drm_helper_connector_dpms to do dpms



drm_fb_helper_on|off currently manually searches for encoders
to turn on/off. Make this simpler by using the helper function.

Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 4cae5b84
Loading
Loading
Loading
Loading
+10 −70
Original line number Original line Diff line number Diff line
@@ -306,91 +306,31 @@ static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = {
static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { };
static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { };
#endif
#endif


static void drm_fb_helper_on(struct fb_info *info)
static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)
{
{
	struct drm_fb_helper *fb_helper = info->par;
	struct drm_fb_helper *fb_helper = info->par;
	struct drm_device *dev = fb_helper->dev;
	struct drm_device *dev = fb_helper->dev;
	struct drm_crtc *crtc;
	struct drm_crtc *crtc;
	struct drm_crtc_helper_funcs *crtc_funcs;
	struct drm_connector *connector;
	struct drm_connector *connector;
	struct drm_encoder *encoder;
	int i, j;
	int i, j;


	/*
	/*
	 * For each CRTC in this fb, turn the crtc on then,
	 * For each CRTC in this fb, turn the connectors on/off.
	 * find all associated encoders and turn them on.
	 */
	 */
	mutex_lock(&dev->mode_config.mutex);
	mutex_lock(&dev->mode_config.mutex);
	for (i = 0; i < fb_helper->crtc_count; i++) {
	for (i = 0; i < fb_helper->crtc_count; i++) {
		crtc = fb_helper->crtc_info[i].mode_set.crtc;
		crtc = fb_helper->crtc_info[i].mode_set.crtc;
		crtc_funcs = crtc->helper_private;


		if (!crtc->enabled)
		if (!crtc->enabled)
			continue;
			continue;


		crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
		/* Walk the connectors & encoders on this fb turning them on/off */

		/* Walk the connectors & encoders on this fb turning them on */
		for (j = 0; j < fb_helper->connector_count; j++) {
		for (j = 0; j < fb_helper->connector_count; j++) {
			connector = fb_helper->connector_info[j]->connector;
			connector = fb_helper->connector_info[j]->connector;
			connector->dpms = DRM_MODE_DPMS_ON;
			drm_helper_connector_dpms(connector, dpms_mode);
			drm_connector_property_set_value(connector,
			drm_connector_property_set_value(connector,
							 dev->mode_config.dpms_property,
				dev->mode_config.dpms_property, dpms_mode);
							 DRM_MODE_DPMS_ON);
		}
		/* Found a CRTC on this fb, now find encoders */
		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
			if (encoder->crtc == crtc) {
				struct drm_encoder_helper_funcs *encoder_funcs;

				encoder_funcs = encoder->helper_private;
				encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
			}
		}
	}
	mutex_unlock(&dev->mode_config.mutex);
}

static void drm_fb_helper_off(struct fb_info *info, int dpms_mode)
{
	struct drm_fb_helper *fb_helper = info->par;
	struct drm_device *dev = fb_helper->dev;
	struct drm_crtc *crtc;
	struct drm_crtc_helper_funcs *crtc_funcs;
	struct drm_connector *connector;
	struct drm_encoder *encoder;
	int i, j;

	/*
	 * For each CRTC in this fb, find all associated encoders
	 * and turn them off, then turn off the CRTC.
	 */
	mutex_lock(&dev->mode_config.mutex);
	for (i = 0; i < fb_helper->crtc_count; i++) {
		crtc = fb_helper->crtc_info[i].mode_set.crtc;
		crtc_funcs = crtc->helper_private;

		if (!crtc->enabled)
			continue;

		/* Walk the connectors on this fb and mark them off */
		for (j = 0; j < fb_helper->connector_count; j++) {
			connector = fb_helper->connector_info[j]->connector;
			connector->dpms = dpms_mode;
			drm_connector_property_set_value(connector,
							 dev->mode_config.dpms_property,
							 dpms_mode);
		}
		/* Found a CRTC on this fb, now find encoders */
		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
			if (encoder->crtc == crtc) {
				struct drm_encoder_helper_funcs *encoder_funcs;

				encoder_funcs = encoder->helper_private;
				encoder_funcs->dpms(encoder, dpms_mode);
			}
		}
		}
		crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
	}
	}
	mutex_unlock(&dev->mode_config.mutex);
	mutex_unlock(&dev->mode_config.mutex);
}
}
@@ -400,23 +340,23 @@ int drm_fb_helper_blank(int blank, struct fb_info *info)
	switch (blank) {
	switch (blank) {
	/* Display: On; HSync: On, VSync: On */
	/* Display: On; HSync: On, VSync: On */
	case FB_BLANK_UNBLANK:
	case FB_BLANK_UNBLANK:
		drm_fb_helper_on(info);
		drm_fb_helper_dpms(info, DRM_MODE_DPMS_ON);
		break;
		break;
	/* Display: Off; HSync: On, VSync: On */
	/* Display: Off; HSync: On, VSync: On */
	case FB_BLANK_NORMAL:
	case FB_BLANK_NORMAL:
		drm_fb_helper_off(info, DRM_MODE_DPMS_STANDBY);
		drm_fb_helper_dpms(info, DRM_MODE_DPMS_STANDBY);
		break;
		break;
	/* Display: Off; HSync: Off, VSync: On */
	/* Display: Off; HSync: Off, VSync: On */
	case FB_BLANK_HSYNC_SUSPEND:
	case FB_BLANK_HSYNC_SUSPEND:
		drm_fb_helper_off(info, DRM_MODE_DPMS_STANDBY);
		drm_fb_helper_dpms(info, DRM_MODE_DPMS_STANDBY);
		break;
		break;
	/* Display: Off; HSync: On, VSync: Off */
	/* Display: Off; HSync: On, VSync: Off */
	case FB_BLANK_VSYNC_SUSPEND:
	case FB_BLANK_VSYNC_SUSPEND:
		drm_fb_helper_off(info, DRM_MODE_DPMS_SUSPEND);
		drm_fb_helper_dpms(info, DRM_MODE_DPMS_SUSPEND);
		break;
		break;
	/* Display: Off; HSync: Off, VSync: Off */
	/* Display: Off; HSync: Off, VSync: Off */
	case FB_BLANK_POWERDOWN:
	case FB_BLANK_POWERDOWN:
		drm_fb_helper_off(info, DRM_MODE_DPMS_OFF);
		drm_fb_helper_dpms(info, DRM_MODE_DPMS_OFF);
		break;
		break;
	}
	}
	return 0;
	return 0;