1 /* $NetBSD: gpio.c,v 1.8 2005/12/11 12:18:03 christos Exp $ */
4 * Copyright (C) 1998 Internet Research Institute, Inc.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by
18 * Internet Research Institute, Inc.
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include <sys/cdefs.h>
35 __KERNEL_RCSID(0, "$NetBSD: gpio.c,v 1.8 2005/12/11 12:18:03 christos Exp $");
37 #include <sys/types.h>
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/kernel.h>
41 #include <sys/device.h>
42 #include <sys/malloc.h>
43 #include <machine/autoconf.h>
44 #include <machine/pio.h>
46 #include <dev/ofw/openfirm.h>
50 static void gpio_obio_attach (struct device
*, struct device
*, void *);
51 static int gpio_obio_match (struct device
*, struct cfdata
*, void *);
52 static int gpio_obio_print (void *aux
, const char *gpio
);
54 static void gpio_gpio_attach (struct device
*, struct device
*, void *);
55 static int gpio_gpio_match (struct device
*, struct cfdata
*, void *);
56 static int gpio_intr (void *);
63 CFATTACH_DECL(gpio_obio
, sizeof(struct gpio_softc
),
64 gpio_obio_match
, gpio_obio_attach
, NULL
, NULL
);
66 CFATTACH_DECL(gpio_gpio
, sizeof(struct gpio_softc
),
67 gpio_gpio_match
, gpio_gpio_attach
, NULL
, NULL
);
69 extern struct cfdriver gpio_cd
;
72 gpio_obio_match(struct device
*parent
, struct cfdata
*cf
, void *aux
)
74 struct confargs
*ca
= aux
;
76 if (strcmp(ca
->ca_name
, "gpio") != 0)
86 gpio_obio_attach(struct device
*parent
, struct device
*self
, void *aux
)
88 struct gpio_softc
*sc
= device_private(self
);
89 struct confargs
*ca
= aux
, ca2
;
98 sc
->sc_port
= mapiodev(ca
->ca_baseaddr
+ ca
->ca_reg
[0], ca
->ca_reg
[1]);
100 ca2
.ca_baseaddr
= ca
->ca_baseaddr
;
101 for (child
= OF_child(ca
->ca_node
); child
; child
= OF_peer(child
)) {
102 namelen
= OF_getprop(child
, "name", name
, sizeof(name
));
105 if (namelen
>= sizeof(name
))
112 ca2
.ca_nreg
= OF_getprop(child
, "reg", reg
, sizeof(reg
));
113 ca2
.ca_nintr
= OF_getprop(child
, "AAPL,interrupts", intr
,
115 if (ca2
.ca_nintr
== -1)
116 ca2
.ca_nintr
= OF_getprop(child
, "interrupts", intr
,
122 config_found(self
, &ca2
, gpio_obio_print
);
127 gpio_obio_print(void *aux
, const char *gpio
)
129 struct confargs
*ca
= aux
;
132 aprint_normal("%s at %s", ca
->ca_name
, gpio
);
135 aprint_normal(" offset 0x%x", ca
->ca_reg
[0]);
141 gpio_gpio_match(struct device
*parent
, struct cfdata
*cf
, void *aux
)
143 struct confargs
*ca
= aux
;
145 if (strcmp(ca
->ca_name
, "extint-gpio1") != 0)
148 if (ca
->ca_nintr
< 0)
155 gpio_gpio_attach(struct device
*parent
, struct device
*self
, void *aux
)
157 struct gpio_softc
*sc
= device_private(self
);
158 struct confargs
*ca
= aux
;
161 sc
->sc_port
= device_private(parent
)->sc_port
;
162 intr_establish(ca
->ca_intr
[0], IST_LEVEL
, IPL_HIGH
, gpio_intr
, sc
);
164 printf(" irq %d\n", ca
->ca_intr
[0]);
168 extern int adb_intr (void *);
169 extern struct cfdriver adb_cd
;
178 struct gpio_softc
*sc
;
180 sc
= device_lookup_private(&adb_cd
, 0);