mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-26 21:54:37 +08:00
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
Block a user