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