static ssize_t store_dwd_reset_modem(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int state; struct platform_device *device = to_platform_device(dev); struct baseband_power_platform_data *data; sscanf(buf, "%d", &state); if (state > 0) { pr_info("++ dwd_reset_modem ++\n"); /* check for device / platform data */ if (!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__); return -EINVAL; } if (!(data->hsic_unregister && data->hsic_register)) { pr_err("%s: hsic_unregister or hsic_register missing\n", __func__); return -EINVAL; } if (!register_hsic_device) { register_hsic_device = true; data->hsic_unregister(data->modem.xmm.hsic_device); mdelay(20); } gpio_set_value(baseband_power_driver_data->modem.xmm.bb_rst, 0); ipc_ap_wake_state = IPC_AP_WAKE_UNINIT; mdelay(1); data->modem.xmm.hsic_device = data->hsic_register(); register_hsic_device = false; baseband_xmm_power_reset_on(); pr_info("-- dwd_reset_modem --\n"); } return count; }
static void baseband_xmm_power_work_func(struct work_struct *work) { struct baseband_xmm_power_work_t *bbxmm_work = (struct baseband_xmm_power_work_t *) work; pr_debug("%s\n", __func__); switch (bbxmm_work->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) ? 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); 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(); 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); } /* reset / power on sequence */ baseband_xmm_power_reset_on(); /* 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) */ 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"); break; default: break; } }
static int baseband_xmm_power_on(struct platform_device *device) { struct baseband_power_platform_data *data = (struct baseband_power_platform_data *) device->dev.platform_data; int ret; pr_debug("%s {\n", __func__); /* check for platform data */ if (!data) { 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; 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; pr_debug("%s wake_st(%d) modem version %ld\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 (data->hsic_register) data->modem.xmm.hsic_device = data->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(); /* turn on modem */ pr_debug("%s call baseband_modem_power_on\n", __func__); baseband_modem_power_on(data); } }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(data->modem.xmm.ipc_hsic_active, 0); waiting_falling_flag = 0; baseband_xmm_power_reset_on(); } ret = enable_irq_wake(gpio_to_irq(data->modem.xmm.ipc_ap_wake)); if (ret < 0) pr_err("%s: enable_irq_wake error\n", __func__); pr_debug("%s }\n", __func__); return 0; }