From 1aeeeeaf10ad5888c1a5b3ab9b780be91c7dada9 Mon Sep 17 00:00:00 2001 From: Myy Date: Mon, 24 Jul 2017 23:09:31 +0000 Subject: [PATCH] Last try for the reboot hack If this one does not work, get a refund for your CantRebootBoard. Signed-off-by: Myy --- drivers/mmc/host/dw_mmc-rockchip.c | 24 ++++++++++++++++++++++++ drivers/mmc/host/dw_mmc.c | 26 ++++++++++++++++++++++++++ include/linux/reboot.h | 3 +++ kernel/reboot.c | 1 + 4 files changed, 54 insertions(+) diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c index aaed6f9b..71131020 100644 --- a/drivers/mmc/host/dw_mmc-rockchip.c +++ b/drivers/mmc/host/dw_mmc-rockchip.c @@ -14,10 +14,12 @@ #include #include #include +#include // Hack #include #include "dw_mmc.h" #include "dw_mmc-pltfm.h" +#include "../core/core.h" // Hack #define RK3288_CLKGEN_DIV 2 @@ -365,6 +367,27 @@ static int dw_mci_rockchip_probe(struct platform_device *pdev) return 0; } +static void dw_mci_rockchip_platfm_shutdown(struct platform_device *pdev) +{ + struct dw_mci *host = platform_get_drvdata(pdev); + struct mmc_host *mmc = host->slot->mmc; + int ret; + + if(of_machine_is_compatible("asus,rk3288-tinker")){ + + mmc_power_off(mmc); + + mdelay(20); + + if (!IS_ERR(mmc->supply.vmmc)) + ret = regulator_enable(mmc->supply.vmmc); + + if (!IS_ERR(mmc->supply.vqmmc)) + regulator_set_voltage(mmc->supply.vqmmc, 3000000, 3300000); + } +} + + static int dw_mci_rockchip_remove(struct platform_device *pdev) { pm_runtime_get_sync(&pdev->dev); @@ -385,6 +408,7 @@ static const struct dev_pm_ops dw_mci_rockchip_dev_pm_ops = { static struct platform_driver dw_mci_rockchip_pltfm_driver = { .probe = dw_mci_rockchip_probe, .remove = dw_mci_rockchip_remove, + .shutdown = dw_mci_rockchip_platfm_shutdown, .driver = { .name = "dwmmc_rockchip", .of_match_table = dw_mci_rockchip_match, diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index a9dfb269..ee956a57 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -39,8 +39,10 @@ #include #include #include +#include // Hack #include "dw_mmc.h" +#include "../core/core.h" // Hack /* Common flag combinations */ #define DW_MCI_DATA_ERROR_FLAGS (SDMMC_INT_DRTO | SDMMC_INT_DCRC | \ @@ -2687,6 +2689,28 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } +struct dw_mci *mSdhost; +void setmmcEmergency() { + struct mmc_host *mmc; + int ret; + + printk(KERN_ERR "Emergency route taken.\n"); + if (of_machine_is_compatible("asus,rk3288-tinker")) { + mmc = mSdhost->slot->mmc; + + mmc_power_off(mmc); + + mdelay(20); + + if (!IS_ERR(mmc->supply.vmmc)) + ret = regulator_enable(mmc->supply.vmmc); + + if (!IS_ERR(mmc->supply.vqmmc)) + regulator_set_voltage(mmc->supply.vqmmc, 3000000, 3300000); + } +} +EXPORT_SYMBOL(setmmcEmergency); + static int dw_mci_init_slot(struct dw_mci *host) { struct mmc_host *mmc; @@ -2718,6 +2742,8 @@ static int dw_mci_init_slot(struct dw_mci *host) mmc->f_max = freq[1]; } + if (of_find_property(host->dev->of_node, "supports-sd", NULL)) + mSdhost = host; /*if there are external regulators, get them*/ ret = mmc_regulator_get_supply(mmc); if (ret == -EPROBE_DEFER) diff --git a/include/linux/reboot.h b/include/linux/reboot.h index a7ff409f..586e4504 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h @@ -72,12 +72,15 @@ extern char poweroff_cmd[POWEROFF_CMD_PATH_LEN]; extern void orderly_poweroff(bool force); extern void orderly_reboot(void); +// Wonderful ASUS hack +extern void setmmcEmergency(void); /* * Emergency restart, callable from an interrupt handler. */ extern void emergency_restart(void); + #include #endif /* _LINUX_REBOOT_H */ diff --git a/kernel/reboot.c b/kernel/reboot.c index bd30a973..9f99488f 100644 --- a/kernel/reboot.c +++ b/kernel/reboot.c @@ -61,6 +61,7 @@ void (*pm_power_off_prepare)(void); void emergency_restart(void) { kmsg_dump(KMSG_DUMP_EMERG); + setmmcEmergency(); machine_emergency_restart(); } EXPORT_SYMBOL_GPL(emergency_restart); -- 2.13.0