linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/7] Add Mule I2C multiplexer support
@ 2024-06-11 11:43 Farouk Bouabid
  2024-06-11 11:43 ` [PATCH v3 1/7] i2c: mux: add the ability to share mux address with child nodes Farouk Bouabid
                   ` (8 more replies)
  0 siblings, 9 replies; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 11:43 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Farouk Bouabid, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

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>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 1/7] i2c: mux: add the ability to share mux address with child nodes
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
@ 2024-06-11 11:43 ` Farouk Bouabid
  2024-06-11 18:01   ` Christophe JAILLET
  2024-06-11 11:43 ` [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer Farouk Bouabid
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 11:43 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Farouk Bouabid, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

Allow the mux (if it's an I2C device) to have the same address as a child
device. This is useful when the mux can only use an I2C address that is
used by a child device because no other addresses are free to use.
eg. the mux can only use address 0x18 which is used by amc6821 connected
to the mux.

Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
---
 drivers/i2c/i2c-core-base.c |  6 +++++-
 drivers/i2c/i2c-mux.c       | 48 ++++++++++++++++++++++++++++++++++++++++++++-
 include/linux/i2c-mux.h     |  1 +
 include/linux/i2c.h         |  7 +++++++
 4 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index ff5c486a1dbb..ce2425b0486d 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -821,9 +821,13 @@ static int i2c_check_mux_children(struct device *dev, void *addrp)
 static int i2c_check_addr_busy(struct i2c_adapter *adapter, int addr)
 {
 	struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter);
+	bool skip_check = false;
 	int result = 0;
 
-	if (parent)
+	if (adapter->quirks && adapter->quirks->flags & I2C_AQ_SKIP_ADDR_CHECK)
+		skip_check = adapter->quirks->skip_addr_in_parent == addr;
+
+	if (parent && !skip_check)
 		result = i2c_check_mux_parents(parent, addr);
 
 	if (!result)
diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c
index 57ff09f18c37..644509bc3496 100644
--- a/drivers/i2c/i2c-mux.c
+++ b/drivers/i2c/i2c-mux.c
@@ -334,7 +334,53 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc,
 	priv->adap.dev.parent = &parent->dev;
 	priv->adap.retries = parent->retries;
 	priv->adap.timeout = parent->timeout;
-	priv->adap.quirks = parent->quirks;
+
+	struct i2c_adapter_quirks *quirks;
+	/*
+	 * When creating the adapter, the node devices are checked for I2C address
+	 * match with other devices on the parent adapter, among which is the mux itself.
+	 * If a match is found the node device is not probed successfully.
+	 * Allow the mux to have the same address as a child device by skipping this check.
+	 */
+	if (muxc->share_addr_with_children) {
+		struct i2c_client *client = to_i2c_client(muxc->dev);
+
+		if (muxc->dev->type != &i2c_client_type)
+			dev_warn_once(muxc->dev, "Mux is not an I2C device\n");
+
+		quirks = devm_kzalloc(muxc->dev, sizeof(*quirks), GFP_KERNEL);
+		if (!quirks)
+			return -ENOMEM;
+
+		if (parent->quirks)
+			memcpy(quirks, parent->quirks, sizeof(*quirks));
+
+		quirks->flags |= I2C_AQ_SKIP_ADDR_CHECK;
+		quirks->skip_addr_in_parent = client->addr;
+		priv->adap.quirks = quirks;
+
+	} else if (parent->quirks &&
+		   parent->quirks->flags & I2C_AQ_SKIP_ADDR_CHECK) {
+		/*
+		 * Another I2C mux device can be a child of the Mule I2C mux.
+		 * The former could probably not allow address conflict between
+		 * its address and its own children addresses.
+		 *
+		 * For this purpose, do not propagate this flag unless
+		 * share_addr_with_children is set.
+		 */
+		quirks = devm_kzalloc(muxc->dev, sizeof(*quirks), GFP_KERNEL);
+		if (!quirks)
+			return -ENOMEM;
+
+		memcpy(quirks, parent->quirks, sizeof(*quirks));
+		quirks->flags &= ~I2C_AQ_SKIP_ADDR_CHECK;
+		priv->adap.quirks = quirks;
+
+	} else {
+		priv->adap.quirks = parent->quirks;
+	}
+
 	if (muxc->mux_locked)
 		priv->adap.lock_ops = &i2c_mux_lock_ops;
 	else
diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h
index 98ef73b7c8fd..17ac68bf1703 100644
--- a/include/linux/i2c-mux.h
+++ b/include/linux/i2c-mux.h
@@ -21,6 +21,7 @@ struct i2c_mux_core {
 	unsigned int mux_locked:1;
 	unsigned int arbitrator:1;
 	unsigned int gate:1;
+	unsigned int share_addr_with_children:1;
 
 	void *priv;
 
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index 5e6cd43a6dbd..c3acbaaadae9 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -670,6 +670,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap);
  * @max_read_len: maximum length of a read message
  * @max_comb_1st_msg_len: maximum length of the first msg in a combined message
  * @max_comb_2nd_msg_len: maximum length of the second msg in a combined message
+ * @skip_addr_in_parent: No conflict check on parent adapter for a given address
  *
  * Note about combined messages: Some I2C controllers can only send one message
  * per transfer, plus something called combined message or write-then-read.
@@ -690,6 +691,7 @@ struct i2c_adapter_quirks {
 	u16 max_read_len;
 	u16 max_comb_1st_msg_len;
 	u16 max_comb_2nd_msg_len;
+	unsigned short skip_addr_in_parent;
 };
 
 /* enforce max_num_msgs = 2 and use max_comb_*_len for length checks */
@@ -711,6 +713,11 @@ struct i2c_adapter_quirks {
 #define I2C_AQ_NO_ZERO_LEN		(I2C_AQ_NO_ZERO_LEN_READ | I2C_AQ_NO_ZERO_LEN_WRITE)
 /* adapter cannot do repeated START */
 #define I2C_AQ_NO_REP_START		BIT(7)
+/**
+ * do not check for conflict on a given address
+ * used accordingly with "struct i2c_adapter_quirks.skip_addr_in_parent"
+ */
+#define I2C_AQ_SKIP_ADDR_CHECK	BIT(8)
 
 /*
  * i2c_adapter is the structure used to identify a physical i2c bus along

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
  2024-06-11 11:43 ` [PATCH v3 1/7] i2c: mux: add the ability to share mux address with child nodes Farouk Bouabid
