aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/modem_if/modem_modemctl_device_xmm6262.c
diff options
context:
space:
mode:
authorcodeworkx <codeworkx@cyanogenmod.com>2012-09-22 09:48:20 +0200
committercodeworkx <codeworkx@cyanogenmod.com>2012-09-22 14:02:16 +0200
commit2489007e7d740ccbc3e0a202914e243ad5178787 (patch)
treeb8e6380ea7b1da63474ad68a5dba997e01146043 /drivers/misc/modem_if/modem_modemctl_device_xmm6262.c
parent5f67568eb31e3a813c7c52461dcf66ade15fc2e7 (diff)
downloadkernel_samsung_smdk4412-2489007e7d740ccbc3e0a202914e243ad5178787.zip
kernel_samsung_smdk4412-2489007e7d740ccbc3e0a202914e243ad5178787.tar.gz
kernel_samsung_smdk4412-2489007e7d740ccbc3e0a202914e243ad5178787.tar.bz2
merge opensource jb u5
Change-Id: I1aaec157aa196f3448eff8636134fce89a814cf2
Diffstat (limited to 'drivers/misc/modem_if/modem_modemctl_device_xmm6262.c')
-rw-r--r--drivers/misc/modem_if/modem_modemctl_device_xmm6262.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/drivers/misc/modem_if/modem_modemctl_device_xmm6262.c b/drivers/misc/modem_if/modem_modemctl_device_xmm6262.c
index 10b0811..4d0b69c 100644
--- a/drivers/misc/modem_if/modem_modemctl_device_xmm6262.c
+++ b/drivers/misc/modem_if/modem_modemctl_device_xmm6262.c
@@ -39,6 +39,12 @@ static int xmm6262_on(struct modem_ctl *mc)
if (mc->gpio_revers_bias_clear)
mc->gpio_revers_bias_clear();
+#ifdef CONFIG_SEC_DUAL_MODEM_MODE
+ gpio_set_value(mc->gpio_sim_io_sel, 0);
+ gpio_set_value(mc->gpio_cp_ctrl1, 1);
+ gpio_set_value(mc->gpio_cp_ctrl2, 0);
+#endif
+
/* TODO */
gpio_set_value(mc->gpio_reset_req_n, 0);
gpio_set_value(mc->gpio_cp_on, 0);
@@ -137,15 +143,19 @@ static irqreturn_t phone_active_irq_handler(int irq, void *_mc)
mif_info("PA EVENT : reset =%d, pa=%d, cp_dump=%d\n",
phone_reset, phone_active_value, cp_dump_value);
- if (phone_reset && phone_active_value)
+ if (phone_reset && phone_active_value) {
phone_state = STATE_BOOTING;
- else if (phone_reset && !phone_active_value) {
- if (cp_dump_value)
- phone_state = STATE_CRASH_EXIT;
- else
- phone_state = STATE_CRASH_RESET;
- } else
+ } else if (mc->dev->power.is_suspended && !phone_active_value) {
+ /*fixing dpm timeout by port2 resume retry*/
+ mif_err("CP reset while dpm resume\n");
+ xmm6262_off(mc);
+ phone_state = STATE_CRASH_RESET;
+ } else if (phone_reset && !phone_active_value) {
+ phone_state =
+ (cp_dump_value) ? STATE_CRASH_EXIT : STATE_CRASH_RESET;
+ } else {
phone_state = STATE_OFFLINE;
+ }
if (mc->iod && mc->iod->modem_state_changed)
mc->iod->modem_state_changed(mc->iod, phone_state);
@@ -168,7 +178,8 @@ static irqreturn_t sim_detect_irq_handler(int irq, void *_mc)
if (mc->iod && mc->iod->sim_state_changed)
mc->iod->sim_state_changed(mc->iod,
- !gpio_get_value(mc->gpio_sim_detect));
+ gpio_get_value(mc->gpio_sim_detect) == mc->sim_polarity
+ );
return IRQ_HANDLED;
}
@@ -196,10 +207,17 @@ int xmm6262_init_modemctl_device(struct modem_ctl *mc,
mc->gpio_flm_uart_sel = pdata->gpio_flm_uart_sel;
mc->gpio_cp_warm_reset = pdata->gpio_cp_warm_reset;
mc->gpio_sim_detect = pdata->gpio_sim_detect;
+ mc->sim_polarity = pdata->sim_polarity;
mc->gpio_revers_bias_clear = pdata->gpio_revers_bias_clear;
mc->gpio_revers_bias_restore = pdata->gpio_revers_bias_restore;
+#ifdef CONFIG_SEC_DUAL_MODEM_MODE
+ mc->gpio_sim_io_sel = pdata->gpio_sim_io_sel;
+ mc->gpio_cp_ctrl1 = pdata->gpio_cp_ctrl1;
+ mc->gpio_cp_ctrl2 = pdata->gpio_cp_ctrl2;
+#endif
+
pdev = to_platform_device(mc->dev);
mc->irq_phone_active = gpio_to_irq(mc->gpio_phone_active);
@@ -241,7 +259,8 @@ int xmm6262_init_modemctl_device(struct modem_ctl *mc,
}
/* initialize sim_state => insert: gpio=0, remove: gpio=1 */
- mc->sim_state.online = !gpio_get_value(mc->gpio_sim_detect);
+ mc->sim_state.online =
+ gpio_get_value(mc->gpio_sim_detect) == mc->sim_polarity;
}
return ret;