All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] Add support for Maxim MAX735x/MAX736x variants
@ 2022-01-08 18:57 Patrick Rudolph
  2022-01-08 18:57 ` [PATCH v2 1/4] dt-bindings: i2c: Add " Patrick Rudolph
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Patrick Rudolph @ 2022-01-08 18:57 UTC (permalink / raw)
  To: Laurent Pinchart, linux-i2c, linux-kernel; +Cc: Patrick Rudolph, devicetree

v2:
- Move dt-bindings to separate file
- Added support for MAX736x as they are very similar
- Fixed an issue found by kernel test robot
- Dropped max735x property and custom IRQ check
- Added MAX7357 config register defines instead of magic values
- Renamed vcc-supply to vdd-supply

Patrick Rudolph (4):
  dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants
  i2c: muxes: pca954x: Add MAX735x/MAX736x support
  dt-bindings: i2c: Add regulator to pca954x and max735x
  i2c: muxes: pca954x: Add regulator support

 .../bindings/i2c/i2c-mux-max735x.yaml         | 106 +++++++++++++++
 .../bindings/i2c/i2c-mux-pca954x.yaml         |   5 +
 drivers/i2c/muxes/Kconfig                     |   4 +-
 drivers/i2c/muxes/i2c-mux-pca954x.c           | 124 ++++++++++++++++--
 4 files changed, 228 insertions(+), 11 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml

-- 
2.33.1


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

* [PATCH v2 1/4] dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants
  2022-01-08 18:57 [PATCH v2 0/4] Add support for Maxim MAX735x/MAX736x variants Patrick Rudolph
@ 2022-01-08 18:57 ` Patrick Rudolph
  2022-01-08 23:14   ` Laurent Pinchart
  2022-01-08 18:57 ` [PATCH v2 2/4] i2c: muxes: pca954x: Add MAX735x/MAX736x support Patrick Rudolph
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Patrick Rudolph @ 2022-01-08 18:57 UTC (permalink / raw)
  To: Peter Rosin, Laurent Pinchart
  Cc: Patrick Rudolph, Rob Herring, linux-i2c, devicetree, linux-kernel

Add the Maxim MAX735x/MAX736x as supported chip and give an example
how to use it. The functionality will be provided by the exisintg
pca954x driver.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
 .../bindings/i2c/i2c-mux-max735x.yaml         | 101 ++++++++++++++++++
 1 file changed, 101 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml

diff --git a/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml b/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
new file mode 100644
index 000000000000..dc924ec934ca
--- /dev/null
+++ b/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/i2c/i2c-mux-max735x.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Maxim MAX735x/MAX736x I2C bus switch
+
+maintainers:
+  - Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+
+description:
+  The binding supports Maxim MAX735x and MAX736x I2C mux/switch devices.
+
+allOf:
+  - $ref: /schemas/i2c/i2c-mux.yaml#
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - maxim,max7367
+              - maxim,max7369
+    then:
+      properties:
+        interrupts: true
+
+        "#interrupt-cells":
+          const: 2
+
+        interrupt-controller: true
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - maxim,max7356
+          - maxim,max7357
+          - maxim,max7358
+          - maxim,max7367
+          - maxim,max7368
+          - maxim,max7369
+
+  reg:
+    maxItems: 1
+
+  reset-gpios:
+    maxItems: 1
+
+  i2c-mux-idle-disconnect:
+    type: boolean
+    description: Forces mux to disconnect all children in idle state. This is
+      necessary for example, if there are several multiplexers on the bus and
+      the devices behind them use same I2C addresses.
+
+  idle-state:
+    description: if present, overrides i2c-mux-idle-disconnect
+    $ref: /schemas/mux/mux-controller.yaml#/properties/idle-state
+
+required:
+  - compatible
+  - reg
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    i2c {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        i2c-mux@74 {
+            compatible = "maxim,max7357";
+            #address-cells = <1>;
+            #size-cells = <0>;
+            reg = <0x74>;
+
+            i2c@1 {
+                #address-cells = <1>;
+                #size-cells = <0>;
+                reg = <1>;
+
+                eeprom@54 {
+                    compatible = "atmel,24c08";
+                    reg = <0x54>;
+                };
+            };
+
+            i2c@7 {
+                #address-cells = <1>;
+                #size-cells = <0>;
+                reg = <7>;
+
+                rtc@51 {
+                    compatible = "nxp,pcf8563";
+                    reg = <0x51>;
+                };
+            };
+        };
+    };
+...
-- 
2.33.1


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

