Add support for Maxim MAX735x/MAX736x variants
Subsystems (3)
v3 cover Add support for Maxim MAX735x/MAX736x variants
v3:
- Merge dt-bindings into i2c-mux-pca954x.yaml
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 (3):
dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants
i2c: muxes: pca954x: Add MAX735x/MAX736x support
i2c: muxes: pca954x: Add regulator support
.../bindings/i2c/i2c-mux-pca954x.yaml | 43 ++++-- drivers/i2c/muxes/Kconfig | 4 +- drivers/i2c/muxes/i2c-mux-pca954x.c | 124 ++++++++++++++++-- 3 files changed, 150 insertions(+), 21 deletions(-)
Signature · 1 line
2.34.1
PATCH v3 1/3 dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants
Update the pca954x bindings to add support for the Maxim MAX735x/MAX736x chips. The functionality will be provided by the exisintg pca954x driver.
While on it make the interrupts support conditionally as not all of the existing chips have interrupts.
For chips that are powered off by default add an optional regulator called vdd-supply.
--- .../bindings/i2c/i2c-mux-pca954x.yaml | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-)
Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml +33 -10
@@ -4,21 +4,47 @@ $id: http://devicetree.org/schemas/i2c/i2c-mux-pca954x.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# -title: NXP PCA954x I2C bus switch +title: NXP PCA954x I2C and compatible bus switches maintainers: - Laurent Pinchart <[email protected]> description: - The binding supports NXP PCA954x and PCA984x I2C mux/switch devices. + The binding supports NXP PCA954x and PCA984x I2C mux/switch devices, + and the Maxim MAX735x and MAX736x I2C mux/switch devices. allOf: - $ref: /schemas/i2c/i2c-mux.yaml# + - if: + properties: + compatible: + contains: + enum: + - maxim,max7367 + - maxim,max7369 + - nxp,pca9542 + - nxp,pca9543 + - nxp,pca9544 + - nxp,pca9545 + 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 - nxp,pca9540 - nxp,pca9542 - nxp,pca9543
@@ -38,14 +64,6 @@ properties: reg: maxItems: 1 - interrupts: - maxItems: 1 - - "#interrupt-cells": - const: 2 - - interrupt-controller: true - reset-gpios: maxItems: 1
@@ -59,6 +77,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 +100,8 @@ examples: #size-cells = <0>; reg = <0x74>; + vdd-supply = <&p3v3>; + interrupt-parent = <&ipic>; interrupts = <17 IRQ_TYPE_LEVEL_LOW>; interrupt-controller;
Signature · 1 line
2.34.1
Rob Herring
maintainerRe: [v3 1/3] dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants
Quoted 39 lines · Patrick Rudolph
Update the pca954x bindings to add support for the Maxim MAX735x/MAX736x chips. The functionality will be provided by the exisintg pca954x driver.
While on it make the interrupts support conditionally as not all of the existing chips have interrupts.
For chips that are powered off by default add an optional regulator called vdd-supply.
Signed-off-by Patrick Rudolph <[email protected]>--- .../bindings/i2c/i2c-mux-pca954x.yaml | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-)Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml +7
-2@@ -4,21 +4,47 @@ $id: http://devicetree.org/schemas/i2c/i2c-mux-pca954x.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# -title: NXP PCA954x I2C bus switch +title: NXP PCA954x I2C and compatible bus switches maintainers: - Laurent Pinchart <[email protected]> description: - The binding supports NXP PCA954x and PCA984x I2C mux/switch devices. + The binding supports NXP PCA954x and PCA984x I2C mux/switch devices, + and the Maxim MAX735x and MAX736x I2C mux/switch devices. allOf: - $ref: /schemas/i2c/i2c-mux.yaml# + - if: + properties: + compatible: + contains:
Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml line 31
Quoted 10 lines
Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml +10
-0+ enum: + - maxim,max7367 + - maxim,max7369 + - nxp,pca9542 + - nxp,pca9543 + - nxp,pca9544 + - nxp,pca9545 + then: + properties: + interrupts: true
Now any number of interrupts are valid and undefined.
Quoted 57 lines
Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml +16
-8+ + "#interrupt-cells": + const: 2 + + interrupt-controller: true properties: compatible: oneOf: - enum: + - maxim,max7356 + - maxim,max7357 + - maxim,max7358 + - maxim,max7367 + - maxim,max7368 + - maxim,max7369 - nxp,pca9540 - nxp,pca9542 - nxp,pca9543@@ -38,14 +64,6 @@ properties: reg: maxItems: 1 - interrupts: - maxItems: 1 - - "#interrupt-cells": - const: 2 - - interrupt-controller: true - reset-gpios: maxItems: 1@@ -59,6 +77,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 +100,8 @@ examples: #size-cells = <0>; reg = <0x74>; + vdd-supply = <&p3v3>; + interrupt-parent = <&ipic>; interrupts = <17 IRQ_TYPE_LEVEL_LOW>; interrupt-controller;Signature · 1 line
2.34.1
PATCH v3 2/3 i2c: muxes: pca954x: Add MAX735x/MAX736x support
In reply to Patrick RudolphAdd 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.
--- drivers/i2c/muxes/Kconfig | 4 +- drivers/i2c/muxes/i2c-mux-pca954x.c | 92 +++++++++++++++++++++++++++-- 2 files changed, 90 insertions(+), 6 deletions(-)
drivers/i2c/muxes/Kconfig +2 -2
@@ -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.
drivers/i2c/muxes/i2c-mux-pca954x.c +88 -4
142 lines not on this page · raw message
Signature · 1 line
2.34.1
PATCH v3 3/3 i2c: muxes: pca954x: Add regulator support
In reply to Patrick RudolphAdd an optional vdd regulator and enable it when found for devices that are powered off by default.
--- drivers/i2c/muxes/i2c-mux-pca954x.c | 32 ++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-)
drivers/i2c/muxes/i2c-mux-pca954x.c +27 -5
@@ -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);
Signature · 1 line
2.34.1