summaryrefslogtreecommitdiff
path: root/sys/dev/acpi
diff options
context:
space:
mode:
authorJordan Hargrave <jordan@cvs.openbsd.org>2009-06-02 23:03:35 +0000
committerJordan Hargrave <jordan@cvs.openbsd.org>2009-06-02 23:03:35 +0000
commitcfacbfe1b6ead3a553cd75194cccec0dd528e5fa (patch)
tree69acedad7f99462c2279a559a876b87878ffb77c /sys/dev/acpi
parent6e1481035fcdd30fd7cc0e2650ad2e51cabb8d9d (diff)
Added changes for docking station, must eject all children devices
ok marco@, mlarkin@
Diffstat (limited to 'sys/dev/acpi')
-rw-r--r--sys/dev/acpi/acpidev.h6
-rw-r--r--sys/dev/acpi/acpidock.c50
2 files changed, 40 insertions, 16 deletions
diff --git a/sys/dev/acpi/acpidev.h b/sys/dev/acpi/acpidev.h
index 209e0ad8dac..efa123891e8 100644
--- a/sys/dev/acpi/acpidev.h
+++ b/sys/dev/acpi/acpidev.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpidev.h,v 1.27 2009/03/10 20:36:10 jordan Exp $ */
+/* $OpenBSD: acpidev.h,v 1.28 2009/06/02 23:03:34 jordan Exp $ */
/*
* Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
* Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
@@ -288,6 +288,8 @@ struct acpibat_softc {
struct ksensordev sc_sensdev;
};
+TAILQ_HEAD(aml_nodelisth, aml_nodelist);
+
struct acpidock_softc {
struct device sc_dev;
@@ -297,7 +299,7 @@ struct acpidock_softc {
struct acpi_softc *sc_acpi;
struct aml_node *sc_devnode;
- TAILQ_HEAD(, aml_nodelist) sc_deps_h;
+ struct aml_nodelisth sc_deps_h;
struct aml_nodelist *sc_deps;
struct ksensor sc_sens;
diff --git a/sys/dev/acpi/acpidock.c b/sys/dev/acpi/acpidock.c
index b35ad42b9c0..66497d663ce 100644
--- a/sys/dev/acpi/acpidock.c
+++ b/sys/dev/acpi/acpidock.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpidock.c,v 1.32 2009/03/13 18:53:50 jordan Exp $ */
+/* $OpenBSD: acpidock.c,v 1.33 2009/06/02 23:03:34 jordan Exp $ */
/*
* Copyright (c) 2006,2007 Michael Knudsen <mk@openbsd.org>
*
@@ -50,6 +50,7 @@ int acpidock_dockctl(struct acpidock_softc *, int);
int acpidock_eject(struct acpidock_softc *, struct aml_node *);
int acpidock_notify(struct aml_node *, int, void *);
int acpidock_status(struct acpidock_softc *);
+int acpidock_walkchildren(struct aml_node *, void *);
int acpidock_foundejd(struct aml_node *, void *);
@@ -196,6 +197,8 @@ acpidock_eject(struct acpidock_softc *sc, struct aml_node *node)
struct aml_value res;
int rv;
+ if (node != sc->sc_devnode)
+ aml_notify(node, 3);
memset(&cmd, 0, sizeof cmd);
cmd.v_integer = 1;
cmd.type = AML_OBJTYPE_INTEGER;
@@ -220,6 +223,7 @@ int
acpidock_notify(struct aml_node *node, int notify_type, void *arg)
{
struct acpidock_softc *sc = arg;
+ struct aml_nodelist *n;
dnprintf(5, "%s: acpidock_notify: notify %d\n", DEVNAME(sc),
notify_type);
@@ -230,9 +234,11 @@ acpidock_notify(struct aml_node *node, int notify_type, void *arg)
acpidock_docklock(sc, 1);
acpidock_dockctl(sc, 1);
+ TAILQ_FOREACH_REVERSE(n, &sc->sc_deps_h, aml_nodelisth, entries) {
+ aml_notify(n->node, 0x00);
+ }
break;
case ACPIDOCK_EVENT_EJECT: {
- struct aml_nodelist *n;
TAILQ_FOREACH(n, &sc->sc_deps_h, entries)
acpidock_eject(sc, n->node);
@@ -264,31 +270,47 @@ acpidock_notify(struct aml_node *node, int notify_type, void *arg)
return (0);
}
+int acpidock_walkchildren(struct aml_node *node, void *arg)
+{
+ struct acpidock_softc *sc = arg;
+ struct aml_nodelist *n;
+
+ if (node && node->value && node->value->type == AML_OBJTYPE_DEVICE) {
+ n = malloc(sizeof *n, M_DEVBUF, M_WAITOK | M_ZERO);
+ n->node = node;
+ dnprintf(10,"%s depends on", aml_nodename(node));
+ dnprintf(10,"%s\n", aml_nodename(sc->sc_devnode));
+ TAILQ_INSERT_TAIL(&sc->sc_deps_h, n, entries);
+ }
+ return 0;
+}
+
int
acpidock_foundejd(struct aml_node *node, void *arg)
{
struct acpidock_softc *sc = (struct acpidock_softc *)arg;
struct aml_value res;
+ struct aml_node *dock;
+ extern struct aml_node aml_root;
dnprintf(15, "%s: %s", DEVNAME(sc), node->name);
if (aml_evalnode(sc->sc_acpi, node, 0, NULL, &res) == -1) {
printf(": error\n");
} else {
- struct aml_nodelist *n;
-
- /* XXX debug */
- dnprintf(10, "%s: %s depends on %s\n", DEVNAME(sc),
- node->name, res.v_string);
-
- /* XXX more than one dock? */
- n = malloc(sizeof(struct aml_nodelist), M_DEVBUF, M_WAITOK);
- n->node = node;
-
- TAILQ_INSERT_TAIL(&sc->sc_deps_h, n, entries);
+ if (!memcmp(res.v_string, "_SB.", 4)) {
+ dock = aml_searchname(&aml_root, "_SB_");
+ dock = aml_searchname(dock, res.v_string+4);
+ }
+ else {
+ dock = aml_searchname(&aml_root, res.v_string);
+ }
+ if (dock == sc->sc_devnode) {
+ /* Add all children devices of Device containing _EJD */
+ aml_walknodes(node->parent, AML_WALK_POST, acpidock_walkchildren, sc);
}
-
aml_freevalue(&res);
+ }
return 0;
}