git: 2ade7208068d - main - TCA64xx: Convert mutex to SX lock.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 22 Feb 2026 17:53:50 UTC
The branch main has been updated by mmel:
URL: https://cgit.FreeBSD.org/src/commit/?id=2ade7208068d1d215f8b9754b448566354d6944c
commit 2ade7208068d1d215f8b9754b448566354d6944c
Author: Michal Meloun <mmel@FreeBSD.org>
AuthorDate: 2025-11-06 19:11:17 +0000
Commit: Michal Meloun <mmel@FreeBSD.org>
CommitDate: 2026-02-22 17:53:27 +0000
TCA64xx: Convert mutex to SX lock.
I2C devices are permitted to sleep during transfers.
MFC after: 3 weeks
---
sys/dev/iicbus/gpio/tca64xx.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/sys/dev/iicbus/gpio/tca64xx.c b/sys/dev/iicbus/gpio/tca64xx.c
index ab8fedd3f8fd..4920d77dd81c 100644
--- a/sys/dev/iicbus/gpio/tca64xx.c
+++ b/sys/dev/iicbus/gpio/tca64xx.c
@@ -39,6 +39,7 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/proc.h>
+#include <sys/sx.h>
#include <sys/systm.h>
#include <sys/sysctl.h>
@@ -93,7 +94,7 @@ struct tca64xx_softc {
device_t dev;
device_t busdev;
enum chip_type chip;
- struct mtx mtx;
+ struct sx mtx;
uint32_t addr;
uint8_t num_pins;
uint8_t in_port_reg;
@@ -260,7 +261,7 @@ tca64xx_attach(device_t dev)
sc->dev = dev;
sc->addr = iicbus_get_addr(dev);
- mtx_init(&sc->mtx, "tca64xx gpio", "gpio", MTX_DEF);
+ sx_init(&sc->mtx, "tca64xx gpio");
OF_device_register_xref(OF_xref_from_node(ofw_bus_get_node(dev)), dev);
sc->busdev = gpiobus_add_bus(dev);
if (sc->busdev == NULL) {
@@ -293,7 +294,7 @@ tca64xx_detach(device_t dev)
sc = device_get_softc(dev);
gpiobus_detach_bus(dev);
- mtx_destroy(&sc->mtx);
+ sx_destroy(&sc->mtx);
return (0);
}
@@ -383,7 +384,7 @@ tca64xx_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
if (pin >= pins)
return (EINVAL);
- mtx_lock(&sc->mtx);
+ sx_xlock(&sc->mtx);
addr = TCA64XX_REG_ADDR(pin, sc->conf_reg);
error = tca64xx_read(dev, addr, &val);
@@ -414,7 +415,7 @@ tca64xx_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
error = tca64xx_write(dev, addr, inv_val);
fail:
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
return (error);
}
@@ -478,11 +479,11 @@ tca64xx_pin_set(device_t dev, uint32_t pin, unsigned int val)
dbg_dev_printf(dev, "Setting pin: %u to %u\n", pin, val);
- mtx_lock(&sc->mtx);
+ sx_xlock(&sc->mtx);
error = tca64xx_read(dev, addr, &value);
if (error != 0) {
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
dbg_dev_printf(dev, "Failed to read from register.\n");
return (error);
}
@@ -494,12 +495,12 @@ tca64xx_pin_set(device_t dev, uint32_t pin, unsigned int val)
error = tca64xx_write(dev, addr, value);
if (error != 0) {
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
dbg_dev_printf(dev, "Could not write to register.\n");
return (error);
}
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
return (0);
}
@@ -522,11 +523,11 @@ tca64xx_pin_toggle(device_t dev, uint32_t pin)
dbg_dev_printf(dev, "Toggling pin: %d\n", pin);
- mtx_lock(&sc->mtx);
+ sx_xlock(&sc->mtx);
error = tca64xx_read(dev, addr, &value);
if (error != 0) {
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
dbg_dev_printf(dev, "Cannot read from register.\n");
return (error);
}
@@ -535,12 +536,12 @@ tca64xx_pin_toggle(device_t dev, uint32_t pin)
error = tca64xx_write(dev, addr, value);
if (error != 0) {
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
dbg_dev_printf(dev, "Cannot write to register.\n");
return (error);
}
- mtx_unlock(&sc->mtx);
+ sx_unlock(&sc->mtx);
return (0);
}