Commit 81694437 authored by Patrick Rudolph's avatar Patrick Rudolph Committed by Wolfram Sang
Browse files

i2c: muxes: pca954x: Add MAX735x/MAX736x support



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.

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.

Signed-off-by: default avatarPatrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-by: default avatarAndi Shyti <andi.shyti@kernel.org>
Acked-by: default avatarPeter Rosin <peda@axentia.se>
Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
parent dde2c690
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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.
	  If you say yes here you get support for NXP PCA954x/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.
+66 −1
Original line number Diff line number Diff line
@@ -11,6 +11,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
@@ -51,6 +57,12 @@
#define PCA954X_IRQ_OFFSET 4

enum pca_type {
	max_7356,
	max_7357,
	max_7358,
	max_7367,
	max_7368,
	max_7369,
	pca_9540,
	pca_9542,
	pca_9543,
@@ -90,8 +102,49 @@ struct pca954x {
	raw_spinlock_t lock;
};

/* Provide specs for the PCA954x types we know about */
/* Provide specs for the MAX735x, PCA954x and PCA984x 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,
		.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
		/*
		 * No interrupt controller support. The interrupt
		 * provides information about stuck channels.
		 */
	},
	[max_7358] = {
		.nchans = 8,
		.muxtype = pca954x_isswi,
		.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
		/*
		 * No interrupt controller support. The interrupt
		 * provides information about stuck channels.
		 */
	},
	[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 +230,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 +253,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] },