Esempio n. 1
0
INT32 wmt_ctrl_hw_pwr_on(P_WMT_CTRL_DATA pWmtCtrlData)
{
    INT32 iret;

    /*psm should be enabled right after wmt_ic_init */
    P_DEV_WMT pDev = &gDevWmt;
    if (osal_test_and_set_bit(WMT_STAT_PWR, &pDev->state)) {
        WMT_WARN_FUNC("already on\n");
        iret = 0;
    } else {
        WMT_DBG_FUNC("off->on\n");
        iret = wmt_plat_pwr_ctrl(FUNC_ON);
    }

    return iret;
}
INT32  wmt_ctrl_ul_cmd (
    P_DEV_WMT pWmtDev,
    const UCHAR *pCmdStr
    )
{
    INT32 waitRet = -1;
    P_OSAL_SIGNAL pCmdSignal;
    P_OSAL_EVENT pCmdReq;
    if (osal_test_and_set_bit(WMT_STAT_CMD, &pWmtDev->state)) {
        WMT_WARN_FUNC("cmd buf is occupied by (%s) \n", pWmtDev->cCmd);
        return -1;
    }

    /* indicate baud rate change to user space app */
#if 0
    INIT_COMPLETION(pWmtDev->cmd_comp);
    pWmtDev->cmd_result = -1;
    strncpy(pWmtDev->cCmd, pCmdStr, NAME_MAX);
    pWmtDev->cCmd[NAME_MAX] = '\0';
    wake_up_interruptible(&pWmtDev->cmd_wq);
#endif

    pCmdSignal = &pWmtDev->cmdResp;
    osal_signal_init(pCmdSignal);
    pCmdSignal->timeoutValue = 2000;
    osal_strncpy(pWmtDev->cCmd, pCmdStr, NAME_MAX);
    pWmtDev->cCmd[NAME_MAX] = '\0';

    pCmdReq = &pWmtDev->cmdReq;

    osal_trigger_event(&pWmtDev->cmdReq);
    WMT_DBG_FUNC("str(%s) request ok\n", pCmdStr);

//    waitRet = wait_for_completion_interruptible_timeout(&pWmtDev->cmd_comp, msecs_to_jiffies(2000));
    waitRet = osal_wait_for_signal_timeout(pCmdSignal);
    WMT_LOUD_FUNC("wait signal iRet:%d\n", waitRet);
    if (0 == waitRet) {
        WMT_ERR_FUNC("wait signal timeout \n");
        return -2;
    }

    WMT_INFO_FUNC("str(%s) result(%d)\n", pCmdStr, pWmtDev->cmdResult);

    return pWmtDev->cmdResult;
}
INT32  wmt_ctrl_sdio_hw(P_WMT_CTRL_DATA pWmtCtrlData)
{
    INT32 iRet = 0;
    UINT32 statBit = WMT_STAT_SDIO1_ON;
    P_DEV_WMT pDev = &gDevWmt; /* single instance */

    WMT_SDIO_SLOT_NUM sdioSlotNum = pWmtCtrlData->au4CtrlData[0];
    ENUM_FUNC_STATE funcState = pWmtCtrlData->au4CtrlData[1];

    if ((WMT_SDIO_SLOT_INVALID == sdioSlotNum)
        || (WMT_SDIO_SLOT_MAX <= sdioSlotNum)) {
        WMT_WARN_FUNC("CTRL_SDIO_SLOT(%d) but invalid slot num \n", sdioSlotNum);
        return -1;
    }

    WMT_DBG_FUNC("WMT_CTRL_SDIO_HW (0x%x, %d)\n", sdioSlotNum, funcState);

    if (WMT_SDIO_SLOT_SDIO2 == sdioSlotNum) {
        statBit = WMT_STAT_SDIO2_ON;
    }

    if (funcState) {
        if (osal_test_and_set_bit(statBit, &pDev->state)) {
            WMT_WARN_FUNC("CTRL_SDIO_SLOT slotNum(%d) already ON \n", sdioSlotNum);
            //still return 0
            iRet = 0;
        }
        else {
            iRet = wmt_plat_sdio_ctrl(sdioSlotNum, FUNC_ON);
        }
    }
    else  {
        if (osal_test_and_clear_bit(statBit, &pDev->state)) {
            iRet = wmt_plat_sdio_ctrl(sdioSlotNum, FUNC_OFF);
        }
        else {
            WMT_WARN_FUNC("CTRL_SDIO_SLOT slotNum(%d) already OFF \n", sdioSlotNum);
            //still return 0
            iRet = 0;
        }
    }

    return iRet;
}