162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * AM43xx Clock domains framework
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2013 Texas Instruments, Inc.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/kernel.h>
962306a36Sopenharmony_ci#include <linux/io.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "clockdomain.h"
1262306a36Sopenharmony_ci#include "prcm44xx.h"
1362306a36Sopenharmony_ci#include "prcm43xx.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic struct clockdomain l4_cefuse_43xx_clkdm = {
1662306a36Sopenharmony_ci	.name		  = "l4_cefuse_clkdm",
1762306a36Sopenharmony_ci	.pwrdm		  = { .name = "cefuse_pwrdm" },
1862306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
1962306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_CEFUSE_INST,
2062306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_CEFUSE_CEFUSE_CDOFFS,
2162306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
2262306a36Sopenharmony_ci};
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic struct clockdomain mpu_43xx_clkdm = {
2562306a36Sopenharmony_ci	.name		  = "mpu_clkdm",
2662306a36Sopenharmony_ci	.pwrdm		  = { .name = "mpu_pwrdm" },
2762306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
2862306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_MPU_INST,
2962306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_MPU_MPU_CDOFFS,
3062306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_HWSUP_SWSUP,
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic struct clockdomain l4ls_43xx_clkdm = {
3462306a36Sopenharmony_ci	.name		  = "l4ls_clkdm",
3562306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
3662306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
3762306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
3862306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_L4LS_CDOFFS,
3962306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic struct clockdomain tamper_43xx_clkdm = {
4362306a36Sopenharmony_ci	.name		  = "tamper_clkdm",
4462306a36Sopenharmony_ci	.pwrdm		  = { .name = "tamper_pwrdm" },
4562306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
4662306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_TAMPER_INST,
4762306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_TAMPER_TAMPER_CDOFFS,
4862306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic struct clockdomain l4_rtc_43xx_clkdm = {
5262306a36Sopenharmony_ci	.name		  = "l4_rtc_clkdm",
5362306a36Sopenharmony_ci	.pwrdm		  = { .name = "rtc_pwrdm" },
5462306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
5562306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_RTC_INST,
5662306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_RTC_RTC_CDOFFS,
5762306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic struct clockdomain pruss_ocp_43xx_clkdm = {
6162306a36Sopenharmony_ci	.name		  = "pruss_ocp_clkdm",
6262306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
6362306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
6462306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
6562306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_ICSS_CDOFFS,
6662306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic struct clockdomain ocpwp_l3_43xx_clkdm = {
7062306a36Sopenharmony_ci	.name		  = "ocpwp_l3_clkdm",
7162306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
7262306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
7362306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
7462306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_OCPWP_L3_CDOFFS,
7562306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
7662306a36Sopenharmony_ci};
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic struct clockdomain l3s_tsc_43xx_clkdm = {
7962306a36Sopenharmony_ci	.name		  = "l3s_tsc_clkdm",
8062306a36Sopenharmony_ci	.pwrdm		  = { .name = "wkup_pwrdm" },
8162306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
8262306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_WKUP_INST,
8362306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_WKUP_L3S_TSC_CDOFFS,
8462306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
8562306a36Sopenharmony_ci};
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistatic struct clockdomain lcdc_43xx_clkdm = {
8862306a36Sopenharmony_ci	.name		  = "lcdc_clkdm",
8962306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
9062306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
9162306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
9262306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_LCDC_CDOFFS,
9362306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistatic struct clockdomain dss_43xx_clkdm = {
9762306a36Sopenharmony_ci	.name		  = "dss_clkdm",
9862306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
9962306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
10062306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
10162306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_DSS_CDOFFS,
10262306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic struct clockdomain l3_aon_43xx_clkdm = {
10662306a36Sopenharmony_ci	.name		  = "l3_aon_clkdm",
10762306a36Sopenharmony_ci	.pwrdm		  = { .name = "wkup_pwrdm" },
10862306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
10962306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_WKUP_INST,
11062306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_WKUP_L3_AON_CDOFFS,
11162306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cistatic struct clockdomain emif_43xx_clkdm = {
11562306a36Sopenharmony_ci	.name		  = "emif_clkdm",
11662306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
11762306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
11862306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
11962306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_EMIF_CDOFFS,
12062306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistatic struct clockdomain l4_wkup_aon_43xx_clkdm = {
12462306a36Sopenharmony_ci	.name		  = "l4_wkup_aon_clkdm",
12562306a36Sopenharmony_ci	.pwrdm		  = { .name = "wkup_pwrdm" },
12662306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
12762306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_WKUP_INST,
12862306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_WKUP_L4_WKUP_AON_CDOFFS,
12962306a36Sopenharmony_ci};
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_cistatic struct clockdomain l3_43xx_clkdm = {
13262306a36Sopenharmony_ci	.name		  = "l3_clkdm",
13362306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
13462306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
13562306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
13662306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_L3_CDOFFS,
13762306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
13862306a36Sopenharmony_ci};
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistatic struct clockdomain l4_wkup_43xx_clkdm = {
14162306a36Sopenharmony_ci	.name		  = "l4_wkup_clkdm",
14262306a36Sopenharmony_ci	.pwrdm		  = { .name = "wkup_pwrdm" },
14362306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
14462306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_WKUP_INST,
14562306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_WKUP_WKUP_CDOFFS,
14662306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_cistatic struct clockdomain cpsw_125mhz_43xx_clkdm = {
15062306a36Sopenharmony_ci	.name		  = "cpsw_125mhz_clkdm",
15162306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
15262306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
15362306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
15462306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_CPSW_CDOFFS,
15562306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
15662306a36Sopenharmony_ci};
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_cistatic struct clockdomain gfx_l3_43xx_clkdm = {
15962306a36Sopenharmony_ci	.name		  = "gfx_l3_clkdm",
16062306a36Sopenharmony_ci	.pwrdm		  = { .name = "gfx_pwrdm" },
16162306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
16262306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_GFX_INST,
16362306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_GFX_GFX_L3_CDOFFS,
16462306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
16562306a36Sopenharmony_ci};
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_cistatic struct clockdomain l3s_43xx_clkdm = {
16862306a36Sopenharmony_ci	.name		  = "l3s_clkdm",
16962306a36Sopenharmony_ci	.pwrdm		  = { .name = "per_pwrdm" },
17062306a36Sopenharmony_ci	.prcm_partition	  = AM43XX_CM_PARTITION,
17162306a36Sopenharmony_ci	.cm_inst	  = AM43XX_CM_PER_INST,
17262306a36Sopenharmony_ci	.clkdm_offs	  = AM43XX_CM_PER_L3S_CDOFFS,
17362306a36Sopenharmony_ci	.flags		  = CLKDM_CAN_SWSUP,
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistatic struct clockdomain *clockdomains_am43xx[] __initdata = {
17762306a36Sopenharmony_ci	&l4_cefuse_43xx_clkdm,
17862306a36Sopenharmony_ci	&mpu_43xx_clkdm,
17962306a36Sopenharmony_ci	&l4ls_43xx_clkdm,
18062306a36Sopenharmony_ci	&tamper_43xx_clkdm,
18162306a36Sopenharmony_ci	&l4_rtc_43xx_clkdm,
18262306a36Sopenharmony_ci	&pruss_ocp_43xx_clkdm,
18362306a36Sopenharmony_ci	&ocpwp_l3_43xx_clkdm,
18462306a36Sopenharmony_ci	&l3s_tsc_43xx_clkdm,
18562306a36Sopenharmony_ci	&lcdc_43xx_clkdm,
18662306a36Sopenharmony_ci	&dss_43xx_clkdm,
18762306a36Sopenharmony_ci	&l3_aon_43xx_clkdm,
18862306a36Sopenharmony_ci	&emif_43xx_clkdm,
18962306a36Sopenharmony_ci	&l4_wkup_aon_43xx_clkdm,
19062306a36Sopenharmony_ci	&l3_43xx_clkdm,
19162306a36Sopenharmony_ci	&l4_wkup_43xx_clkdm,
19262306a36Sopenharmony_ci	&cpsw_125mhz_43xx_clkdm,
19362306a36Sopenharmony_ci	&gfx_l3_43xx_clkdm,
19462306a36Sopenharmony_ci	&l3s_43xx_clkdm,
19562306a36Sopenharmony_ci	NULL
19662306a36Sopenharmony_ci};
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_civoid __init am43xx_clockdomains_init(void)
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	clkdm_register_platform_funcs(&am43xx_clkdm_operations);
20162306a36Sopenharmony_ci	clkdm_register_clkdms(clockdomains_am43xx);
20262306a36Sopenharmony_ci	clkdm_complete_init();
20362306a36Sopenharmony_ci}
204