* [PATCH v2 2/4] i2c: muxes: pca954x: Add MAX735x/MAX736x support
  2022-01-08 18:57 [PATCH v2 0/4] Add support for Maxim MAX735x/MAX736x variants Patrick Rudolph
  2022-01-08 18:57 ` [PATCH v2 1/4] dt-bindings: i2c: Add " Patrick Rudolph
@ 2022-01-08 18:57 ` Patrick Rudolph
  2022-01-08 18:57 ` [PATCH v2 3/4] dt-bindings: i2c: Add regulator to pca954x and max735x Patrick Rudolph
  2022-01-08 18:57 ` [PATCH v2 4/4] i2c: muxes: pca954x: Add regulator support Patrick Rudolph
  3 siblings, 0 replies; 9+ messages in thread
From: Patrick Rudolph @ 2022-01-08 18:57 UTC (permalink / raw)
  To: Peter Rosin; +Cc: Patrick Rudolph, linux-i2c, linux-kernel

Add support for the following Maxim chips using the existing PCA954x
driver:
- MAX7356
- MAX7357
- MAX7358
- MAX7367
- MAX7368
- MAX7369

All added Maxim chips behave like the PCA954x, where a single SMBUS byte
write selects up to 8 channels to be bridged to the primary bus.

The MAX7357 exposes 6 additional registers at Power-On-Reset and is
configured to:
 - Disabled interrupts on bus locked up detection
 - Enable bus locked-up clearing
 - Disconnect only locked bus instead of all channels

While the MAX7357/MAX7358 have interrupt support, they don't act as
interrupt controller like the PCA9545 does. Thus don't enable IRQ support
and handle them like the PCA9548.

Tested using the MAX7357 and verified that the stalled bus is disconnected
while the other channels remain operational.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
 drivers/i2c/muxes/Kconfig           |  4 +-
 drivers/i2c/muxes/i2c-mux-pca954x.c | 92 +++++++++++++++++++++++++++--
 2 files changed, 90 insertions(+), 6 deletions(-)

diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig
index 1708b1a82da2..2ac99d044199 100644
--- a/drivers/i2c/muxes/Kconfig
+++ b/drivers/i2c/muxes/Kconfig
@@ -65,11 +65,11 @@ config I2C_MUX_PCA9541
 	  will be called i2c-mux-pca9541.
 
 config I2C_MUX_PCA954x
-	tristate "NXP PCA954x and PCA984x I2C Mux/switches"
+	tristate "NXP PCA954x/PCA984x and Maxim MAX735x/MAX736x I2C Mux/switches"
 	depends on GPIOLIB || COMPILE_TEST
 	help
 	  If you say yes here you get support for the NXP PCA954x
-	  and PCA984x I2C mux/switch devices.
+	  and PCA984x and Maxim MAX735x/MAX736x I2C mux/switch devices.
 
 	  This driver can also be built as a module.  If so, the module
 	  will be called i2c-mux-pca954x.
diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c
index 4ad665757dd8..33b9a6a1fffa 100644
--- a/drivers/i2c/muxes/i2c-mux-pca954x.c
+++ b/drivers/i2c/muxes/i2c-mux-pca954x.c
@@ -4,6 +4,7 @@
  *
  * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it>
  * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it>
