/*
  * Digital I/O driver for Technologic Systems I2C FPGA Core
  *
- * Copyright (C) 2015 Technologic Systems
+ * Copyright (C) 2015, 2018 Technologic Systems
  * Copyright (C) 2016 Savoir-Faire Linux
  *
  * This program is free software; you can redistribute it and/or
 {
        struct ts4900_gpio_priv *priv = gpiochip_get_data(chip);
 
-       /*
-        * This will clear the output enable bit, the other bits are
-        * dontcare when this is cleared
+       /* Only clear the OE bit here, requires a RMW. Prevents potential issue
+        * with OE and data getting to the physical pin at different times.
         */
-       return regmap_write(priv->regmap, offset, 0);
+       return regmap_update_bits(priv->regmap, offset, TS4900_GPIO_OE, 0);
 }
 
 static int ts4900_gpio_direction_output(struct gpio_chip *chip,
                                        unsigned int offset, int value)
 {
        struct ts4900_gpio_priv *priv = gpiochip_get_data(chip);
+       unsigned int reg;
        int ret;
 
+       /* If changing from an input to an output, we need to first set the
+        * proper data bit to what is requested and then set OE bit. This
+        * prevents a glitch that can occur on the IO line
+        */
+       regmap_read(priv->regmap, offset, ®);
+       if (!(reg & TS4900_GPIO_OE)) {
+               if (value)
+                       reg = TS4900_GPIO_OUT;
+               else
+                       reg &= ~TS4900_GPIO_OUT;
+
+               regmap_write(priv->regmap, offset, reg);
+       }
+
        if (value)
                ret = regmap_write(priv->regmap, offset, TS4900_GPIO_OE |
                                                         TS4900_GPIO_OUT);