msm: mdm: use mdelay instead of usleep when resetting modem
The function to reset the external modem can be called from
atomic context so we need to use mdelay instead of usleep.
Change-Id: Ia161ced98764ed3772852f4252215452a1928ff7
Signed-off-by: Joel King <joelking@codeaurora.org>
diff --git a/arch/arm/mach-msm/mdm2.c b/arch/arm/mach-msm/mdm2.c
index f851545..6e7086e 100644
--- a/arch/arm/mach-msm/mdm2.c
+++ b/arch/arm/mach-msm/mdm2.c
@@ -77,6 +77,7 @@
mutex_unlock(&hsic_status_lock);
}
+/* This function can be called from atomic context. */
static void mdm_toggle_soft_reset(struct mdm_modem_drv *mdm_drv)
{
int soft_reset_direction_assert = 0,
@@ -88,11 +89,20 @@
}
gpio_direction_output(mdm_drv->ap2mdm_soft_reset_gpio,
soft_reset_direction_assert);
- usleep_range(5000, 10000);
+ /* Use mdelay because this function can be called from atomic
+ * context.
+ */
+ mdelay(10);
gpio_direction_output(mdm_drv->ap2mdm_soft_reset_gpio,
soft_reset_direction_de_assert);
}
+/* This function can be called from atomic context. */
+static void mdm_atomic_soft_reset(struct mdm_modem_drv *mdm_drv)
+{
+ mdm_toggle_soft_reset(mdm_drv);
+}
+
static void mdm_power_down_common(struct mdm_modem_drv *mdm_drv)
{
int i;
@@ -242,6 +252,7 @@
static struct mdm_ops mdm_cb = {
.power_on_mdm_cb = mdm_power_on_common,
.reset_mdm_cb = mdm_power_on_common,
+ .atomic_reset_mdm_cb = mdm_atomic_soft_reset,
.power_down_mdm_cb = mdm_power_down_common,
.debug_state_changed_cb = debug_state_changed,
.status_cb = mdm_status_changed,
diff --git a/arch/arm/mach-msm/mdm_common.c b/arch/arm/mach-msm/mdm_common.c
index 1b09c34..c0aed69 100644
--- a/arch/arm/mach-msm/mdm_common.c
+++ b/arch/arm/mach-msm/mdm_common.c
@@ -313,8 +313,8 @@
if (i <= 0) {
pr_err("%s: MDM2AP_STATUS never went low\n", __func__);
/* Reset the modem so that it will go into download mode. */
- if (mdm_drv && mdm_drv->ops->reset_mdm_cb)
- mdm_drv->ops->reset_mdm_cb(mdm_drv);
+ if (mdm_drv && mdm_drv->ops->atomic_reset_mdm_cb)
+ mdm_drv->ops->atomic_reset_mdm_cb(mdm_drv);
}
return NOTIFY_DONE;
}
diff --git a/arch/arm/mach-msm/mdm_private.h b/arch/arm/mach-msm/mdm_private.h
index 53bfaf0..7ac3727 100644
--- a/arch/arm/mach-msm/mdm_private.h
+++ b/arch/arm/mach-msm/mdm_private.h
@@ -18,6 +18,7 @@
struct mdm_ops {
void (*power_on_mdm_cb)(struct mdm_modem_drv *mdm_drv);
void (*reset_mdm_cb)(struct mdm_modem_drv *mdm_drv);
+ void (*atomic_reset_mdm_cb)(struct mdm_modem_drv *mdm_drv);
void (*normal_boot_done_cb)(struct mdm_modem_drv *mdm_drv);
void (*power_down_mdm_cb)(struct mdm_modem_drv *mdm_drv);
void (*debug_state_changed_cb)(int value);