|  | @@ -533,3 +533,105 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	int ret = -EINVAL;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	if (!pwrdm)
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (pwrdm->pwrsts == PWRSTS_ON)
 | 
	
		
			
				|  |  | +		return PWRDM_POWER_ON;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (arch_pwrdm && arch_pwrdm->pwrdm_read_pwrst)
 | 
	
		
			
				|  |  | +		ret = arch_pwrdm->pwrdm_read_pwrst(pwrdm);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return ret;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * pwrdm_read_prev_pwrst - get previous powerdomain power state
 | 
	
		
			
				|  |  | + * @pwrdm: struct powerdomain * to get previous power state
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Return the powerdomain @pwrdm's previous power state.  Returns -EINVAL
 | 
	
		
			
				|  |  | + * if the powerdomain pointer is null or returns the previous power state
 | 
	
		
			
				|  |  | + * upon success.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	int ret = -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!pwrdm)
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_pwrst)
 | 
	
		
			
				|  |  | +		ret = arch_pwrdm->pwrdm_read_prev_pwrst(pwrdm);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return ret;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * pwrdm_set_logic_retst - set powerdomain logic power state upon retention
 | 
	
		
			
				|  |  | + * @pwrdm: struct powerdomain * to set
 | 
	
		
			
				|  |  | + * @pwrst: one of the PWRDM_POWER_* macros
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Set the next power state @pwrst that the logic portion of the
 | 
	
		
			
				|  |  | + * powerdomain @pwrdm will enter when the powerdomain enters retention.
 | 
	
		
			
				|  |  | + * This will be either RETENTION or OFF, if supported.  Returns
 | 
	
		
			
				|  |  | + * -EINVAL if the powerdomain pointer is null or the target power
 | 
	
		
			
				|  |  | + * state is not not supported, or returns 0 upon success.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	int ret = -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!pwrdm)
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!(pwrdm->pwrsts_logic_ret & (1 << pwrst)))
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pr_debug("powerdomain: %s: setting next logic powerstate to %0x\n",
 | 
	
		
			
				|  |  | +		 pwrdm->name, pwrst);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (arch_pwrdm && arch_pwrdm->pwrdm_set_logic_retst)
 | 
	
		
			
				|  |  | +		ret = arch_pwrdm->pwrdm_set_logic_retst(pwrdm, pwrst);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return ret;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * pwrdm_set_mem_onst - set memory power state while powerdomain ON
 | 
	
		
			
				|  |  | + * @pwrdm: struct powerdomain * to set
 | 
	
		
			
				|  |  | + * @bank: memory bank number to set (0-3)
 | 
	
		
			
				|  |  | + * @pwrst: one of the PWRDM_POWER_* macros
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Set the next power state @pwrst that memory bank @bank of the
 | 
	
		
			
				|  |  | + * powerdomain @pwrdm will enter when the powerdomain enters the ON
 | 
	
		
			
				|  |  | + * state.  @bank will be a number from 0 to 3, and represents different
 | 
	
		
			
				|  |  | + * types of memory, depending on the powerdomain.  Returns -EINVAL if
 | 
	
		
			
				|  |  | + * the powerdomain pointer is null or the target power state is not
 | 
	
		
			
				|  |  | + * not supported for this memory bank, -EEXIST if the target memory
 | 
	
		
			
				|  |  | + * bank does not exist or is not controllable, or returns 0 upon
 | 
	
		
			
				|  |  | + * success.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	int ret = -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!pwrdm)
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (pwrdm->banks < (bank + 1))
 | 
	
		
			
				|  |  | +		return -EEXIST;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!(pwrdm->pwrsts_mem_on[bank] & (1 << pwrst)))
 | 
	
		
			
				|  |  | +		return -EINVAL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pr_debug("powerdomain: %s: setting next memory powerstate for bank %0x while pwrdm-ON to %0x\n",
 | 
	
		
			
				|  |  | +		 pwrdm->name, bank, pwrst);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_onst)
 | 
	
		
			
				|  |  | +		ret = arch_pwrdm->pwrdm_set_mem_onst(pwrdm, bank, pwrst);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return ret;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * pwrdm_set_mem_retst - set memory power state while powerdomain in RET
 |