|
@@ -16,6 +16,8 @@
|
|
#include <linux/device.h>
|
|
#include <linux/device.h>
|
|
#include <linux/err.h>
|
|
#include <linux/err.h>
|
|
#include <linux/gpio/consumer.h>
|
|
#include <linux/gpio/consumer.h>
|
|
|
|
+#include <linux/delay.h>
|
|
|
|
+#include <linux/property.h>
|
|
|
|
|
|
#include <linux/mmc/host.h>
|
|
#include <linux/mmc/host.h>
|
|
|
|
|
|
@@ -24,6 +26,7 @@
|
|
struct mmc_pwrseq_simple {
|
|
struct mmc_pwrseq_simple {
|
|
struct mmc_pwrseq pwrseq;
|
|
struct mmc_pwrseq pwrseq;
|
|
bool clk_enabled;
|
|
bool clk_enabled;
|
|
|
|
+ u32 post_power_on_delay_ms;
|
|
struct clk *ext_clk;
|
|
struct clk *ext_clk;
|
|
struct gpio_descs *reset_gpios;
|
|
struct gpio_descs *reset_gpios;
|
|
};
|
|
};
|
|
@@ -64,6 +67,9 @@ static void mmc_pwrseq_simple_post_power_on(struct mmc_host *host)
|
|
struct mmc_pwrseq_simple *pwrseq = to_pwrseq_simple(host->pwrseq);
|
|
struct mmc_pwrseq_simple *pwrseq = to_pwrseq_simple(host->pwrseq);
|
|
|
|
|
|
mmc_pwrseq_simple_set_gpios_value(pwrseq, 0);
|
|
mmc_pwrseq_simple_set_gpios_value(pwrseq, 0);
|
|
|
|
+
|
|
|
|
+ if (pwrseq->post_power_on_delay_ms)
|
|
|
|
+ msleep(pwrseq->post_power_on_delay_ms);
|
|
}
|
|
}
|
|
|
|
|
|
static void mmc_pwrseq_simple_power_off(struct mmc_host *host)
|
|
static void mmc_pwrseq_simple_power_off(struct mmc_host *host)
|
|
@@ -111,6 +117,9 @@ static int mmc_pwrseq_simple_probe(struct platform_device *pdev)
|
|
return PTR_ERR(pwrseq->reset_gpios);
|
|
return PTR_ERR(pwrseq->reset_gpios);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ device_property_read_u32(dev, "post-power-on-delay-ms",
|
|
|
|
+ &pwrseq->post_power_on_delay_ms);
|
|
|
|
+
|
|
pwrseq->pwrseq.dev = dev;
|
|
pwrseq->pwrseq.dev = dev;
|
|
pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops;
|
|
pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops;
|
|
pwrseq->pwrseq.owner = THIS_MODULE;
|
|
pwrseq->pwrseq.owner = THIS_MODULE;
|