Mule is an mcu that emulates a set of I2C devices which are reachable through an I2C-mux. The emulated devices share a single I2C address with the mux itself where the requested register is what determines which logic is executed (muxing logic or device logic): 1- The devices on the mux can be selected (muxing functionality) by writing the appropriate device number to an I2C config register (0xff) that is not used by any device logic. 2- Any access to a register other than the config register will be handled by the previously selected device. +-------------------------------------------------------+ | Mule | | +---------------+ | ----+-(1)->|Config register|-----+ | | | +---------------+ | | | | V_ | | | | \ +--------+ | | | | \-------->| dev #0 | | | | | | +--------+ | | | | M |-------->| dev #1 | | | +-----------(2)------------->| U | +--------+ | | | X |-------->| dev #2 | | | | | +--------+ | | | /-------->| dev #3 | | | |__/ +--------+ | +-------------------------------------------------------+ The current I2C-mux implementation does not allow the mux to use the I2C address of a child device. As a workaround, A new I2C-adapter quirk is introduced to skip the check for conflict between a child device and the mux core I2C address when adding the child device. This patch-series adds support for this multiplexer. Mule is integrated as part of rk3399-puma, px30-ringneck, rk3588-tiger and rk3588-jaguar boards. Signed-off-by: Farouk Bouabid <farouk.bouabid@xxxxxxxxx> Changes in v3: - Change "i2c" in comments/commit-logs to "I2C" - Fix long line-length - Warn when "share_addr_with_children" is set and the Mux is not an I2C device - Fix/stop propagating "I2C_AQ_SKIP_ADDR_CHECK" flag if "share_addr_with_children" is not set. - Fix "old_fw" variable is used to indicate the reversed meaning. - Link to v2: https://lore.kernel.org/r/20240506-dev-mule-i2c-mux-v2-0-a91c954f65d7@xxxxxxxxx Changes in v2: - Add i2c-adapter quirks to skip checking for conflict between the mux core and a child device address. - Rename dt-binding to "tsd,mule-i2c-mux.yaml" - Add Mule description to kconfig - Fix indentation - Move device table after probe - Link to v1: https://lore.kernel.org/r/20240426-dev-mule-i2c-mux-v1-0-045a482f6ffb@xxxxxxxxxxxxxxxxxxxxx --- Farouk Bouabid (7): i2c: mux: add the ability to share mux address with child nodes dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer i2c: muxes: add support for mule i2c multiplexer arm64: dts: rockchip: add mule i2c mux (0x18) on rk3399-puma arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-tiger arm64: dts: rockchip: add mule i2c mux (0x18) on px30-ringneck arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-jaguar .../devicetree/bindings/i2c/tsd,mule-i2c-mux.yaml | 80 +++++++++++ arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi | 20 ++- arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 20 ++- arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts | 19 ++- arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi | 19 ++- drivers/i2c/i2c-core-base.c | 6 +- drivers/i2c/i2c-mux.c | 48 ++++++- drivers/i2c/muxes/Kconfig | 18 +++ drivers/i2c/muxes/Makefile | 1 + drivers/i2c/muxes/i2c-mux-mule.c | 157 +++++++++++++++++++++ include/linux/i2c-mux.h | 1 + include/linux/i2c.h | 7 + 12 files changed, 384 insertions(+), 12 deletions(-) --- base-commit: 79c1f584335af42ce359ee3ff0f4e9cc324296ed change-id: 20240404-dev-mule-i2c-mux-9103cde07021 Best regards, -- Farouk Bouabid <farouk.bouabid@xxxxxxxxx>