/* 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;
}
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.30Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-12)
¤
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.
Diese beiden folgenden Angebotsgruppen bietet das Unternehmen
Angebot
Hier finden Sie eine Liste der Produkte des Unternehmens