diff options
author | Ulf Hansson <ulf.hansson@linaro.org> | 2017-05-06 05:43:05 -0400 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2017-05-23 08:17:36 -0400 |
commit | e9256e142f597edf90c68cec22db4c4aebaa27de (patch) | |
tree | d46304bb84308db1b084819e36db02aaeadeb228 /drivers/mmc/core/pwrseq_simple.c | |
parent | c477ebe21fabe0010a2ed324ce3a1762c757d867 (diff) |
mmc: pwrseq_simple: Parse DTS for the power-off-delay-us property
If the optional power-off-delay-us property is found, insert the
corresponding delay after asserting the GPIO during power off. This enables
a graceful shutdown sequence for some devices.
Cc: linux-mmc@vger.kernel.org
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'drivers/mmc/core/pwrseq_simple.c')
-rw-r--r-- | drivers/mmc/core/pwrseq_simple.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/mmc/core/pwrseq_simple.c b/drivers/mmc/core/pwrseq_simple.c index 1304160de168..13ef162cf066 100644 --- a/drivers/mmc/core/pwrseq_simple.c +++ b/drivers/mmc/core/pwrseq_simple.c | |||
@@ -27,6 +27,7 @@ struct mmc_pwrseq_simple { | |||
27 | struct mmc_pwrseq pwrseq; | 27 | struct mmc_pwrseq pwrseq; |
28 | bool clk_enabled; | 28 | bool clk_enabled; |
29 | u32 post_power_on_delay_ms; | 29 | u32 post_power_on_delay_ms; |
30 | u32 power_off_delay_us; | ||
30 | struct clk *ext_clk; | 31 | struct clk *ext_clk; |
31 | struct gpio_descs *reset_gpios; | 32 | struct gpio_descs *reset_gpios; |
32 | }; | 33 | }; |
@@ -78,6 +79,10 @@ static void mmc_pwrseq_simple_power_off(struct mmc_host *host) | |||
78 | 79 | ||
79 | mmc_pwrseq_simple_set_gpios_value(pwrseq, 1); | 80 | mmc_pwrseq_simple_set_gpios_value(pwrseq, 1); |
80 | 81 | ||
82 | if (pwrseq->power_off_delay_us) | ||
83 | usleep_range(pwrseq->power_off_delay_us, | ||
84 | 2 * pwrseq->power_off_delay_us); | ||
85 | |||
81 | if (!IS_ERR(pwrseq->ext_clk) && pwrseq->clk_enabled) { | 86 | if (!IS_ERR(pwrseq->ext_clk) && pwrseq->clk_enabled) { |
82 | clk_disable_unprepare(pwrseq->ext_clk); | 87 | clk_disable_unprepare(pwrseq->ext_clk); |
83 | pwrseq->clk_enabled = false; | 88 | pwrseq->clk_enabled = false; |
@@ -119,6 +124,8 @@ static int mmc_pwrseq_simple_probe(struct platform_device *pdev) | |||
119 | 124 | ||
120 | device_property_read_u32(dev, "post-power-on-delay-ms", | 125 | device_property_read_u32(dev, "post-power-on-delay-ms", |
121 | &pwrseq->post_power_on_delay_ms); | 126 | &pwrseq->post_power_on_delay_ms); |
127 | device_property_read_u32(dev, "power-off-delay-us", | ||
128 | &pwrseq->power_off_delay_us); | ||
122 | 129 | ||
123 | pwrseq->pwrseq.dev = dev; | 130 | pwrseq->pwrseq.dev = dev; |
124 | pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops; | 131 | pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops; |