Skip to content

Commit 15a5310

Browse files
tom-shen-asusasus-leslieyu
authored andcommitted
Fixed: "echo b > /proc/sysrq-trigger" and then system hang
Change-Id: I711cf402b061216fa72b1fa85cda91f96ccb12a5
1 parent e49911b commit 15a5310

3 files changed

Lines changed: 25 additions & 0 deletions

File tree

drivers/mmc/host/dw_mmc.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@
3838
#include <linux/of.h>
3939
#include <linux/of_gpio.h>
4040
#include <linux/mmc/slot-gpio.h>
41+
#include <linux/reboot.h>
4142

4243
#include "dw_mmc.h"
44+
#include "../core/core.h"
4345

4446
/* Common flag combinations */
4547
#define DW_MCI_DATA_ERROR_FLAGS (SDMMC_INT_DRTO | SDMMC_INT_DCRC | \
@@ -2567,6 +2569,24 @@ static void dw_mci_slot_of_parse(struct dw_mci_slot *slot)
25672569
}
25682570
#endif /* CONFIG_OF */
25692571

2572+
struct dw_mci *mSdhost;
2573+
void setmmcEmergency() {
2574+
struct mmc_host *mmc = mSdhost->cur_slot->mmc;
2575+
int ret;
2576+
2577+
mmc_power_off(mmc);
2578+
mdelay(20);
2579+
2580+
if (!IS_ERR(mmc->supply.vmmc)) {
2581+
ret = regulator_enable(mmc->supply.vmmc);
2582+
}
2583+
2584+
if (!IS_ERR(mmc->supply.vqmmc))
2585+
regulator_set_voltage(mmc->supply.vqmmc, 3000000, 3300000);
2586+
2587+
}
2588+
EXPORT_SYMBOL(setmmcEmergency);
2589+
25702590
static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
25712591
{
25722592
struct mmc_host *mmc;
@@ -2596,6 +2616,9 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
25962616
mmc->f_max = freq[1];
25972617
}
25982618

2619+
if (of_find_property(host->dev->of_node, "supports-sd", NULL))
2620+
mSdhost = host;
2621+
25992622
/*if there are external regulators, get them*/
26002623
ret = mmc_regulator_get_supply(mmc);
26012624
if (ret == -EPROBE_DEFER)

include/linux/reboot.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ extern char poweroff_cmd[POWEROFF_CMD_PATH_LEN];
7373
extern void orderly_poweroff(bool force);
7474
extern void orderly_reboot(void);
7575

76+
extern void setmmcEmergency(void);
7677
/*
7778
* Emergency restart, callable from an interrupt handler.
7879
*/

kernel/reboot.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ void (*pm_power_off_prepare)(void);
6161
void emergency_restart(void)
6262
{
6363
kmsg_dump(KMSG_DUMP_EMERG);
64+
setmmcEmergency();
6465
machine_emergency_restart();
6566
}
6667
EXPORT_SYMBOL_GPL(emergency_restart);

0 commit comments

Comments
 (0)