summaryrefslogtreecommitdiff
path: root/plat
diff options
context:
space:
mode:
authorCaesar Wang <wxt@rock-chips.com>2016-05-25 19:04:47 +0800
committerCaesar Wang <wxt@rock-chips.com>2016-05-27 09:39:56 +0800
commit8867299f0518f9cdd658d3eaf6e7e744618ad217 (patch)
tree63bd052faca9b443a5a1600a43ac9b1843472e18 /plat
parent68ff45f40ada5b571bb6b2e27e23f77526cb4014 (diff)
rockchip: support reset SoC through gpio for rk3399
If define a reset gpio, BL31 will use gpio to reset SOC, otherwise use CRU reset.
Diffstat (limited to 'plat')
-rw-r--r--plat/rockchip/rk3399/drivers/pmu/pmu.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/plat/rockchip/rk3399/drivers/pmu/pmu.c b/plat/rockchip/rk3399/drivers/pmu/pmu.c
index 859e89f5..c5b281ae 100644
--- a/plat/rockchip/rk3399/drivers/pmu/pmu.c
+++ b/plat/rockchip/rk3399/drivers/pmu/pmu.c
@@ -34,9 +34,11 @@
#include <debug.h>
#include <delay_timer.h>
#include <errno.h>
+#include <gpio.h>
#include <mmio.h>
#include <platform.h>
#include <platform_def.h>
+#include <plat_params.h>
#include <plat_private.h>
#include <rk3399_def.h>
#include <pmu_sram.h>
@@ -384,6 +386,23 @@ static int sys_pwr_domain_resume(void)
return 0;
}
+void __dead2 soc_soft_reset(void)
+{
+ struct gpio_info *rst_gpio;
+
+ rst_gpio = (struct gpio_info *)plat_get_rockchip_gpio_reset();
+
+ if (rst_gpio) {
+ gpio_set_direction(rst_gpio->index, GPIO_DIR_OUT);
+ gpio_set_value(rst_gpio->index, rst_gpio->polarity);
+ } else {
+ soc_global_soft_reset();
+ }
+
+ while (1)
+ ;
+}
+
static struct rockchip_pm_ops_cb pm_ops = {
.cores_pwr_dm_on = cores_pwr_domain_on,
.cores_pwr_dm_off = cores_pwr_domain_off,
@@ -392,7 +411,7 @@ static struct rockchip_pm_ops_cb pm_ops = {
.cores_pwr_dm_resume = cores_pwr_domain_resume,
.sys_pwr_dm_suspend = sys_pwr_domain_suspend,
.sys_pwr_dm_resume = sys_pwr_domain_resume,
- .sys_gbl_soft_reset = soc_global_soft_reset,
+ .sys_gbl_soft_reset = soc_soft_reset,
};
void plat_rockchip_pmu_init(void)