/** * psc_get_domain_num() - Get the domain number * @mod_num: LPSC module number */ u32 psc_get_domain_num(u32 mod_num) { u32 domain_num; /* Get the power domain associated with the module number */ domain_num = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCFG(mod_num)); domain_num = PSC_REG_MDCFG_GET_PD(domain_num); return domain_num; }
u32 psc_get_domain_num(u32 mod_num) { u32 domain_num; /* Get the power domain associated with the module number */ domain_num = DEVICE_REG32_R(DEVICE_PSC_BASE + PSC_REG_MDCFG(mod_num)); domain_num = PSC_REG_MDCFG_GET_PD(domain_num); return domain_num; }
/* * FUNCTION PURPOSE: Power up/down a module * * DESCRIPTION: Powers up/down the requested module and the associated power * domain if required. No action is taken it the module is * already powered up/down. * * This only controls modules. The domain in which the module * resides will be left in the power on state. Multiple modules * can exist in a power domain, so powering down the domain based * on a single module is not done. * * Returns 0 on success, -1 if the module can't be powered up, or * if there is a timeout waiting for the transition. */ int psc_set_state(u32 mod_num, u32 state) { u32 domain_num; u32 pdctl; u32 mdctl; u32 ptcmd; u32 reset_iso; u32 v; /* * Get the power domain associated with the module number, and reset * isolation functionality */ v = DEVICE_REG32_R(DEVICE_PSC_BASE + PSC_REG_MDCFG(mod_num)); domain_num = PSC_REG_MDCFG_GET_PD(v); reset_iso = PSC_REG_MDCFG_GET_RESET_ISO(v); /* Wait for the status of the domain/module to be non-transitional */ if (psc_wait(domain_num) != 0) return -1; /* * Perform configuration even if the current status matches the * existing state * * Set the next state of the power domain to on. It's OK if the domain * is always on. This code will not ever power down a domain, so no * change is made if the new state is power down. */ if (state == PSC_REG_VAL_MDCTL_NEXT_ON) { pdctl = DEVICE_REG32_R(DEVICE_PSC_BASE + PSC_REG_PDCTL(domain_num)); pdctl = PSC_REG_PDCTL_SET_NEXT(pdctl, PSC_REG_VAL_PDCTL_NEXT_ON); DEVICE_REG32_W(DEVICE_PSC_BASE + PSC_REG_PDCTL(domain_num), pdctl); } /* Set the next state for the module to enabled/disabled */ mdctl = DEVICE_REG32_R(DEVICE_PSC_BASE + PSC_REG_MDCTL(mod_num)); mdctl = PSC_REG_MDCTL_SET_NEXT(mdctl, state); mdctl = PSC_REG_MDCTL_SET_RESET_ISO(mdctl, reset_iso); DEVICE_REG32_W(DEVICE_PSC_BASE + PSC_REG_MDCTL(mod_num), mdctl); /* Trigger the enable */ ptcmd = DEVICE_REG32_R(DEVICE_PSC_BASE + PSC_REG_PTCMD); ptcmd |= (u32)(1<<domain_num); DEVICE_REG32_W(DEVICE_PSC_BASE + PSC_REG_PTCMD, ptcmd); /* Wait on the complete */ return psc_wait(domain_num); }
/* * FUNCTION PURPOSE: Set the reset isolation bit in mdctl * * DESCRIPTION: The reset isolation enable bit is set. The state of the module * is not changed. Returns 0 if the module config showed that * reset isolation is supported. Returns 1 otherwise. This is not * an error, but setting the bit in mdctl has no effect. */ int psc_set_reset_iso(u32 mod_num) { u32 v; u32 mdctl; /* Set the reset isolation bit */ mdctl = DEVICE_REG32_R(DEVICE_PSC_BASE + PSC_REG_MDCTL(mod_num)); mdctl = PSC_REG_MDCTL_SET_RESET_ISO(mdctl, 1); DEVICE_REG32_W(DEVICE_PSC_BASE + PSC_REG_MDCTL(mod_num), mdctl); v = DEVICE_REG32_R(DEVICE_PSC_BASE + PSC_REG_MDCFG(mod_num)); if (PSC_REG_MDCFG_GET_RESET_ISO(v) == 1) return 0; return 1; }
/** * psc_set_reset_iso() - Set the reset isolation bit in mdctl * @mod_num: LPSC module number * * The reset isolation enable bit is set. The state of the module is not * changed. * * Return: 0 if the module config showed that reset isolation is supported. * Returns 1 otherwise. This is not an error, but setting the bit in mdctl * has no effect. */ int psc_set_reset_iso(u32 mod_num) { u32 v; u32 mdctl; /* Set the reset isolation bit */ mdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCTL(mod_num)); mdctl = PSC_REG_MDCTL_SET_RESET_ISO(mdctl, 1); __raw_writel(mdctl, KS2_PSC_BASE + PSC_REG_MDCTL(mod_num)); v = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCFG(mod_num)); if (PSC_REG_MDCFG_GET_RESET_ISO(v) == 1) return 0; return 1; }