x86/xen: split off mmu_hvm.c
[linux-2.6-microblaze.git] / drivers / soc / renesas / rcar-rst.c
1 /*
2  * R-Car Gen1 RESET/WDT, R-Car Gen2, Gen3, and RZ/G RST Driver
3  *
4  * Copyright (C) 2016 Glider bvba
5  *
6  * This file is subject to the terms and conditions of the GNU General Public
7  * License.  See the file "COPYING" in the main directory of this archive
8  * for more details.
9  */
10
11 #include <linux/err.h>
12 #include <linux/io.h>
13 #include <linux/of_address.h>
14 #include <linux/soc/renesas/rcar-rst.h>
15
16 struct rst_config {
17         unsigned int modemr;    /* Mode Monitoring Register Offset */
18 };
19
20 static const struct rst_config rcar_rst_gen1 __initconst = {
21         .modemr = 0x20,
22 };
23
24 static const struct rst_config rcar_rst_gen2 __initconst = {
25         .modemr = 0x60,
26 };
27
28 static const struct of_device_id rcar_rst_matches[] __initconst = {
29         /* RZ/G is handled like R-Car Gen2 */
30         { .compatible = "renesas,r8a7743-rst", .data = &rcar_rst_gen2 },
31         { .compatible = "renesas,r8a7745-rst", .data = &rcar_rst_gen2 },
32         /* R-Car Gen1 */
33         { .compatible = "renesas,r8a7778-reset-wdt", .data = &rcar_rst_gen1 },
34         { .compatible = "renesas,r8a7779-reset-wdt", .data = &rcar_rst_gen1 },
35         /* R-Car Gen2 */
36         { .compatible = "renesas,r8a7790-rst", .data = &rcar_rst_gen2 },
37         { .compatible = "renesas,r8a7791-rst", .data = &rcar_rst_gen2 },
38         { .compatible = "renesas,r8a7792-rst", .data = &rcar_rst_gen2 },
39         { .compatible = "renesas,r8a7793-rst", .data = &rcar_rst_gen2 },
40         { .compatible = "renesas,r8a7794-rst", .data = &rcar_rst_gen2 },
41         /* R-Car Gen3 is handled like R-Car Gen2 */
42         { .compatible = "renesas,r8a7795-rst", .data = &rcar_rst_gen2 },
43         { .compatible = "renesas,r8a7796-rst", .data = &rcar_rst_gen2 },
44         { /* sentinel */ }
45 };
46
47 static void __iomem *rcar_rst_base __initdata;
48 static u32 saved_mode __initdata;
49
50 static int __init rcar_rst_init(void)
51 {
52         const struct of_device_id *match;
53         const struct rst_config *cfg;
54         struct device_node *np;
55         void __iomem *base;
56         int error = 0;
57
58         np = of_find_matching_node_and_match(NULL, rcar_rst_matches, &match);
59         if (!np)
60                 return -ENODEV;
61
62         base = of_iomap(np, 0);
63         if (!base) {
64                 pr_warn("%s: Cannot map regs\n", np->full_name);
65                 error = -ENOMEM;
66                 goto out_put;
67         }
68
69         rcar_rst_base = base;
70         cfg = match->data;
71         saved_mode = ioread32(base + cfg->modemr);
72
73         pr_debug("%s: MODE = 0x%08x\n", np->full_name, saved_mode);
74
75 out_put:
76         of_node_put(np);
77         return error;
78 }
79
80 int __init rcar_rst_read_mode_pins(u32 *mode)
81 {
82         int error;
83
84         if (!rcar_rst_base) {
85                 error = rcar_rst_init();
86                 if (error)
87                         return error;
88         }
89
90         *mode = saved_mode;
91         return 0;
92 }