Module Name: src Committed By: thorpej Date: Sun Dec 22 23:23:32 UTC 2019
Modified Files: src/sys/arch/alpha/pci: tsciic.c tsvar.h src/sys/arch/arm/at91: at91twi.c at91twivar.h src/sys/arch/arm/iomd: iomdiic.c src/sys/arch/arm/omap: omap3_i2c.c ti_iic.c src/sys/arch/arm/rockchip: rk_i2c.c src/sys/arch/arm/sunxi: sunxi_hdmi.c sunxi_rsb.c src/sys/arch/arm/xscale: i80312_i2c.c i80321_i2c.c iopi2c.c iopi2cvar.h src/sys/arch/evbarm/armadillo: armadillo9_iic.c src/sys/arch/evbarm/gumstix: gxiic.c src/sys/arch/evbarm/nslu2: nslu2_iic.c src/sys/arch/hpcarm/dev: nbpiic.c src/sys/arch/i386/pci: viapcib.c src/sys/arch/macppc/dev: cuda.c ki2c.c pmu.c smu.c src/sys/arch/macppc/macppc: memory.c src/sys/arch/mips/alchemy/dev: ausmbus_psc.c src/sys/arch/mips/ingenic: jziic.c src/sys/arch/mips/ralink: ralink_i2c.c src/sys/arch/mmeye/dev: rtciic.c src/sys/arch/powerpc/ibm4xx/dev: gpiic_opb.c src/sys/arch/sgimips/dev: crmfb.c src/sys/arch/sparc64/dev: ffb.c jbus-i2c.c src/sys/arch/x86/pci/imcsmb: imcsmb.c src/sys/arch/zaurus/dev: ziic.c src/sys/dev/acpi: smbus_acpi.c src/sys/dev/gpio: gpioiic.c src/sys/dev/i2c: gttwsi_core.c i2c.c i2c_exec.c i2cvar.h motoi2c.c motoi2cvar.h src/sys/dev/ic: dw_hdmi.c dw_hdmi.h dwiic.c pca9564.c pca9564var.h pcf8584.c pcf8584var.h src/sys/dev/pci: alipm.c amdpm_smbus.c amdpmvar.h coram.c cxdtv.c ichsmb.c if_tl.c igma.c ismt.c nfsmb.c piixpm.c pm2fb.c pm3fb.c radeonfb_i2c.c voodoofb.c voyager.c src/sys/dev/usb: auvitek_i2c.c emdtv_i2c.c Log Message: Cleanup i2c bus acquire / release, centralizing all of the logic into iic_acquire_bus() / iic_release_bus(). "acquire" and "release" hooks no longer need to be provided by back-end controller drivers (only if they need special handling, e.g. powering on the i2c controller). This results in the removal of a bunch of rendundant code from each back-end controller driver. Assert that we are not in hard interrupt context in iic_acquire_bus(), iic_exec(), and iic_release_bus(). To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/arch/alpha/pci/tsciic.c cvs rdiff -u -r1.12 -r1.13 src/sys/arch/alpha/pci/tsvar.h cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/at91/at91twi.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/at91/at91twivar.h cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/iomd/iomdiic.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/omap/omap3_i2c.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/omap/ti_iic.c cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/rockchip/rk_i2c.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/sunxi/sunxi_hdmi.c \ src/sys/arch/arm/sunxi/sunxi_rsb.c cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/xscale/i80312_i2c.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/xscale/i80321_i2c.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/xscale/iopi2c.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/xscale/iopi2cvar.h cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbarm/armadillo/armadillo9_iic.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbarm/gumstix/gxiic.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/evbarm/nslu2/nslu2_iic.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/hpcarm/dev/nbpiic.c cvs rdiff -u -r1.16 -r1.17 src/sys/arch/i386/pci/viapcib.c cvs rdiff -u -r1.23 -r1.24 src/sys/arch/macppc/dev/cuda.c cvs rdiff -u -r1.26 -r1.27 src/sys/arch/macppc/dev/ki2c.c cvs rdiff -u -r1.32 -r1.33 src/sys/arch/macppc/dev/pmu.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/macppc/dev/smu.c cvs rdiff -u -r1.6 -r1.7 src/sys/arch/macppc/macppc/memory.c cvs rdiff -u -r1.12 -r1.13 src/sys/arch/mips/alchemy/dev/ausmbus_psc.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/mips/ingenic/jziic.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/mips/ralink/ralink_i2c.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/mmeye/dev/rtciic.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/powerpc/ibm4xx/dev/gpiic_opb.c cvs rdiff -u -r1.45 -r1.46 src/sys/arch/sgimips/dev/crmfb.c cvs rdiff -u -r1.63 -r1.64 src/sys/arch/sparc64/dev/ffb.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/sparc64/dev/jbus-i2c.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/x86/pci/imcsmb/imcsmb.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/zaurus/dev/ziic.c cvs rdiff -u -r1.13 -r1.14 src/sys/dev/acpi/smbus_acpi.c cvs rdiff -u -r1.8 -r1.9 src/sys/dev/gpio/gpioiic.c cvs rdiff -u -r1.8 -r1.9 src/sys/dev/i2c/gttwsi_core.c cvs rdiff -u -r1.70 -r1.71 src/sys/dev/i2c/i2c.c cvs rdiff -u -r1.12 -r1.13 src/sys/dev/i2c/i2c_exec.c cvs rdiff -u -r1.18 -r1.19 src/sys/dev/i2c/i2cvar.h cvs rdiff -u -r1.6 -r1.7 src/sys/dev/i2c/motoi2c.c cvs rdiff -u -r1.5 -r1.6 src/sys/dev/i2c/motoi2cvar.h cvs rdiff -u -r1.6 -r1.7 src/sys/dev/ic/dw_hdmi.c cvs rdiff -u -r1.5 -r1.6 src/sys/dev/ic/dw_hdmi.h src/sys/dev/ic/dwiic.c \ src/sys/dev/ic/pcf8584var.h cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/pca9564.c cvs rdiff -u -r1.1 -r1.2 src/sys/dev/ic/pca9564var.h cvs rdiff -u -r1.15 -r1.16 src/sys/dev/ic/pcf8584.c cvs rdiff -u -r1.10 -r1.11 src/sys/dev/pci/alipm.c cvs rdiff -u -r1.22 -r1.23 src/sys/dev/pci/amdpm_smbus.c cvs rdiff -u -r1.11 -r1.12 src/sys/dev/pci/amdpmvar.h cvs rdiff -u -r1.16 -r1.17 src/sys/dev/pci/coram.c src/sys/dev/pci/cxdtv.c cvs rdiff -u -r1.62 -r1.63 src/sys/dev/pci/ichsmb.c cvs rdiff -u -r1.117 -r1.118 src/sys/dev/pci/if_tl.c cvs rdiff -u -r1.3 -r1.4 src/sys/dev/pci/igma.c cvs rdiff -u -r1.6 -r1.7 src/sys/dev/pci/ismt.c cvs rdiff -u -r1.24 -r1.25 src/sys/dev/pci/nfsmb.c cvs rdiff -u -r1.54 -r1.55 src/sys/dev/pci/piixpm.c cvs rdiff -u -r1.30 -r1.31 src/sys/dev/pci/pm2fb.c cvs rdiff -u -r1.4 -r1.5 src/sys/dev/pci/pm3fb.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/pci/radeonfb_i2c.c cvs rdiff -u -r1.52 -r1.53 src/sys/dev/pci/voodoofb.c cvs rdiff -u -r1.14 -r1.15 src/sys/dev/pci/voyager.c cvs rdiff -u -r1.4 -r1.5 src/sys/dev/usb/auvitek_i2c.c cvs rdiff -u -r1.1 -r1.2 src/sys/dev/usb/emdtv_i2c.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/alpha/pci/tsciic.c diff -u src/sys/arch/alpha/pci/tsciic.c:1.1 src/sys/arch/alpha/pci/tsciic.c:1.2 --- src/sys/arch/alpha/pci/tsciic.c:1.1 Fri Feb 21 12:23:30 2014 +++ src/sys/arch/alpha/pci/tsciic.c Sun Dec 22 23:23:29 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: tsciic.c,v 1.1 2014/02/21 12:23:30 jdc Exp $ */ +/* $NetBSD: tsciic.c,v 1.2 2019/12/22 23:23:29 thorpej Exp $ */ /* * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tsciic.c,v 1.1 2014/02/21 12:23:30 jdc Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tsciic.c,v 1.2 2019/12/22 23:23:29 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -45,8 +45,6 @@ __KERNEL_RCSID(0, "$NetBSD: tsciic.c,v 1 #include <dev/i2c/ddcvar.h> /* I2C glue */ -static int tsciic_acquire_bus(void *, int); -static void tsciic_release_bus(void *, int); static int tsciic_send_start(void *, int); static int tsciic_send_stop(void *, int); static int tsciic_initiate_xfer(void *, i2c_addr_t, int); @@ -77,17 +75,13 @@ tsciic_init(device_t self) { struct tsciic_softc *sc = device_private(self); struct i2cbus_attach_args iba; - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); - + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = tsciic_acquire_bus; - sc->sc_i2c.ic_release_bus = tsciic_release_bus; sc->sc_i2c.ic_send_start = tsciic_send_start; sc->sc_i2c.ic_send_stop = tsciic_send_stop; sc->sc_i2c.ic_initiate_xfer = tsciic_initiate_xfer; sc->sc_i2c.ic_read_byte = tsciic_read_byte; sc->sc_i2c.ic_write_byte = tsciic_write_byte; - sc->sc_i2c.ic_exec = NULL; memset(&iba, 0, sizeof(iba)); iba.iba_tag = &sc->sc_i2c; @@ -129,23 +123,6 @@ tsciicbb_read(void *cookie) /* higher level I2C stuff */ static int -tsciic_acquire_bus(void *cookie, int flags) -{ - struct tsciic_softc *sc = cookie; - - mutex_enter(&sc->sc_buslock); - return 0; -} - -static void -tsciic_release_bus(void *cookie, int flags) -{ - struct tsciic_softc *sc = cookie; - - mutex_exit(&sc->sc_buslock); -} - -static int tsciic_send_start(void *cookie, int flags) { return (i2c_bitbang_send_start(cookie, flags, &tsciicbb_ops)); Index: src/sys/arch/alpha/pci/tsvar.h diff -u src/sys/arch/alpha/pci/tsvar.h:1.12 src/sys/arch/alpha/pci/tsvar.h:1.13 --- src/sys/arch/alpha/pci/tsvar.h:1.12 Fri Feb 21 12:23:30 2014 +++ src/sys/arch/alpha/pci/tsvar.h Sun Dec 22 23:23:29 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: tsvar.h,v 1.12 2014/02/21 12:23:30 jdc Exp $ */ +/* $NetBSD: tsvar.h,v 1.13 2019/12/22 23:23:29 thorpej Exp $ */ /*- * Copyright (c) 1999 by Ross Harvey. All rights reserved. @@ -72,7 +72,6 @@ struct tsp_attach_args { struct tsciic_softc { device_t sc_dev; struct i2c_controller sc_i2c; - kmutex_t sc_buslock; }; struct tsciic_attach_args { Index: src/sys/arch/arm/at91/at91twi.c diff -u src/sys/arch/arm/at91/at91twi.c:1.7 src/sys/arch/arm/at91/at91twi.c:1.8 --- src/sys/arch/arm/at91/at91twi.c:1.7 Sun Feb 14 19:54:20 2016 +++ src/sys/arch/arm/at91/at91twi.c Sun Dec 22 23:23:29 2019 @@ -1,5 +1,5 @@ -/* $Id: at91twi.c,v 1.7 2016/02/14 19:54:20 chs Exp $ */ -/* $NetBSD: at91twi.c,v 1.7 2016/02/14 19:54:20 chs Exp $ */ +/* $Id: at91twi.c,v 1.8 2019/12/22 23:23:29 thorpej Exp $ */ +/* $NetBSD: at91twi.c,v 1.8 2019/12/22 23:23:29 thorpej Exp $ */ /*- * Copyright (c) 2007 Embedtronics Oy. All rights reserved. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: at91twi.c,v 1.7 2016/02/14 19:54:20 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: at91twi.c,v 1.8 2019/12/22 23:23:29 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -58,8 +58,6 @@ int at91twi_read(struct at91twi_softc *, int at91twi_write(struct at91twi_softc *, int, void *, int, int); /* I2C glue */ -static int at91twi_i2c_acquire_bus(void *, int); -static void at91twi_i2c_release_bus(void *, int); static int at91twi_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -119,19 +117,12 @@ found_ckdiv: //#endif /* initialize rest */ - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); sc->sc_ih = at91_intr_establish(sc->sc_pid, IPL_SERIAL, INTR_HIGH_LEVEL, at91twi_intr, sc); /* fill in the i2c tag */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = at91twi_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = at91twi_i2c_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = at91twi_i2c_exec; memset(&iba, 0, sizeof(iba)); @@ -294,29 +285,6 @@ at91twi_write(struct at91twi_softc *sc, return at91twi_start(sc, addr, data, len, flags); } -static int -at91twi_i2c_acquire_bus(void *cookie, int flags) -{ - struct at91twi_softc *sc = cookie; - - if (flags & I2C_F_POLL) - return 0; - - mutex_enter(&sc->sc_buslock); - return 0; -} - -static void -at91twi_i2c_release_bus(void *cookie, int flags) -{ - struct at91twi_softc *sc = cookie; - - if (flags & I2C_F_POLL) - return; - - mutex_exit(&sc->sc_buslock); -} - int at91twi_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *vcmd, size_t cmdlen, void *vbuf, size_t buflen, int flags) Index: src/sys/arch/arm/at91/at91twivar.h diff -u src/sys/arch/arm/at91/at91twivar.h:1.2 src/sys/arch/arm/at91/at91twivar.h:1.3 --- src/sys/arch/arm/at91/at91twivar.h:1.2 Thu Jul 3 01:15:39 2008 +++ src/sys/arch/arm/at91/at91twivar.h Sun Dec 22 23:23:29 2019 @@ -1,5 +1,5 @@ -/* $Id: at91twivar.h,v 1.2 2008/07/03 01:15:39 matt Exp $ */ -/* $NetBSD: at91twivar.h,v 1.2 2008/07/03 01:15:39 matt Exp $ */ +/* $Id: at91twivar.h,v 1.3 2019/12/22 23:23:29 thorpej Exp $ */ +/* $NetBSD: at91twivar.h,v 1.3 2019/12/22 23:23:29 thorpej Exp $ */ /*- * Copyright (c) 2007 Embedtronics Oy. All rights reserved. @@ -40,7 +40,6 @@ struct at91twi_softc { int sc_pid; /* peripheral id */ struct i2c_controller sc_i2c; /* I2C device desc */ - kmutex_t sc_buslock; /* bus lock */ void *sc_ih; /* interrupt handle */ Index: src/sys/arch/arm/iomd/iomdiic.c diff -u src/sys/arch/arm/iomd/iomdiic.c:1.8 src/sys/arch/arm/iomd/iomdiic.c:1.9 --- src/sys/arch/arm/iomd/iomdiic.c:1.8 Sun Feb 14 19:54:20 2016 +++ src/sys/arch/arm/iomd/iomdiic.c Sun Dec 22 23:23:29 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: iomdiic.c,v 1.8 2016/02/14 19:54:20 chs Exp $ */ +/* $NetBSD: iomdiic.c,v 1.9 2019/12/22 23:23:29 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -57,7 +57,6 @@ struct iomdiic_softc { bus_space_handle_t sc_sh; struct i2c_controller sc_i2c; - kmutex_t sc_buslock; /* * The SDA pin is open-drain, so we make it an input by @@ -66,9 +65,6 @@ struct iomdiic_softc { uint8_t sc_iomd_iocr; }; -static int iomdiic_acquire_bus(void *, int); -static void iomdiic_release_bus(void *, int); - static int iomdiic_send_start(void *, int); static int iomdiic_send_stop(void *, int); static int iomdiic_initiate_xfer(void *, i2c_addr_t, int); @@ -136,11 +132,8 @@ iomdiic_attach(device_t parent, device_t sc->sc_dev = self; - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); - + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = iomdiic_acquire_bus; - sc->sc_i2c.ic_release_bus = iomdiic_release_bus; sc->sc_i2c.ic_send_start = iomdiic_send_start; sc->sc_i2c.ic_send_stop = iomdiic_send_stop; sc->sc_i2c.ic_initiate_xfer = iomdiic_initiate_xfer; @@ -165,9 +158,9 @@ iomdiic_bootstrap_cookie(void) strcpy(dev.dv_xname, "iomdiicboot"); sc.sc_dev = &dev; + + iic_tag_init(&sc.sc_i2c); sc.sc_i2c.ic_cookie = ≻ - sc.sc_i2c.ic_acquire_bus = iomdiic_acquire_bus; - sc.sc_i2c.ic_release_bus = iomdiic_release_bus; sc.sc_i2c.ic_send_start = iomdiic_send_start; sc.sc_i2c.ic_send_stop = iomdiic_send_stop; sc.sc_i2c.ic_initiate_xfer = iomdiic_initiate_xfer; @@ -178,31 +171,6 @@ iomdiic_bootstrap_cookie(void) } static int -iomdiic_acquire_bus(void *cookie, int flags) -{ - struct iomdiic_softc *sc = cookie; - - /* XXX What should we do for the polling case? */ - if (flags & I2C_F_POLL) - return (0); - - mutex_enter(&sc->sc_buslock); - return (0); -} - -static void -iomdiic_release_bus(void *cookie, int flags) -{ - struct iomdiic_softc *sc = cookie; - - /* XXX See above. */ - if (flags & I2C_F_POLL) - return; - - mutex_exit(&sc->sc_buslock); -} - -static int iomdiic_send_start(void *cookie, int flags) { Index: src/sys/arch/arm/omap/omap3_i2c.c diff -u src/sys/arch/arm/omap/omap3_i2c.c:1.3 src/sys/arch/arm/omap/omap3_i2c.c:1.4 --- src/sys/arch/arm/omap/omap3_i2c.c:1.3 Wed Mar 13 03:08:17 2013 +++ src/sys/arch/arm/omap/omap3_i2c.c Sun Dec 22 23:23:29 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: omap3_i2c.c,v 1.3 2013/03/13 03:08:17 khorben Exp $ */ +/* $NetBSD: omap3_i2c.c,v 1.4 2019/12/22 23:23:29 thorpej Exp $ */ /*- * Copyright (c) 2012 Jared D. McNeill <jmcne...@invisible.ca> @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: omap3_i2c.c,v 1.3 2013/03/13 03:08:17 khorben Exp $"); +__KERNEL_RCSID(0, "$NetBSD: omap3_i2c.c,v 1.4 2019/12/22 23:23:29 thorpej Exp $"); #include "opt_omap.h" @@ -53,7 +53,6 @@ __KERNEL_RCSID(0, "$NetBSD: omap3_i2c.c, struct omap3_i2c_softc { device_t sc_dev; struct i2c_controller sc_ic; - kmutex_t sc_lock; device_t sc_i2cdev; bus_space_tag_t sc_iot; @@ -74,8 +73,6 @@ static void omap3_i2c_attach(device_t, d static int omap3_i2c_rescan(device_t, const char *, const int *); static void omap3_i2c_childdet(device_t, device_t); -static int omap3_i2c_acquire_bus(void *, int); -static void omap3_i2c_release_bus(void *, int); static int omap3_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -120,10 +117,9 @@ omap3_i2c_attach(device_t parent, device sc->sc_dev = self; sc->sc_iot = obio->obio_iot; - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); + + iic_tag_init(&sc->sc_ic); sc->sc_ic.ic_cookie = sc; - sc->sc_ic.ic_acquire_bus = omap3_i2c_acquire_bus; - sc->sc_ic.ic_release_bus = omap3_i2c_release_bus; sc->sc_ic.ic_exec = omap3_i2c_exec; if (bus_space_map(obio->obio_iot, obio->obio_addr, obio->obio_size, @@ -169,29 +165,6 @@ omap3_i2c_childdet(device_t self, device } static int -omap3_i2c_acquire_bus(void *opaque, int flags) -{ - struct omap3_i2c_softc *sc = opaque; - - if (flags & I2C_F_POLL) { - if (!mutex_tryenter(&sc->sc_lock)) - return EBUSY; - } else { - mutex_enter(&sc->sc_lock); - } - - return 0; -} - -static void -omap3_i2c_release_bus(void *opaque, int flags) -{ - struct omap3_i2c_softc *sc = opaque; - - mutex_exit(&sc->sc_lock); -} - -static int omap3_i2c_exec(void *opaque, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { Index: src/sys/arch/arm/omap/ti_iic.c diff -u src/sys/arch/arm/omap/ti_iic.c:1.10 src/sys/arch/arm/omap/ti_iic.c:1.11 --- src/sys/arch/arm/omap/ti_iic.c:1.10 Sun Oct 16 13:09:57 2016 +++ src/sys/arch/arm/omap/ti_iic.c Sun Dec 22 23:23:29 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ti_iic.c,v 1.10 2016/10/16 13:09:57 kiyohara Exp $ */ +/* $NetBSD: ti_iic.c,v 1.11 2019/12/22 23:23:29 thorpej Exp $ */ /* * Copyright (c) 2013 Manuel Bouyer. All rights reserved. @@ -50,7 +50,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ti_iic.c,v 1.10 2016/10/16 13:09:57 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ti_iic.c,v 1.11 2019/12/22 23:23:29 thorpej Exp $"); #include "opt_omap.h" #include "locators.h" @@ -102,7 +102,6 @@ typedef enum { struct ti_iic_softc { device_t sc_dev; struct i2c_controller sc_ic; - kmutex_t sc_lock; device_t sc_i2cdev; bus_space_tag_t sc_iot; @@ -136,8 +135,6 @@ static void ti_iic_childdet(device_t, de static int ti_iic_intr(void *); -static int ti_iic_acquire_bus(void *, int); -static void ti_iic_release_bus(void *, int); static int ti_iic_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -214,9 +211,10 @@ ti_iic_attach(device_t parent, device_t sc->sc_dev = self; sc->sc_iot = obio->obio_iot; - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NET); cv_init(&sc->sc_cv, "tiiic"); + + iic_tag_init(&sc->sc_ic); sc->sc_ic.ic_cookie = sc; sc->sc_ic.ic_acquire_bus = ti_iic_acquire_bus; sc->sc_ic.ic_release_bus = ti_iic_release_bus; @@ -337,29 +335,6 @@ ti_iic_intr(void *arg) } static int -ti_iic_acquire_bus(void *opaque, int flags) -{ - struct ti_iic_softc *sc = opaque; - - if (flags & I2C_F_POLL) { - if (!mutex_tryenter(&sc->sc_lock)) - return EBUSY; - } else { - mutex_enter(&sc->sc_lock); - } - - return 0; -} - -static void -ti_iic_release_bus(void *opaque, int flags) -{ - struct ti_iic_softc *sc = opaque; - - mutex_exit(&sc->sc_lock); -} - -static int ti_iic_exec(void *opaque, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { Index: src/sys/arch/arm/rockchip/rk_i2c.c diff -u src/sys/arch/arm/rockchip/rk_i2c.c:1.6 src/sys/arch/arm/rockchip/rk_i2c.c:1.7 --- src/sys/arch/arm/rockchip/rk_i2c.c:1.6 Fri Nov 8 00:35:16 2019 +++ src/sys/arch/arm/rockchip/rk_i2c.c Sun Dec 22 23:23:29 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rk_i2c.c,v 1.6 2019/11/08 00:35:16 jmcneill Exp $ */ +/* $NetBSD: rk_i2c.c,v 1.7 2019/12/22 23:23:29 thorpej Exp $ */ /*- * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca> @@ -28,7 +28,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rk_i2c.c,v 1.6 2019/11/08 00:35:16 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rk_i2c.c,v 1.7 2019/12/22 23:23:29 thorpej Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -115,8 +115,6 @@ struct rk_i2c_softc { u_int sc_clkfreq; struct i2c_controller sc_ic; - kmutex_t sc_lock; - kcondvar_t sc_cv; }; #define RD4(sc, reg) \ @@ -162,24 +160,6 @@ rk_i2c_init(struct rk_i2c_softc *sc) } static int -rk_i2c_acquire_bus(void *priv, int flags) -{ - struct rk_i2c_softc * const sc = priv; - - mutex_enter(&sc->sc_lock); - - return 0; -} - -static void -rk_i2c_release_bus(void *priv, int flags) -{ - struct rk_i2c_softc * const sc = priv; - - mutex_exit(&sc->sc_lock); -} - -static int rk_i2c_wait(struct rk_i2c_softc *sc, uint32_t mask) { u_int timeo = 100000; @@ -345,8 +325,6 @@ rk_i2c_exec(void *priv, i2c_op_t op, i2c bool send_start = true; int error; - KASSERT(mutex_owned(&sc->sc_lock)); - if (I2C_OP_READ_P(op)) { uint8_t *databuf = buf; while (buflen > 0) { @@ -430,9 +408,6 @@ rk_i2c_attach(device_t parent, device_t return; } - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SCHED); - cv_init(&sc->sc_cv, "rkiic"); - aprint_naive("\n"); aprint_normal(": Rockchip I2C (%u Hz)\n", sc->sc_clkfreq); @@ -440,9 +415,8 @@ rk_i2c_attach(device_t parent, device_t rk_i2c_init(sc); + iic_tag_init(&sc->sc_ic); sc->sc_ic.ic_cookie = sc; - sc->sc_ic.ic_acquire_bus = rk_i2c_acquire_bus; - sc->sc_ic.ic_release_bus = rk_i2c_release_bus; sc->sc_ic.ic_exec = rk_i2c_exec; fdtbus_register_i2c_controller(self, phandle, &rk_i2c_funcs); Index: src/sys/arch/arm/sunxi/sunxi_hdmi.c diff -u src/sys/arch/arm/sunxi/sunxi_hdmi.c:1.7 src/sys/arch/arm/sunxi/sunxi_hdmi.c:1.8 --- src/sys/arch/arm/sunxi/sunxi_hdmi.c:1.7 Fri Jul 19 10:54:26 2019 +++ src/sys/arch/arm/sunxi/sunxi_hdmi.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_hdmi.c,v 1.7 2019/07/19 10:54:26 bouyer Exp $ */ +/* $NetBSD: sunxi_hdmi.c,v 1.8 2019/12/22 23:23:30 thorpej Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "opt_ddb.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunxi_hdmi.c,v 1.7 2019/07/19 10:54:26 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_hdmi.c,v 1.8 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -73,7 +73,7 @@ struct sunxi_hdmi_softc { lwp_t *sc_thread; struct i2c_controller sc_ic; - kmutex_t sc_ic_lock; + kmutex_t sc_exec_lock; bool sc_display_connected; char sc_display_vendor[16]; @@ -114,8 +114,6 @@ static const struct of_compat_data compa static int sunxi_hdmi_match(device_t, cfdata_t, void *); static void sunxi_hdmi_attach(device_t, device_t, void *); static void sunxi_hdmi_i2c_init(struct sunxi_hdmi_softc *); -static int sunxi_hdmi_i2c_acquire_bus(void *, int); -static void sunxi_hdmi_i2c_release_bus(void *, int); static int sunxi_hdmi_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); static int sunxi_hdmi_i2c_xfer(void *, i2c_addr_t, uint8_t, uint8_t, @@ -263,38 +261,14 @@ sunxi_hdmi_i2c_init(struct sunxi_hdmi_so { struct i2c_controller *ic = &sc->sc_ic; - mutex_init(&sc->sc_ic_lock, MUTEX_DEFAULT, IPL_NONE); + mutex_init(&sc->sc_exec_lock, MUTEX_DEFAULT, IPL_NONE); + iic_tag_init(ic); ic->ic_cookie = sc; - ic->ic_acquire_bus = sunxi_hdmi_i2c_acquire_bus; - ic->ic_release_bus = sunxi_hdmi_i2c_release_bus; ic->ic_exec = sunxi_hdmi_i2c_exec; } static int -sunxi_hdmi_i2c_acquire_bus(void *priv, int flags) -{ - struct sunxi_hdmi_softc *sc = priv; - - if (flags & I2C_F_POLL) { - if (!mutex_tryenter(&sc->sc_ic_lock)) - return EBUSY; - } else { - mutex_enter(&sc->sc_ic_lock); - } - - return 0; -} - -static void -sunxi_hdmi_i2c_release_bus(void *priv, int flags) -{ - struct sunxi_hdmi_softc *sc = priv; - - mutex_exit(&sc->sc_ic_lock); -} - -static int sunxi_hdmi_i2c_exec(void *priv, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { @@ -305,7 +279,8 @@ sunxi_hdmi_i2c_exec(void *priv, i2c_op_t off_t off; int err; - KASSERT(mutex_owned(&sc->sc_ic_lock)); + mutex_enter(&sc->sc_exec_lock); + KASSERT(op == I2C_OP_READ_WITH_STOP); KASSERT(addr == DDC_ADDR); KASSERT(cmdlen > 0); @@ -349,6 +324,7 @@ sunxi_hdmi_i2c_exec(void *priv, i2c_op_t } done: + mutex_exit(&sc->sc_exec_lock); return err; } @@ -435,7 +411,7 @@ sunxi_hdmi_i2c_xfer_1_4(void *priv, i2c_ if (cold) delay(1000); else - kpause("hdmiddc", false, mstohz(10), &sc->sc_ic_lock); + kpause("hdmiddc", false, mstohz(10), &sc->sc_exec_lock); } if (retry == 0) return ETIMEDOUT; Index: src/sys/arch/arm/sunxi/sunxi_rsb.c diff -u src/sys/arch/arm/sunxi/sunxi_rsb.c:1.7 src/sys/arch/arm/sunxi/sunxi_rsb.c:1.8 --- src/sys/arch/arm/sunxi/sunxi_rsb.c:1.7 Sun May 26 14:49:18 2019 +++ src/sys/arch/arm/sunxi/sunxi_rsb.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_rsb.c,v 1.7 2019/05/26 14:49:18 jmcneill Exp $ */ +/* $NetBSD: sunxi_rsb.c,v 1.8 2019/12/22 23:23:30 thorpej Exp $ */ /*- * Copyright (c) 2014-2017 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunxi_rsb.c,v 1.7 2019/05/26 14:49:18 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_rsb.c,v 1.8 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -85,8 +85,8 @@ struct sunxi_rsb_softc { bus_space_handle_t sc_bsh; enum sunxi_rsb_type sc_type; struct i2c_controller sc_ic; - kmutex_t sc_lock; - kcondvar_t sc_cv; + kmutex_t sc_intr_lock; + kcondvar_t sc_intr_wait; device_t sc_i2cdev; void *sc_ih; uint32_t sc_stat; @@ -100,8 +100,6 @@ struct sunxi_rsb_softc { #define RSB_WRITE(sc, reg, val) \ bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val)) -static int sunxi_rsb_acquire_bus(void *, int); -static void sunxi_rsb_release_bus(void *, int); static int sunxi_rsb_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -177,8 +175,8 @@ sunxi_rsb_attach(device_t parent, device return; } - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SCHED); - cv_init(&sc->sc_cv, "sunxirsb"); + mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED); + cv_init(&sc->sc_intr_wait, "sunxirsb"); aprint_naive("\n"); aprint_normal(": %s\n", sc->sc_type == SUNXI_P2WI ? "P2WI" : "RSB"); @@ -192,9 +190,8 @@ sunxi_rsb_attach(device_t parent, device } aprint_normal_dev(self, "interrupting on %s\n", intrstr); + iic_tag_init(&sc->sc_ic); sc->sc_ic.ic_cookie = sc; - sc->sc_ic.ic_acquire_bus = sunxi_rsb_acquire_bus; - sc->sc_ic.ic_release_bus = sunxi_rsb_release_bus; sc->sc_ic.ic_exec = sunxi_rsb_exec; fdtbus_register_i2c_controller(self, phandle, &sunxi_rsb_funcs); @@ -214,10 +211,10 @@ sunxi_rsb_intr(void *priv) RSB_WRITE(sc, RSB_STAT_REG, stat & RSB_STAT_MASK); - mutex_enter(&sc->sc_lock); + mutex_enter(&sc->sc_intr_lock); sc->sc_stat |= stat; - cv_broadcast(&sc->sc_cv); - mutex_exit(&sc->sc_lock); + cv_broadcast(&sc->sc_intr_wait); + mutex_exit(&sc->sc_intr_lock); return 1; } @@ -250,7 +247,8 @@ sunxi_rsb_wait(struct sunxi_rsb_softc *s if (flags & I2C_F_POLL) { sc->sc_stat |= RSB_READ(sc, RSB_STAT_REG); } else { - error = cv_timedwait(&sc->sc_cv, &sc->sc_lock, hz); + error = cv_timedwait(&sc->sc_intr_wait, + &sc->sc_intr_lock, hz); if (error && error != EWOULDBLOCK) { break; } @@ -298,7 +296,7 @@ sunxi_rsb_rsb_config(struct sunxi_rsb_so { uint32_t dar, ctrl; - KASSERT(mutex_owned(&sc->sc_lock)); + KASSERT(mutex_owned(&sc->sc_intr_lock)); RSB_WRITE(sc, RSB_STAT_REG, RSB_READ(sc, RSB_STAT_REG) & RSB_STAT_MASK); @@ -323,31 +321,6 @@ sunxi_rsb_rsb_config(struct sunxi_rsb_so } static int -sunxi_rsb_acquire_bus(void *priv, int flags) -{ - struct sunxi_rsb_softc *sc = priv; - - for (;;) { - mutex_enter(&sc->sc_lock); - if (sc->sc_busy == false) - break; - mutex_exit(&sc->sc_lock); - } - sc->sc_busy = true; - - return 0; -} - -static void -sunxi_rsb_release_bus(void *priv, int flags) -{ - struct sunxi_rsb_softc *sc = priv; - - sc->sc_busy = false; - mutex_exit(&sc->sc_lock); -} - -static int sunxi_rsb_exec(void *priv, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { @@ -356,14 +329,14 @@ sunxi_rsb_exec(void *priv, i2c_op_t op, uint8_t rta; int error, i; - KASSERT(mutex_owned(&sc->sc_lock)); - KASSERT(sc->sc_busy == true); - if (cmdlen != 1 || (len != 1 && len != 2 && len != 4)) return EINVAL; + mutex_enter(&sc->sc_intr_lock); + error = sunxi_rsb_soft_reset(sc); if (error != 0) { + mutex_exit(&sc->sc_intr_lock); device_printf(sc->sc_dev, "soft reset timed out\n"); return error; } @@ -386,6 +359,7 @@ sunxi_rsb_exec(void *priv, i2c_op_t op, break; } if (rta == 0) { + mutex_exit(&sc->sc_intr_lock); device_printf(sc->sc_dev, "RTA not known for address %#x\n", addr); return ENXIO; @@ -492,6 +466,7 @@ sunxi_rsb_exec(void *priv, i2c_op_t op, done: RSB_WRITE(sc, RSB_CTRL_REG, 0); + mutex_exit(&sc->sc_intr_lock); return error; } Index: src/sys/arch/arm/xscale/i80312_i2c.c diff -u src/sys/arch/arm/xscale/i80312_i2c.c:1.6 src/sys/arch/arm/xscale/i80312_i2c.c:1.7 --- src/sys/arch/arm/xscale/i80312_i2c.c:1.6 Tue Jan 10 18:55:37 2012 +++ src/sys/arch/arm/xscale/i80312_i2c.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i80312_i2c.c,v 1.6 2012/01/10 18:55:37 jakllsch Exp $ */ +/* $NetBSD: i80312_i2c.c,v 1.7 2019/12/22 23:23:30 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i80312_i2c.c,v 1.6 2012/01/10 18:55:37 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i80312_i2c.c,v 1.7 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/mutex.h> @@ -91,8 +91,6 @@ iic312_attach(device_t parent, device_t /* XXX Reset the I2C unit? */ - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); - /* XXX We don't currently use interrupts. Fix this some day. */ #if 0 sc->sc_ih = i80321_intr_establish(ICU_INT_I2C, IPL_BIO, Index: src/sys/arch/arm/xscale/i80321_i2c.c diff -u src/sys/arch/arm/xscale/i80321_i2c.c:1.5 src/sys/arch/arm/xscale/i80321_i2c.c:1.6 --- src/sys/arch/arm/xscale/i80321_i2c.c:1.5 Tue Jan 10 18:55:37 2012 +++ src/sys/arch/arm/xscale/i80321_i2c.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i80321_i2c.c,v 1.5 2012/01/10 18:55:37 jakllsch Exp $ */ +/* $NetBSD: i80321_i2c.c,v 1.6 2019/12/22 23:23:30 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i80321_i2c.c,v 1.5 2012/01/10 18:55:37 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i80321_i2c.c,v 1.6 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/mutex.h> @@ -98,8 +98,6 @@ iic321_attach(device_t parent, device_t /* XXX Reset the I2C unit? */ - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); - /* XXX We don't currently use interrupts. Fix this some day. */ #if 0 sc->sc_ih = i80321_intr_establish((ia->ia_offset == VERDE_I2C_BASE0) ? Index: src/sys/arch/arm/xscale/iopi2c.c diff -u src/sys/arch/arm/xscale/iopi2c.c:1.8 src/sys/arch/arm/xscale/iopi2c.c:1.9 --- src/sys/arch/arm/xscale/iopi2c.c:1.8 Sun Feb 14 19:54:20 2016 +++ src/sys/arch/arm/xscale/iopi2c.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: iopi2c.c,v 1.8 2016/02/14 19:54:20 chs Exp $ */ +/* $NetBSD: iopi2c.c,v 1.9 2019/12/22 23:23:30 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: iopi2c.c,v 1.8 2016/02/14 19:54:20 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: iopi2c.c,v 1.9 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/mutex.h> @@ -56,9 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: iopi2c.c,v 1 #include <arm/xscale/iopi2creg.h> #include <arm/xscale/iopi2cvar.h> -static int iopiic_acquire_bus(void *, int); -static void iopiic_release_bus(void *, int); - static int iopiic_send_start(void *, int); static int iopiic_send_stop(void *, int); static int iopiic_initiate_xfer(void *, uint16_t, int); @@ -70,9 +67,8 @@ iopiic_attach(struct iopiic_softc *sc) { struct i2cbus_attach_args iba; + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = iopiic_acquire_bus; - sc->sc_i2c.ic_release_bus = iopiic_release_bus; sc->sc_i2c.ic_send_start = iopiic_send_start; sc->sc_i2c.ic_send_stop = iopiic_send_stop; sc->sc_i2c.ic_initiate_xfer = iopiic_initiate_xfer; @@ -84,31 +80,6 @@ iopiic_attach(struct iopiic_softc *sc) (void) config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print); } -static int -iopiic_acquire_bus(void *cookie, int flags) -{ - struct iopiic_softc *sc = cookie; - - /* XXX What should we do for the polling case? */ - if (flags & I2C_F_POLL) - return (0); - - mutex_enter(&sc->sc_buslock); - return (0); -} - -static void -iopiic_release_bus(void *cookie, int flags) -{ - struct iopiic_softc *sc = cookie; - - /* XXX See above. */ - if (flags & I2C_F_POLL) - return; - - mutex_exit(&sc->sc_buslock); -} - #define IOPIIC_TIMEOUT 100 /* protocol timeout, in uSecs */ static int Index: src/sys/arch/arm/xscale/iopi2cvar.h diff -u src/sys/arch/arm/xscale/iopi2cvar.h:1.4 src/sys/arch/arm/xscale/iopi2cvar.h:1.5 --- src/sys/arch/arm/xscale/iopi2cvar.h:1.4 Tue Jan 10 18:55:37 2012 +++ src/sys/arch/arm/xscale/iopi2cvar.h Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: iopi2cvar.h,v 1.4 2012/01/10 18:55:37 jakllsch Exp $ */ +/* $NetBSD: iopi2cvar.h,v 1.5 2019/12/22 23:23:30 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -46,7 +46,6 @@ struct iopiic_softc { void *sc_ih; struct i2c_controller sc_i2c; - kmutex_t sc_buslock; uint32_t sc_icr; }; Index: src/sys/arch/evbarm/armadillo/armadillo9_iic.c diff -u src/sys/arch/evbarm/armadillo/armadillo9_iic.c:1.8 src/sys/arch/evbarm/armadillo/armadillo9_iic.c:1.9 --- src/sys/arch/evbarm/armadillo/armadillo9_iic.c:1.8 Sun Feb 14 19:54:20 2016 +++ src/sys/arch/evbarm/armadillo/armadillo9_iic.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: armadillo9_iic.c,v 1.8 2016/02/14 19:54:20 chs Exp $ */ +/* $NetBSD: armadillo9_iic.c,v 1.9 2019/12/22 23:23:30 thorpej Exp $ */ /* * Copyright (c) 2005 HAMAJIMA Katsuomi. All rights reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: armadillo9_iic.c,v 1.8 2016/02/14 19:54:20 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: armadillo9_iic.c,v 1.9 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -48,7 +48,6 @@ __KERNEL_RCSID(0, "$NetBSD: armadillo9_i struct armadillo9iic_softc { struct i2c_controller sc_i2c; - kmutex_t sc_buslock; int sc_port; int sc_sda; int sc_scl; @@ -58,8 +57,6 @@ struct armadillo9iic_softc { static int armadillo9iic_match(device_t, cfdata_t, void *); static void armadillo9iic_attach(device_t, device_t, void *); -static int armadillo9iic_acquire_bus(void *, int); -static void armadillo9iic_release_bus(void *, int); static int armadillo9iic_send_start(void *, int); static int armadillo9iic_send_stop(void *, int); static int armadillo9iic_initiate_xfer(void *, uint16_t, int); @@ -94,7 +91,6 @@ armadillo9iic_attach(device_t parent, de #if NSEEPROM > 0 struct epgpio_attach_args *ga = aux; #endif - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); sc->sc_port = ga->ga_port; sc->sc_sda = ga->ga_bit1; @@ -106,9 +102,8 @@ armadillo9iic_attach(device_t parent, de armadillo9iic_bbops.ibo_bits[I2C_BIT_OUTPUT] = sc->sc_sda; armadillo9iic_bbops.ibo_bits[I2C_BIT_INPUT] = 0; + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = armadillo9iic_acquire_bus; - sc->sc_i2c.ic_release_bus = armadillo9iic_release_bus; sc->sc_i2c.ic_send_start = armadillo9iic_send_start; sc->sc_i2c.ic_send_stop = armadillo9iic_send_stop; sc->sc_i2c.ic_initiate_xfer = armadillo9iic_initiate_xfer; @@ -138,31 +133,6 @@ armadillo9iic_attach(device_t parent, de } int -armadillo9iic_acquire_bus(void *cookie, int flags) -{ - struct armadillo9iic_softc *sc = cookie; - - /* XXX What should we do for the polling case? */ - if (flags & I2C_F_POLL) - return 0; - - mutex_enter(&sc->sc_buslock); - return 0; -} - -void -armadillo9iic_release_bus(void *cookie, int flags) -{ - struct armadillo9iic_softc *sc = cookie; - - /* XXX See above. */ - if (flags & I2C_F_POLL) - return; - - mutex_exit(&sc->sc_buslock); -} - -int armadillo9iic_send_start(void *cookie, int flags) { return i2c_bitbang_send_start(cookie, flags, &armadillo9iic_bbops); Index: src/sys/arch/evbarm/gumstix/gxiic.c diff -u src/sys/arch/evbarm/gumstix/gxiic.c:1.8 src/sys/arch/evbarm/gumstix/gxiic.c:1.9 --- src/sys/arch/evbarm/gumstix/gxiic.c:1.8 Sun Feb 14 19:54:20 2016 +++ src/sys/arch/evbarm/gumstix/gxiic.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gxiic.c,v 1.8 2016/02/14 19:54:20 chs Exp $ */ +/* $NetBSD: gxiic.c,v 1.9 2019/12/22 23:23:30 thorpej Exp $ */ /* * Copyright (c) 2007 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gxiic.c,v 1.8 2016/02/14 19:54:20 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gxiic.c,v 1.9 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -44,7 +44,6 @@ struct gxiic_softc { struct pxa2x0_i2c_softc sc_pxa_i2c; struct i2c_controller sc_i2c; - kmutex_t sc_lock; }; @@ -96,17 +95,11 @@ gxiicattach(device_t parent, device_t se return; } - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); - /* Initialize i2c_controller */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; sc->sc_i2c.ic_acquire_bus = gxiic_acquire_bus; sc->sc_i2c.ic_release_bus = gxiic_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = gxiic_exec; memset(&iba, 0, sizeof(iba)); @@ -121,7 +114,6 @@ gxiic_acquire_bus(void *cookie, int flag { struct gxiic_softc *sc = cookie; - mutex_enter(&sc->sc_lock); pxa2x0_i2c_open(&sc->sc_pxa_i2c); return 0; @@ -133,8 +125,6 @@ gxiic_release_bus(void *cookie, int flag struct gxiic_softc *sc = cookie; pxa2x0_i2c_close(&sc->sc_pxa_i2c); - mutex_exit(&sc->sc_lock); - return; } static int Index: src/sys/arch/evbarm/nslu2/nslu2_iic.c diff -u src/sys/arch/evbarm/nslu2/nslu2_iic.c:1.9 src/sys/arch/evbarm/nslu2/nslu2_iic.c:1.10 --- src/sys/arch/evbarm/nslu2/nslu2_iic.c:1.9 Sun Feb 14 19:54:20 2016 +++ src/sys/arch/evbarm/nslu2/nslu2_iic.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nslu2_iic.c,v 1.9 2016/02/14 19:54:20 chs Exp $ */ +/* $NetBSD: nslu2_iic.c,v 1.10 2019/12/22 23:23:30 thorpej Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -47,34 +47,10 @@ struct slugiic_softc { struct i2c_controller sc_ic; struct i2c_bitbang_ops sc_ibo; - kmutex_t sc_lock; uint32_t sc_dirout; }; static int -slugiic_acquire_bus(void *arg, int flags) -{ - struct slugiic_softc *sc = arg; - - if (flags & I2C_F_POLL) - return (0); - - mutex_enter(&sc->sc_lock); - return (0); -} - -static void -slugiic_release_bus(void *arg, int flags) -{ - struct slugiic_softc *sc = arg; - - if (flags & I2C_F_POLL) - return; - - mutex_exit(&sc->sc_lock); -} - -static int slugiic_send_start(void *arg, int flags) { struct slugiic_softc *sc = arg; @@ -230,10 +206,8 @@ slugiic_attach(device_t parent, device_t aprint_naive("\n"); aprint_normal(": I2C bus\n"); + iic_tag_init(&sc->sc_ic); sc->sc_ic.ic_cookie = sc; - sc->sc_ic.ic_acquire_bus = slugiic_acquire_bus; - sc->sc_ic.ic_release_bus = slugiic_release_bus; - sc->sc_ic.ic_exec = NULL; sc->sc_ic.ic_send_start = slugiic_send_start; sc->sc_ic.ic_send_stop = slugiic_send_stop; sc->sc_ic.ic_initiate_xfer = slugiic_initiate_xfer; @@ -248,8 +222,6 @@ slugiic_attach(device_t parent, device_t sc->sc_ibo.ibo_bits[I2C_BIT_OUTPUT] = 1; sc->sc_ibo.ibo_bits[I2C_BIT_INPUT] = 0; - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); - sc->sc_dirout = 0; /* Index: src/sys/arch/hpcarm/dev/nbpiic.c diff -u src/sys/arch/hpcarm/dev/nbpiic.c:1.2 src/sys/arch/hpcarm/dev/nbpiic.c:1.3 --- src/sys/arch/hpcarm/dev/nbpiic.c:1.2 Sun Feb 14 19:54:20 2016 +++ src/sys/arch/hpcarm/dev/nbpiic.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nbpiic.c,v 1.2 2016/02/14 19:54:20 chs Exp $ */ +/* $NetBSD: nbpiic.c,v 1.3 2019/12/22 23:23:30 thorpej Exp $ */ /* * Copyright (c) 2011 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nbpiic.c,v 1.2 2016/02/14 19:54:20 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nbpiic.c,v 1.3 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -64,8 +64,6 @@ static int nbpiic_intr(void *); int nbpiic_poll(void *, int, char *); /* fuctions for i2c_controller */ -static int nbpiic_acquire_bus(void *, int); -static void nbpiic_release_bus(void *, int); static int nbpiic_exec(void *cookie, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -110,7 +108,11 @@ pxaiic_attach(device_t parent, device_t return; } - /* Initialize mutex with IPL_HIGH. Keyboard was connected to us. */ + /* + * Initialize mutex with IPL_HIGH. Keyboard was connected to us. + * This is orthogonal to the lock held at the i2c layer; this + * is just to interlock us with the keyboard interrupt. + */ mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_HIGH); ih = pxa2x0_intr_establish(pxa->pxa_intr, IPL_HIGH, nbpiic_intr, sc); @@ -120,14 +122,8 @@ pxaiic_attach(device_t parent, device_t } /* Initialize i2c_controller */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = nbpiic_acquire_bus; - sc->sc_i2c.ic_release_bus = nbpiic_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = nbpiic_exec; memset(&iba, 0, sizeof(iba)); @@ -184,26 +180,6 @@ nbpiic_poll(void *cookie, int buflen, ch } static int -nbpiic_acquire_bus(void *cookie, int flags) -{ - struct nbpiic_softc *sc = cookie; - - mutex_enter(&sc->sc_lock); - - return 0; -} - -static void -nbpiic_release_bus(void *cookie, int flags) -{ - struct nbpiic_softc *sc = cookie; - - mutex_exit(&sc->sc_lock); - - return; -} - -static int nbpiic_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *vcmd, size_t cmdlen, void *vbuf, size_t buflen, int flags) { @@ -211,6 +187,8 @@ nbpiic_exec(void *cookie, i2c_op_t op, i int rv = -1; const u_char cmd = *(const u_char *)vcmd; + mutex_enter(&sc->sc_lock); + if (I2C_OP_READ_P(op) && (cmdlen == 0) && (buflen == 1)) rv = pxa2x0_i2c_read(&sc->sc_pxa_i2c, addr, (u_char *)vbuf); @@ -257,5 +235,7 @@ printf("%s: write cmdlen=1, buflen=2: Oo rv = pxa2x0_i2c_quick(&sc->sc_pxa_i2c, addr, I2C_OP_READ_P(op) ? 1 : 0); + mutex_exit(&sc->sc_lock); + return rv; } Index: src/sys/arch/i386/pci/viapcib.c diff -u src/sys/arch/i386/pci/viapcib.c:1.16 src/sys/arch/i386/pci/viapcib.c:1.17 --- src/sys/arch/i386/pci/viapcib.c:1.16 Mon Sep 3 16:29:25 2018 +++ src/sys/arch/i386/pci/viapcib.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: viapcib.c,v 1.16 2018/09/03 16:29:25 riastradh Exp $ */ +/* $NetBSD: viapcib.c,v 1.17 2019/12/22 23:23:30 thorpej Exp $ */ /* $FreeBSD: src/sys/pci/viapm.c,v 1.10 2005/05/29 04:42:29 nyan Exp $ */ /*- @@ -55,7 +55,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: viapcib.c,v 1.16 2018/09/03 16:29:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: viapcib.c,v 1.17 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -90,8 +90,6 @@ struct viapcib_softc { struct i2c_controller sc_i2c; int sc_revision; - - kmutex_t sc_lock; }; static int viapcib_match(device_t, cfdata_t, void *); @@ -107,8 +105,6 @@ static int viapcib_busy(struct viapcib_s #define VIAPCIB_SMBUS_TIMEOUT 10000 -static int viapcib_acquire_bus(void *, int); -static void viapcib_release_bus(void *, int); static int viapcib_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -171,8 +167,6 @@ viapcib_attach(device_t parent, device_t goto core_pcib; } - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); - val = pci_conf_read(pa->pa_pc, pa->pa_tag, SMB_HOST_CONFIG); if ((val & 0x10000) == 0) { printf(": SMBus is disabled\n"); @@ -214,15 +208,10 @@ core_pcib: b = viapcib_smbus_read(sc, SMBSLVCNT); viapcib_smbus_write(sc, SMBSLVCNT, b & ~1); - memset(&sc->sc_i2c, 0, sizeof(sc->sc_i2c)); memset(&iba, 0, sizeof(iba)); -#ifdef I2C_TYPE_SMBUS - iba.iba_type = I2C_TYPE_SMBUS; -#endif iba.iba_tag = &sc->sc_i2c; + iic_tag_init(&sc->sc_i2c); iba.iba_tag->ic_cookie = (void *)sc; - iba.iba_tag->ic_acquire_bus = viapcib_acquire_bus; - iba.iba_tag->ic_release_bus = viapcib_release_bus; iba.iba_tag->ic_exec = viapcib_exec; config_found_ia(self, "i2cbus", &iba, iicbus_print); @@ -279,26 +268,6 @@ viapcib_busy(struct viapcib_softc *sc) } static int -viapcib_acquire_bus(void *opaque, int flags) -{ - struct viapcib_softc *sc = (struct viapcib_softc *)opaque; - - DPRINTF(("viapcib_i2c_acquire_bus(%p, 0x%x)\n", opaque, flags)); - mutex_enter(&sc->sc_lock); - - return 0; -} - -static void -viapcib_release_bus(void *opaque, int flags) -{ - struct viapcib_softc *sc = (struct viapcib_softc *)opaque; - - mutex_exit(&sc->sc_lock); - DPRINTF(("viapcib_i2c_release_bus(%p, 0x%x)\n", opaque, flags)); -} - -static int viapcib_exec(void *opaque, i2c_op_t op, i2c_addr_t addr, const void *vcmd, size_t cmdlen, void *vbuf, size_t buflen, int flags) { Index: src/sys/arch/macppc/dev/cuda.c diff -u src/sys/arch/macppc/dev/cuda.c:1.23 src/sys/arch/macppc/dev/cuda.c:1.24 --- src/sys/arch/macppc/dev/cuda.c:1.23 Mon Sep 3 16:29:25 2018 +++ src/sys/arch/macppc/dev/cuda.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cuda.c,v 1.23 2018/09/03 16:29:25 riastradh Exp $ */ +/* $NetBSD: cuda.c,v 1.24 2019/12/22 23:23:30 thorpej Exp $ */ /*- * Copyright (c) 2006 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cuda.c,v 1.23 2018/09/03 16:29:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cuda.c,v 1.24 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -79,7 +79,6 @@ struct cuda_softc { struct todr_chip_handle sc_todr; struct adb_bus_accessops sc_adbops; struct i2c_controller sc_i2c; - kmutex_t sc_buslock; bus_space_tag_t sc_memt; bus_space_handle_t sc_memh; int sc_node; @@ -145,8 +144,6 @@ static int cuda_adb_send(void *, int, i static int cuda_adb_set_handler(void *, void (*)(void *, int, uint8_t *), void *); /* i2c stuff */ -static int cuda_i2c_acquire_bus(void *, int); -static void cuda_i2c_release_bus(void *, int); static int cuda_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -277,17 +274,10 @@ cuda_attach(device_t parent, device_t se prop_object_release(dev); } - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); memset(&iba, 0, sizeof(iba)); iba.iba_tag = &sc->sc_i2c; + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = cuda_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = cuda_i2c_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = cuda_i2c_exec; config_found_ia(self, "i2cbus", &iba, iicbus_print); @@ -939,23 +929,6 @@ cuda_adb_set_handler(void *cookie, void /* i2c message handling */ static int -cuda_i2c_acquire_bus(void *cookie, int flags) -{ - struct cuda_softc *sc = cookie; - - mutex_enter(&sc->sc_buslock); - return 0; -} - -static void -cuda_i2c_release_bus(void *cookie, int flags) -{ - struct cuda_softc *sc = cookie; - - mutex_exit(&sc->sc_buslock); -} - -static int cuda_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *_send, size_t send_len, void *_recv, size_t recv_len, int flags) { Index: src/sys/arch/macppc/dev/ki2c.c diff -u src/sys/arch/macppc/dev/ki2c.c:1.26 src/sys/arch/macppc/dev/ki2c.c:1.27 --- src/sys/arch/macppc/dev/ki2c.c:1.26 Thu Aug 15 22:35:39 2019 +++ src/sys/arch/macppc/dev/ki2c.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ki2c.c,v 1.26 2019/08/15 22:35:39 macallan Exp $ */ +/* $NetBSD: ki2c.c,v 1.27 2019/12/22 23:23:30 thorpej Exp $ */ /* Id: ki2c.c,v 1.7 2002/10/05 09:56:05 tsubai Exp */ /*- @@ -58,8 +58,6 @@ int ki2c_read(struct ki2c_softc *, int, int ki2c_write(struct ki2c_softc *, int, int, void *, int); /* I2C glue */ -static int ki2c_i2c_acquire_bus(void *, int); -static void ki2c_i2c_release_bus(void *, int); static int ki2c_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -126,7 +124,6 @@ ki2c_attach(device_t parent, device_t se ki2c_setmode(sc, I2C_STDSUBMODE); ki2c_setspeed(sc, I2C_100kHz); /* XXX rate */ - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); ki2c_writereg(sc, IER,I2C_INT_DATA|I2C_INT_ADDR|I2C_INT_STOP); cfg = prop_array_create(); @@ -197,14 +194,8 @@ ki2c_attach(device_t parent, device_t se } /* fill in the i2c tag */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = ki2c_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = ki2c_i2c_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = ki2c_i2c_exec; memset(&iba, 0, sizeof(iba)); @@ -389,23 +380,6 @@ ki2c_write(struct ki2c_softc *sc, int ad return ki2c_start(sc, addr, subaddr, data, len); } -static int -ki2c_i2c_acquire_bus(void *cookie, int flags) -{ - struct ki2c_softc *sc = cookie; - - mutex_enter(&sc->sc_buslock); - return 0; -} - -static void -ki2c_i2c_release_bus(void *cookie, int flags) -{ - struct ki2c_softc *sc = cookie; - - mutex_exit(&sc->sc_buslock); -} - int ki2c_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *vcmd, size_t cmdlen, void *vbuf, size_t buflen, int flags) Index: src/sys/arch/macppc/dev/pmu.c diff -u src/sys/arch/macppc/dev/pmu.c:1.32 src/sys/arch/macppc/dev/pmu.c:1.33 --- src/sys/arch/macppc/dev/pmu.c:1.32 Mon Sep 3 16:29:25 2018 +++ src/sys/arch/macppc/dev/pmu.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pmu.c,v 1.32 2018/09/03 16:29:25 riastradh Exp $ */ +/* $NetBSD: pmu.c,v 1.33 2019/12/22 23:23:30 thorpej Exp $ */ /*- * Copyright (c) 2006 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmu.c,v 1.32 2018/09/03 16:29:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmu.c,v 1.33 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -85,7 +85,6 @@ struct pmu_softc { struct todr_chip_handle sc_todr; struct adb_bus_accessops sc_adbops; struct i2c_controller sc_i2c; - kmutex_t sc_i2c_lock; struct pmu_ops sc_pmu_ops; struct sysmon_pswitch sc_lidswitch; struct sysmon_pswitch sc_powerbutton; @@ -147,8 +146,6 @@ static int pmu_adb_send(void *, int, in static int pmu_adb_set_handler(void *, void (*)(void *, int, uint8_t *), void *); /* i2c stuff */ -static int pmu_i2c_acquire_bus(void *, int); -static void pmu_i2c_release_bus(void *, int); static int pmu_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -381,15 +378,8 @@ pmu_attach(device_t parent, device_t sel } memset(&iba, 0, sizeof(iba)); iba.iba_tag = &sc->sc_i2c; - mutex_init(&sc->sc_i2c_lock, MUTEX_DEFAULT, IPL_NONE); + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = pmu_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = pmu_i2c_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = pmu_i2c_exec; config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print); @@ -926,24 +916,6 @@ pmu_adb_set_handler(void *cookie, void ( } static int -pmu_i2c_acquire_bus(void *cookie, int flags) -{ - struct pmu_softc *sc = cookie; - - mutex_enter(&sc->sc_i2c_lock); - - return 0; -} - -static void -pmu_i2c_release_bus(void *cookie, int flags) -{ - struct pmu_softc *sc = cookie; - - mutex_exit(&sc->sc_i2c_lock); -} - -static int pmu_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *_send, size_t send_len, void *_recv, size_t recv_len, int flags) { Index: src/sys/arch/macppc/dev/smu.c diff -u src/sys/arch/macppc/dev/smu.c:1.7 src/sys/arch/macppc/dev/smu.c:1.8 --- src/sys/arch/macppc/dev/smu.c:1.7 Sun Nov 10 21:16:29 2019 +++ src/sys/arch/macppc/dev/smu.c Sun Dec 22 23:23:30 2019 @@ -113,7 +113,6 @@ struct smu_softc { int sc_num_fans; struct smu_fan sc_fans[SMU_MAX_FANS]; - kmutex_t sc_iicbus_lock; int sc_num_iicbus; struct smu_iicbus sc_iicbus[SMU_MAX_IICBUS]; @@ -166,8 +165,6 @@ static int smu_todr_settime_ymdhms(todr_ static int smu_fan_update_rpm(struct smu_fan *); static int smu_fan_get_rpm(struct smu_fan *, int *); static int smu_fan_set_rpm(struct smu_fan *, int); -static int smu_iicbus_acquire_bus(void *, int); -static void smu_iicbus_release_bus(void *, int); static int smu_iicbus_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); static int smu_sysctl_fan_rpm(SYSCTLFN_ARGS); @@ -434,8 +431,6 @@ smu_setup_iicbus(struct smu_softc *sc) int node; char name[32]; - mutex_init(&sc->sc_iicbus_lock, MUTEX_DEFAULT, IPL_NONE); - node = of_getnode_byname(sc->sc_node, "smu-i2c-control"); for (node = OF_child(node); (node != 0) && (sc->sc_num_iicbus < SMU_MAX_IICBUS); @@ -454,14 +449,8 @@ smu_setup_iicbus(struct smu_softc *sc) DPRINTF("iicbus: reg %x\n", iicbus->reg); + iic_tag_init(i2c); i2c->ic_cookie = iicbus; - i2c->ic_acquire_bus = smu_iicbus_acquire_bus; - i2c->ic_release_bus = smu_iicbus_release_bus; - i2c->ic_send_start = NULL; - i2c->ic_send_stop = NULL; - i2c->ic_initiate_xfer = NULL; - i2c->ic_read_byte = NULL; - i2c->ic_write_byte = NULL; i2c->ic_exec = smu_iicbus_exec; ca.ca_name = name; @@ -773,26 +762,6 @@ smu_fan_set_rpm(struct smu_fan *fan, int } static int -smu_iicbus_acquire_bus(void *cookie, int flags) -{ - struct smu_iicbus *iicbus = cookie; - struct smu_softc *sc = iicbus->sc; - - mutex_enter(&sc->sc_iicbus_lock); - - return 0; -} - -static void -smu_iicbus_release_bus(void *cookie, int flags) -{ - struct smu_iicbus *iicbus = cookie; - struct smu_softc *sc = iicbus->sc; - - mutex_exit(&sc->sc_iicbus_lock); -} - -static int smu_iicbus_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *send, size_t send_len, void *recv, size_t recv_len, int flags) { Index: src/sys/arch/macppc/macppc/memory.c diff -u src/sys/arch/macppc/macppc/memory.c:1.6 src/sys/arch/macppc/macppc/memory.c:1.7 --- src/sys/arch/macppc/macppc/memory.c:1.6 Sun Nov 10 21:16:29 2019 +++ src/sys/arch/macppc/macppc/memory.c Sun Dec 22 23:23:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: memory.c,v 1.6 2019/11/10 21:16:29 chs Exp $ */ +/* $NetBSD: memory.c,v 1.7 2019/12/22 23:23:30 thorpej Exp $ */ /* $OpenBSD: mem.c,v 1.15 2007/10/14 17:29:04 kettenis Exp $ */ /*- @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: memory.c,v 1.6 2019/11/10 21:16:29 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: memory.c,v 1.7 2019/12/22 23:23:30 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -75,8 +75,6 @@ void memory_attach(device_t, device_t, v CFATTACH_DECL_NEW(memory, sizeof(struct memory_softc), memory_match, memory_attach, NULL, NULL); -int memory_i2c_acquire_bus(void *, int); -void memory_i2c_release_bus(void *, int); int memory_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -112,10 +110,8 @@ memory_attach(device_t parent, device_t OF_getprop(ca->ca_node, "dimm-info", sc->sc_buf, sc->sc_len); - memset(&ic, 0, sizeof ic); + iic_tag_init(&ic); ic.ic_cookie = sc; - ic.ic_acquire_bus = memory_i2c_acquire_bus; - ic.ic_release_bus = memory_i2c_release_bus; ic.ic_exec = memory_i2c_exec; memset(&ia, 0, sizeof ia); @@ -136,21 +132,11 @@ memory_attach(device_t parent, device_t /* No need to keep the "dimm-info" contents around. */ free(sc->sc_buf, M_DEVBUF); sc->sc_len = -1; + iic_tag_fini(&ic); } } int -memory_i2c_acquire_bus(void *cookie, int flags) -{ - return (0); -} - -void -memory_i2c_release_bus(void *cookie, int flags) -{ -} - -int memory_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) Index: src/sys/arch/mips/alchemy/dev/ausmbus_psc.c diff -u src/sys/arch/mips/alchemy/dev/ausmbus_psc.c:1.12 src/sys/arch/mips/alchemy/dev/ausmbus_psc.c:1.13 --- src/sys/arch/mips/alchemy/dev/ausmbus_psc.c:1.12 Sun Feb 14 19:54:21 2016 +++ src/sys/arch/mips/alchemy/dev/ausmbus_psc.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ausmbus_psc.c,v 1.12 2016/02/14 19:54:21 chs Exp $ */ +/* $NetBSD: ausmbus_psc.c,v 1.13 2019/12/22 23:23:31 thorpej Exp $ */ /*- * Copyright (c) 2006 Shigeyuki Fukushima. @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ausmbus_psc.c,v 1.12 2016/02/14 19:54:21 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ausmbus_psc.c,v 1.13 2019/12/22 23:23:31 thorpej Exp $"); #include "locators.h" @@ -126,14 +126,10 @@ ausmbus_attach(device_t parent, device_t sc->sc_ctrl = aa->aupsc_ctrl; /* Initialize i2c_controller for SMBus */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; sc->sc_i2c.ic_acquire_bus = ausmbus_acquire_bus; sc->sc_i2c.ic_release_bus = ausmbus_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = ausmbus_exec; sc->sc_smbus_timeout = 10; Index: src/sys/arch/mips/ingenic/jziic.c diff -u src/sys/arch/mips/ingenic/jziic.c:1.5 src/sys/arch/mips/ingenic/jziic.c:1.6 --- src/sys/arch/mips/ingenic/jziic.c:1.5 Mon Sep 3 16:29:26 2018 +++ src/sys/arch/mips/ingenic/jziic.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: jziic.c,v 1.5 2018/09/03 16:29:26 riastradh Exp $ */ +/* $NetBSD: jziic.c,v 1.6 2019/12/22 23:23:31 thorpej Exp $ */ /*- * Copyright (c) 2015 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: jziic.c,v 1.5 2018/09/03 16:29:26 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: jziic.c,v 1.6 2019/12/22 23:23:31 thorpej Exp $"); /* * a preliminary driver for JZ4780's on-chip SMBus controllers @@ -69,7 +69,7 @@ struct jziic_softc { bus_space_tag_t sc_memt; bus_space_handle_t sc_memh; struct i2c_controller sc_i2c; - kmutex_t sc_buslock, sc_cvlock; + kmutex_t sc_cvlock; uint32_t sc_pclk; /* stuff used for interrupt-driven transfers */ const uint8_t *sc_cmd; @@ -89,8 +89,6 @@ STATIC int jziic_enable(struct jziic_sof STATIC void jziic_disable(struct jziic_softc *); STATIC int jziic_wait(struct jziic_softc *); STATIC void jziic_set_speed(struct jziic_softc *); -STATIC int jziic_i2c_acquire_bus(void *, int); -STATIC void jziic_i2c_release_bus(void *, int); STATIC int jziic_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); STATIC int jziic_i2c_exec_poll(struct jziic_softc *, i2c_op_t, i2c_addr_t, @@ -138,7 +136,6 @@ jziic_attach(device_t parent, device_t s return; } - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&sc->sc_cvlock, MUTEX_DEFAULT, IPL_NONE); cv_init(&sc->sc_ping, device_xname(self)); @@ -175,14 +172,8 @@ jziic_attach(device_t parent, device_t s #endif /* fill in the i2c tag */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = jziic_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = jziic_i2c_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = jziic_i2c_exec; memset(&iba, 0, sizeof(iba)); @@ -233,23 +224,6 @@ jziic_disable(struct jziic_softc *sc) } STATIC int -jziic_i2c_acquire_bus(void *cookie, int flags) -{ - struct jziic_softc *sc = cookie; - - mutex_enter(&sc->sc_buslock); - return 0; -} - -STATIC void -jziic_i2c_release_bus(void *cookie, int flags) -{ - struct jziic_softc *sc = cookie; - - mutex_exit(&sc->sc_buslock); -} - -STATIC int jziic_wait(struct jziic_softc *sc) { uint32_t reg; Index: src/sys/arch/mips/ralink/ralink_i2c.c diff -u src/sys/arch/mips/ralink/ralink_i2c.c:1.3 src/sys/arch/mips/ralink/ralink_i2c.c:1.4 --- src/sys/arch/mips/ralink/ralink_i2c.c:1.3 Sat Oct 27 17:18:02 2012 +++ src/sys/arch/mips/ralink/ralink_i2c.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ralink_i2c.c,v 1.3 2012/10/27 17:18:02 chs Exp $ */ +/* $NetBSD: ralink_i2c.c,v 1.4 2019/12/22 23:23:31 thorpej Exp $ */ /*- * Copyright (c) 2011 CradlePoint Technology, Inc. * All rights reserved. @@ -29,7 +29,7 @@ /* ra_i2c.c - Ralink i2c 3052 driver */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ralink_i2c.c,v 1.3 2012/10/27 17:18:02 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ralink_i2c.c,v 1.4 2019/12/22 23:23:31 thorpej Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -86,8 +86,6 @@ static void i2c_read_stop(ra_i2c_softc_t #endif /* i2c driver functions */ -int ra_i2c_acquire_bus(void *, int); -void ra_i2c_release_bus(void *, int); int ra_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); void ra_i2c_reset(ra_i2c_softc_t *); @@ -155,13 +153,11 @@ ra_i2c_attach(device_t parent, device_t bus_space_write_4(sc->sc_memt, sc->sc_sy_memh, RA_SYSCTL_GPIOMODE, r); + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = ra_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = ra_i2c_release_bus; sc->sc_i2c.ic_exec = ra_i2c_exec; memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &sc->sc_i2c; config_found(self, &iba, iicbus_print); } @@ -172,23 +168,6 @@ ra_i2c_attach(device_t parent, device_t * I2C API */ -/* Might not be needed. JCL. */ -int -ra_i2c_acquire_bus(void *cookie, int flags) -{ - /* nothing */ - return 0; -} - - - -/* Might not be needed. JCL. */ -void -ra_i2c_release_bus(void *cookie, int flags) -{ - /* nothing */ -} - int ra_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) Index: src/sys/arch/mmeye/dev/rtciic.c diff -u src/sys/arch/mmeye/dev/rtciic.c:1.1 src/sys/arch/mmeye/dev/rtciic.c:1.2 --- src/sys/arch/mmeye/dev/rtciic.c:1.1 Sat Feb 19 10:46:28 2011 +++ src/sys/arch/mmeye/dev/rtciic.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rtciic.c,v 1.1 2011/02/19 10:46:28 kiyohara Exp $ */ +/* $NetBSD: rtciic.c,v 1.2 2019/12/22 23:23:31 thorpej Exp $ */ /* * Copyright (c) 2011 KIYOHARA Takashi * All rights reserved. @@ -26,7 +26,7 @@ * */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtciic.c,v 1.1 2011/02/19 10:46:28 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtciic.c,v 1.2 2019/12/22 23:23:31 thorpej Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -72,8 +72,6 @@ struct rtciic_softc { static int rtciic_match(device_t, cfdata_t , void *); static void rtciic_attach(device_t, device_t, void *); -static int rtciic_acquire_bus(void *, int); -static void rtciic_release_bus(void *, int); static int rtciic_send_start(void *, int); static int rtciic_send_stop(void *, int); static int rtciic_initiate_xfer(void *, i2c_addr_t, int); @@ -127,10 +125,8 @@ rtciic_attach(device_t parent, device_t sc->sc_rw = RTCIIC_READ(sc) & RTCIIC_RW; /* register with iic */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = rtciic_acquire_bus; - sc->sc_i2c.ic_release_bus = rtciic_release_bus; - sc->sc_i2c.ic_exec = NULL; sc->sc_i2c.ic_send_start = rtciic_send_start; sc->sc_i2c.ic_send_stop = rtciic_send_stop; sc->sc_i2c.ic_initiate_xfer = rtciic_initiate_xfer; @@ -150,20 +146,6 @@ rtciic_attach(device_t parent, device_t (void) config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print); } - -static int -rtciic_acquire_bus(void *cookie, int flags) -{ - - return 0; -} - -static void -rtciic_release_bus(void *cookie, int flags) -{ - /* nothing */ -} - static int rtciic_send_start(void *arg, int flags) { Index: src/sys/arch/powerpc/ibm4xx/dev/gpiic_opb.c diff -u src/sys/arch/powerpc/ibm4xx/dev/gpiic_opb.c:1.9 src/sys/arch/powerpc/ibm4xx/dev/gpiic_opb.c:1.10 --- src/sys/arch/powerpc/ibm4xx/dev/gpiic_opb.c:1.9 Sat Jun 18 06:41:42 2011 +++ src/sys/arch/powerpc/ibm4xx/dev/gpiic_opb.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gpiic_opb.c,v 1.9 2011/06/18 06:41:42 matt Exp $ */ +/* $NetBSD: gpiic_opb.c,v 1.10 2019/12/22 23:23:31 thorpej Exp $ */ /* * Copyright 2002, 2003 Wasabi Systems, Inc. @@ -59,7 +59,6 @@ struct gpiic_softc { uint8_t sc_tx; struct i2c_controller sc_i2c; struct i2c_bitbang_ops sc_bops; - kmutex_t sc_buslock; }; static int gpiic_match(device_t, cfdata_t, void *); @@ -68,8 +67,6 @@ static void gpiic_attach(device_t, devic CFATTACH_DECL_NEW(gpiic, sizeof(struct gpiic_softc), gpiic_match, gpiic_attach, NULL, NULL); -static int gpiic_acquire_bus(void *, int); -static void gpiic_release_bus(void *, int); static int gpiic_send_start(void *, int); static int gpiic_send_stop(void *, int); static int gpiic_initiate_xfer(void *, i2c_addr_t, int); @@ -105,14 +102,10 @@ gpiic_attach(device_t parent, device_t s bus_space_map(sc->sc_bust, oaa->opb_addr, IIC_NREG, 0, &sc->sc_bush); - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); - sc->sc_txen = 0; sc->sc_tx = IIC_DIRECTCNTL_SCC | IIC_DIRECTCNTL_SDAC; + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = gpiic_acquire_bus; - sc->sc_i2c.ic_release_bus = gpiic_release_bus; - sc->sc_i2c.ic_exec = NULL; sc->sc_i2c.ic_send_start = gpiic_send_start; sc->sc_i2c.ic_send_stop = gpiic_send_stop; sc->sc_i2c.ic_initiate_xfer = gpiic_initiate_xfer; @@ -143,29 +136,6 @@ gpiic_attach(device_t parent, device_t s } static int -gpiic_acquire_bus(void *arg, int flags) -{ - struct gpiic_softc * const sc = arg; - - if (flags & I2C_F_POLL) - return (0); - - mutex_enter(&sc->sc_buslock); - return (0); -} - -static void -gpiic_release_bus(void *arg, int flags) -{ - struct gpiic_softc * const sc = arg; - - if (flags & I2C_F_POLL) - return; - - mutex_exit(&sc->sc_buslock); -} - -static int gpiic_send_start(void *arg, int flags) { struct gpiic_softc * const sc = arg; Index: src/sys/arch/sgimips/dev/crmfb.c diff -u src/sys/arch/sgimips/dev/crmfb.c:1.45 src/sys/arch/sgimips/dev/crmfb.c:1.46 --- src/sys/arch/sgimips/dev/crmfb.c:1.45 Sat Mar 17 13:14:27 2018 +++ src/sys/arch/sgimips/dev/crmfb.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: crmfb.c,v 1.45 2018/03/17 13:14:27 jmcneill Exp $ */ +/* $NetBSD: crmfb.c,v 1.46 2019/12/22 23:23:31 thorpej Exp $ */ /*- * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca> @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: crmfb.c,v 1.45 2018/03/17 13:14:27 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: crmfb.c,v 1.46 2019/12/22 23:23:31 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -204,8 +204,6 @@ static void crmfb_putchar(void *, int, i static void crmfb_putchar_aa(void *, int, int, u_int, long); /* I2C glue */ -static int crmfb_i2c_acquire_bus(void *, int); -static void crmfb_i2c_release_bus(void *, int); static int crmfb_i2c_send_start(void *, int); static int crmfb_i2c_send_stop(void *, int); static int crmfb_i2c_initiate_xfer(void *, i2c_addr_t, int); @@ -1617,15 +1615,13 @@ crmfb_setup_ddc(struct crmfb_softc *sc) int i; memset(sc->sc_edid_data, 0, 128); + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = crmfb_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = crmfb_i2c_release_bus; sc->sc_i2c.ic_send_start = crmfb_i2c_send_start; sc->sc_i2c.ic_send_stop = crmfb_i2c_send_stop; sc->sc_i2c.ic_initiate_xfer = crmfb_i2c_initiate_xfer; sc->sc_i2c.ic_read_byte = crmfb_i2c_read_byte; sc->sc_i2c.ic_write_byte = crmfb_i2c_write_byte; - sc->sc_i2c.ic_exec = NULL; i = 0; while (sc->sc_edid_data[1] == 0 && i++ < 10) ddc_read_edid(&sc->sc_i2c, sc->sc_edid_data, 128); @@ -1662,22 +1658,6 @@ crmfb_i2cbb_read(void *cookie) return bus_space_read_4(sc->sc_iot, sc->sc_ioh, CRMFB_I2C_VGA) ^ 3; } -/* higher level I2C stuff */ -static int -crmfb_i2c_acquire_bus(void *cookie, int flags) -{ - - /* private bus */ - return 0; -} - -static void -crmfb_i2c_release_bus(void *cookie, int flags) -{ - - /* private bus */ -} - static int crmfb_i2c_send_start(void *cookie, int flags) { Index: src/sys/arch/sparc64/dev/ffb.c diff -u src/sys/arch/sparc64/dev/ffb.c:1.63 src/sys/arch/sparc64/dev/ffb.c:1.64 --- src/sys/arch/sparc64/dev/ffb.c:1.63 Mon Sep 3 16:29:27 2018 +++ src/sys/arch/sparc64/dev/ffb.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ffb.c,v 1.63 2018/09/03 16:29:27 riastradh Exp $ */ +/* $NetBSD: ffb.c,v 1.64 2019/12/22 23:23:31 thorpej Exp $ */ /* $OpenBSD: creator.c,v 1.20 2002/07/30 19:48:15 jason Exp $ */ /* @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ffb.c,v 1.63 2018/09/03 16:29:27 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffb.c,v 1.64 2019/12/22 23:23:31 thorpej Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -157,8 +157,6 @@ struct wsdisplay_accessops ffb_accessops }; /* I2C glue */ -static int ffb_i2c_acquire_bus(void *, int); -static void ffb_i2c_release_bus(void *, int); static int ffb_i2c_send_start(void *, int); static int ffb_i2c_send_stop(void *, int); static int ffb_i2c_initiate_xfer(void *, i2c_addr_t, int); @@ -387,15 +385,13 @@ ffb_attach_i2c(struct ffb_softc *sc) { /* Fill in the i2c tag */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = ffb_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = ffb_i2c_release_bus; sc->sc_i2c.ic_send_start = ffb_i2c_send_start; sc->sc_i2c.ic_send_stop = ffb_i2c_send_stop; sc->sc_i2c.ic_initiate_xfer = ffb_i2c_initiate_xfer; sc->sc_i2c.ic_read_byte = ffb_i2c_read_byte; sc->sc_i2c.ic_write_byte = ffb_i2c_write_byte; - sc->sc_i2c.ic_exec = NULL; } int @@ -1314,19 +1310,6 @@ static uint32_t ffb_i2cbb_read(void *coo /* higher level I2C stuff */ static int -ffb_i2c_acquire_bus(void *cookie, int flags) -{ - /* private bus */ - return (0); -} - -static void -ffb_i2c_release_bus(void *cookie, int flags) -{ - /* private bus */ -} - -static int ffb_i2c_send_start(void *cookie, int flags) { return (i2c_bitbang_send_start(cookie, flags, &ffb_i2cbb_ops)); Index: src/sys/arch/sparc64/dev/jbus-i2c.c diff -u src/sys/arch/sparc64/dev/jbus-i2c.c:1.3 src/sys/arch/sparc64/dev/jbus-i2c.c:1.4 --- src/sys/arch/sparc64/dev/jbus-i2c.c:1.3 Sat Nov 3 14:56:36 2018 +++ src/sys/arch/sparc64/dev/jbus-i2c.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: jbus-i2c.c,v 1.3 2018/11/03 14:56:36 martin Exp $ */ +/* $NetBSD: jbus-i2c.c,v 1.4 2019/12/22 23:23:31 thorpej Exp $ */ /* * Copyright (c) 2018 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: jbus-i2c.c,v 1.3 2018/11/03 14:56:36 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: jbus-i2c.c,v 1.4 2019/12/22 23:23:31 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -48,8 +48,6 @@ __KERNEL_RCSID(0, "$NetBSD: jbus-i2c.c,v #endif /* I2C glue */ -static int jbusi2c_i2c_acquire_bus(void *, int); -static void jbusi2c_i2c_release_bus(void *, int); static int jbusi2c_i2c_send_start(void *, int); static int jbusi2c_i2c_send_stop(void *, int); static int jbusi2c_i2c_initiate_xfer(void *, i2c_addr_t, int); @@ -79,7 +77,6 @@ static void jbusi2c_attach(device_t, dev struct jbusi2c_softc { device_t sc_dev; struct i2c_controller sc_i2c; - kmutex_t sc_i2c_lock; bus_space_tag_t sc_bustag; bus_space_handle_t sc_regh; int sc_node; @@ -144,15 +141,13 @@ jbusi2c_setup_i2c(struct jbusi2c_softc * int devs, regs[2], addr; char name[64], compat[256]; + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = jbusi2c_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = jbusi2c_i2c_release_bus; sc->sc_i2c.ic_send_start = jbusi2c_i2c_send_start; sc->sc_i2c.ic_send_stop = jbusi2c_i2c_send_stop; sc->sc_i2c.ic_initiate_xfer = jbusi2c_i2c_initiate_xfer; sc->sc_i2c.ic_read_byte = jbusi2c_i2c_read_byte; sc->sc_i2c.ic_write_byte = jbusi2c_i2c_write_byte; - sc->sc_i2c.ic_exec = NULL; /* round up i2c devices */ devs = OF_child(sc->sc_node); @@ -185,7 +180,6 @@ jbusi2c_setup_i2c(struct jbusi2c_softc * } memset(&iba, 0, sizeof(iba)); iba.iba_tag = &sc->sc_i2c; - mutex_init(&sc->sc_i2c_lock, MUTEX_DEFAULT, IPL_NONE); config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print); } @@ -229,23 +223,6 @@ jbusi2c_i2cbb_read(void *cookie) /* higher level I2C stuff */ static int -jbusi2c_i2c_acquire_bus(void *cookie, int flags) -{ - struct jbusi2c_softc *sc = cookie; - - mutex_enter(&sc->sc_i2c_lock); - return 0; -} - -static void -jbusi2c_i2c_release_bus(void *cookie, int flags) -{ - struct jbusi2c_softc *sc = cookie; - - mutex_exit(&sc->sc_i2c_lock); -} - -static int jbusi2c_i2c_send_start(void *cookie, int flags) { Index: src/sys/arch/x86/pci/imcsmb/imcsmb.c diff -u src/sys/arch/x86/pci/imcsmb/imcsmb.c:1.2 src/sys/arch/x86/pci/imcsmb/imcsmb.c:1.3 --- src/sys/arch/x86/pci/imcsmb/imcsmb.c:1.2 Sat Mar 3 05:27:02 2018 +++ src/sys/arch/x86/pci/imcsmb/imcsmb.c Sun Dec 22 23:23:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imcsmb.c,v 1.2 2018/03/03 05:27:02 pgoyette Exp $ */ +/* $NetBSD: imcsmb.c,v 1.3 2019/12/22 23:23:31 thorpej Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imcsmb.c,v 1.2 2018/03/03 05:27:02 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imcsmb.c,v 1.3 2019/12/22 23:23:31 thorpej Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -130,7 +130,6 @@ imcsmb_attach(device_t parent, device_t sc->sc_regs = imca->ia_regs; sc->sc_pci_tag = imca->ia_pci_tag; sc->sc_pci_chipset_tag = imca->ia_pci_chipset_tag; - mutex_init(&sc->sc_i2c_mutex, MUTEX_DEFAULT, IPL_NONE); if (!pmf_device_register(self, NULL, NULL)) aprint_error_dev(self, "couldn't establish power handler\n"); @@ -151,13 +150,13 @@ imcsmb_rescan(device_t self, const char if (sc->sc_smbus != NULL) return 0; + iic_tag_init(&sc->sc_i2c_tag); sc->sc_i2c_tag.ic_cookie = sc; sc->sc_i2c_tag.ic_acquire_bus = imcsmb_acquire_bus; sc->sc_i2c_tag.ic_release_bus = imcsmb_release_bus; sc->sc_i2c_tag.ic_exec = imcsmb_exec; memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &sc->sc_i2c_tag; sc->sc_smbus = config_found_ia(self, ifattr, &iba, iicbus_print); @@ -196,7 +195,7 @@ imcsmb_detach(device_t self, int flags) } pmf_device_deregister(self); - mutex_destroy(&sc->sc_i2c_mutex); + iic_tag_fini(&sc->sc_i2c_tag); return 0; } @@ -224,8 +223,6 @@ imcsmb_acquire_bus(void *cookie, int fla if (cold) return 0; - mutex_enter(&sc->sc_i2c_mutex); - imc_callback(sc, IMC_BIOS_DISABLE); return 0; @@ -240,8 +237,6 @@ imcsmb_release_bus(void *cookie, int fla return; imc_callback(sc, IMC_BIOS_ENABLE); - - mutex_exit(&sc->sc_i2c_mutex); } static int Index: src/sys/arch/zaurus/dev/ziic.c diff -u src/sys/arch/zaurus/dev/ziic.c:1.3 src/sys/arch/zaurus/dev/ziic.c:1.4 --- src/sys/arch/zaurus/dev/ziic.c:1.3 Sun Feb 14 19:54:21 2016 +++ src/sys/arch/zaurus/dev/ziic.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ziic.c,v 1.3 2016/02/14 19:54:21 chs Exp $ */ +/* $NetBSD: ziic.c,v 1.4 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ziic.c,v 1.3 2016/02/14 19:54:21 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ziic.c,v 1.4 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -55,7 +55,6 @@ struct pxaiic_softc { void * sc_ih; struct i2c_controller sc_i2c; - kmutex_t sc_buslock; }; static int pxaiic_match(device_t, cfdata_t, void *); @@ -106,9 +105,9 @@ pxaiic_attach(device_t parent, device_t return; } - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_TTY); - #if 0 + mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_TTY); + sc->sc_ih = pxa2x0_intr_establish(PXA2X0_INT_I2C, IPL_TTY, pxa2x0_i2c_intr, &psc); if (sc->sc_ih == NULL) { @@ -118,6 +117,7 @@ pxaiic_attach(device_t parent, device_t #endif /* Initialize i2c_controller */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; sc->sc_i2c.ic_acquire_bus = pxaiic_acquire_bus; sc->sc_i2c.ic_release_bus = pxaiic_release_bus; @@ -126,7 +126,6 @@ pxaiic_attach(device_t parent, device_t sc->sc_i2c.ic_initiate_xfer = pxaiic_initiate_xfer; sc->sc_i2c.ic_read_byte = pxaiic_read_byte; sc->sc_i2c.ic_write_byte = pxaiic_write_byte; - sc->sc_i2c.ic_exec = NULL; memset(&iba, 0, sizeof(iba)); iba.iba_tag = &sc->sc_i2c; @@ -139,7 +138,6 @@ pxaiic_acquire_bus(void *cookie, int fla struct pxaiic_softc *sc = cookie; struct pxa2x0_i2c_softc *psc = &sc->sc_pxa_i2c; - mutex_enter(&sc->sc_buslock); pxa2x0_i2c_open(psc); return 0; @@ -152,7 +150,6 @@ pxaiic_release_bus(void *cookie, int fla struct pxa2x0_i2c_softc *psc = &sc->sc_pxa_i2c; pxa2x0_i2c_close(psc); - mutex_exit(&sc->sc_buslock); } static int Index: src/sys/dev/acpi/smbus_acpi.c diff -u src/sys/dev/acpi/smbus_acpi.c:1.13 src/sys/dev/acpi/smbus_acpi.c:1.14 --- src/sys/dev/acpi/smbus_acpi.c:1.13 Thu Jul 29 11:03:09 2010 +++ src/sys/dev/acpi/smbus_acpi.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: smbus_acpi.c,v 1.13 2010/07/29 11:03:09 jruoho Exp $ */ +/* $NetBSD: smbus_acpi.c,v 1.14 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2009 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: smbus_acpi.c,v 1.13 2010/07/29 11:03:09 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: smbus_acpi.c,v 1.14 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -73,7 +73,6 @@ struct acpi_smbus_softc { struct callout sc_callout; struct i2c_controller sc_i2c_tag; device_t sc_dv; - kmutex_t sc_i2c_mutex; int sc_poll_alert; }; @@ -81,8 +80,6 @@ static int acpi_smbus_match(device_t, cf static void acpi_smbus_attach(device_t, device_t, void *); static int acpi_smbus_detach(device_t, int); static int acpi_smbus_poll_alert(ACPI_HANDLE, int *); -static int acpi_smbus_acquire_bus(void *, int); -static void acpi_smbus_release_bus(void *, int); static int acpi_smbus_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); static void acpi_smbus_alerts(struct acpi_smbus_softc *); @@ -151,11 +148,8 @@ acpi_smbus_attach(device_t parent, devic sc->sc_poll_alert = 2; /* Attach I2C bus. */ - mutex_init(&sc->sc_i2c_mutex, MUTEX_DEFAULT, IPL_NONE); - + iic_tag_init(&sc->sc_i2c_tag); sc->sc_i2c_tag.ic_cookie = sc; - sc->sc_i2c_tag.ic_acquire_bus = acpi_smbus_acquire_bus; - sc->sc_i2c_tag.ic_release_bus = acpi_smbus_release_bus; sc->sc_i2c_tag.ic_exec = acpi_smbus_exec; (void)acpi_smbus_poll_alert(aa->aa_node->ad_handle,&sc->sc_poll_alert); @@ -194,7 +188,7 @@ acpi_smbus_detach(device_t self, int fla callout_halt(&sc->sc_callout, NULL); callout_destroy(&sc->sc_callout); - mutex_destroy(&sc->sc_i2c_mutex); + iic_tag_fini(&sc->sc_i2c_tag); return 0; } @@ -260,23 +254,6 @@ out: } static int -acpi_smbus_acquire_bus(void *cookie, int flags) -{ - struct acpi_smbus_softc *sc = cookie; - - mutex_enter(&sc->sc_i2c_mutex); - - return 0; -} - -static void -acpi_smbus_release_bus(void *cookie, int flags) -{ - struct acpi_smbus_softc *sc = cookie; - - mutex_exit(&sc->sc_i2c_mutex); -} -static int acpi_smbus_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { Index: src/sys/dev/gpio/gpioiic.c diff -u src/sys/dev/gpio/gpioiic.c:1.8 src/sys/dev/gpio/gpioiic.c:1.9 --- src/sys/dev/gpio/gpioiic.c:1.8 Sat Oct 28 04:53:56 2017 +++ src/sys/dev/gpio/gpioiic.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gpioiic.c,v 1.8 2017/10/28 04:53:56 riastradh Exp $ */ +/* $NetBSD: gpioiic.c,v 1.9 2019/12/22 23:23:32 thorpej Exp $ */ /* $OpenBSD: gpioiic.c,v 1.8 2008/11/24 12:12:12 mbalmer Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gpioiic.c,v 1.8 2017/10/28 04:53:56 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gpioiic.c,v 1.9 2019/12/22 23:23:32 thorpej Exp $"); /* * I2C bus bit-banging through GPIO pins. @@ -54,7 +54,6 @@ struct gpioiic_softc { struct i2c_controller sc_i2c_tag; device_t sc_i2c_dev; - krwlock_t sc_i2c_lock; int sc_pin_sda; int sc_pin_scl; @@ -67,8 +66,6 @@ int gpioiic_match(device_t, cfdata_t, v void gpioiic_attach(device_t, device_t, void *); int gpioiic_detach(device_t, int); -int gpioiic_i2c_acquire_bus(void *, int); -void gpioiic_i2c_release_bus(void *, int); int gpioiic_i2c_send_start(void *, int); int gpioiic_i2c_send_stop(void *, int); int gpioiic_i2c_initiate_xfer(void *, i2c_addr_t, int); @@ -185,19 +182,15 @@ gpioiic_attach(device_t parent, device_t aprint_normal("\n"); /* Attach I2C bus */ - rw_init(&sc->sc_i2c_lock); + iic_tag_init(&sc->sc_i2c_tag); sc->sc_i2c_tag.ic_cookie = sc; - sc->sc_i2c_tag.ic_acquire_bus = gpioiic_i2c_acquire_bus; - sc->sc_i2c_tag.ic_release_bus = gpioiic_i2c_release_bus; sc->sc_i2c_tag.ic_send_start = gpioiic_i2c_send_start; sc->sc_i2c_tag.ic_send_stop = gpioiic_i2c_send_stop; sc->sc_i2c_tag.ic_initiate_xfer = gpioiic_i2c_initiate_xfer; sc->sc_i2c_tag.ic_read_byte = gpioiic_i2c_read_byte; sc->sc_i2c_tag.ic_write_byte = gpioiic_i2c_write_byte; - sc->sc_i2c_tag.ic_exec = NULL; memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &sc->sc_i2c_tag; sc->sc_i2c_dev = config_found(self, &iba, iicbus_print); @@ -220,6 +213,7 @@ gpioiic_detach(device_t self, int flags) rv = config_detach(sc->sc_i2c_dev, flags); if (!rv) { + iic_tag_fini(&sc->sc_i2c_tag); gpio_pin_unmap(sc->sc_gpio, &sc->sc_map); pmf_device_deregister(self); } @@ -227,29 +221,6 @@ gpioiic_detach(device_t self, int flags) } int -gpioiic_i2c_acquire_bus(void *cookie, int flags) -{ - struct gpioiic_softc *sc = cookie; - - if (flags & I2C_F_POLL) - return 1; - - rw_enter(&sc->sc_i2c_lock, RW_WRITER); - return 0; -} - -void -gpioiic_i2c_release_bus(void *cookie, int flags) -{ - struct gpioiic_softc *sc = cookie; - - if (flags & I2C_F_POLL) - return; - - rw_exit(&sc->sc_i2c_lock); -} - -int gpioiic_i2c_send_start(void *cookie, int flags) { return i2c_bitbang_send_start(cookie, flags, &gpioiic_bbops); Index: src/sys/dev/i2c/gttwsi_core.c diff -u src/sys/dev/i2c/gttwsi_core.c:1.8 src/sys/dev/i2c/gttwsi_core.c:1.9 --- src/sys/dev/i2c/gttwsi_core.c:1.8 Mon Oct 1 09:39:20 2018 +++ src/sys/dev/i2c/gttwsi_core.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gttwsi_core.c,v 1.8 2018/10/01 09:39:20 bouyer Exp $ */ +/* $NetBSD: gttwsi_core.c,v 1.9 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2008 Eiji Kawauchi. * All rights reserved. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gttwsi_core.c,v 1.8 2018/10/01 09:39:20 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gttwsi_core.c,v 1.9 2019/12/22 23:23:32 thorpej Exp $"); #include "locators.h" #include <sys/param.h> @@ -83,8 +83,6 @@ __KERNEL_RCSID(0, "$NetBSD: gttwsi_core. #include <dev/i2c/gttwsireg.h> #include <dev/i2c/gttwsivar.h> -static int gttwsi_acquire_bus(void *, int); -static void gttwsi_release_bus(void *, int); static int gttwsi_send_start(void *v, int flags); static int gttwsi_send_stop(void *v, int flags); static int gttwsi_initiate_xfer(void *v, i2c_addr_t addr, int flags); @@ -149,17 +147,14 @@ gttwsi_attach_subr(device_t self, bus_sp if (sc->sc_reg_write == NULL) sc->sc_reg_write = gttwsi_default_write_4; - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_VM); mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_BIO); cv_init(&sc->sc_cv, device_xname(self)); prop_dictionary_get_bool(cfg, "iflg-rwc", &sc->sc_iflg_rwc); sc->sc_started = false; + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = gttwsi_acquire_bus; - sc->sc_i2c.ic_release_bus = gttwsi_release_bus; - sc->sc_i2c.ic_exec = NULL; sc->sc_i2c.ic_send_start = gttwsi_send_start; sc->sc_i2c.ic_send_stop = gttwsi_send_stop; sc->sc_i2c.ic_initiate_xfer = gttwsi_initiate_xfer; @@ -204,33 +199,6 @@ gttwsi_intr(void *arg) return 0; } -/* ARGSUSED */ -static int -gttwsi_acquire_bus(void *arg, int flags) -{ - struct gttwsi_softc *sc = arg; - - mutex_enter(&sc->sc_buslock); - while (sc->sc_inuse) - cv_wait(&sc->sc_cv, &sc->sc_buslock); - sc->sc_inuse = true; - mutex_exit(&sc->sc_buslock); - - return 0; -} - -/* ARGSUSED */ -static void -gttwsi_release_bus(void *arg, int flags) -{ - struct gttwsi_softc *sc = arg; - - mutex_enter(&sc->sc_buslock); - sc->sc_inuse = false; - cv_broadcast(&sc->sc_cv); - mutex_exit(&sc->sc_buslock); -} - static int gttwsi_send_start(void *v, int flags) { Index: src/sys/dev/i2c/i2c.c diff -u src/sys/dev/i2c/i2c.c:1.70 src/sys/dev/i2c/i2c.c:1.71 --- src/sys/dev/i2c/i2c.c:1.70 Thu Dec 5 06:28:09 2019 +++ src/sys/dev/i2c/i2c.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i2c.c,v 1.70 2019/12/05 06:28:09 mlelstv Exp $ */ +/* $NetBSD: i2c.c,v 1.71 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -40,7 +40,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.70 2019/12/05 06:28:09 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.71 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -69,7 +69,6 @@ __KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.70 struct iic_softc { device_t sc_dev; i2c_tag_t sc_tag; - int sc_type; device_t sc_devices[I2C_MAX_ADDR + 1]; }; @@ -285,7 +284,6 @@ iic_search(device_t parent, cfdata_t cf, } ia.ia_tag = sc->sc_tag; - ia.ia_type = sc->sc_type; ia.ia_name = NULL; ia.ia_ncompat = 0; @@ -409,7 +407,6 @@ iic_attach(device_t parent, device_t sel sc->sc_dev = self; sc->sc_tag = iba->iba_tag; - sc->sc_type = iba->iba_type; ic = sc->sc_tag; ic->ic_devname = device_xname(self); @@ -464,7 +461,6 @@ iic_attach(device_t parent, device_t sel memset(&ia, 0, sizeof ia); ia.ia_addr = addr; - ia.ia_type = sc->sc_type; ia.ia_tag = ic; ia.ia_name = name; ia.ia_cookie = cookie; Index: src/sys/dev/i2c/i2c_exec.c diff -u src/sys/dev/i2c/i2c_exec.c:1.12 src/sys/dev/i2c/i2c_exec.c:1.13 --- src/sys/dev/i2c/i2c_exec.c:1.12 Thu Jul 25 04:20:13 2019 +++ src/sys/dev/i2c/i2c_exec.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i2c_exec.c,v 1.12 2019/07/25 04:20:13 thorpej Exp $ */ +/* $NetBSD: i2c_exec.c,v 1.13 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -36,10 +36,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i2c_exec.c,v 1.12 2019/07/25 04:20:13 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i2c_exec.c,v 1.13 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> +#include <sys/cpu.h> #include <sys/device.h> #include <sys/module.h> #include <sys/event.h> @@ -62,6 +63,33 @@ iic_op_flags(int flags) } /* + * iic_tag_init: + * + * Perform some basic initialization of the i2c controller tag. + */ +void +iic_tag_init(i2c_tag_t tag) +{ + + memset(tag, 0, sizeof(*tag)); + mutex_init(&tag->ic_bus_lock, MUTEX_DEFAULT, IPL_NONE); + LIST_INIT(&tag->ic_list); + LIST_INIT(&tag->ic_proc_list); +} + +/* + * iic_tag_fini: + * + * Teardown of the i2c controller tag. + */ +void +iic_tag_fini(i2c_tag_t tag) +{ + + mutex_destroy(&tag->ic_bus_lock); +} + +/* * iic_acquire_bus: * * Acquire the I2C bus for use by a client. @@ -70,9 +98,48 @@ int iic_acquire_bus(i2c_tag_t tag, int flags) { + KASSERT(!cpu_intr_p()); + flags = iic_op_flags(flags); - return (*tag->ic_acquire_bus)(tag->ic_cookie, flags); + if (flags & I2C_F_POLL) { + /* + * Polling should only be used in rare and/or + * extreme circumstances; most i2c clients + * should be allowed to sleep. + * + * Really, the ONLY user of I2C_F_POLL should be + * "when cold", i.e. during early autoconfiguration + * when there is only proc0, and we might have to + * read SEEPROMs, etc. There should be no other + * users interfering with our access of the i2c bus + * in that case. + */ + if (mutex_tryenter(&tag->ic_bus_lock) == 0) { + return EBUSY; + } + } else { + /* + * N.B. We implement this as a mutex that we hold across + * across a series of requests beause we'd like to get the + * priority boost if a higher-priority process wants the + * i2c bus while we're asleep waiting for the controller + * to perform the I/O. + * + * XXXJRT Disable preemption here? We'd like to keep + * the CPU while holding this resource, unless we release + * it voluntarily (which should only happen while waiting + * for a controller to complete I/O). + */ + mutex_enter(&tag->ic_bus_lock); + } + + int error = 0; + if (tag->ic_acquire_bus) { + error = (*tag->ic_acquire_bus)(tag->ic_cookie, flags); + } + + return error; } /* @@ -84,9 +151,15 @@ void iic_release_bus(i2c_tag_t tag, int flags) { + KASSERT(!cpu_intr_p()); + flags = iic_op_flags(flags); - (*tag->ic_release_bus)(tag->ic_cookie, flags); + if (tag->ic_release_bus) { + (*tag->ic_release_bus)(tag->ic_cookie, flags); + } + + mutex_exit(&tag->ic_bus_lock); } /* @@ -108,6 +181,8 @@ iic_exec(i2c_tag_t tag, i2c_op_t op, i2c int error; size_t len; + KASSERT(!cpu_intr_p()); + flags = iic_op_flags(flags); if ((flags & I2C_F_PEC) && cmdlen > 0 && tag->ic_exec != NULL) { Index: src/sys/dev/i2c/i2cvar.h diff -u src/sys/dev/i2c/i2cvar.h:1.18 src/sys/dev/i2c/i2cvar.h:1.19 --- src/sys/dev/i2c/i2cvar.h:1.18 Mon Dec 10 00:31:45 2018 +++ src/sys/dev/i2c/i2cvar.h Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: i2cvar.h,v 1.18 2018/12/10 00:31:45 thorpej Exp $ */ +/* $NetBSD: i2cvar.h,v 1.19 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -39,6 +39,7 @@ #define _DEV_I2C_I2CVAR_H_ #include <sys/device.h> +#include <sys/mutex.h> #include <dev/i2c/i2c_io.h> #include <prop/proplib.h> @@ -90,10 +91,12 @@ typedef struct i2c_controller { * the driver is finished, it should release the * bus. * - * This is provided by the back-end since a single - * controller may present e.g. i2c and smbus views - * of the same set of i2c wires. + * The main synchronization logic is handled by the + * generic i2c layer, but optional hooks to back-end + * drivers are provided in case additional processing + * is needed (e.g. enabling the i2c controller). */ + kmutex_t ic_bus_lock; int (*ic_acquire_bus)(void *, int); void (*ic_release_bus)(void *, int); @@ -119,13 +122,9 @@ typedef struct i2c_controller { const char *ic_devname; } *i2c_tag_t; -/* I2C bus types */ -#define I2C_TYPE_SMBUS 1 - /* Used to attach the i2c framework to the controller. */ struct i2cbus_attach_args { i2c_tag_t iba_tag; /* the controller */ - int iba_type; /* bus type */ prop_array_t iba_child_devices; /* child devices (direct config) */ }; @@ -159,6 +158,8 @@ struct i2c_attach_args { * API presented to i2c controllers. */ int iicbus_print(void *, const char *); +void iic_tag_init(i2c_tag_t); +void iic_tag_fini(i2c_tag_t); /* * API presented to i2c devices. Index: src/sys/dev/i2c/motoi2c.c diff -u src/sys/dev/i2c/motoi2c.c:1.6 src/sys/dev/i2c/motoi2c.c:1.7 --- src/sys/dev/i2c/motoi2c.c:1.6 Fri Nov 29 12:42:53 2019 +++ src/sys/dev/i2c/motoi2c.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: motoi2c.c,v 1.6 2019/11/29 12:42:53 hkenken Exp $ */ +/* $NetBSD: motoi2c.c,v 1.7 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2007, 2010 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: motoi2c.c,v 1.6 2019/11/29 12:42:53 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: motoi2c.c,v 1.7 2019/12/22 23:23:32 thorpej Exp $"); #if defined(__arm__) || defined(__aarch64__) #include "opt_fdt.h" @@ -78,12 +78,6 @@ static int motoi2c_exec(void *, i2c_op_ void *, size_t, int); static int motoi2c_busy_wait(struct motoi2c_softc *, uint8_t); -static const struct i2c_controller motoi2c = { - .ic_acquire_bus = motoi2c_acquire_bus, - .ic_release_bus = motoi2c_release_bus, - .ic_exec = motoi2c_exec, -}; - static const struct motoi2c_settings motoi2c_default_settings = { .i2c_adr = MOTOI2C_ADR_DEFAULT, .i2c_fdr = MOTOI2C_FDR_DEFAULT, @@ -113,13 +107,14 @@ motoi2c_attach_common(device_t self, str { struct i2cbus_attach_args iba; - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); - if (i2c == NULL) i2c = &motoi2c_default_settings; - sc->sc_i2c = motoi2c; + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; + sc->sc_i2c.ic_acquire_bus = motoi2c_acquire_bus; + sc->sc_i2c.ic_release_bus = motoi2c_release_bus; + sc->sc_i2c.ic_exec = motoi2c_exec; if (sc->sc_iord == NULL) sc->sc_iord = motoi2c_iord1; if (sc->sc_iowr == NULL) @@ -148,7 +143,6 @@ motoi2c_acquire_bus(void *v, int flags) { struct motoi2c_softc * const sc = v; - mutex_enter(&sc->sc_buslock); I2C_WRITE(I2CCR, CR_MEN); /* enable the I2C module */ return 0; @@ -160,7 +154,6 @@ motoi2c_release_bus(void *v, int flags) struct motoi2c_softc * const sc = v; I2C_WRITE(I2CCR, 0); /* reset before changing anything */ - mutex_exit(&sc->sc_buslock); } static int Index: src/sys/dev/i2c/motoi2cvar.h diff -u src/sys/dev/i2c/motoi2cvar.h:1.5 src/sys/dev/i2c/motoi2cvar.h:1.6 --- src/sys/dev/i2c/motoi2cvar.h:1.5 Mon Aug 5 12:21:00 2019 +++ src/sys/dev/i2c/motoi2cvar.h Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: motoi2cvar.h,v 1.5 2019/08/05 12:21:00 hkenken Exp $ */ +/* $NetBSD: motoi2cvar.h,v 1.6 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2007, 2010 The NetBSD Foundation, Inc. @@ -48,7 +48,6 @@ struct motoi2c_softc { bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; struct i2c_controller sc_i2c; - kmutex_t sc_buslock; motoi2c_iord_t sc_iord; motoi2c_iowr_t sc_iowr; int sc_phandle; Index: src/sys/dev/ic/dw_hdmi.c diff -u src/sys/dev/ic/dw_hdmi.c:1.6 src/sys/dev/ic/dw_hdmi.c:1.7 --- src/sys/dev/ic/dw_hdmi.c:1.6 Sat Nov 23 20:27:39 2019 +++ src/sys/dev/ic/dw_hdmi.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: dw_hdmi.c,v 1.6 2019/11/23 20:27:39 jmcneill Exp $ */ +/* $NetBSD: dw_hdmi.c,v 1.7 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dw_hdmi.c,v 1.6 2019/11/23 20:27:39 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dw_hdmi.c,v 1.7 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -253,24 +253,6 @@ enum dwhdmi_dai_mixer_ctrl { }; static int -dwhdmi_ddc_acquire_bus(void *priv, int flags) -{ - struct dwhdmi_softc * const sc = priv; - - mutex_enter(&sc->sc_ic_lock); - - return 0; -} - -static void -dwhdmi_ddc_release_bus(void *priv, int flags) -{ - struct dwhdmi_softc * const sc = priv; - - mutex_exit(&sc->sc_ic_lock); -} - -static int dwhdmi_ddc_exec(void *priv, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { @@ -279,8 +261,6 @@ dwhdmi_ddc_exec(void *priv, i2c_op_t op, uint8_t *pbuf = buf; int off, n, retry; - KASSERT(mutex_owned(&sc->sc_ic_lock)); - if (addr != DDC_ADDR || op != I2C_OP_READ_WITH_STOP || cmdlen == 0 || buf == NULL) { printf("dwhdmi_ddc_exec: bad args addr=%#x op=%#x cmdlen=%d buf=%p\n", addr, op, (int)cmdlen, buf); @@ -883,8 +863,6 @@ dwhdmi_attach(struct dwhdmi_softc *sc) return EINVAL; } - mutex_init(&sc->sc_ic_lock, MUTEX_DEFAULT, IPL_NONE); - sc->sc_version = dwhdmi_read(sc, HDMI_DESIGN_ID); sc->sc_version <<= 8; sc->sc_version |= dwhdmi_read(sc, HDMI_REVISION_ID); @@ -903,9 +881,8 @@ dwhdmi_attach(struct dwhdmi_softc *sc) */ if (sc->sc_ic == NULL) { struct i2c_controller *ic = &sc->sc_ic_builtin; + iic_tag_init(ic); ic->ic_cookie = sc; - ic->ic_acquire_bus = dwhdmi_ddc_acquire_bus; - ic->ic_release_bus = dwhdmi_ddc_release_bus; ic->ic_exec = dwhdmi_ddc_exec; sc->sc_ic = ic; } Index: src/sys/dev/ic/dw_hdmi.h diff -u src/sys/dev/ic/dw_hdmi.h:1.5 src/sys/dev/ic/dw_hdmi.h:1.6 --- src/sys/dev/ic/dw_hdmi.h:1.5 Sat Nov 23 12:28:44 2019 +++ src/sys/dev/ic/dw_hdmi.h Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: dw_hdmi.h,v 1.5 2019/11/23 12:28:44 jmcneill Exp $ */ +/* $NetBSD: dw_hdmi.h,v 1.6 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca> @@ -74,7 +74,6 @@ struct dwhdmi_softc { u_int sc_version; i2c_tag_t sc_ic; - kmutex_t sc_ic_lock; struct i2c_controller sc_ic_builtin; struct audio_dai_device sc_dai; Index: src/sys/dev/ic/dwiic.c diff -u src/sys/dev/ic/dwiic.c:1.5 src/sys/dev/ic/dwiic.c:1.6 --- src/sys/dev/ic/dwiic.c:1.5 Wed Sep 26 19:06:33 2018 +++ src/sys/dev/ic/dwiic.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: dwiic.c,v 1.5 2018/09/26 19:06:33 jakllsch Exp $ */ +/* $NetBSD: dwiic.c,v 1.6 2019/12/22 23:23:32 thorpej Exp $ */ /* $OpenBSD: dwiic.c,v 1.4 2018/05/23 22:08:00 kettenis Exp $ */ @@ -49,7 +49,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dwiic.c,v 1.5 2018/09/26 19:06:33 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dwiic.c,v 1.6 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -145,8 +145,6 @@ __KERNEL_RCSID(0, "$NetBSD: dwiic.c,v 1. static int dwiic_init(struct dwiic_softc *); static void dwiic_enable(struct dwiic_softc *, bool); -static int dwiic_i2c_acquire_bus(void *, int); -static void dwiic_i2c_release_bus(void *, int); static uint32_t dwiic_read(struct dwiic_softc *, int); static void dwiic_write(struct dwiic_softc *, int, uint32_t); static int dwiic_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, @@ -184,16 +182,14 @@ dwiic_attach(struct dwiic_softc *sc) dwiic_enable(sc, 0); dwiic_read(sc, DW_IC_CLR_INTR); - mutex_init(&sc->sc_i2c_lock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&sc->sc_int_lock, MUTEX_DEFAULT, IPL_VM); cv_init(&sc->sc_int_readwait, "dwiicr"); cv_init(&sc->sc_int_writewait, "dwiicw"); cv_init(&sc->sc_int_stopwait, "dwiics"); /* setup and attach iic bus */ + iic_tag_init(&sc->sc_i2c_tag); sc->sc_i2c_tag.ic_cookie = sc; - sc->sc_i2c_tag.ic_acquire_bus = dwiic_i2c_acquire_bus; - sc->sc_i2c_tag.ic_release_bus = dwiic_i2c_release_bus; sc->sc_i2c_tag.ic_exec = dwiic_i2c_exec; sc->sc_iba.iba_tag = &sc->sc_i2c_tag; @@ -270,29 +266,6 @@ dwiic_write(struct dwiic_softc *sc, int } static int -dwiic_i2c_acquire_bus(void *cookie, int flags) -{ - struct dwiic_softc *sc = cookie; - - if (cold || sc->sc_poll || (flags & I2C_F_POLL)) - return (0); - - mutex_enter(&sc->sc_i2c_lock); - return 0; -} - -void -dwiic_i2c_release_bus(void *cookie, int flags) -{ - struct dwiic_softc *sc = cookie; - - if (cold || sc->sc_poll || (flags & I2C_F_POLL)) - return; - - mutex_exit(&sc->sc_i2c_lock); -} - -static int dwiic_init(struct dwiic_softc *sc) { uint32_t reg; Index: src/sys/dev/ic/pcf8584var.h diff -u src/sys/dev/ic/pcf8584var.h:1.5 src/sys/dev/ic/pcf8584var.h:1.6 --- src/sys/dev/ic/pcf8584var.h:1.5 Sun Jan 3 17:32:17 2016 +++ src/sys/dev/ic/pcf8584var.h Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pcf8584var.h,v 1.5 2016/01/03 17:32:17 jdc Exp $ */ +/* $NetBSD: pcf8584var.h,v 1.6 2019/12/22 23:23:32 thorpej Exp $ */ /* $OpenBSD: pcf8584var.h,v 1.5 2007/10/20 18:46:21 kettenis Exp $ */ /* @@ -31,7 +31,6 @@ struct pcfiic_softc { int sc_poll; struct i2c_controller sc_i2c; - krwlock_t sc_lock; }; void pcfiic_attach(struct pcfiic_softc *, i2c_addr_t, u_int8_t, int); Index: src/sys/dev/ic/pca9564.c diff -u src/sys/dev/ic/pca9564.c:1.2 src/sys/dev/ic/pca9564.c:1.3 --- src/sys/dev/ic/pca9564.c:1.2 Sun Feb 14 19:54:21 2016 +++ src/sys/dev/ic/pca9564.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pca9564.c,v 1.2 2016/02/14 19:54:21 chs Exp $ */ +/* $NetBSD: pca9564.c,v 1.3 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2010 NONAKA Kimihiro <non...@netbsd.org> @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pca9564.c,v 1.2 2016/02/14 19:54:21 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pca9564.c,v 1.3 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -67,8 +67,7 @@ pca9564_attach(struct pca9564_softc *sc) aprint_naive("\n"); aprint_normal(": PCA9564 I2C Controller\n"); - mutex_init(&sc->sc_buslock, MUTEX_DEFAULT, IPL_NONE); - + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; sc->sc_i2c.ic_acquire_bus = pca9564_acquire_bus; sc->sc_i2c.ic_release_bus = pca9564_release_bus; @@ -77,7 +76,6 @@ pca9564_attach(struct pca9564_softc *sc) sc->sc_i2c.ic_initiate_xfer = pca9564_initiate_xfer; sc->sc_i2c.ic_read_byte = pca9564_read_byte; sc->sc_i2c.ic_write_byte = pca9564_write_byte; - sc->sc_i2c.ic_exec = NULL; /* set serial clock rate */ switch (sc->sc_i2c_clock) { @@ -124,8 +122,6 @@ pca9564_acquire_bus(void *cookie, int fl struct pca9564_softc *sc = cookie; uint8_t control; - mutex_enter(&sc->sc_buslock); - /* Enable SIO and set clock */ control = CSR_READ(sc, PCA9564_I2CCON); control |= I2CCON_ENSIO; @@ -148,8 +144,6 @@ pca9564_release_bus(void *cookie, int fl control = CSR_READ(sc, PCA9564_I2CCON); control &= ~I2CCON_ENSIO; CSR_WRITE(sc, PCA9564_I2CCON, control); - - mutex_exit(&sc->sc_buslock); } #define PCA9564_TIMEOUT 100 /* protocol timeout, in uSecs */ Index: src/sys/dev/ic/pca9564var.h diff -u src/sys/dev/ic/pca9564var.h:1.1 src/sys/dev/ic/pca9564var.h:1.2 --- src/sys/dev/ic/pca9564var.h:1.1 Fri Apr 9 10:09:50 2010 +++ src/sys/dev/ic/pca9564var.h Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pca9564var.h,v 1.1 2010/04/09 10:09:50 nonaka Exp $ */ +/* $NetBSD: pca9564var.h,v 1.2 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2010 NONAKA Kimihiro <non...@netbsd.org> @@ -41,7 +41,6 @@ struct pca9564_softc { int sc_i2c_clock; struct i2c_controller sc_i2c; - kmutex_t sc_buslock; }; void pca9564_attach(struct pca9564_softc *); Index: src/sys/dev/ic/pcf8584.c diff -u src/sys/dev/ic/pcf8584.c:1.15 src/sys/dev/ic/pcf8584.c:1.16 --- src/sys/dev/ic/pcf8584.c:1.15 Mon Jan 11 18:24:56 2016 +++ src/sys/dev/ic/pcf8584.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pcf8584.c,v 1.15 2016/01/11 18:24:56 jdc Exp $ */ +/* $NetBSD: pcf8584.c,v 1.16 2019/12/22 23:23:32 thorpej Exp $ */ /* $OpenBSD: pcf8584.c,v 1.9 2007/10/20 18:46:21 kettenis Exp $ */ /* @@ -22,7 +22,6 @@ #include <sys/device.h> #include <sys/malloc.h> #include <sys/kernel.h> -#include <sys/rwlock.h> #include <sys/proc.h> #include <sys/bus.h> @@ -94,10 +93,8 @@ pcfiic_attach(struct pcfiic_softc *sc, i if (sc->sc_master) pcfiic_choose_bus(sc, 0); - rw_init(&sc->sc_lock); + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = pcfiic_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = pcfiic_i2c_release_bus; sc->sc_i2c.ic_exec = pcfiic_i2c_exec; bzero(&iba, sizeof(iba)); @@ -112,23 +109,6 @@ pcfiic_intr(void *arg) } int -pcfiic_i2c_acquire_bus(void *arg, int flags) -{ - struct pcfiic_softc *sc = arg; - - rw_enter(&sc->sc_lock, RW_WRITER); - return 0; -} - -void -pcfiic_i2c_release_bus(void *arg, int flags) -{ - struct pcfiic_softc *sc = arg; - - rw_exit(&sc->sc_lock); -} - -int pcfiic_i2c_exec(void *arg, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { Index: src/sys/dev/pci/alipm.c diff -u src/sys/dev/pci/alipm.c:1.10 src/sys/dev/pci/alipm.c:1.11 --- src/sys/dev/pci/alipm.c:1.10 Sun Mar 18 12:47:01 2012 +++ src/sys/dev/pci/alipm.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: alipm.c,v 1.10 2012/03/18 12:47:01 martin Exp $ */ +/* $NetBSD: alipm.c,v 1.11 2019/12/22 23:23:32 thorpej Exp $ */ /* $OpenBSD: alipm.c,v 1.13 2007/05/03 12:19:01 dlg Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: alipm.c,v 1.10 2012/03/18 12:47:01 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: alipm.c,v 1.11 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -104,7 +104,6 @@ struct alipm_softc { bus_space_handle_t sc_ioh; struct i2c_controller sc_smb_tag; - kmutex_t sc_smb_mutex; }; static int alipm_match(device_t, cfdata_t, void *); @@ -205,10 +204,8 @@ alipm_attach(device_t parent, device_t s aprint_naive("\n"); /* Attach I2C bus */ - mutex_init(&sc->sc_smb_mutex, MUTEX_DEFAULT, IPL_NONE); + iic_tag_init(&sc->sc_smb_tag); sc->sc_smb_tag.ic_cookie = sc; - sc->sc_smb_tag.ic_acquire_bus = alipm_smb_acquire_bus; - sc->sc_smb_tag.ic_release_bus = alipm_smb_release_bus; sc->sc_smb_tag.ic_exec = alipm_smb_exec; memset(&iba, 0, sizeof iba); @@ -222,23 +219,6 @@ fail: } int -alipm_smb_acquire_bus(void *cookie, int flags) -{ - struct alipm_softc *sc = cookie; - - mutex_enter(&sc->sc_smb_mutex); - return 0; -} - -void -alipm_smb_release_bus(void *cookie, int flags) -{ - struct alipm_softc *sc = cookie; - - mutex_exit(&sc->sc_smb_mutex); -} - -int alipm_smb_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { Index: src/sys/dev/pci/amdpm_smbus.c diff -u src/sys/dev/pci/amdpm_smbus.c:1.22 src/sys/dev/pci/amdpm_smbus.c:1.23 --- src/sys/dev/pci/amdpm_smbus.c:1.22 Sun Feb 14 19:54:21 2016 +++ src/sys/dev/pci/amdpm_smbus.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: amdpm_smbus.c,v 1.22 2016/02/14 19:54:21 chs Exp $ */ +/* $NetBSD: amdpm_smbus.c,v 1.23 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2005 Anil Gopinath (anil_pub...@yahoo.com) @@ -32,13 +32,12 @@ * AMD-8111 HyperTransport I/O Hub */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amdpm_smbus.c,v 1.22 2016/02/14 19:54:21 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amdpm_smbus.c,v 1.23 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> #include <sys/device.h> -#include <sys/mutex.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> @@ -52,8 +51,6 @@ __KERNEL_RCSID(0, "$NetBSD: amdpm_smbus. #include <dev/pci/amdpm_smbusreg.h> -static int amdpm_smbus_acquire_bus(void *, int); -static void amdpm_smbus_release_bus(void *, int); static int amdpm_smbus_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); static int amdpm_smbus_check_done(struct amdpm_softc *, i2c_op_t); @@ -72,14 +69,8 @@ amdpm_smbus_attach(struct amdpm_softc *s struct i2cbus_attach_args iba; /* register with iic */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = amdpm_smbus_acquire_bus; - sc->sc_i2c.ic_release_bus = amdpm_smbus_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = amdpm_smbus_exec; memset(&iba, 0, sizeof(iba)); @@ -88,23 +79,6 @@ amdpm_smbus_attach(struct amdpm_softc *s } static int -amdpm_smbus_acquire_bus(void *cookie, int flags) -{ - struct amdpm_softc *sc = cookie; - - mutex_enter(&sc->sc_mutex); - return 0; -} - -static void -amdpm_smbus_release_bus(void *cookie, int flags) -{ - struct amdpm_softc *sc = cookie; - - mutex_exit(&sc->sc_mutex); -} - -static int amdpm_smbus_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *cmd, size_t cmdlen, void *vbuf, size_t buflen, int flags) { Index: src/sys/dev/pci/amdpmvar.h diff -u src/sys/dev/pci/amdpmvar.h:1.11 src/sys/dev/pci/amdpmvar.h:1.12 --- src/sys/dev/pci/amdpmvar.h:1.11 Mon Apr 13 16:33:25 2015 +++ src/sys/dev/pci/amdpmvar.h Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: amdpmvar.h,v 1.11 2015/04/13 16:33:25 riastradh Exp $ */ +/* $NetBSD: amdpmvar.h,v 1.12 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -32,7 +32,6 @@ #ifndef _DEV_PCI_AMDPMVAR_H_ #define _DEV_PCI_AMDPMVAR_H_ -#include <sys/mutex.h> #include <sys/rndsource.h> struct amdpm_softc { Index: src/sys/dev/pci/coram.c diff -u src/sys/dev/pci/coram.c:1.16 src/sys/dev/pci/coram.c:1.17 --- src/sys/dev/pci/coram.c:1.16 Sun Dec 9 11:14:01 2018 +++ src/sys/dev/pci/coram.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: coram.c,v 1.16 2018/12/09 11:14:01 jdolecek Exp $ */ +/* $NetBSD: coram.c,v 1.17 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2008, 2011 Jonathan A. Kollasch @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: coram.c,v 1.16 2018/12/09 11:14:01 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: coram.c,v 1.17 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -69,8 +69,6 @@ static const struct coram_board * coram_ static int coram_iic_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); -static int coram_iic_acquire_bus(void *, int); -static void coram_iic_release_bus(void *, int); static int coram_iic_read(struct coram_iic_softc *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); static int coram_iic_write(struct coram_iic_softc *, i2c_op_t, i2c_addr_t, @@ -219,17 +217,14 @@ coram_attach(device_t parent, device_t s I2C_BASE + (I2C_SIZE * i), I2C_SIZE, &cic->cic_regh)) panic("failed to subregion i2c"); - mutex_init(&cic->cic_busmutex, MUTEX_DRIVER, IPL_NONE); + iic_tag_init(&cic->cic_i2c); cic->cic_i2c.ic_cookie = cic; - cic->cic_i2c.ic_acquire_bus = coram_iic_acquire_bus; - cic->cic_i2c.ic_release_bus = coram_iic_release_bus; cic->cic_i2c.ic_exec = coram_iic_exec; #ifdef CORAM_ATTACH_I2C /* attach iic(4) */ memset(&iba, 0, sizeof(iba)); iba.iba_tag = &cic->cic_i2c; - iba.iba_type = I2C_TYPE_SMBUS; cic->cic_i2cdev = config_found_ia(self, "i2cbus", &iba, iicbus_print); #endif @@ -307,7 +302,7 @@ coram_detach(device_t self, int flags) cic = &sc->sc_iic[i]; if (cic->cic_i2cdev) config_detach(cic->cic_i2cdev, flags); - mutex_destroy(&cic->cic_busmutex); + iic_tag_fini(&cic->cic_i2c); } pmf_device_deregister(self); @@ -455,36 +450,6 @@ coram_resume(device_t dv, const pmf_qual return true; } -static int -coram_iic_acquire_bus(void *cookie, int flags) -{ - struct coram_iic_softc *cic; - - cic = cookie; - - if (flags & I2C_F_POLL) { - while (mutex_tryenter(&cic->cic_busmutex) == 0) - delay(50); - return 0; - } - - mutex_enter(&cic->cic_busmutex); - - return 0; -} - -static void -coram_iic_release_bus(void *cookie, int flags) -{ - struct coram_iic_softc *cic; - - cic = cookie; - - mutex_exit(&cic->cic_busmutex); - - return; -} - /* I2C Bus */ #define I2C_ADDR 0x0000 Index: src/sys/dev/pci/cxdtv.c diff -u src/sys/dev/pci/cxdtv.c:1.16 src/sys/dev/pci/cxdtv.c:1.17 --- src/sys/dev/pci/cxdtv.c:1.16 Sun Dec 9 11:14:01 2018 +++ src/sys/dev/pci/cxdtv.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cxdtv.c,v 1.16 2018/12/09 11:14:01 jdolecek Exp $ */ +/* $NetBSD: cxdtv.c,v 1.17 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2008, 2011 Jonathan A. Kollasch @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cxdtv.c,v 1.16 2018/12/09 11:14:01 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cxdtv.c,v 1.17 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -70,8 +70,6 @@ static int cxdtv_intr(void *); static bool cxdtv_resume(device_t, const pmf_qual_t *); -static int cxdtv_iic_acquire_bus(void *, int); -static void cxdtv_iic_release_bus(void *, int); static int cxdtv_iic_send_start(void *, int); static int cxdtv_iic_send_stop(void *, int); static int cxdtv_iic_initiate_xfer(void *, i2c_addr_t, int); @@ -233,11 +231,8 @@ cxdtv_attach(device_t parent, device_t s reg |= PCI_COMMAND_MASTER_ENABLE; pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, reg); - mutex_init(&sc->sc_i2c_buslock, MUTEX_DRIVER, IPL_NONE); + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_exec = NULL; - sc->sc_i2c.ic_acquire_bus = cxdtv_iic_acquire_bus; - sc->sc_i2c.ic_release_bus = cxdtv_iic_release_bus; sc->sc_i2c.ic_send_start = cxdtv_iic_send_start; sc->sc_i2c.ic_send_stop = cxdtv_iic_send_stop; sc->sc_i2c.ic_initiate_xfer = cxdtv_iic_initiate_xfer; @@ -282,7 +277,7 @@ cxdtv_detach(device_t self, int flags) if (sc->sc_mems) bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_mems); - mutex_destroy(&sc->sc_i2c_buslock); + iic_tag_fini(&sc->sc_i2c); return 0; } @@ -380,26 +375,6 @@ cxdtv_i2cbb_read_bits(void *cookie) } static int -cxdtv_iic_acquire_bus(void *cookie, int flags) -{ - struct cxdtv_softc *sc = cookie; - - mutex_enter(&sc->sc_i2c_buslock); - - return 0; -} - -static void -cxdtv_iic_release_bus(void *cookie, int flags) -{ - struct cxdtv_softc *sc = cookie; - - mutex_exit(&sc->sc_i2c_buslock); - - return; -} - -static int cxdtv_iic_send_start(void *cookie, int flags) { return i2c_bitbang_send_start(cookie, flags, &cxdtv_i2cbb_ops); Index: src/sys/dev/pci/ichsmb.c diff -u src/sys/dev/pci/ichsmb.c:1.62 src/sys/dev/pci/ichsmb.c:1.63 --- src/sys/dev/pci/ichsmb.c:1.62 Mon Dec 9 21:00:48 2019 +++ src/sys/dev/pci/ichsmb.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ichsmb.c,v 1.62 2019/12/09 21:00:48 ad Exp $ */ +/* $NetBSD: ichsmb.c,v 1.63 2019/12/22 23:23:32 thorpej Exp $ */ /* $OpenBSD: ichiic.c,v 1.18 2007/05/03 09:36:26 dlg Exp $ */ /* @@ -22,7 +22,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ichsmb.c,v 1.62 2019/12/09 21:00:48 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ichsmb.c,v 1.63 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -63,7 +63,6 @@ struct ichsmb_softc { pci_intr_handle_t *sc_pihp; struct i2c_controller sc_i2c_tag; - kmutex_t sc_i2c_mutex; struct { i2c_op_t op; void * buf; @@ -80,8 +79,6 @@ static int ichsmb_detach(device_t, int); static int ichsmb_rescan(device_t, const char *, const int *); static void ichsmb_chdet(device_t, device_t); -static int ichsmb_i2c_acquire_bus(void *, int); -static void ichsmb_i2c_release_bus(void *, int); static int ichsmb_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -163,7 +160,6 @@ ichsmb_attach(device_t parent, device_t sc->sc_pc = pa->pa_pc; pci_aprint_devinfo(pa, NULL); - mutex_init(&sc->sc_i2c_mutex, MUTEX_DEFAULT, IPL_NONE); /* Read configuration */ conf = pci_conf_read(pa->pa_pc, pa->pa_tag, LPCIB_SMB_HOSTC); @@ -228,13 +224,11 @@ ichsmb_rescan(device_t self, const char return 0; /* Attach I2C bus */ + iic_tag_init(&sc->sc_i2c_tag); sc->sc_i2c_tag.ic_cookie = sc; - sc->sc_i2c_tag.ic_acquire_bus = ichsmb_i2c_acquire_bus; - sc->sc_i2c_tag.ic_release_bus = ichsmb_i2c_release_bus; sc->sc_i2c_tag.ic_exec = ichsmb_i2c_exec; memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &sc->sc_i2c_tag; sc->sc_i2c_device = config_found_ia(self, ifattr, &iba, iicbus_print); @@ -253,7 +247,7 @@ ichsmb_detach(device_t self, int flags) return error; } - mutex_destroy(&sc->sc_i2c_mutex); + iic_tag_fini(&sc->sc_i2c_tag); if (sc->sc_ih) { pci_intr_disestablish(sc->sc_pc, sc->sc_ih); @@ -281,29 +275,6 @@ ichsmb_chdet(device_t self, device_t chi } static int -ichsmb_i2c_acquire_bus(void *cookie, int flags) -{ - struct ichsmb_softc *sc = cookie; - - if (cold) - return 0; - - mutex_enter(&sc->sc_i2c_mutex); - return 0; -} - -static void -ichsmb_i2c_release_bus(void *cookie, int flags) -{ - struct ichsmb_softc *sc = cookie; - - if (cold) - return; - - mutex_exit(&sc->sc_i2c_mutex); -} - -static int ichsmb_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { Index: src/sys/dev/pci/if_tl.c diff -u src/sys/dev/pci/if_tl.c:1.117 src/sys/dev/pci/if_tl.c:1.118 --- src/sys/dev/pci/if_tl.c:1.117 Wed Oct 30 07:26:28 2019 +++ src/sys/dev/pci/if_tl.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_tl.c,v 1.117 2019/10/30 07:26:28 msaitoh Exp $ */ +/* $NetBSD: if_tl.c,v 1.118 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 1997 Manuel Bouyer. All rights reserved. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_tl.c,v 1.117 2019/10/30 07:26:28 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_tl.c,v 1.118 2019/12/22 23:23:32 thorpej Exp $"); #undef TLDEBUG #define TL_PRIV_STATS @@ -141,8 +141,6 @@ int tl_mii_write(device_t, int, int, uin void tl_statchg(struct ifnet *); /* I2C glue */ -static int tl_i2c_acquire_bus(void *, int); -static void tl_i2c_release_bus(void *, int); static int tl_i2c_send_start(void *, int); static int tl_i2c_send_stop(void *, int); static int tl_i2c_initiate_xfer(void *, i2c_addr_t, int); @@ -361,9 +359,8 @@ tl_pci_attach(device_t parent, device_t tl_reset(sc); /* fill in the i2c tag */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = tl_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = tl_i2c_release_bus; sc->sc_i2c.ic_send_start = tl_i2c_send_start; sc->sc_i2c.ic_send_stop = tl_i2c_send_stop; sc->sc_i2c.ic_initiate_xfer = tl_i2c_initiate_xfer; @@ -918,21 +915,6 @@ tl_statchg(struct ifnet *ifp) /********** I2C glue **********/ static int -tl_i2c_acquire_bus(void *cookie, int flags) -{ - - /* private bus */ - return 0; -} - -static void -tl_i2c_release_bus(void *cookie, int flags) -{ - - /* private bus */ -} - -static int tl_i2c_send_start(void *cookie, int flags) { Index: src/sys/dev/pci/igma.c diff -u src/sys/dev/pci/igma.c:1.3 src/sys/dev/pci/igma.c:1.4 --- src/sys/dev/pci/igma.c:1.3 Sun Feb 14 19:54:21 2016 +++ src/sys/dev/pci/igma.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: igma.c,v 1.3 2016/02/14 19:54:21 chs Exp $ */ +/* $NetBSD: igma.c,v 1.4 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2014 Michael van Elst @@ -21,7 +21,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: igma.c,v 1.3 2016/02/14 19:54:21 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: igma.c,v 1.4 2019/12/22 23:23:32 thorpej Exp $"); #include "vga.h" @@ -58,7 +58,6 @@ __KERNEL_RCSID(0, "$NetBSD: igma.c,v 1.3 struct igma_softc; struct igma_i2c { - kmutex_t ii_lock; struct igma_softc *ii_sc; bus_addr_t ii_reg; struct i2c_controller ii_i2c; @@ -457,21 +456,16 @@ igma_i2c_attach(struct igma_softc *sc) panic("don't know GMBUS %d\n",i); } - mutex_init(&ii->ii_lock, MUTEX_DEFAULT, IPL_NONE); - + iic_tag_init(&ii->ii_i2c); ii->ii_i2c.ic_cookie = ii; - ii->ii_i2c.ic_acquire_bus = igma_i2c_acquire_bus; - ii->ii_i2c.ic_release_bus = igma_i2c_release_bus; ii->ii_i2c.ic_send_start = igma_i2c_send_start; ii->ii_i2c.ic_send_stop = igma_i2c_send_stop; ii->ii_i2c.ic_initiate_xfer = igma_i2c_initiate_xfer; ii->ii_i2c.ic_read_byte = igma_i2c_read_byte; ii->ii_i2c.ic_write_byte = igma_i2c_write_byte; - ii->ii_i2c.ic_exec = NULL; #if 0 memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &ii->ii_i2c; config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print); #endif @@ -483,21 +477,6 @@ igma_i2c_attach(struct igma_softc *sc) */ static int -igma_i2c_acquire_bus(void *cookie, int flags) -{ - struct igma_i2c *ii = cookie; - mutex_enter(&ii->ii_lock); - return 0; -} - -static void -igma_i2c_release_bus(void *cookie, int flags) -{ - struct igma_i2c *ii = cookie; - mutex_exit(&ii->ii_lock); -} - -static int igma_i2c_send_start(void *cookie, int flags) { return i2c_bitbang_send_start(cookie, flags, &igma_i2cbb_ops); Index: src/sys/dev/pci/ismt.c diff -u src/sys/dev/pci/ismt.c:1.6 src/sys/dev/pci/ismt.c:1.7 --- src/sys/dev/pci/ismt.c:1.6 Thu Aug 17 01:24:09 2017 +++ src/sys/dev/pci/ismt.c Sun Dec 22 23:23:32 2019 @@ -60,7 +60,7 @@ #if 0 __FBSDID("$FreeBSD: head/sys/dev/ismt/ismt.c 266474 2014-05-20 19:55:06Z jimharris $"); #endif -__KERNEL_RCSID(0, "$NetBSD: ismt.c,v 1.6 2017/08/17 01:24:09 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ismt.c,v 1.7 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -68,7 +68,6 @@ __KERNEL_RCSID(0, "$NetBSD: ismt.c,v 1.6 #include <sys/errno.h> #include <sys/kernel.h> #include <sys/module.h> -#include <sys/mutex.h> #include <sys/proc.h> #include <sys/bus.h> @@ -186,7 +185,6 @@ struct ismt_softc { device_t smbdev; struct i2c_controller sc_i2c_tag; - kmutex_t sc_i2c_mutex; pci_chipset_tag_t sc_pc; pcitag_t sc_pcitag; @@ -215,8 +213,6 @@ struct ismt_softc { }; static int ismt_intr(void *); -static int ismt_i2c_acquire_bus(void *, int); -static void ismt_i2c_release_bus(void *, int); static int ismt_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); static struct ismt_desc *ismt_alloc_desc(struct ismt_softc *); @@ -269,23 +265,6 @@ ismt_intr(void *arg) } static int -ismt_i2c_acquire_bus(void *cookie, int flags) -{ - struct ismt_softc *sc = cookie; - - mutex_enter(&sc->sc_i2c_mutex); - return 0; -} - -static void -ismt_i2c_release_bus(void *cookie, int flags) -{ - struct ismt_softc *sc = cookie; - - mutex_exit(&sc->sc_i2c_mutex); -} - -static int ismt_i2c_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *cmd, size_t cmdlen, void *buf, size_t buflen, int flags) { @@ -342,8 +321,6 @@ ismt_alloc_desc(struct ismt_softc *sc) { struct ismt_desc *desc; - KASSERT(mutex_owned(&sc->sc_i2c_mutex)); - desc = &sc->desc[sc->head++]; if (sc->head == ISMT_DESC_ENTRIES) sc->head = 0; @@ -675,7 +652,7 @@ ismt_detach(device_t self, int flags) if (sc->mmio_size) bus_space_unmap(sc->mmio_tag, sc->mmio_handle, sc->mmio_size); - mutex_destroy(&sc->sc_i2c_mutex); + iic_tag_fini(&sc->sc_i2c_tag); return rv; } @@ -776,7 +753,6 @@ ismt_attach(device_t parent, device_t se aprint_normal_dev(sc->pcidev, "interrupting at %s\n", intrstr); sc->smbdev = NULL; - mutex_init(&sc->sc_i2c_mutex, MUTEX_DEFAULT, IPL_NONE); if (!pmf_device_register(self, NULL, NULL)) aprint_error_dev(self, "couldn't establish power handler\n"); @@ -823,13 +799,11 @@ ismt_rescan(device_t self, const char *i return 0; /* Attach I2C bus */ + iic_tag_init(&sc->sc_i2c_tag); sc->sc_i2c_tag.ic_cookie = sc; - sc->sc_i2c_tag.ic_acquire_bus = ismt_i2c_acquire_bus; - sc->sc_i2c_tag.ic_release_bus = ismt_i2c_release_bus; sc->sc_i2c_tag.ic_exec = ismt_i2c_exec; memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &sc->sc_i2c_tag; sc->smbdev = config_found_ia(self, ifattr, &iba, iicbus_print); Index: src/sys/dev/pci/nfsmb.c diff -u src/sys/dev/pci/nfsmb.c:1.24 src/sys/dev/pci/nfsmb.c:1.25 --- src/sys/dev/pci/nfsmb.c:1.24 Sun Feb 14 19:54:21 2016 +++ src/sys/dev/pci/nfsmb.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nfsmb.c,v 1.24 2016/02/14 19:54:21 chs Exp $ */ +/* $NetBSD: nfsmb.c,v 1.25 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2007 KIYOHARA Takashi * All rights reserved. @@ -26,7 +26,7 @@ * */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfsmb.c,v 1.24 2016/02/14 19:54:21 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfsmb.c,v 1.25 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -73,7 +73,6 @@ struct nfsmb_softc { bus_space_handle_t sc_ioh; struct i2c_controller sc_i2c; /* i2c controller info */ - kmutex_t sc_mutex; }; @@ -83,8 +82,6 @@ static int nfsmbc_print(void *, const ch static int nfsmb_match(device_t, cfdata_t, void *); static void nfsmb_attach(device_t, device_t, void *); -static int nfsmb_acquire_bus(void *, int); -static void nfsmb_release_bus(void *, int); static int nfsmb_exec( void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); static int nfsmb_check_done(struct nfsmb_softc *); @@ -227,18 +224,10 @@ nfsmb_attach(device_t parent, device_t s sc->sc_iot = nfsmbcap->nfsmb_iot; /* register with iic */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = nfsmb_acquire_bus; - sc->sc_i2c.ic_release_bus = nfsmb_release_bus; - sc->sc_i2c.ic_send_start = NULL; - sc->sc_i2c.ic_send_stop = NULL; - sc->sc_i2c.ic_initiate_xfer = NULL; - sc->sc_i2c.ic_read_byte = NULL; - sc->sc_i2c.ic_write_byte = NULL; sc->sc_i2c.ic_exec = nfsmb_exec; - mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NONE); - if (bus_space_map(sc->sc_iot, nfsmbcap->nfsmb_addr, NFORCE_SMBSIZE, 0, &sc->sc_ioh) != 0) { aprint_error_dev(self, "failed to map SMBus space\n"); @@ -246,7 +235,6 @@ nfsmb_attach(device_t parent, device_t s } memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &sc->sc_i2c; (void) config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print); @@ -258,23 +246,6 @@ nfsmb_attach(device_t parent, device_t s } static int -nfsmb_acquire_bus(void *cookie, int flags) -{ - struct nfsmb_softc *sc = cookie; - - mutex_enter(&sc->sc_mutex); - return 0; -} - -static void -nfsmb_release_bus(void *cookie, int flags) -{ - struct nfsmb_softc *sc = cookie; - - mutex_exit(&sc->sc_mutex); -} - -static int nfsmb_exec(void *cookie, i2c_op_t op, i2c_addr_t addr, const void *cmd, size_t cmdlen, void *vbuf, size_t buflen, int flags) { Index: src/sys/dev/pci/piixpm.c diff -u src/sys/dev/pci/piixpm.c:1.54 src/sys/dev/pci/piixpm.c:1.55 --- src/sys/dev/pci/piixpm.c:1.54 Sat Jul 13 09:24:17 2019 +++ src/sys/dev/pci/piixpm.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: piixpm.c,v 1.54 2019/07/13 09:24:17 msaitoh Exp $ */ +/* $NetBSD: piixpm.c,v 1.55 2019/12/22 23:23:32 thorpej Exp $ */ /* $OpenBSD: piixpm.c,v 1.39 2013/10/01 20:06:02 sf Exp $ */ /* @@ -22,7 +22,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: piixpm.c,v 1.54 2019/07/13 09:24:17 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: piixpm.c,v 1.55 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -97,7 +97,6 @@ struct piixpm_softc { struct piixpm_smbus sc_busses[4]; struct i2c_controller sc_i2c_tags[4]; - kmutex_t sc_i2c_mutex; struct { i2c_op_t op; void * buf; @@ -297,7 +296,6 @@ setintr: sc->sc_i2c_device[i] = NULL; flags = 0; - mutex_init(&sc->sc_i2c_mutex, MUTEX_DEFAULT, IPL_NONE); piixpm_rescan(self, "i2cbus", &flags); } @@ -332,12 +330,12 @@ piixpm_rescan(device_t self, const char continue; sc->sc_busses[i].sda = i; sc->sc_busses[i].softc = sc; + iic_tag_init(&sc->sc_i2c_tags[i]); sc->sc_i2c_tags[i].ic_cookie = &sc->sc_busses[i]; sc->sc_i2c_tags[i].ic_acquire_bus = piixpm_i2c_acquire_bus; sc->sc_i2c_tags[i].ic_release_bus = piixpm_i2c_release_bus; sc->sc_i2c_tags[i].ic_exec = piixpm_i2c_exec; memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &sc->sc_i2c_tags[i]; sc->sc_i2c_device[i] = config_found_ia(self, ifattr, &iba, piixpm_iicbus_print); @@ -477,9 +475,6 @@ piixpm_i2c_acquire_bus(void *cookie, int struct piixpm_smbus *smbus = cookie; struct piixpm_softc *sc = smbus->softc; - if (!cold) - mutex_enter(&sc->sc_i2c_mutex); - if (PIIXPM_IS_KERNCZ(sc)) { bus_space_write_1(sc->sc_iot, sc->sc_sb800_ioh, SB800_INDIRECTIO_INDEX, AMDFCH41_PM_PORT_INDEX); @@ -516,9 +511,6 @@ piixpm_i2c_release_bus(void *cookie, int bus_space_write_1(sc->sc_iot, sc->sc_sb800_ioh, SB800_INDIRECTIO_DATA, 0); } - - if (!cold) - mutex_exit(&sc->sc_i2c_mutex); } static int Index: src/sys/dev/pci/pm2fb.c diff -u src/sys/dev/pci/pm2fb.c:1.30 src/sys/dev/pci/pm2fb.c:1.31 --- src/sys/dev/pci/pm2fb.c:1.30 Mon Sep 3 16:29:32 2018 +++ src/sys/dev/pci/pm2fb.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: pm2fb.c,v 1.30 2018/09/03 16:29:32 riastradh Exp $ */ +/* $NetBSD: pm2fb.c,v 1.31 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2009, 2012 Michael Lorenz @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pm2fb.c,v 1.30 2018/09/03 16:29:32 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pm2fb.c,v 1.31 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -167,8 +167,6 @@ struct wsdisplay_accessops pm2fb_accesso }; /* I2C glue */ -static int pm2fb_i2c_acquire_bus(void *, int); -static void pm2fb_i2c_release_bus(void *, int); static int pm2fb_i2c_send_start(void *, int); static int pm2fb_i2c_send_stop(void *, int); static int pm2fb_i2c_initiate_xfer(void *, i2c_addr_t, int); @@ -1341,15 +1339,13 @@ pm2_setup_i2c(struct pm2fb_softc *sc) #endif /* Fill in the i2c tag */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = pm2fb_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = pm2fb_i2c_release_bus; sc->sc_i2c.ic_send_start = pm2fb_i2c_send_start; sc->sc_i2c.ic_send_stop = pm2fb_i2c_send_stop; sc->sc_i2c.ic_initiate_xfer = pm2fb_i2c_initiate_xfer; sc->sc_i2c.ic_read_byte = pm2fb_i2c_read_byte; sc->sc_i2c.ic_write_byte = pm2fb_i2c_write_byte; - sc->sc_i2c.ic_exec = NULL; DPRINTF("data: %08x\n", bus_space_read_4(sc->sc_memt, sc->sc_regh, PM2_DISPLAY_DATA)); @@ -1448,19 +1444,6 @@ static uint32_t pm2fb_i2cbb_read(void *c /* higher level I2C stuff */ static int -pm2fb_i2c_acquire_bus(void *cookie, int flags) -{ - /* private bus */ - return (0); -} - -static void -pm2fb_i2c_release_bus(void *cookie, int flags) -{ - /* private bus */ -} - -static int pm2fb_i2c_send_start(void *cookie, int flags) { return (i2c_bitbang_send_start(cookie, flags, &pm2fb_i2cbb_ops)); Index: src/sys/dev/pci/pm3fb.c diff -u src/sys/dev/pci/pm3fb.c:1.4 src/sys/dev/pci/pm3fb.c:1.5 --- src/sys/dev/pci/pm3fb.c:1.4 Mon Mar 6 16:49:26 2017 +++ src/sys/dev/pci/pm3fb.c Sun Dec 22 23:23:32 2019 @@ -133,8 +133,6 @@ struct wsdisplay_accessops pm3fb_accesso }; /* I2C glue */ -static int pm3fb_i2c_acquire_bus(void *, int); -static void pm3fb_i2c_release_bus(void *, int); static int pm3fb_i2c_send_start(void *, int); static int pm3fb_i2c_send_stop(void *, int); static int pm3fb_i2c_initiate_xfer(void *, i2c_addr_t, int); @@ -1004,9 +1002,8 @@ pm3_setup_i2c(struct pm3fb_softc *sc) int i; /* Fill in the i2c tag */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = pm3fb_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = pm3fb_i2c_release_bus; sc->sc_i2c.ic_send_start = pm3fb_i2c_send_start; sc->sc_i2c.ic_send_stop = pm3fb_i2c_send_stop; sc->sc_i2c.ic_initiate_xfer = pm3fb_i2c_initiate_xfer; @@ -1095,19 +1092,6 @@ static uint32_t pm3fb_i2cbb_read(void *c /* higher level I2C stuff */ static int -pm3fb_i2c_acquire_bus(void *cookie, int flags) -{ - /* private bus */ - return (0); -} - -static void -pm3fb_i2c_release_bus(void *cookie, int flags) -{ - /* private bus */ -} - -static int pm3fb_i2c_send_start(void *cookie, int flags) { Index: src/sys/dev/pci/radeonfb_i2c.c diff -u src/sys/dev/pci/radeonfb_i2c.c:1.2 src/sys/dev/pci/radeonfb_i2c.c:1.3 --- src/sys/dev/pci/radeonfb_i2c.c:1.2 Fri Oct 19 12:00:55 2007 +++ src/sys/dev/pci/radeonfb_i2c.c Sun Dec 22 23:23:32 2019 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: radeonfb_i2c.c,v 1.2 2007/10/19 12:00:55 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: radeonfb_i2c.c,v 1.3 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -205,6 +205,7 @@ radeonfb_i2c_init(struct radeonfb_softc struct i2c_controller *icc = &sc->sc_i2c[i].ric_controller; sc->sc_i2c[i].ric_softc = sc; + iic_tag_init(icc); icc->ic_cookie = &sc->sc_i2c[i]; icc->ic_acquire_bus = radeonfb_i2c_acquire_bus; icc->ic_release_bus = radeonfb_i2c_release_bus; Index: src/sys/dev/pci/voodoofb.c diff -u src/sys/dev/pci/voodoofb.c:1.52 src/sys/dev/pci/voodoofb.c:1.53 --- src/sys/dev/pci/voodoofb.c:1.52 Sun Dec 9 11:14:02 2018 +++ src/sys/dev/pci/voodoofb.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: voodoofb.c,v 1.52 2018/12/09 11:14:02 jdolecek Exp $ */ +/* $NetBSD: voodoofb.c,v 1.53 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2005, 2006, 2012 Michael Lorenz @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: voodoofb.c,v 1.52 2018/12/09 11:14:02 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: voodoofb.c,v 1.53 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -224,8 +224,6 @@ struct wsdisplay_accessops voodoofb_acce }; /* I2C glue */ -static int voodoofb_i2c_acquire_bus(void *, int); -static void voodoofb_i2c_release_bus(void *, int); static int voodoofb_i2c_send_start(void *, int); static int voodoofb_i2c_send_stop(void *, int); static int voodoofb_i2c_initiate_xfer(void *, i2c_addr_t, int); @@ -1720,15 +1718,13 @@ voodoofb_setup_i2c(struct voodoofb_softc int i; /* Fill in the i2c tag */ + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = voodoofb_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = voodoofb_i2c_release_bus; sc->sc_i2c.ic_send_start = voodoofb_i2c_send_start; sc->sc_i2c.ic_send_stop = voodoofb_i2c_send_stop; sc->sc_i2c.ic_initiate_xfer = voodoofb_i2c_initiate_xfer; sc->sc_i2c.ic_read_byte = voodoofb_i2c_read_byte; sc->sc_i2c.ic_write_byte = voodoofb_i2c_write_byte; - sc->sc_i2c.ic_exec = NULL; sc->sc_i2creg = voodoo3_read32(sc, VIDSERPARPORT); #ifdef VOODOOFB_DEBUG @@ -1820,19 +1816,6 @@ static uint32_t voodoofb_i2cbb_read(void /* higher level I2C stuff */ static int -voodoofb_i2c_acquire_bus(void *cookie, int flags) -{ - /* private bus */ - return (0); -} - -static void -voodoofb_i2c_release_bus(void *cookie, int flags) -{ - /* private bus */ -} - -static int voodoofb_i2c_send_start(void *cookie, int flags) { return (i2c_bitbang_send_start(cookie, flags, &voodoofb_i2cbb_ops)); Index: src/sys/dev/pci/voyager.c diff -u src/sys/dev/pci/voyager.c:1.14 src/sys/dev/pci/voyager.c:1.15 --- src/sys/dev/pci/voyager.c:1.14 Sun Apr 21 11:45:08 2019 +++ src/sys/dev/pci/voyager.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: voyager.c,v 1.14 2019/04/21 11:45:08 maya Exp $ */ +/* $NetBSD: voyager.c,v 1.15 2019/12/22 23:23:32 thorpej Exp $ */ /* * Copyright (c) 2009, 2011 Michael Lorenz @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: voyager.c,v 1.14 2019/04/21 11:45:08 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: voyager.c,v 1.15 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -250,8 +250,8 @@ voyager_attach(device_t parent, device_t voyager_gpio_dir(sc, 0xffffffff, GPIO_I2C_BITS); /* Fill in the i2c tag */ - memset(&sc->sc_i2c, 0, sizeof(sc->sc_i2c)); memset(&iba, 0, sizeof(iba)); + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; sc->sc_i2c.ic_acquire_bus = voyager_i2c_acquire_bus; sc->sc_i2c.ic_release_bus = voyager_i2c_release_bus; @@ -260,7 +260,6 @@ voyager_attach(device_t parent, device_t sc->sc_i2c.ic_initiate_xfer = voyager_i2c_initiate_xfer; sc->sc_i2c.ic_read_byte = voyager_i2c_read_byte; sc->sc_i2c.ic_write_byte = voyager_i2c_write_byte; - sc->sc_i2c.ic_exec = NULL; iba.iba_tag = &sc->sc_i2c; config_found_ia(self, "i2cbus", &iba, iicbus_print); } @@ -322,6 +321,7 @@ voyager_i2c_acquire_bus(void *cookie, in { struct voyager_softc *sc = cookie; + /* We also have to serialize against voyager_twiddle_bits() */ mutex_enter(&sc->sc_i2c_lock); return 0; } Index: src/sys/dev/usb/auvitek_i2c.c diff -u src/sys/dev/usb/auvitek_i2c.c:1.4 src/sys/dev/usb/auvitek_i2c.c:1.5 --- src/sys/dev/usb/auvitek_i2c.c:1.4 Fri Nov 25 12:56:29 2016 +++ src/sys/dev/usb/auvitek_i2c.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: auvitek_i2c.c,v 1.4 2016/11/25 12:56:29 skrll Exp $ */ +/* $NetBSD: auvitek_i2c.c,v 1.5 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2010 Jared D. McNeill <jmcne...@invisible.ca> @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: auvitek_i2c.c,v 1.4 2016/11/25 12:56:29 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: auvitek_i2c.c,v 1.5 2019/12/22 23:23:32 thorpej Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -56,8 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: auvitek_i2c. /* #define AUVITEK_I2C_DEBUG */ -static int auvitek_i2c_acquire_bus(void *, int); -static void auvitek_i2c_release_bus(void *, int); static int auvitek_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -73,10 +71,8 @@ static bool auvitek_i2c_wait_wrdone(stru int auvitek_i2c_attach(struct auvitek_softc *sc) { - mutex_init(&sc->sc_i2c_lock, MUTEX_DEFAULT, IPL_NONE); + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = auvitek_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = auvitek_i2c_release_bus; sc->sc_i2c.ic_exec = auvitek_i2c_exec; auvitek_i2c_rescan(sc, NULL, NULL); @@ -87,7 +83,7 @@ auvitek_i2c_attach(struct auvitek_softc int auvitek_i2c_detach(struct auvitek_softc *sc, int flags) { - mutex_destroy(&sc->sc_i2c_lock); + iic_tag_fini(&sc->sc_i2c); if (sc->sc_i2cdev) config_detach(sc->sc_i2cdev, flags); @@ -104,7 +100,6 @@ auvitek_i2c_rescan(struct auvitek_softc if (ifattr_match(ifattr, "i2cbus") && sc->sc_i2cdev == NULL) { memset(&iba, 0, sizeof(iba)); - iba.iba_type = I2C_TYPE_SMBUS; iba.iba_tag = &sc->sc_i2c; sc->sc_i2cdev = config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print); @@ -120,29 +115,6 @@ auvitek_i2c_childdet(struct auvitek_soft } static int -auvitek_i2c_acquire_bus(void *opaque, int flags) -{ - struct auvitek_softc *sc = opaque; - - if (flags & I2C_F_POLL) { - if (!mutex_tryenter(&sc->sc_i2c_lock)) - return EBUSY; - } else { - mutex_enter(&sc->sc_i2c_lock); - } - - return 0; -} - -static void -auvitek_i2c_release_bus(void *opaque, int flags) -{ - struct auvitek_softc *sc = opaque; - - mutex_exit(&sc->sc_i2c_lock); -} - -static int auvitek_i2c_exec(void *opaque, i2c_op_t op, i2c_addr_t addr, const void *cmd, size_t cmdlen, void *vbuf, size_t buflen, int flags) { @@ -161,8 +133,6 @@ auvitek_i2c_read(struct auvitek_softc *s uint8_t v; unsigned int i; - //KASSERT(mutex_owned(&sc->sc_i2c_lock)); - auvitek_write_1(sc, AU0828_REG_I2C_MBMODE, 1); auvitek_write_1(sc, AU0828_REG_I2C_CLKDIV, sc->sc_i2c_clkdiv); auvitek_write_1(sc, AU0828_REG_I2C_DSTADDR, addr << 1); @@ -200,8 +170,6 @@ auvitek_i2c_write(struct auvitek_softc * uint8_t v; unsigned int i, fifolen; - //KASSERT(mutex_owned(&sc->sc_i2c_lock)); - auvitek_write_1(sc, AU0828_REG_I2C_MBMODE, 1); auvitek_write_1(sc, AU0828_REG_I2C_CLKDIV, sc->sc_i2c_clkdiv); auvitek_write_1(sc, AU0828_REG_I2C_DSTADDR, addr << 1); Index: src/sys/dev/usb/emdtv_i2c.c diff -u src/sys/dev/usb/emdtv_i2c.c:1.1 src/sys/dev/usb/emdtv_i2c.c:1.2 --- src/sys/dev/usb/emdtv_i2c.c:1.1 Mon Jul 11 18:02:04 2011 +++ src/sys/dev/usb/emdtv_i2c.c Sun Dec 22 23:23:32 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: emdtv_i2c.c,v 1.1 2011/07/11 18:02:04 jmcneill Exp $ */ +/* $NetBSD: emdtv_i2c.c,v 1.2 2019/12/22 23:23:32 thorpej Exp $ */ /*- * Copyright (c) 2008, 2010 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: emdtv_i2c.c,v 1.1 2011/07/11 18:02:04 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: emdtv_i2c.c,v 1.2 2019/12/22 23:23:32 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -44,8 +44,6 @@ __KERNEL_RCSID(0, "$NetBSD: emdtv_i2c.c, #include <dev/usb/emdtvvar.h> #include <dev/usb/emdtvreg.h> -static int emdtv_i2c_acquire_bus(void *, int); -static void emdtv_i2c_release_bus(void *, int); static int emdtv_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, size_t, void *, size_t, int); @@ -58,10 +56,8 @@ static int emdtv_i2c_send(struct emdtv_s int emdtv_i2c_attach(struct emdtv_softc *sc) { - mutex_init(&sc->sc_i2c_lock, MUTEX_DEFAULT, IPL_VM); + iic_tag_init(&sc->sc_i2c); sc->sc_i2c.ic_cookie = sc; - sc->sc_i2c.ic_acquire_bus = emdtv_i2c_acquire_bus; - sc->sc_i2c.ic_release_bus = emdtv_i2c_release_bus; sc->sc_i2c.ic_exec = emdtv_i2c_exec; return 0; @@ -70,17 +66,7 @@ emdtv_i2c_attach(struct emdtv_softc *sc) int emdtv_i2c_detach(struct emdtv_softc *sc, int flags) { - mutex_destroy(&sc->sc_i2c_lock); - - return 0; -} - -static int -emdtv_i2c_acquire_bus(void *opaque, int flags) -{ - struct emdtv_softc *sc = opaque; - - mutex_enter(&sc->sc_i2c_lock); + iic_tag_fini(&sc->sc_i2c); return 0; } @@ -106,14 +92,6 @@ emdtv_i2c_exec(void *opaque, i2c_op_t op return error; } -static void -emdtv_i2c_release_bus(void *opaque, int flags) -{ - struct emdtv_softc *sc = opaque; - - mutex_exit(&sc->sc_i2c_lock); -} - static int emdtv_i2c_check(struct emdtv_softc *sc, i2c_addr_t addr) {