void mmdvfs_handle_cmd(MTK_MMDVFS_CMD *cmd)
{
#if !MMDVFS_ENABLE
	return;
#endif

	MMDVFSMSG("MMDVFS cmd %u %d\n", cmd->type, cmd->scen);

	switch (cmd->type) {
	case MTK_MMDVFS_CMD_TYPE_SET:
		/* save cmd */
		mmdvfs_update_cmd(cmd);
		cmd->ret = mmdvfs_set_step(cmd->scen,
		mmdvfs_query(cmd->scen, cmd));
		break;

	case MTK_MMDVFS_CMD_TYPE_QUERY: { /* query with some parameters */
		if (mmdvfs_get_lcd_resolution() == MMDVFS_LCD_SIZE_FHD) {
			/* QUERY ALWAYS HIGH for FHD */
			cmd->ret = (unsigned int)MMDVFS_STEP_HIGH2HIGH;

		} else { /* FHD */
			mmdvfs_voltage_enum query_voltage = mmdvfs_query(cmd->scen, cmd);

			mmdvfs_voltage_enum current_voltage =	mmdvfs_get_current_step();

			if (current_voltage < query_voltage) {
				cmd->ret = (unsigned int)MMDVFS_STEP_LOW2HIGH;
			} else if (current_voltage > query_voltage) {
				cmd->ret = (unsigned int)MMDVFS_STEP_HIGH2LOW;
			} else {
				cmd->ret
				= (unsigned int)(query_voltage
				== MMDVFS_VOLTAGE_HIGH
							 ? MMDVFS_STEP_HIGH2HIGH
							 : MMDVFS_STEP_LOW2LOW);
			}
		}

		MMDVFSMSG("query %d\n", cmd->ret);
		/* cmd->ret = (unsigned int)query_voltage; */
		break;
	}

	default:
		MMDVFSMSG("invalid mmdvfs cmd\n");
		BUG();
		break;
	}
}
void mmdvfs_notify_scenario_enter(MTK_SMI_BWC_SCEN scen)
{
#if !MMDVFS_ENABLE
	return;
#endif

	MMDVFSMSG("enter %d\n", scen);

	/* ISP ON = high */
	switch (scen) {
#if defined(SMI_D2)         /* d2 sensor > 6M */
	case SMI_BWC_SCEN_VR:
	mmdvfs_set_step(scen, mmdvfs_query(scen, NULL));
	break;
	case SMI_BWC_SCEN_VR_SLOW:
#elif defined(SMI_D1)       /* default VR high */
	case SMI_BWC_SCEN_VR:
	case SMI_BWC_SCEN_VR_SLOW:
#else               /* D3 */
	case SMI_BWC_SCEN_WFD:
	case SMI_BWC_SCEN_VSS:
#endif
		/* Fall through */
	case SMI_BWC_SCEN_ICFP:
		/* Fall through */
	case SMI_BWC_SCEN_FORCE_MMDVFS:
		mmdvfs_set_step(scen, MMDVFS_VOLTAGE_HIGH);
		break;

	default:
		break;
	}
}
void mmdvfs_notify_scenario_enter(MTK_SMI_BWC_SCEN scen)
{
#if !MMDVFS_ENABLE
	return;
#endif

	MMDVFSMSG("enter %d\n", scen);

	if (mmdvfs_get_lcd_resolution() == MMDVFS_LCD_SIZE_WQHD) {
	#if MMDVFS_ENABLE_WQHD
		if (scen == SMI_BWC_SCEN_VP) {
			mmdvfs_start_gpu_monitor(&g_mmdvfs_mgr->gpu_monitor);
		}
	#endif /* MMDVFS_ENABLE_WQHD */
	} else {	/* FHD */
		switch (scen) {
			case SMI_BWC_SCEN_ICFP:
				mmdvfs_set_step(scen, MMDVFS_VOLTAGE_HIGH);
				break;

			case SMI_BWC_SCEN_VR:
			case SMI_BWC_SCEN_VR_SLOW:		
				mmdvfs_set_step(scen, mmdvfs_query(scen, NULL));
				/* workaround for ICFP...its mmdvfs_set() will come after leaving ICFP */
				mmdvfs_set_step(SMI_BWC_SCEN_ICFP, mmdvfs_get_default_step());
				break;
				
			default:
				break;
		}
	}	
}
//-----------------------------------------------------------------------------
RES_MGR_DRV_CONTROL_ENUM
ResMgrDrvImp::
queryCtrlType()
{
    Mutex::Autolock lock(mLock);
    //
    LOG_MSG("+");
    if( mBwcParams.profileType == BWCPT_NONE ||
        mBwcParams.sensorSize == 0 ||
        mBwcParams.sensorFps == 0)
    {
        LOG_MSG("profileType(%d),sensorSize(%d),sensorFps(%d)",
                mBwcParams.profileType,
                mBwcParams.sensorSize,
                mBwcParams.sensorFps);
        return RES_MGR_DRV_CONTROL_BEFORE;
    }
    //
    #if 1
    mBwcParams.step = mmdvfs_query(
                            mBwcParams.profileType,
                            MMDVFS_SENSOR_SIZE,         mBwcParams.sensorSize,
                            MMDVFS_SENSOR_FPS,          mBwcParams.sensorFps,
                            MMDVFS_PARAMETER_EOF);
    #endif
    LOG_MSG("step(%d),profileType(%d),sensorSize(%d),sensorFps(%d)",
            mBwcParams.step,
            mBwcParams.profileType,
            mBwcParams.sensorSize,
            mBwcParams.sensorFps);
    //
    if(mBwcParams.step == MMDVFS_STEP_HIGH2LOW)
    {
        return RES_MGR_DRV_CONTROL_AFTER;
    }
    else
    {
        return RES_MGR_DRV_CONTROL_BEFORE;
    }
}