diff options
author | jhb <jhb@FreeBSD.org> | 2008-08-04 20:46:15 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2008-08-04 20:46:15 +0000 |
commit | 9b394a3293bfa4397c24c6649034b411994dbb72 (patch) | |
tree | 2a244ae80de29ad3e4b277353b095b09dc4a9aba /sys/dev/pcf/pcf_isa.c | |
parent | 6f12163ca676979b992a474aab9c999d288f57ed (diff) | |
download | FreeBSD-src-9b394a3293bfa4397c24c6649034b411994dbb72.zip FreeBSD-src-9b394a3293bfa4397c24c6649034b411994dbb72.tar.gz |
Add locking to the various iicbus(4) bridge drivers:
- Just grab Giant in the ixp425_iic(4) driver since this driver uses
a shared address/data register window pair to access the actual
I2C registers. None of the other ixp425 drivers lock access to these
shared address/data registers yet and that would need to be done before
this could use any meaningful locking.
- Add locking to the interrupt handler and 'iicbus_reset' methods of the
at91_twi(4) driver.
- Add locking to the pcf(4) driver. Other pcf(4) fixes include:
- Don't needlessly zero the softc.
- Use bus_foo rather than bus_space_foo and remove bus space tag and
handle from softc.
- The lpbb(4) driver just grabs Giant for now. This will be refined later
when ppbus(4) is locked.
- As was done with smbus earlier, move the DRIVER_MODULE() lines to match
the bus driver (either iicbus or iicbb) to the bridge driver into the
bridge drivers.
Tested by: sam (arm/ixp425)
Diffstat (limited to 'sys/dev/pcf/pcf_isa.c')
-rw-r--r-- | sys/dev/pcf/pcf_isa.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/dev/pcf/pcf_isa.c b/sys/dev/pcf/pcf_isa.c index 40064cc..3bb1ec6 100644 --- a/sys/dev/pcf/pcf_isa.c +++ b/sys/dev/pcf/pcf_isa.c @@ -36,11 +36,13 @@ __FBSDID("$FreeBSD$"); */ #include <sys/param.h> -#include <sys/systm.h> #include <sys/bus.h> +#include <sys/lock.h> #include <sys/kernel.h> #include <sys/module.h> +#include <sys/mutex.h> #include <sys/resource.h> +#include <sys/systm.h> #include <machine/bus.h> #include <machine/resource.h> @@ -126,7 +128,7 @@ pcf_isa_attach(device_t dev) int rv = ENXIO; sc = DEVTOSOFTC(dev); - bzero(sc, sizeof(struct pcf_softc)); + mtx_init(&sc->pcf_lock, device_get_nameunit(dev), "pcf", MTX_DEF); /* IO port is mandatory */ sc->res_ioport = bus_alloc_resource_any(dev, SYS_RES_IOPORT, @@ -135,8 +137,6 @@ pcf_isa_attach(device_t dev) device_printf(dev, "cannot reserve I/O port range\n"); goto error; } - sc->bt_ioport = rman_get_bustag(sc->res_ioport); - sc->bh_ioport = rman_get_bushandle(sc->res_ioport); sc->pcf_flags = device_get_flags(dev); @@ -179,6 +179,7 @@ error: bus_release_resource(dev, SYS_RES_IOPORT, sc->rid_ioport, sc->res_ioport); } + mtx_destroy(&sc->pcf_lock); return (rv); } @@ -202,6 +203,7 @@ pcf_isa_detach(device_t dev) } bus_release_resource(dev, SYS_RES_IOPORT, sc->rid_ioport, sc->res_ioport); + mtx_destroy(&sc->pcf_lock); return (0); } |