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
11static 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
19enum {
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
34static 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
43static 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
52static 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
61static 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
70static 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
79static 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
88static 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
97static 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
106static 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
115static 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
124static 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
133static 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
142static 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
157static 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
164static const struct of_device_id zx296718_pm_domain_matches[] = {
165	{ .compatible = "zte,zx296718-pcu", },
166	{ },
167};
168
169static 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
177static int __init zx296718_pd_init(void)
178{
179	return platform_driver_register(&zx296718_pd_driver);
180}
181subsys_initcall(zx296718_pd_init);
182