From 1a249d948b7ccc97fcd10d80ef5b6eb43f120260 Mon Sep 17 00:00:00 2001 From: Nan Li Date: Thu, 10 Oct 2019 15:31:59 +0800 Subject: [PATCH] sd: add sd power cycle for sd3.0 [1/1] PD#SWPL-14953 Problem: SD card 3.0 mode requires power cycle. if not, the initialization of SD card will be affected. Solution: add SD power cycle supported. Verify: sm1_ac200 Change-Id: Ic8aecadf3b63660adb74ff4ecf0a5d38037b579f Signed-off-by: Nan Li --- arch/arm/boot/dts/amlogic/mesonsm1.dtsi | 18 +++++++++++++++++- arch/arm64/boot/dts/amlogic/mesonsm1.dtsi | 18 +++++++++++++++++- drivers/amlogic/mmc/aml_sd_emmc_v3.c | 4 ++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi index d881974dc731..5ce0ad55bacd 100644 --- a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi @@ -1511,7 +1511,8 @@ "sd_to_ao_uart_pins", "ao_to_sd_uart_pins", "sd_to_ao_jtag_pins", - "ao_to_sd_jtag_pins"; + "ao_to_sd_jtag_pins", + "sd_all_pd_pins"; pinctrl-0 = <&sd_all_pins>; pinctrl-1 = <&sd_clk_cmd_pins>; @@ -1526,6 +1527,7 @@ pinctrl-7 = <&sd_all_pins &sd_to_ao_uart_pins>; pinctrl-8 = <&sd_to_ao_uart_clr_pins &ao_to_sd_uart_pins>; + pinctrl-9 = <&sd_all_pd_pins>; clocks = <&clkc CLKID_SD_EMMC_B>, <&clkc CLKID_SD_EMMC_B_P0_COMP>, @@ -2047,6 +2049,20 @@ }; }; + sd_all_pd_pins:sd_all_pd_pins { + mux { + groups = "GPIOC_0", + "GPIOC_1", + "GPIOC_2", + "GPIOC_3", + "GPIOC_4", + "GPIOC_5"; + function = "gpio_periphs"; + bias-pull-down; + output-low; + }; + }; + sd_1bit_pins:sd_1bit_pins { mux { groups = "sdcard_d0_c", diff --git a/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi index 14eb1ca14aa6..6a9c5b708c1b 100644 --- a/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi @@ -1510,7 +1510,8 @@ "sd_to_ao_uart_pins", "ao_to_sd_uart_pins", "sd_to_ao_jtag_pins", - "ao_to_sd_jtag_pins"; + "ao_to_sd_jtag_pins", + "sd_all_pd_pins"; pinctrl-0 = <&sd_all_pins>; pinctrl-1 = <&sd_clk_cmd_pins>; @@ -1525,6 +1526,7 @@ pinctrl-7 = <&sd_all_pins &sd_to_ao_uart_pins>; pinctrl-8 = <&sd_to_ao_uart_clr_pins &ao_to_sd_uart_pins>; + pinctrl-8 = <&sd_all_pd_pins>; clocks = <&clkc CLKID_SD_EMMC_B>, <&clkc CLKID_SD_EMMC_B_P0_COMP>, @@ -2007,6 +2009,20 @@ }; }; + sd_all_pd_pins:sd_all_pd_pins { + mux { + groups = "GPIOC_0", + "GPIOC_1", + "GPIOC_2", + "GPIOC_3", + "GPIOC_4", + "GPIOC_5"; + function = "gpio_periphs"; + bias-pull-down; + output-low; + }; + }; + sd_1bit_pins:sd_1bit_pins { mux { groups = "sdcard_d0_c", diff --git a/drivers/amlogic/mmc/aml_sd_emmc_v3.c b/drivers/amlogic/mmc/aml_sd_emmc_v3.c index a731644042ef..546686aec8ab 100644 --- a/drivers/amlogic/mmc/aml_sd_emmc_v3.c +++ b/drivers/amlogic/mmc/aml_sd_emmc_v3.c @@ -470,6 +470,10 @@ static void aml_sd_emmc_set_power_v3(struct amlsd_platform *pdata, pdata->pwr_on(pdata); break; case MMC_POWER_UP: + if (aml_card_type_non_sdio(pdata)) { + of_amlsd_pwr_off(pdata); + of_amlsd_pwr_on(pdata); + } break; case MMC_POWER_OFF: writel(0, host->base + SD_EMMC_DELAY1_V3);