This source file includes following definitions.
- acpibtn_match
- acpibtn_attach
- acpibtn_getsta
- acpibtn_notify
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <sys/param.h>
19 #include <sys/proc.h>
20 #include <sys/signalvar.h>
21 #include <sys/systm.h>
22 #include <sys/device.h>
23 #include <sys/malloc.h>
24
25 #include <machine/bus.h>
26
27 #include <dev/acpi/acpireg.h>
28 #include <dev/acpi/acpivar.h>
29 #include <dev/acpi/acpidev.h>
30 #include <dev/acpi/amltypes.h>
31 #include <dev/acpi/dsdt.h>
32
33 #include <sys/sensors.h>
34
35 int acpibtn_match(struct device *, void *, void *);
36 void acpibtn_attach(struct device *, struct device *, void *);
37 int acpibtn_notify(struct aml_node *, int, void *);
38
39 struct acpibtn_softc {
40 struct device sc_dev;
41
42 bus_space_tag_t sc_iot;
43 bus_space_handle_t sc_ioh;
44
45 struct acpi_softc *sc_acpi;
46 struct aml_node *sc_devnode;
47
48 int sc_btn_type;
49 #define ACPIBTN_UNKNOWN -1
50 #define ACPIBTN_LID 0
51 #define ACPIBTN_POWER 1
52 #define ACPIBTN_SLEEP 2
53 };
54
55 int acpibtn_getsta(struct acpibtn_softc *);
56
57 struct cfattach acpibtn_ca = {
58 sizeof(struct acpibtn_softc), acpibtn_match, acpibtn_attach
59 };
60
61 struct cfdriver acpibtn_cd = {
62 NULL, "acpibtn", DV_DULL
63 };
64
65 int
66 acpibtn_match(struct device *parent, void *match, void *aux)
67 {
68 struct acpi_attach_args *aa = aux;
69 struct cfdata *cf = match;
70
71
72 if (aa->aaa_name == NULL ||
73 strcmp(aa->aaa_name, cf->cf_driver->cd_name) != 0 ||
74 aa->aaa_table != NULL)
75 return (0);
76
77 return (1);
78 }
79
80 void
81 acpibtn_attach(struct device *parent, struct device *self, void *aux)
82 {
83 struct acpibtn_softc *sc = (struct acpibtn_softc *)self;
84 struct acpi_attach_args *aa = aux;
85
86 sc->sc_acpi = (struct acpi_softc *)parent;
87 sc->sc_devnode = aa->aaa_node->child;
88
89 if (!strcmp(aa->aaa_dev, ACPI_DEV_LD))
90 sc->sc_btn_type = ACPIBTN_LID;
91 else if (!strcmp(aa->aaa_dev, ACPI_DEV_PBD))
92 sc->sc_btn_type = ACPIBTN_POWER;
93 else if (!strcmp(aa->aaa_dev, ACPI_DEV_SBD))
94 sc->sc_btn_type = ACPIBTN_SLEEP;
95 else
96 sc->sc_btn_type = ACPIBTN_UNKNOWN;
97
98 acpibtn_getsta(sc);
99
100 printf(": %s\n", sc->sc_devnode->parent->name);
101
102 aml_register_notify(sc->sc_devnode->parent, aa->aaa_dev, acpibtn_notify,
103 sc, ACPIDEV_NOPOLL);
104 }
105
106 int
107 acpibtn_getsta(struct acpibtn_softc *sc)
108 {
109 if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_STA", 0, NULL, NULL) != 0) {
110 dnprintf(20, "%s: no _STA\n", DEVNAME(sc));
111
112 }
113
114 return (0);
115 }
116
117 int
118 acpibtn_notify(struct aml_node *node, int notify_type, void *arg)
119 {
120 struct acpibtn_softc *sc = arg;
121 extern int acpi_s5;
122
123 dnprintf(10, "acpibtn_notify: %.2x %s\n", notify_type,
124 sc->sc_devnode->parent->name);
125
126 switch (sc->sc_btn_type) {
127 case ACPIBTN_LID:
128 case ACPIBTN_SLEEP:
129 break;
130 case ACPIBTN_POWER:
131 if (notify_type == 0x80) {
132 acpi_s5 = 1;
133 psignal(initproc, SIGUSR1);
134 }
135 break;
136 default:
137 printf("%s: spurious acpi button interrupt %i\n", DEVNAME(sc),
138 sc->sc_btn_type);
139 break;
140 }
141
142 return (0);
143 }