staticstruct { void __iomem *iomem; int bit;
} apmu_cpus[NR_CPUS];
#define WUPCR_OFFS 0x10 /* Wake Up Control Register */ #define PSTR_OFFS 0x40 /* Power Status Register */ #define CPUNCR_OFFS(n) (0x100 + (0x10 * (n))) /* CPUn Power Status Control Register */ #define DBGRCR_OFFS 0x180 /* Debug Resource Reset Control Reg. */
/* Power Status Register */ #define CPUNST(r, n) (((r) >> (n * 4)) & 3) /* CPUn Status Bit */ #define CPUST_RUN 0 /* Run Mode */ #define CPUST_STANDBY 3 /* CoreStandby Mode */
/* Debug Resource Reset Control Register */ #define DBGCPUREN BIT(24) /* CPU Other Reset Request Enable */ #define DBGCPUNREN(n) BIT((n) + 20) /* CPUn Reset Request Enable */ #define DBGCPUPREN BIT(19) /* CPU Peripheral Reset Req. Enable */
staticint __maybe_unused apmu_power_on(void __iomem *p, int bit)
{ /* request power on */
writel_relaxed(BIT(bit), p + WUPCR_OFFS);
/* wait for APMU to finish */ while (readl_relaxed(p + WUPCR_OFFS) != 0)
;
return 0;
}
staticint __maybe_unused apmu_power_off(void __iomem *p, int bit)
{ /* request Core Standby for next WFI */
writel_relaxed(3, p + CPUNCR_OFFS(bit)); return 0;
}
staticint __maybe_unused apmu_power_off_poll(void __iomem *p, int bit)
{ int k;
for (k = 0; k < 1000; k++) { if (CPUNST(readl_relaxed(p + PSTR_OFFS), bit) == CPUST_STANDBY) return 1;
mdelay(1);
}
return 0;
}
staticint __maybe_unused apmu_wrap(int cpu, int (*fn)(void __iomem *p, int cpu))
{ void __iomem *p = apmu_cpus[cpu].iomem;
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.