/* Only AM43XX can lose pwrdm context during rtc-ddr suspend */ if (soc_is_am43xx()) {
nb.notifier_call = cpu_notifier;
cpu_pm_register_notifier(&nb);
}
for (i = 0; i < PWRDM_MAX_CLKDMS; i++) { if (!pwrdm->pwrdm_clkdms[i]) break; #ifdef DEBUG if (pwrdm->pwrdm_clkdms[i] == clkdm) {
ret = -EINVAL; goto pac_exit;
} #endif
}
if (i == PWRDM_MAX_CLKDMS) {
pr_debug("powerdomain: %s: increase PWRDM_MAX_CLKDMS for clkdm %s\n",
pwrdm->name, clkdm->name);
WARN_ON(1);
ret = -ENOMEM; goto pac_exit;
}
pwrdm->pwrdm_clkdms[i] = clkdm;
ret = 0;
pac_exit: return ret;
}
/** *pwrdm_get_mem_bank_count-getnumberofmemorybanksinthispowerdomain *@pwrdm:structpowerdomain* * *Returnthenumberofcontrollablememorybanksinpowerdomain@pwrdm, *startingwith1.Returns-EINVALifthepowerdomainpointerisnull.
*/ int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm)
{ if (!pwrdm) return -EINVAL;
return pwrdm->banks;
}
/** *pwrdm_set_next_pwrst-setnextpowerdomainpowerstate *@pwrdm:structpowerdomain*toset *@pwrst:oneofthePWRDM_POWER_*macros * *Setthepowerdomain@pwrdm'snextpowerstateto@pwrst.Thepowerdomain *maynotenterthisstateimmediatelyifthepreconditionsforthisstate *havenotbeensatisfied.Returns-EINVALifthepowerdomainpointeris *nullorifthepowerstateisinvalidforthepowerdomain,orreturns0 *uponsuccess.
*/ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
{ int ret = -EINVAL;
if (!pwrdm) return -EINVAL;
if (!(pwrdm->pwrsts & (1 << pwrst))) return -EINVAL;
pr_debug("powerdomain: %s: setting next powerstate to %0x\n",
pwrdm->name, pwrst);
if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) { /* Trace the pwrdm desired target state */
trace_power_domain_target(pwrdm->name, pwrst,
raw_smp_processor_id()); /* Program the pwrdm desired target state */
ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
}
return ret;
}
/** *pwrdm_read_next_pwrst-getnextpowerdomainpowerstate *@pwrdm:structpowerdomain*togetpowerstate * *Returnthepowerdomain@pwrdm'snextpowerstate.Returns-EINVAL *ifthepowerdomainpointerisnullorreturnsthenextpowerstate *uponsuccess.
*/ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
{ int ret = -EINVAL;
if (!pwrdm) return -EINVAL;
if (arch_pwrdm && arch_pwrdm->pwrdm_read_next_pwrst)
ret = arch_pwrdm->pwrdm_read_next_pwrst(pwrdm);
return ret;
}
/** *pwrdm_read_pwrst-getcurrentpowerdomainpowerstate *@pwrdm:structpowerdomain*togetpowerstate * *Returnthepowerdomain@pwrdm'scurrentpowerstate.Returns-EINVAL *ifthepowerdomainpointerisnullorreturnsthecurrentpowerstate *uponsuccess.NotethatifthepowerdomainonlysupportstheONstate *thenjustreturnONasthecurrentstate.
*/ 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-getpreviouspowerdomainpowerstate *@pwrdm:structpowerdomain*togetpreviouspowerstate * *Returnthepowerdomain@pwrdm'spreviouspowerstate.Returns-EINVAL *ifthepowerdomainpointerisnullorreturnsthepreviouspowerstate *uponsuccess.
*/ 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-setpowerdomainlogicpowerstateuponretention *@pwrdm:structpowerdomain*toset *@pwrst:oneofthePWRDM_POWER_*macros * *Setthenextpowerstate@pwrstthatthelogicportionofthe *powerdomain@pwrdmwillenterwhenthepowerdomainentersretention. *ThiswillbeeitherRETENTIONorOFF,ifsupported.Returns *-EINVALifthepowerdomainpointerisnullorthetargetpower *stateisnotsupported,orreturns0uponsuccess.
*/ 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-setmemorypowerstatewhilepowerdomainON *@pwrdm:structpowerdomain*toset *@bank:memorybanknumbertoset(0-3) *@pwrst:oneofthePWRDM_POWER_*macros * *Setthenextpowerstate@pwrstthatmemorybank@bankofthe *powerdomain@pwrdmwillenterwhenthepowerdomainenterstheON *state.@bankwillbeanumberfrom0to3,andrepresentsdifferent *typesofmemory,dependingonthepowerdomain.Returns-EINVALif *thepowerdomainpointerisnullorthetargetpowerstateisnot *supportedforthismemorybank,-EEXISTifthetargetmemory *bankdoesnotexistorisnotcontrollable,orreturns0upon *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-setmemorypowerstatewhilepowerdomaininRET *@pwrdm:structpowerdomain*toset *@bank:memorybanknumbertoset(0-3) *@pwrst:oneofthePWRDM_POWER_*macros * *Setthenextpowerstate@pwrstthatmemorybank@bankofthe *powerdomain@pwrdmwillenterwhenthepowerdomainentersthe *RETENTIONstate.Bankwillbeanumberfrom0to3,andrepresents *differenttypesofmemory,dependingonthepowerdomain.@pwrst *willbeeitherRETENTIONorOFF,ifsupported.Returns-EINVALif *thepowerdomainpointerisnullorthetargetpowerstateisnot *supportedforthismemorybank,-EEXISTifthetargetmemory *bankdoesnotexistorisnotcontrollable,orreturns0upon *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-getcurrentpowerdomainlogicretentionpowerstate *@pwrdm:structpowerdomain*togetcurrentlogicretentionpowerstate * *Returnthepowerstatethatthelogicportionofpowerdomain@pwrdm *willenterwhenthepowerdomainentersretention.Returns-EINVAL *ifthepowerdomainpointerisnullorreturnsthelogicretention *powerstateuponsuccess.
*/ 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-getpreviouspowerdomainlogicpowerstate *@pwrdm:structpowerdomain*togetpreviouslogicpowerstate * *Returnthepowerdomain@pwrdm'spreviouslogicpowerstate.Returns *-EINVALifthepowerdomainpointerisnullorreturnstheprevious *logicpowerstateuponsuccess.
*/ 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-getnextpowerdomainlogicpowerstate *@pwrdm:structpowerdomain*togetnextlogicpowerstate * *Returnthepowerdomainpwrdm'slogicpowerstate.Returns-EINVAL *ifthepowerdomainpointerisnullorreturnsthenextlogic *powerstateuponsuccess.
*/ 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-getcurrentmemorybankpowerstate *@pwrdm:structpowerdomain*togetcurrentmemorybankpowerstate *@bank:memorybanknumber(0-3) * *Returnthepowerdomain@pwrdm'scurrentmemorypowerstateforbank *@bank.Returns-EINVALifthepowerdomainpointerisnull,-EEXISTif *thetargetmemorybankdoesnotexistorisnotcontrollable,or *returnsthecurrentmemorypowerstateuponsuccess.
*/ 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-getpreviousmemorybankpowerstate *@pwrdm:structpowerdomain*togetpreviousmemorybankpowerstate *@bank:memorybanknumber(0-3) * *Returnthepowerdomain@pwrdm'spreviousmemorypowerstatefor *bank@bank.Returns-EINVALifthepowerdomainpointerisnull, *-EEXISTifthetargetmemorybankdoesnotexistorisnot *controllable,orreturnsthepreviousmemorypowerstateupon *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-getnextmemorybankpowerstate *@pwrdm:structpowerdomain*togetmextmemorybankpowerstate *@bank:memorybanknumber(0-3) * *Returnthepowerdomainpwrdm'snextmemorypowerstateforbank *x.Returns-EINVALifthepowerdomainpointerisnull,-EEXISTif *thetargetmemorybankdoesnotexistorisnotcontrollable,or *returnsthenextmemorypowerstateuponsuccess.
*/ 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;
}
/** *pwrdm_clear_all_prev_pwrst-clearpreviouspowerstateregisterforapwrdm *@pwrdm:structpowerdomain*toclear * *Clearthepowerdomain'spreviouspowerstateregister@pwrdm. *Clearstheentireregister,includinglogicandmemorybank *previouspowerstates.Returns-EINVALifthepowerdomainpointer *isnull,orreturns0uponsuccess.
*/ int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
{ int ret = -EINVAL;
/* If it is already supported, nothing to search */ if (pwrdm_states & BIT(req_state)) return req_state;
if (!req_state) goto up_search;
/* *So,wedonthaveaexactmatch *Canwegetadeeperpowerstatematch?
*/
new_pwrst = req_state - 1;
found = true; while (!(pwrdm_states & BIT(new_pwrst))) { /* No match even at OFF? Not available */ if (new_pwrst == PWRDM_POWER_OFF) {
found = false; break;
}
new_pwrst--;
}
if (found) goto done;
up_search: /* OK, no deeper ones, can we get a higher match? */
new_pwrst = req_state + 1; while (!(pwrdm_states & BIT(new_pwrst))) { if (new_pwrst > PWRDM_POWER_ON) {
WARN(1, "powerdomain: %s: Fix max powerstate to ON\n",
pwrdm->name); return PWRDM_POWER_ON;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.