From 49264b25b9727c26f7968f7bf76f33d3c0436e1b Mon Sep 17 00:00:00 2001 From: lintao Date: Wed, 26 Mar 2014 13:19:17 +0800 Subject: [PATCH] mmc: host: rk3288-pinctrl: fix sdmmc & sdio0 controller pad iomux setting rk_sdmmc: setting default pinctrl in controller probe but eMMC. --- arch/arm/boot/dts/rk3288-pinctrl.dtsi | 114 ++++++++++++++++++++++++++ arch/arm/boot/dts/rk3288.dtsi | 40 ++++----- drivers/mmc/host/rk_sdmmc.c | 21 ++++- include/linux/mmc/rk_mmc.h | 4 + 4 files changed, 159 insertions(+), 20 deletions(-) diff --git a/arch/arm/boot/dts/rk3288-pinctrl.dtsi b/arch/arm/boot/dts/rk3288-pinctrl.dtsi index b121ff87c029..220b53ce34c5 100755 --- a/arch/arm/boot/dts/rk3288-pinctrl.dtsi +++ b/arch/arm/boot/dts/rk3288-pinctrl.dtsi @@ -820,8 +820,122 @@ rockchip,drive = ; //rockchip,tristate = ; }; + + sdmmc0_gpio: sdmmc0_gpio{ + rockchip,pins = + , //CMD + , //CLK + , //DET + , //D0 + , //D1 + , //D2 + ; //D3 + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + }; + gpio4_sdio0 { + + sdio0_clk: sdio0_clk { + rockchip,pins = ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + sdio0_cmd: sdio0_cmd { + rockchip,pins = ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + sdio0_dectn: sdio0-dectn{ + rockchip,pins = ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + sdio0_wrprt: sdio0_wrprt{ + rockchip,pins = ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + sdio0_pwr: sdio0-pwren{ + rockchip,pins = ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + sdio0_bkpwr: sdio0-bkpwr{ + rockchip,pins = ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + sdio0_intn: sdio0-intn{ + rockchip,pins = ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + + sdio0_bus1: sdio0-bus-width1 { + rockchip,pins = ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + sdio0_bus4: sdio0-bus-width4 { + rockchip,pins = , + , + , + ; + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + + sdio0_gpio: sdio0-all-gpio{ + rockchip,pins = + , //CLK + , //CMD + , //DET + , //wrprt + , //PWREN + , //BKPWR + , //DO + , //D1 + , //D2 + , //D3 + ; //INTN + rockchip,pull = ; + //rockchip,voltage = ; + rockchip,drive = ; + //rockchip,tristate = ; + }; + }; + gpio2_gps { gps_mag:gps-mag { rockchip,pins = ; diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 227f643a8e6c..a44d231bccdf 100755 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -271,39 +271,41 @@ }; sdmmc: rksdmmc@ff0c0000 { - compatible = "rockchip,rk_mmc"; + compatible = "rockchip,rk_mmc"; reg = <0xff0c0000 0x4000>; interrupts = ; /*irq=64*/ - #address-cells = <1>; - #size-cells = <0>; + #address-cells = <1>; + #size-cells = <0>; - //pinctrl-names = "default","suspend"; - //pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_wp &sd0_pwr &sd0_bus1 &sd0_bus4>; - //pinctrl-1 = <&sd0_cd_gpio>; //for int gpio? + pinctrl-names = "default","idle"; + pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_dectn &sdmmc0_bus4>; + pinctrl-1 = <&sdmmc0_gpio>; clocks = <&clk_sdmmc>, <&clk_gates8 3>; clock-names = "clk_mmc", "hclk_mmc"; - num-slots = <1>; - fifo-depth = <0x100>; - bus-width = <4>; + num-slots = <1>; + fifo-depth = <0x100>; + bus-width = <4>; }; sdio: rksdmmc@ff0d0000 { compatible = "rockchip,rk_mmc"; - reg = <0xff0d0000 0x4000>; - interrupts = ; - #address-cells = <1>; - #size-cells = <0>; - //pinctrl-names = "default","suspend"; - //pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_cd &sd1_wp &sd1_bus1 &sd1_bus4>; - + reg = <0xff0d0000 0x4000>; + interrupts = ; + #address-cells = <1>; + #size-cells = <0>; + pinctrl-names = "default","idle"; + pinctrl-0 = <&sdio0_clk &sdio0_cmd &sdio0_dectn &sdio0_wrprt &sdio0_pwr &sdio0_bkpwr + &sdio0_intn &sdio0_bus4>; + pinctrl-1 = <&sdio0_gpio>; + clocks = <&clk_sdio0>, <&clk_gates8 4>; clock-names = "clk_mmc", "hclk_mmc"; - num-slots = <1>; + num-slots = <1>; - fifo-depth = <0x100>; - bus-width = <4>; + fifo-depth = <0x100>; + bus-width = <4>; }; sdio1: rksdmmc@ff0e0000 { diff --git a/drivers/mmc/host/rk_sdmmc.c b/drivers/mmc/host/rk_sdmmc.c index 44790e43760d..793c8ba8d5e2 100755 --- a/drivers/mmc/host/rk_sdmmc.c +++ b/drivers/mmc/host/rk_sdmmc.c @@ -727,7 +727,8 @@ static int dw_mci_submit_data_dma(struct dw_mci *host, struct mmc_data *data) if (host->prev_blksz != data->blksz) dw_mci_adjust_fifoth(host, data); - temp = mci_readl(host, CTRL); + /* Reset DMA FIFO*/ + temp = mci_readl(host, CTRL); temp |= (SDMMC_CTRL_DMA_RESET | SDMMC_CTRL_FIFO_RESET); mci_writel(host, CTRL, temp); @@ -756,6 +757,11 @@ static void dw_mci_submit_data(struct dw_mci *host, struct mmc_data *data) host->sg = NULL; host->data = data; + /* Reset FIFO*/ + temp = mci_readl(host, CTRL); + temp |= (SDMMC_CTRL_DMA_RESET | SDMMC_CTRL_FIFO_RESET); + mci_writel(host, CTRL, temp); + if (data->flags & MMC_DATA_READ) { host->dir_status = DW_MCI_RECV_STATUS; dw_mci_ctrl_rd_thld(host, data); @@ -2649,6 +2655,19 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) if (ret) goto err_setup_bus; + /* Pinctrl set default iomux state to fucntion port. + * Fixme: DON'T TOUCH EMMC SETTING! + */ + if(!(host->mmc->restrict_caps & RESTRICT_CARD_TYPE_EMMC)) + { + host->pinctrl = devm_pinctrl_get(host->dev); + host->pins_default = pinctrl_lookup_state(host->pinctrl,PINCTRL_STATE_DEFAULT); + if(!host->pins_default) + pinctrl_select_state(host->pinctrl, host->pins_default); + else + printk("%s: Warning : No default pinctrl matched!\n",mmc_hostname(host->mmc)); + } + #if defined(CONFIG_DEBUG_FS) dw_mci_init_debugfs(slot); #endif diff --git a/include/linux/mmc/rk_mmc.h b/include/linux/mmc/rk_mmc.h index a2984f83bab9..c21f8ba6c803 100755 --- a/include/linux/mmc/rk_mmc.h +++ b/include/linux/mmc/rk_mmc.h @@ -195,6 +195,10 @@ struct dw_mci { struct regulator *vmmc; /* Power regulator */ unsigned long irq_flags; /* IRQ flags */ int irq; + struct pinctrl *pinctrl; /*Pinctrl state*/ + struct pinctrl_state *pins_default; + struct pinctrl_state *pins_idle; + struct pinctrl_state *pins_sleep; }; /* DMA ops for Internal/External DMAC interface */ -- 2.34.1