drivers/i2c/muxes/pca954x: Add pca9547 I2C mux support
This I2C mux is found, for example, on the Turris Omnia board. Signed-off-by: Marek Behun <marek.behun@nic.cz> Reviewed-by: Heiko Schocher <hs@denx.de> Signed-off-by: Stefan Roese <sr@denx.de>
This commit is contained in:
		
							parent
							
								
									c2502e7b82
								
							
						
					
					
						commit
						8e6eda7cda
					
				|  | @ -13,11 +13,40 @@ | ||||||
| 
 | 
 | ||||||
| DECLARE_GLOBAL_DATA_PTR; | DECLARE_GLOBAL_DATA_PTR; | ||||||
| 
 | 
 | ||||||
|  | enum pca_type { | ||||||
|  | 	PCA9544, | ||||||
|  | 	PCA9547, | ||||||
|  | 	PCA9548 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct chip_desc { | ||||||
|  | 	u8 enable; | ||||||
|  | 	enum muxtype { | ||||||
|  | 		pca954x_ismux = 0, | ||||||
|  | 		pca954x_isswi, | ||||||
|  | 	} muxtype; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| struct pca954x_priv { | struct pca954x_priv { | ||||||
| 	u32 addr; /* I2C mux address */ | 	u32 addr; /* I2C mux address */ | ||||||
| 	u32 width; /* I2C mux width - number of busses */ | 	u32 width; /* I2C mux width - number of busses */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static const struct chip_desc chips[] = { | ||||||
|  | 	[PCA9544] = { | ||||||
|  | 		.enable = 0x4, | ||||||
|  | 		.muxtype = pca954x_ismux, | ||||||
|  | 	}, | ||||||
|  | 	[PCA9547] = { | ||||||
|  | 		.enable = 0x8, | ||||||
|  | 		.muxtype = pca954x_ismux, | ||||||
|  | 	}, | ||||||
|  | 	[PCA9548] = { | ||||||
|  | 		.enable = 0x8, | ||||||
|  | 		.muxtype = pca954x_isswi, | ||||||
|  | 	}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| static int pca954x_deselect(struct udevice *mux, struct udevice *bus, | static int pca954x_deselect(struct udevice *mux, struct udevice *bus, | ||||||
| 			    uint channel) | 			    uint channel) | ||||||
| { | { | ||||||
|  | @ -31,7 +60,13 @@ static int pca954x_select(struct udevice *mux, struct udevice *bus, | ||||||
| 			  uint channel) | 			  uint channel) | ||||||
| { | { | ||||||
| 	struct pca954x_priv *priv = dev_get_priv(mux); | 	struct pca954x_priv *priv = dev_get_priv(mux); | ||||||
| 	uchar byte = 1 << channel; | 	const struct chip_desc *chip = &chips[dev_get_driver_data(mux)]; | ||||||
|  | 	uchar byte; | ||||||
|  | 
 | ||||||
|  | 	if (chip->muxtype == pca954x_ismux) | ||||||
|  | 		byte = channel | chip->enable; | ||||||
|  | 	else | ||||||
|  | 		byte = 1 << channel; | ||||||
| 
 | 
 | ||||||
| 	return dm_i2c_write(mux, priv->addr, &byte, 1); | 	return dm_i2c_write(mux, priv->addr, &byte, 1); | ||||||
| } | } | ||||||
|  | @ -42,8 +77,9 @@ static const struct i2c_mux_ops pca954x_ops = { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const struct udevice_id pca954x_ids[] = { | static const struct udevice_id pca954x_ids[] = { | ||||||
| 	{ .compatible = "nxp,pca9548", .data = (ulong)8 }, | 	{ .compatible = "nxp,pca9544", .data = PCA9544 }, | ||||||
| 	{ .compatible = "nxp,pca9544", .data = (ulong)4 }, | 	{ .compatible = "nxp,pca9547", .data = PCA9547 }, | ||||||
|  | 	{ .compatible = "nxp,pca9548", .data = PCA9548 }, | ||||||
| 	{ } | 	{ } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue