rcpm = dev_get_drvdata(dev); if (!rcpm) return -EINVAL;
base = rcpm->ippdexpcr_base;
idx = wakeup_sources_read_lock();
/* Begin with first registered wakeup source */
for_each_wakeup_source(ws) {
/* skip object which is not attached to device */ if (!ws->dev || !ws->dev->parent) continue;
ret = device_property_read_u32_array(ws->dev->parent, "fsl,rcpm-wakeup", value,
rcpm->wakeup_cells + 1);
if (ret) continue;
/* *ForDTmode,wouldhandledeviceswith"fsl,rcpm-wakeup" *pointingtothecurrentRCPMnode. * *ForACPImode,currentlyweassumethereisonlyone *RCPMcontrollerexisting.
*/ if (is_of_node(dev->fwnode)) if (np->phandle != value[0]) continue;
/* Property "#fsl,rcpm-wakeup-cells" of rcpm node defines the *numberofIPPDEXPCRregistercells,and"fsl,rcpm-wakeup" *ofwakeupsourceIPcontainsanintegerarray:<phandleto *RCPMnode,IPPDEXPCR0setting,IPPDEXPCR1setting, *IPPDEXPCR2setting,etc>. * *Sowewillgothoughtthemtocollectsettingdata.
*/ for (i = 0; i < rcpm->wakeup_cells; i++)
setting[i] |= value[i + 1];
}
wakeup_sources_read_unlock(idx);
/* Program all IPPDEXPCRn once */ for (i = 0; i < rcpm->wakeup_cells; i++) {
u32 tmp = setting[i]; void __iomem *address = base + i * 4;
if (!tmp) continue;
/* We can only OR related bits */ if (rcpm->little_endian) {
tmp |= ioread32(address);
iowrite32(tmp, address);
} else {
tmp |= ioread32be(address);
iowrite32be(tmp, address);
} /* *WorkaroundoferrataA-008646onSoCLS1021A: *Thereisabugofregisterippdexpcr1. *ReadingconfigurationregisterRCPM_IPPDEXPCR1 *alwaysreturnzero.Sosaveippdexpcr1'svalue *toregisterSCFG_SPARECR8.Andthevalueof *ippdexpcr1willbereadfromSCFG_SPARECR8.
*/ if (dev_of_node(dev) && (i == 1)) if (of_device_is_compatible(np, "fsl,ls1021a-rcpm"))
copy_ippdexpcr1_setting(tmp);
}
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.