1 /***************************************************************************//**
2 * \file cy_syspm_v3.c
3 * \version 5.150
4 *
5 * This driver provides the source code for API power management.
6 *
7 ********************************************************************************
8 * \copyright
9 * Copyright (c) (2016-2023), Cypress Semiconductor Corporation (an Infineon company) or
10 * an affiliate of Cypress Semiconductor Corporation.
11 * SPDX-License-Identifier: Apache-2.0
12 *
13 * Licensed under the Apache License, Version 2.0 (the "License");
14 * you may not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 *     http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS,
21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
24 *******************************************************************************/
25 
26 #include "cy_device.h"
27 #include "cy_sysclk.h"
28 
29 #if defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION >= 2)
30 
31 #include "cy_syspm.h"
32 
33 /*******************************************************************************
34 *       Internal Functions
35 *******************************************************************************/
36 
37 /*******************************************************************************
38 *       Internal Defines
39 *******************************************************************************/
40 
41 /* The define for number of callback roots */
42 #define CALLBACK_ROOT_NR                (5U)
43 
44 /* The mask to unlock the Hibernate power mode */
45 #define HIBERNATE_UNLOCK_VAL                 ((uint32_t) 0x3Au << SRSS_PWR_HIBERNATE_UNLOCK_Pos)
46 
47 /* The mask to set the Hibernate power mode */
48 #define SET_HIBERNATE_MODE                   ((HIBERNATE_UNLOCK_VAL |\
49                                                SRSS_PWR_HIBERNATE_FREEZE_Msk |\
50                                                SRSS_PWR_HIBERNATE_HIBERNATE_Msk))
51 
52 /* The mask to retain the Hibernate power mode status */
53 #define HIBERNATE_RETAIN_STATUS_MASK         ((SRSS_PWR_HIBERNATE_TOKEN_Msk |\
54                                                SRSS_PWR_HIBERNATE_MASK_HIBALARM_Msk |\
55                                                SRSS_PWR_HIBERNATE_MASK_HIBWDT_Msk |\
56                                                SRSS_PWR_HIBERNATE_POLARITY_HIBPIN_Msk |\
57                                                SRSS_PWR_HIBERNATE_MASK_HIBPIN_Msk))
58 
59 /** The mask for the Hibernate wakeup sources */
60 #if defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION == 3u) && defined (CY_IP_MXS40SRSS_VERSION_MINOR) && (CY_IP_MXS40SRSS_VERSION_MINOR >= 3u)
61 /** The mask for the Hibernate wakeup sources, for SRSSv3p3 and above */
62 #define HIBERNATE_WAKEUP_MASK               ((SRSS_PWR_HIB_WAKE_CTL_HIB_WAKE_SRC_Msk |\
63                                               SRSS_PWR_HIB_WAKE_CTL_HIB_WAKE_CSV_BAK_Msk |\
64                                               SRSS_PWR_HIB_WAKE_CTL_HIB_WAKE_RTC_Msk |\
65                                               SRSS_PWR_HIB_WAKE_CTL_HIB_WAKE_WDT_Msk))
66 #else
67 /** The mask for the Hibernate wakeup sources */
68 #define HIBERNATE_WAKEUP_MASK               ((SRSS_PWR_HIBERNATE_MASK_HIBALARM_Msk |\
69                                               SRSS_PWR_HIBERNATE_MASK_HIBWDT_Msk |\
70                                               SRSS_PWR_HIBERNATE_POLARITY_HIBPIN_Msk |\
71                                               SRSS_PWR_HIBERNATE_MASK_HIBPIN_Msk))
72 #endif
73 
74 /** The define to update the token to indicate the transition into Hibernate */
75 #define HIBERNATE_TOKEN                    ((uint32_t) 0x1BU << SRSS_PWR_HIBERNATE_TOKEN_Pos)
76 
77 /* The wait time for transition into the minimum regulator current mode
78 */
79 #define SET_MIN_CURRENT_MODE_DELAY_US        (1U)
80 
81 /* The wait delay time that occurs before the active reference is settled.
82 *  Intermediate delay is used in transition into the normal regulator current
83 *  mode
84 */
85 #define ACT_REF_SETTLE_DELAY_US              (6U)
86 
87 /* The wait delay time that occurs after the active reference is settled.
88 *  Final delay is used in transition into the normal regulator current mode
89 */
90 #define SET_NORMAL_CURRENT_MODE_DELAY_US     (1U)
91 
92 /* The internal define of the tries number in the
93 * Cy_SysPm_SystemSetMinRegulatorCurrent() function
94 */
95 #define WAIT_DELAY_TRIES                (100U)
96 
97 /* The internal define of the tries number in the
98 * Cy_Syspm_ReghcConfigure(), Cy_Syspm_ReghcDeConfigure() functions
99 */
100 #define REGHC_WAIT_DELAY_TRIES_US        (20U)
101 
102 
103 /* The internal define of the tries number in the
104 * Cy_SysPm_SystemSetMinRegulatorCurrent() function
105 */
106 #define CY_SYSPM_CBUCK_BUSY_RETRY_COUNT         (100U)
107 #define CY_SYSPM_CBUCK_BUSY_RETRY_DELAY_MS      (1U)
108 
109 /* Mask for checking the CM4 Deep Sleep status */
110 #define CM4_DEEPSLEEP_MASK     (CPUSS_CM4_STATUS_SLEEPING_Msk | CPUSS_CM4_STATUS_SLEEPDEEP_Msk)
111 
112 
113 /*******************************************************************************
114 *       Internal Variables
115 *******************************************************************************/
116 
117 /* Array of the callback roots */
118 static cy_stc_syspm_callback_t* pmCallbackRoot[CALLBACK_ROOT_NR] = {(void *)0, (void *)0, (void *)0, (void *)0, (void *)0};
119 
120 /* The array of the pointers to failed callback */
121 static cy_stc_syspm_callback_t* failedCallback[CALLBACK_ROOT_NR] = {(void *)0, (void *)0, (void *)0, (void *)0, (void *)0};
122 
Cy_SysPm_CpuEnterSleep(cy_en_syspm_waitfor_t waitFor)123 cy_en_syspm_status_t Cy_SysPm_CpuEnterSleep(cy_en_syspm_waitfor_t waitFor)
124 {
125     uint32_t interruptState;
126     uint32_t cbSleepRootIdx = (uint32_t) CY_SYSPM_SLEEP;
127     cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS;
128 
129     CY_ASSERT_L3(CY_SYSPM_IS_WAIT_FOR_VALID(waitFor));
130 
131     /* Call registered callback functions with CY_SYSPM_CHECK_READY parameter */
132     if (pmCallbackRoot[cbSleepRootIdx] != NULL)
133     {
134         retVal = Cy_SysPm_ExecuteCallback(CY_SYSPM_SLEEP, CY_SYSPM_CHECK_READY);
135     }
136 
137     /* The CPU can switch into the Sleep power mode only when
138     *  all executed registered callback functions with the CY_SYSPM_CHECK_READY
139     *  parameter return CY_SYSPM_SUCCESS.
140     */
141     if(retVal == CY_SYSPM_SUCCESS)
142     {
143         /* Call the registered callback functions with
144         * CY_SYSPM_BEFORE_TRANSITION parameter
145         */
146         interruptState = Cy_SysLib_EnterCriticalSection();
147         if (pmCallbackRoot[cbSleepRootIdx] != NULL)
148         {
149             (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_SLEEP, CY_SYSPM_BEFORE_TRANSITION);
150         }
151 
152         /* The CPU enters the Sleep power mode upon execution of WFI/WFE */
153         SCB_SCR &= (uint32_t) ~SCB_SCR_SLEEPDEEP_Msk;
154 
155         if(waitFor != CY_SYSPM_WAIT_FOR_EVENT)
156         {
157             __WFI();
158         }
159         else
160         {
161             __WFE();
162         }
163         Cy_SysLib_ExitCriticalSection(interruptState);
164 
165         /* Call the registered callback functions with the
166         *  CY_SYSPM_AFTER_TRANSITION parameter
167         */
168         if (pmCallbackRoot[cbSleepRootIdx] != NULL)
169         {
170             (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_SLEEP, CY_SYSPM_AFTER_TRANSITION);
171         }
172     }
173     else
174     {
175         /* Execute callback functions with the CY_SYSPM_CHECK_FAIL parameter to
176         *  undo everything done in the callback with the CY_SYSPM_CHECK_READY
177         *  parameter
178         */
179         (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_SLEEP, CY_SYSPM_CHECK_FAIL);
180         retVal = CY_SYSPM_FAIL;
181     }
182     return retVal;
183 }
184 
Cy_SysPm_SystemLpActiveEnter(void)185 cy_en_syspm_status_t Cy_SysPm_SystemLpActiveEnter(void)
186 {
187     uint32_t interruptState;
188     uint32_t cbSleepRootIdx = (uint32_t)CY_SYSPM_LPACTIVE_ENTER;
189     cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS;
190 
191     /* Step-1: Wait until PWR_CTL.LPM_READY==1 to indicate low power circuits are ready. */
192     if(!Cy_SysPm_IsLpmReady())
193     {
194         retVal = CY_SYSPM_FAIL;
195     }
196     else
197     {
198         /* Call registered callback functions with CY_SYSPM_CHECK_READY parameter */
199         if (pmCallbackRoot[cbSleepRootIdx] != NULL)
200         {
201             retVal = Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbSleepRootIdx, CY_SYSPM_CHECK_READY);
202         }
203 
204         if (retVal == CY_SYSPM_SUCCESS)
205         {
206             /* The CPU can switch into the LPACTIVE power mode only when
207             *  all executed registered callback functions with the CY_SYSPM_CHECK_READY
208             *  parameter return CY_SYSPM_SUCCESS.
209             */
210             /* Call the registered callback functions with
211             * CY_SYSPM_BEFORE_TRANSITION parameter
212             */
213             interruptState = Cy_SysLib_EnterCriticalSection();
214             if (pmCallbackRoot[cbSleepRootIdx] != NULL)
215             {
216                 (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbSleepRootIdx, CY_SYSPM_BEFORE_TRANSITION); /* Suppress a compiler warning about unused return value */
217             }
218 
219             /* Configure the low-power operating mode for Linear Core regulator */
220             if(Cy_SysPm_LdoIsEnabled())
221             {
222                 SRSS_PWR_CTL2 |= _VAL2FLD(SRSS_PWR_CTL2_BGREF_LPMODE, 1u);
223             }
224 
225             /* This wait time allows the circuits to remove their dependence on
226             *  the Active mode circuits, such as Active Reference
227             */
228             Cy_SysLib_DelayUs(CY_SYSPM_ACTIVE_TO_LP_WAIT_US);
229 
230             Cy_SysLib_ExitCriticalSection(interruptState);
231 
232             /* Call the registered callback functions with the
233             *  CY_SYSPM_AFTER_TRANSITION parameter
234             */
235             if (pmCallbackRoot[cbSleepRootIdx] != NULL)
236             {
237                 (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbSleepRootIdx, CY_SYSPM_AFTER_TRANSITION); /* Suppress a compiler warning about unused return value */
238             }
239         }
240         else
241         {
242             /* Execute callback functions with the CY_SYSPM_CHECK_FAIL parameter to
243             *  undo everything done in the callback with the CY_SYSPM_CHECK_READY
244             *  parameter
245             */
246             (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbSleepRootIdx, CY_SYSPM_CHECK_FAIL); /* Suppress a compiler warning about unused return value */
247             retVal = CY_SYSPM_FAIL;
248         }
249     }
250     return retVal;
251 }
252 
Cy_SysPm_SystemLpActiveExit(void)253 cy_en_syspm_status_t Cy_SysPm_SystemLpActiveExit(void)
254 {
255     uint32_t interruptState;
256     uint32_t cbSleepRootIdx = (uint32_t)CY_SYSPM_LPACTIVE_EXIT;
257     cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS;
258 
259     /* Call registered callback functions with CY_SYSPM_CHECK_READY parameter */
260     if (pmCallbackRoot[cbSleepRootIdx] != NULL)
261     {
262         retVal = Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbSleepRootIdx, CY_SYSPM_CHECK_READY);
263     }
264 
265     if (retVal == CY_SYSPM_SUCCESS)
266     {
267         /* The CPU can switch into the LPACTIVE power mode only when
268         *  all executed registered callback functions with the CY_SYSPM_CHECK_READY
269         *  parameter return CY_SYSPM_SUCCESS.
270         */
271         /* Call the registered callback functions with
272         * CY_SYSPM_BEFORE_TRANSITION parameter
273         */
274         interruptState = Cy_SysLib_EnterCriticalSection();
275         if (pmCallbackRoot[cbSleepRootIdx] != NULL)
276         {
277             (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbSleepRootIdx, CY_SYSPM_BEFORE_TRANSITION); /* Suppress a compiler warning about unused return value */
278         }
279 
280         /* This wait time allows setting Active Reference */
281         Cy_SysLib_DelayUs(CY_SYSPM_LP_TO_ACTIVE_WAIT_BEFORE_US);
282 
283         /* Configure the normal operation mode */
284         SRSS_PWR_CTL2 &= ((uint32_t) (~SRSS_PWR_CTL2_BGREF_LPMODE_Msk));
285 
286         /* This wait time allows setting Active Reference */
287         Cy_SysLib_DelayUs(CY_SYSPM_LP_TO_ACTIVE_WAIT_AFTER_US);
288 
289         Cy_SysLib_ExitCriticalSection(interruptState);
290 
291         /* Call the registered callback functions with the
292         *  CY_SYSPM_AFTER_TRANSITION parameter
293         */
294         if (pmCallbackRoot[cbSleepRootIdx] != NULL)
295         {
296             (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbSleepRootIdx, CY_SYSPM_AFTER_TRANSITION); /* Suppress a compiler warning about unused return value */
297         }
298     }
299     else
300     {
301         /* Execute callback functions with the CY_SYSPM_CHECK_FAIL parameter to
302         *  undo everything done in the callback with the CY_SYSPM_CHECK_READY
303         *  parameter
304         */
305         (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbSleepRootIdx, CY_SYSPM_CHECK_FAIL); /* Suppress a compiler warning about unused return value */
306         retVal = CY_SYSPM_FAIL;
307     }
308     return retVal;
309 }
310 
Cy_SysPm_IsSystemLpActiveEnabled(void)311 bool Cy_SysPm_IsSystemLpActiveEnabled(void)
312 {
313     return (_FLD2BOOL(SRSS_PWR_CTL2_BGREF_LPMODE, SRSS_PWR_CTL2)? true : false);
314 }
315 
Cy_SysPm_CpuEnterDeepSleep(cy_en_syspm_waitfor_t waitFor)316 cy_en_syspm_status_t Cy_SysPm_CpuEnterDeepSleep(cy_en_syspm_waitfor_t waitFor)
317 {
318     uint32_t interruptState;
319     uint32_t cbDeepSleepRootIdx = (uint32_t) CY_SYSPM_DEEPSLEEP;
320     cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS;
321 
322     CY_ASSERT_L3(CY_SYSPM_IS_WAIT_FOR_VALID(waitFor));
323 
324     //Check if LPM is ready
325     if(!Cy_SysPm_IsLpmReady())
326     {
327         retVal = CY_SYSPM_FAIL;
328     }
329     else
330     {
331         /* Call the registered callback functions with the CY_SYSPM_CHECK_READY
332         *  parameter
333         */
334         if (pmCallbackRoot[cbDeepSleepRootIdx] != NULL)
335         {
336             retVal = Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbDeepSleepRootIdx, CY_SYSPM_CHECK_READY);
337         }
338 
339         /* The CPU can switch into the Deep Sleep power mode only when
340         *  all executed registered callback functions with the CY_SYSPM_CHECK_READY
341         *  parameter return CY_SYSPM_SUCCESS
342         */
343         if (retVal == CY_SYSPM_SUCCESS)
344         {
345             /* Call the registered callback functions with the
346             * CY_SYSPM_BEFORE_TRANSITION parameter
347             */
348             interruptState = Cy_SysLib_EnterCriticalSection();
349             if (pmCallbackRoot[cbDeepSleepRootIdx] != NULL)
350             {
351                 (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbDeepSleepRootIdx, CY_SYSPM_BEFORE_TRANSITION);
352             }
353                 /* The CPU enters Deep Sleep mode upon execution of WFI/WFE
354                  * use Cy_SysPm_SetDeepSleepMode to set various deepsleep modes TBD*/
355                 SCB_SCR |= SCB_SCR_SLEEPDEEP_Msk;
356 
357                 if(waitFor != CY_SYSPM_WAIT_FOR_EVENT)
358                 {
359                     __WFI();
360                 }
361                 else
362                 {
363                     __WFE();
364                 }
365 
366             Cy_SysLib_ExitCriticalSection(interruptState);
367         }
368         if (retVal == CY_SYSPM_SUCCESS)
369         {
370             /* Call the registered callback functions with the CY_SYSPM_AFTER_TRANSITION
371             *  parameter
372             */
373             if (pmCallbackRoot[cbDeepSleepRootIdx] != NULL)
374             {
375                 (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbDeepSleepRootIdx, CY_SYSPM_AFTER_TRANSITION);
376             }
377         }
378         else
379         {
380             /* Execute callback functions with the CY_SYSPM_CHECK_FAIL parameter to
381             *  undo everything done in the callback with the CY_SYSPM_CHECK_READY
382             *  parameter
383             */
384             if (pmCallbackRoot[cbDeepSleepRootIdx] != NULL)
385             {
386                 (void) Cy_SysPm_ExecuteCallback((cy_en_syspm_callback_type_t)cbDeepSleepRootIdx, CY_SYSPM_CHECK_FAIL);
387             }
388         }
389     }
390     return retVal;
391 }
392 
Cy_SysPm_SystemEnterHibernate(void)393 cy_en_syspm_status_t Cy_SysPm_SystemEnterHibernate(void)
394 {
395     cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS;
396     uint32_t cbHibernateRootIdx = (uint32_t) CY_SYSPM_HIBERNATE;
397     /* Call the registered callback functions with the
398     * CY_SYSPM_CHECK_READY parameter
399     */
400     if (pmCallbackRoot[cbHibernateRootIdx] != NULL)
401     {
402         retVal = Cy_SysPm_ExecuteCallback(CY_SYSPM_HIBERNATE, CY_SYSPM_CHECK_READY);
403     }
404 
405     /* The system can switch into Hibernate power mode only when
406     *  all executed registered callback functions with CY_SYSPM_CHECK_READY
407     *  parameter return CY_SYSPM_SUCCESS.
408     */
409     if(retVal == CY_SYSPM_SUCCESS)
410     {
411         /* Call registered callback functions with CY_SYSPM_BEFORE_TRANSITION
412         *  parameter
413         */
414         (void) Cy_SysLib_EnterCriticalSection();
415         if (pmCallbackRoot[cbHibernateRootIdx] != NULL)
416         {
417             (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_HIBERNATE, CY_SYSPM_BEFORE_TRANSITION);
418         }
419 
420         /* Preserve the token that will be retained through a wakeup sequence.
421          * This could be used by Cy_SysLib_GetResetReason() to differentiate
422          * Wakeup from a general reset event.
423          * Preserve the wakeup source(s) configuration.
424          */
425         SRSS_PWR_HIBERNATE = (SRSS_PWR_HIBERNATE & HIBERNATE_WAKEUP_MASK) | HIBERNATE_TOKEN;
426 
427 #if defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION == 3u) && defined (CY_IP_MXS40SRSS_VERSION_MINOR) && (CY_IP_MXS40SRSS_VERSION_MINOR >= 3u)
428         /* Clear Previous Wakeup Reasons */
429         Cy_SysPm_ClearHibernateWakeupCause();
430 #endif
431 
432         /* Disable overriding by the peripherals the next pin-freeze command */
433         SRSS_PWR_HIBERNATE |= SET_HIBERNATE_MODE;
434 
435         /* The second write causes freezing of I/O cells to save the I/O-cell state */
436         SRSS_PWR_HIBERNATE |= SET_HIBERNATE_MODE;
437 
438         /* Third write cause system to enter Hibernate */
439         SRSS_PWR_HIBERNATE |= SET_HIBERNATE_MODE;
440 
441         /* Read register to make sure it is settled */
442         (void) SRSS_PWR_HIBERNATE;
443 
444         /* Wait for transition */
445         __WFI();
446 
447         /* The callback function calls with the CY_SYSPM_AFTER_TRANSITION
448         * parameter in the Hibernate power mode are not applicable as system
449         * wake-up was made on system reboot.
450         */
451 
452         /* A wakeup from Hibernate is performed by toggling of the wakeup
453         * pins, or WDT matches, or Backup domain alarm expires. This depends on
454         * what item is configured in the Hibernate register. After a wakeup
455         * event, a normal Boot procedure occurs.
456         * There is no need to exit from the critical section.
457         */
458     }
459     else
460     {
461         /* Execute callback functions with the CY_SYSPM_CHECK_FAIL parameter to
462         * undo everything done in the callback with the CY_SYSPM_CHECK_READY
463         * parameter. The return value should be CY_SYSPM_SUCCESS.
464         */
465         (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_HIBERNATE, CY_SYSPM_CHECK_FAIL);
466         retVal = CY_SYSPM_FAIL;
467     }
468     return retVal;
469 }
470 
Cy_SysPm_SystemSetMinRegulatorCurrent(void)471 cy_en_syspm_status_t Cy_SysPm_SystemSetMinRegulatorCurrent(void)
472 {
473     cy_en_syspm_status_t retVal = CY_SYSPM_CANCELED;
474 
475     /* Check if the power circuits are ready to enter into regulator minimum
476     *  current mode
477     */
478     if (Cy_SysPm_IsLpmReady())
479     {
480         SRSS_PWR_CTL2 |= (SRSS_PWR_CTL2_BGREF_LPMODE_Msk);
481 
482         /* This wait time allows the circuits to remove their dependence on
483         *  the Active mode circuits, such as active Reference
484         */
485         Cy_SysLib_DelayUs(SET_MIN_CURRENT_MODE_DELAY_US);
486 
487         retVal = CY_SYSPM_SUCCESS;
488     }
489 
490     return retVal;
491 }
492 
Cy_SysPm_SystemSetNormalRegulatorCurrent(void)493 cy_en_syspm_status_t Cy_SysPm_SystemSetNormalRegulatorCurrent(void)
494 {
495     cy_en_syspm_status_t retVal = CY_SYSPM_TIMEOUT;
496 
497     /* Disable the low-power for Bandgap reference circuit */
498     SRSS_PWR_CTL2 &= (uint32_t) ~SRSS_PWR_CTL2_BGREF_LPMODE_Msk;
499 
500     /* This wait time allows setting active Reference */
501     Cy_SysLib_DelayUs(ACT_REF_SETTLE_DELAY_US);
502 
503     retVal= CY_SYSPM_SUCCESS;
504 
505     return retVal;
506 }
507 
Cy_SysPm_IsBgRefCtrl(void)508 bool Cy_SysPm_IsBgRefCtrl(void)
509 {
510     return (0U != _FLD2VAL(SRSS_PWR_CTL2_BGREF_LPMODE, SRSS_PWR_CTL2));
511 }
512 
Cy_SysPm_BgRefCtrl(bool enable)513 void Cy_SysPm_BgRefCtrl(bool enable)
514 {
515     if(enable)
516     {
517         SRSS_PWR_CTL2 |= (uint32_t) SRSS_PWR_CTL2_BGREF_LPMODE_Msk;
518     }
519     else
520     {
521         SRSS_PWR_CTL2 &= (uint32_t) ~SRSS_PWR_CTL2_BGREF_LPMODE_Msk;
522     }
523 }
524 
Cy_SysPm_LdoSetMode(cy_en_syspm_ldo_mode_t mode)525 cy_en_syspm_status_t Cy_SysPm_LdoSetMode(cy_en_syspm_ldo_mode_t mode)
526 {
527     CY_ASSERT_L3(CY_SYSPM_IS_LDO_MODE_VALID(mode));
528 
529     cy_en_syspm_status_t retVal = CY_SYSPM_CANCELED;
530 
531     switch (mode)
532     {
533         case CY_SYSPM_LDO_MODE_NORMAL:
534         {
535             retVal = Cy_SysPm_SystemSetNormalRegulatorCurrent();
536         }
537         break;
538 
539         case CY_SYSPM_LDO_MODE_MIN:
540         {
541             retVal = Cy_SysPm_SystemSetMinRegulatorCurrent();
542         }
543         break;
544 
545         case CY_SYSPM_LDO_MODE_DISABLED:
546         {
547             /* Disable the LDO, Deep Sleep, nWell, and Retention regulators */
548             SRSS_PWR_CTL2 |= SRSS_PWR_CTL2_LINREG_DIS_Msk;
549             #if ((defined (SRSS_ULP_VARIANT)) && (SRSS_ULP_VARIANT == 1u))
550             /* Only set this bit if the deep sleep regulator is supported. */
551             SRSS_PWR_CTL2 |= SRSS_PWR_CTL2_DPSLP_REG_DIS_Msk;
552             #endif
553 
554             retVal = CY_SYSPM_SUCCESS;
555         }
556         break;
557 
558         default:
559             retVal = CY_SYSPM_FAIL;
560         break;
561     }
562 
563     return retVal;
564 }
565 
Cy_SysPm_LdoGetMode(void)566 cy_en_syspm_ldo_mode_t Cy_SysPm_LdoGetMode(void)
567 {
568     cy_en_syspm_ldo_mode_t retVal;
569 
570     if (!Cy_SysPm_LdoIsEnabled())
571     {
572         retVal = CY_SYSPM_LDO_MODE_DISABLED;
573     }
574     else if (Cy_SysPm_SystemIsMinRegulatorCurrentSet())
575     {
576         retVal = CY_SYSPM_LDO_MODE_MIN;
577     }
578     else
579     {
580         retVal = CY_SYSPM_LDO_MODE_NORMAL;
581     }
582 
583     return retVal;
584 }
585 
Cy_SysPm_LdoIsEnabled(void)586 bool Cy_SysPm_LdoIsEnabled(void)
587 {
588     return ((0U != _FLD2VAL(SRSS_PWR_CTL2_LINREG_DIS, SRSS_PWR_CTL2)) ? false : true);
589 }
590 
591 
Cy_SysPm_CpuSleepOnExit(bool enable)592 void Cy_SysPm_CpuSleepOnExit(bool enable)
593 {
594     if(enable)
595     {
596         /* Enable sleep-on-exit feature */
597         SCB_SCR |= SCB_SCR_SLEEPONEXIT_Msk;
598     }
599     else
600     {
601         /* Disable sleep-on-exit feature */
602         SCB_SCR &= (uint32_t) ~(SCB_SCR_SLEEPONEXIT_Msk);
603     }
604 }
605 
Cy_SysPm_SetHibernateWakeupSource(uint32_t wakeupSource)606 void Cy_SysPm_SetHibernateWakeupSource(uint32_t wakeupSource)
607 {
608     CY_ASSERT_L3(CY_SYSPM_IS_WAKE_UP_SOURCE_VALID(wakeupSource));
609 
610 #if defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION == 3u) && defined (CY_IP_MXS40SRSS_VERSION_MINOR) && (CY_IP_MXS40SRSS_VERSION_MINOR >= 3u)
611     uint32_t polarityMask = 0U;
612     uint32_t wakeSrcMask = 0U;
613 
614     /* PIN0 */
615     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN0_LOW))
616     {
617         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN0_LOW;
618         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 0)))
619         {
620             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN0_LOW;
621         }
622     }
623 
624     /* PIN1 */
625     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN1_LOW))
626     {
627         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN1_LOW;
628         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 1)))
629         {
630             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN1_LOW;
631         }
632     }
633 
634     /* PIN2 */
635     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN2_LOW))
636     {
637         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN2_LOW;
638         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 2)))
639         {
640             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN2_LOW;
641         }
642     }
643 
644     /* PIN3 */
645     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN3_LOW))
646     {
647         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN3_LOW;
648         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 3)))
649         {
650             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN3_LOW;
651         }
652     }
653 
654     /* PIN4 */
655     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN4_LOW))
656     {
657         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN4_LOW;
658         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 4)))
659         {
660             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN4_LOW;
661         }
662     }
663 
664     /* PIN5 */
665     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN5_LOW))
666     {
667         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN5_LOW;
668         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 5)))
669         {
670             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN5_LOW;
671         }
672     }
673 
674     /* PIN6 */
675     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN6_LOW))
676     {
677         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN6_LOW;
678         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 6)))
679         {
680             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN6_LOW;
681         }
682     }
683 
684     /* PIN7 */
685     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN7_LOW))
686     {
687         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN7_LOW;
688         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 7)))
689         {
690             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN7_LOW;
691         }
692     }
693 
694     /* PIN8 */
695     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN8_LOW))
696     {
697         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN8_LOW;
698         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 8)))
699         {
700             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN8_LOW;
701         }
702     }
703 
704     /* PIN9 */
705     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN9_LOW))
706     {
707         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN9_LOW;
708         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 9)))
709         {
710             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN9_LOW;
711         }
712     }
713 
714     /* CSV_BAK */
715     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_CSV_BAK))
716     {
717         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_CSV_BAK;
718     }
719 
720     /* RTC */
721     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_RTC_ALARM))
722     {
723         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_RTC_ALARM;
724     }
725 
726     /* WDT */
727     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_WDT))
728     {
729         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_WDT;
730     }
731 
732     SRSS_PWR_HIB_WAKE_CTL = (SRSS_PWR_HIB_WAKE_CTL | wakeSrcMask);
733     SRSS_PWR_HIB_WAKE_CTL2 = (SRSS_PWR_HIB_WAKE_CTL2 | polarityMask);
734 
735     /* Read registers to make sure it is settled */
736     (void) SRSS_PWR_HIB_WAKE_CTL;
737     (void) SRSS_PWR_HIB_WAKE_CTL2;
738 #else
739     uint32_t polarityMask = 0U;
740 
741     if (0U != _FLD2VAL(SRSS_PWR_HIBERNATE_POLARITY_HIBPIN, wakeupSource))
742     {
743         /* Reconfigure the wakeup pins and LPComp polarity based on the input */
744         if (0U != (wakeupSource & CY_SYSPM_HIB_WAKEUP_LPCOMP0_MASK))
745         {
746             polarityMask |= CY_SYSPM_HIB_WAKEUP_LPCOMP0_POLARITY_HIGH_MASK;
747         }
748 
749         if (0U != (wakeupSource & CY_SYSPM_HIB_WAKEUP_LPCOMP1_MASK))
750         {
751             polarityMask |= CY_SYSPM_HIB_WAKEUP_LPCOMP1_POLARITY_HIGH_MASK;
752         }
753 
754         if (0U != (wakeupSource & CY_SYSPM_HIB_WAKEUP_PIN0_MASK))
755         {
756             polarityMask |= CY_SYSPM_HIB_WAKEUP_PIN0_POLARITY_HIGH_MASK;
757         }
758 
759         if (0U != (wakeupSource & CY_SYSPM_HIB_WAKEUP_PIN1_MASK))
760         {
761             polarityMask |= CY_SYSPM_HIB_WAKEUP_PIN1_POLARITY_HIGH_MASK;
762         }
763     }
764 
765     SRSS_PWR_HIBERNATE = (SRSS_PWR_HIBERNATE & (uint32_t) ~polarityMask) | wakeupSource;
766 
767     /* Read register to make sure it is settled */
768     (void) SRSS_PWR_HIBERNATE;
769 #endif
770 
771 }
772 
Cy_SysPm_ClearHibernateWakeupSource(uint32_t wakeupSource)773 void Cy_SysPm_ClearHibernateWakeupSource(uint32_t wakeupSource)
774 {
775     CY_ASSERT_L3(CY_SYSPM_IS_WAKE_UP_SOURCE_VALID(wakeupSource));
776 
777 #if defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION == 3u) && defined (CY_IP_MXS40SRSS_VERSION_MINOR) && (CY_IP_MXS40SRSS_VERSION_MINOR >= 3u)
778 
779     uint32_t polarityMask = 0U;
780     uint32_t wakeSrcMask = 0U;
781 
782     /* PIN0 */
783     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN0_LOW))
784     {
785         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN0_LOW;
786         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 0)))
787         {
788             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN0_LOW;
789         }
790     }
791 
792     /* PIN1 */
793     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN1_LOW))
794     {
795         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN1_LOW;
796         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 1)))
797         {
798             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN1_LOW;
799         }
800     }
801 
802     /* PIN2 */
803     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN2_LOW))
804     {
805         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN2_LOW;
806         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 2)))
807         {
808             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN2_LOW;
809         }
810     }
811 
812     /* PIN3 */
813     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN3_LOW))
814     {
815         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN3_LOW;
816         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 3)))
817         {
818             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN3_LOW;
819         }
820     }
821 
822     /* PIN4 */
823     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN4_LOW))
824     {
825         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN4_LOW;
826         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 4)))
827         {
828             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN4_LOW;
829         }
830     }
831 
832     /* PIN5 */
833     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN5_LOW))
834     {
835         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN5_LOW;
836         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 5)))
837         {
838             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN5_LOW;
839         }
840     }
841 
842     /* PIN6 */
843     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN6_LOW))
844     {
845         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN6_LOW;
846         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 6)))
847         {
848             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN6_LOW;
849         }
850     }
851 
852     /* PIN7 */
853     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN7_LOW))
854     {
855         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN7_LOW;
856         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 7)))
857         {
858             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN7_LOW;
859         }
860     }
861 
862     /* PIN8 */
863     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN8_LOW))
864     {
865         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN8_LOW;
866         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 8)))
867         {
868             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN8_LOW;
869         }
870     }
871 
872     /* PIN9 */
873     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_PIN9_LOW))
874     {
875         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN9_LOW;
876         if (0U != (wakeupSource & (CY_SYSPM_HIBERNATE_POLARITY_HIGH_FLAG << 9)))
877         {
878             polarityMask |= (uint32_t)CY_SYSPM_HIBERNATE_PIN9_LOW;
879         }
880     }
881 
882     /* CSV_BAK */
883     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_CSV_BAK))
884     {
885         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_CSV_BAK;
886     }
887 
888     /* RTC */
889     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_RTC_ALARM))
890     {
891         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_RTC_ALARM;
892     }
893 
894     /* WDT */
895     if (0U != (wakeupSource & (uint32_t)CY_SYSPM_HIBERNATE_WDT))
896     {
897         wakeSrcMask |= (uint32_t)CY_SYSPM_HIBERNATE_WDT;
898     }
899 
900     SRSS_PWR_HIB_WAKE_CTL = (SRSS_PWR_HIB_WAKE_CTL & (~wakeSrcMask));
901     SRSS_PWR_HIB_WAKE_CTL2 = (SRSS_PWR_HIB_WAKE_CTL2 & (~polarityMask));
902 
903     /* Read registers to make sure it is settled */
904     (void) SRSS_PWR_HIB_WAKE_CTL;
905     (void) SRSS_PWR_HIB_WAKE_CTL2;
906 #else
907     uint32_t clearWakeupSourceMask = wakeupSource & (uint32_t) ~SRSS_PWR_HIBERNATE_POLARITY_HIBPIN_Msk;
908 
909     if (0U != _FLD2VAL(SRSS_PWR_HIBERNATE_POLARITY_HIBPIN, wakeupSource))
910     {
911         /* Clear the high active level of the requested sources */
912         if ((uint32_t) CY_SYSPM_HIBERNATE_LPCOMP0_HIGH == (wakeupSource & (uint32_t) CY_SYSPM_HIBERNATE_LPCOMP0_HIGH))
913         {
914             clearWakeupSourceMask |= CY_SYSPM_HIB_WAKEUP_LPCOMP0_POLARITY_HIGH_MASK;
915         }
916 
917         if ((uint32_t) CY_SYSPM_HIBERNATE_LPCOMP1_HIGH == (wakeupSource & (uint32_t) CY_SYSPM_HIBERNATE_LPCOMP1_HIGH))
918         {
919             clearWakeupSourceMask |= CY_SYSPM_HIB_WAKEUP_LPCOMP1_POLARITY_HIGH_MASK;
920         }
921 
922         if ((uint32_t) CY_SYSPM_HIBERNATE_PIN0_HIGH == (wakeupSource & (uint32_t) CY_SYSPM_HIBERNATE_PIN0_HIGH))
923         {
924             clearWakeupSourceMask |= CY_SYSPM_HIB_WAKEUP_PIN0_POLARITY_HIGH_MASK;
925         }
926 
927         if ((uint32_t) CY_SYSPM_HIBERNATE_PIN1_HIGH == (wakeupSource & (uint32_t) CY_SYSPM_HIBERNATE_PIN1_HIGH))
928         {
929             clearWakeupSourceMask |= CY_SYSPM_HIB_WAKEUP_PIN1_POLARITY_HIGH_MASK;
930         }
931     }
932 
933     SRSS_PWR_HIBERNATE &= (uint32_t) ~clearWakeupSourceMask;
934 
935     /* Read register to make sure it is settled */
936     (void) SRSS_PWR_HIBERNATE;
937 #endif
938 }
939 
940 #if defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION == 3u) && defined (CY_IP_MXS40SRSS_VERSION_MINOR) && (CY_IP_MXS40SRSS_VERSION_MINOR >= 3u)
941 /* These functions are available for SRSSv3p3 and above. */
Cy_SysPm_GetHibernateWakeupCause(void)942 cy_en_syspm_hibernate_wakeup_source_t Cy_SysPm_GetHibernateWakeupCause(void)
943 {
944     cy_en_syspm_hibernate_wakeup_source_t wakeupSource = CY_SYSPM_HIBERNATE_NO_SRC;
945     uint32_t wakeupCause;
946     uint32_t wakeupCausePolarity;
947 
948     wakeupCause = SRSS_PWR_HIB_WAKE_CAUSE;
949     wakeupCausePolarity = SRSS_PWR_HIB_WAKE_CTL2;
950 
951     if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_CSV_BAK))
952     {
953         wakeupSource = CY_SYSPM_HIBERNATE_CSV_BAK;
954     }
955     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_RTC_ALARM))
956     {
957         wakeupSource = CY_SYSPM_HIBERNATE_RTC_ALARM;
958     }
959     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_WDT))
960     {
961         wakeupSource = CY_SYSPM_HIBERNATE_WDT;
962     }
963     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN0_LOW))
964     {
965         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN0_LOW))
966         {
967             wakeupSource = CY_SYSPM_HIBERNATE_PIN0_HIGH;
968         }
969         else
970         {
971             wakeupSource = CY_SYSPM_HIBERNATE_PIN0_LOW;
972         }
973     }
974     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN1_LOW))
975     {
976         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN1_LOW))
977         {
978             wakeupSource = CY_SYSPM_HIBERNATE_PIN1_HIGH;
979         }
980         else
981         {
982             wakeupSource = CY_SYSPM_HIBERNATE_PIN1_LOW;
983         }
984     }
985     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN2_LOW))
986     {
987         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN2_LOW))
988         {
989             wakeupSource = CY_SYSPM_HIBERNATE_PIN2_HIGH;
990         }
991         else
992         {
993             wakeupSource = CY_SYSPM_HIBERNATE_PIN2_LOW;
994         }
995     }
996     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN3_LOW))
997     {
998         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN3_LOW))
999         {
1000             wakeupSource = CY_SYSPM_HIBERNATE_PIN3_HIGH;
1001         }
1002         else
1003         {
1004             wakeupSource = CY_SYSPM_HIBERNATE_PIN3_LOW;
1005         }
1006     }
1007     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN4_LOW))
1008     {
1009         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN4_LOW))
1010         {
1011             wakeupSource = CY_SYSPM_HIBERNATE_PIN4_HIGH;
1012         }
1013         else
1014         {
1015             wakeupSource = CY_SYSPM_HIBERNATE_PIN4_LOW;
1016         }
1017     }
1018     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN5_LOW))
1019     {
1020         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN5_LOW))
1021         {
1022             wakeupSource = CY_SYSPM_HIBERNATE_PIN5_HIGH;
1023         }
1024         else
1025         {
1026             wakeupSource = CY_SYSPM_HIBERNATE_PIN5_LOW;
1027         }
1028     }
1029     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN6_LOW))
1030     {
1031         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN6_LOW))
1032         {
1033             wakeupSource = CY_SYSPM_HIBERNATE_PIN6_HIGH;
1034         }
1035         else
1036         {
1037             wakeupSource = CY_SYSPM_HIBERNATE_PIN6_LOW;
1038         }
1039     }
1040     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN7_LOW))
1041     {
1042         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN7_LOW))
1043         {
1044             wakeupSource = CY_SYSPM_HIBERNATE_PIN7_HIGH;
1045         }
1046         else
1047         {
1048             wakeupSource = CY_SYSPM_HIBERNATE_PIN7_LOW;
1049         }
1050     }
1051     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN8_LOW))
1052     {
1053         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN8_LOW))
1054         {
1055             wakeupSource = CY_SYSPM_HIBERNATE_PIN8_HIGH;
1056         }
1057         else
1058         {
1059             wakeupSource = CY_SYSPM_HIBERNATE_PIN8_LOW;
1060         }
1061     }
1062     else if (0UL != (wakeupCause & (uint32_t)CY_SYSPM_HIBERNATE_PIN9_LOW))
1063     {
1064         if (0UL != (wakeupCausePolarity & (uint32_t)CY_SYSPM_HIBERNATE_PIN9_LOW))
1065         {
1066             wakeupSource = CY_SYSPM_HIBERNATE_PIN9_HIGH;
1067         }
1068         else
1069         {
1070             wakeupSource = CY_SYSPM_HIBERNATE_PIN9_LOW;
1071         }
1072     }
1073     else
1074     {
1075         /* No wakeup source found */
1076     }
1077 
1078     return wakeupSource;
1079 }
1080 
Cy_SysPm_ClearHibernateWakeupCause(void)1081 void Cy_SysPm_ClearHibernateWakeupCause(void)
1082 {
1083     uint32_t temp = SRSS_PWR_HIB_WAKE_CAUSE;
1084     SRSS_PWR_HIB_WAKE_CAUSE = temp;
1085 }
1086 #endif
1087 
Cy_SysPm_RegisterCallback(cy_stc_syspm_callback_t * handler)1088 bool Cy_SysPm_RegisterCallback(cy_stc_syspm_callback_t* handler)
1089 {
1090     bool retVal = false;
1091 
1092     /* Verify the input parameters. */
1093     if ((handler != NULL) && (handler->callbackParams != NULL) && (handler->callback != NULL))
1094     {
1095         uint32_t callbackRootIdx = (uint32_t) handler->type;
1096 
1097         /* If the callback list is not empty. */
1098         if (pmCallbackRoot[callbackRootIdx] != NULL)
1099         {
1100             cy_stc_syspm_callback_t* curCallback = pmCallbackRoot[callbackRootIdx];
1101             cy_stc_syspm_callback_t* insertPos  = curCallback;
1102 
1103             /* Find the callback after which the new callback is to be
1104              * inserted. Ensure the given callback has not been registered.
1105              */
1106             while ((NULL != curCallback->nextItm) && (curCallback != handler))
1107             {
1108                 curCallback = curCallback->nextItm;
1109                 /* Callbacks with the same order value are stored in the order
1110                  * they are registered.
1111                  */
1112                 if (curCallback->order <= handler->order)
1113                 {
1114                     insertPos = curCallback;
1115                 }
1116             }
1117             /* If the callback has not been registered. */
1118             if (curCallback != handler)
1119             {
1120                 /* If the callback is to be inserted at the beginning of the list. */
1121                 if ((insertPos->prevItm == NULL) && (handler->order < insertPos->order))
1122                 {
1123                     handler->nextItm = insertPos;
1124                     handler->prevItm = NULL;
1125                     handler->nextItm->prevItm = handler;
1126                     pmCallbackRoot[callbackRootIdx] = handler;
1127                 }
1128                 else
1129                 {
1130                     handler->nextItm = insertPos->nextItm;
1131                     handler->prevItm = insertPos;
1132 
1133                     /* If the callback is not inserted at the end of the list. */
1134                     if (handler->nextItm != NULL)
1135                     {
1136                         handler->nextItm->prevItm = handler;
1137                     }
1138                     insertPos->nextItm = handler;
1139                 }
1140                 retVal = true;
1141             }
1142         }
1143         else
1144         {
1145             /* The callback list is empty. */
1146             pmCallbackRoot[callbackRootIdx] = handler;
1147             handler->nextItm = NULL;
1148             handler->prevItm = NULL;
1149             retVal = true;
1150         }
1151     }
1152     return retVal;
1153 }
1154 
Cy_SysPm_UnregisterCallback(cy_stc_syspm_callback_t const * handler)1155 bool Cy_SysPm_UnregisterCallback(cy_stc_syspm_callback_t const *handler)
1156 {
1157     bool retVal = false;
1158 
1159     if (handler != NULL)
1160     {
1161         uint32_t callbackRootIdx = (uint32_t) handler->type;
1162         cy_stc_syspm_callback_t* curCallback = pmCallbackRoot[callbackRootIdx];
1163 
1164         /* Search requested callback item in the linked list */
1165         while (curCallback != NULL)
1166         {
1167             /* Requested callback is found */
1168             if (curCallback == handler)
1169             {
1170                 retVal = true;
1171                 break;
1172             }
1173 
1174             /* Go to next callback item in the linked list */
1175             curCallback = curCallback->nextItm;
1176         }
1177 
1178         if (retVal)
1179         {
1180             /* Requested callback is first in the list */
1181             if (pmCallbackRoot[callbackRootIdx] == handler)
1182             {
1183                 /* Check whether this the only callback registered */
1184                 if (pmCallbackRoot[callbackRootIdx]->nextItm != NULL)
1185                 {
1186                     pmCallbackRoot[callbackRootIdx] = pmCallbackRoot[callbackRootIdx]->nextItm;
1187                     pmCallbackRoot[callbackRootIdx]->prevItm = NULL;
1188                 }
1189                 else
1190                 {
1191                     /* We had only one callback */
1192                     pmCallbackRoot[callbackRootIdx] = NULL;
1193                 }
1194             }
1195             else
1196             {
1197                 /* Update links of related to unregistered callback items */
1198                 curCallback->prevItm->nextItm = curCallback->nextItm;
1199 
1200                 if (curCallback->nextItm != NULL)
1201                 {
1202                     curCallback->nextItm->prevItm = curCallback->prevItm;
1203                 }
1204             }
1205         }
1206     }
1207 
1208     return retVal;
1209 }
1210 
Cy_SysPm_ExecuteCallback(cy_en_syspm_callback_type_t type,cy_en_syspm_callback_mode_t mode)1211 cy_en_syspm_status_t Cy_SysPm_ExecuteCallback(cy_en_syspm_callback_type_t type, cy_en_syspm_callback_mode_t mode)
1212 {
1213     CY_ASSERT_L3(CY_SYSPM_IS_CALLBACK_TYPE_VALID(type));
1214     CY_ASSERT_L3(CY_SYSPM_IS_CALLBACK_MODE_VALID(mode));
1215 
1216     static cy_stc_syspm_callback_t* lastExecutedCallback = NULL;
1217     cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS;
1218     cy_stc_syspm_callback_t* curCallback = pmCallbackRoot[(uint32_t) type];
1219     cy_stc_syspm_callback_params_t curParams;
1220 
1221     if ((mode == CY_SYSPM_BEFORE_TRANSITION) || (mode == CY_SYSPM_CHECK_READY))
1222     {
1223         /* Execute registered callbacks with order from first registered to the
1224         *  last registered. Stop executing if CY_SYSPM_FAIL was returned in
1225         *  CY_SYSPM_CHECK_READY mode
1226         */
1227         while ((curCallback != NULL) && ((retVal != CY_SYSPM_FAIL) || (mode != CY_SYSPM_CHECK_READY)))
1228         {
1229             /* The modes defined in the .skipMode element are not executed */
1230             if (0UL == ((uint32_t) mode & curCallback->skipMode))
1231             {
1232                 /* Update elements for local callback parameter values */
1233                 curParams.base = curCallback->callbackParams->base;
1234                 curParams.context = curCallback->callbackParams->context;
1235 
1236                 retVal = curCallback->callback(&curParams, mode);
1237 
1238                 /* Update callback pointer with value of executed callback.
1239                 * Such update is required to execute further callbacks in
1240                 * backward order after exit from LP mode or to undo
1241                 * configuration after callback returned fail: from last called
1242                 * to first registered.
1243                 */
1244                 lastExecutedCallback = curCallback;
1245             }
1246             curCallback = curCallback->nextItm;
1247         }
1248 
1249         if (mode == CY_SYSPM_CHECK_READY)
1250         {
1251             /* Update the pointer to  the failed callback with the result of the callback execution.
1252             *  If the callback fails, the value of the pointer will be updated
1253             *  with the address of the callback which returned CY_SYSPM_FAIL, else,
1254             *  it will be updated with NULL.
1255             */
1256             if(retVal == CY_SYSPM_FAIL)
1257             {
1258                 failedCallback[(uint32_t) type] = lastExecutedCallback;
1259             }
1260             else
1261             {
1262                 failedCallback[(uint32_t) type] = NULL;
1263             }
1264         }
1265     }
1266     else
1267     {
1268         /* Execute registered callbacks with order from lastCallback or last
1269         * executed to the first registered callback. Such a flow is required if
1270         * a previous callback function returned CY_SYSPM_FAIL or a previous
1271         * callback mode was CY_SYSPM_BEFORE_TRANSITION. Such an order is
1272         * required to undo configurations in correct backward order.
1273         */
1274         if (mode != CY_SYSPM_CHECK_FAIL)
1275         {
1276             while (curCallback->nextItm != NULL)
1277             {
1278                 curCallback = curCallback->nextItm;
1279             }
1280         }
1281         else
1282         {
1283             /* Skip last executed callback that returns CY_SYSPM_FAIL, as this
1284             *  callback already knows that it failed.
1285             */
1286             curCallback = lastExecutedCallback;
1287 
1288             if (curCallback != NULL)
1289             {
1290                 curCallback = curCallback->prevItm;
1291             }
1292         }
1293 
1294         /* Execute callback functions with required type and mode */
1295         while (curCallback != NULL)
1296         {
1297             /* The modes defined in the .skipMode element are not executed */
1298             if (0UL == ((uint32_t) mode & curCallback->skipMode))
1299             {
1300                 /* Update elements for local callback parameter values */
1301                 curParams.base = curCallback->callbackParams->base;
1302                 curParams.context = curCallback->callbackParams->context;
1303 
1304                 retVal = curCallback->callback(&curParams, mode);
1305             }
1306             curCallback = curCallback->prevItm;
1307         }
1308     }
1309 
1310     return retVal;
1311 }
1312 
Cy_SysPm_GetFailedCallback(cy_en_syspm_callback_type_t type)1313 cy_stc_syspm_callback_t* Cy_SysPm_GetFailedCallback(cy_en_syspm_callback_type_t type)
1314 {
1315     return failedCallback[(uint32_t) type];
1316 }
1317 
1318 /*******************************************************************************
1319 * Function Name: Cy_SysPm_IoFreeze
1320 ****************************************************************************//**
1321 *
1322 * Freezes IOs.
1323 *
1324 * Freezes the IO cells directly to save the IO-cell state on a wakeup from the
1325 * Hibernate. Do not call this function before entering the
1326 * Hibernate mode, because Cy_SysPm_Hibernate() function freezes the IO cells.
1327 *
1328 ******************************************************************************/
Cy_SysPm_IoFreeze(void)1329 void Cy_SysPm_IoFreeze(void)
1330 {
1331     uint32_t interruptState;
1332     uint32_t regValue;
1333 
1334     interruptState = Cy_SysLib_EnterCriticalSection();
1335 
1336     /* Check the FREEZE state to avoid a recurrent IO-cells freeze attempt,
1337     * because the second call to this function will cause an accidental switch
1338     * to the hibernate mode (the system will enter the hibernate mode immediately
1339     * after writing to the hibernate bit because both UNLOCK and FREEZE were set
1340     * correctly in the previous call to this function).
1341     */
1342     if(!Cy_SysPm_IoIsFrozen())
1343     {
1344         /* Clear the unlock field for correct freeze of the IO cells */
1345         SRSS_PWR_HIBERNATE = _CLR_SET_FLD32U((SRSS_PWR_HIBERNATE), SRSS_PWR_HIBERNATE_UNLOCK, 0u);
1346 
1347         /* Disable overriding by the peripherals the next pin-freeze command */
1348         SRSS_PWR_HIBERNATE |=  CY_SYSPM_PWR_HIBERNATE_UNLOCK |
1349                                 _VAL2FLD(SRSS_PWR_HIBERNATE_FREEZE, 1u) |
1350                                 _VAL2FLD(SRSS_PWR_HIBERNATE_HIBERNATE, 1u);
1351 
1352         /* If Read is after Write, read this register two times to delay
1353         *  enough time for internal settling.
1354         */
1355         (void) SRSS_PWR_HIBERNATE;
1356         (void) SRSS_PWR_HIBERNATE;
1357 
1358         /* The second Write causes freeze of IO cells to save the IO-cell state */
1359         regValue = SRSS_PWR_HIBERNATE;
1360         SRSS_PWR_HIBERNATE = regValue;
1361     }
1362     Cy_SysLib_ExitCriticalSection(interruptState);
1363 }
1364 
Cy_SysPm_IoUnfreeze(void)1365 void Cy_SysPm_IoUnfreeze(void)
1366 {
1367     uint32_t interruptState;
1368     interruptState = Cy_SysLib_EnterCriticalSection();
1369 
1370     /* Preserve the last reset reason and wakeup polarity. Then, unfreeze I/O:
1371      * write PWR_HIBERNATE.FREEZE=0, .UNLOCK=0x3A, .HIBERANTE=0
1372      */
1373     SRSS_PWR_HIBERNATE = (SRSS_PWR_HIBERNATE & HIBERNATE_RETAIN_STATUS_MASK) | HIBERNATE_UNLOCK_VAL;
1374 
1375     /* Lock the Hibernate mode:
1376     * write PWR_HIBERNATE.HIBERNATE=0, UNLOCK=0x00, HIBERANTE=0
1377     */
1378     SRSS_PWR_HIBERNATE &= HIBERNATE_RETAIN_STATUS_MASK;
1379 
1380     /* Read register to make sure it is settled */
1381     (void) SRSS_PWR_HIBERNATE;
1382 
1383     Cy_SysLib_ExitCriticalSection(interruptState);
1384 }
1385 
Cy_SysPm_IoIsFrozen(void)1386 bool Cy_SysPm_IoIsFrozen(void)
1387 {
1388     return (0U != _FLD2VAL(SRSS_PWR_HIBERNATE_FREEZE, SRSS_PWR_HIBERNATE));
1389 }
1390 
Cy_SysPm_CpuSendWakeupEvent(void)1391 void Cy_SysPm_CpuSendWakeupEvent(void)
1392 {
1393     __SEV();
1394 }
1395 
Cy_SysPm_IsLpmReady(void)1396 bool Cy_SysPm_IsLpmReady(void)
1397 {
1398     return (_FLD2BOOL(SRSS_PWR_CTL_LPM_READY, SRSS_PWR_CTL)? true : false);
1399 }
1400 
Cy_SysPm_BackupSetSupply(cy_en_syspm_vddbackup_control_t vddBackControl)1401 void Cy_SysPm_BackupSetSupply(cy_en_syspm_vddbackup_control_t vddBackControl)
1402 {
1403     CY_UNUSED_PARAMETER(vddBackControl);
1404 
1405 #if (SRSS_BACKUP_VBCK_PRESENT)
1406     CY_ASSERT_L3(CY_SYSPM_IS_VDDBACKUP_VALID(vddBackControl));
1407 
1408     BACKUP_CTL = _CLR_SET_FLD32U((BACKUP_CTL), BACKUP_CTL_VDDBAK_CTL, (uint32_t) vddBackControl);
1409 #endif
1410 }
1411 
1412 
Cy_SysPm_BackupGetSupply(void)1413 cy_en_syspm_vddbackup_control_t Cy_SysPm_BackupGetSupply(void)
1414 {
1415 #if (SRSS_BACKUP_VBCK_PRESENT)
1416     uint32_t retVal;
1417     retVal = _FLD2VAL(BACKUP_CTL_VDDBAK_CTL, BACKUP_CTL);
1418 
1419     return ((cy_en_syspm_vddbackup_control_t) retVal);
1420 #else
1421     return (CY_SYSPM_VDDBACKUP_DEFAULT);
1422 #endif
1423 }
1424 
1425 
Cy_SysPm_BackupEnableVoltageMeasurement(void)1426 void Cy_SysPm_BackupEnableVoltageMeasurement(void)
1427 {
1428 #if (SRSS_BACKUP_VBCK_PRESENT)
1429     BACKUP_CTL |= BACKUP_CTL_VBACKUP_MEAS_Msk;
1430 #endif
1431 }
1432 
1433 
Cy_SysPm_BackupDisableVoltageMeasurement(void)1434 void Cy_SysPm_BackupDisableVoltageMeasurement(void)
1435 {
1436 /* The MXS40SRSSv2 does have VBCK present, but is not compatible with the VBACKUP_MEAS register bit. */
1437 #if (SRSS_BACKUP_VBCK_PRESENT && (CY_IP_MXS40SRSS_VERSION != 2u))
1438     BACKUP_CTL &= ((uint32_t) ~BACKUP_CTL_VBACKUP_MEAS_Msk);
1439 #endif
1440 }
1441 
1442 
Cy_SysPm_BackupSuperCapCharge(cy_en_syspm_sc_charge_key_t key)1443 void Cy_SysPm_BackupSuperCapCharge(cy_en_syspm_sc_charge_key_t key)
1444 {
1445     CY_UNUSED_PARAMETER(key);
1446 
1447 #if (SRSS_BACKUP_VBCK_PRESENT)
1448     CY_ASSERT_L3(CY_SYSPM_IS_SC_CHARGE_KEY_VALID(key));
1449 
1450     if(key == CY_SYSPM_SC_CHARGE_ENABLE)
1451     {
1452         BACKUP_CTL = _CLR_SET_FLD32U((BACKUP_CTL), BACKUP_CTL_EN_CHARGE_KEY, (uint32_t) CY_SYSPM_SC_CHARGE_ENABLE);
1453     }
1454     else
1455     {
1456         BACKUP_CTL &= ((uint32_t) ~BACKUP_CTL_EN_CHARGE_KEY_Msk);
1457     }
1458 #endif
1459 }
1460 
1461 /* These functions are only available for devices that contain the SRSS_BACKUP IP. */
1462 #if defined (CY_IP_MXS40SSRSS) || (defined (CY_IP_MXS40SRSS) && (defined (SRSS_BACKUP_PRESENT) && (SRSS_BACKUP_PRESENT == 1u)))
Cy_SysPm_BackupWordStore(uint32_t wordIndex,uint32_t * wordSrcPointer,uint32_t wordSize)1463 void Cy_SysPm_BackupWordStore(uint32_t wordIndex, uint32_t *wordSrcPointer, uint32_t wordSize)
1464 {
1465     CY_ASSERT_L3(CY_SYSPM_IS_WORD_INDEX_VALID(wordIndex));
1466     CY_ASSERT_L3(CY_SYSPM_IS_WORD_SIZE_VALID(wordSize + wordIndex));
1467 
1468     while(wordSize != 0UL)
1469     {
1470         BACKUP_BREG[wordIndex] = *wordSrcPointer;
1471 
1472         wordIndex++;
1473         wordSrcPointer++;
1474         wordSize--;
1475     }
1476 }
1477 
Cy_SysPm_BackupWordReStore(uint32_t wordIndex,uint32_t * wordDstPointer,uint32_t wordSize)1478 void Cy_SysPm_BackupWordReStore(uint32_t wordIndex, uint32_t *wordDstPointer, uint32_t wordSize)
1479 {
1480     CY_ASSERT_L3(CY_SYSPM_IS_WORD_INDEX_VALID(wordIndex));
1481     CY_ASSERT_L3(CY_SYSPM_IS_WORD_SIZE_VALID(wordSize + wordIndex));
1482 
1483     while(wordSize != 0UL)
1484     {
1485         *wordDstPointer = BACKUP_BREG[wordIndex];
1486 
1487         wordIndex++;
1488         wordDstPointer++;
1489         wordSize--;
1490     }
1491 }
1492 #endif  /* defined (CY_IP_MXS40SSRSS) || (defined (CY_IP_MXS40SRSS) && (defined (SRSS_BACKUP_PRESENT) && (SRSS_BACKUP_PRESENT == 1u))) */
1493 
Cy_SysPm_SetSRAMMacroPwrMode(cy_en_syspm_sram_index_t sramNum,uint32_t sramMacroNum,cy_en_syspm_sram_pwr_mode_t sramPwrMode)1494 cy_en_syspm_status_t Cy_SysPm_SetSRAMMacroPwrMode(cy_en_syspm_sram_index_t sramNum, uint32_t sramMacroNum, cy_en_syspm_sram_pwr_mode_t sramPwrMode)
1495 {
1496     cy_en_syspm_status_t status = CY_SYSPM_BAD_PARAM;
1497 
1498     CY_ASSERT_L1( sramNum < CPUSS_SRAM_COUNT );
1499 
1500     if(sramNum == CY_SYSPM_SRAM0_MEMORY)
1501     {
1502         CY_ASSERT_L1( sramMacroNum < CPUSS_RAMC0_MACRO_NR );
1503         if (sramMacroNum < CPUSS_RAMC0_MACRO_NR)
1504         {
1505             CPUSS_RAM0_PWR_MACRO_CTL(sramMacroNum) = _VAL2FLD(CPUSS_RAM0_PWR_MACRO_CTL_VECTKEYSTAT, CY_SYSPM_PWR_MACRO_CTL_WRITE_KEY) |
1506                                                 _VAL2FLD(CPUSS_RAM0_PWR_MACRO_CTL_PWR_MODE, sramPwrMode);
1507             status = CY_SYSPM_SUCCESS;
1508         }
1509     }
1510     else if(sramNum == CY_SYSPM_SRAM1_MEMORY)
1511     {
1512         CY_ASSERT_L1( CPUSS_RAMC1_PRESENT );
1513         CY_ASSERT_L1( sramMacroNum == 0UL );
1514 
1515         CPUSS_RAM1_PWR_CTL = _VAL2FLD(CPUSS_RAM1_PWR_CTL_VECTKEYSTAT, CY_SYSPM_PWR_MACRO_CTL_WRITE_KEY) |
1516                                     _VAL2FLD(CPUSS_RAM1_PWR_CTL_PWR_MODE, sramPwrMode);
1517         status = CY_SYSPM_SUCCESS;
1518     }
1519     else if(sramNum == CY_SYSPM_SRAM2_MEMORY)
1520     {
1521         CY_ASSERT_L1( CPUSS_RAMC2_PRESENT );
1522         CY_ASSERT_L1( sramMacroNum == 0UL );
1523 
1524         CPUSS_RAM2_PWR_CTL = _VAL2FLD(CPUSS_RAM2_PWR_CTL_VECTKEYSTAT, CY_SYSPM_PWR_MACRO_CTL_WRITE_KEY) |
1525                                     _VAL2FLD(CPUSS_RAM2_PWR_CTL_PWR_MODE, sramPwrMode);
1526         status = CY_SYSPM_SUCCESS;
1527     }
1528     else
1529     {
1530         /* Invalid SRAM Number */
1531     }
1532 
1533     return status;
1534 }
1535 
1536 
Cy_SysPm_GetSRAMMacroPwrMode(cy_en_syspm_sram_index_t sramNum,uint32_t sramMacroNum)1537 cy_en_syspm_sram_pwr_mode_t Cy_SysPm_GetSRAMMacroPwrMode(cy_en_syspm_sram_index_t sramNum, uint32_t sramMacroNum)
1538 {
1539     uint32_t retVal = (uint32_t)CY_SYSPM_SRAM_PWR_MODE_INVALID;
1540 
1541     CY_ASSERT_L1( sramNum < CPUSS_SRAM_COUNT );
1542 
1543     if(sramNum == CY_SYSPM_SRAM0_MEMORY)
1544     {
1545         CY_ASSERT_L1( sramMacroNum < CPUSS_RAMC0_MACRO_NR );
1546         if (sramMacroNum < CPUSS_RAMC0_MACRO_NR)
1547         {
1548             retVal = _FLD2VAL(CPUSS_RAM0_PWR_MACRO_CTL_PWR_MODE, CPUSS_RAM0_PWR_MACRO_CTL(sramMacroNum));
1549         }
1550     }
1551     else if(sramNum == CY_SYSPM_SRAM1_MEMORY)
1552     {
1553         CY_ASSERT_L1( sramMacroNum == 0UL );
1554         retVal = _FLD2VAL(CPUSS_RAM1_PWR_CTL_PWR_MODE, CPUSS_RAM1_PWR_CTL);
1555     }
1556     else if(sramNum == CY_SYSPM_SRAM2_MEMORY)
1557     {
1558         CY_ASSERT_L1( sramMacroNum == 0UL );
1559         retVal = _FLD2VAL(CPUSS_RAM2_PWR_CTL_PWR_MODE, CPUSS_RAM2_PWR_CTL);
1560     }
1561     else
1562     {
1563         /* Invalid SRAM Number */
1564     }
1565     return (cy_en_syspm_sram_pwr_mode_t)retVal;
1566 }
1567 
1568 
Cy_SysPm_SetSRAMPwrMode(cy_en_syspm_sram_index_t sramNum,cy_en_syspm_sram_pwr_mode_t sramPwrMode)1569 cy_en_syspm_status_t Cy_SysPm_SetSRAMPwrMode(cy_en_syspm_sram_index_t sramNum, cy_en_syspm_sram_pwr_mode_t sramPwrMode)
1570 {
1571     uint32 idx;
1572 
1573     cy_en_syspm_status_t status = CY_SYSPM_BAD_PARAM;
1574     CY_ASSERT_L1( sramNum < CPUSS_SRAM_COUNT );
1575 
1576     if(sramNum == CY_SYSPM_SRAM0_MEMORY)
1577     {
1578         for(idx = 0UL; idx < CPUSS_RAMC0_MACRO_NR; idx++)
1579         {
1580             CPUSS_RAM0_PWR_MACRO_CTL(idx) = _VAL2FLD(CPUSS_RAM0_PWR_MACRO_CTL_VECTKEYSTAT, CY_SYSPM_PWR_MACRO_CTL_WRITE_KEY) |
1581                                         _VAL2FLD(CPUSS_RAM0_PWR_MACRO_CTL_PWR_MODE, sramPwrMode);
1582         }
1583         status = CY_SYSPM_SUCCESS;
1584     }
1585     else if(sramNum == CY_SYSPM_SRAM1_MEMORY)
1586     {
1587         CY_ASSERT_L1( CPUSS_RAMC1_PRESENT );
1588         CPUSS_RAM1_PWR_CTL = _VAL2FLD(CPUSS_RAM1_PWR_CTL_VECTKEYSTAT, CY_SYSPM_PWR_MACRO_CTL_WRITE_KEY) |
1589                                         _VAL2FLD(CPUSS_RAM1_PWR_CTL_PWR_MODE, sramPwrMode);
1590         status = CY_SYSPM_SUCCESS;
1591 
1592     }
1593     else if(sramNum == CY_SYSPM_SRAM2_MEMORY)
1594     {
1595         CY_ASSERT_L1( CPUSS_RAMC2_PRESENT );
1596         CPUSS_RAM2_PWR_CTL = _VAL2FLD(CPUSS_RAM2_PWR_CTL_VECTKEYSTAT, CY_SYSPM_PWR_MACRO_CTL_WRITE_KEY) |
1597                                         _VAL2FLD(CPUSS_RAM2_PWR_CTL_PWR_MODE, sramPwrMode);
1598         status = CY_SYSPM_SUCCESS;
1599 
1600     }
1601     else
1602     {
1603         /* Invalid SRAM Number */
1604     }
1605 
1606     return status;
1607 }
1608 
1609 
1610 /*******************************************************************************
1611 * Function Name: Cy_SysPm_ReadStatus
1612 ****************************************************************************//**
1613 *
1614 * Reads the status of the core(s).
1615 *
1616 * \return The current power mode. See \ref group_syspm_return_status.
1617 *
1618 *******************************************************************************/
Cy_SysPm_ReadStatus(void)1619 uint32_t Cy_SysPm_ReadStatus(void)
1620 {
1621     uint32_t interruptState;
1622     uint32_t pmStatus = 0u;
1623     interruptState = Cy_SysLib_EnterCriticalSection();
1624 
1625     #if defined (CY_CPU_CORTEX_M7) && (CY_CPU_CORTEX_M7)
1626     /* Check whether CM7_0 is in the deep sleep mode*/
1627     if((0u != _FLD2VAL(CPUSS_CM7_0_STATUS_SLEEPING, CPUSS_CM7_0_STATUS)) &&
1628        (0u != _FLD2VAL(CPUSS_CM7_0_STATUS_SLEEPDEEP, CPUSS_CM7_0_STATUS)))
1629     {
1630         pmStatus |= CY_SYSPM_STATUS_CM7_0_DEEPSLEEP;
1631     }
1632     /* Check whether CM7_0 is in the sleep mode*/
1633     else if(0u != _FLD2VAL(CPUSS_CM7_0_STATUS_SLEEPING, CPUSS_CM7_0_STATUS))
1634     {
1635         pmStatus |= CY_SYSPM_STATUS_CM7_0_SLEEP;
1636     }
1637     else
1638     {
1639         pmStatus |= CY_SYSPM_STATUS_CM7_0_ACTIVE;
1640     }
1641 
1642     /* Check whether CM7_1 is in the deep sleep mode*/
1643     if((0u != _FLD2VAL(CPUSS_CM7_1_STATUS_SLEEPING, CPUSS_CM7_1_STATUS)) &&
1644        (0u != _FLD2VAL(CPUSS_CM7_1_STATUS_SLEEPDEEP, CPUSS_CM7_1_STATUS)))
1645     {
1646         pmStatus |= CY_SYSPM_STATUS_CM7_1_DEEPSLEEP;
1647     }
1648     /* Check whether CM7_1 is in the sleep mode*/
1649     else if(0u != _FLD2VAL(CPUSS_CM7_1_STATUS_SLEEPING, CPUSS_CM7_1_STATUS))
1650     {
1651         pmStatus |= CY_SYSPM_STATUS_CM7_1_SLEEP;
1652     }
1653     else
1654     {
1655         pmStatus |= CY_SYSPM_STATUS_CM7_1_ACTIVE;
1656     }
1657     #elif defined (CY_CPU_CORTEX_M4) && (CY_CPU_CORTEX_M4)
1658     /* Check whether CM4 is in Deep Sleep mode */
1659     if ((CPUSS_CM4_STATUS & CM4_DEEPSLEEP_MASK) == CM4_DEEPSLEEP_MASK)
1660     {
1661         pmStatus |= CY_SYSPM_STATUS_CM4_DEEPSLEEP;
1662     }
1663     /* Check whether CM4 is in Sleep mode */
1664     else if(0U != _FLD2VAL(CPUSS_CM4_STATUS_SLEEPING, CPUSS_CM4_STATUS))
1665     {
1666         pmStatus |= CY_SYSPM_STATUS_CM4_SLEEP;
1667     }
1668     else
1669     {
1670         pmStatus |= CY_SYSPM_STATUS_CM4_ACTIVE;
1671     }
1672     #endif
1673 
1674 
1675     /* Check whether CM0p is in the sleep or deep sleep mode*/
1676     if (0u != _FLD2VAL(CPUSS_CM0_STATUS_SLEEPING, CPUSS_CM0_STATUS))
1677     {
1678         if (0u != _FLD2VAL(CPUSS_CM0_STATUS_SLEEPDEEP, CPUSS_CM0_STATUS))
1679         {
1680             pmStatus |= (uint32_t) CY_SYSPM_STATUS_CM0_DEEPSLEEP;
1681         }
1682         else
1683         {
1684             pmStatus |= (uint32_t) CY_SYSPM_STATUS_CM0_SLEEP;
1685         }
1686     }
1687     else
1688     {
1689         pmStatus |= (uint32_t) CY_SYSPM_STATUS_CM0_ACTIVE;
1690     }
1691 
1692     /* Check whether the device is in LPACTIVE mode or not */
1693     if(Cy_SysPm_IsSystemLpActiveEnabled())
1694     {
1695         pmStatus |= (uint32_t) CY_SYSPM_STATUS_SYSTEM_LOWPOWER;
1696     }
1697 
1698     Cy_SysLib_ExitCriticalSection(interruptState);
1699 
1700     return(pmStatus);
1701 }
1702 
1703 #if defined(CY_IP_M7CPUSS) && (CY_IP_M7CPUSS == 1u)
Cy_SysPm_Cm7IsActive(uint8_t core)1704 bool Cy_SysPm_Cm7IsActive(uint8_t core)
1705 {
1706     bool status = false;
1707 
1708     if(core == CORE_CM7_0)
1709     {
1710         status = ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM7_0_ACTIVE) != 0u);
1711     }
1712     else if(core == CORE_CM7_1)
1713     {
1714         status = ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM7_1_ACTIVE) != 0u);
1715     }
1716     else
1717     {
1718         /* CM7 Not active */
1719     }
1720 
1721     return status;
1722 }
1723 
Cy_SysPm_Cm7IsSleep(uint8_t core)1724 bool Cy_SysPm_Cm7IsSleep(uint8_t core)
1725 {
1726     bool status = false;
1727 
1728     if(core == CORE_CM7_0)
1729     {
1730         status = ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM7_0_SLEEP) != 0u);
1731     }
1732     else if(core == CORE_CM7_1)
1733     {
1734         status = ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM7_1_SLEEP) != 0u);
1735     }
1736     else
1737     {
1738         /* CM7 Not active */
1739     }
1740 
1741     return status;
1742 }
1743 
Cy_SysPm_Cm7IsDeepSleep(uint8_t core)1744 bool Cy_SysPm_Cm7IsDeepSleep(uint8_t core)
1745 {
1746     bool status = false;
1747 
1748     if(core == CORE_CM7_0)
1749     {
1750         status = ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM7_0_DEEPSLEEP) != 0u);
1751     }
1752     else if(core == CORE_CM7_1)
1753     {
1754         status = ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM7_1_DEEPSLEEP) != 0u);
1755     }
1756     else
1757     {
1758         /* CM7 Not active */
1759     }
1760 
1761     return status;
1762 }
1763 
1764 
1765 #endif // defined(CY_IP_M7CPUSS) && (CY_IP_M7CPUSS == 1u)
1766 
1767 #if defined (CY_IP_M4CPUSS) && (CY_IP_M4CPUSS == 1u)
Cy_SysPm_Cm4IsActive(void)1768 bool Cy_SysPm_Cm4IsActive(void)
1769 {
1770     return ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM4_ACTIVE) != 0U);
1771 }
1772 
1773 
Cy_SysPm_Cm4IsSleep(void)1774 bool Cy_SysPm_Cm4IsSleep(void)
1775 {
1776     return ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM4_SLEEP) != 0U);
1777 }
1778 
1779 
Cy_SysPm_Cm4IsDeepSleep(void)1780 bool Cy_SysPm_Cm4IsDeepSleep(void)
1781 {
1782     return ((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM4_DEEPSLEEP) != 0U);
1783 }
1784 
1785 #endif // defined (CY_IP_M4CPUSS) && (CY_IP_M4CPUSS == 1u)
1786 
Cy_SysPm_Cm0IsActive(void)1787 bool Cy_SysPm_Cm0IsActive(void)
1788 {
1789     return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM0_ACTIVE) != 0u);
1790 }
1791 
Cy_SysPm_Cm0IsSleep(void)1792 bool Cy_SysPm_Cm0IsSleep(void)
1793 {
1794     return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM0_SLEEP) != 0u);
1795 }
1796 
Cy_SysPm_Cm0IsDeepSleep(void)1797 bool Cy_SysPm_Cm0IsDeepSleep(void)
1798 {
1799     return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM0_DEEPSLEEP) != 0u);
1800 }
1801 
Cy_SysPm_IsSystemLp(void)1802 bool Cy_SysPm_IsSystemLp(void)
1803 {
1804     return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_SYSTEM_LOWPOWER) != 0u);
1805 }
1806 
1807 #if (defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION < 2u)) || \
1808     ((defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION >= 2u)) && (defined (SRSS_BACKUP_VBCK_PRESENT) && (SRSS_BACKUP_VBCK_PRESENT == 1u)))
Cy_SysPm_PmicEnable(void)1809 void Cy_SysPm_PmicEnable(void)
1810 {
1811     if(CY_SYSPM_PMIC_UNLOCK_KEY == _FLD2VAL(BACKUP_PMIC_CTL_UNLOCK, BACKUP_PMIC_CTL))
1812     {
1813         BACKUP_PMIC_CTL =
1814         _VAL2FLD(BACKUP_PMIC_CTL_UNLOCK, CY_SYSPM_PMIC_UNLOCK_KEY) |
1815         _VAL2FLD(BACKUP_PMIC_CTL_PMIC_EN_OUTEN, 1u) |
1816         _VAL2FLD(BACKUP_PMIC_CTL_PMIC_EN, 1u);
1817     }
1818 }
1819 
1820 
Cy_SysPm_PmicDisable(cy_en_syspm_pmic_wakeup_polarity_t polarity)1821 void Cy_SysPm_PmicDisable(cy_en_syspm_pmic_wakeup_polarity_t polarity)
1822 {
1823     if(CY_SYSPM_PMIC_UNLOCK_KEY == _FLD2VAL(BACKUP_PMIC_CTL_UNLOCK, BACKUP_PMIC_CTL))
1824     {
1825         BACKUP_PMIC_CTL =
1826         (_VAL2FLD(BACKUP_PMIC_CTL_UNLOCK, CY_SYSPM_PMIC_UNLOCK_KEY) |
1827          _CLR_SET_FLD32U(BACKUP_PMIC_CTL, BACKUP_PMIC_CTL_POLARITY, polarity)) &
1828         ((uint32_t) ~ _VAL2FLD(BACKUP_PMIC_CTL_PMIC_EN, 1u));
1829     }
1830 }
1831 
1832 
Cy_SysPm_PmicAlwaysEnable(void)1833 void Cy_SysPm_PmicAlwaysEnable(void)
1834 {
1835     BACKUP_PMIC_CTL |= _VAL2FLD(BACKUP_PMIC_CTL_PMIC_ALWAYSEN, 1u);
1836 }
1837 
1838 
Cy_SysPm_PmicEnableOutput(void)1839 void Cy_SysPm_PmicEnableOutput(void)
1840 {
1841     if(CY_SYSPM_PMIC_UNLOCK_KEY == _FLD2VAL(BACKUP_PMIC_CTL_UNLOCK, BACKUP_PMIC_CTL))
1842     {
1843         BACKUP_PMIC_CTL |=
1844         _VAL2FLD(BACKUP_PMIC_CTL_UNLOCK, CY_SYSPM_PMIC_UNLOCK_KEY) | _VAL2FLD(BACKUP_PMIC_CTL_PMIC_EN_OUTEN, 1u);
1845     }
1846 }
1847 
1848 
Cy_SysPm_PmicDisableOutput(void)1849 void Cy_SysPm_PmicDisableOutput(void)
1850 {
1851     if(CY_SYSPM_PMIC_UNLOCK_KEY == _FLD2VAL(BACKUP_PMIC_CTL_UNLOCK, BACKUP_PMIC_CTL))
1852     {
1853         BACKUP_PMIC_CTL =
1854         (BACKUP_PMIC_CTL | _VAL2FLD(BACKUP_PMIC_CTL_UNLOCK, CY_SYSPM_PMIC_UNLOCK_KEY)) &
1855         ((uint32_t) ~ _VAL2FLD(BACKUP_PMIC_CTL_PMIC_EN_OUTEN, 1u));
1856     }
1857 }
1858 
1859 
Cy_SysPm_PmicLock(void)1860 void Cy_SysPm_PmicLock(void)
1861 {
1862     BACKUP_PMIC_CTL = _CLR_SET_FLD32U(BACKUP_PMIC_CTL, BACKUP_PMIC_CTL_UNLOCK, 0u);
1863 }
1864 
1865 
Cy_SysPm_PmicUnlock(void)1866 void Cy_SysPm_PmicUnlock(void)
1867 {
1868     BACKUP_PMIC_CTL = _CLR_SET_FLD32U(BACKUP_PMIC_CTL, BACKUP_PMIC_CTL_UNLOCK, CY_SYSPM_PMIC_UNLOCK_KEY);
1869 }
1870 
1871 
Cy_SysPm_PmicIsEnabled(void)1872 bool Cy_SysPm_PmicIsEnabled(void)
1873 {
1874     return(0u != _FLD2VAL(BACKUP_PMIC_CTL_PMIC_EN, BACKUP_PMIC_CTL));
1875 }
1876 
1877 
Cy_SysPm_PmicIsOutputEnabled(void)1878 bool Cy_SysPm_PmicIsOutputEnabled(void)
1879 {
1880     return (0U != _FLD2VAL(BACKUP_PMIC_CTL_PMIC_EN_OUTEN, BACKUP_PMIC_CTL));
1881 }
1882 
1883 
Cy_SysPm_PmicIsLocked(void)1884 bool Cy_SysPm_PmicIsLocked(void)
1885 {
1886     return((_FLD2VAL(BACKUP_PMIC_CTL_UNLOCK, BACKUP_PMIC_CTL) == CY_SYSPM_PMIC_UNLOCK_KEY) ? false : true);
1887 }
1888 #endif /* (defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION < 2u)) || \
1889     ((defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION >= 2u)) && (defined (SRSS_BACKUP_VBCK_PRESENT) && (SRSS_BACKUP_VBCK_PRESENT == 1u))) */
1890 
Cy_SysPm_OvdEnable(cy_en_syspm_ovd_sel_t ovdSel)1891 void Cy_SysPm_OvdEnable(cy_en_syspm_ovd_sel_t ovdSel)
1892 {
1893     switch(ovdSel)
1894     {
1895     case CY_SYSPM_OVD_ON_VDDD:
1896       SRSS_PWR_SSV_CTL |= SRSS_PWR_SSV_CTL_OVDVDDD_ENABLE_Msk;
1897       break;
1898 
1899     case CY_SYSPM_OVD_ON_VDDA:
1900       SRSS_PWR_SSV_CTL |= SRSS_PWR_SSV_CTL_OVDVDDA_ENABLE_Msk;
1901       break;
1902 
1903     case CY_SYSPM_OVD_ON_VCCD:
1904       SRSS_PWR_SSV_CTL |= SRSS_PWR_SSV_CTL_OVDVCCD_ENABLE_Msk;
1905       break;
1906 
1907     default:
1908       (void)SRSS_PWR_SSV_STATUS; /* To Fix Coverity */
1909       break;
1910     }
1911 }
1912 
1913 
Cy_SysPm_OvdDisable(cy_en_syspm_ovd_sel_t ovdSel)1914 void Cy_SysPm_OvdDisable(cy_en_syspm_ovd_sel_t ovdSel)
1915 {
1916     switch(ovdSel)
1917     {
1918     case CY_SYSPM_OVD_ON_VDDD:
1919       SRSS_PWR_SSV_CTL &= (uint32_t) ~SRSS_PWR_SSV_CTL_OVDVDDD_ENABLE_Msk;
1920       break;
1921 
1922     case CY_SYSPM_OVD_ON_VDDA:
1923       SRSS_PWR_SSV_CTL &= (uint32_t) ~SRSS_PWR_SSV_CTL_OVDVDDA_ENABLE_Msk;
1924       break;
1925 
1926     case CY_SYSPM_OVD_ON_VCCD:
1927       SRSS_PWR_SSV_CTL &= (uint32_t) ~SRSS_PWR_SSV_CTL_OVDVCCD_ENABLE_Msk;
1928       break;
1929 
1930     default:
1931       (void)SRSS_PWR_SSV_STATUS; /* To Fix Coverity */
1932       break;
1933     }
1934 }
1935 
1936 
Cy_SysPm_OvdVdddSelect(cy_en_syspm_ovd_vddd_sel_t ovdVdddSel)1937 void Cy_SysPm_OvdVdddSelect(cy_en_syspm_ovd_vddd_sel_t ovdVdddSel)
1938 {
1939     SRSS_PWR_SSV_CTL = _CLR_SET_FLD32U(SRSS_PWR_SSV_CTL, SRSS_PWR_SSV_CTL_OVDVDDD_VSEL, ovdVdddSel);
1940 }
1941 
1942 
Cy_SysPm_OvdVddaSelect(cy_en_syspm_ovd_vdda_sel_t ovdVddaSel)1943 void Cy_SysPm_OvdVddaSelect(cy_en_syspm_ovd_vdda_sel_t ovdVddaSel)
1944 {
1945     SRSS_PWR_SSV_CTL = _CLR_SET_FLD32U(SRSS_PWR_SSV_CTL, SRSS_PWR_SSV_CTL_OVDVDDA_VSEL, ovdVddaSel);
1946 }
1947 
1948 
Cy_SysPm_OvdActionSelect(cy_en_syspm_ovd_action_select_t ovdActionSelect)1949 void Cy_SysPm_OvdActionSelect(cy_en_syspm_ovd_action_select_t ovdActionSelect)
1950 {
1951     CY_ASSERT(CY_OVD_CHECK_ACTION_CFG(ovdActionSelect));
1952 
1953     SRSS_PWR_SSV_CTL = _CLR_SET_FLD32U(SRSS_PWR_SSV_CTL, SRSS_PWR_SSV_CTL_OVDVDDA_ACTION, ovdActionSelect);
1954 }
1955 
1956 
Cy_SysPm_BodEnable(cy_en_syspm_bod_sel_t bodSel)1957 void Cy_SysPm_BodEnable(cy_en_syspm_bod_sel_t bodSel)
1958 {
1959     switch(bodSel)
1960     {
1961     case CY_SYSPM_BOD_ON_VDDD:
1962       SRSS_PWR_SSV_CTL |= SRSS_PWR_SSV_CTL_BODVDDD_ENABLE_Msk;
1963       break;
1964 
1965     case CY_SYSPM_BOD_ON_VDDA:
1966       SRSS_PWR_SSV_CTL |= SRSS_PWR_SSV_CTL_BODVDDA_ENABLE_Msk;
1967       break;
1968 
1969     case CY_SYSPM_BOD_ON_VCCD:
1970       SRSS_PWR_SSV_CTL |= SRSS_PWR_SSV_CTL_BODVCCD_ENABLE_Msk;
1971       break;
1972 
1973     default:
1974       (void)SRSS_PWR_SSV_STATUS; /* To Fix Coverity */
1975       break;
1976     }
1977 }
1978 
1979 
Cy_SysPm_BodDisable(cy_en_syspm_bod_sel_t bodSel)1980 void Cy_SysPm_BodDisable(cy_en_syspm_bod_sel_t bodSel)
1981 {
1982     switch(bodSel)
1983     {
1984     case CY_SYSPM_BOD_ON_VDDD:
1985       SRSS_PWR_SSV_CTL &= (uint32_t) ~SRSS_PWR_SSV_CTL_BODVDDD_ENABLE_Msk;
1986       break;
1987 
1988     case CY_SYSPM_BOD_ON_VDDA:
1989       SRSS_PWR_SSV_CTL &= (uint32_t) ~SRSS_PWR_SSV_CTL_BODVDDA_ENABLE_Msk;
1990       break;
1991 
1992     case CY_SYSPM_BOD_ON_VCCD:
1993       SRSS_PWR_SSV_CTL &= (uint32_t) ~SRSS_PWR_SSV_CTL_BODVCCD_ENABLE_Msk;
1994       break;
1995 
1996     default:
1997       (void)SRSS_PWR_SSV_STATUS; /* To Fix Coverity */
1998       break;
1999     }
2000 }
2001 
2002 
Cy_SysPm_BodVdddSelect(cy_en_syspm_bod_vddd_sel_t bodVdddSel)2003 void Cy_SysPm_BodVdddSelect(cy_en_syspm_bod_vddd_sel_t bodVdddSel)
2004 {
2005     SRSS_PWR_SSV_CTL = _CLR_SET_FLD32U(SRSS_PWR_SSV_CTL, SRSS_PWR_SSV_CTL_BODVDDD_VSEL, bodVdddSel);
2006 }
2007 
2008 
Cy_SysPm_BodVddaSelect(cy_en_syspm_bod_vdda_sel_t bodVddaSel)2009 void Cy_SysPm_BodVddaSelect(cy_en_syspm_bod_vdda_sel_t bodVddaSel)
2010 {
2011     SRSS_PWR_SSV_CTL = _CLR_SET_FLD32U(SRSS_PWR_SSV_CTL, SRSS_PWR_SSV_CTL_BODVDDA_VSEL, bodVddaSel);
2012 }
2013 
2014 
Cy_SysPm_BodActionSelect(cy_en_syspm_bod_action_select_t bodActionSelect)2015 void Cy_SysPm_BodActionSelect(cy_en_syspm_bod_action_select_t bodActionSelect)
2016 {
2017     CY_ASSERT(CY_BOD_CHECK_ACTION_CFG(bodActionSelect));
2018 
2019     SRSS_PWR_SSV_CTL = _CLR_SET_FLD32U(SRSS_PWR_SSV_CTL, SRSS_PWR_SSV_CTL_BODVDDA_ACTION, bodActionSelect);
2020 }
2021 
2022 
Cy_SysPm_SupplySupervisionStatus(cy_en_syspm_supply_entity_select_t supplyEntitySelect)2023 bool Cy_SysPm_SupplySupervisionStatus(cy_en_syspm_supply_entity_select_t supplyEntitySelect)
2024 {
2025     bool returnStatus = false;
2026 
2027     CY_ASSERT_L3(CY_OVD_CHECK_SUPPLY_ENTITY(supplyEntitySelect));
2028 
2029     switch(supplyEntitySelect)
2030     {
2031     case CY_SYSPM_ENTITY_BOD_VDDD:
2032       returnStatus = (0u != _FLD2VAL(SRSS_PWR_SSV_STATUS_BODVDDD_OK, SRSS_PWR_SSV_STATUS));
2033       break;
2034 
2035     case CY_SYSPM_ENTITY_BOD_VDDA:
2036       returnStatus = (0u != _FLD2VAL(SRSS_PWR_SSV_STATUS_BODVDDA_OK, SRSS_PWR_SSV_STATUS));
2037       break;
2038 
2039     case CY_SYSPM_ENTITY_BOD_VCCD:
2040       returnStatus = (0u != _FLD2VAL(SRSS_PWR_SSV_STATUS_BODVCCD_OK, SRSS_PWR_SSV_STATUS));
2041       break;
2042 
2043     case CY_SYSPM_ENTITY_OVD_VDDD:
2044       returnStatus = (0u != _FLD2VAL(SRSS_PWR_SSV_STATUS_OVDVDDD_OK, SRSS_PWR_SSV_STATUS));
2045       break;
2046 
2047     case CY_SYSPM_ENTITY_OVD_VDDA:
2048       returnStatus = (0u != _FLD2VAL(SRSS_PWR_SSV_STATUS_OVDVDDA_OK, SRSS_PWR_SSV_STATUS));
2049       break;
2050 
2051     case CY_SYSPM_ENTITY_OVD_VCCD:
2052       returnStatus = (0u != _FLD2VAL(SRSS_PWR_SSV_STATUS_OVDVCCD_OK, SRSS_PWR_SSV_STATUS));
2053       break;
2054 
2055     default:
2056       (void)SRSS_PWR_SSV_STATUS; /* To Fix Coverity */
2057       break;
2058     }
2059 
2060     return (returnStatus);
2061 }
2062 
Cy_SysPm_SystemIsMinRegulatorCurrentSet(void)2063 bool Cy_SysPm_SystemIsMinRegulatorCurrentSet(void)
2064 {
2065     uint32_t regMask = Cy_SysPm_LdoIsEnabled() ? CY_SYSPM_PWR_CIRCUITS_LPMODE_ACTIVE_LDO_MASK : CY_SYSPM_PWR_CIRCUITS_LPMODE_ACTIVE_BUCK_MASK;
2066 
2067     return ((SRSS_PWR_CTL & regMask) == regMask);
2068 }
2069 
Cy_SysPm_LinearRegDisable(void)2070 void Cy_SysPm_LinearRegDisable(void)
2071 {
2072     SRSS_PWR_CTL2 |= SRSS_PWR_CTL2_LINREG_DIS_Msk;
2073 }
2074 
Cy_SysPm_LinearRegEnable(void)2075 void Cy_SysPm_LinearRegEnable(void)
2076 {
2077     SRSS_PWR_CTL2 &= (uint32_t) ~SRSS_PWR_CTL2_LINREG_DIS_Msk;
2078 }
2079 
Cy_SysPm_LinearRegGetStatus(void)2080 bool Cy_SysPm_LinearRegGetStatus(void)
2081 {
2082     return (_FLD2BOOL(SRSS_PWR_CTL2_LINREG_OK, SRSS_PWR_CTL2));
2083 }
2084 
Cy_SysPm_DeepSleepRegDisable(void)2085 void Cy_SysPm_DeepSleepRegDisable(void)
2086 {
2087     SRSS_PWR_CTL2 |= SRSS_PWR_CTL2_DPSLP_REG_DIS_Msk;
2088 }
2089 
Cy_SysPm_DeepSleepRegEnable(void)2090 void Cy_SysPm_DeepSleepRegEnable(void)
2091 {
2092     SRSS_PWR_CTL2 &= (uint32_t) ~SRSS_PWR_CTL2_DPSLP_REG_DIS_Msk;
2093 }
2094 
Cy_SySPm_IsDeepSleepRegEnabled(void)2095 bool Cy_SySPm_IsDeepSleepRegEnabled(void)
2096 {
2097     return(0u == _FLD2VAL(SRSS_PWR_CTL2_DPSLP_REG_DIS, SRSS_PWR_CTL2));
2098 }
2099 
2100 /* High Current Regulator is not available in version 2 of the MXS40SRSS IP block. */
2101 #if (defined (SRSS_S40E_REGHC_PRESENT) && (SRSS_S40E_REGHC_PRESENT == 1u)) || (defined (SRSS_S40E_HTREGHC_PRESENT) && (SRSS_S40E_HTREGHC_PRESENT == 1u))
Cy_SysPm_ReghcSelectMode(cy_en_syspm_reghc_mode_t mode)2102 void Cy_SysPm_ReghcSelectMode(cy_en_syspm_reghc_mode_t mode)
2103 {
2104     CY_REG32_CLR_SET(SRSS_PWR_REGHC_CTL, SRSS_PWR_REGHC_CTL_REGHC_MODE, mode);
2105 }
2106 
Cy_SysPm_ReghcGetMode(void)2107 cy_en_syspm_reghc_mode_t Cy_SysPm_ReghcGetMode(void)
2108 {
2109     CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 10.8','Intentional typecast to cy_en_syspm_reghc_mode_t enum.');
2110     return (cy_en_syspm_reghc_mode_t)(_FLD2VAL(SRSS_PWR_REGHC_CTL_REGHC_MODE, SRSS_PWR_REGHC_CTL));
2111 }
2112 
Cy_SysPm_ReghcSelectDriveOut(cy_en_syspm_reghc_drive_out_t drvOut)2113 void Cy_SysPm_ReghcSelectDriveOut(cy_en_syspm_reghc_drive_out_t drvOut)
2114 {
2115     CY_REG32_CLR_SET(SRSS_PWR_REGHC_CTL, SRSS_PWR_REGHC_CTL_REGHC_PMIC_DRV_VOUT, drvOut);
2116 }
2117 
Cy_SysPm_ReghcGetDriveOut(void)2118 cy_en_syspm_reghc_drive_out_t Cy_SysPm_ReghcGetDriveOut(void)
2119 {
2120     CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 10.8','Intentional typecast to cy_en_syspm_reghc_drive_out_t enum.');
2121     return (cy_en_syspm_reghc_drive_out_t)(_FLD2VAL(SRSS_PWR_REGHC_CTL_REGHC_PMIC_DRV_VOUT, SRSS_PWR_REGHC_CTL));
2122 }
2123 
Cy_SysPm_ReghcAdjustOutputVoltage(cy_en_syspm_reghc_vadj_t trim)2124 void Cy_SysPm_ReghcAdjustOutputVoltage(cy_en_syspm_reghc_vadj_t trim)
2125 {
2126     CY_REG32_CLR_SET(SRSS_PWR_REGHC_CTL, SRSS_PWR_REGHC_CTL_REGHC_VADJ, trim);
2127 }
2128 
Cy_SysPm_ReghcDisableIntSupplyWhileExtActive(void)2129 void Cy_SysPm_ReghcDisableIntSupplyWhileExtActive(void)
2130 {
2131     SRSS_PWR_REGHC_CTL &= (uint32_t) ~SRSS_PWR_REGHC_CTL_REGHC_PMIC_USE_LINREG_Msk;
2132 }
2133 
Cy_SysPm_ReghcEnableIntSupplyWhileExtActive(void)2134 void Cy_SysPm_ReghcEnableIntSupplyWhileExtActive(void)
2135 {
2136     SRSS_PWR_REGHC_CTL |= SRSS_PWR_REGHC_CTL_REGHC_PMIC_USE_LINREG_Msk;
2137 }
2138 
2139 
Cy_SysPm_ReghcDisablePmicEnableOutput(void)2140 void Cy_SysPm_ReghcDisablePmicEnableOutput(void)
2141 {
2142     SRSS_PWR_REGHC_CTL &= (uint32_t) ~SRSS_PWR_REGHC_CTL_REGHC_PMIC_CTL_OUTEN_Msk;
2143     SRSS_PWR_REGHC_CTL &= (uint32_t) ~SRSS_PWR_REGHC_CTL_REGHC_PMIC_CTL_POLARITY_Msk;
2144 }
2145 
Cy_SysPm_ReghcEnablePmicEnableOutput(bool polarity)2146 void Cy_SysPm_ReghcEnablePmicEnableOutput(bool polarity)
2147 {
2148     SRSS_PWR_REGHC_CTL |= SRSS_PWR_REGHC_CTL_REGHC_PMIC_CTL_OUTEN_Msk;
2149 
2150     if(polarity)
2151     {
2152         SRSS_PWR_REGHC_CTL |= SRSS_PWR_REGHC_CTL_REGHC_PMIC_CTL_POLARITY_Msk;
2153     }
2154     else
2155     {
2156         SRSS_PWR_REGHC_CTL &= (uint32_t) ~SRSS_PWR_REGHC_CTL_REGHC_PMIC_CTL_POLARITY_Msk;
2157     }
2158 }
2159 
Cy_SysPm_ReghcEnablePmicStatusInput(bool polarity)2160 void Cy_SysPm_ReghcEnablePmicStatusInput(bool polarity)
2161 {
2162     SRSS_PWR_REGHC_CTL |= SRSS_PWR_REGHC_CTL_REGHC_PMIC_STATUS_INEN_Msk;
2163 
2164     if(polarity)
2165     {
2166         SRSS_PWR_REGHC_CTL |= SRSS_PWR_REGHC_CTL_REGHC_PMIC_STATUS_POLARITY_Msk;
2167     }
2168     else
2169     {
2170         SRSS_PWR_REGHC_CTL &= (uint32_t) ~SRSS_PWR_REGHC_CTL_REGHC_PMIC_STATUS_POLARITY_Msk;
2171     }
2172 
2173 }
2174 
Cy_SysPm_ReghcDisablePmicStatusInput(void)2175 void Cy_SysPm_ReghcDisablePmicStatusInput(void)
2176 {
2177     SRSS_PWR_REGHC_CTL &= (uint32_t) ~SRSS_PWR_REGHC_CTL_REGHC_PMIC_STATUS_INEN_Msk;
2178 }
2179 
Cy_SysPm_ReghcSetPmicStatusWaitTime(uint16_t waitTime)2180 void Cy_SysPm_ReghcSetPmicStatusWaitTime(uint16_t waitTime)
2181 {
2182     CY_REG32_CLR_SET(SRSS_PWR_REGHC_CTL, SRSS_PWR_REGHC_CTL_REGHC_PMIC_STATUS_WAIT, waitTime);
2183 }
2184 
Cy_SysPm_ReghcIsConfigured(void)2185 bool Cy_SysPm_ReghcIsConfigured(void)
2186 {
2187     return (_FLD2BOOL(SRSS_PWR_REGHC_CTL_REGHC_CONFIGURED, SRSS_PWR_REGHC_CTL));
2188 }
2189 
Cy_SysPm_ReghcSetConfigured(void)2190 void Cy_SysPm_ReghcSetConfigured(void)
2191 {
2192     SRSS_PWR_REGHC_CTL |= SRSS_PWR_REGHC_CTL_REGHC_CONFIGURED_Msk;
2193 }
2194 
Cy_SysPm_ReghcDisable(void)2195 void Cy_SysPm_ReghcDisable(void)
2196 {
2197     SRSS_PWR_REGHC_CTL2 &= (uint32_t) ~SRSS_PWR_REGHC_CTL2_REGHC_EN_Msk;
2198 }
2199 
Cy_SysPm_ReghcEnable(void)2200 void Cy_SysPm_ReghcEnable(void)
2201 {
2202     SRSS_PWR_REGHC_CTL2 |= SRSS_PWR_REGHC_CTL2_REGHC_EN_Msk;
2203 }
2204 
Cy_SysPm_ReghcDisablePmicStatusTimeout(void)2205 void Cy_SysPm_ReghcDisablePmicStatusTimeout(void)
2206 {
2207     SRSS_PWR_REGHC_CTL2 &= (uint32_t) ~SRSS_PWR_REGHC_CTL2_REGHC_PMIC_STATUS_TIMEOUT_Msk;
2208 }
2209 
Cy_SysPm_ReghcEnablePmicStatusTimeout(uint8_t timeout)2210 void Cy_SysPm_ReghcEnablePmicStatusTimeout(uint8_t timeout)
2211 {
2212     CY_REG32_CLR_SET(SRSS_PWR_REGHC_CTL2, SRSS_PWR_REGHC_CTL2_REGHC_PMIC_STATUS_TIMEOUT, timeout);
2213 }
2214 
Cy_SysPm_ReghcIsEnabled(void)2215 bool Cy_SysPm_ReghcIsEnabled(void)
2216 {
2217     return (_FLD2BOOL(SRSS_PWR_REGHC_STATUS_REGHC_ENABLED, SRSS_PWR_REGHC_STATUS));
2218 }
2219 
Cy_SysPm_ReghcIsStatusOk(void)2220 bool Cy_SysPm_ReghcIsStatusOk(void)
2221 {
2222     return (_FLD2BOOL(SRSS_PWR_REGHC_STATUS_REGHC_PMIC_STATUS_OK, SRSS_PWR_REGHC_STATUS));
2223 }
2224 
Cy_SysPm_ReghcIsSequencerBusy(void)2225 bool Cy_SysPm_ReghcIsSequencerBusy(void)
2226 {
2227     return (_FLD2BOOL(SRSS_PWR_REGHC_STATUS_REGHC_SEQ_BUSY, SRSS_PWR_REGHC_STATUS));
2228 }
2229 
Cy_SysPm_ReghcDisableVAdj(void)2230 void Cy_SysPm_ReghcDisableVAdj(void)
2231 {
2232     SRSS_PWR_REGHC_CTL4 |= SRSS_PWR_REGHC_CTL4_REGHC_PMIC_VADJ_DIS_Msk;
2233 }
2234 
Cy_SysPm_ReghcEnableVAdj(void)2235 void Cy_SysPm_ReghcEnableVAdj(void)
2236 {
2237     SRSS_PWR_REGHC_CTL4 &= (uint32_t) ~SRSS_PWR_REGHC_CTL4_REGHC_PMIC_VADJ_DIS_Msk;
2238 }
2239 
Cy_SysPm_ReghcDisablePmicInDeepSleep(void)2240 void Cy_SysPm_ReghcDisablePmicInDeepSleep(void)
2241 {
2242     SRSS_PWR_REGHC_CTL4 &= (uint32_t) ~SRSS_PWR_REGHC_CTL4_REGHC_PMIC_DPSLP_Msk;
2243 }
2244 
Cy_SysPm_ReghcEnablePmicInDeepSleep(void)2245 void Cy_SysPm_ReghcEnablePmicInDeepSleep(void)
2246 {
2247     SRSS_PWR_REGHC_CTL4 |= SRSS_PWR_REGHC_CTL4_REGHC_PMIC_DPSLP_Msk;
2248 }
2249 
Cy_SysPm_ReghcIsOcdWithinLimits(void)2250 bool Cy_SysPm_ReghcIsOcdWithinLimits(void)
2251 {
2252     return (_FLD2BOOL(SRSS_PWR_REGHC_STATUS_REGHC_OCD_OK, SRSS_PWR_REGHC_STATUS));
2253 }
2254 
Cy_SysPm_ReghcIsCircuitEnabledAndOperating(void)2255 bool Cy_SysPm_ReghcIsCircuitEnabledAndOperating(void)
2256 {
2257     return (_FLD2BOOL(SRSS_PWR_REGHC_STATUS_REGHC_CKT_OK, SRSS_PWR_REGHC_STATUS));
2258 }
2259 
Cy_SysPm_ReghcConfigure(cy_en_syspm_reghc_mode_t mode,cy_en_syspm_reghc_vadj_t vadj)2260 cy_en_syspm_status_t Cy_SysPm_ReghcConfigure(cy_en_syspm_reghc_mode_t mode, cy_en_syspm_reghc_vadj_t vadj)
2261 {
2262     cy_en_syspm_status_t retVal = CY_SYSPM_TIMEOUT;
2263     uint32_t timeOut = REGHC_WAIT_DELAY_TRIES_US;
2264 
2265     /* Current support is for External Transistor mode only */
2266     CY_ASSERT_L3(mode == CY_SYSPM_REGHC_MODE_TRANSISTOR);
2267 
2268     /* a. Write PWR_REGHC_CTL.REGHC_MODE = 0 to configure the external transistor mode. */
2269     Cy_SysPm_ReghcSelectMode(mode);
2270 
2271     /* b. Write PWR_REGHC_CTL.REGHC_TRANS_USE_OCD = 1 */
2272     //HW default is "1"
2273 
2274     /* c. Write PWR_REGHC_CTL.REGHC_VADJ to the required feedback setting.*/
2275     Cy_SysPm_ReghcAdjustOutputVoltage(vadj);
2276 
2277     /* d. Write PWR_REGHC_CTL.REGHC_CONFIGURED = 1. */
2278     Cy_SysPm_ReghcSetConfigured();
2279 
2280     /* e. Execute the system call (LoadRegulatorTrims) to change internal regulator trims. */
2281     //HW takes care
2282 
2283     /* f. Write PWR_REGHC_CTL2.REGHC_EN = 1. */
2284     Cy_SysPm_ReghcEnable();
2285 
2286     /* g. Wait until PWR_REGHC_STATUS.REGHC_SEQ_BUSY = 0 and PWR_REGHC_STATUS.REGHC_ENABLED = 1.
2287      * This should occur within 15us.
2288      */
2289     while (((true == Cy_SysPm_ReghcIsSequencerBusy()) || (false == Cy_SysPm_ReghcIsEnabled())) && (0U != timeOut))
2290     {
2291         Cy_SysLib_DelayUs(1U);
2292         timeOut--;
2293     }
2294 
2295     if (0U != timeOut)
2296     {
2297         retVal= CY_SYSPM_SUCCESS;
2298     }
2299 
2300     return retVal;
2301 }
2302 
Cy_SysPm_ReghcDeConfigure(void)2303 cy_en_syspm_status_t Cy_SysPm_ReghcDeConfigure(void)
2304 {
2305     cy_en_syspm_status_t retVal = CY_SYSPM_TIMEOUT;
2306     uint32_t timeOut = REGHC_WAIT_DELAY_TRIES_US;
2307 
2308     /* a. Write PWR_REGHC_CTL2.REGHC_EN = 0. */
2309     Cy_SysPm_ReghcDisable();
2310 
2311     /* b. Wait until PWR_REGHC_STATUS.REGHC_SEQ_BUSY = 0 and PWR_REGHC_STATUS.REGHC_ENABLED = 0.
2312      * This should occur within 10 us.
2313      */
2314     while (((true == Cy_SysPm_ReghcIsSequencerBusy()) || (true == Cy_SysPm_ReghcIsEnabled())) && (0U != timeOut))
2315     {
2316         Cy_SysLib_DelayUs(1U);
2317         timeOut--;
2318     }
2319 
2320     if (0U != timeOut)
2321     {
2322         retVal= CY_SYSPM_SUCCESS;
2323     }
2324 
2325     return retVal;
2326 }
2327 
2328 
2329 #endif  /* (SRSS_S40E_REGHC_PRESENT == 1u) || (SRSS_S40E_HTREGHC_PRESENT == 1u) */
2330 
2331 
2332 #endif /* (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION >= 2) */
2333 
2334 /* [] END OF FILE */
2335