uterm: share drm-video wakeup helpers

The dumb and drm backends still use the same code to perform wakeup/sleep
code. Hence, move it into the drm-shared file so we can use the same
helpers for both.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2013-01-12 01:01:54 +01:00
parent 9d70156dc9
commit 415a53bfd7
4 changed files with 51 additions and 50 deletions

View File

@ -516,3 +516,41 @@ int uterm_drm_video_hotplug(struct uterm_video *video,
video->flags &= ~VIDEO_HOTPLUG;
return 0;
}
int uterm_drm_video_wake_up(struct uterm_video *video,
const struct display_ops *ops)
{
int ret;
struct uterm_drm_video *vdrm = video->data;
ret = drmSetMaster(vdrm->fd);
if (ret) {
log_err("cannot set DRM-master");
return -EACCES;
}
video->flags |= VIDEO_AWAKE;
ret = uterm_drm_video_hotplug(video, ops);
if (ret) {
video->flags &= ~VIDEO_AWAKE;
drmDropMaster(vdrm->fd);
return ret;
}
return 0;
}
void uterm_drm_video_sleep(struct uterm_video *video)
{
struct uterm_drm_video *vdrm = video->data;
drmDropMaster(vdrm->fd);
video->flags &= ~VIDEO_AWAKE;
}
int uterm_drm_video_poll(struct uterm_video *video,
const struct display_ops *ops)
{
video->flags |= VIDEO_HOTPLUG;
return uterm_drm_video_hotplug(video, ops);
}

View File

@ -107,6 +107,11 @@ int uterm_drm_video_find_crtc(struct uterm_video *video, drmModeRes *res,
drmModeEncoder *enc);
int uterm_drm_video_hotplug(struct uterm_video *video,
const struct display_ops *ops);
int uterm_drm_video_wake_up(struct uterm_video *video,
const struct display_ops *ops);
void uterm_drm_video_sleep(struct uterm_video *video);
int uterm_drm_video_poll(struct uterm_video *video,
const struct display_ops *ops);
static inline void *uterm_drm_video_get_data(struct uterm_video *video)
{

View File

@ -1124,43 +1124,22 @@ static void video_destroy(struct uterm_video *video)
static int video_poll(struct uterm_video *video)
{
video->flags |= VIDEO_HOTPLUG;
return uterm_drm_video_hotplug(video, &drm_display_ops);
return uterm_drm_video_poll(video, &drm_display_ops);
}
static void video_sleep(struct uterm_video *video)
{
struct uterm_drm_video *vdrm = video->data;
if (!video_is_awake(video))
return;
show_displays(video);
drmDropMaster(vdrm->fd);
video->flags &= ~VIDEO_AWAKE;
uterm_drm_video_sleep(video);
}
static int video_wake_up(struct uterm_video *video)
{
int ret;
struct uterm_drm_video *vdrm = video->data;
if (video_is_awake(video))
return 0;
ret = drmSetMaster(vdrm->fd);
if (ret) {
log_err("cannot set DRM-master");
return -EACCES;
}
video->flags |= VIDEO_AWAKE;
ret = uterm_drm_video_hotplug(video, &drm_display_ops);
if (ret) {
video->flags &= ~VIDEO_AWAKE;
drmDropMaster(vdrm->fd);
ret = uterm_drm_video_wake_up(video, &drm_display_ops);
if (ret)
return ret;
}
show_displays(video);
return 0;

View File

@ -569,43 +569,22 @@ static void video_destroy(struct uterm_video *video)
static int video_poll(struct uterm_video *video)
{
video->flags |= VIDEO_HOTPLUG;
return uterm_drm_video_hotplug(video, &dumb_display_ops);
return uterm_drm_video_poll(video, &dumb_display_ops);
}
static void video_sleep(struct uterm_video *video)
{
struct uterm_drm_video *vdrm = video->data;
if (!video_is_awake(video))
return;
show_displays(video);
drmDropMaster(vdrm->fd);
video->flags &= ~VIDEO_AWAKE;
uterm_drm_video_sleep(video);
}
static int video_wake_up(struct uterm_video *video)
{
int ret;
struct uterm_drm_video *vdrm = video->data;
if (video_is_awake(video))
return 0;
ret = drmSetMaster(vdrm->fd);
if (ret) {
log_err("cannot set DRM-master");
return -EACCES;
}
video->flags |= VIDEO_AWAKE;
ret = uterm_drm_video_hotplug(video, &dumb_display_ops);
if (ret) {
video->flags &= ~VIDEO_AWAKE;
drmDropMaster(vdrm->fd);
ret = uterm_drm_video_wake_up(video, &dumb_display_ops);
if (ret)
return ret;
}
show_displays(video);
return 0;