+ * Copyright (c) 2022 Patrick Rudolph <patrick.rudolph@9elements.com>
  *
  * This module supports the PCA954x and PCA984x series of I2C multiplexer/switch
  * chips made by NXP Semiconductors.
@@ -11,6 +12,12 @@
  *	 PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547,
  *	 PCA9548, PCA9846, PCA9847, PCA9848 and PCA9849.
  *
+ * It's also compatible to Maxims MAX735x I2C switch chips, which are controlled
+ * as the NXP PCA9548 and the MAX736x chips that act like the PCA9544.
+ *
+ * This includes the:
+ *	 MAX7356, MAX7357, MAX7358, MAX7367, MAX7368 and MAX7369
+ *
  * These chips are all controlled via the I2C bus itself, and all have a
  * single 8-bit register. The upstream "parent" bus fans out to two,
  * four, or eight downstream busses or channels; which of these
@@ -50,7 +57,30 @@
 
 #define PCA954X_IRQ_OFFSET 4
 
+/*
+ * MAX7357 exposes 7 registers on POR which allow to configure additional
+ * features. Disable interrupts, enable bus locked-up clearing,
+ * isolate only the locked channel instead of all channels.
+ */
+#define MAX7357_CONF_INT_ENABLE			BIT(0)
+#define MAX7357_CONF_FLUSH_OUT			BIT(1)
+#define MAX7357_CONF_RELEASE_INT		BIT(2)
+#define MAX7357_CONF_LOCK_UP_CLEAR		BIT(3)
+#define MAX7357_CONF_DISCON_SINGLE_CHAN		BIT(4)
+#define MAX7357_CONF_BUS_LOCKUP_DETECTION	BIT(5)
+#define MAX7357_CONF_ENABLE_BASIC_MODE		BIT(6)
+#define MAX7357_CONF_PRECONNECT_TEST		BIT(7)
+
+#define MAX7357_CONF_DEFAULTS (MAX7357_CONF_FLUSH_OUT | \
+	 MAX7357_CONF_DISCON_SINGLE_CHAN)
+
 enum pca_type {
+	max_7367,
+	max_7368,
+	max_7369,
+	max_7356,
+	max_7357,
+	max_7358,
 	pca_9540,
 	pca_9542,
 	pca_9543,
@@ -69,6 +99,7 @@ struct chip_desc {
 	u8 nchans;
 	u8 enable;	/* used for muxes only */
 	u8 has_irq;
+	u8 max7357;
 	enum muxtype {
 		pca954x_ismux = 0,
 		pca954x_isswi
@@ -90,8 +121,42 @@ struct pca954x {
 	raw_spinlock_t lock;
 };
 
-/* Provide specs for the PCA954x types we know about */
+/* Provide specs for the PCA954x and MAX735x types we know about */
 static const struct chip_desc chips[] = {
+	[max_7356] = {
+		.nchans = 8,
+		.muxtype = pca954x_isswi,
+		.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
+	},
+	[max_7357] = {
+		.nchans = 8,
+		.muxtype = pca954x_isswi,
+		.max7357 = 1,
+		.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
+	},
+	[max_7358] = {
+		.nchans = 8,
+		.muxtype = pca954x_isswi,
+		.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
+	},
+	[max_7367] = {
+		.nchans = 4,
+		.muxtype = pca954x_isswi,
+		.has_irq = 1,
+		.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
+	},
+	[max_7368] = {
+		.nchans = 4,
+		.muxtype = pca954x_isswi,
+		.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
+	},
+	[max_7369] = {
+		.nchans = 4,
+		.enable = 0x4,
+		.muxtype = pca954x_ismux,
+		.has_irq = 1,
+		.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
+	},
 	[pca_9540] = {
 		.nchans = 2,
 		.enable = 0x4,
@@ -177,6 +242,12 @@ static const struct chip_desc chips[] = {
 };
 
 static const struct i2c_device_id pca954x_id[] = {
+	{ "max7356", max_7356 },
+	{ "max7357", max_7357 },
+	{ "max7358", max_7358 },
+	{ "max7367", max_7367 },
+	{ "max7368", max_7368 },
+	{ "max7369", max_7369 },
 	{ "pca9540", pca_9540 },
 	{ "pca9542", pca_9542 },
 	{ "pca9543", pca_9543 },
@@ -194,6 +265,12 @@ static const struct i2c_device_id pca954x_id[] = {
 MODULE_DEVICE_TABLE(i2c, pca954x_id);
 
 static const struct of_device_id pca954x_of_match[] = {
+	{ .compatible = "maxim,max7356", .data = &chips[max_7356] },
+	{ .compatible = "maxim,max7357", .data = &chips[max_7357] },
+	{ .compatible = "maxim,max7358", .data = &chips[max_7358] },
+	{ .compatible = "maxim,max7367", .data = &chips[max_7367] },
+	{ .compatible = "maxim,max7368", .data = &chips[max_7368] },
+	{ .compatible = "maxim,max7369", .data = &chips[max_7369] },
 	{ .compatible = "nxp,pca9540", .data = &chips[pca_9540] },
 	{ .compatible = "nxp,pca9542", .data = &chips[pca_9542] },
 	{ .compatible = "nxp,pca9543", .data = &chips[pca_9543] },
@@ -401,9 +478,16 @@ static int pca954x_init(struct i2c_client *client, struct pca954x *data)
 	else
 		data->last_chan = 0; /* Disconnect multiplexer */
 
-	ret = i2c_smbus_write_byte(client, data->last_chan);
-	if (ret < 0)
-		data->last_chan = 0;
+	if (data->chip->max7357) {
+		ret = i2c_smbus_write_byte_data(client, data->last_chan,
+						MAX7357_CONF_DEFAULTS);
+		if (ret < 0)
+			data->last_chan = 0;
+	} else {
+		ret = i2c_smbus_write_byte(client, data->last_chan);
+		if (ret < 0)
+			data->last_chan = 0;
+	}
 
 	return ret;
 }
-- 
2.33.1


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

* [PATCH v2 3/4] dt-bindings: i2c: Add regulator to pca954x and max735x
  2022-01-08 18:57 [PATCH v2 0/4] Add support for Maxim MAX735x/MAX736x variants Patrick Rudolph
  2022-01-08 18:57 ` [PATCH v2 1/4] dt-bindings: i2c: Add " Patrick Rudolph
  2022-01-08 18:57 ` [PATCH v2 2/4] i2c: muxes: pca954x: Add MAX735x/MAX736x support Patrick Rudolph
@ 2022-01-08 18:57 ` Patrick Rudolph
  2022-01-08 23:17   ` Laurent Pinchart
  2022-01-08 18:57 ` [PATCH v2 4/4] i2c: muxes: pca954x: Add regulator support Patrick Rudolph
  3 siblings, 1 reply; 9+ messages in thread
From: Patrick Rudolph @ 2022-01-08 18:57 UTC (permalink / raw)
  To: Peter Rosin, Laurent Pinchart
  Cc: Patrick Rudolph, Rob Herring, linux-i2c, devicetree, linux-kernel

Add a regulator called vdd also present in datasheets of PCA954x
and MAX735x and update the examples.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
 Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml | 5 +++++
 Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml | 5 +++++
 2 files changed, 10 insertions(+)

diff --git a/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml b/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
index dc924ec934ca..93eda07718e8 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
+++ b/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
@@ -57,6 +57,9 @@ properties:
     description: if present, overrides i2c-mux-idle-disconnect
     $ref: /schemas/mux/mux-controller.yaml#/properties/idle-state
 
+  vdd-supply:
+    description: A voltage regulator supplying power to the chip.
+
 required:
   - compatible
   - reg
@@ -75,6 +78,8 @@ examples:
             #size-cells = <0>;
             reg = <0x74>;
 
+            vdd-supply = <&p3v3>;
+
             i2c@1 {
                 #address-cells = <1>;
                 #size-cells = <0>;
diff --git a/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml b/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml
index 9f1726d0356b..b28d05dc956d 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml
+++ b/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml
@@ -59,6 +59,9 @@ properties:
     description: if present, overrides i2c-mux-idle-disconnect
     $ref: /schemas/mux/mux-controller.yaml#/properties/idle-state
 
+  vdd-supply:
+    description: A voltage regulator supplying power to the chip.
+
 required:
   - compatible
   - reg
@@ -79,6 +82,8 @@ examples:
             #size-cells = <0>;
             reg = <0x74>;
 
+            vdd-supply = <&p3v3>;
+
             interrupt-parent = <&ipic>;
             interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
             interrupt-controller;
-- 
2.33.1


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

* [PATCH v2 4/4] i2c: muxes: pca954x: Add regulator support
  2022-01-08 18:57 [PATCH v2 0/4] Add support for Maxim MAX735x/MAX736x variants Patrick Rudolph
                   ` (2 preceding siblings ...)
  2022-01-08 18:57 ` [PATCH v2 3/4] dt-bindings: i2c: Add regulator to pca954x and max735x Patrick Rudolph
@ 2022-01-08 18:57 ` Patrick Rudolph
  2022-01-12  9:31   ` Wolfram Sang
  3 siblings, 1 reply; 9+ messages in thread
From: Patrick Rudolph @ 2022-01-08 18:57 UTC (permalink / raw)
  To: Peter Rosin, Liam Girdwood, Mark Brown
  Cc: Patrick Rudolph, linux-i2c, linux-kernel

Add an optional vdd regulator and enable it when found for devices
that are powered off by default.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
 drivers/i2c/muxes/i2c-mux-pca954x.c | 32 ++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c
index 33b9a6a1fffa..086647193ea9 100644
--- a/drivers/i2c/muxes/i2c-mux-pca954x.c
+++ b/drivers/i2c/muxes/i2c-mux-pca954x.c
@@ -49,6 +49,7 @@
 #include <linux/module.h>
 #include <linux/pm.h>
 #include <linux/property.h>
+#include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <dt-bindings/mux/mux.h>
@@ -119,6 +120,7 @@ struct pca954x {
 	struct irq_domain *irq;
 	unsigned int irq_mask;
 	raw_spinlock_t lock;
+	struct regulator *supply;
 };
 
 /* Provide specs for the PCA954x and MAX735x types we know about */
@@ -459,6 +461,9 @@ static void pca954x_cleanup(struct i2c_mux_core *muxc)
 	struct pca954x *data = i2c_mux_priv(muxc);
 	int c, irq;
 
+	if (!IS_ERR_OR_NULL(data->supply))
+		regulator_disable(data->supply);
+
 	if (data->irq) {
 		for (c = 0; c < data->chip->nchans; c++) {
 			irq = irq_find_mapping(data->irq, c);
@@ -513,15 +518,30 @@ static int pca954x_probe(struct i2c_client *client,
 			     pca954x_select_chan, pca954x_deselect_mux);
 	if (!muxc)
 		return -ENOMEM;
+
 	data = i2c_mux_priv(muxc);
 
 	i2c_set_clientdata(client, muxc);
 	data->client = client;
 
+	data->supply = devm_regulator_get_optional(dev, "vdd");
+	if (IS_ERR(data->supply)) {
+		if ((PTR_ERR(data->supply) == -EPROBE_DEFER))
+			return -EPROBE_DEFER;
+	} else {
+		ret = regulator_enable(data->supply);
+		if (ret) {
+			dev_err(dev, "Failed to enable regulator vdd: %d\n", ret);
+			return ret;
+		}
+	}
+
 	/* Reset the mux if a reset GPIO is specified. */
 	gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
-	if (IS_ERR(gpio))
-		return PTR_ERR(gpio);
+	if (IS_ERR(gpio)) {
+		ret = PTR_ERR(gpio);
+		goto fail_cleanup;
+	}
 	if (gpio) {
 		udelay(1);
 		gpiod_set_value_cansleep(gpio, 0);
@@ -538,7 +558,7 @@ static int pca954x_probe(struct i2c_client *client,
 
 		ret = i2c_get_device_id(client, &id);
 		if (ret && ret != -EOPNOTSUPP)
-			return ret;
+			goto fail_cleanup;
 
 		if (!ret &&
 		    (id.manufacturer_id != data->chip->id.manufacturer_id ||
@@ -546,7 +566,8 @@ static int pca954x_probe(struct i2c_client *client,
 			dev_warn(dev, "unexpected device id %03x-%03x-%x\n",
 				 id.manufacturer_id, id.part_id,
 				 id.die_revision);
-			return -ENODEV;
+			ret = -ENODEV;
+			goto fail_cleanup;
 		}
 	}
 
@@ -565,7 +586,8 @@ static int pca954x_probe(struct i2c_client *client,
 	ret = pca954x_init(client, data);
 	if (ret < 0) {
 		dev_warn(dev, "probe failed\n");
-		return -ENODEV;
+		ret = -ENODEV;
+		goto fail_cleanup;
 	}
 
 	ret = pca954x_irq_setup(muxc);
-- 
2.33.1


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

* Re: [PATCH v2 1/4] dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants
  2022-01-08 18:57 ` [PATCH v2 1/4] dt-bindings: i2c: Add " Patrick Rudolph
@ 2022-01-08 23:14   ` Laurent Pinchart
  0 siblings, 0 replies; 9+ messages in thread
From: Laurent Pinchart @ 2022-01-08 23:14 UTC (permalink / raw)
  To: Patrick Rudolph
  Cc: Peter Rosin, Rob Herring, linux-i2c, devicetree, linux-kernel

Hi Patrick,

Thank you for the patch.

On Sat, Jan 08, 2022 at 07:57:55PM +0100, Patrick Rudolph wrote:
> Add the Maxim MAX735x/MAX736x as supported chip and give an example
> how to use it. The functionality will be provided by the exisintg
> pca954x driver.

While DT bindings and drivers are decoupled, the fact that the same
driver provides support for the MAX735x/MAX736x indicates there's some
similarity between those and the PCA954x chips. Would they be similar
enough to have a single DT binding schema file ? This file looks very
similar to Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml.

> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
> ---
>  .../bindings/i2c/i2c-mux-max735x.yaml         | 101 ++++++++++++++++++
>  1 file changed, 101 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
> 
> diff --git a/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml b/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
> new file mode 100644
> index 000000000000..dc924ec934ca
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
> @@ -0,0 +1,101 @@
> +# SPDX-License-Identifier: GPL-2.0
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/i2c/i2c-mux-max735x.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Maxim MAX735x/MAX736x I2C bus switch
> +
> +maintainers:
> +  - Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> +
> +description:
> +  The binding supports Maxim MAX735x and MAX736x I2C mux/switch devices.
> +
> +allOf:
> +  - $ref: /schemas/i2c/i2c-mux.yaml#
> +  - if:
> +      properties:
> +        compatible:
> +          contains:
> +            enum:
> +              - maxim,max7367
> +              - maxim,max7369
> +    then:
> +      properties:
> +        interrupts: true
> +
> +        "#interrupt-cells":
> +          const: 2
> +
> +        interrupt-controller: true
> +
> +properties:
> +  compatible:
> +    oneOf:
> +      - enum:
> +          - maxim,max7356
> +          - maxim,max7357
> +          - maxim,max7358
> +          - maxim,max7367
> +          - maxim,max7368
> +          - maxim,max7369
> +
> +  reg:
> +    maxItems: 1
> +
> +  reset-gpios:
> +    maxItems: 1
> +
> +  i2c-mux-idle-disconnect:
> +    type: boolean
> +    description: Forces mux to disconnect all children in idle state. This is
> +      necessary for example, if there are several multiplexers on the bus and
> +      the devices behind them use same I2C addresses.
> +
> +  idle-state:
> +    description: if present, overrides i2c-mux-idle-disconnect
> +    $ref: /schemas/mux/mux-controller.yaml#/properties/idle-state
> +
> +required:
> +  - compatible
> +  - reg
> +
> +unevaluatedProperties: false
> +
> +examples:
> +  - |
> +    i2c {
> +        #address-cells = <1>;
> +        #size-cells = <0>;
> +
> +        i2c-mux@74 {
> +            compatible = "maxim,max7357";
> +            #address-cells = <1>;
> +            #size-cells = <0>;
> +            reg = <0x74>;
> +
> +            i2c@1 {
> +                #address-cells = <1>;
> +                #size-cells = <0>;
> +                reg = <1>;
> +
> +                eeprom@54 {
> +                    compatible = "atmel,24c08";
> +                    reg = <0x54>;
> +                };
> +            };
> +
> +            i2c@7 {
> +                #address-cells = <1>;
> +                #size-cells = <0>;
> +                reg = <7>;
> +
> +                rtc@51 {
> +                    compatible = "nxp,pcf8563";
> +                    reg = <0x51>;
> +                };
> +            };
> +        };
> +    };
> +...

-- 
Regards,

Laurent Pinchart

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

* Re: [PATCH v2 3/4] dt-bindings: i2c: Add regulator to pca954x and max735x
  2022-01-08 18:57 ` [PATCH v2 3/4] dt-bindings: i2c: Add regulator to pca954x and max735x Patrick Rudolph
@ 2022-01-08 23:17   ` Laurent Pinchart
  0 siblings, 0 replies; 9+ messages in thread
From: Laurent Pinchart @ 2022-01-08 23:17 UTC (permalink / raw)
  To: Patrick Rudolph
  Cc: Peter Rosin, Rob Herring, linux-i2c, devicetree, linux-kernel

Hi Patrick,

Thank you for the patch.

On Sat, Jan 08, 2022 at 07:57:57PM +0100, Patrick Rudolph wrote:
> Add a regulator called vdd also present in datasheets of PCA954x
> and MAX735x and update the examples.
> 
> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
> ---
>  Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml | 5 +++++
>  Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml | 5 +++++
>  2 files changed, 10 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml b/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
> index dc924ec934ca..93eda07718e8 100644
> --- a/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
> +++ b/Documentation/devicetree/bindings/i2c/i2c-mux-max735x.yaml
> @@ -57,6 +57,9 @@ properties:
>      description: if present, overrides i2c-mux-idle-disconnect
>      $ref: /schemas/mux/mux-controller.yaml#/properties/idle-state
>  
> +  vdd-supply:
> +    description: A voltage regulator supplying power to the chip.
> +
>  required:
>    - compatible
>    - reg
> @@ -75,6 +78,8 @@ examples:
>              #size-cells = <0>;
>              reg = <0x74>;
>  
> +            vdd-supply = <&p3v3>;
> +
>              i2c@1 {
>                  #address-cells = <1>;
>                  #size-cells = <0>;

This should be part of patch 1/4 (or better in my opinion, the two
binding files should be merged into a single one).

> diff --git a/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml b/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml
> index 9f1726d0356b..b28d05dc956d 100644
> --- a/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml
> +++ b/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml
> @@ -59,6 +59,9 @@ properties:
>      description: if present, overrides i2c-mux-idle-disconnect
>      $ref: /schemas/mux/mux-controller.yaml#/properties/idle-state
>  
> +  vdd-supply:
> +    description: A voltage regulator supplying power to the chip.
> +
>  required:
>    - compatible
>    - reg
> @@ -79,6 +82,8 @@ examples:
>              #size-cells = <0>;
>              reg = <0x74>;
>  
> +            vdd-supply = <&p3v3>;
> +
>              interrupt-parent = <&ipic>;
>              interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
>              interrupt-controller;

For this part,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

-- 
Regards,

Laurent Pinchart

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

* Re: [PATCH v2 4/4] i2c: muxes: pca954x: Add regulator support
  2022-01-08 18:57 ` [PATCH v2 4/4] i2c: muxes: pca954x: Add regulator support Patrick Rudolph
@ 2022-01-12  9:31   ` Wolfram Sang
  2022-01-20  7:22     ` Patrick Rudolph
  0 siblings, 1 reply; 9+ messages in thread
From: Wolfram Sang @ 2022-01-12  9:31 UTC (permalink / raw)
  To: Patrick Rudolph
  Cc: Peter Rosin, Liam Girdwood, Mark Brown, linux-i2c, linux-kernel

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

On Sat, Jan 08, 2022 at 07:57:58PM +0100, Patrick Rudolph wrote:
> Add an optional vdd regulator and enable it when found for devices
> that are powered off by default.
> 
> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>

regulator support was recently added to the I2C core but had to be
reverted because of side effects [1]. I think you could make use of it
if it gets readded?

[1] a19f75de73c2 ("Revert "i2c: core: support bus regulator controlling in adapter"")


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

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

* Re: [PATCH v2 4/4] i2c: muxes: pca954x: Add regulator support
  2022-01-12  9:31   ` Wolfram Sang
@ 2022-01-20  7:22     ` Patrick Rudolph
  0 siblings, 0 replies; 9+ messages in thread
From: Patrick Rudolph @ 2022-01-20  7:22 UTC (permalink / raw)
  To: Wolfram Sang, Patrick Rudolph, Peter Rosin, Liam Girdwood,
	Mark Brown, linux-i2c, linux-kernel

Hi Wolfram,
I don't think that it's possible to use the generic vbus-supply.
In my case the complete chip, not only the bus, is powered by a regulator.
In addition it looks like this works only for platform drivers where
you can set the bus_regulator
before the i2c core probe function is invoked.

Regards,
Patrick Rudolph



On Wed, Jan 12, 2022 at 10:31 AM Wolfram Sang <wsa@kernel.org> wrote:
>
> On Sat, Jan 08, 2022 at 07:57:58PM +0100, Patrick Rudolph wrote:
> > Add an optional vdd regulator and enable it when found for devices
> > that are powered off by default.
> >
> > Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
>
> regulator support was recently added to the I2C core but had to be
> reverted because of side effects [1]. I think you could make use of it
> if it gets readded?
>
> [1] a19f75de73c2 ("Revert "i2c: core: support bus regulator controlling in adapter"")
>

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

end of thread, other threads:[~2022-01-20  7:22 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-08 18:57 [PATCH v2 0/4] Add support for Maxim MAX735x/MAX736x variants Patrick Rudolph
2022-01-08 18:57 ` [PATCH v2 1/4] dt-bindings: i2c: Add " Patrick Rudolph
2022-01-08 23:14   ` Laurent Pinchart
2022-01-08 18:57 ` [PATCH v2 2/4] i2c: muxes: pca954x: Add MAX735x/MAX736x support Patrick Rudolph
2022-01-08 18:57 ` [PATCH v2 3/4] dt-bindings: i2c: Add regulator to pca954x and max735x Patrick Rudolph
2022-01-08 23:17   ` Laurent Pinchart
2022-01-08 18:57 ` [PATCH v2 4/4] i2c: muxes: pca954x: Add regulator support Patrick Rudolph
2022-01-12  9:31   ` Wolfram Sang
2022-01-20  7:22     ` Patrick Rudolph

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.