diff --git a/target/linux/atheros/files/include/asm-mips/mach-atheros/gpio.h b/target/linux/atheros/files/include/asm-mips/mach-atheros/gpio.h
index 560b8cc0dc40bd083b0ddc9e08b690d45d2b7116..db7347c221b25071c0b28ce980ac191621180221 100644
--- a/target/linux/atheros/files/include/asm-mips/mach-atheros/gpio.h
+++ b/target/linux/atheros/files/include/asm-mips/mach-atheros/gpio.h
@@ -26,9 +26,8 @@ static inline int gpio_direction_input(unsigned gpio) {
 				return -ENXIO;				\
 			} else {					\
 				sysRegWrite(AR531X_GPIO_CR,		\
-					( sysRegRead(AR531X_GPIO_CR) &	\
-					  ~(AR531X_GPIO_CR_M(gpio)) ) |	\
-					  AR531X_GPIO_CR_I(gpio) );	\
+					sysRegRead(AR531X_GPIO_CR) |	\
+					AR531X_GPIO_CR_I(gpio) );	\
 				return 0;				\
 			}						\
 	)
@@ -42,6 +41,7 @@ static inline int gpio_direction_input(unsigned gpio) {
 				return 0;				\
 			}						\
 	)
+	return -ENXIO;
 }
 
 /* Sets a gpio to output with value, or returns ENXIO for non-existent gpio */
@@ -54,8 +54,8 @@ static inline int gpio_direction_output(unsigned gpio, int value) {
 					  ~(1 << gpio) ) |		\
 					  ((value!=0) << gpio)) );	\
 				sysRegWrite(AR531X_GPIO_CR,		\
-					sysRegRead(AR531X_GPIO_CR) |	\
-					AR531X_GPIO_CR_O(gpio) );	\
+					( sysRegRead(AR531X_GPIO_CR) &	\
+					  ~(AR531X_GPIO_CR_M(gpio)) )); \
 				return 0;				\
 			}						\
 	)
@@ -72,12 +72,14 @@ static inline int gpio_direction_output(unsigned gpio, int value) {
 				return 0;				\
 			}						\
 	)
+	return -ENXIO;
 }
 
 /* Reads the gpio pin.  Unchecked function */
 static inline int gpio_get_value(unsigned gpio) {
 	DO_AR5312(return (sysRegRead(AR531X_GPIO_DI) & (1 << gpio));)
 	DO_AR5315(return (sysRegRead(AR5315_GPIO_DI) & (1 << gpio));)
+	return 0;
 }
 
 /* Writes to the gpio pin.  Unchecked function */