summaryrefslogtreecommitdiff
path: root/sys/dev/gpio
diff options
context:
space:
mode:
authorcegger <cegger@NetBSD.org>2008-04-29 14:07:36 +0000
committercegger <cegger@NetBSD.org>2008-04-29 14:07:36 +0000
commitb574865ea4d4da28ea2f2309c46767cc49d53bcd (patch)
treebafebcbfd5daed34f16616e42e72d817ba216311 /sys/dev/gpio
parenta1ddfabe35e7e4f63df5d89b275f08e21e7f6c8f (diff)
gpio(4): Extend with open/close to request/release the ppbus(4) on open/close.
ppbus(4): Extend to attach on gpiobus. From Hans Rosenfeld from tech-kern: http://mail-index.netbsd.org/tech-kern/2008/04/28/msg001168.html Hint: Hans sent me this diff which differs in the one from tech-kern in: - 2-clause license - sprinkled some consts
Diffstat (limited to 'sys/dev/gpio')
-rw-r--r--sys/dev/gpio/gpio.c10
-rw-r--r--sys/dev/gpio/gpiovar.h8
2 files changed, 15 insertions, 3 deletions
diff --git a/sys/dev/gpio/gpio.c b/sys/dev/gpio/gpio.c
index 6ff72892e2f..a5720841bd9 100644
--- a/sys/dev/gpio/gpio.c
+++ b/sys/dev/gpio/gpio.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gpio.c,v 1.15 2008/02/29 06:38:59 dyoung Exp $ */
+/* $NetBSD: gpio.c,v 1.16 2008/04/29 14:07:36 cegger Exp $ */
/* $OpenBSD: gpio.c,v 1.6 2006/01/14 12:33:49 grange Exp $ */
/*
@@ -18,7 +18,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gpio.c,v 1.15 2008/02/29 06:38:59 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gpio.c,v 1.16 2008/04/29 14:07:36 cegger Exp $");
/*
* General Purpose Input/Output framework.
@@ -275,6 +275,7 @@ gpioopen(dev_t dev, int flag, int mode,
struct lwp *l)
{
struct gpio_softc *sc;
+ int ret;
sc = (struct gpio_softc *)device_lookup(&gpio_cd, minor(dev));
if (sc == NULL)
@@ -282,6 +283,10 @@ gpioopen(dev_t dev, int flag, int mode,
if (sc->sc_opened)
return (EBUSY);
+
+ if ((ret = gpiobus_open(sc->sc_gc, &sc->sc_dev)))
+ return ret;
+
sc->sc_opened = 1;
return (0);
@@ -294,6 +299,7 @@ gpioclose(dev_t dev, int flag, int mode,
struct gpio_softc *sc;
sc = (struct gpio_softc *)device_lookup(&gpio_cd, minor(dev));
+ gpiobus_close(sc->sc_gc, &sc->sc_dev);
sc->sc_opened = 0;
return (0);
diff --git a/sys/dev/gpio/gpiovar.h b/sys/dev/gpio/gpiovar.h
index 092260477d7..f9bdd204c7f 100644
--- a/sys/dev/gpio/gpiovar.h
+++ b/sys/dev/gpio/gpiovar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: gpiovar.h,v 1.4 2006/02/20 03:18:36 riz Exp $ */
+/* $NetBSD: gpiovar.h,v 1.5 2008/04/29 14:07:36 cegger Exp $ */
/* $OpenBSD: gpiovar.h,v 1.3 2006/01/14 12:33:49 grange Exp $ */
/*
@@ -24,6 +24,8 @@
typedef struct gpio_chipset_tag {
void *gp_cookie;
+ int (*gp_gc_open)(void *, device_t);
+ void (*gp_gc_close)(void *, device_t);
int (*gp_pin_read)(void *, int);
void (*gp_pin_write)(void *, int, int);
void (*gp_pin_ctl)(void *, int, int);
@@ -48,6 +50,10 @@ struct gpiobus_attach_args {
int gpiobus_print(void *, const char *);
/* GPIO framework private methods */
+#define gpiobus_open(gc, dev) \
+ ((gc)->gp_gc_open ? ((gc)->gp_gc_open((gc)->gp_cookie, dev)) : 0)
+#define gpiobus_close(gc, dev) \
+ ((gc)->gp_gc_close ? ((gc)->gp_gc_close((gc)->gp_cookie, dev)) : 0)
#define gpiobus_pin_read(gc, pin) \
((gc)->gp_pin_read((gc)->gp_cookie, (pin)))
#define gpiobus_pin_write(gc, pin, value) \