svn commit: r349311 - in stable/12/sys: arm/freescale/imx dev/iicbus

Ian Lepore ian at FreeBSD.org
Sun Jun 23 15:58:47 UTC 2019


Author: ian
Date: Sun Jun 23 15:58:46 2019
New Revision: 349311
URL: https://svnweb.freebsd.org/changeset/base/349311

Log:
  MFC r348123, r348164, r348166
  
  r348123:
  Add pnp info to the imx_i2c driver.
  
  r348164:
  Mark i2c slave devices busy while they own the bus.
  
  Many i2c slave drivers are in modules that can be unloaded.  If they detach
  while IO is in progress the bus would be hung forever.  Conversely,
  lower-layer drivers (iicbus and the hardware driver) also live in modules
  and other kinds of bad things happen if they get detached while IO is in
  progress.  Because device_busy() propagates up to parents, marking the slave
  device busy while it owns the bus solves both kinds of problems that come
  with detaching i2c devices while IO is in progress.
  
  r348166:
  Release the bus-recovery gpio pins in detach(), so that unload then
  reload of the module works without "pin already allocated" errors.

Modified:
  stable/12/sys/arm/freescale/imx/imx_i2c.c
  stable/12/sys/dev/iicbus/iiconf.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/arm/freescale/imx/imx_i2c.c
==============================================================================
--- stable/12/sys/arm/freescale/imx/imx_i2c.c	Sun Jun 23 15:55:41 2019	(r349310)
+++ stable/12/sys/arm/freescale/imx/imx_i2c.c	Sun Jun 23 15:58:46 2019	(r349311)
@@ -194,6 +194,7 @@ DRIVER_MODULE(imx_i2c, simplebus, i2c_driver, i2c_devc
 DRIVER_MODULE(ofw_iicbus, imx_i2c, ofw_iicbus_driver, ofw_iicbus_devclass, 0, 0);
 MODULE_DEPEND(imx_i2c, iicbus, 1, 1, 1);
 MODULE_DEPEND(imx_i2c, ofw_iicbus, 1, 1, 1);
+SIMPLEBUS_PNP_INFO(compat_data);
 
 static phandle_t
 i2c_get_node(device_t bus, device_t dev)
@@ -467,6 +468,10 @@ i2c_detach(device_t dev)
 
 	if (sc->iicbus != NULL)
 		device_delete_child(dev, sc->iicbus);
+
+	/* Release bus-recover pins; gpio_pin_release() handles NULL args. */
+	gpio_pin_release(sc->rb_sclpin);
+	gpio_pin_release(sc->rb_sdapin);
 
 	if (sc->res != NULL)
 		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res);

Modified: stable/12/sys/dev/iicbus/iiconf.c
==============================================================================
--- stable/12/sys/dev/iicbus/iiconf.c	Sun Jun 23 15:55:41 2019	(r349310)
+++ stable/12/sys/dev/iicbus/iiconf.c	Sun Jun 23 15:58:46 2019	(r349311)
@@ -128,6 +128,12 @@ iicbus_request_bus(device_t bus, device_t dev, int how
 		++sc->owncount;
 		if (sc->owner == NULL) {
 			sc->owner = dev;
+			/*
+			 * Mark the device busy while it owns the bus, to
+			 * prevent detaching the device, bus, or hardware
+			 * controller, until ownership is relinquished.
+			 */
+			device_busy(dev);
 			/* 
 			 * Drop the lock around the call to the bus driver, it
 			 * should be allowed to sleep in the IIC_WAIT case.
@@ -177,6 +183,7 @@ iicbus_release_bus(device_t bus, device_t dev)
 		IICBUS_LOCK(sc);
 		sc->owner = NULL;
 		wakeup_one(sc);
+		device_unbusy(dev);
 	}
 	IICBUS_UNLOCK(sc);
 	return (0);


More information about the svn-src-all mailing list