|  | @@ -334,3 +334,127 @@ static u32 omap44xx_prm_read_reset_sources(void)
 | 
	
		
			
				|  |  |  	u32 v;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
 | 
	
		
			
				|  |  | +				    OMAP4_RM_RSTST);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	p = omap44xx_prm_reset_src_map;
 | 
	
		
			
				|  |  | +	while (p->reg_shift >= 0 && p->std_shift >= 0) {
 | 
	
		
			
				|  |  | +		if (v & (1 << p->reg_shift))
 | 
	
		
			
				|  |  | +			r |= 1 << p->std_shift;
 | 
	
		
			
				|  |  | +		p++;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return r;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * omap44xx_prm_was_any_context_lost_old - was module hardware context lost?
 | 
	
		
			
				|  |  | + * @part: PRM partition ID (e.g., OMAP4430_PRM_PARTITION)
 | 
	
		
			
				|  |  | + * @inst: PRM instance offset (e.g., OMAP4430_PRM_MPU_INST)
 | 
	
		
			
				|  |  | + * @idx: CONTEXT register offset
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Return 1 if any bits were set in the *_CONTEXT_* register
 | 
	
		
			
				|  |  | + * identified by (@part, @inst, @idx), which means that some context
 | 
	
		
			
				|  |  | + * was lost for that module; otherwise, return 0.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +static bool omap44xx_prm_was_any_context_lost_old(u8 part, s16 inst, u16 idx)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	return (omap4_prminst_read_inst_reg(part, inst, idx)) ? 1 : 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * omap44xx_prm_clear_context_lost_flags_old - clear context loss flags
 | 
	
		
			
				|  |  | + * @part: PRM partition ID (e.g., OMAP4430_PRM_PARTITION)
 | 
	
		
			
				|  |  | + * @inst: PRM instance offset (e.g., OMAP4430_PRM_MPU_INST)
 | 
	
		
			
				|  |  | + * @idx: CONTEXT register offset
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Clear hardware context loss bits for the module identified by
 | 
	
		
			
				|  |  | + * (@part, @inst, @idx).  No return value.  XXX Writes to reserved bits;
 | 
	
		
			
				|  |  | + * is there a way to avoid this?
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +static void omap44xx_prm_clear_context_loss_flags_old(u8 part, s16 inst,
 | 
	
		
			
				|  |  | +						      u16 idx)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	omap4_prminst_write_inst_reg(0xffffffff, part, inst, idx);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Powerdomain low-level functions */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int omap4_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	omap4_prminst_rmw_inst_reg_bits(OMAP_POWERSTATE_MASK,
 | 
	
		
			
				|  |  | +					(pwrst << OMAP_POWERSTATE_SHIFT),
 | 
	
		
			
				|  |  | +					pwrdm->prcm_partition,
 | 
	
		
			
				|  |  | +					pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int omap4_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 v;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs,
 | 
	
		
			
				|  |  | +					OMAP4_PM_PWSTCTRL);
 | 
	
		
			
				|  |  | +	v &= OMAP_POWERSTATE_MASK;
 | 
	
		
			
				|  |  | +	v >>= OMAP_POWERSTATE_SHIFT;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return v;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int omap4_pwrdm_read_pwrst(struct powerdomain *pwrdm)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 v;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs,
 | 
	
		
			
				|  |  | +					OMAP4_PM_PWSTST);
 | 
	
		
			
				|  |  | +	v &= OMAP_POWERSTATEST_MASK;
 | 
	
		
			
				|  |  | +	v >>= OMAP_POWERSTATEST_SHIFT;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return v;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 v;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs,
 | 
	
		
			
				|  |  | +					OMAP4_PM_PWSTST);
 | 
	
		
			
				|  |  | +	v &= OMAP4430_LASTPOWERSTATEENTERED_MASK;
 | 
	
		
			
				|  |  | +	v >>= OMAP4430_LASTPOWERSTATEENTERED_SHIFT;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return v;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int omap4_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	omap4_prminst_rmw_inst_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK,
 | 
	
		
			
				|  |  | +					(1 << OMAP4430_LOWPOWERSTATECHANGE_SHIFT),
 | 
	
		
			
				|  |  | +					pwrdm->prcm_partition,
 | 
	
		
			
				|  |  | +					pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int omap4_pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	omap4_prminst_rmw_inst_reg_bits(OMAP4430_LASTPOWERSTATEENTERED_MASK,
 | 
	
		
			
				|  |  | +					OMAP4430_LASTPOWERSTATEENTERED_MASK,
 | 
	
		
			
				|  |  | +					pwrdm->prcm_partition,
 | 
	
		
			
				|  |  | +					pwrdm->prcm_offs, OMAP4_PM_PWSTST);
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 v;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	v = pwrst << __ffs(OMAP4430_LOGICRETSTATE_MASK);
 | 
	
		
			
				|  |  | +	omap4_prminst_rmw_inst_reg_bits(OMAP4430_LOGICRETSTATE_MASK, v,
 | 
	
		
			
				|  |  | +					pwrdm->prcm_partition, pwrdm->prcm_offs,
 | 
	
		
			
				|  |  | +					OMAP4_PM_PWSTCTRL);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int omap4_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,
 | 
	
		
			
				|  |  | +				    u8 pwrst)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u32 m;
 |