new file mode 100644
@@ -0,0 +1,20 @@
+/*
+ * (C) Copyright 2017 Paweł Jarosz <paweljarosz3691@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#ifndef _ASM_ARCH_SYSRESET_COMMON_H
+#define _ASM_ARCH_SYSRESET_COMMON_H
+
+struct rockchip_sysreset_data {
+ void *grf_soc_con0;
+ uint32_t noc_remap_mask;
+ void *cru_mode_con;
+ void *cru_glb_srst_snd_value;
+ void *cru_glb_srst_fst_value;
+};
+
+int rockchip_sysreset_request(struct rockchip_sysreset_data *data,
+ enum sysreset_t type);
+#endif
@@ -11,6 +11,9 @@
obj-spl-$(CONFIG_ROCKCHIP_BROM_HELPER) += bootrom.o save_boot_param.o
obj-tpl-$(CONFIG_ROCKCHIP_BROM_HELPER) += bootrom.o save_boot_param.o
+obj-$(CONFIG_ROCKCHIP_RK3066) += sysreset-common.o
+obj-$(CONFIG_ROCKCHIP_RK3188) += sysreset-common.o
+
obj-tpl-$(CONFIG_ROCKCHIP_RK3066) += rk3066-board-tpl.o
obj-tpl-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board-tpl.o
obj-tpl-$(CONFIG_ROCKCHIP_RK3368) += rk3368-board-tpl.o
new file mode 100644
@@ -0,0 +1,39 @@
+/*
+ * (C) Copyright 2017 Paweł Jarosz <paweljarosz3691@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <sysreset.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/sysreset_common.h>
+#include <linux/err.h>
+
+int rockchip_sysreset_request(struct rockchip_sysreset_data *data,
+ enum sysreset_t type)
+{
+ switch (type) {
+ case SYSRESET_WARM:
+ /*
+ * warm-reset keeps the remap value,
+ * so make sure it's disabled.
+ */
+ rk_clrsetreg(data->grf_soc_con0,
+ data->noc_remap_mask, 0);
+
+ rk_clrreg(data->cru_mode_con, 0xffff);
+ writel(0xeca8, data->cru_glb_srst_snd_value);
+ break;
+ case SYSRESET_COLD:
+ rk_clrreg(data->cru_mode_con, 0xffff);
+ writel(0xfdb9, data->cru_glb_srst_fst_value);
+ break;
+ default:
+ return -EPROTONOSUPPORT;
+ }
+
+ return -EINPROGRESS;
+}
@@ -14,40 +14,28 @@
#include <asm/arch/cru_rk3066.h>
#include <asm/arch/grf_rk3066.h>
#include <asm/arch/hardware.h>
+#include <asm/arch/sysreset_common.h>
#include <linux/err.h>
int rk3066_sysreset_request(struct udevice *dev, enum sysreset_t type)
{
struct rk3066_cru *cru = rockchip_get_cru();
- struct rk3066_grf *grf;
+ struct rk3066_grf *grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+ struct rockchip_sysreset_data data = {
+ .grf_soc_con0 = &grf->soc_con0,
+ .noc_remap_mask = NOC_REMAP_MASK,
+ .cru_mode_con = &cru->cru_mode_con,
+ .cru_glb_srst_snd_value = &cru->cru_glb_srst_snd_value,
+ .cru_glb_srst_fst_value = &cru->cru_glb_srst_fst_value
+ };
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, 0 << NOC_REMAP_SHIFT);
-
- rk_clrreg(&cru->cru_mode_con, 0xffff);
- writel(0xeca8, &cru->cru_glb_srst_snd_value);
- break;
- case SYSRESET_COLD:
- rk_clrreg(&cru->cru_mode_con, 0xffff);
- writel(0xfdb9, &cru->cru_glb_srst_fst_value);
- break;
- default:
+ if (IS_ERR(grf))
return -EPROTONOSUPPORT;
- }
- return -EINPROGRESS;
+ return rockchip_sysreset_request(&data, type);
}
static struct sysreset_ops rk3066_sysreset = {
@@ -14,41 +14,28 @@
#include <asm/arch/cru_rk3188.h>
#include <asm/arch/grf_rk3188.h>
#include <asm/arch/hardware.h>
+#include <asm/arch/sysreset_common.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;
+ struct rk3188_grf *grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+ struct rockchip_sysreset_data data = {
+ .grf_soc_con0 = &grf->soc_con0,
+ .noc_remap_mask = NOC_REMAP_MASK,
+ .cru_mode_con = &cru->cru_mode_con,
+ .cru_glb_srst_snd_value = &cru->cru_glb_srst_snd_value,
+ .cru_glb_srst_fst_value = &cru->cru_glb_srst_fst_value
+ };
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;
- case SYSRESET_COLD:
- rk_clrreg(&cru->cru_mode_con, 0xffff);
- writel(0xfdb9, &cru->cru_glb_srst_fst_value);
- break;
- default:
+ if (IS_ERR(grf))
return -EPROTONOSUPPORT;
- }
- return -EINPROGRESS;
+ return rockchip_sysreset_request(&data, type);
}
static struct sysreset_ops rk3188_sysreset = {
Sysreset drivers for rk3066 and rk3188 contain common elements which can be reused. Signed-off-by: Paweł Jarosz <paweljarosz3691@gmail.com> --- Changes since v1: - none Changes since v2: - none Changes since v3: - none .../include/asm/arch-rockchip/sysreset_common.h | 20 +++++++++++ arch/arm/mach-rockchip/Makefile | 3 ++ arch/arm/mach-rockchip/sysreset-common.c | 39 ++++++++++++++++++++++ drivers/sysreset/sysreset_rk3066.c | 34 ++++++------------- drivers/sysreset/sysreset_rk3188.c | 35 ++++++------------- 5 files changed, 84 insertions(+), 47 deletions(-) create mode 100644 arch/arm/include/asm/arch-rockchip/sysreset_common.h create mode 100644 arch/arm/mach-rockchip/sysreset-common.c