diff --git a/drivers/amlogic/reboot/reboot.c b/drivers/amlogic/reboot/reboot.c index 112939baa7e5..338a2c345862 100644 --- a/drivers/amlogic/reboot/reboot.c +++ b/drivers/amlogic/reboot/reboot.c @@ -41,9 +41,12 @@ #if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) #include #include +#include int sd_volsw_gpio; int sd_power_gpio; +int sd_vddio_gpio; + #define CHECK_RET(ret) { \ if (ret) \ pr_err("[%s] gpio op failed(%d) at line %d\n",\ @@ -130,7 +133,7 @@ void meson_common_restart(char mode, const char *cmd) } #if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) -void odroid_card_reset(void) +void odroidn2_card_reset(void) { int ret = 0; @@ -157,11 +160,48 @@ void odroid_card_reset(void) gpio_free(sd_volsw_gpio); gpio_free(sd_power_gpio); } +void odroidc4_card_reset(void) +{ + int ret = 0; + + if ((sd_vddio_gpio == 0) && (sd_power_gpio == 0) && + (sd_power_gpio == 0)) + return; + + gpio_free(sd_volsw_gpio); + gpio_free(sd_vddio_gpio); + gpio_free(sd_power_gpio); + + ret = gpio_request_one(sd_volsw_gpio, + GPIOF_OUT_INIT_LOW, "REBOOT"); + CHECK_RET(ret); + ret = gpio_request_one(sd_vddio_gpio, + GPIOF_OUT_INIT_LOW, "REBOOT"); + CHECK_RET(ret); + ret = gpio_request_one(sd_power_gpio, + GPIOF_OUT_INIT_LOW, "REBOOT"); + CHECK_RET(ret); + mdelay(100); + ret = gpio_direction_input(sd_vddio_gpio); + CHECK_RET(ret); + ret = gpio_direction_input(sd_power_gpio); + CHECK_RET(ret); + ret = gpio_direction_input(sd_volsw_gpio); + CHECK_RET(ret); + mdelay(5); + gpio_free(sd_vddio_gpio); + gpio_free(sd_power_gpio); + gpio_free(sd_volsw_gpio); +} #endif // CONFIG_ARCH_MESON64_ODROID_COMMON + static void do_aml_restart(enum reboot_mode reboot_mode, const char *cmd) { #if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) - odroid_card_reset(); + if (!board_is_odroidn2()) + odroidc4_card_reset(); + else + odroidn2_card_reset(); #endif meson_common_restart(reboot_mode, cmd); } @@ -210,6 +250,10 @@ static int aml_restart_probe(struct platform_device *pdev) sd_volsw_gpio = of_get_named_gpio(of_node, "sd_volsw_gpio", 0); sd_power_gpio = of_get_named_gpio(of_node, "sd_power_gpio", 0); + if (!board_is_odroidn2()) { + sd_vddio_gpio = 0; + sd_vddio_gpio = of_get_named_gpio(of_node, "sd_vddio_gpio", 0); + } #endif ret = register_die_notifier(&panic_notifier); return ret;