freebsd-dev/sys/conf
Ian Lepore 422d05da14 Add support for i2c bus mux hardware.
An i2c bus can be divided into segments which can be selectively connected
and disconnected from the main bus. This is usually done to enable using
multiple slave devices having the same address, by isolating the devices
onto separate bus segments, only one of which is connected to the main bus
at once.

There are several types of i2c bus muxes, which break down into two general
categories...

 - Muxes which are themselves i2c slaves. These devices respond to i2c
   commands on their upstream bus, and based on those commands, connect
   various downstream buses to the upstream. In newbus terms, they are both
   a child of an iicbus and the parent of one or more iicbus instances.
 - Muxes which are not i2c devices themselves. Such devices are part of the
   i2c bus electrically, but in newbus terms their parent is some other
   bus. The association with the upstream bus must be established by
   separate metadata (such as FDT data).

In both cases, the mux driver has one or more iicbus child instances
representing the downstream buses. The mux driver implements the iicbus_if
interface, as if it were an iichb host bridge/i2c controller driver. It
services the IO requests sent to it by forwarding them to the iicbus
instance representing the upstream bus, after electrically connecting the
upstream bus to the downstream bus that hosts the i2c slave device which
made the IO request.

The net effect is automatic mux switching which is transparent to slaves on
the downstream buses. They just do i2c IO they way they normally do, and the
bus is electrically connected for the duration of the IO and then idled when
it is complete.

The existing iicbus_if callback() method is enhanced so that the parameter
passed to it can be a struct which contains a device_t for the requesting
bus and slave devices. This change is done by adding a flag that indicates
the extra values are present, and making the flags field the first field of
a new args struct. If the flag is set, the iichb or mux driver can recast
the pointer-to-flags into a pointer-to-struct and access the extra
fields. Thus abi compatibility with older drivers is retained (but a mux
cannot exist on the bus with the older iicbus driver in use.)

A new set of core support routines exists in iicbus.c. This code will help
implement mux drivers for any type of mux hardware by supplying all the
boilerplate code that forwards IO requests upstream. It also has code for
parsing metadata and instantiating the child iicbus instances based on it.

Two new hardware mux drivers are added. The ltc430x driver supports the
LTC4305/4306 mux chips which are controlled via i2c commands. The
iic_gpiomux driver supports any mux hardware which is controlled by
manipulating the state of one or more gpio pins.  Test Plan

