aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/modem_if/modem_modemctl_device_sprd8803.c')
-rw-r--r--drivers/misc/modem_if/modem_modemctl_device_sprd8803.c60
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;
}