static void xmm_power_work_func(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; pr_debug("%s\n", __func__); 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 */ 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", 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 (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"); pr_debug("%s: ipc_hsic_active -> 0\n", __func__); gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 0); modem_acked_resume = true; /* reset / power on sequence */ xmm_power_reset_on(pdata); /* set power status as on */ power_onoff = 1; /* expecting init2 performs register hsic to enumerate modem * software directly. */ break; case BBXMM_WORK_INIT_FLASHLESS_PM_STEP1: pr_debug("BBXMM_WORK_INIT_FLASHLESS_PM_STEP1\n"); pr_info("%s: flashless is not supported here\n", __func__); break; default: break; } }
static int xmm_power_on(struct platform_device *device) { struct baseband_power_platform_data *pdata = device->dev.platform_data; struct xmm_power_data *data = &xmm_power_drv_data; unsigned long flags; pr_debug("%s {\n", __func__); /* check for platform data */ if (!pdata) { pr_err("%s: !pdata\n", __func__); return -EINVAL; } if (baseband_xmm_get_power_status() != BBXMM_PS_UNINIT) return -EINVAL; /* reset the state machine */ baseband_xmm_set_power_status(BBXMM_PS_INIT); modem_sleep_flag = false; modem_acked_resume = true; pr_debug("%s wake_st(%d) modem version %lu\n", __func__, ipc_ap_wake_state, modem_ver); /* register usb host controller */ if (!modem_flash) { pr_debug("%s - %d\n", __func__, __LINE__); spin_lock_irqsave(&xmm_lock, flags); ipc_ap_wake_state = IPC_AP_WAKE_INIT2; spin_unlock_irqrestore(&xmm_lock, flags); /* register usb host controller only once */ if (register_hsic_device) { pr_debug("%s: register usb host controller\n", __func__); modem_power_on = true; if (pdata->hsic_register) data->hsic_device = pdata->hsic_register (pdata->ehci_device); else pr_err("%s: hsic_register is missing\n", __func__); register_hsic_device = false; baseband_modem_power_on(pdata); } else { /* register usb host controller */ if (pdata->hsic_register) data->hsic_device = pdata->hsic_register (pdata->ehci_device); /* turn on modem */ pr_debug("%s call baseband_modem_power_on_async\n", __func__); baseband_modem_power_on_async(pdata); } } else { /* reset flashed modem then it will respond with * ap-wake rising followed by falling gpio */ pr_debug("%s: reset flash modem\n", __func__); modem_power_on = false; spin_lock_irqsave(&xmm_lock, flags); ipc_ap_wake_state = IPC_AP_WAKE_IRQ_READY; spin_unlock_irqrestore(&xmm_lock, flags); gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 0); forced_abort_hubevent = 0; xmm_power_reset_on(pdata); } pr_debug("%s }\n", __func__); return 0; }
static int xmm_power_on(struct platform_device *device) { 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 (!pdata) { pr_err("%s: !pdata\n", __func__); return -EINVAL; } if (baseband_xmm_powerstate != BBXMM_PS_UNINIT) return -EINVAL; //tegra_baseband_rail_on(); /* reset the state machine */ baseband_xmm_powerstate = BBXMM_PS_INIT; modem_sleep_flag = false; 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); /* register usb host controller */ if (!modem_flash) { pr_debug("%s - %d\n", __func__, __LINE__); /* register usb host controller only once */ if (register_hsic_device) { pr_debug("%s: register usb host controller\n", __func__); modem_power_on = true; 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 (pdata->hsic_register) data->hsic_device = pdata->hsic_register(); /* turn on modem */ pr_debug("%s call baseband_modem_power_on_async\n", __func__); baseband_modem_power_on_async(pdata); } } else { /* reset flashed modem then it will respond with * ap-wake rising followed by falling gpio */ pr_debug("%s: reset flash modem\n", __func__); modem_power_on = false; ipc_ap_wake_state = IPC_AP_WAKE_INIT1; gpio_set_value(pdata->modem.xmm.ipc_hsic_active, 0); waiting_falling_flag = 0; xmm_power_reset_on(pdata); } 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__); return 0; }