@ 2024-06-11 11:43 ` Farouk Bouabid
  2024-06-11 13:32   ` Rob Herring (Arm)
  2024-06-13  9:14   ` Krzysztof Kozlowski
  2024-06-11 11:43 ` [PATCH v3 3/7] i2c: muxes: add support " Farouk Bouabid
                   ` (6 subsequent siblings)
  8 siblings, 2 replies; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 11:43 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Farouk Bouabid, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

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
(mux logic or device logic).

Add support for the Mule I2C multiplexer bindings.

Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
---
 .../devicetree/bindings/i2c/tsd,mule-i2c-mux.yaml  | 80 ++++++++++++++++++++++
 1 file changed, 80 insertions(+)

diff --git a/Documentation/devicetree/bindings/i2c/tsd,mule-i2c-mux.yaml b/Documentation/devicetree/bindings/i2c/tsd,mule-i2c-mux.yaml
new file mode 100644
index 000000000000..b7bb13549027
--- /dev/null
+++ b/Documentation/devicetree/bindings/i2c/tsd,mule-i2c-mux.yaml
@@ -0,0 +1,80 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/i2c/tsd,mule-i2c-mux.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mule I2C multiplexer
+
+maintainers:
+  - Farouk Bouabid <farouk.bouabid@cherry.de>
+  - Quentin Schulz <quentin.schulz@cherry.de>
+
+description: |
+  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
+  (mux logic or device logic)
+
+      +--------------------------------------------------+
+      | Mule                                             |
+      |    +---------------+                             |
+  ------+->|Config register|----+                        |
+      | |  +---------------+    |                        |
+      | |                       V_                       |
+      | |                      |  \          +--------+  |
+      | |                      |   \-------->| dev #0 |  |
+      | |                      |   |         +--------+  |
+      | |                      | M |-------->| dev #1 |  |
+      | +--------------------->| U |         +--------+  |
+      |                        | X |-------->| dev #2 |  |
+      |                        |   |         +--------+  |
+      |                        |   /-------->| dev #3 |  |
+      |                        |__/          +--------+  |
+      +--------------------------------------------------+
+
+
+allOf:
+  - $ref: /schemas/i2c/i2c-mux.yaml#
+
+properties:
+  compatible:
+    const: tsd,mule-i2c-mux
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    i2c {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        i2c-mux@18 {
+            compatible = "tsd,mule-i2c-mux";
+            reg = <0x18>;
+            #address-cells = <1>;
+            #size-cells = <0>;
+
+            i2c@0 {
+                reg = <0x0>;
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                fan: fan@18 {
+                  compatible = "ti,amc6821";
+                  reg = <0x18>;
+                  #cooling-cells = <2>;
+                };
+            };
+        };
+    };
+...

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 3/7] i2c: muxes: add support for mule i2c multiplexer
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
  2024-06-11 11:43 ` [PATCH v3 1/7] i2c: mux: add the ability to share mux address with child nodes Farouk Bouabid
  2024-06-11 11:43 ` [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer Farouk Bouabid
@ 2024-06-11 11:43 ` Farouk Bouabid
  2024-06-11 16:52   ` Farouk Bouabid
  2024-06-11 17:56   ` Christophe JAILLET
  2024-06-11 11:43 ` [PATCH v3 4/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3399-puma Farouk Bouabid
                   ` (5 subsequent siblings)
  8 siblings, 2 replies; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 11:43 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Farouk Bouabid, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

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
(mux logic or device logic):

1- The devices on the mux can be selected (mux function) 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.

Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
---
 drivers/i2c/muxes/Kconfig        |  18 +++++
 drivers/i2c/muxes/Makefile       |   1 +
 drivers/i2c/muxes/i2c-mux-mule.c | 157 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 176 insertions(+)

diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig
index db1b9057612a..70876259796d 100644
--- a/drivers/i2c/muxes/Kconfig
+++ b/drivers/i2c/muxes/Kconfig
@@ -119,4 +119,22 @@ config I2C_MUX_MLXCPLD
 	  This driver can also be built as a module.  If so, the module
 	  will be called i2c-mux-mlxcpld.
 
+config I2C_MUX_MULE
+	tristate "Mule I2C device multiplexer"
+	depends on OF
+	help
+	  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
+	  (mux logic or device logic).
+
+	  If you say yes to this option, support will be included for a
+	  Mule I2C device multiplexer. This driver provides access to
+	  I2C devices connected on the Mule I2C mux.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called i2c-mux-mule.
+
 endmenu
diff --git a/drivers/i2c/muxes/Makefile b/drivers/i2c/muxes/Makefile
index 6d9d865e8518..4b24f49515a7 100644
--- a/drivers/i2c/muxes/Makefile
+++ b/drivers/i2c/muxes/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_I2C_MUX_GPIO)	+= i2c-mux-gpio.o
 obj-$(CONFIG_I2C_MUX_GPMUX)	+= i2c-mux-gpmux.o
 obj-$(CONFIG_I2C_MUX_LTC4306)	+= i2c-mux-ltc4306.o
 obj-$(CONFIG_I2C_MUX_MLXCPLD)	+= i2c-mux-mlxcpld.o
+obj-$(CONFIG_I2C_MUX_MULE)	+= i2c-mux-mule.o
 obj-$(CONFIG_I2C_MUX_PCA9541)	+= i2c-mux-pca9541.o
 obj-$(CONFIG_I2C_MUX_PCA954x)	+= i2c-mux-pca954x.o
 obj-$(CONFIG_I2C_MUX_PINCTRL)	+= i2c-mux-pinctrl.o
