#ifdef CONFIG_SUSPEND staticint omap4_pm_suspend(void)
{ struct power_state *pwrst; int state, ret = 0;
u32 cpu_id = smp_processor_id();
/* Save current powerdomain state */
list_for_each_entry(pwrst, &pwrst_list, node) {
pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm);
pwrst->saved_logic_state = pwrdm_read_logic_retst(pwrst->pwrdm);
}
/* Set targeted power domain states by suspend */
list_for_each_entry(pwrst, &pwrst_list, node) {
omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state);
pwrdm_set_logic_retst(pwrst->pwrdm, pwrst->next_logic_state);
}
/* Restore next powerdomain state */
list_for_each_entry(pwrst, &pwrst_list, node) {
state = pwrdm_read_prev_pwrst(pwrst->pwrdm); if (state > pwrst->next_state) {
pr_info("Powerdomain (%s) didn't enter target state %d\n",
pwrst->pwrdm->name, pwrst->next_state);
ret = -1;
}
omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
pwrdm_set_logic_retst(pwrst->pwrdm, pwrst->saved_logic_state);
} if (ret) {
pr_crit("Could not enter target state in pm_suspend\n"); /* *OMAP4chipPMcurrentlyworksonlywithcertain(newer) *versionsofbootloaders.Thisisduetomissingcodeinthe *kerneltoproperlyresetandinitializesomedevices. *Warntheuseraboutthebootloaderversionbeingoneofthe *possiblecauses. *http://www.spinics.net/lists/arm-kernel/msg218641.html
*/
pr_debug("A possible cause could be an old bootloader - try u-boot >= v2012.07\n");
} else {
pr_info("Successfully put all powerdomains to target state\n");
}
while (map->from) {
from = clkdm_lookup(map->from);
to = clkdm_lookup(map->to); if (!from || !to) {
pr_err("Failed lookup %s or %s for wakeup dependency\n",
map->from, map->to); return -EINVAL;
}
ret = clkdm_add_wkdep(from, to); if (ret) {
pr_err("Failed to add %s -> %s wakeup dependency(%d)\n",
map->from, map->to, ret); return ret;
}
map++;
}
return0;
}
/** *omap4_pm_init_early-DoesearlyinitializationnecessaryforOMAP4+devices * *Initializesbasicstuffforpowermanagementfunctionality.
*/ int __init omap4_pm_init_early(void)
{ if (cpu_is_omap446x())
pm44xx_errata |= PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD;
if (soc_is_omap54xx() || soc_is_dra7xx())
pm44xx_errata |= PM_OMAP4_CPU_OSWR_DISABLE;
return0;
}
/** *omap4_pm_init-InitroutineforOMAP4+devices * *Initializesallpowerdomainandclockdomaintargetstates *andallPRCMsettings. *Return:Returnstheerrorcodereturnedbycalledfunctions.
*/ int __init omap4_pm_init(void)
{ int ret = 0;
if (omap_rev() == OMAP4430_REV_ES1_0) {
WARN(1, "Power Management not supported on OMAP4430 ES1.0\n"); return -ENODEV;
}
pr_info("Power Management for TI OMAP4+ devices.\n");
/* *OMAP4chipPMcurrentlyworksonlywithcertain(newer) *versionsofbootloaders.Thisisduetomissingcodeinthe *kerneltoproperlyresetandinitializesomedevices. *http://www.spinics.net/lists/arm-kernel/msg218641.html
*/ if (cpu_is_omap44xx())
pr_debug("OMAP4 PM: u-boot >= v2012.07 is required for full PM support\n");
ret = pwrdm_for_each(pwrdms_setup, NULL); if (ret) {
pr_err("Failed to setup powerdomains.\n"); goto err2;
}
if (cpu_is_omap44xx())
ret = omap4plus_init_static_deps(omap4_static_dep_map); elseif (soc_is_omap54xx() || soc_is_dra7xx())
ret = omap4plus_init_static_deps(omap5_dra7_static_dep_map);
if (ret) {
pr_err("Failed to initialise static dependencies.\n"); goto err2;
}
ret = omap4_mpuss_init(); if (ret) {
pr_err("Failed to initialise OMAP4 MPUSS\n"); goto err2;
}
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.