diff options
Diffstat (limited to 'drivers/misc/modem_if/modem_modemctl_device_sprd8803.c')
-rw-r--r-- | drivers/misc/modem_if/modem_modemctl_device_sprd8803.c | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c b/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c index cfa2896..7a6e6fc 100644 --- a/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c +++ b/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c @@ -22,10 +22,13 @@ #include <linux/platform_device.h> #include <linux/cma.h> #include <plat/devs.h> -#include <linux/platform_data/modem.h> +#include "modem.h" #include "modem_prj.h" #include <plat/gpio-cfg.h> +spinlock_t irq_lock; +int irq_lock_flag; + int sprd_boot_done; extern int spi_thread_restart(void); @@ -45,10 +48,20 @@ static int sprd8803_on(struct modem_ctl *mc) gpio_set_value(mc->gpio_cp_ctrl2, 1); #endif msleep(100); -// pr_info("[MODEM_IF] %s\n", __func__); // Kill spam + pr_info("[MODEM_IF] %s\n", __func__); gpio_set_value(mc->gpio_cp_on, 1); gpio_set_value(mc->gpio_pda_active, 1); + spin_lock(&irq_lock); + if (!irq_lock_flag) { + enable_irq(mc->irq_phone_active); + enable_irq(gpio_to_irq(mc->gpio_cp_dump_int)); + enable_irq_wake(mc->irq_phone_active); + enable_irq_wake(gpio_to_irq(mc->gpio_cp_dump_int)); + irq_lock_flag = 1; + } + spin_unlock(&irq_lock); + mc->phone_state = STATE_BOOTING; return 0; @@ -56,7 +69,7 @@ static int sprd8803_on(struct modem_ctl *mc) static int sprd8803_off(struct modem_ctl *mc) { - pr_debug("[MODEM_IF] %s\n", __func__); + pr_info("[MODEM_IF] %s\n", __func__); if (!mc->gpio_cp_on) { mif_err("no gpio data\n"); @@ -64,6 +77,17 @@ static int sprd8803_off(struct modem_ctl *mc) } gpio_set_value(mc->gpio_cp_on, 0); + gpio_set_value(mc->gpio_pda_active, 0); + + spin_lock(&irq_lock); + if (irq_lock_flag) { + disable_irq(mc->irq_phone_active); + disable_irq(gpio_to_irq(mc->gpio_cp_dump_int)); + disable_irq_wake(mc->irq_phone_active); + disable_irq_wake(gpio_to_irq(mc->gpio_cp_dump_int)); + irq_lock_flag = 0; + } + spin_unlock(&irq_lock); mc->phone_state = STATE_OFFLINE; @@ -72,7 +96,7 @@ static int sprd8803_off(struct modem_ctl *mc) static int sprd8803_reset(struct modem_ctl *mc) { - pr_debug("[MODEM_IF] %s\n", __func__); + pr_info("[MODEM_IF] %s\n", __func__); spi_thread_restart(); @@ -81,20 +105,20 @@ static int sprd8803_reset(struct modem_ctl *mc) static int sprd8803_boot_on(struct modem_ctl *mc) { - pr_debug("[MODEM_IF] %s %d\n", __func__, sprd_boot_done); - return sprd_boot_done; + pr_info("[MODEM_IF] %s %d\n", __func__, mc->phone_state); + return mc->phone_state; } static int sprd8803_boot_off(struct modem_ctl *mc) { - pr_debug("[MODEM_IF] %s\n", __func__); + pr_info("[MODEM_IF] %s\n", __func__); spi_sema_init(); return 0; } static int sprd8803_dump_reset(struct modem_ctl *mc) { - pr_debug("[MODEM_IF] %s\n", __func__); + pr_info("[MODEM_IF] %s\n", __func__); if (!mc->gpio_ap_cp_int2) return -ENXIO; @@ -115,6 +139,8 @@ static irqreturn_t phone_active_irq_handler(int irq, void *_mc) int phone_state = 0; struct modem_ctl *mc = (struct modem_ctl *)_mc; + disable_irq_nosync(mc->irq_phone_active); + if (!mc->gpio_phone_active || !mc->gpio_cp_dump_int) { pr_err("[MODEM_IF] no gpio data\n"); @@ -135,7 +161,7 @@ static irqreturn_t phone_active_irq_handler(int irq, void *_mc) else phone_state = STATE_OFFLINE; - if (cp_dump_value) + if (phone_active_value && cp_dump_value) phone_state = STATE_CRASH_EXIT; if (mc->iod && mc->iod->modem_state_changed) @@ -145,6 +171,8 @@ static irqreturn_t phone_active_irq_handler(int irq, void *_mc) mc->bootd->modem_state_changed(mc->bootd, phone_state); exit: + enable_irq(mc->irq_phone_active); + return IRQ_HANDLED; } @@ -217,5 +245,19 @@ int sprd8803_init_modemctl_device(struct modem_ctl *mc, __func__, ret); free_irq(irq_cp_dump_int, mc); } + + irq_lock_flag = 1; + spin_lock_init(&irq_lock); + + spin_lock(&irq_lock); + if (irq_lock_flag) { + disable_irq(mc->irq_phone_active); + disable_irq(gpio_to_irq(mc->gpio_cp_dump_int)); + disable_irq_wake(mc->irq_phone_active); + disable_irq_wake(gpio_to_irq(mc->gpio_cp_dump_int)); + irq_lock_flag = 0; + } + spin_unlock(&irq_lock); + return ret; } |