xref: /rk3399_rockchip-uboot/drivers/sysreset/sysreset_rockchip.c (revision 95f431d58ae3a713dca0834d9d9315cf9fd15491)
1116397d6SKever Yang /*
2116397d6SKever Yang  * (C) Copyright 2017 Rockchip Electronics Co., Ltd
3116397d6SKever Yang  *
4116397d6SKever Yang  * SPDX-License-Identifier:	GPL-2.0
5116397d6SKever Yang  */
6116397d6SKever Yang 
7116397d6SKever Yang #include <common.h>
8116397d6SKever Yang #include <dm.h>
9116397d6SKever Yang #include <errno.h>
10116397d6SKever Yang #include <sysreset.h>
11116397d6SKever Yang #include <asm/io.h>
12116397d6SKever Yang #include <asm/arch/clock.h>
13116397d6SKever Yang #include <linux/err.h>
14116397d6SKever Yang 
rockchip_sysreset_request(struct udevice * dev,enum sysreset_t type)15116397d6SKever Yang int rockchip_sysreset_request(struct udevice *dev, enum sysreset_t type)
16116397d6SKever Yang {
17116397d6SKever Yang 	struct sysreset_reg *offset = dev_get_priv(dev);
18*95f431d5SAndy Yan 	unsigned long cru_base = (unsigned long)dev_read_addr_ptr(dev->parent);
19116397d6SKever Yang 
20116397d6SKever Yang 	if (IS_ERR_VALUE(cru_base))
21116397d6SKever Yang 		return (int)cru_base;
22116397d6SKever Yang 
23116397d6SKever Yang 	switch (type) {
24116397d6SKever Yang 	case SYSRESET_WARM:
2539507926SKever Yang #ifdef CONFIG_ARM64
2639507926SKever Yang 		/* Rockchip 64bit SOC need fst reset for cpu reset entry */
2739507926SKever Yang 		writel(0xfdb9, cru_base + offset->glb_srst_fst_value);
2839507926SKever Yang #else
29116397d6SKever Yang 		writel(0xeca8, cru_base + offset->glb_srst_snd_value);
3039507926SKever Yang #endif
31116397d6SKever Yang 		break;
32116397d6SKever Yang 	case SYSRESET_COLD:
33116397d6SKever Yang 		writel(0xfdb9, cru_base + offset->glb_srst_fst_value);
34116397d6SKever Yang 		break;
35116397d6SKever Yang 	default:
36116397d6SKever Yang 		return -EPROTONOSUPPORT;
37116397d6SKever Yang 	}
38116397d6SKever Yang 
39116397d6SKever Yang 	return -EINPROGRESS;
40116397d6SKever Yang }
41116397d6SKever Yang 
42116397d6SKever Yang static struct sysreset_ops rockchip_sysreset = {
43116397d6SKever Yang 	.request	= rockchip_sysreset_request,
44116397d6SKever Yang };
45116397d6SKever Yang 
46116397d6SKever Yang U_BOOT_DRIVER(sysreset_rockchip) = {
47116397d6SKever Yang 	.name	= "rockchip_sysreset",
48116397d6SKever Yang 	.id	= UCLASS_SYSRESET,
49116397d6SKever Yang 	.ops	= &rockchip_sysreset,
50116397d6SKever Yang };
51