Explicitly set gpio values on boot

This gives us a known good configuration on boot. Changes from default:
GPIOs 0-3 and 12 are don't-care, and GPIO 14 is temp sensor CS (output).

Default cold boot values:
GPIO_OE:     0x0000b31b
GPIO_OUT:    0x0000002f
GPIO_OUT_F0: 0x00000000
GPIO_OUT_F1: 0x0c080980
GPIO_OUT_F2: 0x00160000
GPIO_OUT_F3: 0x00000000
GPIO_OUT_F4: 0x00000100

Changed values:
GPIO_OE:     0x00002310
GPIO_OUT:    0x00004020
GPIO_OUT_F1: 0x0c080900
(...)

Change-Id: I886b2a1d30bc5bed3976d42bf16842a3eeb6fe8f
diff --git a/arch/mips/ath79/dev-gfmn100.h b/arch/mips/ath79/dev-gfmn100.h
index 3066b79..c39e3ff 100644
--- a/arch/mips/ath79/dev-gfmn100.h
+++ b/arch/mips/ath79/dev-gfmn100.h
@@ -13,6 +13,61 @@
 
 #include <linux/spi/flash.h>
 
+#define GFMN_GPIO_REG_OUT	AR71XX_GPIO_REG_OUT
+#define GFMN_GPIO_REG_OE	AR71XX_GPIO_REG_OE
+
+#define GFMN_GPIO_TCK		(1 << 0)
+#define GFMN_GPIO_TDI		(1 << 1)
+#define GFMN_GPIO_TDO		(1 << 2)
+#define GFMN_GPIO_TMS		(1 << 3)
+#define GFMN_GPIO_POE		(1 << 4)
+#define GFMN_GPIO_SPI_CS	(1 << 5)
+#define GFMN_GPIO_SPI_CLK	(1 << 6)
+#define GFMN_GPIO_SPI_MOSI	(1 << 7)
+#define GFMN_GPIO_SPI_MISO	(1 << 8)
+#define GFMN_GPIO_UART_RX	(1 << 9)
+#define GFMN_GPIO_UART_TX	(1 << 10)
+#define GFMN_GPIO_LEDB		(1 << 11)
+#define GFMN_GPIO_HWREV1	(1 << 12)
+#define GFMN_GPIO_RESET_SW	(1 << 13)
+#define GFMN_GPIO_TEMP_CS	(1 << 14)
+#define GFMN_GPIO_GPIO15	(1 << 15)
+#define GFMN_GPIO_LEDR		(1 << 16)
+#define GFMN_GPIO_NOR_RESET	(1 << 17)
+
+#define GFMN_GPIO_MUX_SYS_RST_L	1
+#define GFMN_GPIO_MUX_SPI_CLK		8
+#define GFMN_GPIO_MUX_SPI_CS_0		9
+#define GFMN_GPIO_MUX_SPI_CS_1		10
+#define GFMN_GPIO_MUX_SPI_CS_2		11
+#define GFMN_GPIO_MUX_SPI_MOSI		12
+#define GFMN_GPIO_MUX_UART_TX		22
+
+#define GFMN_GPIO_REG_OUT_FUNC0 0x2c
+#define GFMN_GPIO_REG_OUT_FUNC1 0x30
+#define GFMN_GPIO_REG_OUT_FUNC2 0x34
+#define GFMN_GPIO_REG_OUT_FUNC3 0x38
+#define GFMN_GPIO_REG_OUT_FUNC4 0x3c
+
+#define GFMN_GPIO_FUNC0_GPIO_0_SET(x)	((x) << 0)
+#define GFMN_GPIO_FUNC0_GPIO_1_SET(x)	((x) << 8)
+#define GFMN_GPIO_FUNC0_GPIO_2_SET(x)	((x) << 16)
+#define GFMN_GPIO_FUNC0_GPIO_3_SET(x)	((x) << 24)
+#define GFMN_GPIO_FUNC1_GPIO_4_SET(x)	((x) << 0)
+#define GFMN_GPIO_FUNC1_GPIO_5_SET(x)	((x) << 8)
+#define GFMN_GPIO_FUNC1_GPIO_6_SET(x)	((x) << 16)
+#define GFMN_GPIO_FUNC1_GPIO_7_SET(x)	((x) << 24)
+#define GFMN_GPIO_FUNC2_GPIO_8_SET(x)	((x) << 0)
+#define GFMN_GPIO_FUNC2_GPIO_9_SET(x)	((x) << 8)
+#define GFMN_GPIO_FUNC2_GPIO_10_SET(x)	((x) << 16)
+#define GFMN_GPIO_FUNC2_GPIO_11_SET(x)	((x) << 24)
+#define GFMN_GPIO_FUNC3_GPIO_12_SET(x)	((x) << 0)
+#define GFMN_GPIO_FUNC3_GPIO_13_SET(x)	((x) << 8)
+#define GFMN_GPIO_FUNC3_GPIO_14_SET(x)	((x) << 16)
+#define GFMN_GPIO_FUNC3_GPIO_15_SET(x)	((x) << 24)
+#define GFMN_GPIO_FUNC4_GPIO_16_SET(x)	((x) << 0)
+#define GFMN_GPIO_FUNC4_GPIO_17_SET(x)	((x) << 8)
+
 extern struct ath79_spi_platform_data ath79_spi_data;
 
 void ath79_register_gfmn100(void) __init;
diff --git a/arch/mips/ath79/mach-gf-windcharger.c b/arch/mips/ath79/mach-gf-windcharger.c
index c48f8de..03e9000 100644
--- a/arch/mips/ath79/mach-gf-windcharger.c
+++ b/arch/mips/ath79/mach-gf-windcharger.c
@@ -38,6 +38,11 @@
 #define AP143_MAC1_OFFSET		6
 #define AP143_WMAC_CALDATA_OFFSET	0x1000
 
+void set_gpio_reg(u32 gpio_reg, u32 val)
+{
+	__raw_writel(val, (u32 *)KSEG1ADDR(AR71XX_GPIO_BASE + gpio_reg));
+}
+
 static void __init windcharger_setup(void)
 {
 	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
@@ -66,6 +71,20 @@
 	ath79_switch_data.phy_poll_mask |= BIT(4);
 	ath79_switch_data.phy4_mii_en = 1;
 	ath79_register_eth(1);
+
+	set_gpio_reg(GFMN_GPIO_REG_OE, (GFMN_GPIO_POE | GFMN_GPIO_UART_RX |
+	    GFMN_GPIO_RESET_SW | GFMN_GPIO_SPI_MISO));
+	set_gpio_reg(GFMN_GPIO_REG_OUT, (GFMN_GPIO_SPI_CS | GFMN_GPIO_TEMP_CS));
+	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC0, 0);
+	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC1,
+	    GFMN_GPIO_FUNC1_GPIO_5_SET(GFMN_GPIO_MUX_SPI_CS_0) |
+	    GFMN_GPIO_FUNC1_GPIO_6_SET(GFMN_GPIO_MUX_SPI_CLK) |
+	    GFMN_GPIO_FUNC1_GPIO_7_SET(GFMN_GPIO_MUX_SPI_MOSI));
+	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC2,
+	    GFMN_GPIO_FUNC2_GPIO_10_SET(GFMN_GPIO_MUX_UART_TX));
+	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC3, 0);
+	set_gpio_reg(GFMN_GPIO_REG_OUT_FUNC4,
+	    GFMN_GPIO_FUNC4_GPIO_17_SET(GFMN_GPIO_MUX_SYS_RST_L));
 }
 
 MIPS_MACHINE(ATH79_MACH_GF_WINDCHARGER, "MN100",