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.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)
 {

Reply via email to