Message ID | 20240611-dev-mule-i2c-mux-v3-0-08d26a28e001@cherry.de (mailing list archive) |
---|---|
Headers | show |
Series | Add Mule I2C multiplexer support | expand |
On Tue, 11 Jun 2024 13:43:51 +0200, Farouk Bouabid wrote: > 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@cherry.de> > > 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@cherry.de > > 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@theobroma-systems.com > > --- > 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@cherry.de> > > > My bot found new DTB warnings on the .dts files added or changed in this series. Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings are fixed by another series. Ultimately, it is up to the platform maintainer whether these warnings are acceptable or not. No need to reply unless the platform maintainer has comments. If you already ran DT checks and didn't see these error(s), then make sure dt-schema is up to date: pip3 install dtschema --upgrade New warnings running 'make CHECK_DTBS=y rockchip/rk3588-jaguar.dtb' for 20240611-dev-mule-i2c-mux-v3-0-08d26a28e001@cherry.de: arch/arm64/boot/dts/rockchip/rk3588-jaguar.dtb: fan@18: '#cooling-cells' does not match any of the regexes: 'pinctrl-[0-9]+' from schema $id: http://devicetree.org/schemas/trivial-devices.yaml#
Hi Farouk, first of all, thanks for the patches and tackling this problem. I have to say that I have many concerns on high-level, though. I hope to be able to give helpful recommendations. > Mule is an mcu that emulates a set of I2C devices which are reachable > through an I2C-mux. I am not 100% convinced this is really a mux. Another possible DT representation could be (pseudo-code): i2c-bus { mpu@42 { comptible = "mule"; reg = <0x42>; subdev@0 { compatible = "subdev" reg = <0x00>; } subdev@1 { ... } } Dunno if MFD can handle that. Maybe someone else knows? If all fails, I think you could write an I2C mux-driver which uses the above DT snippet. It should then do: - write the mule config register according to 'reg' of the subdev - replace 'addr' in all 'i2c_msgs' to the addr of the parent mule device - i2ctransfer - restore 'addr' in all 'i2c_msgs' to the original addr A little simiar of what i2c-atr.c does, check Documentation/i2c/i2c-address-translators.rst > 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): This design is... unfortunate, if you ask me. But well, things happen. > 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. Not acceptable, sorry. The adapter itself is fine, so this is clearly not an adapter quirk. The client is what is quirky. I don't want to maintain patch 1 because of this one "creative" design of a client. I think we can handle it outside of the I2C core. So far understandable? Happy hacking, Wolfram
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@cherry.de> 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@cherry.de 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@theobroma-systems.com --- 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,