diff --git a/drivers/i2c/muxes/i2c-mux-mule.c b/drivers/i2c/muxes/i2c-mux-mule.c
new file mode 100644
index 000000000000..db27fa560995
--- /dev/null
+++ b/drivers/i2c/muxes/i2c-mux-mule.c
@@ -0,0 +1,157 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Mule I2C device multiplexer
+ *
+ * Copyright (C) 2024 Theobroma Systems Design und Consulting GmbH
+ */
+
+#include <linux/i2c-mux.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/property.h>
+#include <linux/regmap.h>
+
+#define MUX_CONFIG_REG  0xff
+#define MUX_DEFAULT_DEV 0x0
+
+struct mule_i2c_reg_mux {
+	struct regmap *regmap;
+};
+
+static const struct regmap_config mule_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+};
+
+static inline int __mux_select(struct regmap *regmap, u32 dev)
+{
+	return regmap_write(regmap, MUX_CONFIG_REG, dev);
+}
+
+static int mux_select(struct i2c_mux_core *muxc, u32 dev)
+{
+	struct mule_i2c_reg_mux *mux = muxc->priv;
+
+	return __mux_select(mux->regmap, dev);
+}
+
+static int mux_deselect(struct i2c_mux_core *muxc, u32 dev)
+{
+	return mux_select(muxc, MUX_DEFAULT_DEV);
+}
+
+static void mux_remove(void *data)
+{
+	struct i2c_mux_core *muxc = data;
+
+	i2c_mux_del_adapters(muxc);
+
+	mux_deselect(muxc, MUX_DEFAULT_DEV);
+}
+
+static int mule_i2c_mux_probe(struct i2c_client *client)
+{
+	struct i2c_adapter *adap = client->adapter;
+	struct mule_i2c_reg_mux *priv;
+	struct i2c_mux_core *muxc;
+	struct device_node *dev;
+	unsigned int readback;
+	int ndev, ret;
+	bool old_fw;
+
+	/* Count devices on the mux */
+	ndev = of_get_child_count(client->dev.of_node);
+	dev_dbg(&client->dev, "%u devices on the mux\n", ndev);
+
+	muxc = i2c_mux_alloc(adap, &client->dev,
+			     ndev, sizeof(*priv),
+			     I2C_MUX_LOCKED,
+			     mux_select, mux_deselect);
+	if (!muxc)
+		return -ENOMEM;
+
+	muxc->share_addr_with_children = 1;
+	priv = i2c_mux_priv(muxc);
+
+	priv->regmap = devm_regmap_init_i2c(client, &mule_regmap_config);
+	if (IS_ERR(priv->regmap))
+		return dev_err_probe(&client->dev, PTR_ERR(priv->regmap),
+				     "Failed to allocate i2c register map\n");
+
+	i2c_set_clientdata(client, muxc);
+
+	/*
+	 * Mux 0 is guaranteed to exist on all old and new mule fw.
+	 * mule fw without mux support will accept write ops to the
+	 * config register, but readback returns 0xff (register not updated).
+	 */
+	ret = mux_select(muxc, 0);
+	if (ret)
+		return ret;
+
+	ret = regmap_read(priv->regmap, MUX_CONFIG_REG, &readback);
+	if (ret)
+		return ret;
+
+	old_fw = (readback != 0);
+
+	ret = devm_add_action_or_reset(&client->dev, mux_remove, muxc);
+	if (ret)
+		return ret;
+
+	/* Create device adapters */
+	for_each_child_of_node(client->dev.of_node, dev) {
+		u32 reg;
+
+		ret = of_property_read_u32(dev, "reg", &reg);
+		if (ret) {
+			dev_err(&client->dev, "No reg property found for %s: %d\n",
+				of_node_full_name(dev), ret);
+			return ret;
+		}
+
+		if (old_fw && reg != 0) {
+			dev_warn(&client->dev,
+				 "Mux %d not supported, please update Mule FW\n", reg);
+			continue;
+		}
+
+		ret = mux_select(muxc, reg);
+		if (ret) {
+			dev_warn(&client->dev,
+				 "Mux %d not supported, please update Mule FW\n", reg);
+			continue;
+		}
+
+		ret = i2c_mux_add_adapter(muxc, 0, reg, 0);
+		if (ret) {
+			dev_err(&client->dev, "Failed to add i2c mux adapter %d: %d\n", reg, ret);
+			return ret;
+		}
+	}
+
+	mux_deselect(muxc, MUX_DEFAULT_DEV);
+
+	return 0;
+}
+
+static const struct of_device_id mule_i2c_mux_of_match[] = {
+	{.compatible = "tsd,mule-i2c-mux",},
+	{},
+};
+MODULE_DEVICE_TABLE(of, mule_i2c_mux_of_match);
+
+static struct i2c_driver mule_i2c_mux_driver = {
+	.driver		= {
+		.name	= "mule-i2c-mux",
+		.of_match_table = mule_i2c_mux_of_match,
+	},
+	.probe		= mule_i2c_mux_probe,
+};
+
+module_i2c_driver(mule_i2c_mux_driver);
+
+MODULE_AUTHOR("Farouk Bouabid <farouk.bouabid@cherry.de>");
+MODULE_DESCRIPTION("I2C mux driver for Mule");
+MODULE_LICENSE("GPL");

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 4/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3399-puma
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
                   ` (2 preceding siblings ...)
  2024-06-11 11:43 ` [PATCH v3 3/7] i2c: muxes: add support " Farouk Bouabid
