xref: /rk3399_ARM-atf/plat/mediatek/lib/system_reset/reset_cros.c (revision a72b9e7754a27e6ebccf79f0cc4fb7cc5a0a8a5e)
1*a72b9e77SRex-BC Chen /*
2*a72b9e77SRex-BC Chen  * Copyright (c) 2022, MediaTek Inc. All rights reserved.
3*a72b9e77SRex-BC Chen  *
4*a72b9e77SRex-BC Chen  * SPDX-License-Identifier: BSD-3-Clause
5*a72b9e77SRex-BC Chen  */
6*a72b9e77SRex-BC Chen 
7*a72b9e77SRex-BC Chen #include <assert.h>
8*a72b9e77SRex-BC Chen #include <arch_helpers.h>
9*a72b9e77SRex-BC Chen #include <common/debug.h>
10*a72b9e77SRex-BC Chen #include <drivers/gpio.h>
11*a72b9e77SRex-BC Chen #include <lib/mtk_init/mtk_init.h>
12*a72b9e77SRex-BC Chen #include <lib/pm/mtk_pm.h>
13*a72b9e77SRex-BC Chen #include <plat_params.h>
14*a72b9e77SRex-BC Chen #include <pmic.h>
15*a72b9e77SRex-BC Chen #include <rtc.h>
16*a72b9e77SRex-BC Chen 
17*a72b9e77SRex-BC Chen static void __dead2 mtk_system_reset_cros(void)
18*a72b9e77SRex-BC Chen {
19*a72b9e77SRex-BC Chen 	struct bl_aux_gpio_info *gpio_reset = plat_get_mtk_gpio_reset();
20*a72b9e77SRex-BC Chen 
21*a72b9e77SRex-BC Chen 	INFO("MTK System Reset\n");
22*a72b9e77SRex-BC Chen 
23*a72b9e77SRex-BC Chen 	gpio_set_value(gpio_reset->index, gpio_reset->polarity);
24*a72b9e77SRex-BC Chen 
25*a72b9e77SRex-BC Chen 	wfi();
26*a72b9e77SRex-BC Chen 	ERROR("MTK System Reset: operation not handled.\n");
27*a72b9e77SRex-BC Chen 	panic();
28*a72b9e77SRex-BC Chen }
29*a72b9e77SRex-BC Chen 
30*a72b9e77SRex-BC Chen static void __dead2 mtk_system_off_cros(void)
31*a72b9e77SRex-BC Chen {
32*a72b9e77SRex-BC Chen 	INFO("MTK System Off\n");
33*a72b9e77SRex-BC Chen 
34*a72b9e77SRex-BC Chen 	rtc_power_off_sequence();
35*a72b9e77SRex-BC Chen 	pmic_power_off();
36*a72b9e77SRex-BC Chen 
37*a72b9e77SRex-BC Chen 	wfi();
38*a72b9e77SRex-BC Chen 	ERROR("MTK System Off: operation not handled.\n");
39*a72b9e77SRex-BC Chen 	panic();
40*a72b9e77SRex-BC Chen }
41*a72b9e77SRex-BC Chen 
42*a72b9e77SRex-BC Chen static struct plat_pm_reset_ctrl lib_reset_ctrl = {
43*a72b9e77SRex-BC Chen 	.system_off = mtk_system_off_cros,
44*a72b9e77SRex-BC Chen 	.system_reset = mtk_system_reset_cros,
45*a72b9e77SRex-BC Chen 	.system_reset2 = NULL,
46*a72b9e77SRex-BC Chen };
47*a72b9e77SRex-BC Chen 
48*a72b9e77SRex-BC Chen static int lib_reset_ctrl_init(void)
49*a72b9e77SRex-BC Chen {
50*a72b9e77SRex-BC Chen 	INFO("Reset init\n");
51*a72b9e77SRex-BC Chen 
52*a72b9e77SRex-BC Chen 	plat_pm_ops_setup_reset(&lib_reset_ctrl);
53*a72b9e77SRex-BC Chen 
54*a72b9e77SRex-BC Chen 	return 0;
55*a72b9e77SRex-BC Chen }
56*a72b9e77SRex-BC Chen MTK_ARCH_INIT(lib_reset_ctrl_init);
57