Annotation of sys/dev/acpi/acpiac.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: acpiac.c,v 1.18 2007/06/23 11:41:03 canacar Exp $ */
2: /*
3: * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17:
18: #include <sys/param.h>
19: #include <sys/systm.h>
20: #include <sys/device.h>
21: #include <sys/malloc.h>
22:
23: #include <machine/bus.h>
24:
25: #include <dev/acpi/acpireg.h>
26: #include <dev/acpi/acpivar.h>
27: #include <dev/acpi/acpidev.h>
28: #include <dev/acpi/amltypes.h>
29: #include <dev/acpi/dsdt.h>
30:
31: #include <sys/sensors.h>
32:
33: int acpiac_match(struct device *, void *, void *);
34: void acpiac_attach(struct device *, struct device *, void *);
35: int acpiac_notify(struct aml_node *, int, void *);
36:
37: void acpiac_refresh(void *);
38: int acpiac_getsta(struct acpiac_softc *);
39:
40: struct cfattach acpiac_ca = {
41: sizeof(struct acpiac_softc), acpiac_match, acpiac_attach
42: };
43:
44: struct cfdriver acpiac_cd = {
45: NULL, "acpiac", DV_DULL
46: };
47:
48: int
49: acpiac_match(struct device *parent, void *match, void *aux)
50: {
51: struct acpi_attach_args *aa = aux;
52: struct cfdata *cf = match;
53:
54: /* sanity */
55: if (aa->aaa_name == NULL ||
56: strcmp(aa->aaa_name, cf->cf_driver->cd_name) != 0 ||
57: aa->aaa_table != NULL)
58: return (0);
59: return (1);
60: }
61:
62: void
63: acpiac_attach(struct device *parent, struct device *self, void *aux)
64: {
65: struct acpiac_softc *sc = (struct acpiac_softc *)self;
66: struct acpi_attach_args *aa = aux;
67:
68: sc->sc_acpi = (struct acpi_softc *)parent;
69: sc->sc_devnode = aa->aaa_node->child;
70:
71: aml_register_notify(sc->sc_devnode->parent, aa->aaa_dev,
72: acpiac_notify, sc, ACPIDEV_NOPOLL);
73:
74: acpiac_getsta(sc);
75: printf(": AC unit ");
76: if (sc->sc_ac_stat == PSR_ONLINE)
77: printf("online\n");
78: else if (sc->sc_ac_stat == PSR_OFFLINE)
79: printf("offline\n");
80: else
81: printf("in unknown state\n");
82:
83: strlcpy(sc->sc_sensdev.xname, DEVNAME(sc),
84: sizeof(sc->sc_sensdev.xname));
85: strlcpy(sc->sc_sens[0].desc, "power supply",
86: sizeof(sc->sc_sens[0].desc));
87: sc->sc_sens[0].type = SENSOR_INDICATOR;
88: sensor_attach(&sc->sc_sensdev, &sc->sc_sens[0]);
89: sensordev_install(&sc->sc_sensdev);
90: sc->sc_sens[0].value = sc->sc_ac_stat;
91: }
92:
93: void
94: acpiac_refresh(void *arg)
95: {
96: struct acpiac_softc *sc = arg;
97:
98: acpiac_getsta(sc);
99: sc->sc_sens[0].value = sc->sc_ac_stat;
100: }
101:
102: int
103: acpiac_getsta(struct acpiac_softc *sc)
104: {
105: struct aml_value res;
106:
107: if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_STA", 0, NULL, NULL)) {
108: dnprintf(10, "%s: no _STA\n",
109: DEVNAME(sc));
110: }
111:
112: if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_PSR", 0, NULL, &res)) {
113: dnprintf(10, "%s: no _PSR\n",
114: DEVNAME(sc));
115: return (1);
116: }
117: sc->sc_ac_stat = aml_val2int(&res);
118: aml_freevalue(&res);
119: return (0);
120: }
121:
122: int
123: acpiac_notify(struct aml_node *node, int notify_type, void *arg)
124: {
125: struct acpiac_softc *sc = arg;
126:
127: dnprintf(10, "acpiac_notify: %.2x %s\n", notify_type,
128: sc->sc_devnode->parent->name);
129:
130: switch (notify_type) {
131: case 0x00:
132: case 0x81:
133: /*
134: * XXX some sony vaio's use the wrong notify type
135: * work around it by honoring it as a 0x80
136: */
137: /* FALLTHROUGH */
138: case 0x80:
139: acpiac_refresh(sc);
140: dnprintf(10, "A/C status: %d\n", sc->sc_ac_stat);
141: break;
142: }
143: return (0);
144: }
CVSweb