mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 08:33:17 +02:00
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: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Acked-by: Peter Rosin <peda@axentia.se> Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
parent
dde2c69042
commit
81694437b6
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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] },
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user