Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris...
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / gpio / gpio-lpc32xx.c
index ddfacc5ce56d55fce87d0131e535b27671ed5828..61c2d08d37b60ae145abd782fe917ff959c0264a 100644 (file)
 #define GPO3_PIN_TO_BIT(x)                     (1 << (x))
 #define GPIO012_PIN_IN_SEL(x, y)               (((x) >> (y)) & 1)
 #define GPIO3_PIN_IN_SHIFT(x)                  ((x) == 5 ? 24 : 10 + (x))
-#define GPIO3_PIN_IN_SEL(x, y)                 ((x) >> GPIO3_PIN_IN_SHIFT(y))
+#define GPIO3_PIN_IN_SEL(x, y)                 (((x) >> GPIO3_PIN_IN_SHIFT(y)) & 1)
 #define GPIO3_PIN5_IN_SEL(x)                   (((x) >> 24) & 1)
 #define GPI3_PIN_IN_SEL(x, y)                  (((x) >> (y)) & 1)
+#define GPO3_PIN_IN_SEL(x, y)                  (((x) >> (y)) & 1)
 
 struct gpio_regs {
        void __iomem *inp_state;
+       void __iomem *outp_state;
        void __iomem *outp_set;
        void __iomem *outp_clr;
        void __iomem *dir_set;
@@ -145,6 +147,7 @@ static struct gpio_regs gpio_grp_regs_p2 = {
 
 static struct gpio_regs gpio_grp_regs_p3 = {
        .inp_state      = LPC32XX_GPIO_P3_INP_STATE,
+       .outp_state     = LPC32XX_GPIO_P3_OUTP_STATE,
        .outp_set       = LPC32XX_GPIO_P3_OUTP_SET,
        .outp_clr       = LPC32XX_GPIO_P3_OUTP_CLR,
        .dir_set        = LPC32XX_GPIO_P2_DIR_SET,
@@ -240,6 +243,12 @@ static int __get_gpi_state_p3(struct lpc32xx_gpio_chip *group,
        return GPI3_PIN_IN_SEL(__raw_readl(group->gpio_grp->inp_state), pin);
 }
 
+static int __get_gpo_state_p3(struct lpc32xx_gpio_chip *group,
+       unsigned pin)
+{
+       return GPO3_PIN_IN_SEL(__raw_readl(group->gpio_grp->outp_state), pin);
+}
+
 /*
  * GENERIC_GPIO primitives.
  */
@@ -340,6 +349,13 @@ static void lpc32xx_gpo_set_value(struct gpio_chip *chip, unsigned pin,
        __set_gpo_level_p3(group, pin, value);
 }
 
+static int lpc32xx_gpo_get_value(struct gpio_chip *chip, unsigned pin)
+{
+       struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
+
+       return __get_gpo_state_p3(group, pin);
+}
+
 static int lpc32xx_gpio_request(struct gpio_chip *chip, unsigned pin)
 {
        if (pin < chip->ngpio)
@@ -427,6 +443,7 @@ static struct lpc32xx_gpio_chip lpc32xx_gpiochip[] = {
                        .label                  = "gpo_p3",
                        .direction_output       = lpc32xx_gpio_dir_out_always,
                        .set                    = lpc32xx_gpo_set_value,
+                       .get                    = lpc32xx_gpo_get_value,
                        .request                = lpc32xx_gpio_request,
                        .base                   = LPC32XX_GPO_P3_GRP,
                        .ngpio                  = LPC32XX_GPO_P3_MAX,