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",