gpio: syscon: add soc specific callback to assign output value
authorGrygorii Strashko <grygorii.strashko@ti.com>
Wed, 3 Sep 2014 17:05:32 +0000 (20:05 +0300)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 16 Sep 2014 21:39:00 +0000 (14:39 -0700)
Some SoCs (like Keystone) may require to perform special
sequence of operations to assign output GPIO value, so default
implementation of .set() callback from gpio-syscon driver
can't be used.

Hence, add optional, SoC specific callback to assign output
gpio value.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-syscon.c

index 30884fbc750de5e74f7322a415bfab7650185e2d..d50ff9363c810e3e0b8e52233e8a9ccdaf2f256c 100644 (file)
@@ -37,6 +37,8 @@
  * dat_bit_offset:     Offset (in bits) to the first GPIO bit.
  * dir_bit_offset:     Optional offset (in bits) to the first bit to switch
  *                     GPIO direction (Used with GPIO_SYSCON_FEAT_DIR flag).
+ * set:                HW specific callback to assigns output value
+ *                     for signal "offset"
  */
 
 struct syscon_gpio_data {
@@ -45,6 +47,8 @@ struct syscon_gpio_data {
        unsigned int    bit_count;
        unsigned int    dat_bit_offset;
        unsigned int    dir_bit_offset;
+       void            (*set)(struct gpio_chip *chip,
+                              unsigned offset, int value);
 };
 
 struct syscon_gpio_priv {
@@ -111,7 +115,7 @@ static int syscon_gpio_dir_out(struct gpio_chip *chip, unsigned offset, int val)
                                   BIT(offs % SYSCON_REG_BITS));
        }
 
-       syscon_gpio_set(chip, offset, val);
+       priv->data->set(chip, offset, val);
 
        return 0;
 }
@@ -159,7 +163,7 @@ static int syscon_gpio_probe(struct platform_device *pdev)
        if (priv->data->flags & GPIO_SYSCON_FEAT_IN)
                priv->chip.direction_input = syscon_gpio_dir_in;
        if (priv->data->flags & GPIO_SYSCON_FEAT_OUT) {
-               priv->chip.set = syscon_gpio_set;
+               priv->chip.set = priv->data->set ? : syscon_gpio_set;
                priv->chip.direction_output = syscon_gpio_dir_out;
        }