blob: 72d97f80f0c5b74af0cf0cadb75e8dc94da5cdee [file] [log] [blame]
Angel Pons1ddb8942020-04-04 18:51:26 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Stefan Reinauer043eb0e2013-05-10 16:21:58 -07002
Julius Werner1ed0c8c2014-10-20 13:16:29 -07003#include <soc/power.h>
4#include <soc/wakeup.h>
Stefan Reinauer043eb0e2013-05-10 16:21:58 -07005
6void wakeup(void)
7{
8 if (wakeup_need_reset())
9 power_reset();
10
11 power_init(); /* Ensure ps_hold_setup() for early wakeup. */
12 power_exit_wakeup();
Stefan Reinauer9125d882013-09-10 10:58:28 -070013 /* Should never return. If we do, reset. */
14 power_reset();
Stefan Reinauer043eb0e2013-05-10 16:21:58 -070015}
16
17int get_wakeup_state(void)
18{
19 uint32_t status = power_read_reset_status();
20
21 /* DIDLE/LPA can be resumed without clock reset (ex, bootblock),
22 * and SLEEP requires resetting clock (should be done in ROM stage).
23 */
24
25 if (status == S5P_CHECK_DIDLE || status == S5P_CHECK_LPA)
26 return WAKEUP_DIRECT;
27
28 if (status == S5P_CHECK_SLEEP)
29 return WAKEUP_NEED_CLOCK_RESET;
30
31 return IS_NOT_WAKEUP;
32}
Hung-Te Lin12b121f2013-09-24 15:51:05 +080033
34void wakeup_enable_uart(void)
35{
36 power_release_uart_retention();
37}