|
|
@@ -30,19 +30,14 @@ struct mmc_pwrseq_emmc {
|
|
|
|
|
|
#define to_pwrseq_emmc(p) container_of(p, struct mmc_pwrseq_emmc, pwrseq)
|
|
|
|
|
|
-static void __mmc_pwrseq_emmc_reset(struct mmc_pwrseq_emmc *pwrseq)
|
|
|
-{
|
|
|
- gpiod_set_value(pwrseq->reset_gpio, 1);
|
|
|
- udelay(1);
|
|
|
- gpiod_set_value(pwrseq->reset_gpio, 0);
|
|
|
- udelay(200);
|
|
|
-}
|
|
|
-
|
|
|
static void mmc_pwrseq_emmc_reset(struct mmc_host *host)
|
|
|
{
|
|
|
struct mmc_pwrseq_emmc *pwrseq = to_pwrseq_emmc(host->pwrseq);
|
|
|
|
|
|
- __mmc_pwrseq_emmc_reset(pwrseq);
|
|
|
+ gpiod_set_value_cansleep(pwrseq->reset_gpio, 1);
|
|
|
+ udelay(1);
|
|
|
+ gpiod_set_value_cansleep(pwrseq->reset_gpio, 0);
|
|
|
+ udelay(200);
|
|
|
}
|
|
|
|
|
|
static int mmc_pwrseq_emmc_reset_nb(struct notifier_block *this,
|
|
|
@@ -50,8 +45,11 @@ static int mmc_pwrseq_emmc_reset_nb(struct notifier_block *this,
|
|
|
{
|
|
|
struct mmc_pwrseq_emmc *pwrseq = container_of(this,
|
|
|
struct mmc_pwrseq_emmc, reset_nb);
|
|
|
+ gpiod_set_value(pwrseq->reset_gpio, 1);
|
|
|
+ udelay(1);
|
|
|
+ gpiod_set_value(pwrseq->reset_gpio, 0);
|
|
|
+ udelay(200);
|
|
|
|
|
|
- __mmc_pwrseq_emmc_reset(pwrseq);
|
|
|
return NOTIFY_DONE;
|
|
|
}
|
|
|
|
|
|
@@ -72,14 +70,18 @@ static int mmc_pwrseq_emmc_probe(struct platform_device *pdev)
|
|
|
if (IS_ERR(pwrseq->reset_gpio))
|
|
|
return PTR_ERR(pwrseq->reset_gpio);
|
|
|
|
|
|
- /*
|
|
|
- * register reset handler to ensure emmc reset also from
|
|
|
- * emergency_reboot(), priority 255 is the highest priority
|
|
|
- * so it will be executed before any system reboot handler.
|
|
|
- */
|
|
|
- pwrseq->reset_nb.notifier_call = mmc_pwrseq_emmc_reset_nb;
|
|
|
- pwrseq->reset_nb.priority = 255;
|
|
|
- register_restart_handler(&pwrseq->reset_nb);
|
|
|
+ if (!gpiod_cansleep(pwrseq->reset_gpio)) {
|
|
|
+ /*
|
|
|
+ * register reset handler to ensure emmc reset also from
|
|
|
+ * emergency_reboot(), priority 255 is the highest priority
|
|
|
+ * so it will be executed before any system reboot handler.
|
|
|
+ */
|
|
|
+ pwrseq->reset_nb.notifier_call = mmc_pwrseq_emmc_reset_nb;
|
|
|
+ pwrseq->reset_nb.priority = 255;
|
|
|
+ register_restart_handler(&pwrseq->reset_nb);
|
|
|
+ } else {
|
|
|
+ dev_notice(dev, "EMMC reset pin tied to a sleepy GPIO driver; reset on emergency-reboot disabled\n");
|
|
|
+ }
|
|
|
|
|
|
pwrseq->pwrseq.ops = &mmc_pwrseq_emmc_ops;
|
|
|
pwrseq->pwrseq.dev = dev;
|