From 5d1f2a00ee23fa4e073f45a7cd27eef5d2d70375 Mon Sep 17 00:00:00 2001 From: mbalmer Date: Wed, 31 Aug 2011 12:23:32 +0000 Subject: [PATCH] Add glue code to build as module. --- sys/dev/gpio/gpioow.c | 51 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/sys/dev/gpio/gpioow.c b/sys/dev/gpio/gpioow.c index 2853cf194be8..c74226a53322 100644 --- a/sys/dev/gpio/gpioow.c +++ b/sys/dev/gpio/gpioow.c @@ -1,4 +1,4 @@ -/* $NetBSD: gpioow.c,v 1.12 2009/11/12 19:22:08 dyoung Exp $ */ +/* $NetBSD: gpioow.c,v 1.13 2011/08/31 12:23:32 mbalmer Exp $ */ /* $OpenBSD: gpioow.c,v 1.1 2006/03/04 16:27:03 grange Exp $ */ /* @@ -18,7 +18,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: gpioow.c,v 1.12 2009/11/12 19:22:08 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gpioow.c,v 1.13 2011/08/31 12:23:32 mbalmer Exp $"); /* * 1-Wire bus bit-banging through GPIO pin. @@ -28,6 +28,7 @@ __KERNEL_RCSID(0, "$NetBSD: gpioow.c,v 1.12 2009/11/12 19:22:08 dyoung Exp $"); #include #include #include +#include #include @@ -107,18 +108,20 @@ gpioow_attach(device_t parent, device_t self, void *aux) if (gpio_pin_map(sc->sc_gpio, ga->ga_offset, ga->ga_mask, &sc->sc_map)) { aprint_error(": can't map pins\n"); - return; + goto finish; } /* Configure data pin */ caps = gpio_pin_caps(sc->sc_gpio, &sc->sc_map, GPIOOW_PIN_DATA); if (!(caps & GPIO_PIN_OUTPUT)) { aprint_error(": data pin is unable to drive output\n"); - goto fail; + gpio_pin_unmap(sc->sc_gpio, &sc->sc_map); + goto finish; } if (!(caps & GPIO_PIN_INPUT)) { aprint_error(": data pin is unable to read input\n"); - goto fail; + gpio_pin_unmap(sc->sc_gpio, &sc->sc_map); + goto finish; } aprint_normal(": DATA[%d]", sc->sc_map.pm_map[GPIOOW_PIN_DATA]); sc->sc_data = GPIO_PIN_OUTPUT; @@ -149,10 +152,8 @@ gpioow_attach(device_t parent, device_t self, void *aux) if (!pmf_device_register(self, NULL, NULL)) aprint_error("%s: could not establish power handler\n", device_xname(self)); +finish: return; - -fail: - gpio_pin_unmap(sc->sc_gpio, &sc->sc_map); } int @@ -246,3 +247,37 @@ gpioow_bb_set(void *arg, int value) gpio_pin_write(sc->sc_gpio, &sc->sc_map, GPIOOW_PIN_DATA, value ? GPIO_PIN_HIGH : GPIO_PIN_LOW); } + +MODULE(MODULE_CLASS_DRIVER, gpioow, "gpio,onewire"); + +#ifdef _MODULE +#include "ioconf.c" +#endif + +static int +gpioow_modcmd(modcmd_t cmd, void *opaque) +{ + int error; + + error = 0; + switch (cmd) { + case MODULE_CMD_INIT: +#ifdef _MODULE + error = config_init_component(cfdriver_ioconf_gpioow, + cfattach_ioconf_gpioow, cfdata_ioconf_gpioow); + if (error) + aprint_error("%s: unable to init component\n", + gpioow_cd.cd_name); +#endif + break; + case MODULE_CMD_FINI: +#ifdef _MODULE + config_fini_component(cfdriver_ioconf_gpioow, + cfattach_ioconf_gpioow, cfdata_ioconf_gpioow); +#endif + break; + default: + error = ENOTTY; + } + return error; +}