@ 2024-06-11 11:43 ` Farouk Bouabid
  2024-06-11 11:43 ` [PATCH v3 5/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-tiger Farouk Bouabid
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 11:43 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Farouk Bouabid, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

Mule emulates an I2C mux (address 0x18). The amc6821 is exposed behind
this bus.

Add the mux node and amc6821 as a default device.

Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
---
 arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
index c08e69391c01..e7313be24c1a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
@@ -10,6 +10,7 @@
 / {
 	aliases {
 		ethernet0 = &gmac;
+		i2c10 = &i2c10;
 		mmc0 = &sdhci;
 	};
 
@@ -357,10 +358,23 @@ &i2c7 {
 	status = "okay";
 	clock-frequency = <400000>;
 
-	fan: fan@18 {
-		compatible = "ti,amc6821";
+	i2c-mux@18 {
+		compatible = "tsd,mule-i2c-mux";
 		reg = <0x18>;
-		#cooling-cells = <2>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		i2c10: i2c@0 {
+			reg = <0x0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			fan: fan@18 {
+				compatible = "ti,amc6821";
+				reg = <0x18>;
+				#cooling-cells = <2>;
+			};
+		};
 	};
 
 	rtc_twi: rtc@6f {

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 5/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-tiger
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
                   ` (3 preceding siblings ...)
  2024-06-11 11:43 ` [PATCH v3 4/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3399-puma Farouk Bouabid
@ 2024-06-11 11:43 ` Farouk Bouabid
  2024-06-11 11:43 ` [PATCH v3 6/7] arm64: dts: rockchip: add mule i2c mux (0x18) on px30-ringneck Farouk Bouabid
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 11:43 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Farouk Bouabid, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

Mule emulates an I2C mux (address 0x18). The amc6821 is exposed behind
this bus.

Add the mux node and amc6821 as a default device.

Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
---
 arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi
index 1eb2543a5fde..5ed7d51717bb 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi
@@ -12,6 +12,7 @@ / {
 	compatible = "tsd,rk3588-tiger", "rockchip,rk3588";
 
 	aliases {
+		i2c10 = &i2c10;
 		mmc0 = &sdhci;
 		rtc0 = &rtc_twi;
 	};
@@ -210,9 +211,23 @@ &i2c6 {
 	clock-frequency = <400000>;
 	status = "okay";
 
-	fan@18 {
-		compatible = "ti,amc6821";
+	i2c-mux@18 {
+		compatible = "tsd,mule-i2c-mux";
 		reg = <0x18>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		i2c10: i2c@0 {
+			reg = <0x0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			fan: fan@18 {
+				compatible = "ti,amc6821";
+				reg = <0x18>;
+				#cooling-cells = <2>;
+			};
+		};
 	};
 
 	rtc_twi: rtc@6f {

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 6/7] arm64: dts: rockchip: add mule i2c mux (0x18) on px30-ringneck
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
                   ` (4 preceding siblings ...)
  2024-06-11 11:43 ` [PATCH v3 5/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-tiger Farouk Bouabid
@ 2024-06-11 11:43 ` Farouk Bouabid
  2024-06-11 11:43 ` [PATCH v3 7/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-jaguar Farouk Bouabid
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 11:43 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Farouk Bouabid, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

Mule emulates an I2C mux (address 0x18). The amc6821 is exposed behind
this bus.

Add the mux node and amc6821 as a default device.

Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
---
 arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi b/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi
index bb1aea82e666..eea906379983 100644
--- a/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi
+++ b/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi
@@ -9,6 +9,7 @@
 
 / {
 	aliases {
+		i2c10 = &i2c10;
 		mmc0 = &emmc;
 		mmc1 = &sdio;
 		rtc0 = &rtc_twi;
@@ -291,10 +292,23 @@ &i2c1 {
 	/* SE05x is limited to Fast Mode */
 	clock-frequency = <400000>;
 
-	fan: fan@18 {
-		compatible = "ti,amc6821";
+	i2c-mux@18 {
+		compatible = "tsd,mule-i2c-mux";
 		reg = <0x18>;
-		#cooling-cells = <2>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		i2c10: i2c@0 {
+			reg = <0x0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			fan: fan@18 {
+				compatible = "ti,amc6821";
+				reg = <0x18>;
+				#cooling-cells = <2>;
+			};
+		};
 	};
 
 	rtc_twi: rtc@6f {

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 7/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-jaguar
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
                   ` (5 preceding siblings ...)
  2024-06-11 11:43 ` [PATCH v3 6/7] arm64: dts: rockchip: add mule i2c mux (0x18) on px30-ringneck Farouk Bouabid
@ 2024-06-11 11:43 ` Farouk Bouabid
  2024-06-11 13:32 ` [PATCH v3 0/7] Add Mule I2C multiplexer support Rob Herring (Arm)
  2024-06-11 22:12 ` Wolfram Sang
  8 siblings, 0 replies; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 11:43 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Farouk Bouabid, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

Mule emulates an I2C mux (address 0x18). The amc6821 is exposed behind
this bus.

Add the mux node and amc6821 as a default device.

Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
---
 arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts b/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts
index 39d65002add1..14f1322c162f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts
@@ -32,6 +32,7 @@ button-bios-disable {
 
 	aliases {
 		ethernet0 = &gmac0;
+		i2c10 = &i2c10;
 		mmc0 = &sdhci;
 		mmc1 = &sdmmc;
 		rtc0 = &rtc_twi;
@@ -249,9 +250,23 @@ &i2c0 {
 	pinctrl-0 = <&i2c0m2_xfer>;
 	status = "okay";
 
-	fan@18 {
-		compatible = "ti,amc6821";
+	i2c-mux@18 {
+		compatible = "tsd,mule-i2c-mux";
 		reg = <0x18>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		i2c10: i2c@0 {
+			reg = <0x0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			fan: fan@18 {
+				compatible = "ti,amc6821";
+				reg = <0x18>;
+				#cooling-cells = <2>;
+			};
+		};
 	};
 
 	vdd_npu_s0: regulator@42 {

-- 
2.34.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/7] Add Mule I2C multiplexer support
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
                   ` (6 preceding siblings ...)
  2024-06-11 11:43 ` [PATCH v3 7/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-jaguar Farouk Bouabid
@ 2024-06-11 13:32 ` Rob Herring (Arm)
  2024-06-11 22:12 ` Wolfram Sang
  8 siblings, 0 replies; 17+ messages in thread
From: Rob Herring (Arm) @ 2024-06-11 13:32 UTC (permalink / raw)
  To: Farouk Bouabid
  Cc: Conor Dooley, linux-rockchip, Wolfram Sang, linux-kernel,
	devicetree, Quentin Schulz, Heiko Stuebner, Krzysztof Kozlowski,
	linux-i2c, Andi Shyti, Peter Rosin, linux-arm-kernel


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#






^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer
  2024-06-11 11:43 ` [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer Farouk Bouabid
@ 2024-06-11 13:32   ` Rob Herring (Arm)
  2024-06-12 13:17     ` Rob Herring
  2024-06-13  9:14   ` Krzysztof Kozlowski
  1 sibling, 1 reply; 17+ messages in thread
From: Rob Herring (Arm) @ 2024-06-11 13:32 UTC (permalink / raw)
  To: Farouk Bouabid
  Cc: Heiko Stuebner, Andi Shyti, Conor Dooley, Quentin Schulz,
	linux-rockchip, linux-i2c, devicetree, Wolfram Sang,
	Krzysztof Kozlowski, linux-arm-kernel, linux-kernel, Peter Rosin


On Tue, 11 Jun 2024 13:43:53 +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
> (mux logic or device logic).
> 
> Add support for the Mule I2C multiplexer bindings.
> 
> Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
> ---
>  .../devicetree/bindings/i2c/tsd,mule-i2c-mux.yaml  | 80 ++++++++++++++++++++++
>  1 file changed, 80 insertions(+)
> 

My bot found errors running 'make dt_binding_check' on your patch:

yamllint warnings/errors:

dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/i2c/tsd,mule-i2c-mux.example.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#

doc reference errors (make refcheckdocs):

See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240611-dev-mule-i2c-mux-v3-2-08d26a28e001@cherry.de

The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:

pip3 install dtschema --upgrade

Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 3/7] i2c: muxes: add support for mule i2c multiplexer
  2024-06-11 11:43 ` [PATCH v3 3/7] i2c: muxes: add support " Farouk Bouabid
@ 2024-06-11 16:52   ` Farouk Bouabid
  2024-06-11 18:50     ` Wolfram Sang
  2024-06-11 17:56   ` Christophe JAILLET
  1 sibling, 1 reply; 17+ messages in thread
From: Farouk Bouabid @ 2024-06-11 16:52 UTC (permalink / raw)
  To: Wolfram Sang, Peter Rosin, Andi Shyti, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Quentin Schulz, Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

Hi all,

On 11.06.24 13:43, 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
> (mux logic or device logic):
>
> 1- The devices on the mux can be selected (mux function) 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.
>
> Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
> ---
>   drivers/i2c/muxes/Kconfig        |  18 +++++
>   drivers/i2c/muxes/Makefile       |   1 +
>   drivers/i2c/muxes/i2c-mux-mule.c | 157 +++++++++++++++++++++++++++++++++++++++
>   3 files changed, 176 insertions(+)
>
> diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig
> index db1b9057612a..70876259796d 100644
> --- a/drivers/i2c/muxes/Kconfig
> +++ b/drivers/i2c/muxes/Kconfig
> @@ -119,4 +119,22 @@ config I2C_MUX_MLXCPLD
>   	  This driver can also be built as a module.  If so, the module
>   	  will be called i2c-mux-mlxcpld.
>   
> +config I2C_MUX_MULE
> +	tristate "Mule I2C device multiplexer"
> +	depends on OF
> +	help
> +	  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
> +	  (mux logic or device logic).
> +
> +	  If you say yes to this option, support will be included for a
> +	  Mule I2C device multiplexer. This driver provides access to
> +	  I2C devices connected on the Mule I2C mux.
> +
> +	  This driver can also be built as a module.  If so, the module
> +	  will be called i2c-mux-mule.
> +
>   endmenu
> diff --git a/drivers/i2c/muxes/Makefile b/drivers/i2c/muxes/Makefile
> index 6d9d865e8518..4b24f49515a7 100644
> --- a/drivers/i2c/muxes/Makefile
> +++ b/drivers/i2c/muxes/Makefile
> @@ -10,6 +10,7 @@ obj-$(CONFIG_I2C_MUX_GPIO)	+= i2c-mux-gpio.o
>   obj-$(CONFIG_I2C_MUX_GPMUX)	+= i2c-mux-gpmux.o
>   obj-$(CONFIG_I2C_MUX_LTC4306)	+= i2c-mux-ltc4306.o
>   obj-$(CONFIG_I2C_MUX_MLXCPLD)	+= i2c-mux-mlxcpld.o
> +obj-$(CONFIG_I2C_MUX_MULE)	+= i2c-mux-mule.o
>   obj-$(CONFIG_I2C_MUX_PCA9541)	+= i2c-mux-pca9541.o
>   obj-$(CONFIG_I2C_MUX_PCA954x)	+= i2c-mux-pca954x.o
>   obj-$(CONFIG_I2C_MUX_PINCTRL)	+= i2c-mux-pinctrl.o
> diff --git a/drivers/i2c/muxes/i2c-mux-mule.c b/drivers/i2c/muxes/i2c-mux-mule.c
> new file mode 100644
> index 000000000000..db27fa560995
> --- /dev/null
> +++ b/drivers/i2c/muxes/i2c-mux-mule.c
> @@ -0,0 +1,157 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Mule I2C device multiplexer
> + *
> + * Copyright (C) 2024 Theobroma Systems Design und Consulting GmbH
> + */
> +
> +#include <linux/i2c-mux.h>
> +#include <linux/i2c.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/property.h>
> +#include <linux/regmap.h>
> +
> +#define MUX_CONFIG_REG  0xff
> +#define MUX_DEFAULT_DEV 0x0
> +
> +struct mule_i2c_reg_mux {
> +	struct regmap *regmap;
> +};
> +
> +static const struct regmap_config mule_regmap_config = {
> +	.reg_bits = 8,
> +	.val_bits = 8,
> +};
> +
> +static inline int __mux_select(struct regmap *regmap, u32 dev)
> +{
> +	return regmap_write(regmap, MUX_CONFIG_REG, dev);
> +}
> +
> +static int mux_select(struct i2c_mux_core *muxc, u32 dev)
> +{
> +	struct mule_i2c_reg_mux *mux = muxc->priv;
> +
> +	return __mux_select(mux->regmap, dev);
> +}
> +
> +static int mux_deselect(struct i2c_mux_core *muxc, u32 dev)
> +{
> +	return mux_select(muxc, MUX_DEFAULT_DEV);
> +}
> +
> +static void mux_remove(void *data)
> +{
> +	struct i2c_mux_core *muxc = data;
> +
> +	i2c_mux_del_adapters(muxc);
> +
> +	mux_deselect(muxc, MUX_DEFAULT_DEV);
> +}
> +
> +static int mule_i2c_mux_probe(struct i2c_client *client)
> +{
> +	struct i2c_adapter *adap = client->adapter;
> +	struct mule_i2c_reg_mux *priv;
> +	struct i2c_mux_core *muxc;
> +	struct device_node *dev;
> +	unsigned int readback;
> +	int ndev, ret;
> +	bool old_fw;
> +
> +	/* Count devices on the mux */
> +	ndev = of_get_child_count(client->dev.of_node);
> +	dev_dbg(&client->dev, "%u devices on the mux\n", ndev);
> +
> +	muxc = i2c_mux_alloc(adap, &client->dev,
> +			     ndev, sizeof(*priv),
> +			     I2C_MUX_LOCKED,
> +			     mux_select, mux_deselect);
> +	if (!muxc)
> +		return -ENOMEM;
> +
> +	muxc->share_addr_with_children = 1;
> +	priv = i2c_mux_priv(muxc);
> +
> +	priv->regmap = devm_regmap_init_i2c(client, &mule_regmap_config);
> +	if (IS_ERR(priv->regmap))
> +		return dev_err_probe(&client->dev, PTR_ERR(priv->regmap),
> +				     "Failed to allocate i2c register map\n");
> +
> +	i2c_set_clientdata(client, muxc);
> +
> +	/*
> +	 * Mux 0 is guaranteed to exist on all old and new mule fw.
> +	 * mule fw without mux support will accept write ops to the
> +	 * config register, but readback returns 0xff (register not updated).
> +	 */
> +	ret = mux_select(muxc, 0);
> +	if (ret)
> +		return ret;
> +
> +	ret = regmap_read(priv->regmap, MUX_CONFIG_REG, &readback);
> +	if (ret)
> +		return ret;
> +
> +	old_fw = (readback != 0);
> +
> +	ret = devm_add_action_or_reset(&client->dev, mux_remove, muxc);
> +	if (ret)
> +		return ret;
> +
> +	/* Create device adapters */
> +	for_each_child_of_node(client->dev.of_node, dev) {
> +		u32 reg;
> +
> +		ret = of_property_read_u32(dev, "reg", &reg);
> +		if (ret) {
> +			dev_err(&client->dev, "No reg property found for %s: %d\n",
> +				of_node_full_name(dev), ret);
> +			return ret;
> +		}
> +
> +		if (old_fw && reg != 0) {
> +			dev_warn(&client->dev,
> +				 "Mux %d not supported, please update Mule FW\n", reg);
> +			continue;
> +		}
> +
> +		ret = mux_select(muxc, reg);
> +		if (ret) {
> +			dev_warn(&client->dev,
> +				 "Mux %d not supported, please update Mule FW\n", reg);
> +			continue;
> +		}
> +
> +		ret = i2c_mux_add_adapter(muxc, 0, reg, 0);


The class parameter was recently removed from this function but I forgot 
to remove it. Sorry for the noise, I will send a v4 for this fix.


Cheers,

Farouk


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 3/7] i2c: muxes: add support for mule i2c multiplexer
  2024-06-11 11:43 ` [PATCH v3 3/7] i2c: muxes: add support " Farouk Bouabid
  2024-06-11 16:52   ` Farouk Bouabid
@ 2024-06-11 17:56   ` Christophe JAILLET
  1 sibling, 0 replies; 17+ messages in thread
From: Christophe JAILLET @ 2024-06-11 17:56 UTC (permalink / raw)
  To: Farouk Bouabid, Wolfram Sang, Peter Rosin, Andi Shyti,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

Le 11/06/2024 à 13:43, Farouk Bouabid a écrit :
> 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
> (mux logic or device logic):
> 
> 1- The devices on the mux can be selected (mux function) 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.
> 
> Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
> ---

Hi,

...

> +static int mule_i2c_mux_probe(struct i2c_client *client)
> +{
> +	struct i2c_adapter *adap = client->adapter;
> +	struct mule_i2c_reg_mux *priv;
> +	struct i2c_mux_core *muxc;
> +	struct device_node *dev;
> +	unsigned int readback;
> +	int ndev, ret;
> +	bool old_fw;
> +
> +	/* Count devices on the mux */
> +	ndev = of_get_child_count(client->dev.of_node);
> +	dev_dbg(&client->dev, "%u devices on the mux\n", ndev);

Should this be %d?

> +
> +	muxc = i2c_mux_alloc(adap, &client->dev,
> +			     ndev, sizeof(*priv),
> +			     I2C_MUX_LOCKED,
> +			     mux_select, mux_deselect);

Nitpick: this could be written with less lines.

> +	if (!muxc)
> +		return -ENOMEM;
> +
> +	muxc->share_addr_with_children = 1;
> +	priv = i2c_mux_priv(muxc);
> +
> +	priv->regmap = devm_regmap_init_i2c(client, &mule_regmap_config);
> +	if (IS_ERR(priv->regmap))
> +		return dev_err_probe(&client->dev, PTR_ERR(priv->regmap),
> +				     "Failed to allocate i2c register map\n");
> +
> +	i2c_set_clientdata(client, muxc);
> +
> +	/*
> +	 * Mux 0 is guaranteed to exist on all old and new mule fw.
> +	 * mule fw without mux support will accept write ops to the
> +	 * config register, but readback returns 0xff (register not updated).
> +	 */
> +	ret = mux_select(muxc, 0);

Should this 0 be MUX_DEFAULT_DEV (for consistency)?

> +	if (ret)
> +		return ret;
> +
> +	ret = regmap_read(priv->regmap, MUX_CONFIG_REG, &readback);
> +	if (ret)
> +		return ret;
> +
> +	old_fw = (readback != 0);
> +
> +	ret = devm_add_action_or_reset(&client->dev, mux_remove, muxc);
> +	if (ret)
> +		return ret;
> +
> +	/* Create device adapters */
> +	for_each_child_of_node(client->dev.of_node, dev) {
> +		u32 reg;
> +
> +		ret = of_property_read_u32(dev, "reg", &reg);
> +		if (ret) {
> +			dev_err(&client->dev, "No reg property found for %s: %d\n",
> +				of_node_full_name(dev), ret);

return dev_err_probe() as above?

> +			return ret;
> +		}
> +
> +		if (old_fw && reg != 0) {
> +			dev_warn(&client->dev,
> +				 "Mux %d not supported, please update Mule FW\n", reg);
> +			continue;
> +		}
> +
> +		ret = mux_select(muxc, reg);
> +		if (ret) {
> +			dev_warn(&client->dev,
> +				 "Mux %d not supported, please update Mule FW\n", reg);
> +			continue;
> +		}
> +
> +		ret = i2c_mux_add_adapter(muxc, 0, reg, 0);
> +		if (ret) {
> +			dev_err(&client->dev, "Failed to add i2c mux adapter %d: %d\n", reg, ret);

return dev_err_probe() as above?

> +			return ret;
> +		}
> +	}
> +
> +	mux_deselect(muxc, MUX_DEFAULT_DEV);
> +
> +	return 0;
> +}

...

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 1/7] i2c: mux: add the ability to share mux address with child nodes
  2024-06-11 11:43 ` [PATCH v3 1/7] i2c: mux: add the ability to share mux address with child nodes Farouk Bouabid
@ 2024-06-11 18:01   ` Christophe JAILLET
  0 siblings, 0 replies; 17+ messages in thread
From: Christophe JAILLET @ 2024-06-11 18:01 UTC (permalink / raw)
  To: Farouk Bouabid, Wolfram Sang, Peter Rosin, Andi Shyti,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

Le 11/06/2024 à 13:43, Farouk Bouabid a écrit :
> Allow the mux (if it's an I2C device) to have the same address as a child
> device. This is useful when the mux can only use an I2C address that is
> used by a child device because no other addresses are free to use.
> eg. the mux can only use address 0x18 which is used by amc6821 connected
> to the mux.
> 
> Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
> ---

Hi,

2 nitpicks below.

> --- a/drivers/i2c/i2c-mux.c
> +++ b/drivers/i2c/i2c-mux.c
> @@ -334,7 +334,53 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc,
>   	priv->adap.dev.parent = &parent->dev;
>   	priv->adap.retries = parent->retries;
>   	priv->adap.timeout = parent->timeout;
> -	priv->adap.quirks = parent->quirks;
> +
> +	struct i2c_adapter_quirks *quirks;

Should this be at the beginning of the function?

> +	/*
> +	 * When creating the adapter, the node devices are checked for I2C address
> +	 * match with other devices on the parent adapter, among which is the mux itself.
> +	 * If a match is found the node device is not probed successfully.
> +	 * Allow the mux to have the same address as a child device by skipping this check.
> +	 */
> +	if (muxc->share_addr_with_children) {
> +		struct i2c_client *client = to_i2c_client(muxc->dev);
> +
> +		if (muxc->dev->type != &i2c_client_type)
> +			dev_warn_once(muxc->dev, "Mux is not an I2C device\n");
> +
> +		quirks = devm_kzalloc(muxc->dev, sizeof(*quirks), GFP_KERNEL);
> +		if (!quirks)
> +			return -ENOMEM;
> +
> +		if (parent->quirks)
> +			memcpy(quirks, parent->quirks, sizeof(*quirks));
> +
> +		quirks->flags |= I2C_AQ_SKIP_ADDR_CHECK;
> +		quirks->skip_addr_in_parent = client->addr;
> +		priv->adap.quirks = quirks;
> +
> +	} else if (parent->quirks &&
> +		   parent->quirks->flags & I2C_AQ_SKIP_ADDR_CHECK) {
> +		/*
> +		 * Another I2C mux device can be a child of the Mule I2C mux.
> +		 * The former could probably not allow address conflict between
> +		 * its address and its own children addresses.
> +		 *
> +		 * For this purpose, do not propagate this flag unless
> +		 * share_addr_with_children is set.
> +		 */
> +		quirks = devm_kzalloc(muxc->dev, sizeof(*quirks), GFP_KERNEL);

devm_kmemdup()? (not sure it is a win)

> +		if (!quirks)
> +			return -ENOMEM;
> +
> +		memcpy(quirks, parent->quirks, sizeof(*quirks));
> +		quirks->flags &= ~I2C_AQ_SKIP_ADDR_CHECK;
> +		priv->adap.quirks = quirks;
> +
> +	} else {
> +		priv->adap.quirks = parent->quirks;
> +	}
> +
>   	if (muxc->mux_locked)
>   		priv->adap.lock_ops = &i2c_mux_lock_ops;
>   	else

...

CJ

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 3/7] i2c: muxes: add support for mule i2c multiplexer
  2024-06-11 16:52   ` Farouk Bouabid
@ 2024-06-11 18:50     ` Wolfram Sang
  0 siblings, 0 replies; 17+ messages in thread
From: Wolfram Sang @ 2024-06-11 18:50 UTC (permalink / raw)
  To: Farouk Bouabid
  Cc: Peter Rosin, Andi Shyti, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Quentin Schulz, Heiko Stuebner, linux-i2c,
	linux-kernel, devicetree, linux-arm-kernel, linux-rockchip

[-- Attachment #1: Type: text/plain, Size: 219 bytes --]


> The class parameter was recently removed from this function but I forgot to
> remove it. Sorry for the noise, I will send a v4 for this fix.

Please wait for my comments to the series. Hopefully later this evening.


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/7] Add Mule I2C multiplexer support
  2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
                   ` (7 preceding siblings ...)
  2024-06-11 13:32 ` [PATCH v3 0/7] Add Mule I2C multiplexer support Rob Herring (Arm)
@ 2024-06-11 22:12 ` Wolfram Sang
  8 siblings, 0 replies; 17+ messages in thread
From: Wolfram Sang @ 2024-06-11 22:12 UTC (permalink / raw)
  To: Farouk Bouabid
  Cc: Peter Rosin, Andi Shyti, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Quentin Schulz, Heiko Stuebner, linux-i2c,
	linux-kernel, devicetree, linux-arm-kernel, linux-rockchip

[-- Attachment #1: Type: text/plain, Size: 1856 bytes --]

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer
  2024-06-11 13:32   ` Rob Herring (Arm)
@ 2024-06-12 13:17     ` Rob Herring
  0 siblings, 0 replies; 17+ messages in thread
From: Rob Herring @ 2024-06-12 13:17 UTC (permalink / raw)
  To: Farouk Bouabid
  Cc: Heiko Stuebner, Andi Shyti, Conor Dooley, Quentin Schulz,
	linux-rockchip, linux-i2c, devicetree, Wolfram Sang,
	Krzysztof Kozlowski, linux-arm-kernel, linux-kernel, Peter Rosin

On Tue, Jun 11, 2024 at 7:32 AM Rob Herring (Arm) <robh@kernel.org> wrote:
>
>
> On Tue, 11 Jun 2024 13:43:53 +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
> > (mux logic or device logic).
> >
> > Add support for the Mule I2C multiplexer bindings.
> >
> > Signed-off-by: Farouk Bouabid <farouk.bouabid@cherry.de>
> > ---
> >  .../devicetree/bindings/i2c/tsd,mule-i2c-mux.yaml  | 80 ++++++++++++++++++++++
> >  1 file changed, 80 insertions(+)
> >
>
> My bot found errors running 'make dt_binding_check' on your patch:
>
> yamllint warnings/errors:
>
> dtschema/dtc warnings/errors:
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/i2c/tsd,mule-i2c-mux.example.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#

You cannot add warnings. Please fix this or this patch will never be
accepted. Either drop the property from the example or add it to the
binding (by moving out of trivial-devices.yaml).

Rob

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer
  2024-06-11 11:43 ` [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer Farouk Bouabid
  2024-06-11 13:32   ` Rob Herring (Arm)
@ 2024-06-13  9:14   ` Krzysztof Kozlowski
  1 sibling, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2024-06-13  9:14 UTC (permalink / raw)
  To: Farouk Bouabid, Wolfram Sang, Peter Rosin, Andi Shyti,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Quentin Schulz,
	Heiko Stuebner
  Cc: linux-i2c, linux-kernel, devicetree, linux-arm-kernel,
	linux-rockchip

On 11/06/2024 13:43, Farouk Bouabid wrote:
> Mule is an MCU that emulates a set of I2C devices which are reachable
> through an I2C-mux.
> 
A nit, subject: drop second/last, redundant "dt-bindings for". The
"dt-bindings" prefix is already stating that these are bindings.
See also:
https://elixir.bootlin.com/linux/v6.7-rc8/source/Documentation/devicetree/bindings/submitting-patches.rst#L18

...

> +
> +            i2c@0 {
> +                reg = <0x0>;
> +                #address-cells = <1>;
> +                #size-cells = <0>;
> +
> +                fan: fan@18 {
> +                  compatible = "ti,amc6821";
> +                  reg = <0x18>;
> +                  #cooling-cells = <2>;

Please keep consistent indentation.

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2024-06-13  9:14 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-11 11:43 [PATCH v3 0/7] Add Mule I2C multiplexer support Farouk Bouabid
2024-06-11 11:43 ` [PATCH v3 1/7] i2c: mux: add the ability to share mux address with child nodes Farouk Bouabid
2024-06-11 18:01   ` Christophe JAILLET
2024-06-11 11:43 ` [PATCH v3 2/7] dt-bindings: i2c: mux: mule: add dt-bindings for mule i2c multiplexer Farouk Bouabid
2024-06-11 13:32   ` Rob Herring (Arm)
2024-06-12 13:17     ` Rob Herring
2024-06-13  9:14   ` Krzysztof Kozlowski
2024-06-11 11:43 ` [PATCH v3 3/7] i2c: muxes: add support " Farouk Bouabid
2024-06-11 16:52   ` Farouk Bouabid
2024-06-11 18:50     ` Wolfram Sang
2024-06-11 17:56   ` Christophe JAILLET
2024-06-11 11:43 ` [PATCH v3 4/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3399-puma Farouk Bouabid
2024-06-11 11:43 ` [PATCH v3 5/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-tiger Farouk Bouabid
2024-06-11 11:43 ` [PATCH v3 6/7] arm64: dts: rockchip: add mule i2c mux (0x18) on px30-ringneck Farouk Bouabid
2024-06-11 11:43 ` [PATCH v3 7/7] arm64: dts: rockchip: add mule i2c mux (0x18) on rk3588-jaguar Farouk Bouabid
2024-06-11 13:32 ` [PATCH v3 0/7] Add Mule I2C multiplexer support Rob Herring (Arm)
2024-06-11 22:12 ` Wolfram Sang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).