diff options
| author | cegger <cegger@NetBSD.org> | 2008-04-29 14:07:36 +0000 |
|---|---|---|
| committer | cegger <cegger@NetBSD.org> | 2008-04-29 14:07:36 +0000 |
| commit | b574865ea4d4da28ea2f2309c46767cc49d53bcd (patch) | |
| tree | bafebcbfd5daed34f16616e42e72d817ba216311 /sys/dev/gpio | |
| parent | a1ddfabe35e7e4f63df5d89b275f08e21e7f6c8f (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.c | 10 | ||||
| -rw-r--r-- | sys/dev/gpio/gpiovar.h | 8 |
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) \ |
