svn commit: r355727 - in head: share/man/man9 sys/arm/broadcom/bcm2835 sys/arm/freescale/imx sys/arm/mv sys/arm/ti sys/dev/glxiic sys/dev/ichsmb sys/dev/ow sys/kern sys/sys

Warner Losh imp at FreeBSD.org
Fri Dec 13 19:39:37 UTC 2019


Author: imp
Date: Fri Dec 13 19:39:33 2019
New Revision: 355727
URL: https://svnweb.freebsd.org/changeset/base/355727

Log:
  Create new wrapper function: bus_delayed_attach_children()
  
  Delay the attachment of children, when requested, until after interrutps are
  running. This is often needed to allow children to run transactions on i2c or
  spi busses. It's a common enough idiom that it will be useful to have its own
  wrapper.
  
  Reviewed by: ian
  Differential Revision: https://reviews.freebsd.org/D21465

Added:
  head/share/man/man9/bus_delayed_attach_children.9   (contents, props changed)
Modified:
  head/share/man/man9/Makefile
  head/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
  head/sys/arm/freescale/imx/imx_i2c.c
  head/sys/arm/freescale/imx/imx_spi.c
  head/sys/arm/mv/a37x0_spi.c
  head/sys/arm/mv/mv_spi.c
  head/sys/arm/ti/ti_i2c.c
  head/sys/dev/glxiic/glxiic.c
  head/sys/dev/ichsmb/ichsmb.c
  head/sys/dev/ow/owc_gpiobus.c
  head/sys/kern/subr_bus.c
  head/sys/sys/bus.h

Modified: head/share/man/man9/Makefile
==============================================================================
--- head/share/man/man9/Makefile	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/share/man/man9/Makefile	Fri Dec 13 19:39:33 2019	(r355727)
@@ -34,6 +34,7 @@ MAN=	accept_filter.9 \
 	BUS_CHILD_DELETED.9 \
 	BUS_CHILD_DETACHED.9 \
 	BUS_CONFIG_INTR.9 \
+	bus_delayed_attach_children.9 \
 	BUS_DESCRIBE_INTR.9 \
 	bus_dma.9 \
 	bus_generic_attach.9 \

Added: head/share/man/man9/bus_delayed_attach_children.9
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/man/man9/bus_delayed_attach_children.9	Fri Dec 13 19:39:33 2019	(r355727)
@@ -0,0 +1,55 @@
+.\" -*- nroff -*-
+.\"
+.\" Copyright (c) 2019 M. Warner Losh
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd August 29, 2019
+.Dt BUS_DELAYED_ATTACH_CHILDREN 9
+.Os
+.Sh NAME
+.Nm bus_delayed_attach_children
+.Nd "request that the children be attached when interrupts are enabled"
+.Sh SYNOPSIS
+.In sys/param.h
+.In sys/bus.h
+.Pp
+.Ft int
+.Fn bus_delayed_attach_children "device_t dev"
+.Sh DESCRIPTION
+The
+.Fn bus_delayed_attach_children
+function requests that the children of this device
+be attached when interrupts are running.
+If interrupts are currently running, this happens immediately.
+If interrupts aren't yet running, this happens after interrupts are enabled, but
+before the system mounts root.
+.Sh RETURN VALUES
+A zero return value indicates success.
+.Sh SEE ALSO
+.Xr bus 9 ,
+.Xr device 9 ,
+.Xr driver 9
+.Sh AUTHORS
+This manual page was written by
+.An Warner Losh Aq Mt imp at FreeBSD.org .

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_bsc.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_bsc.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -347,7 +347,7 @@ bcm_bsc_attach(device_t dev)
 	}
 
 	/* Probe and attach the iicbus when interrupts are available. */
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
+	bus_delayed_attach_children(dev);
 
 	return (0);
 }

Modified: head/sys/arm/freescale/imx/imx_i2c.c
==============================================================================
--- head/sys/arm/freescale/imx/imx_i2c.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/arm/freescale/imx/imx_i2c.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -449,8 +449,7 @@ no_recovery:
 	/* We don't do a hardware reset here because iicbus_attach() does it. */
 
 	/* Probe and attach the iicbus when interrupts are available. */
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
-	return (0);
+	return (bus_delayed_attach_children(dev));
 }
 
 static int

Modified: head/sys/arm/freescale/imx/imx_spi.c
==============================================================================
--- head/sys/arm/freescale/imx/imx_spi.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/arm/freescale/imx/imx_spi.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -566,9 +566,7 @@ spi_attach(device_t dev)
 	 * their attach. We can't do IO until timers and interrupts are working.
 	 */
 	sc->spibus = device_add_child(dev, "spibus", -1);
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
-
-	return (0);
+	return (bus_delayed_attach_children(dev));
 }
 
 static int

