rockchip: sysreset: rk3188: Make sure remap is off on warm-resets
authorHeiko Stübner <heiko@sntech.de>
Fri, 7 Apr 2017 10:38:52 +0000 (12:38 +0200)
committerSimon Glass <sjg@chromium.org>
Sat, 15 Apr 2017 16:13:17 +0000 (10:13 -0600)
The warm-reset of rk3188 socs keeps the remap setting as it was, so if
it was enabled, the cpu would start from address 0x0 of the sram instead
of address 0x0 of the bootrom, thus making the reset hang.

Therefore make sure the remap is disabled before attempting a warm reset.

Cold reset is not affected by this at all.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Acked-by: Simon Glass <sjg@chromium.org>
drivers/sysreset/sysreset_rk3188.c

index 36ae47600a535c77636a9685315349003f13d8fe..053a6344f5325fd4de658e7ca82be036f7fb2776 100644 (file)
@@ -7,21 +7,36 @@
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
+#include <syscon.h>
 #include <sysreset.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/cru_rk3188.h>
+#include <asm/arch/grf_rk3188.h>
 #include <asm/arch/hardware.h>
 #include <linux/err.h>
 
 int rk3188_sysreset_request(struct udevice *dev, enum sysreset_t type)
 {
        struct rk3188_cru *cru = rockchip_get_cru();
+       struct rk3188_grf *grf;
 
        if (IS_ERR(cru))
                return PTR_ERR(cru);
        switch (type) {
        case SYSRESET_WARM:
+               grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+               if (IS_ERR(grf))
+                       return -EPROTONOSUPPORT;
+
+               /*
+                * warm-reset keeps the remap value,
+                * so make sure it's disabled.
+                */
+               rk_clrsetreg(&grf->soc_con0,
+                       NOC_REMAP_MASK << NOC_REMAP_SHIFT,
+                       0 << NOC_REMAP_SHIFT);
+
                rk_clrreg(&cru->cru_mode_con, 0xffff);
                writel(0xeca8, &cru->cru_glb_srst_snd_value);
                break;