Tested locally using a variety of mux'd bus configurations involving both
ltc4305 and a homebrew gpio-controlled mux. Tested configurations included
cascaded muxes (unlikely in the real world, but useful to prove that 'it all
just works' in terms of the automatic switching and upstream forwarding of
IO requests).
2020-01-02 17:51:49 +00:00
..
config.mk Add comments about KERN_OPT here. 2019-07-19 17:48:29 +00:00
dtb.build.mk Introduce bsd.sysdir.mk to consolidate looking for the kernel. 2019-11-21 15:59:33 +00:00
dtb.mk Allow kernel config to specify DTS/DTSO to build, and out-of-tree support 2019-03-26 02:45:23 +00:00
files Add support for i2c bus mux hardware. 2020-01-02 17:51:49 +00:00
files.amd64 Remove sio(4). 2019-11-21 01:24:49 +00:00
files.arm Compile in arm/unwind.c if options STACK is in effect; the new arm stack(9) 2019-11-14 17:04:19 +00:00
files.arm64 arm64: rockchip: Add driver for the io domain 2019-12-28 15:30:50 +00:00
files.i386 Remove sio(4). 2019-11-21 01:24:49 +00:00
files.mips Add support for BERI statcounters. 2019-09-18 16:13:50 +00:00
files.powerpc powerpc: Only build mpc85xx i2c driver for mpc85xx 2019-12-21 04:44:17 +00:00
files.riscv RISC-V: add support for SBI spec v0.2 2019-11-15 03:34:27 +00:00
files.sparc64 emulate illumos membar_producer with atomic_thread_fence_rel 2019-10-10 07:39:41 +00:00
files.x86 Move all the sys/dev/[a-j]* that are common to files.x86 2019-10-30 19:53:46 +00:00
kern.mk gcc9: quiet Waddress-of-packed-member for kernel build 2019-12-21 02:43:37 +00:00
kern.opts.mk Disable REPRODUCIBLE_BUILD for kernel builds. 2019-09-28 14:14:42 +00:00
kern.post.mk Port the NetBSD KCSAN runtime to FreeBSD. 2019-11-21 11:22:08 +00:00
kern.pre.mk In kern.pre.mk, split SYSTEM_LD into two variables to avoid duplication in 2019-12-25 22:33:47 +00:00
kmod_syms_prefix.awk Add the infrastructure to support loading multiple versions of TCP 2017-06-08 20:41:28 +00:00
kmod_syms.awk
kmod.mk [PowerPC] Switch to PIC kernel modules on powerpc* 2019-12-27 04:07:51 +00:00
kmod.opts.mk Add a kmod.opts.mk. 2019-11-21 18:14:26 +00:00
ldscript.amd64 Tighten mapping protections on preloaded files on amd64. 2019-10-18 14:05:13 +00:00
ldscript.arm Eliminate the generated ldscript for arm and arm64, and strip $a/$d marker 2019-12-29 18:17:12 +00:00
ldscript.arm64 Eliminate the generated ldscript for arm and arm64, and strip $a/$d marker 2019-12-29 18:17:12 +00:00
ldscript.i386 Expose the kernel's build-ID through sysctl 2019-06-04 13:07:10 +00:00
ldscript.kmod.amd64 Add an ldscript for amd64 kernel modules. 2019-10-17 21:39:23 +00:00
ldscript.kmod.i386 Formalize the use of linker scripts for kernel modules. 2019-10-16 22:19:56 +00:00
ldscript.mips Expose the kernel's build-ID through sysctl 2019-06-04 13:07:10 +00:00
ldscript.mips.cfe Expose the kernel's build-ID through sysctl 2019-06-04 13:07:10 +00:00
ldscript.mips.mips64 Expose the kernel's build-ID through sysctl 2019-06-04 13:07:10 +00:00
ldscript.mips.octeon1 Expose the kernel's build-ID through sysctl 2019-06-04 13:07:10 +00:00
ldscript.powerpc powerpc: Kernel fixes for ppc32 and powerpcspe w/ lld 2019-11-14 04:34:17 +00:00
ldscript.powerpc64 Expose the kernel's build-ID through sysctl 2019-06-04 13:07:10 +00:00
ldscript.powerpcspe powerpc: Kernel fixes for ppc32 and powerpcspe w/ lld 2019-11-14 04:34:17 +00:00
ldscript.riscv riscv: Ensure that BSS is 8-byte aligned 2019-09-09 15:57:24 +00:00
ldscript.sparc64 Expose the kernel's build-ID through sysctl 2019-06-04 13:07:10 +00:00
Makefile.amd64 Retire CLANG_NO_IAS34 2018-11-01 23:11:47 +00:00
Makefile.arm Set a "kernbase" symbol in 32-bit arm locore.S and use it with ldscript.arm. 2019-12-30 23:20:46 +00:00
Makefile.arm64 Eliminate the generated ldscript for arm and arm64, and strip $a/$d marker 2019-12-29 18:17:12 +00:00
Makefile.i386 Retire CLANG_NO_IAS34 2018-11-01 23:11:47 +00:00
Makefile.mips Update MIPS kernel builds to work with mips-gcc. 2019-10-15 17:11:42 +00:00
Makefile.powerpc [PowerPC] Clang powerpcspe build fixes 2019-12-27 05:01:13 +00:00
Makefile.riscv Revert r356077, apparently the change doesn't work after all (failed to 2019-12-25 18:24:38 +00:00
Makefile.sparc64 Revert r336353 completely based on protest; compatibility shims incoming 2018-07-17 14:11:30 +00:00
makeLINT.mk stop building arm LINT-V5 kernel 2019-11-26 20:46:20 +00:00
makeLINT.sed
newvers.sh newvers: append commit count to uname version string 2019-08-01 14:13:04 +00:00
NOTES Add support for i2c bus mux hardware. 2020-01-02 17:51:49 +00:00
options Port the NetBSD KCSAN runtime to FreeBSD. 2019-11-21 11:22:08 +00:00
options.amd64 Remove iBCS2, part2: general kernel 2018-12-19 21:57:58 +00:00
options.arm arm: add SOC_BRCM_BCM2837 option, include it in GENERIC 2019-12-17 23:01:37 +00:00
options.arm64 Add support for booting kernel directly from U-Boot using booti command. 2019-12-07 16:14:23 +00:00
options.i386 i386: Merge PAE and non-PAE pmaps into same kernel. 2019-01-30 02:07:13 +00:00
options.mips Add SMP support for BERI CPU. 2018-04-12 17:43:19 +00:00
options.powerpc powerpc: Add AmigaOne platform, a subclass of MPC85xx 2019-10-16 00:38:50 +00:00
options.riscv o Add driver for PLIC (Platform-Level Interrupt Controller) device. 2018-06-12 17:45:15 +00:00
options.sparc64
systags.sh sys: further adoption of SPDX licensing ID tags. 2017-11-20 19:43:44 +00:00
WITHOUT_SOURCELESS
WITHOUT_SOURCELESS_HOST
WITHOUT_SOURCELESS_UCODE Remove adv(4) and adw(4) 2018-10-22 02:34:47 +00:00