gpio: stmpe: implement .get_direction()
authorLinus Walleij <linus.walleij@linaro.org>
Thu, 28 Apr 2016 13:00:18 +0000 (15:00 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 7 Jun 2016 07:35:15 +0000 (09:35 +0200)
This implements the .get_direction() callback for the STMPE
expander GPIO.

Cc: Patrice Chotard <patrice.chotard@st.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-stmpe.c

index 6f7af28b8966a885c94130fa5d8a2abec69ac17f..8480bd72661f86380f4e2e2983a34cf09966f1d0 100644 (file)
@@ -68,6 +68,22 @@ static void stmpe_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
                stmpe_reg_write(stmpe, reg, mask);
 }
 
+static int stmpe_gpio_get_direction(struct gpio_chip *chip,
+                                   unsigned offset)
+{
+       struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
+       struct stmpe *stmpe = stmpe_gpio->stmpe;
+       u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB] - (offset / 8);
+       u8 mask = 1 << (offset % 8);
+       int ret;
+
+       ret = stmpe_reg_read(stmpe, reg);
+       if (ret < 0)
+               return ret;
+
+       return !(ret & mask);
+}
+
 static int stmpe_gpio_direction_output(struct gpio_chip *chip,
                                         unsigned offset, int val)
 {
@@ -106,6 +122,7 @@ static int stmpe_gpio_request(struct gpio_chip *chip, unsigned offset)
 static struct gpio_chip template_chip = {
        .label                  = "stmpe",
        .owner                  = THIS_MODULE,
+       .get_direction          = stmpe_gpio_get_direction,
        .direction_input        = stmpe_gpio_direction_input,
        .get                    = stmpe_gpio_get,
        .direction_output       = stmpe_gpio_direction_output,