|
@@ -67,9 +67,20 @@ static int adp5588_gpio_get_value(struct gpio_chip *chip, unsigned off)
|
|
{
|
|
{
|
|
struct adp5588_gpio *dev =
|
|
struct adp5588_gpio *dev =
|
|
container_of(chip, struct adp5588_gpio, gpio_chip);
|
|
container_of(chip, struct adp5588_gpio, gpio_chip);
|
|
|
|
+ unsigned bank = ADP5588_BANK(off);
|
|
|
|
+ unsigned bit = ADP5588_BIT(off);
|
|
|
|
+ int val;
|
|
|
|
|
|
- return !!(adp5588_gpio_read(dev->client,
|
|
|
|
- GPIO_DAT_STAT1 + ADP5588_BANK(off)) & ADP5588_BIT(off));
|
|
|
|
|
|
+ mutex_lock(&dev->lock);
|
|
|
|
+
|
|
|
|
+ if (dev->dir[bank] & bit)
|
|
|
|
+ val = dev->dat_out[bank];
|
|
|
|
+ else
|
|
|
|
+ val = adp5588_gpio_read(dev->client, GPIO_DAT_STAT1 + bank);
|
|
|
|
+
|
|
|
|
+ mutex_unlock(&dev->lock);
|
|
|
|
+
|
|
|
|
+ return !!(val & bit);
|
|
}
|
|
}
|
|
|
|
|
|
static void adp5588_gpio_set_value(struct gpio_chip *chip,
|
|
static void adp5588_gpio_set_value(struct gpio_chip *chip,
|