GNU Linux-libre 4.14.332-gnu1
[releases.git] / drivers / soc / renesas / r8a7795-sysc.c
1 /*
2  * Renesas R-Car H3 System Controller
3  *
4  * Copyright (C) 2016-2017 Glider bvba
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  */
10
11 #include <linux/bug.h>
12 #include <linux/kernel.h>
13 #include <linux/sys_soc.h>
14
15 #include <dt-bindings/power/r8a7795-sysc.h>
16
17 #include "rcar-sysc.h"
18
19 static struct rcar_sysc_area r8a7795_areas[] __initdata = {
20         { "always-on",      0, 0, R8A7795_PD_ALWAYS_ON, -1, PD_ALWAYS_ON },
21         { "ca57-scu",   0x1c0, 0, R8A7795_PD_CA57_SCU,  R8A7795_PD_ALWAYS_ON,
22           PD_SCU },
23         { "ca57-cpu0",   0x80, 0, R8A7795_PD_CA57_CPU0, R8A7795_PD_CA57_SCU,
24           PD_CPU_NOCR },
25         { "ca57-cpu1",   0x80, 1, R8A7795_PD_CA57_CPU1, R8A7795_PD_CA57_SCU,
26           PD_CPU_NOCR },
27         { "ca57-cpu2",   0x80, 2, R8A7795_PD_CA57_CPU2, R8A7795_PD_CA57_SCU,
28           PD_CPU_NOCR },
29         { "ca57-cpu3",   0x80, 3, R8A7795_PD_CA57_CPU3, R8A7795_PD_CA57_SCU,
30           PD_CPU_NOCR },
31         { "ca53-scu",   0x140, 0, R8A7795_PD_CA53_SCU,  R8A7795_PD_ALWAYS_ON,
32           PD_SCU },
33         { "ca53-cpu0",  0x200, 0, R8A7795_PD_CA53_CPU0, R8A7795_PD_CA53_SCU,
34           PD_CPU_NOCR },
35         { "ca53-cpu1",  0x200, 1, R8A7795_PD_CA53_CPU1, R8A7795_PD_CA53_SCU,
36           PD_CPU_NOCR },
37         { "ca53-cpu2",  0x200, 2, R8A7795_PD_CA53_CPU2, R8A7795_PD_CA53_SCU,
38           PD_CPU_NOCR },
39         { "ca53-cpu3",  0x200, 3, R8A7795_PD_CA53_CPU3, R8A7795_PD_CA53_SCU,
40           PD_CPU_NOCR },
41         { "a3vp",       0x340, 0, R8A7795_PD_A3VP,      R8A7795_PD_ALWAYS_ON },
42         { "cr7",        0x240, 0, R8A7795_PD_CR7,       R8A7795_PD_ALWAYS_ON },
43         { "a3vc",       0x380, 0, R8A7795_PD_A3VC,      R8A7795_PD_ALWAYS_ON },
44         /* A2VC0 exists on ES1.x only */
45         { "a2vc0",      0x3c0, 0, R8A7795_PD_A2VC0,     R8A7795_PD_A3VC },
46         { "a2vc1",      0x3c0, 1, R8A7795_PD_A2VC1,     R8A7795_PD_A3VC },
47         { "3dg-a",      0x100, 0, R8A7795_PD_3DG_A,     R8A7795_PD_ALWAYS_ON },
48         { "3dg-b",      0x100, 1, R8A7795_PD_3DG_B,     R8A7795_PD_3DG_A },
49         { "3dg-c",      0x100, 2, R8A7795_PD_3DG_C,     R8A7795_PD_3DG_B },
50         { "3dg-d",      0x100, 3, R8A7795_PD_3DG_D,     R8A7795_PD_3DG_C },
51         { "3dg-e",      0x100, 4, R8A7795_PD_3DG_E,     R8A7795_PD_3DG_D },
52         { "a3ir",       0x180, 0, R8A7795_PD_A3IR,      R8A7795_PD_ALWAYS_ON },
53 };
54
55
56         /*
57          * Fixups for R-Car H3 revisions after ES1.x
58          */
59
60 static const struct soc_device_attribute r8a7795es1[] __initconst = {
61         { .soc_id = "r8a7795", .revision = "ES1.*" },
62         { /* sentinel */ }
63 };
64
65 static int __init r8a7795_sysc_init(void)
66 {
67         if (!soc_device_match(r8a7795es1))
68                 rcar_sysc_nullify(r8a7795_areas, ARRAY_SIZE(r8a7795_areas),
69                                   R8A7795_PD_A2VC0);
70
71         return 0;
72 }
73
74 const struct rcar_sysc_info r8a7795_sysc_info __initconst = {
75         .init = r8a7795_sysc_init,
76         .areas = r8a7795_areas,
77         .num_areas = ARRAY_SIZE(r8a7795_areas),
78 };