immortalwrt/target/linux/ramips/patches-4.14/500-hack-mt76x8-pinctrl-esdmode.patch
Chuanhong Guo 639dd37fd7 ramips: mt76x8: pinctrl: add a hack for ESD_MODE bit in GPIO1_MODE
This bit is used to specify sdxc pinmap for mt76x8. Details available
in patch description.

To properly solve this problem and the other pinctrl hack in mtk-mmc
driver we'll need to write a dedicated pinctrl driver for mt76x8,
with the support for configuring AGPIO_MODE and RGCTL registers as
well as specially handling GPIO reservation/pinctrl setup for ESDMODE.

Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
2020-03-13 11:15:47 +08:00

56 lines
2.2 KiB
Diff

From: Chuanhong Guo <gch981213@gmail.com>
Date: Sat, 13 Jul 2019 17:59:03 +0800
Subject: [PATCH] ramips: hack: add esdmode pinctrl group
Since mt76x8an ver1 eco2, SDXC pins can be switched to the
following pinmap:
sd_d1 -> PAD_I2S_SDI
sd_d0 -> PAD_I2S_WS
sd_cmd -> PAD_I2S_CLK
sd_d3 -> PAD_I2C_SCLK
sd_d2 -> PAD_I2C_SD
sd_clk -> PAD_GPIO0
sd_wp -> PAD_TXD1
sd_cd -> PAD_RXD1
To use this pinmap, one would need to set ESD_MODE bit (bit 15)
to 1 in GPIO1_MODE and switch other used pads into GPIO mode.
MTK called this pinmap "router mode" and the pinmap described
in their datasheed is called "iot mode".
This patch is hacky because:
1. pinmux-rt2880 doesn't support reserving noncontiguous GPIO
pins so those GPIOs can't be properly reserved.
2. it misused "gpio" function for "iot mode", due to the fact
that this mode doesn't reserve any GPIOs.
Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
---
--- a/arch/mips/ralink/mt7620.c
+++ b/arch/mips/ralink/mt7620.c
@@ -149,6 +149,7 @@ static struct rt2880_pmx_func refclk_grp
static struct rt2880_pmx_func perst_grp_mt7628[] = { FUNC("perst", 0, 36, 1) };
static struct rt2880_pmx_func wdt_grp_mt7628[] = { FUNC("wdt", 0, 38, 1) };
static struct rt2880_pmx_func spi_grp_mt7628[] = { FUNC("spi", 0, 7, 4) };
+static struct rt2880_pmx_func esd_mode_grp_mt7628[] = { FUNC("sdxc", 1, 0, 0) };
static struct rt2880_pmx_func sd_mode_grp_mt7628[] = {
FUNC("jtag", 3, 22, 8),
@@ -297,6 +298,7 @@ static struct rt2880_pmx_func wled_an_gr
#define MT7628_GPIO_MODE_I2C 20
#define MT7628_GPIO_MODE_REFCLK 18
#define MT7628_GPIO_MODE_PERST 16
+#define MT7628_GPIO_MODE_ESDMODE 15
#define MT7628_GPIO_MODE_WDT 14
#define MT7628_GPIO_MODE_SPI 12
#define MT7628_GPIO_MODE_SDMODE 10
@@ -319,6 +321,7 @@ static struct rt2880_pmx_group mt7628an_
1, MT7628_GPIO_MODE_I2C),
GRP("refclk", refclk_grp_mt7628, 1, MT7628_GPIO_MODE_REFCLK),
GRP("perst", perst_grp_mt7628, 1, MT7628_GPIO_MODE_PERST),
+ GRP_G("esdmode", esd_mode_grp_mt7628, 1, 0, MT7628_GPIO_MODE_ESDMODE),
GRP("wdt", wdt_grp_mt7628, 1, MT7628_GPIO_MODE_WDT),
GRP("spi", spi_grp_mt7628, 1, MT7628_GPIO_MODE_SPI),
GRP_G("sdmode", sd_mode_grp_mt7628, MT7628_GPIO_MODE_MASK,