1*89ed722cSmpi /* $OpenBSD: sysbutton.c,v 1.7 2022/03/13 12:33:01 mpi Exp $ */
2bc4ac631Sgwk /*
3bc4ac631Sgwk * Copyright (c) 2007 Gordon Willem Klok <gwk@openbsd.org>
4bc4ac631Sgwk *
5bc4ac631Sgwk * Permission to use, copy, modify, and distribute this software for any
6bc4ac631Sgwk * purpose with or without fee is hereby granted, provided that the above
7bc4ac631Sgwk * copyright notice and this permission notice appear in all copies.
8bc4ac631Sgwk *
9bc4ac631Sgwk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10bc4ac631Sgwk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11bc4ac631Sgwk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12bc4ac631Sgwk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13bc4ac631Sgwk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14bc4ac631Sgwk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15bc4ac631Sgwk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16bc4ac631Sgwk */
17bc4ac631Sgwk
18bc4ac631Sgwk #include <sys/param.h>
19bc4ac631Sgwk #include <sys/systm.h>
20bc4ac631Sgwk #include <sys/proc.h>
21bc4ac631Sgwk #include <sys/device.h>
22bc4ac631Sgwk
23bc4ac631Sgwk #include <ddb/db_var.h>
24bc4ac631Sgwk #include <dev/ofw/openfirm.h>
25bc4ac631Sgwk
26bc4ac631Sgwk #include <machine/bus.h>
27bc4ac631Sgwk #include <machine/autoconf.h>
28bc4ac631Sgwk
29bc4ac631Sgwk struct sysbutton_softc {
30bc4ac631Sgwk struct device sc_dev;
31bc4ac631Sgwk int sc_node;
32bc4ac631Sgwk int sc_intr;
33bc4ac631Sgwk };
34bc4ac631Sgwk
35bc4ac631Sgwk int sysbutton_match(struct device *, void *, void *);
36bc4ac631Sgwk void sysbutton_attach(struct device *, struct device *, void *);
37bc4ac631Sgwk int sysbutton_intr(void *);
38bc4ac631Sgwk
39*89ed722cSmpi const struct cfattach sysbutton_ca = {
40bc4ac631Sgwk sizeof(struct sysbutton_softc), sysbutton_match,
41bc4ac631Sgwk sysbutton_attach
42bc4ac631Sgwk };
43bc4ac631Sgwk
44bc4ac631Sgwk struct cfdriver sysbutton_cd = {
45bc4ac631Sgwk NULL, "sysbutton", DV_DULL
46bc4ac631Sgwk };
47bc4ac631Sgwk
48bc4ac631Sgwk int
sysbutton_match(struct device * parent,void * arg,void * aux)49bc4ac631Sgwk sysbutton_match(struct device *parent, void *arg, void *aux)
50bc4ac631Sgwk {
51bc4ac631Sgwk struct confargs *ca = aux;
52bc4ac631Sgwk
53bc4ac631Sgwk if (strcmp(ca->ca_name, "indicatorSwitch-gpio") == 0)
54bc4ac631Sgwk return 1;
55bc4ac631Sgwk
56bc4ac631Sgwk return 0;
57bc4ac631Sgwk }
58bc4ac631Sgwk
59bc4ac631Sgwk void
sysbutton_attach(struct device * parent,struct device * self,void * aux)60bc4ac631Sgwk sysbutton_attach(struct device *parent, struct device *self, void *aux)
61bc4ac631Sgwk {
62bc4ac631Sgwk struct sysbutton_softc *sc = (struct sysbutton_softc *)self;
63bc4ac631Sgwk struct confargs *ca = aux;
64bc4ac631Sgwk int intr[2];
65bc4ac631Sgwk
66bc4ac631Sgwk sc->sc_node = ca->ca_node;
67bc4ac631Sgwk
68bc4ac631Sgwk OF_getprop(sc->sc_node, "interrupts", intr, sizeof(intr));
69bc4ac631Sgwk sc->sc_intr = intr[0];
70bc4ac631Sgwk
710f553da4Sgwk printf(": irq %d\n", sc->sc_intr);
72bc4ac631Sgwk
73a7f03ebcSgwk mac_intr_establish(parent, sc->sc_intr, IST_EDGE,
74bc4ac631Sgwk IPL_NONE, sysbutton_intr, sc, sc->sc_dev.dv_xname);
75bc4ac631Sgwk }
76bc4ac631Sgwk
77bc4ac631Sgwk int
sysbutton_intr(void * v)78bc4ac631Sgwk sysbutton_intr(void *v)
79bc4ac631Sgwk {
80bc4ac631Sgwk
81bc4ac631Sgwk /*
82bc4ac631Sgwk * XXX: Holding this button causes an interrupt storm if
83bc4ac631Sgwk * ddb.console=0.
84bc4ac631Sgwk */
85bc4ac631Sgwk #ifdef DDB
86bc4ac631Sgwk if (db_console)
87e97088d6Smpi db_enter();
88bc4ac631Sgwk #endif
89bc4ac631Sgwk
90bc4ac631Sgwk return 1;
91bc4ac631Sgwk }
92