Modified: head/sys/arm/mv/a37x0_spi.c
==============================================================================
--- head/sys/arm/mv/a37x0_spi.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/arm/mv/a37x0_spi.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -220,7 +220,7 @@ a37x0_spi_attach(device_t dev)
 	device_add_child(dev, "spibus", -1);
 
 	/* Probe and attach the spibus when interrupts are available. */
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
+	bus_delayed_attach_children(dev);
 
 	return (0);
 }

Modified: head/sys/arm/mv/mv_spi.c
==============================================================================
--- head/sys/arm/mv/mv_spi.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/arm/mv/mv_spi.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -174,9 +174,7 @@ mv_spi_attach(device_t dev)
 	device_add_child(dev, "spibus", -1);
 
 	/* Probe and attach the spibus when interrupts are available. */
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
-
-	return (0);
+	return (bus_delayed_attach_children(dev));
 }
 
 static int

Modified: head/sys/arm/ti/ti_i2c.c
==============================================================================
--- head/sys/arm/ti/ti_i2c.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/arm/ti/ti_i2c.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -905,7 +905,7 @@ ti_i2c_attach(device_t dev)
 	}
 
 	/* Probe and attach the iicbus when interrupts are available. */
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
+	err = bus_delayed_attach_children(dev);
 
 out:
 	if (err) {

Modified: head/sys/dev/glxiic/glxiic.c
==============================================================================
--- head/sys/dev/glxiic/glxiic.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/dev/glxiic/glxiic.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -411,8 +411,7 @@ glxiic_attach(device_t dev)
 	glxiic_smb_enable(sc, IIC_FASTEST, 0);
 
 	/* Probe and attach the iicbus when interrupts are available. */
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
-	error = 0;
+	error = bus_delayed_attach_children(dev);
 
 out:
 	if (error != 0) {

Modified: head/sys/dev/ichsmb/ichsmb.c
==============================================================================
--- head/sys/dev/ichsmb/ichsmb.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/dev/ichsmb/ichsmb.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -131,11 +131,8 @@ ichsmb_attach(device_t dev)
 		goto fail;
 	}
 
-	/* Probe and attach the smbus when interrupts are available */
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
-
-	return (0);
-
+	/* Attach children when interrupts are available */
+	return (bus_delayed_attach_children(dev));
 fail:
 	mtx_destroy(&sc->mutex);
 	return (error);

Modified: head/sys/dev/ow/owc_gpiobus.c
==============================================================================
--- head/sys/dev/ow/owc_gpiobus.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/dev/ow/owc_gpiobus.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -131,7 +131,7 @@ owc_gpiobus_attach(device_t dev)
 		free(kids, M_TEMP);
 	if (nkid == 0)
 		device_add_child(dev, "ow", -1);
-	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
+	bus_delayed_attach_children(dev);
 
 	return (0);
 }

Modified: head/sys/kern/subr_bus.c
==============================================================================
--- head/sys/kern/subr_bus.c	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/kern/subr_bus.c	Fri Dec 13 19:39:33 2019	(r355727)
@@ -3753,6 +3753,22 @@ bus_generic_attach(device_t dev)
 }
 
 /**
+ * @brief Helper function for delaying attaching children
+ *
+ * Many buses can't run transactions on the bus which children need to probe and
+ * attach until after interrupts and/or timers are running.  This function
+ * delays their attach until interrupts and timers are enabled.
+ */
+int
+bus_delayed_attach_children(device_t dev)
+{
+	/* Probe and attach the bus children when interrupts are available */
+	config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
+
+	return (0);
+}
+
+/**
  * @brief Helper function for implementing DEVICE_DETACH()
  *
  * This function can be used to help implement the DEVICE_DETACH() for

Modified: head/sys/sys/bus.h
==============================================================================
--- head/sys/sys/bus.h	Fri Dec 13 19:27:51 2019	(r355726)
+++ head/sys/sys/bus.h	Fri Dec 13 19:39:33 2019	(r355727)
@@ -567,6 +567,7 @@ int	bus_child_present(device_t child);
 int	bus_child_pnpinfo_str(device_t child, char *buf, size_t buflen);
 int	bus_child_location_str(device_t child, char *buf, size_t buflen);
 void	bus_enumerate_hinted_children(device_t bus);
+int	bus_delayed_attach_children(device_t bus);
 
 static __inline struct resource *
 bus_alloc_resource_any(device_t dev, int type, int *rid, u_int flags)


More information about the svn-src-head mailing list