diff --git a/components/power/los_pm.c b/components/power/los_pm.c index 4ebb1d3a1e4926e1d0e145074ddbaa8f15e4ebd4..3f4f6d1819d6a0219f67c66775cfbd6960fcb1fd 100644 --- a/components/power/los_pm.c +++ b/components/power/los_pm.c @@ -42,7 +42,6 @@ #define OS_PM_SYS_EARLY 1 #define OS_PM_SYS_DEVICE_EARLY 2 -typedef UINT32 (*SysSuspend)(VOID); typedef UINT32 (*Suspend)(UINT32 mode); typedef struct { @@ -70,9 +69,24 @@ typedef struct { #define PM_EVENT_LOCK_RELEASE 0x1 STATIC EVENT_CB_S g_pmEvent; STATIC LosPmCB g_pmCB; -STATIC LosPmSysctrl *g_sysctrl = NULL; +STATIC LosPmSysctrl g_sysctrl; STATIC UINT64 g_pmSleepTime; +STATIC VOID OsPmSysctrlInit(VOID) +{ + /* Default handler functions, which are implemented by the product */ + g_sysctrl.early = NULL; + g_sysctrl.late = NULL; + g_sysctrl.normalSuspend = HalEnterSleep; + g_sysctrl.normalResume = NULL; + g_sysctrl.lightSuspend = HalEnterSleep; + g_sysctrl.lightResume = NULL; + g_sysctrl.deepSuspend = HalEnterSleep; + g_sysctrl.deepResume = NULL; + g_sysctrl.shutdownSuspend = NULL; + g_sysctrl.shutdownResume = NULL; +} + STATIC VOID OsPmTickTimerStart(LosPmCB *pm) { #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) @@ -147,26 +161,20 @@ STATIC VOID OsPmCpuResume(LosPmCB *pm) } } -STATIC SysSuspend OsPmCpuSuspend(LosPmCB *pm) +STATIC VOID OsPmCpuSuspend(LosPmCB *pm) { - SysSuspend sysSuspend = NULL; - /* cpu enter low power mode */ LOS_ASSERT(pm->sysctrl != NULL); if (pm->sysMode == LOS_SYS_NORMAL_SLEEP) { - sysSuspend = pm->sysctrl->normalSuspend; + pm->sysctrl->normalSuspend(); } else if (pm->sysMode == LOS_SYS_LIGHT_SLEEP) { - sysSuspend = pm->sysctrl->lightSuspend; + pm->sysctrl->lightSuspend(); } else if (pm->sysMode == LOS_SYS_DEEP_SLEEP) { - sysSuspend = pm->sysctrl->deepSuspend; + pm->sysctrl->deepSuspend(); } else { - sysSuspend = pm->sysctrl->shutdownSuspend; + pm->sysctrl->shutdownSuspend(); } - - LOS_ASSERT(sysSuspend != NULL); - - return sysSuspend; } STATIC VOID OsPmResumePrepare(LosPmCB *pm, UINT32 mode, UINT32 prepare) @@ -230,7 +238,6 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm) LOS_SysSleepEnum mode; UINT32 prepare = 0; BOOL tickTimerStop = FALSE; - SysSuspend sysSuspend; UINT64 currTime; ret = OsPmSuspendCheck(pm, &sysSuspendEarly, &deviceSuspend, &mode); @@ -258,14 +265,7 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm) OsSchedUpdateExpireTime(currTime, TRUE); } - sysSuspend = OsPmCpuSuspend(pm); - LOS_IntRestore(intSave); - - if (!pm->isWake) { - ret = sysSuspend(); - } - - intSave = LOS_IntLock(); + OsPmCpuSuspend(pm); OsPmCpuResume(pm); @@ -284,16 +284,13 @@ STATIC VOID OsPmNormalSleep(VOID) { UINT32 intSave; LosPmCB *pm = &g_pmCB; - SysSuspend sysSuspend = NULL; intSave = LOS_IntLock(); - sysSuspend = OsPmCpuSuspend(pm); - LOS_IntRestore(intSave); - (VOID)sysSuspend(); + OsPmCpuSuspend(pm); - intSave = LOS_IntLock(); OsPmCpuResume(pm); + LOS_IntRestore(intSave); } @@ -338,16 +335,38 @@ STATIC UINT32 OsPmTickTimerRegister(LosPmCB *pm, LosPmTickTimer *tickTimer) STATIC UINT32 OsPmSysctrlRegister(LosPmCB *pm, LosPmSysctrl *sysctrl) { - UINT32 intSave; - - if (sysctrl->normalSuspend == NULL) { - return LOS_ERRNO_PM_INVALID_PARAM; + UINT32 intSave = LOS_IntLock(); + if (sysctrl->early != NULL) { + pm->sysctrl->early = sysctrl->early; + } + if (sysctrl->late != NULL) { + pm->sysctrl->late = sysctrl->late; + } + if (sysctrl->normalSuspend != NULL) { + pm->sysctrl->normalSuspend = sysctrl->normalSuspend; + } + if (sysctrl->normalResume != NULL) { + pm->sysctrl->normalResume = sysctrl->normalResume; + } + if (sysctrl->lightSuspend != NULL) { + pm->sysctrl->lightSuspend = sysctrl->lightSuspend; + } + if (sysctrl->lightResume != NULL) { + pm->sysctrl->lightResume = sysctrl->lightResume; + } + if (sysctrl->deepSuspend != NULL) { + pm->sysctrl->deepSuspend = sysctrl->deepSuspend; + } + if (sysctrl->deepResume != NULL) { + pm->sysctrl->deepResume = sysctrl->deepResume; + } + if (sysctrl->shutdownSuspend != NULL) { + pm->sysctrl->shutdownSuspend = sysctrl->shutdownSuspend; + } + if (sysctrl->shutdownResume != NULL) { + pm->sysctrl->shutdownResume = sysctrl->shutdownResume; } - - intSave = LOS_IntLock(); - pm->sysctrl = sysctrl; LOS_IntRestore(intSave); - return LOS_OK; } @@ -409,27 +428,13 @@ STATIC UINT32 OsPmTickTimerUnregister(LosPmCB *pm, LosPmTickTimer *tickTimer) STATIC UINT32 OsPmSysctrlUnregister(LosPmCB *pm, LosPmSysctrl *sysctrl) { - UINT32 intSave; - VOID *freeNode = NULL; - - intSave = LOS_IntLock(); - if (pm->sysctrl == sysctrl) { - if (pm->sysctrl == g_sysctrl) { - freeNode = (VOID *)pm->sysctrl; - g_sysctrl = NULL; - } - - pm->sysctrl = NULL; - LOS_IntRestore(intSave); - - if (freeNode != NULL) { - (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, freeNode); - } - return LOS_OK; - } + (VOID)sysctrl; + UINT32 intSave = LOS_IntLock(); + OsPmSysctrlInit(); + pm->pmMode = LOS_SYS_NORMAL_SLEEP; LOS_IntRestore(intSave); - return LOS_ERRNO_PM_INVALID_NODE; + return LOS_OK; } UINT32 LOS_PmUnregister(LOS_PmNodeType type, VOID *node) @@ -756,20 +761,8 @@ UINT32 OsPmInit(VOID) return ret; } - g_sysctrl = (LosPmSysctrl *)LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, sizeof(LosPmSysctrl)); - if (g_sysctrl == NULL) { - return LOS_NOK; - } - - (VOID)memset_s(g_sysctrl, sizeof(LosPmSysctrl), 0, sizeof(LosPmSysctrl)); - g_sysctrl->normalSuspend = HalEnterSleep; - - ret = LOS_PmRegister(LOS_PM_TYPE_SYSCTRL, (VOID *)g_sysctrl); - if (ret != LOS_OK) { - (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, g_sysctrl); - g_sysctrl = NULL; - } - + OsPmSysctrlInit(); + pm->sysctrl = &g_sysctrl; return ret; } #endif diff --git a/testsuites/sample/kernel/power/It_los_pm_001.c b/testsuites/sample/kernel/power/It_los_pm_001.c index 81ff4667b8c118324ef2ccb1d79056b1792f2558..af41046026a4a42e218f6450e7e8c32abee5e58b 100644 --- a/testsuites/sample/kernel/power/It_los_pm_001.c +++ b/testsuites/sample/kernel/power/It_los_pm_001.c @@ -152,8 +152,8 @@ static UINT32 TestCase(VOID) ret = LOS_PmUnregister(LOS_PM_TYPE_TICK_TIMER, &g_tickTimer); ICUNIT_ASSERT_EQUAL(ret, LOS_OK, ret); - ret = LOS_PmRegister(LOS_PM_TYPE_SYSCTRL, &g_sysctrl); - ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_PM_INVALID_PARAM, ret); + ret = LOS_PmUnregister(LOS_PM_TYPE_SYSCTRL, &g_sysctrl); + ICUNIT_ASSERT_EQUAL(ret, LOS_OK, ret); ret = LOS_PmUnregister(LOS_PM_TYPE_DEVICE, &g_device1); ICUNIT_ASSERT_EQUAL(ret, LOS_OK, ret);