blob: 6534b073e5a47c20bdf7cdad94c662445f1cb15d [file] [log] [blame]
Angel Pons1ddb8942020-04-04 18:51:26 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Gabe Black607c0b62013-05-16 05:45:57 -07002
Gabe Blackee4bfbf2013-08-13 21:05:43 -07003#include <arch/cache.h>
Julius Werner80af4422014-10-20 13:18:56 -07004#include <soc/power.h>
5#include <soc/wakeup.h>
Gabe Black607c0b62013-05-16 05:45:57 -07006
7void wakeup(void)
8{
9 if (wakeup_need_reset())
10 power_reset();
11
12 power_init(); /* Ensure ps_hold_setup() for early wakeup. */
Gabe Blackee4bfbf2013-08-13 21:05:43 -070013 dcache_mmu_disable();
Gabe Black607c0b62013-05-16 05:45:57 -070014 power_exit_wakeup();
Stefan Reinauer9125d882013-09-10 10:58:28 -070015 /* Should never return. If we do, reset. */
16 power_reset();
Gabe Black607c0b62013-05-16 05:45:57 -070017}
18
19int get_wakeup_state(void)
20{
21 uint32_t status = power_read_reset_status();
22
23 /* DIDLE/LPA can be resumed without clock reset (ex, bootblock),
24 * and SLEEP requires resetting clock (should be done in ROM stage).
25 */
26
27 if (status == S5P_CHECK_DIDLE || status == S5P_CHECK_LPA)
28 return WAKEUP_DIRECT;
29
30 if (status == S5P_CHECK_SLEEP)
31 return WAKEUP_NEED_CLOCK_RESET;
32
33 return IS_NOT_WAKEUP;
34}
Hung-Te Lin12b121f2013-09-24 15:51:05 +080035
36void wakeup_enable_uart(void)
37{
38 power_release_uart_retention();
39}