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

Ravi Pokala rpokala at freebsd.org
Fri Dec 13 20:01:22 UTC 2019


Hi Warner,

This change takes a bunch of cases of

> config_intrhook_oneshot((ich_func_t)bus_generic_attach, dev);
> return (0)

And replaces them with a *mix* of:

> return (bus_delayed_attach_children(dev));

and

> bus_delayed_attach_children(dev);
> return (0)

Why the two different idioms?

Thanks,

Ravi (rpokala@)

-----Original Message-----
From: <owner-src-committers at freebsd.org> on behalf of Warner Losh <imp at FreeBSD.org>
Date: 2019-12-13, Friday at 11:39
To: <src-committers at freebsd.org>, <svn-src-all at freebsd.org>, <svn-src-head at freebsd.org>
Subject: 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

    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