mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-29 08:00:26 +09:00
gpio: pca953x: Clear the polarity invert register at init
The pca953x_gpio driver uses default value of polarity inversion register. For some devices like PCA9557 and MAX7310, their polarity inversion register default value is 0xf0. So for high 4 ports, when reading their values, the values are inverted as the actual level. This patch clears the polarity inversion register to 0 at init, so that the port read and write values are aligned. Signed-off-by: Ye Li <ye.li@nxp.com> Acked-by: Fugang Duan <fugang.duan@nxp.com> Acked-by: Peng Fan <peng.fan@nxp.com> Signed-off-by: Anatolij Gustschin <agust@denx.de>
This commit is contained in:
parent
e5e06b65ad
commit
3764b2bdce
@ -130,6 +130,25 @@ static int pca953x_read_regs(struct udevice *dev, int reg, u8 *val)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pca953x_write_regs(struct udevice *dev, int reg, u8 *val)
|
||||||
|
{
|
||||||
|
struct pca953x_info *info = dev_get_platdata(dev);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (info->gpio_count <= 8) {
|
||||||
|
ret = dm_i2c_write(dev, reg, val, 1);
|
||||||
|
} else if (info->gpio_count <= 16) {
|
||||||
|
ret = dm_i2c_write(dev, reg << 1, val, info->bank_count);
|
||||||
|
} else if (info->gpio_count == 40) {
|
||||||
|
/* Auto increment */
|
||||||
|
ret = dm_i2c_write(dev, (reg << 3) | 0x80, val, info->bank_count);
|
||||||
|
} else {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int pca953x_is_output(struct udevice *dev, int offset)
|
static int pca953x_is_output(struct udevice *dev, int offset)
|
||||||
{
|
{
|
||||||
struct pca953x_info *info = dev_get_platdata(dev);
|
struct pca953x_info *info = dev_get_platdata(dev);
|
||||||
@ -251,6 +270,7 @@ static int pca953x_probe(struct udevice *dev)
|
|||||||
int ret;
|
int ret;
|
||||||
int size;
|
int size;
|
||||||
const u8 *tmp;
|
const u8 *tmp;
|
||||||
|
u8 val[MAX_BANK];
|
||||||
|
|
||||||
addr = dev_read_addr(dev);
|
addr = dev_read_addr(dev);
|
||||||
if (addr == 0)
|
if (addr == 0)
|
||||||
@ -296,6 +316,14 @@ static int pca953x_probe(struct udevice *dev)
|
|||||||
snprintf(name, sizeof(name), "gpio@%x_", info->addr);
|
snprintf(name, sizeof(name), "gpio@%x_", info->addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear the polarity registers to no invert */
|
||||||
|
memset(val, 0, MAX_BANK);
|
||||||
|
ret = pca953x_write_regs(dev, PCA953X_INVERT, val);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "Error writing invert register\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
str = strdup(name);
|
str = strdup(name);
|
||||||
if (!str)
|
if (!str)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
Loading…
Reference in New Issue
Block a user