diff --git a/target/linux/ar7/files/include/asm-mips/ar7/gpio.h b/target/linux/ar7/files/include/asm-mips/ar7/gpio.h
index 2e19fcae9d9f9c6ea3f97d32bf8047a006dec312..7d665ff62dd6115a1f1bd4b8bd2a7995d4380442 100644
--- a/target/linux/ar7/files/include/asm-mips/ar7/gpio.h
+++ b/target/linux/ar7/files/include/asm-mips/ar7/gpio.h
@@ -28,19 +28,28 @@ extern void gpio_free(unsigned gpio);
 /* Common GPIO layer */
 static inline int gpio_get_value(unsigned gpio)
 {
-	void __iomem *gpio_in =
-		(void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_INPUT);
+	static unsigned addr;
 
-	return readl(gpio_in) & (1 << gpio);
+	if (!addr) {
+		void __iomem *gpio_in = (void __iomem *)
+				KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_INPUT);
+		addr = readl(gpio_in);
+	}
+
+	return addr & (1 << gpio);
 }
 
 static inline void gpio_set_value(unsigned gpio, int value)
 {
+	static unsigned addr;
+	unsigned tmp;
+
 	void __iomem *gpio_out =
 		(void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_OUTPUT);
-	unsigned tmp;
+	if (!addr)
+		addr = readl(gpio_out);
 
-	tmp = readl(gpio_out) & ~(1 << gpio);
+	tmp = addr & ~(1 << gpio);
 	if (value)
 		tmp |= 1 << gpio;
 	writel(tmp, gpio_out);