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;
}