示例#1
0
文件: pm_cpuidle.c 项目: mozyg/kernel
/* Correct target state based on inactivity timer expiry, etc */
static void adjust_target_states(struct system_power_state *target_state)
{
	switch (target_state->mpu_state) {
	case PRCM_MPU_ACTIVE:
	case PRCM_MPU_INACTIVE:
		target_state->neon_state = PRCM_ON;
		break;
	case PRCM_MPU_CSWR_L2RET:
	case PRCM_MPU_OSWR_L2RET:
	case PRCM_MPU_CSWR_L2OFF:
	case PRCM_MPU_OSWR_L2OFF:
		target_state->neon_state = PRCM_RET;
		break;
	case PRCM_MPU_OFF:
		target_state->neon_state = PRCM_OFF;
		if (!enable_off) {
			target_state->mpu_state  = PRCM_MPU_CSWR_L2RET;
			target_state->neon_state = PRCM_RET;
		}
		break;
	}


	if (target_state->core_state > PRCM_CORE_INACTIVE) {
#ifdef CONFIG_OMAP34XX_OFFMODE
#if 0
/* GPT context save in PER domain not yet implemented. Until it is, we do not
 * put PER to OFF.
 */
		/* Core can be put to RET/OFF - This means PER can be put to
		 * off if its inactivity timer has expired.
		 */
		if (perdomain_timer_pending())
			target_state->per_state = PRCM_RET;
		else
			target_state->per_state = PRCM_OFF;
#else
		target_state->per_state = PRCM_RET;
#endif

		if (target_state->core_state == PRCM_CORE_OFF) {
			if (coredomain_timer_pending())
				target_state->core_state = PRCM_CORE_CSWR_MEMRET;
			if (CM_FCLKEN_DSS & DSS_FCLK_MASK)
				target_state->core_state = PRCM_CORE_CSWR_MEMRET;
			if (!enable_off) {
				target_state->core_state = PRCM_CORE_CSWR_MEMRET;
				target_state->per_state  = PRCM_RET;
			}
		}
#else
		target_state->per_state = PRCM_RET;
#endif
	} else
		target_state->per_state = PRCM_ON;

	if (target_state->core_state == PRCM_CORE_CSWR_MEMRET)
		memory_logic_res_setting(target_state);
}
/* Correct target state based on inactivity timer expiry, etc */
static void correct_target_state(void)
{
	switch (target_state.mpu_state) {
	case PRCM_MPU_ACTIVE:
	case PRCM_MPU_INACTIVE:
		target_state.neon_state = PRCM_ON;
		break;
	case PRCM_MPU_CSWR_L2RET:
	case PRCM_MPU_OSWR_L2RET:
	case PRCM_MPU_CSWR_L2OFF:
	case PRCM_MPU_OSWR_L2OFF:
		target_state.neon_state = PRCM_RET;
		break;
	case PRCM_MPU_OFF:
		target_state.neon_state = PRCM_OFF;
		if (!enable_off) {
			target_state.mpu_state = PRCM_MPU_CSWR_L2RET;
			target_state.neon_state = PRCM_RET;
		}
		break;
	}

	if (target_state.core_state > PRCM_CORE_INACTIVE) {
#ifdef CONFIG_OMAP34XX_OFFMODE
		/* Core can be put to RET/OFF - This means
		 * PER can be put to off if its inactivity timer
		 * has expired
		 */
		if (perdomain_timer_pending())
			target_state.per_state = PRCM_RET;
		else
			target_state.per_state = PRCM_OFF;

		if (target_state.core_state == PRCM_CORE_OFF) {
			if (coredomain_timer_pending())
				target_state.core_state = PRCM_CORE_CSWR_MEMRET;
			if (CM_FCLKEN_DSS & DSS_FCLK_MASK)
				target_state.core_state = PRCM_CORE_CSWR_MEMRET;
			if (!enable_off) {
				target_state.core_state = PRCM_CORE_CSWR_MEMRET;
				target_state.per_state = PRCM_RET;
			}
		}
#else
		target_state.per_state = PRCM_RET;
#endif /* #ifdef CONFIG_OMAP34XX_OFFMODE */
	} else
		target_state.per_state = PRCM_ON;
}