| 
					
				 | 
			
			
				@@ -635,3 +635,188 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * pwrdm_set_mem_retst - set memory power state while powerdomain in RET 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * RETENTION state.  Bank will be a number from 0 to 3, and represents 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * different types of memory, depending on the powerdomain.  @pwrst 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 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 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_retst(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_ret[bank] & (1 << pwrst))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pr_debug("powerdomain: %s: setting next memory powerstate for bank %0x while pwrdm-RET to %0x\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 pwrdm->name, bank, pwrst); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_retst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = arch_pwrdm->pwrdm_set_mem_retst(pwrdm, bank, pwrst); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * pwrdm_read_logic_pwrst - get current powerdomain logic retention power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @pwrdm: struct powerdomain * to get current logic retention power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Return the power state that the logic portion of powerdomain @pwrdm 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * will enter when the powerdomain enters retention.  Returns -EINVAL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * if the powerdomain pointer is null or returns the logic retention 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * power state upon success. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ret = -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (arch_pwrdm && arch_pwrdm->pwrdm_read_logic_pwrst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = arch_pwrdm->pwrdm_read_logic_pwrst(pwrdm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * pwrdm_read_prev_logic_pwrst - get previous powerdomain logic power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @pwrdm: struct powerdomain * to get previous logic power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Return the powerdomain @pwrdm's previous logic power state.  Returns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * -EINVAL if the powerdomain pointer is null or returns the previous 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * logic power state upon success. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ret = -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_logic_pwrst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = arch_pwrdm->pwrdm_read_prev_logic_pwrst(pwrdm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * pwrdm_read_logic_retst - get next powerdomain logic power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @pwrdm: struct powerdomain * to get next logic power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Return the powerdomain pwrdm's logic power state.  Returns -EINVAL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * if the powerdomain pointer is null or returns the next logic 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * power state upon success. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int pwrdm_read_logic_retst(struct powerdomain *pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ret = -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (arch_pwrdm && arch_pwrdm->pwrdm_read_logic_retst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = arch_pwrdm->pwrdm_read_logic_retst(pwrdm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * pwrdm_read_mem_pwrst - get current memory bank power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @pwrdm: struct powerdomain * to get current memory bank power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @bank: memory bank number (0-3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Return the powerdomain @pwrdm's current memory power state for bank 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @bank.  Returns -EINVAL if the powerdomain pointer is null, -EEXIST if 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * the target memory bank does not exist or is not controllable, or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * returns the current memory power state upon success. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ret = -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (pwrdm->banks < (bank + 1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		bank = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (arch_pwrdm && arch_pwrdm->pwrdm_read_mem_pwrst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = arch_pwrdm->pwrdm_read_mem_pwrst(pwrdm, bank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * pwrdm_read_prev_mem_pwrst - get previous memory bank power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @pwrdm: struct powerdomain * to get previous memory bank power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @bank: memory bank number (0-3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Return the powerdomain @pwrdm's previous memory power state for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * bank @bank.  Returns -EINVAL if the powerdomain pointer is null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * -EEXIST if the target memory bank does not exist or is not 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * controllable, or returns the previous memory power state upon 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * success. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ret = -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (pwrdm->banks < (bank + 1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		bank = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (arch_pwrdm && arch_pwrdm->pwrdm_read_prev_mem_pwrst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = arch_pwrdm->pwrdm_read_prev_mem_pwrst(pwrdm, bank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * pwrdm_read_mem_retst - get next memory bank power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @pwrdm: struct powerdomain * to get mext memory bank power state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @bank: memory bank number (0-3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Return the powerdomain pwrdm's next memory power state for bank 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * x.  Returns -EINVAL if the powerdomain pointer is null, -EEXIST if 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * the target memory bank does not exist or is not controllable, or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * returns the next memory power state upon success. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ret = -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!pwrdm) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (pwrdm->banks < (bank + 1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (arch_pwrdm && arch_pwrdm->pwrdm_read_mem_retst) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret = arch_pwrdm->pwrdm_read_mem_retst(pwrdm, bank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |