[PATCH] drm: correctly update connector DPMS status in drm_fb_helper
Dave Airlie
airlied at gmail.com
Tue Jul 6 20:30:10 PDT 2010
On Sat, Jul 3, 2010 at 3:48 AM, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
> We don't currently update the DPMS status of the connector (both in the
> connector itself and the connector's DPMS property) in the fb helper
> code. This means that if the kernel FB core has blanked the screen,
> sysfs will still show a DPMS status of "on". It also means that when X
> starts, it will try to light up the connectors, but the drm_crtc_helper
> code will ignore the DPMS change since according to the connector, the
> DPMS status is already on.
>
> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=28436 (the annoying
> "my screen was blanked when I started X and now it won't light up" bug).
>
Yay finally that is fixed, I apologies for not getting to it myself,
sent to Linus.
Dave.
> Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
>
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index b3779d2..32f67cb 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -315,8 +315,9 @@ static void drm_fb_helper_on(struct fb_info *info)
> 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;
> + int i, j;
>
> /*
> * For each CRTC in this fb, turn the crtc on then,
> @@ -332,7 +333,14 @@ static void drm_fb_helper_on(struct fb_info *info)
>
> crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
>
> -
> + /* Walk the connectors & encoders on this fb turning them on */
> + for (j = 0; j < fb_helper->connector_count; j++) {
> + connector = fb_helper->connector_info[j]->connector;
> + connector->dpms = DRM_MODE_DPMS_ON;
> + drm_connector_property_set_value(connector,
> + dev->mode_config.dpms_property,
> + 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) {
> @@ -352,8 +360,9 @@ static void drm_fb_helper_off(struct fb_info *info, int dpms_mode)
> 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;
> + int i, j;
>
> /*
> * For each CRTC in this fb, find all associated encoders
> @@ -367,6 +376,14 @@ static void drm_fb_helper_off(struct fb_info *info, int dpms_mode)
> 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) {
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
More information about the dri-devel
mailing list