summaryrefslogtreecommitdiff
path: root/arch/arm
diff options
context:
space:
mode:
authorVinayak Pane <vpane@nvidia.com>2012-05-02 18:22:12 -0700
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-05-16 22:33:10 -0700
commitac536813fa240186f7268bcb400547a4b8f90164 (patch)
tree2eb496d996a4aaa2386c56de72c1001bdd1fbb59 /arch/arm
parent10af9a900654d14cadf85aaefd164b0c9c5d622d (diff)
arm: tegra: xmm: baseband modem pm code cleanup
- Platform data is treated as const and not modified in driver. - Driver specific data is stored and used from a new structure. - Remove support for older firmware version of XMM modem (<1130). - Shortening of names for compliance and to fit in 80 characters. - Organize irq function to reduce indentation. Change-Id: I269401aa0a2efc685d7a630b4952cb31cbca6a4f Signed-off-by: Vinayak Pane <vpane@nvidia.com> Reviewed-on: http://git-master/r/101587 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Steve Lin <stlin@nvidia.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-tegra/baseband-xmm-power.c551
-rw-r--r--arch/arm/mach-tegra/baseband-xmm-power.h22
-rw-r--r--arch/arm/mach-tegra/baseband-xmm-power2.c525
3 files changed, 392 insertions, 706 deletions
diff --git a/arch/arm/mach-tegra/baseband-xmm-power.c b/arch/arm/mach-tegra/baseband-xmm-power.c
index 7659d4f8bbe5..32d46d414cb5 100644
--- a/arch/arm/mach-tegra/baseband-xmm-power.c
+++ b/arch/arm/mach-tegra/baseband-xmm-power.c
@@ -89,12 +89,12 @@ static enum {
IPC_AP_WAKE_H,
} ipc_ap_wake_state;
-enum baseband_xmm_powerstate_t baseband_xmm_powerstate;
+static enum baseband_xmm_powerstate_t baseband_xmm_powerstate;
static struct workqueue_struct *workqueue;
static struct work_struct init1_work;
static struct work_struct init2_work;
static struct work_struct L2_resume_work;
-static struct baseband_power_platform_data *baseband_power_driver_data;
+static struct work_struct autopm_resume_work;
static bool register_hsic_device;
static struct wake_lock wakelock;
static struct usb_device *usbdev;
@@ -102,7 +102,6 @@ static bool CP_initiated_L2toL0;
static bool modem_power_on;
static int power_onoff;
static int reenable_autosuspend;
-static struct work_struct autopm_resume_work;
static bool wakeup_pending;
static bool modem_sleep_flag;
static spinlock_t xmm_lock;
@@ -111,8 +110,14 @@ static bool system_suspending;
static struct regulator *enterprise_hsic_reg;
static bool _hsic_reg_status;
-static void baseband_xmm_power_L2_resume(void);
-static int baseband_xmm_power_driver_handle_resume(
+/* driver specific data - same structure is used for flashless
+ * & flashed modem drivers i.e. baseband-xmm-power2.c
+ */
+struct xmm_power_data xmm_power_drv_data;
+EXPORT_SYMBOL(xmm_power_drv_data);
+
+static void xmm_power_L2_resume(void);
+static int xmm_power_driver_handle_resume(
struct baseband_power_platform_data *data);
static int tegra_baseband_rail_on(void)
@@ -175,8 +180,7 @@ static int tegra_baseband_rail_off(void)
static int baseband_modem_power_on(struct baseband_power_platform_data *data)
{
/* set IPC_HSIC_ACTIVE active */
- gpio_set_value(baseband_power_driver_data->
- modem.xmm.ipc_hsic_active, 1);
+ gpio_set_value(data->modem.xmm.ipc_hsic_active, 1);
/* reset / power on sequence */
msleep(40);
@@ -189,18 +193,18 @@ static int baseband_modem_power_on(struct baseband_power_platform_data *data)
return 0;
}
-static int baseband_xmm_power_on(struct platform_device *device)
+static int xmm_power_on(struct platform_device *device)
{
- struct baseband_power_platform_data *data
- = (struct baseband_power_platform_data *)
+ struct baseband_power_platform_data *pdata =
device->dev.platform_data;
+ struct xmm_power_data *data = &xmm_power_drv_data;
int ret;
pr_debug("%s {\n", __func__);
/* check for platform data */
- if (!data) {
- pr_err("%s: !data\n", __func__);
+ if (!pdata) {
+ pr_err("%s: !pdata\n", __func__);
return -EINVAL;
}
if (baseband_xmm_powerstate != BBXMM_PS_UNINIT)
@@ -211,11 +215,7 @@ static int baseband_xmm_power_on(struct platform_device *device)
/* reset the state machine */
baseband_xmm_powerstate = BBXMM_PS_INIT;
modem_sleep_flag = false;
-
- if (modem_ver < XMM_MODEM_VER_1130)
- ipc_ap_wake_state = IPC_AP_WAKE_INIT1;
- else
- ipc_ap_wake_state = IPC_AP_WAKE_INIT2;
+ ipc_ap_wake_state = IPC_AP_WAKE_INIT2;
pr_debug("%s wake_st(%d) modem version %lu\n", __func__,
ipc_ap_wake_state, modem_ver);
@@ -228,24 +228,22 @@ static int baseband_xmm_power_on(struct platform_device *device)
pr_debug("%s: register usb host controller\n",
__func__);
modem_power_on = true;
- if (data->hsic_register)
- data->modem.xmm.hsic_device =
- data->hsic_register();
+ if (pdata->hsic_register)
+ data->hsic_device = pdata->hsic_register();
else
pr_err("%s: hsic_register is missing\n",
__func__);
register_hsic_device = false;
} else {
/* register usb host controller */
- if (data->hsic_register)
- data->modem.xmm.hsic_device =
- data->hsic_register();
+ if (pdata->hsic_register)
+ data->hsic_device = pdata->hsic_register();
/* turn on modem */
pr_debug("%s call baseband_modem_power_on\n", __func__);
- baseband_modem_power_on(data);
+ baseband_modem_power_on(pdata);
}
}
- ret = enable_irq_wake(gpio_to_irq(data->modem.xmm.ipc_ap_wake));
+ ret = enable_irq_wake(gpio_to_irq(pdata->modem.xmm.ipc_ap_wake));
if (ret < 0)
pr_err("%s: enable_irq_wake error\n", __func__);
pr_debug("%s }\n", __func__);
@@ -253,9 +251,12 @@ static int baseband_xmm_power_on(struct platform_device *device)
return 0;
}
-static int baseband_xmm_power_off(struct platform_device *device)
+static int xmm_power_off(struct platform_device *device)
{
- struct baseband_power_platform_data *data;
+ struct baseband_power_platform_data *pdata =
+ device->dev.platform_data;
+ struct xmm_power_data *data = &xmm_power_drv_data;
+
int ret;
unsigned long flags;
@@ -268,34 +269,31 @@ static int baseband_xmm_power_off(struct platform_device *device)
pr_err("%s: !device\n", __func__);
return -EINVAL;
}
- data = (struct baseband_power_platform_data *)
- device->dev.platform_data;
- if (!data) {
- pr_err("%s: !data\n", __func__);
+ if (!pdata) {
+ pr_err("%s: !pdata\n", __func__);
return -EINVAL;
}
ipc_ap_wake_state = IPC_AP_WAKE_UNINIT;
- ret = disable_irq_wake(gpio_to_irq(data->modem.xmm.ipc_ap_wake));
+ ret = disable_irq_wake(gpio_to_irq(pdata->modem.xmm.ipc_ap_wake));
if (ret < 0)
pr_err("%s: disable_irq_wake error\n", __func__);
/* unregister usb host controller */
- if (data->hsic_unregister)
- data->hsic_unregister(data->modem.xmm.hsic_device);
+ if (pdata->hsic_unregister)
+ pdata->hsic_unregister(data->hsic_device);
else
pr_err("%s: hsic_unregister is missing\n", __func__);
/* set IPC_HSIC_ACTIVE low */
- gpio_set_value(baseband_power_driver_data->
- modem.xmm.ipc_hsic_active, 0);
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 0);
/* wait 20 ms */
mdelay(20);
/* drive bb_rst low */
- gpio_set_value(data->modem.xmm.bb_rst, 0);
+ gpio_set_value(pdata->modem.xmm.bb_rst, 0);
mdelay(1);
baseband_xmm_powerstate = BBXMM_PS_UNINIT;
@@ -314,9 +312,8 @@ static int baseband_xmm_power_off(struct platform_device *device)
return 0;
}
-static ssize_t baseband_xmm_onoff(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
+static ssize_t xmm_onoff(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
{
int pwr;
int size;
@@ -352,9 +349,9 @@ static ssize_t baseband_xmm_onoff(struct device *dev,
pr_debug("%s power_onoff=%d\n", __func__, power_onoff);
if (power_onoff == 0)
- baseband_xmm_power_off(device);
+ xmm_power_off(device);
else if (power_onoff == 1)
- baseband_xmm_power_on(device);
+ xmm_power_on(device);
mutex_unlock(&xmm_onoff_mutex);
@@ -362,12 +359,12 @@ static ssize_t baseband_xmm_onoff(struct device *dev,
}
static DEVICE_ATTR(xmm_onoff, S_IRUSR | S_IWUSR | S_IRGRP,
- NULL, baseband_xmm_onoff);
+ NULL, xmm_onoff);
void baseband_xmm_set_power_status(unsigned int status)
{
- struct baseband_power_platform_data *data = baseband_power_driver_data;
+ struct baseband_power_platform_data *data = xmm_power_drv_data.pdata;
int value = 0;
unsigned long flags;
@@ -379,7 +376,7 @@ void baseband_xmm_set_power_status(unsigned int status)
if (modem_sleep_flag) {
pr_info("%s Resume from L3 without calling resume"
"function\n", __func__);
- baseband_xmm_power_driver_handle_resume(data);
+ xmm_power_driver_handle_resume(data);
}
pr_info("L0\n");
baseband_xmm_powerstate = status;
@@ -403,7 +400,7 @@ void baseband_xmm_set_power_status(unsigned int status)
spin_lock_irqsave(&xmm_lock, flags);
if (wakeup_pending) {
spin_unlock_irqrestore(&xmm_lock, flags);
- baseband_xmm_power_L2_resume();
+ xmm_power_L2_resume();
} else {
spin_unlock_irqrestore(&xmm_lock, flags);
if (wake_lock_active(&wakelock))
@@ -447,7 +444,7 @@ void baseband_xmm_set_power_status(unsigned int status)
if (baseband_xmm_powerstate == BBXMM_PS_L2) {
baseband_xmm_powerstate = status;
pr_debug("BB XMM POWER STATE = %d\n", status);
- baseband_xmm_power_L2_resume();
+ xmm_power_L2_resume();
}
baseband_xmm_powerstate = status;
break;
@@ -465,122 +462,111 @@ void baseband_xmm_set_power_status(unsigned int status)
}
EXPORT_SYMBOL_GPL(baseband_xmm_set_power_status);
-irqreturn_t baseband_xmm_power_ipc_ap_wake_irq(int irq, void *dev_id)
+irqreturn_t xmm_power_ipc_ap_wake_irq(int irq, void *dev_id)
{
+ struct baseband_power_platform_data *data = xmm_power_drv_data.pdata;
int value;
- struct baseband_power_platform_data *data = baseband_power_driver_data;
value = gpio_get_value(data->modem.xmm.ipc_ap_wake);
pr_debug("%s g(%d), wake_st(%d)\n", __func__, value, ipc_ap_wake_state);
- if (ipc_ap_wake_state < IPC_AP_WAKE_IRQ_READY) {
+ /* modem initialization/bootup part*/
+ if (unlikely(ipc_ap_wake_state < IPC_AP_WAKE_IRQ_READY)) {
pr_err("%s - spurious irq\n", __func__);
+ return IRQ_HANDLED;
} else if (ipc_ap_wake_state == IPC_AP_WAKE_IRQ_READY) {
if (!value) {
pr_debug("%s - IPC_AP_WAKE_INIT1"
- " - got falling edge\n",
- __func__);
+ " - got falling edge\n", __func__);
/* go to IPC_AP_WAKE_INIT1 state */
ipc_ap_wake_state = IPC_AP_WAKE_INIT1;
- /* queue work */
queue_work(workqueue, &init1_work);
- } else {
+ } else
pr_debug("%s - IPC_AP_WAKE_INIT1"
- " - wait for falling edge\n",
- __func__);
- }
+ " - wait for falling edge\n", __func__);
+ return IRQ_HANDLED;
} else if (ipc_ap_wake_state == IPC_AP_WAKE_INIT1) {
if (!value) {
pr_debug("%s - IPC_AP_WAKE_INIT2"
- " - wait for rising edge\n",
- __func__);
+ " - wait for rising edge\n", __func__);
} else {
pr_debug("%s - IPC_AP_WAKE_INIT2"
- " - got rising edge\n",
- __func__);
+ " - got rising edge\n", __func__);
/* go to IPC_AP_WAKE_INIT2 state */
ipc_ap_wake_state = IPC_AP_WAKE_INIT2;
- /* queue work */
queue_work(workqueue, &init2_work);
}
- } else {
- if (!value) {
- pr_debug("%s - falling\n", __func__);
- /* First check it a CP ack or CP wake */
- value = gpio_get_value
- (data->modem.xmm.ipc_bb_wake);
- if (value) {
- pr_debug("cp ack for bb_wake\n");
- ipc_ap_wake_state = IPC_AP_WAKE_L;
- return IRQ_HANDLED;
- }
- spin_lock(&xmm_lock);
- wakeup_pending = true;
- if (system_suspending) {
- spin_unlock(&xmm_lock);
- pr_info("Set wakeup_pending = 1 in system_"
- " suspending!!!\n");
- } else {
- if (baseband_xmm_powerstate ==
- BBXMM_PS_L3) {
- spin_unlock(&xmm_lock);
- pr_info(" CP L3 -> L0\n");
- } else if (baseband_xmm_powerstate ==
- BBXMM_PS_L2) {
- CP_initiated_L2toL0 = true;
- spin_unlock(&xmm_lock);
- baseband_xmm_set_power_status
- (BBXMM_PS_L2TOL0);
- } else {
- CP_initiated_L2toL0 = true;
- spin_unlock(&xmm_lock);
- }
- }
- /* save gpio state */
+ return IRQ_HANDLED;
+ }
+
+ /* modem wakeup part */
+ if (!value) {
+ pr_debug("%s - falling\n", __func__);
+ /* First check it a CP ack or CP wake */
+ value = gpio_get_value(data->modem.xmm.ipc_bb_wake);
+ if (value) {
+ pr_debug("cp ack for bb_wake\n");
ipc_ap_wake_state = IPC_AP_WAKE_L;
+ return IRQ_HANDLED;
+ }
+ spin_lock(&xmm_lock);
+ wakeup_pending = true;
+ if (system_suspending) {
+ spin_unlock(&xmm_lock);
+ pr_info("Set wakeup_pending = 1 in system_"
+ " suspending!!!\n");
} else {
- pr_debug("%s - rising\n", __func__);
- value = gpio_get_value
- (data->modem.xmm.ipc_hsic_active);
- if (!value) {
- pr_info("host active low: ignore request\n");
- ipc_ap_wake_state = IPC_AP_WAKE_H;
- return IRQ_HANDLED;
- }
- value = gpio_get_value
- (data->modem.xmm.ipc_bb_wake);
- if (value) {
- /* Clear the slave wakeup request */
- gpio_set_value
- (data->modem.xmm.ipc_bb_wake, 0);
- pr_debug("gpio slave wakeup done ->\n");
- }
- if (reenable_autosuspend && usbdev) {
- reenable_autosuspend = false;
- queue_work(workqueue,
- &autopm_resume_work);
+ if (baseband_xmm_powerstate == BBXMM_PS_L3) {
+ spin_unlock(&xmm_lock);
+ pr_info(" CP L3 -> L0\n");
+ } else if (baseband_xmm_powerstate == BBXMM_PS_L2) {
+ CP_initiated_L2toL0 = true;
+ spin_unlock(&xmm_lock);
+ baseband_xmm_set_power_status(BBXMM_PS_L2TOL0);
+ } else {
+ CP_initiated_L2toL0 = true;
+ spin_unlock(&xmm_lock);
}
- modem_sleep_flag = false;
- baseband_xmm_set_power_status(
- BBXMM_PS_L0);
- /* save gpio state */
+ }
+ /* save gpio state */
+ ipc_ap_wake_state = IPC_AP_WAKE_L;
+ } else {
+ pr_debug("%s - rising\n", __func__);
+ value = gpio_get_value(data->modem.xmm.ipc_hsic_active);
+ if (!value) {
+ pr_info("host active low: ignore request\n");
ipc_ap_wake_state = IPC_AP_WAKE_H;
+ return IRQ_HANDLED;
+ }
+ value = gpio_get_value(data->modem.xmm.ipc_bb_wake);
+ if (value) {
+ /* Clear the slave wakeup request */
+ gpio_set_value(data->modem.xmm.ipc_bb_wake, 0);
+ pr_debug("gpio slave wakeup done ->\n");
+ }
+ if (reenable_autosuspend && usbdev) {
+ reenable_autosuspend = false;
+ queue_work(workqueue, &autopm_resume_work);
}
+ modem_sleep_flag = false;
+ baseband_xmm_set_power_status(BBXMM_PS_L0);
+ /* save gpio state */
+ ipc_ap_wake_state = IPC_AP_WAKE_H;
}
return IRQ_HANDLED;
}
-EXPORT_SYMBOL(baseband_xmm_power_ipc_ap_wake_irq);
+EXPORT_SYMBOL(xmm_power_ipc_ap_wake_irq);
-static void baseband_xmm_power_init1_work(struct work_struct *work)
+static void xmm_power_init1_work(struct work_struct *work)
{
+ struct baseband_power_platform_data *pdata = xmm_power_drv_data.pdata;
int value;
pr_debug("%s {\n", __func__);
/* check if IPC_HSIC_ACTIVE high */
- value = gpio_get_value(baseband_power_driver_data->
- modem.xmm.ipc_hsic_active);
+ value = gpio_get_value(pdata->modem.xmm.ipc_hsic_active);
if (value != 1) {
pr_err("%s - expected IPC_HSIC_ACTIVE high!\n", __func__);
return;
@@ -590,15 +576,13 @@ static void baseband_xmm_power_init1_work(struct work_struct *work)
mdelay(100);
/* set IPC_HSIC_ACTIVE low */
- gpio_set_value(baseband_power_driver_data->
- modem.xmm.ipc_hsic_active, 0);
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 0);
/* wait 10 ms */
mdelay(10);
/* set IPC_HSIC_ACTIVE high */
- gpio_set_value(baseband_power_driver_data->
- modem.xmm.ipc_hsic_active, 1);
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 1);
/* wait 20 ms */
mdelay(20);
@@ -606,20 +590,20 @@ static void baseband_xmm_power_init1_work(struct work_struct *work)
pr_debug("%s }\n", __func__);
}
-static void baseband_xmm_power_init2_work(struct work_struct *work)
+static void xmm_power_init2_work(struct work_struct *work)
{
- struct baseband_power_platform_data *data = baseband_power_driver_data;
+ struct baseband_power_platform_data *pdata = xmm_power_drv_data.pdata;
pr_debug("%s\n", __func__);
/* check input */
- if (!data)
+ if (!pdata)
return;
/* register usb host controller only once */
if (register_hsic_device) {
- if (data->hsic_register)
- data->modem.xmm.hsic_device = data->hsic_register();
+ if (pdata->hsic_register)
+ xmm_power_drv_data.hsic_device = pdata->hsic_register();
else
pr_err("%s: hsic_register is missing\n", __func__);
register_hsic_device = false;
@@ -627,7 +611,7 @@ static void baseband_xmm_power_init2_work(struct work_struct *work)
}
-static void baseband_xmm_power_autopm_resume(struct work_struct *work)
+static void xmm_power_autopm_resume(struct work_struct *work)
{
struct usb_interface *intf;
@@ -647,16 +631,16 @@ static void baseband_xmm_power_autopm_resume(struct work_struct *work)
/* Do the work for AP/CP initiated L2->L0 */
-static void baseband_xmm_power_L2_resume(void)
+static void xmm_power_L2_resume(void)
{
- struct baseband_power_platform_data *data = baseband_power_driver_data;
+ struct baseband_power_platform_data *pdata = xmm_power_drv_data.pdata;
int value;
int delay = 10000; /* maxmum delay in msec */
unsigned long flags;
pr_debug("%s\n", __func__);
- if (!baseband_power_driver_data)
+ if (!pdata)
return;
/* claim the wakelock here to avoid any system suspend */
@@ -674,15 +658,15 @@ static void baseband_xmm_power_L2_resume(void)
} else {
/* set the slave wakeup request */
pr_info("AP L2->L0\n");
- value = gpio_get_value(data->modem.xmm.ipc_ap_wake);
+ value = gpio_get_value(pdata->modem.xmm.ipc_ap_wake);
if (value) {
pr_debug("waiting for host wakeup from CP...\n");
/* wake bb */
- gpio_set_value(data->modem.xmm.ipc_bb_wake, 1);
+ gpio_set_value(pdata->modem.xmm.ipc_bb_wake, 1);
do {
mdelay(1);
value = gpio_get_value(
- data->modem.xmm.ipc_ap_wake);
+ pdata->modem.xmm.ipc_ap_wake);
delay--;
} while ((value) && (delay));
if (delay)
@@ -696,7 +680,7 @@ static void baseband_xmm_power_L2_resume(void)
}
/* Do the work for CP initiated L2->L0 */
-static void baseband_xmm_power_L2_resume_work(struct work_struct *work)
+static void xmm_power_L2_resume_work(struct work_struct *work)
{
struct usb_interface *intf;
@@ -713,120 +697,77 @@ static void baseband_xmm_power_L2_resume_work(struct work_struct *work)
pr_debug("} %s\n", __func__);
}
-static void baseband_xmm_power_reset_on(void)
+static void xmm_power_reset_on(struct baseband_power_platform_data *pdata)
{
/* reset / power on sequence */
- gpio_set_value(baseband_power_driver_data->modem.xmm.bb_rst, 0);
+ gpio_set_value(pdata->modem.xmm.bb_rst, 0);
msleep(40);
- gpio_set_value(baseband_power_driver_data->modem.xmm.bb_rst, 1);
+ gpio_set_value(pdata->modem.xmm.bb_rst, 1);
mdelay(1);
- gpio_set_value(baseband_power_driver_data->modem.xmm.bb_on, 1);
+ gpio_set_value(pdata->modem.xmm.bb_on, 1);
udelay(70);
- gpio_set_value(baseband_power_driver_data->modem.xmm.bb_on, 0);
+ gpio_set_value(pdata->modem.xmm.bb_on, 0);
}
-static struct baseband_xmm_power_work_t *baseband_xmm_power_work;
-static void baseband_xmm_power_work_func(struct work_struct *work)
+static void xmm_power_work_func(struct work_struct *work)
{
- struct baseband_xmm_power_work_t *bbxmm_work
- = (struct baseband_xmm_power_work_t *) work;
+ struct xmm_power_data *data =
+ container_of(work, struct xmm_power_data, work);
+ struct baseband_power_platform_data *pdata = data->pdata;
pr_debug("%s\n", __func__);
- switch (bbxmm_work->state) {
+ switch (data->state) {
case BBXMM_WORK_UNINIT:
pr_debug("BBXMM_WORK_UNINIT\n");
break;
case BBXMM_WORK_INIT:
pr_debug("BBXMM_WORK_INIT\n");
/* go to next state */
- bbxmm_work->state = (modem_flash && !modem_pm)
+ data->state = (modem_flash && !modem_pm)
? BBXMM_WORK_INIT_FLASH_STEP1
: (modem_flash && modem_pm)
? BBXMM_WORK_INIT_FLASH_PM_STEP1
: (!modem_flash && modem_pm)
? BBXMM_WORK_INIT_FLASHLESS_PM_STEP1
: BBXMM_WORK_UNINIT;
- pr_debug("Go to next state %d\n", bbxmm_work->state);
+ pr_debug("Go to next state %d\n", data->state);
queue_work(workqueue, work);
break;
case BBXMM_WORK_INIT_FLASH_STEP1:
pr_debug("BBXMM_WORK_INIT_FLASH_STEP1\n");
/* register usb host controller */
pr_debug("%s: register usb host controller\n", __func__);
- if (baseband_power_driver_data->hsic_register)
- baseband_power_driver_data->modem.xmm.hsic_device =
- baseband_power_driver_data->hsic_register();
+ if (pdata->hsic_register)
+ data->hsic_device = pdata->hsic_register();
else
pr_err("%s: hsic_register is missing\n", __func__);
break;
case BBXMM_WORK_INIT_FLASH_PM_STEP1:
pr_debug("BBXMM_WORK_INIT_FLASH_PM_STEP1\n");
- /* [modem ver >= 1130] start with IPC_HSIC_ACTIVE low */
- if (modem_ver >= XMM_MODEM_VER_1130) {
- pr_debug("%s: ver > 1130:"
- " ipc_hsic_active -> 0\n", __func__);
- gpio_set_value(baseband_power_driver_data->
- modem.xmm.ipc_hsic_active, 0);
- }
+ pr_debug("%s: ipc_hsic_active -> 0\n", __func__);
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 1);
/* reset / power on sequence */
- baseband_xmm_power_reset_on();
+ xmm_power_reset_on(pdata);
/* set power status as on */
power_onoff = 1;
- /* optional delay
- * 0 = flashless
- * ==> causes next step to enumerate modem boot rom
- * (058b / 0041)
- * some delay > boot rom timeout
- * ==> causes next step to enumerate modem software
- * (1519 / 0020)
- * (requires modem to be flash version, not flashless
- * version)
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 0);
+
+ /* expecting init2 performs register hsic to enumerate modem
+ * software directly.
*/
- if (enum_delay_ms)
- mdelay(enum_delay_ms);
- /* register usb host controller */
- pr_debug("%s: register usb host controller\n", __func__);
- if (baseband_power_driver_data->hsic_register)
- baseband_power_driver_data->modem.xmm.hsic_device =
- baseband_power_driver_data->hsic_register();
- else
- pr_err("%s: hsic_register is missing\n", __func__);
- /* go to next state */
- bbxmm_work->state = (modem_ver < XMM_MODEM_VER_1130)
- ? BBXMM_WORK_INIT_FLASH_PM_VER_LT_1130_STEP1
- : BBXMM_WORK_INIT_FLASH_PM_VER_GE_1130_STEP1;
- queue_work(workqueue, work);
- pr_debug("Go to next state %d\n", bbxmm_work->state);
- break;
- case BBXMM_WORK_INIT_FLASH_PM_VER_LT_1130_STEP1:
- pr_debug("BBXMM_WORK_INIT_FLASH_PM_VER_LT_1130_STEP1\n");
- break;
- case BBXMM_WORK_INIT_FLASH_PM_VER_GE_1130_STEP1:
- pr_debug("BBXMM_WORK_INIT_FLASH_PM_VER_GE_1130_STEP1\n");
break;
case BBXMM_WORK_INIT_FLASHLESS_PM_STEP1:
pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_STEP1\n");
- /* go to next state */
- bbxmm_work->state = (modem_ver < XMM_MODEM_VER_1130)
- ? BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_WAIT_IRQ
- : BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP1;
- queue_work(workqueue, work);
- break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP1:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP1\n");
- break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP1:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP1\n");
+ pr_info("%s: flashless is not supported here\n", __func__);
break;
default:
break;
}
-
}
-static void baseband_xmm_device_add_handler(struct usb_device *udev)
+static void xmm_device_add_handler(struct usb_device *udev)
{
struct usb_interface *intf = usb_ifnum_to_if(udev, 0);
const struct usb_device_id *id;
@@ -846,7 +787,7 @@ static void baseband_xmm_device_add_handler(struct usb_device *udev)
}
}
-static void baseband_xmm_device_remove_handler(struct usb_device *udev)
+static void xmm_device_remove_handler(struct usb_device *udev)
{
if (usbdev == udev) {
pr_info("Remove device %d <%s %s>\n", udev->devnum,
@@ -861,10 +802,10 @@ static int usb_xmm_notify(struct notifier_block *self, unsigned long action,
{
switch (action) {
case USB_DEVICE_ADD:
- baseband_xmm_device_add_handler(blob);
+ xmm_device_add_handler(blob);
break;
case USB_DEVICE_REMOVE:
- baseband_xmm_device_remove_handler(blob);
+ xmm_device_remove_handler(blob);
break;
}
@@ -876,13 +817,13 @@ static struct notifier_block usb_xmm_nb = {
.notifier_call = usb_xmm_notify,
};
-static int baseband_xmm_power_pm_notifier_event(struct notifier_block *this,
+static int xmm_power_pm_notifier_event(struct notifier_block *this,
unsigned long event, void *ptr)
{
- struct baseband_power_platform_data *data = baseband_power_driver_data;
+ struct baseband_power_platform_data *pdata = xmm_power_drv_data.pdata;
unsigned long flags;
- if (!data)
+ if (!pdata)
return NOTIFY_DONE;
pr_debug("%s: event %ld\n", __func__, event);
@@ -914,11 +855,9 @@ static int baseband_xmm_power_pm_notifier_event(struct notifier_block *this,
(baseband_xmm_powerstate == BBXMM_PS_L2)) {
wakeup_pending = false;
spin_unlock_irqrestore(&xmm_lock, flags);
- pr_info("%s : Service Pending CP wakeup\n",
- __func__);
+ pr_info("%s : Service Pending CP wakeup\n", __func__);
CP_initiated_L2toL0 = true;
- baseband_xmm_set_power_status
- (BBXMM_PS_L2TOL0);
+ baseband_xmm_set_power_status(BBXMM_PS_L2TOL0);
return NOTIFY_OK;
}
wakeup_pending = false;
@@ -928,16 +867,14 @@ static int baseband_xmm_power_pm_notifier_event(struct notifier_block *this,
return NOTIFY_DONE;
}
-static struct notifier_block baseband_xmm_power_pm_notifier = {
- .notifier_call = baseband_xmm_power_pm_notifier_event,
+static struct notifier_block xmm_power_pm_notifier = {
+ .notifier_call = xmm_power_pm_notifier_event,
};
-static int baseband_xmm_power_driver_probe(struct platform_device *device)
+static int xmm_power_driver_probe(struct platform_device *device)
{
- struct baseband_power_platform_data *data
- = (struct baseband_power_platform_data *)
- device->dev.platform_data;
+ struct baseband_power_platform_data *pdata = device->dev.platform_data;
struct device *dev = &device->dev;
unsigned long flags;
int err;
@@ -946,17 +883,17 @@ static int baseband_xmm_power_driver_probe(struct platform_device *device)
pr_debug("[XMM] enum_delay_ms=%ld\n", enum_delay_ms);
/* check for platform data */
- if (!data)
+ if (!pdata)
return -ENODEV;
/* check if supported modem */
- if (data->baseband_type != BASEBAND_XMM) {
+ if (pdata->baseband_type != BASEBAND_XMM) {
pr_err("unsuppported modem\n");
return -ENODEV;
}
/* save platform data */
- baseband_power_driver_data = data;
+ xmm_power_drv_data.pdata = pdata;
/* create device file */
err = device_create_file(dev, &dev_attr_xmm_onoff);
@@ -971,20 +908,14 @@ static int baseband_xmm_power_driver_probe(struct platform_device *device)
/* init spin lock */
spin_lock_init(&xmm_lock);
/* request baseband gpio(s) */
- tegra_baseband_gpios[0].gpio = baseband_power_driver_data
- ->modem.xmm.bb_rst;
- tegra_baseband_gpios[1].gpio = baseband_power_driver_data
- ->modem.xmm.bb_on;
- tegra_baseband_gpios[2].gpio = baseband_power_driver_data
- ->modem.xmm.ipc_bb_wake;
- tegra_baseband_gpios[3].gpio = baseband_power_driver_data
- ->modem.xmm.ipc_ap_wake;
- tegra_baseband_gpios[4].gpio = baseband_power_driver_data
- ->modem.xmm.ipc_hsic_active;
- tegra_baseband_gpios[5].gpio = baseband_power_driver_data
- ->modem.xmm.ipc_hsic_sus_req;
+ tegra_baseband_gpios[0].gpio = pdata->modem.xmm.bb_rst;
+ tegra_baseband_gpios[1].gpio = pdata->modem.xmm.bb_on;
+ tegra_baseband_gpios[2].gpio = pdata->modem.xmm.ipc_bb_wake;
+ tegra_baseband_gpios[3].gpio = pdata->modem.xmm.ipc_ap_wake;
+ tegra_baseband_gpios[4].gpio = pdata->modem.xmm.ipc_hsic_active;
+ tegra_baseband_gpios[5].gpio = pdata->modem.xmm.ipc_hsic_sus_req;
err = gpio_request_array(tegra_baseband_gpios,
- ARRAY_SIZE(tegra_baseband_gpios));
+ ARRAY_SIZE(tegra_baseband_gpios));
if (err < 0) {
pr_err("%s - request gpio(s) failed\n", __func__);
return -ENODEV;
@@ -995,52 +926,41 @@ static int baseband_xmm_power_driver_probe(struct platform_device *device)
pr_debug("%s: request_irq IPC_AP_WAKE_IRQ\n", __func__);
ipc_ap_wake_state = IPC_AP_WAKE_UNINIT;
err = request_threaded_irq(
- gpio_to_irq(data->modem.xmm.ipc_ap_wake),
- NULL,
- baseband_xmm_power_ipc_ap_wake_irq,
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
- "IPC_AP_WAKE_IRQ",
- NULL);
+ gpio_to_irq(pdata->modem.xmm.ipc_ap_wake),
+ NULL, xmm_power_ipc_ap_wake_irq,
+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+ "IPC_AP_WAKE_IRQ", NULL);
if (err < 0) {
pr_err("%s - request irq IPC_AP_WAKE_IRQ failed\n",
__func__);
return err;
}
- err = enable_irq_wake(gpio_to_irq(data->modem.xmm.ipc_ap_wake));
+ err = enable_irq_wake(gpio_to_irq(
+ pdata->modem.xmm.ipc_ap_wake));
if (err < 0)
pr_err("%s: enable_irq_wake error\n", __func__);
- ipc_ap_wake_state = IPC_AP_WAKE_IRQ_READY;
- if (modem_ver >= XMM_MODEM_VER_1130) {
- pr_debug("%s: ver > 1130: AP_WAKE_INIT1\n", __func__);
- /* ver 1130 or later starts in INIT1 state */
- ipc_ap_wake_state = IPC_AP_WAKE_INIT1;
- }
+
+ pr_debug("%s: AP_WAKE_INIT1\n", __func__);
+ /* ver 1130 or later starts in INIT1 state */
+ ipc_ap_wake_state = IPC_AP_WAKE_INIT1;
}
/* init work queue */
- workqueue = create_singlethread_workqueue
- ("baseband_xmm_power_workqueue");
+ workqueue = create_singlethread_workqueue("xmm_power_wq");
if (!workqueue) {
pr_err("cannot create workqueue\n");
- return -1;
+ return -ENOMEM;
}
- baseband_xmm_power_work = (struct baseband_xmm_power_work_t *)
- kmalloc(sizeof(struct baseband_xmm_power_work_t), GFP_KERNEL);
- if (!baseband_xmm_power_work) {
- pr_err("cannot allocate baseband_xmm_power_work\n");
- return -1;
- }
- INIT_WORK((struct work_struct *) baseband_xmm_power_work,
- baseband_xmm_power_work_func);
- baseband_xmm_power_work->state = BBXMM_WORK_INIT;
- queue_work(workqueue,
- (struct work_struct *) baseband_xmm_power_work);
+
+ INIT_WORK(&xmm_power_drv_data.work, xmm_power_work_func);
+ xmm_power_drv_data.state = BBXMM_WORK_INIT;
+ queue_work(workqueue, &xmm_power_drv_data.work);
/* init work objects */
- INIT_WORK(&init1_work, baseband_xmm_power_init1_work);
- INIT_WORK(&init2_work, baseband_xmm_power_init2_work);
- INIT_WORK(&L2_resume_work, baseband_xmm_power_L2_resume_work);
- INIT_WORK(&autopm_resume_work, baseband_xmm_power_autopm_resume);
+ INIT_WORK(&init1_work, xmm_power_init1_work);
+ INIT_WORK(&init2_work, xmm_power_init2_work);
+ INIT_WORK(&L2_resume_work, xmm_power_L2_resume_work);
+ INIT_WORK(&autopm_resume_work, xmm_power_autopm_resume);
/* init state variables */
register_hsic_device = true;
@@ -1052,36 +972,30 @@ static int baseband_xmm_power_driver_probe(struct platform_device *device)
spin_unlock_irqrestore(&xmm_lock, flags);
usb_register_notify(&usb_xmm_nb);
- register_pm_notifier(&baseband_xmm_power_pm_notifier);
+ register_pm_notifier(&xmm_power_pm_notifier);
pr_debug("%s }\n", __func__);
return 0;
}
-static int baseband_xmm_power_driver_remove(struct platform_device *device)
+static int xmm_power_driver_remove(struct platform_device *device)
{
- struct baseband_power_platform_data *data
- = (struct baseband_power_platform_data *)
- device->dev.platform_data;
+ struct baseband_power_platform_data *pdata = device->dev.platform_data;
+ struct xmm_power_data *data = &xmm_power_drv_data;
struct device *dev = &device->dev;
pr_debug("%s\n", __func__);
/* check for platform data */
- if (!data)
+ if (!pdata)
return 0;
- unregister_pm_notifier(&baseband_xmm_power_pm_notifier);
+ unregister_pm_notifier(&xmm_power_pm_notifier);
usb_unregister_notify(&usb_xmm_nb);
- /* free work structure */
- kfree(baseband_xmm_power_work);
- baseband_xmm_power_work = (struct baseband_xmm_power_work_t *) 0;
-
/* free baseband irq(s) */
if (modem_flash && modem_pm) {
- free_irq(gpio_to_irq(baseband_power_driver_data
- ->modem.xmm.ipc_ap_wake), NULL);
+ free_irq(gpio_to_irq(pdata->modem.xmm.ipc_ap_wake), NULL);
}
/* free baseband gpio(s) */
@@ -1095,23 +1009,23 @@ static int baseband_xmm_power_driver_remove(struct platform_device *device)
device_remove_file(dev, &dev_attr_xmm_onoff);
/* unregister usb host controller */
- if (data->hsic_unregister)
- data->hsic_unregister(data->modem.xmm.hsic_device);
+ if (pdata->hsic_unregister)
+ pdata->hsic_unregister(data->hsic_device);
else
pr_err("%s: hsic_unregister is missing\n", __func__);
return 0;
}
-static int baseband_xmm_power_driver_handle_resume(
- struct baseband_power_platform_data *data)
+static int xmm_power_driver_handle_resume(
+ struct baseband_power_platform_data *pdata)
{
int value;
int delay = 1000; /* maxmum delay in msec */
unsigned long flags;
pr_debug("%s\n", __func__);
- if (!data)
+ if (!pdata)
return 0;
/* check if modem is on */
@@ -1127,16 +1041,15 @@ static int baseband_xmm_power_driver_handle_resume(
/* L3->L0 */
baseband_xmm_set_power_status(BBXMM_PS_L3TOL0);
- value = gpio_get_value(data->modem.xmm.ipc_ap_wake);
+ value = gpio_get_value(pdata->modem.xmm.ipc_ap_wake);
if (value) {
pr_info("AP L3 -> L0\n");
pr_debug("waiting for host wakeup...\n");
/* wake bb */
- gpio_set_value(data->modem.xmm.ipc_bb_wake, 1);
+ gpio_set_value(pdata->modem.xmm.ipc_bb_wake, 1);
do {
mdelay(1);
- value = gpio_get_value(
- data->modem.xmm.ipc_ap_wake);
+ value = gpio_get_value(pdata->modem.xmm.ipc_ap_wake);
delay--;
} while ((value) && (delay));
if (delay)
@@ -1155,26 +1068,24 @@ static int baseband_xmm_power_driver_handle_resume(
#ifdef CONFIG_PM
-static int baseband_xmm_power_driver_suspend(struct device *dev)
+static int xmm_power_driver_suspend(struct device *dev)
{
pr_debug("%s\n", __func__);
return 0;
}
-static int baseband_xmm_power_driver_resume(struct device *dev)
+static int xmm_power_driver_resume(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
- struct baseband_power_platform_data *data
- = (struct baseband_power_platform_data *)
- pdev->dev.platform_data;
+ struct baseband_power_platform_data *pdata = pdev->dev.platform_data;
pr_debug("%s\n", __func__);
- baseband_xmm_power_driver_handle_resume(data);
+ xmm_power_driver_handle_resume(pdata);
return 0;
}
-static int baseband_xmm_power_suspend_noirq(struct device *dev)
+static int xmm_power_suspend_noirq(struct device *dev)
{
unsigned long flags;
@@ -1191,57 +1102,55 @@ static int baseband_xmm_power_suspend_noirq(struct device *dev)
return 0;
}
-static int baseband_xmm_power_resume_noirq(struct device *dev)
+static int xmm_power_resume_noirq(struct device *dev)
{
pr_debug("%s\n", __func__);
return 0;
}
-static const struct dev_pm_ops baseband_xmm_power_dev_pm_ops = {
- .suspend_noirq = baseband_xmm_power_suspend_noirq,
- .resume_noirq = baseband_xmm_power_resume_noirq,
- .suspend = baseband_xmm_power_driver_suspend,
- .resume = baseband_xmm_power_driver_resume,
+static const struct dev_pm_ops xmm_power_dev_pm_ops = {
+ .suspend_noirq = xmm_power_suspend_noirq,
+ .resume_noirq = xmm_power_resume_noirq,
+ .suspend = xmm_power_driver_suspend,
+ .resume = xmm_power_driver_resume,
};
#endif
-static int baseband_xmm_power_driver_shutdown(struct platform_device *device)
+static void xmm_power_driver_shutdown(struct platform_device *device)
{
- struct baseband_power_platform_data *data =
- (struct baseband_power_platform_data *)
- device->dev.platform_data;
+ struct baseband_power_platform_data *pdata = device->dev.platform_data;
pr_debug("%s\n", __func__);
- disable_irq(gpio_to_irq(data->modem.xmm.ipc_ap_wake));
+ disable_irq(gpio_to_irq(pdata->modem.xmm.ipc_ap_wake));
/* bb_on is already down, to make sure set 0 again */
- gpio_set_value(data->modem.xmm.bb_on, 0);
- gpio_set_value(data->modem.xmm.bb_rst, 0);
- return 0;
+ gpio_set_value(pdata->modem.xmm.bb_on, 0);
+ gpio_set_value(pdata->modem.xmm.bb_rst, 0);
+ return;
}
static struct platform_driver baseband_power_driver = {
- .probe = baseband_xmm_power_driver_probe,
- .remove = baseband_xmm_power_driver_remove,
- .shutdown = baseband_xmm_power_driver_shutdown,
+ .probe = xmm_power_driver_probe,
+ .remove = xmm_power_driver_remove,
+ .shutdown = xmm_power_driver_shutdown,
.driver = {
.name = "baseband_xmm_power",
#ifdef CONFIG_PM
- .pm = &baseband_xmm_power_dev_pm_ops,
+ .pm = &xmm_power_dev_pm_ops,
#endif
},
};
-static int __init baseband_xmm_power_init(void)
+static int __init xmm_power_init(void)
{
pr_debug("%s\n", __func__);
return platform_driver_register(&baseband_power_driver);
}
-static void __exit baseband_xmm_power_exit(void)
+static void __exit xmm_power_exit(void)
{
pr_debug("%s\n", __func__);
platform_driver_unregister(&baseband_power_driver);
}
-module_init(baseband_xmm_power_init)
-module_exit(baseband_xmm_power_exit)
+module_init(xmm_power_init)
+module_exit(xmm_power_exit)
diff --git a/arch/arm/mach-tegra/baseband-xmm-power.h b/arch/arm/mach-tegra/baseband-xmm-power.h
index 0768ed191b05..1f08e3b6900c 100644
--- a/arch/arm/mach-tegra/baseband-xmm-power.h
+++ b/arch/arm/mach-tegra/baseband-xmm-power.h
@@ -71,24 +71,19 @@ enum baseband_xmm_power_work_state_t {
BBXMM_WORK_INIT_FLASH_STEP1,
/* initialize flash (with power management support) modem */
BBXMM_WORK_INIT_FLASH_PM_STEP1,
- BBXMM_WORK_INIT_FLASH_PM_VER_LT_1130_STEP1,
- BBXMM_WORK_INIT_FLASH_PM_VER_GE_1130_STEP1,
/* initialize flashless (with power management support) modem */
BBXMM_WORK_INIT_FLASHLESS_PM_STEP1,
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_WAIT_IRQ,
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP1,
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP2,
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP1,
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP2,
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP3,
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP4,
+ BBXMM_WORK_INIT_FLASHLESS_PM_STEP2,
+ BBXMM_WORK_INIT_FLASHLESS_PM_STEP3,
+ BBXMM_WORK_INIT_FLASHLESS_PM_STEP4,
};
-struct baseband_xmm_power_work_t {
- /* work structure must be first structure member */
- struct work_struct work;
+struct xmm_power_data {
/* xmm modem state */
enum baseband_xmm_power_work_state_t state;
+ struct baseband_power_platform_data *pdata;
+ struct work_struct work;
+ struct platform_device *hsic_device;
};
enum baseband_xmm_powerstate_t {
@@ -104,8 +99,9 @@ enum baseband_xmm_powerstate_t {
BBXMM_PS_LAST = -1,
};
-irqreturn_t baseband_xmm_power_ipc_ap_wake_irq(int irq, void *dev_id);
+irqreturn_t xmm_power_ipc_ap_wake_irq(int irq, void *dev_id);
void baseband_xmm_set_power_status(unsigned int status);
+extern struct xmm_power_data xmm_power_drv_data;
#endif /* BASREBAND_XMM_POWER_H */
diff --git a/arch/arm/mach-tegra/baseband-xmm-power2.c b/arch/arm/mach-tegra/baseband-xmm-power2.c
index 4295b3958202..3c6285c0a070 100644
--- a/arch/arm/mach-tegra/baseband-xmm-power2.c
+++ b/arch/arm/mach-tegra/baseband-xmm-power2.c
@@ -32,8 +32,6 @@
#include "board.h"
#include "devices.h"
-MODULE_LICENSE("GPL");
-
static unsigned long XYZ = 1000 * 1000000 + 800 * 1000 + 500;
module_param(modem_ver, ulong, 0644);
@@ -49,9 +47,8 @@ module_param(XYZ, ulong, 0644);
MODULE_PARM_DESC(XYZ,
"baseband xmm power2 - timing parameters X/Y/Z delay in ms");
-static struct baseband_power_platform_data *baseband_power2_driver_data;
static struct workqueue_struct *workqueue;
-static struct baseband_xmm_power_work_t *baseband_xmm_power2_work;
+static bool free_ipc_ap_wake_irq;
static enum {
IPC_AP_WAKE_UNINIT,
@@ -62,105 +59,37 @@ static enum {
IPC_AP_WAKE_H,
} ipc_ap_wake_state;
-static irqreturn_t baseband_xmm_power2_ver_lt_1130_ipc_ap_wake_irq2
- (int irq, void *dev_id)
-{
- int value;
-
- pr_debug("%s\n", __func__);
-
- /* check for platform data */
- if (!baseband_power2_driver_data)
- return IRQ_HANDLED;
- value = gpio_get_value(baseband_power2_driver_data->
- modem.xmm.ipc_ap_wake);
-
- /* IPC_AP_WAKE state machine */
- if (ipc_ap_wake_state < IPC_AP_WAKE_IRQ_READY) {
- pr_err("%s - spurious irq\n", __func__);
- } else if (ipc_ap_wake_state == IPC_AP_WAKE_IRQ_READY) {
- if (!value) {
- pr_debug("%s - IPC_AP_WAKE_INIT1"
- " - got falling edge\n",
- __func__);
- /* go to IPC_AP_WAKE_INIT1 state */
- ipc_ap_wake_state = IPC_AP_WAKE_INIT1;
- /* queue work */
- baseband_xmm_power2_work->state =
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP1;
- queue_work(workqueue, (struct work_struct *)
- baseband_xmm_power2_work);
- } else {
- pr_debug("%s - IPC_AP_WAKE_INIT1"
- " - wait for falling edge\n",
- __func__);
- }
- } else if (ipc_ap_wake_state == IPC_AP_WAKE_INIT1) {
- if (!value) {
- pr_debug("%s - IPC_AP_WAKE_INIT2"
- " - wait for rising edge\n",
- __func__);
- } else {
- pr_debug("%s - IPC_AP_WAKE_INIT2"
- " - got rising edge\n",
- __func__);
- /* go to IPC_AP_WAKE_INIT2 state */
- ipc_ap_wake_state = IPC_AP_WAKE_INIT2;
- /* queue work */
- baseband_xmm_power2_work->state =
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP2;
- queue_work(workqueue, (struct work_struct *)
- baseband_xmm_power2_work);
- }
- } else {
- if (!value) {
- pr_debug("%s - falling\n", __func__);
- ipc_ap_wake_state = IPC_AP_WAKE_L;
- } else {
- pr_debug("%s - rising\n", __func__);
- ipc_ap_wake_state = IPC_AP_WAKE_H;
- }
- return baseband_xmm_power_ipc_ap_wake_irq(irq, dev_id);
- }
-
- return IRQ_HANDLED;
-}
-
-static irqreturn_t baseband_xmm_power2_ver_ge_1130_ipc_ap_wake_irq2
- (int irq, void *dev_id)
+static irqreturn_t xmm_power2_ipc_ap_wake_irq(int irq, void *dev_id)
{
int value;
+ struct xmm_power_data *data = dev_id;
+ struct baseband_power_platform_data *pdata = data->pdata;
pr_debug("%s\n", __func__);
/* check for platform data */
- if (!baseband_power2_driver_data)
+ if (!pdata)
return IRQ_HANDLED;
- value = gpio_get_value(baseband_power2_driver_data->
- modem.xmm.ipc_ap_wake);
+ value = gpio_get_value(pdata->modem.xmm.ipc_ap_wake);
/* IPC_AP_WAKE state machine */
- if (ipc_ap_wake_state < IPC_AP_WAKE_IRQ_READY) {
+ if (unlikely(ipc_ap_wake_state < IPC_AP_WAKE_IRQ_READY))
pr_err("%s - spurious irq\n", __func__);
- } else if (ipc_ap_wake_state == IPC_AP_WAKE_IRQ_READY) {
+ else if (ipc_ap_wake_state == IPC_AP_WAKE_IRQ_READY) {
if (!value) {
- pr_debug("%s - IPC_AP_WAKE_INIT1"
- " - got falling edge\n",
+ pr_debug("%s: IPC_AP_WAKE_INIT1 got falling edge\n",
__func__);
/* go to IPC_AP_WAKE_INIT2 state */
ipc_ap_wake_state = IPC_AP_WAKE_INIT2;
/* queue work */
- baseband_xmm_power2_work->state =
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP2;
- queue_work(workqueue, (struct work_struct *)
- baseband_xmm_power2_work);
- } else {
- pr_debug("%s - IPC_AP_WAKE_INIT1"
- " - wait for falling edge\n",
- __func__);
- }
+ data->state =
+ BBXMM_WORK_INIT_FLASHLESS_PM_STEP2;
+ queue_work(workqueue, &data->work);
+ } else
+ pr_debug("%s: IPC_AP_WAKE_INIT1"
+ " wait for falling edge\n", __func__);
} else {
if (!value) {
pr_debug("%s - falling\n", __func__);
@@ -169,260 +98,154 @@ static irqreturn_t baseband_xmm_power2_ver_ge_1130_ipc_ap_wake_irq2
pr_debug("%s - rising\n", __func__);
ipc_ap_wake_state = IPC_AP_WAKE_H;
}
- return baseband_xmm_power_ipc_ap_wake_irq(irq, dev_id);
+ return xmm_power_ipc_ap_wake_irq(irq, dev_id);
}
return IRQ_HANDLED;
}
-static void baseband_xmm_power2_flashless_pm_ver_lt_1130_step1
- (struct work_struct *work)
-{
- int value;
-
- pr_debug("%s {\n", __func__);
-
- /* check for platform data */
- if (!baseband_power2_driver_data)
- return;
-
- /* check if IPC_HSIC_ACTIVE high */
- value = gpio_get_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active);
- if (value != 1) {
- pr_err("%s - expected IPC_HSIC_ACTIVE high!\n", __func__);
- return;
- }
-
- /* wait 30 ms */
- mdelay(30);
-
- /* set IPC_HSIC_ACTIVE low */
- gpio_set_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active, 0);
-
- pr_debug("%s }\n", __func__);
-}
-
-static void baseband_xmm_power2_flashless_pm_ver_lt_1130_step2
- (struct work_struct *work)
-{
- int value;
-
- pr_debug("%s {\n", __func__);
-
- /* check for platform data */
- if (!baseband_power2_driver_data)
- return;
-
- /* check if IPC_HSIC_ACTIVE low */
- value = gpio_get_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active);
- if (value != 0) {
- pr_err("%s - expected IPC_HSIC_ACTIVE low!\n", __func__);
- return;
- }
-
- /* wait 1 ms */
- mdelay(1);
-
- /* unregister usb host controller */
- if (baseband_power2_driver_data->hsic_unregister)
- baseband_power2_driver_data->hsic_unregister(
- baseband_power2_driver_data->modem.xmm.hsic_device);
- else
- pr_err("%s: hsic_unregister is missing\n", __func__);
-
- /* set IPC_HSIC_ACTIVE high */
- gpio_set_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active, 1);
-
- /* wait 20 ms */
- mdelay(20);
-
- /* set IPC_HSIC_ACTIVE low */
- gpio_set_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active, 0);
-
- /* wait 20 ms */
- mdelay(20);
-
- /* set IPC_HSIC_ACTIVE high */
- gpio_set_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active, 1);
-
- pr_debug("%s }\n", __func__);
-}
-
-static void baseband_xmm_power2_flashless_pm_ver_ge_1130_step1
- (struct work_struct *work)
+static void xmm_power2_step1(struct work_struct *work)
{
+ struct xmm_power_data *data =
+ container_of(work, struct xmm_power_data, work);
+ struct baseband_power_platform_data *pdata = data->pdata;
int X = XYZ / 1000000;
- int Y = XYZ / 1000 - X * 1000;
- int Z = XYZ % 1000;
pr_info("%s {\n", __func__);
- pr_info("XYZ=%ld X=%d Y=%d Z=%d\n", XYZ, X, Y, Z);
-
/* check for platform data */
- if (!baseband_power2_driver_data)
+ if (!pdata)
return;
/* unregister usb host controller */
- if (baseband_power2_driver_data->hsic_unregister)
- baseband_power2_driver_data->hsic_unregister(
- baseband_power2_driver_data->modem.xmm.hsic_device);
+ if (pdata->hsic_unregister)
+ pdata->hsic_unregister(data->hsic_device);
else
pr_err("%s: hsic_unregister is missing\n", __func__);
/* wait X ms */
- mdelay(X);
+ msleep(X);
/* set IPC_HSIC_ACTIVE low */
- gpio_set_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active, 0);
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 0);
pr_info("%s }\n", __func__);
}
-static void baseband_xmm_power2_flashless_pm_ver_ge_1130_step2
- (struct work_struct *work)
+static void xmm_power2_step2(struct work_struct *work)
{
+ struct xmm_power_data *data =
+ container_of(work, struct xmm_power_data, work);
+ struct baseband_power_platform_data *pdata = data->pdata;
int X = XYZ / 1000000;
int Y = XYZ / 1000 - X * 1000;
int Z = XYZ % 1000;
pr_info("%s {\n", __func__);
- pr_info("XYZ=%ld X=%d Y=%d Z=%d\n", XYZ, X, Y, Z);
-
/* check for platform data */
- if (!baseband_power2_driver_data)
+ if (!data || !pdata)
return;
/* wait Y ms */
- mdelay(Y);
+ msleep(Y);
/* register usb host controller */
- if (baseband_power2_driver_data->hsic_register)
- baseband_power2_driver_data->modem.xmm.hsic_device =
- baseband_power2_driver_data->hsic_register();
+ if (pdata->hsic_register)
+ data->hsic_device = pdata->hsic_register();
else
pr_err("%s: hsic_register is missing\n", __func__);
/* wait Z ms */
- mdelay(Z);
+ msleep(Z);
/* set IPC_HSIC_ACTIVE high */
- gpio_set_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active, 1);
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 1);
/* queue work function to check if enumeration succeeded */
- baseband_xmm_power2_work->state =
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP3;
- queue_work(workqueue, (struct work_struct *)
- baseband_xmm_power2_work);
+ data->state = BBXMM_WORK_INIT_FLASHLESS_PM_STEP3;
+ queue_work(workqueue, &data->work);
pr_info("%s }\n", __func__);
}
-static void baseband_xmm_power2_flashless_pm_ver_ge_1130_step3
- (struct work_struct *work)
+static void xmm_power2_step3(struct work_struct *work)
{
- int X = XYZ / 1000000;
- int Y = XYZ / 1000 - X * 1000;
- int Z = XYZ % 1000;
+ struct xmm_power_data *data =
+ container_of(work, struct xmm_power_data, work);
+ struct baseband_power_platform_data *pdata = data->pdata;
int enum_success = 0;
+ mm_segment_t oldfs;
+ struct file *filp;
pr_info("%s {\n", __func__);
- pr_info("XYZ=%ld X=%d Y=%d Z=%d\n", XYZ, X, Y, Z);
-
/* check for platform data */
- if (!baseband_power2_driver_data)
+ if (!data || !pdata)
return;
- /* wait 500 ms */
- mdelay(500);
+ /* wait 1 sec */
+ msleep(1000);
/* check if enumeration succeeded */
- {
- mm_segment_t oldfs;
- struct file *filp;
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- filp = filp_open("/dev/ttyACM0",
- O_RDONLY, 0);
- if (IS_ERR(filp) || (filp == NULL)) {
- pr_err("/dev/ttyACM0 %ld\n",
- PTR_ERR(filp));
- } else {
- filp_close(filp, NULL);
- enum_success = 1;
- }
- set_fs(oldfs);
+ oldfs = get_fs();
+ set_fs(KERNEL_DS);
+ filp = filp_open("/dev/ttyACM0", O_RDONLY, 0);
+ if (IS_ERR(filp) || (filp == NULL))
+ pr_err("failed to open /dev/ttyACM0 %ld\n", PTR_ERR(filp));
+ else {
+ filp_close(filp, NULL);
+ enum_success = 1;
}
+ set_fs(oldfs);
/* if enumeration failed, attempt recovery pulse */
if (!enum_success) {
pr_info("attempting recovery pulse...\n");
/* wait 20 ms */
- mdelay(20);
+ msleep(20);
/* set IPC_HSIC_ACTIVE low */
- gpio_set_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active, 0);
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 0);
/* wait 20 ms */
- mdelay(20);
+ msleep(20);
/* set IPC_HSIC_ACTIVE high */
- gpio_set_value(baseband_power2_driver_data->
- modem.xmm.ipc_hsic_active, 1);
+ gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 1);
/* check if recovery pulse worked */
- baseband_xmm_power2_work->state =
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP4;
- queue_work(workqueue, (struct work_struct *)
- baseband_xmm_power2_work);
+ data->state = BBXMM_WORK_INIT_FLASHLESS_PM_STEP4;
+ queue_work(workqueue, &data->work);
}
pr_info("%s }\n", __func__);
}
-static void baseband_xmm_power2_flashless_pm_ver_ge_1130_step4
- (struct work_struct *work)
+static void xmm_power2_step4(struct work_struct *work)
{
- int X = XYZ / 1000000;
- int Y = XYZ / 1000 - X * 1000;
- int Z = XYZ % 1000;
+ struct xmm_power_data *data =
+ container_of(work, struct xmm_power_data, work);
+ mm_segment_t oldfs;
+ struct file *filp;
int enum_success = 0;
pr_info("%s {\n", __func__);
- pr_info("XYZ=%ld X=%d Y=%d Z=%d\n", XYZ, X, Y, Z);
-
/* check for platform data */
- if (!baseband_power2_driver_data)
+ if (!data)
return;
/* wait 500 ms */
- mdelay(500);
+ msleep(500);
/* check if enumeration succeeded */
- {
- mm_segment_t oldfs;
- struct file *filp;
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- filp = filp_open("/dev/ttyACM0",
- O_RDONLY, 0);
- if (IS_ERR(filp) || (filp == NULL)) {
- pr_err("open /dev/ttyACM0 failed %ld\n",
- PTR_ERR(filp));
- } else {
- filp_close(filp, NULL);
- enum_success = 1;
- }
- set_fs(oldfs);
+ oldfs = get_fs();
+ set_fs(KERNEL_DS);
+ filp = filp_open("/dev/ttyACM0", O_RDONLY, 0);
+ if (IS_ERR(filp) || (filp == NULL))
+ pr_err("failed to open /dev/ttyACM0 %ld\n", PTR_ERR(filp));
+ else {
+ filp_close(filp, NULL);
+ enum_success = 1;
}
+ set_fs(oldfs);
/* if recovery pulse did not fix enumeration, retry from beginning */
if (!enum_success) {
@@ -438,34 +261,31 @@ static void baseband_xmm_power2_flashless_pm_ver_ge_1130_step4
retry);
--retry;
ipc_ap_wake_state = IPC_AP_WAKE_IRQ_READY;
- baseband_xmm_power2_work->state =
- BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP1;
- queue_work(workqueue, (struct work_struct *)
- baseband_xmm_power2_work);
+ data->state = BBXMM_WORK_INIT_FLASHLESS_PM_STEP1;
+ queue_work(workqueue, &data->work);
}
}
pr_info("%s }\n", __func__);
}
-static int free_ipc_ap_wake_irq;
-
-static void baseband_xmm_power2_work_func(struct work_struct *work)
+static void xmm_power2_work_func(struct work_struct *work)
{
- struct baseband_xmm_power_work_t *bbxmm_work
- = (struct baseband_xmm_power_work_t *) work;
+ struct xmm_power_data *data =
+ container_of(work, struct xmm_power_data, work);
+ struct baseband_power_platform_data *pdata = data->pdata;
int err;
- pr_debug("%s bbxmm_work->state=%d\n", __func__, bbxmm_work->state);
+ pr_debug("%s pdata->state=%d\n", __func__, data->state);
- switch (bbxmm_work->state) {
+ switch (data->state) {
case BBXMM_WORK_UNINIT:
pr_debug("BBXMM_WORK_UNINIT\n");
/* free baseband irq(s) */
if (free_ipc_ap_wake_irq) {
- free_irq(gpio_to_irq(baseband_power2_driver_data
- ->modem.xmm.ipc_ap_wake), NULL);
- free_ipc_ap_wake_irq = 0;
+ free_irq(gpio_to_irq(pdata->modem.xmm.ipc_ap_wake),
+ data);
+ free_ipc_ap_wake_irq = false;
}
break;
case BBXMM_WORK_INIT:
@@ -473,24 +293,20 @@ static void baseband_xmm_power2_work_func(struct work_struct *work)
/* request baseband irq(s) */
ipc_ap_wake_state = IPC_AP_WAKE_UNINIT;
err = request_threaded_irq(
- gpio_to_irq(baseband_power2_driver_data->
- modem.xmm.ipc_ap_wake),
- NULL,
- (modem_ver < XMM_MODEM_VER_1130)
- ? baseband_xmm_power2_ver_lt_1130_ipc_ap_wake_irq2
- : baseband_xmm_power2_ver_ge_1130_ipc_ap_wake_irq2,
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
- "BBXMM_POWER2_IPC_AP_WAKE_IRQ",
- NULL);
+ gpio_to_irq(pdata->modem.xmm.ipc_ap_wake),
+ NULL, xmm_power2_ipc_ap_wake_irq,
+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+ "xmm_power2_ipc_ap_wake_irq", data);
if (err < 0) {
pr_err("%s - request irq IPC_AP_WAKE_IRQ failed\n",
__func__);
return;
}
- free_ipc_ap_wake_irq = 1;
+ free_ipc_ap_wake_irq = true;
ipc_ap_wake_state = IPC_AP_WAKE_IRQ_READY;
+
/* go to next state */
- bbxmm_work->state = (modem_flash && !modem_pm)
+ data->state = (modem_flash && !modem_pm)
? BBXMM_WORK_INIT_FLASH_STEP1
: (modem_flash && modem_pm)
? BBXMM_WORK_INIT_FLASH_PM_STEP1
@@ -501,130 +317,93 @@ static void baseband_xmm_power2_work_func(struct work_struct *work)
break;
case BBXMM_WORK_INIT_FLASH_STEP1:
pr_debug("BBXMM_WORK_INIT_FLASH_STEP1\n");
+ pr_info("%s: flashed modem is not supported here\n", __func__);
break;
case BBXMM_WORK_INIT_FLASH_PM_STEP1:
pr_debug("BBXMM_WORK_INIT_FLASH_PM_STEP1\n");
- /* go to next state */
- bbxmm_work->state = (modem_ver < XMM_MODEM_VER_1130)
- ? BBXMM_WORK_INIT_FLASH_PM_VER_LT_1130_STEP1
- : BBXMM_WORK_INIT_FLASH_PM_VER_GE_1130_STEP1;
- queue_work(workqueue, work);
- break;
- case BBXMM_WORK_INIT_FLASH_PM_VER_LT_1130_STEP1:
- pr_debug("BBXMM_WORK_INIT_FLASH_PM_VER_LT_1130_STEP1\n");
- break;
- case BBXMM_WORK_INIT_FLASH_PM_VER_GE_1130_STEP1:
- pr_debug("BBXMM_WORK_INIT_FLASH_PM_VER_GE_1130_STEP1\n");
+ pr_info("%s: flashed modem is not supported here\n", __func__);
break;
case BBXMM_WORK_INIT_FLASHLESS_PM_STEP1:
+ /* start flashless modem enum process */
pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_STEP1\n");
- /* go to next state */
- bbxmm_work->state = (modem_ver < XMM_MODEM_VER_1130)
- ? BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_WAIT_IRQ
- : BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP1;
- queue_work(workqueue, work);
- break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_WAIT_IRQ:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_WAIT_IRQ"
- " - waiting for IPC_AP_WAKE_IRQ to trigger step1\n");
- break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP1:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP1\n");
- baseband_xmm_power2_flashless_pm_ver_lt_1130_step1(work);
+ xmm_power2_step1(work);
break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP2:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_LT_1130_STEP2\n");
- baseband_xmm_power2_flashless_pm_ver_lt_1130_step2(work);
+ case BBXMM_WORK_INIT_FLASHLESS_PM_STEP2:
+ pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_STEP2\n");
+ xmm_power2_step2(work);
break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP1:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP1\n");
- baseband_xmm_power2_flashless_pm_ver_ge_1130_step1(work);
+ case BBXMM_WORK_INIT_FLASHLESS_PM_STEP3:
+ pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_STEP3\n");
+ xmm_power2_step3(work);
break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP2:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP2\n");
- baseband_xmm_power2_flashless_pm_ver_ge_1130_step2(work);
+ case BBXMM_WORK_INIT_FLASHLESS_PM_STEP4:
+ pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_STEP4\n");
+ xmm_power2_step4(work);
break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP3:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP3\n");
- baseband_xmm_power2_flashless_pm_ver_ge_1130_step3(work);
- break;
- case BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP4:
- pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_VER_GE_1130_STEP4\n");
- baseband_xmm_power2_flashless_pm_ver_ge_1130_step4(work);
+ default:
break;
}
-
}
-static int baseband_xmm_power2_driver_probe(struct platform_device *device)
+static int xmm_power2_probe(struct platform_device *device)
{
- struct baseband_power_platform_data *data
- = (struct baseband_power_platform_data *)
- device->dev.platform_data;
-
pr_debug("%s\n", __func__);
+ if (!device->dev.platform_data) {
+ pr_err("%s: no platform data found\n", __func__);
+ return -ENOMEM;
+ }
- /* save platform data */
- baseband_power2_driver_data = data;
+ xmm_power_drv_data.pdata = device->dev.platform_data;
- /* init work queue */
+ /* create workqueue */
pr_debug("%s: init work queue\n", __func__);
- workqueue = create_singlethread_workqueue
- ("baseband_xmm_power2_workqueue");
- if (!workqueue) {
- pr_err("cannot create workqueue\n");
- return -1;
- }
- baseband_xmm_power2_work = (struct baseband_xmm_power_work_t *)
- kmalloc(sizeof(struct baseband_xmm_power_work_t), GFP_KERNEL);
- if (!baseband_xmm_power2_work) {
- pr_err("cannot allocate baseband_xmm_power2_work\n");
- return -1;
+ workqueue = create_singlethread_workqueue("xmm_power2_wq");
+ if (unlikely(!workqueue)) {
+ pr_err("%s: cannot create workqueue\n", __func__);
+ return -ENOMEM;
}
+
+ /* init work */
pr_debug("%s: BBXMM_WORK_INIT\n", __func__);
- INIT_WORK((struct work_struct *) baseband_xmm_power2_work,
- baseband_xmm_power2_work_func);
- baseband_xmm_power2_work->state = BBXMM_WORK_INIT;
- queue_work(workqueue,
- (struct work_struct *) baseband_xmm_power2_work);
+ INIT_WORK(&xmm_power_drv_data.work, xmm_power2_work_func);
+ xmm_power_drv_data.state = BBXMM_WORK_INIT;
+ queue_work(workqueue, &xmm_power_drv_data.work);
+
return 0;
}
-static int baseband_xmm_power2_driver_remove(struct platform_device *device)
+static int xmm_power2_remove(struct platform_device *device)
{
- struct baseband_power_platform_data *data
- = (struct baseband_power_platform_data *)
+ struct baseband_power_platform_data *pdata =
device->dev.platform_data;
+ struct xmm_power_data *data = &xmm_power_drv_data;
pr_debug("%s\n", __func__);
/* check for platform data */
if (!data)
- return 0;
-
- /* free irq */
- if (free_ipc_ap_wake_irq) {
- free_irq(gpio_to_irq(data->modem.xmm.ipc_ap_wake), NULL);
- free_ipc_ap_wake_irq = 0;
- }
+ return -ENODEV;
- /* free work structure */
+ /* free work queue */
if (workqueue) {
- cancel_work_sync(baseband_xmm_power2_work);
+ cancel_work_sync(&data->work);
destroy_workqueue(workqueue);
}
- kfree(baseband_xmm_power2_work);
- baseband_xmm_power2_work = (struct baseband_xmm_power_work_t *) 0;
+
+ /* free irq */
+ if (free_ipc_ap_wake_irq) {
+ free_irq(gpio_to_irq(pdata->modem.xmm.ipc_ap_wake), data);
+ free_ipc_ap_wake_irq = false;
+ }
return 0;
}
#ifdef CONFIG_PM
-static int baseband_xmm_power2_driver_suspend(struct platform_device *device,
+static int xmm_power2_suspend(struct platform_device *device,
pm_message_t state)
{
- struct baseband_power_platform_data *data
- = (struct baseband_power_platform_data *)
+ struct baseband_power_platform_data *data =
device->dev.platform_data;
pr_debug("%s - nop\n", __func__);
@@ -636,10 +415,9 @@ static int baseband_xmm_power2_driver_suspend(struct platform_device *device,
return 0;
}
-static int baseband_xmm_power2_driver_resume(struct platform_device *device)
+static int xmm_power2_resume(struct platform_device *device)
{
- struct baseband_power_platform_data *data
- = (struct baseband_power_platform_data *)
+ struct baseband_power_platform_data *data =
device->dev.platform_data;
pr_debug("%s - nop\n", __func__);
@@ -653,29 +431,32 @@ static int baseband_xmm_power2_driver_resume(struct platform_device *device)
#endif
static struct platform_driver baseband_power2_driver = {
- .probe = baseband_xmm_power2_driver_probe,
- .remove = baseband_xmm_power2_driver_remove,
+ .probe = xmm_power2_probe,
+ .remove = xmm_power2_remove,
#ifdef CONFIG_PM
- .suspend = baseband_xmm_power2_driver_suspend,
- .resume = baseband_xmm_power2_driver_resume,
+ .suspend = xmm_power2_suspend,
+ .resume = xmm_power2_resume,
#endif
.driver = {
.name = "baseband_xmm_power2",
},
};
-static int __init baseband_xmm_power2_init(void)
+static int __init xmm_power2_init(void)
{
pr_debug("%s\n", __func__);
return platform_driver_register(&baseband_power2_driver);
}
-static void __exit baseband_xmm_power2_exit(void)
+static void __exit xmm_power2_exit(void)
{
pr_debug("%s\n", __func__);
+
platform_driver_unregister(&baseband_power2_driver);
}
-module_init(baseband_xmm_power2_init)
-module_exit(baseband_xmm_power2_exit)
+module_init(xmm_power2_init)
+module_exit(xmm_power2_exit)
+
+MODULE_LICENSE("GPL");