18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2017 ZTE Ltd.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Author: Baoyou Xie <baoyou.xie@linaro.org>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <dt-bindings/soc/zte,pm_domains.h>
98c2ecf20Sopenharmony_ci#include "zx2967_pm_domains.h"
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistatic u16 zx296718_offsets[REG_ARRAY_SIZE] = {
128c2ecf20Sopenharmony_ci	[REG_CLKEN] = 0x18,
138c2ecf20Sopenharmony_ci	[REG_ISOEN] = 0x1c,
148c2ecf20Sopenharmony_ci	[REG_RSTEN] = 0x20,
158c2ecf20Sopenharmony_ci	[REG_PWREN] = 0x24,
168c2ecf20Sopenharmony_ci	[REG_ACK_SYNC] = 0x28,
178c2ecf20Sopenharmony_ci};
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cienum {
208c2ecf20Sopenharmony_ci	PCU_DM_VOU = 0,
218c2ecf20Sopenharmony_ci	PCU_DM_SAPPU,
228c2ecf20Sopenharmony_ci	PCU_DM_VDE,
238c2ecf20Sopenharmony_ci	PCU_DM_VCE,
248c2ecf20Sopenharmony_ci	PCU_DM_HDE,
258c2ecf20Sopenharmony_ci	PCU_DM_VIU,
268c2ecf20Sopenharmony_ci	PCU_DM_USB20,
278c2ecf20Sopenharmony_ci	PCU_DM_USB21,
288c2ecf20Sopenharmony_ci	PCU_DM_USB30,
298c2ecf20Sopenharmony_ci	PCU_DM_HSIC,
308c2ecf20Sopenharmony_ci	PCU_DM_GMAC,
318c2ecf20Sopenharmony_ci	PCU_DM_TS,
328c2ecf20Sopenharmony_ci};
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain vou_domain = {
358c2ecf20Sopenharmony_ci	.dm = {
368c2ecf20Sopenharmony_ci		.name		= "vou_domain",
378c2ecf20Sopenharmony_ci	},
388c2ecf20Sopenharmony_ci	.bit = PCU_DM_VOU,
398c2ecf20Sopenharmony_ci	.polarity = PWREN,
408c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
418c2ecf20Sopenharmony_ci};
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain sappu_domain = {
448c2ecf20Sopenharmony_ci	.dm = {
458c2ecf20Sopenharmony_ci		.name		= "sappu_domain",
468c2ecf20Sopenharmony_ci	},
478c2ecf20Sopenharmony_ci	.bit = PCU_DM_SAPPU,
488c2ecf20Sopenharmony_ci	.polarity = PWREN,
498c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
508c2ecf20Sopenharmony_ci};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain vde_domain = {
538c2ecf20Sopenharmony_ci	.dm = {
548c2ecf20Sopenharmony_ci		.name		= "vde_domain",
558c2ecf20Sopenharmony_ci	},
568c2ecf20Sopenharmony_ci	.bit = PCU_DM_VDE,
578c2ecf20Sopenharmony_ci	.polarity = PWREN,
588c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain vce_domain = {
628c2ecf20Sopenharmony_ci	.dm = {
638c2ecf20Sopenharmony_ci		.name		= "vce_domain",
648c2ecf20Sopenharmony_ci	},
658c2ecf20Sopenharmony_ci	.bit = PCU_DM_VCE,
668c2ecf20Sopenharmony_ci	.polarity = PWREN,
678c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain hde_domain = {
718c2ecf20Sopenharmony_ci	.dm = {
728c2ecf20Sopenharmony_ci		.name		= "hde_domain",
738c2ecf20Sopenharmony_ci	},
748c2ecf20Sopenharmony_ci	.bit = PCU_DM_HDE,
758c2ecf20Sopenharmony_ci	.polarity = PWREN,
768c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
778c2ecf20Sopenharmony_ci};
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain viu_domain = {
808c2ecf20Sopenharmony_ci	.dm = {
818c2ecf20Sopenharmony_ci		.name		= "viu_domain",
828c2ecf20Sopenharmony_ci	},
838c2ecf20Sopenharmony_ci	.bit = PCU_DM_VIU,
848c2ecf20Sopenharmony_ci	.polarity = PWREN,
858c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
868c2ecf20Sopenharmony_ci};
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain usb20_domain = {
898c2ecf20Sopenharmony_ci	.dm = {
908c2ecf20Sopenharmony_ci		.name		= "usb20_domain",
918c2ecf20Sopenharmony_ci	},
928c2ecf20Sopenharmony_ci	.bit = PCU_DM_USB20,
938c2ecf20Sopenharmony_ci	.polarity = PWREN,
948c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
958c2ecf20Sopenharmony_ci};
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain usb21_domain = {
988c2ecf20Sopenharmony_ci	.dm = {
998c2ecf20Sopenharmony_ci		.name		= "usb21_domain",
1008c2ecf20Sopenharmony_ci	},
1018c2ecf20Sopenharmony_ci	.bit = PCU_DM_USB21,
1028c2ecf20Sopenharmony_ci	.polarity = PWREN,
1038c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
1048c2ecf20Sopenharmony_ci};
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain usb30_domain = {
1078c2ecf20Sopenharmony_ci	.dm = {
1088c2ecf20Sopenharmony_ci		.name		= "usb30_domain",
1098c2ecf20Sopenharmony_ci	},
1108c2ecf20Sopenharmony_ci	.bit = PCU_DM_USB30,
1118c2ecf20Sopenharmony_ci	.polarity = PWREN,
1128c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
1138c2ecf20Sopenharmony_ci};
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain hsic_domain = {
1168c2ecf20Sopenharmony_ci	.dm = {
1178c2ecf20Sopenharmony_ci		.name		= "hsic_domain",
1188c2ecf20Sopenharmony_ci	},
1198c2ecf20Sopenharmony_ci	.bit = PCU_DM_HSIC,
1208c2ecf20Sopenharmony_ci	.polarity = PWREN,
1218c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
1228c2ecf20Sopenharmony_ci};
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain gmac_domain = {
1258c2ecf20Sopenharmony_ci	.dm = {
1268c2ecf20Sopenharmony_ci		.name		= "gmac_domain",
1278c2ecf20Sopenharmony_ci	},
1288c2ecf20Sopenharmony_ci	.bit = PCU_DM_GMAC,
1298c2ecf20Sopenharmony_ci	.polarity = PWREN,
1308c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
1318c2ecf20Sopenharmony_ci};
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_cistatic struct zx2967_pm_domain ts_domain = {
1348c2ecf20Sopenharmony_ci	.dm = {
1358c2ecf20Sopenharmony_ci		.name		= "ts_domain",
1368c2ecf20Sopenharmony_ci	},
1378c2ecf20Sopenharmony_ci	.bit = PCU_DM_TS,
1388c2ecf20Sopenharmony_ci	.polarity = PWREN,
1398c2ecf20Sopenharmony_ci	.reg_offset = zx296718_offsets,
1408c2ecf20Sopenharmony_ci};
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_cistatic struct generic_pm_domain *zx296718_pm_domains[] = {
1438c2ecf20Sopenharmony_ci	[DM_ZX296718_VOU] = &vou_domain.dm,
1448c2ecf20Sopenharmony_ci	[DM_ZX296718_SAPPU] = &sappu_domain.dm,
1458c2ecf20Sopenharmony_ci	[DM_ZX296718_VDE] = &vde_domain.dm,
1468c2ecf20Sopenharmony_ci	[DM_ZX296718_VCE] = &vce_domain.dm,
1478c2ecf20Sopenharmony_ci	[DM_ZX296718_HDE] = &hde_domain.dm,
1488c2ecf20Sopenharmony_ci	[DM_ZX296718_VIU] = &viu_domain.dm,
1498c2ecf20Sopenharmony_ci	[DM_ZX296718_USB20] = &usb20_domain.dm,
1508c2ecf20Sopenharmony_ci	[DM_ZX296718_USB21] = &usb21_domain.dm,
1518c2ecf20Sopenharmony_ci	[DM_ZX296718_USB30] = &usb30_domain.dm,
1528c2ecf20Sopenharmony_ci	[DM_ZX296718_HSIC] = &hsic_domain.dm,
1538c2ecf20Sopenharmony_ci	[DM_ZX296718_GMAC] = &gmac_domain.dm,
1548c2ecf20Sopenharmony_ci	[DM_ZX296718_TS] = &ts_domain.dm,
1558c2ecf20Sopenharmony_ci};
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_cistatic int zx296718_pd_probe(struct platform_device *pdev)
1588c2ecf20Sopenharmony_ci{
1598c2ecf20Sopenharmony_ci	return zx2967_pd_probe(pdev,
1608c2ecf20Sopenharmony_ci			  zx296718_pm_domains,
1618c2ecf20Sopenharmony_ci			  ARRAY_SIZE(zx296718_pm_domains));
1628c2ecf20Sopenharmony_ci}
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_cistatic const struct of_device_id zx296718_pm_domain_matches[] = {
1658c2ecf20Sopenharmony_ci	{ .compatible = "zte,zx296718-pcu", },
1668c2ecf20Sopenharmony_ci	{ },
1678c2ecf20Sopenharmony_ci};
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_cistatic struct platform_driver zx296718_pd_driver = {
1708c2ecf20Sopenharmony_ci	.driver = {
1718c2ecf20Sopenharmony_ci		.name = "zx296718-powerdomain",
1728c2ecf20Sopenharmony_ci		.of_match_table = zx296718_pm_domain_matches,
1738c2ecf20Sopenharmony_ci	},
1748c2ecf20Sopenharmony_ci	.probe = zx296718_pd_probe,
1758c2ecf20Sopenharmony_ci};
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_cistatic int __init zx296718_pd_init(void)
1788c2ecf20Sopenharmony_ci{
1798c2ecf20Sopenharmony_ci	return platform_driver_register(&zx296718_pd_driver);
1808c2ecf20Sopenharmony_ci}
1818c2ecf20Sopenharmony_cisubsys_initcall(zx296718_pd_init);
182