]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
arm: tegra: comms: fix crash at dev attr change
authorVinayak Pane <vpane@nvidia.com>
Thu, 5 Jan 2012 23:28:54 +0000 (15:28 -0800)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 08:37:56 +0000 (01:37 -0700)
Check the state machine before poweron the modem by device
attribute change routine. Maintain the state machine to
avoid crash after writing state change to
 /sys/devices/platform/baseband_xmm_power/xmm_onoff

Also cancel workqueue at module unload to avoid
possible crash.

Bug 898008

Reviewed-on: http://git-master/r/72934

Change-Id: I0d8286774040f155c930ecb0bb69778de6c606ac
Signed-off-by: Vinayak Pane <vpane@nvidia.com>
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-on: http://git-master/r/77744
Reviewed-by: Automatic_Commit_Validation_User
Rebase-Id: Reaea4fbd585c3f1cce910997ea17c7d8bfb544aa

arch/arm/mach-tegra/baseband-xmm-power.c
arch/arm/mach-tegra/baseband-xmm-power2.c

index 54550352d84971f78dc2b80927f857f9ba8574e1..8bfca8da3c900339dacf8372a135ef6cab9fc06e 100644 (file)
@@ -130,6 +130,8 @@ static int baseband_xmm_power_on(struct platform_device *device)
                pr_err("%s: !data\n", __func__);
                return -EINVAL;
        }
+       if (baseband_xmm_powerstate != BBXMM_PS_UNINIT)
+               return -EINVAL;
 
        /* reset the state machine */
        baseband_xmm_powerstate = BBXMM_PS_INIT;
@@ -177,6 +179,8 @@ static int baseband_xmm_power_off(struct platform_device *device)
 
        pr_debug("%s {\n", __func__);
 
+       if (baseband_xmm_powerstate == BBXMM_PS_UNINIT)
+               return -EINVAL;
        /* check for device / platform data */
        if (!device) {
                pr_err("%s: !device\n", __func__);
@@ -189,6 +193,8 @@ static int baseband_xmm_power_off(struct platform_device *device)
                return -EINVAL;
        }
 
+       ipc_ap_wake_state = IPC_AP_WAKE_UNINIT;
+
        /* unregister usb host controller */
        pr_info("%s: hsic device: %x\n", __func__, data->modem.xmm.hsic_device);
        if (data->hsic_unregister)
@@ -207,6 +213,7 @@ static int baseband_xmm_power_off(struct platform_device *device)
        gpio_set_value(data->modem.xmm.bb_rst, 0);
        mdelay(1);
 
+       baseband_xmm_powerstate = BBXMM_PS_UNINIT;
        pr_debug("%s }\n", __func__);
 
        return 0;
@@ -838,7 +845,6 @@ static int baseband_xmm_power_driver_resume(struct platform_device *device)
        /* check if modem is on */
        if (power_onoff == 0) {
                pr_debug("%s - flight mode - nop\n", __func__);
-               baseband_xmm_set_power_status(BBXMM_PS_L3TOL0);
                return 0;
        }
 
index dd05202ba6ece612678701bf24466f199107e886..77ba073d751c3001cf6207f5ef60bc9d270e8f8f 100644 (file)
@@ -611,7 +611,10 @@ static int baseband_xmm_power2_driver_remove(struct platform_device *device)
        }
 
        /* free work structure */
-       destroy_workqueue(workqueue);
+       if (workqueue) {
+               cancel_work_sync(baseband_xmm_power2_work);
+               destroy_workqueue(workqueue);
+       }
        kfree(baseband_xmm_power2_work);
        baseband_xmm_power2_work = (struct baseband_xmm_power_work_t *) 0;