st/egl: Set dpms to on when showing screens

There is a wonderful bug in 2.6.29 that causes a hard lock on my
	computer when this code is active for lvds that are turned off.
This commit is contained in:
Jakob Bornecrantz
2009-03-25 20:51:47 +00:00
committed by Jakob Bornecrantz
parent 78abcb88fe
commit e21d31e8ab
3 changed files with 31 additions and 0 deletions
@@ -330,6 +330,13 @@ drm_show_screen_surface_mesa(_EGLDriver *drv, EGLDisplay dpy,
if (ret)
goto err_crtc;
if (scrn->dpms)
drmModeConnectorSetProperty(dev->drmFD,
scrn->connectorID,
scrn->dpms->prop_id,
DRM_MODE_DPMS_ON);
surf->screen = scrn;
scrn->surf = surf;
@@ -107,6 +107,25 @@ drm_add_modes_from_connector(_EGLScreen *screen, drmModeConnectorPtr connector)
}
}
static void
drm_find_dpms(struct drm_device *dev, struct drm_screen *screen)
{
drmModeConnectorPtr c = screen->connector;
drmModePropertyPtr p;
int i;
for (i = 0; i < c->count_props; i++) {
p = drmModeGetProperty(dev->drmFD, c->props[i]);
if (!strcmp(p->name, "DPMS"))
break;
drmModeFreeProperty(p);
p = NULL;
}
screen->dpms = p;
}
EGLBoolean
drm_initialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
{
@@ -160,6 +179,7 @@ drm_initialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
_eglInitScreen(&screen->base);
_eglAddScreen(disp, &screen->base);
drm_add_modes_from_connector(&screen->base, connector);
drm_find_dpms(dev, screen);
dev->screens[num_screens++] = screen;
}
dev->count_screens = num_screens;
@@ -206,6 +226,7 @@ drm_terminate(_EGLDriver *drv, EGLDisplay dpy)
if (screen->shown)
drm_takedown_shown_screen(drv, screen);
drmModeFreeProperty(screen->dpms);
drmModeFreeConnector(screen->connector);
_eglDestroyScreen(&screen->base);
dev->screens[i] = NULL;
@@ -114,6 +114,9 @@ struct drm_screen
drmModeConnectorPtr connector;
uint32_t connectorID;
/* dpms property */
drmModePropertyPtr dpms;
/* Has this screen been shown */
int shown;