GNU Linux-libre 5.10.219-gnu1
[releases.git] / drivers / soc / zte / zx296718_pm_domains.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2017 ZTE Ltd.
4  *
5  * Author: Baoyou Xie <baoyou.xie@linaro.org>
6  */
7
8 #include <dt-bindings/soc/zte,pm_domains.h>
9 #include "zx2967_pm_domains.h"
10
11 static u16 zx296718_offsets[REG_ARRAY_SIZE] = {
12         [REG_CLKEN] = 0x18,
13         [REG_ISOEN] = 0x1c,
14         [REG_RSTEN] = 0x20,
15         [REG_PWREN] = 0x24,
16         [REG_ACK_SYNC] = 0x28,
17 };
18
19 enum {
20         PCU_DM_VOU = 0,
21         PCU_DM_SAPPU,
22         PCU_DM_VDE,
23         PCU_DM_VCE,
24         PCU_DM_HDE,
25         PCU_DM_VIU,
26         PCU_DM_USB20,
27         PCU_DM_USB21,
28         PCU_DM_USB30,
29         PCU_DM_HSIC,
30         PCU_DM_GMAC,
31         PCU_DM_TS,
32 };
33
34 static struct zx2967_pm_domain vou_domain = {
35         .dm = {
36                 .name           = "vou_domain",
37         },
38         .bit = PCU_DM_VOU,
39         .polarity = PWREN,
40         .reg_offset = zx296718_offsets,
41 };
42
43 static struct zx2967_pm_domain sappu_domain = {
44         .dm = {
45                 .name           = "sappu_domain",
46         },
47         .bit = PCU_DM_SAPPU,
48         .polarity = PWREN,
49         .reg_offset = zx296718_offsets,
50 };
51
52 static struct zx2967_pm_domain vde_domain = {
53         .dm = {
54                 .name           = "vde_domain",
55         },
56         .bit = PCU_DM_VDE,
57         .polarity = PWREN,
58         .reg_offset = zx296718_offsets,
59 };
60
61 static struct zx2967_pm_domain vce_domain = {
62         .dm = {
63                 .name           = "vce_domain",
64         },
65         .bit = PCU_DM_VCE,
66         .polarity = PWREN,
67         .reg_offset = zx296718_offsets,
68 };
69
70 static struct zx2967_pm_domain hde_domain = {
71         .dm = {
72                 .name           = "hde_domain",
73         },
74         .bit = PCU_DM_HDE,
75         .polarity = PWREN,
76         .reg_offset = zx296718_offsets,
77 };
78
79 static struct zx2967_pm_domain viu_domain = {
80         .dm = {
81                 .name           = "viu_domain",
82         },
83         .bit = PCU_DM_VIU,
84         .polarity = PWREN,
85         .reg_offset = zx296718_offsets,
86 };
87
88 static struct zx2967_pm_domain usb20_domain = {
89         .dm = {
90                 .name           = "usb20_domain",
91         },
92         .bit = PCU_DM_USB20,
93         .polarity = PWREN,
94         .reg_offset = zx296718_offsets,
95 };
96
97 static struct zx2967_pm_domain usb21_domain = {
98         .dm = {
99                 .name           = "usb21_domain",
100         },
101         .bit = PCU_DM_USB21,
102         .polarity = PWREN,
103         .reg_offset = zx296718_offsets,
104 };
105
106 static struct zx2967_pm_domain usb30_domain = {
107         .dm = {
108                 .name           = "usb30_domain",
109         },
110         .bit = PCU_DM_USB30,
111         .polarity = PWREN,
112         .reg_offset = zx296718_offsets,
113 };
114
115 static struct zx2967_pm_domain hsic_domain = {
116         .dm = {
117                 .name           = "hsic_domain",
118         },
119         .bit = PCU_DM_HSIC,
120         .polarity = PWREN,
121         .reg_offset = zx296718_offsets,
122 };
123
124 static struct zx2967_pm_domain gmac_domain = {
125         .dm = {
126                 .name           = "gmac_domain",
127         },
128         .bit = PCU_DM_GMAC,
129         .polarity = PWREN,
130         .reg_offset = zx296718_offsets,
131 };
132
133 static struct zx2967_pm_domain ts_domain = {
134         .dm = {
135                 .name           = "ts_domain",
136         },
137         .bit = PCU_DM_TS,
138         .polarity = PWREN,
139         .reg_offset = zx296718_offsets,
140 };
141
142 static struct generic_pm_domain *zx296718_pm_domains[] = {
143         [DM_ZX296718_VOU] = &vou_domain.dm,
144         [DM_ZX296718_SAPPU] = &sappu_domain.dm,
145         [DM_ZX296718_VDE] = &vde_domain.dm,
146         [DM_ZX296718_VCE] = &vce_domain.dm,
147         [DM_ZX296718_HDE] = &hde_domain.dm,
148         [DM_ZX296718_VIU] = &viu_domain.dm,
149         [DM_ZX296718_USB20] = &usb20_domain.dm,
150         [DM_ZX296718_USB21] = &usb21_domain.dm,
151         [DM_ZX296718_USB30] = &usb30_domain.dm,
152         [DM_ZX296718_HSIC] = &hsic_domain.dm,
153         [DM_ZX296718_GMAC] = &gmac_domain.dm,
154         [DM_ZX296718_TS] = &ts_domain.dm,
155 };
156
157 static int zx296718_pd_probe(struct platform_device *pdev)
158 {
159         return zx2967_pd_probe(pdev,
160                           zx296718_pm_domains,
161                           ARRAY_SIZE(zx296718_pm_domains));
162 }
163
164 static const struct of_device_id zx296718_pm_domain_matches[] = {
165         { .compatible = "zte,zx296718-pcu", },
166         { },
167 };
168
169 static struct platform_driver zx296718_pd_driver = {
170         .driver = {
171                 .name = "zx296718-powerdomain",
172                 .of_match_table = zx296718_pm_domain_matches,
173         },
174         .probe = zx296718_pd_probe,
175 };
176
177 static int __init zx296718_pd_init(void)
178 {
179         return platform_driver_register(&zx296718_pd_driver);
180 }
181 subsys_initcall(zx296718_pd_init);