Module Name: src
Committed By: riastradh
Date: Mon Jul 7 20:21:31 UTC 2014
Modified Files:
src/sys/external/bsd/drm2/drm: drm_drv.c
Log Message:
Hook up drm suspend/resume.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/drm/drm_drv.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/drm/drm_drv.c
diff -u src/sys/external/bsd/drm2/drm/drm_drv.c:1.5 src/sys/external/bsd/drm2/drm/drm_drv.c:1.6
--- src/sys/external/bsd/drm2/drm/drm_drv.c:1.5 Fri Jun 13 00:47:08 2014
+++ src/sys/external/bsd/drm2/drm/drm_drv.c Mon Jul 7 20:21:31 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_drv.c,v 1.5 2014/06/13 00:47:08 riastradh Exp $ */
+/* $NetBSD: drm_drv.c,v 1.6 2014/07/07 20:21:31 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.5 2014/06/13 00:47:08 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.6 2014/07/07 20:21:31 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -44,6 +44,7 @@ __KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v
/* XXX Mega-kludge because modules are broken. */
#include <sys/once.h>
#endif
+#include <sys/pmf.h>
#include <sys/poll.h>
#ifndef _MODULE
#include <sys/reboot.h> /* XXX drm_init kludge */
@@ -54,6 +55,8 @@ __KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v
#include <prop/proplib.h>
+#include <linux/pm.h>
+
#include <drm/drmP.h>
#include "ioconf.h"
@@ -97,6 +100,9 @@ static int drm_init(void);
static ONCE_DECL(drm_init_once);
#endif
+static bool drm_suspend(device_t, const pmf_qual_t *);
+static bool drm_resume(device_t, const pmf_qual_t *);
+
static void drm_undo_fill_in_dev(struct drm_device *);
static struct drm_softc *drm_dev_softc(dev_t);
@@ -386,10 +392,22 @@ drm_attach(device_t parent, device_t sel
}
}
+ if (!pmf_device_register(parent, NULL, NULL)) {
+ aprint_error_dev(parent, "unable to establish power handler");
+ goto fail2;
+ }
+ if (!pmf_device_register(self, &drm_suspend, &drm_resume)) {
+ aprint_error_dev(self, "unable to establish power handler");
+ goto fail3;
+ }
+
/* Success! */
sc->sc_initialized = true;
return;
+fail4: __unused
+ pmf_device_deregister(self);
+fail3: pmf_device_deregister(parent);
fail2: if (dev->driver->unload != NULL)
(*dev->driver->unload)(dev);
fail1: drm_undo_fill_in_dev(dev);
@@ -411,6 +429,9 @@ drm_detach(device_t self, int flags)
if (sc->sc_opencount != 0)
return EBUSY;
+ pmf_device_deregister(self);
+ pmf_device_deregister(device_parent(self));
+
/* XXX The placement of this is pretty random... */
if (dev->driver->unload != NULL)
(*dev->driver->unload)(dev);
@@ -509,6 +530,35 @@ drm_undo_fill_in_dev(struct drm_device *
spin_lock_destroy(&dev->count_lock);
}
+static bool
+drm_suspend(device_t self, const pmf_qual_t *qual)
+{
+ struct drm_softc *const sc = device_private(self);
+ struct drm_device *const dev = sc->sc_drm_dev;
+ int error;
+
+ error = (*dev->driver->suspend)(dev,
+ (pm_message_t) { .event = PM_EVENT_SUSPEND });
+ if (error)
+ return false;
+
+ return true;
+}
+
+static bool
+drm_resume(device_t self, const pmf_qual_t *qual)
+{
+ struct drm_softc *const sc = device_private(self);
+ struct drm_device *const dev = sc->sc_drm_dev;
+ int error;
+
+ error = (*dev->driver->resume)(dev);
+ if (error)
+ return false;
+
+ return true;
+}
+
static struct drm_softc *
drm_dev_softc(dev_t d)
{