| // SPDX-License-Identifier: GPL-2.0-only | 
 | /* | 
 |  * AM43xx Power domains framework | 
 |  * | 
 |  * Copyright (C) 2013 Texas Instruments, Inc. | 
 |  */ | 
 |  | 
 | #include <linux/kernel.h> | 
 | #include <linux/init.h> | 
 |  | 
 | #include "powerdomain.h" | 
 |  | 
 | #include "prcm-common.h" | 
 | #include "prcm44xx.h" | 
 | #include "prcm43xx.h" | 
 |  | 
 | static struct powerdomain gfx_43xx_pwrdm = { | 
 | 	.name		  = "gfx_pwrdm", | 
 | 	.voltdm		  = { .name = "core" }, | 
 | 	.prcm_offs	  = AM43XX_PRM_GFX_INST, | 
 | 	.prcm_partition	  = AM43XX_PRM_PARTITION, | 
 | 	.pwrsts		  = PWRSTS_OFF_ON, | 
 | 	.banks		  = 1, | 
 | 	.pwrsts_mem_on	= { | 
 | 		[0] = PWRSTS_ON,	/* gfx_mem */ | 
 | 	}, | 
 | 	.flags		  = PWRDM_HAS_LOWPOWERSTATECHANGE, | 
 | }; | 
 |  | 
 | static struct powerdomain mpu_43xx_pwrdm = { | 
 | 	.name		  = "mpu_pwrdm", | 
 | 	.voltdm		  = { .name = "mpu" }, | 
 | 	.prcm_offs	  = AM43XX_PRM_MPU_INST, | 
 | 	.prcm_partition	  = AM43XX_PRM_PARTITION, | 
 | 	.pwrsts		  = PWRSTS_OFF_RET_ON, | 
 | 	.pwrsts_logic_ret = PWRSTS_OFF_RET, | 
 | 	.banks		  = 3, | 
 | 	.pwrsts_mem_ret	= { | 
 | 		[0] = PWRSTS_OFF_RET,	/* mpu_l1 */ | 
 | 		[1] = PWRSTS_OFF_RET,	/* mpu_l2 */ | 
 | 		[2] = PWRSTS_OFF_RET,	/* mpu_ram */ | 
 | 	}, | 
 | 	.pwrsts_mem_on	= { | 
 | 		[0] = PWRSTS_ON,	/* mpu_l1 */ | 
 | 		[1] = PWRSTS_ON,	/* mpu_l2 */ | 
 | 		[2] = PWRSTS_ON,	/* mpu_ram */ | 
 | 	}, | 
 | 	.flags		  = PWRDM_HAS_LOWPOWERSTATECHANGE, | 
 | }; | 
 |  | 
 | static struct powerdomain rtc_43xx_pwrdm = { | 
 | 	.name		  = "rtc_pwrdm", | 
 | 	.voltdm		  = { .name = "rtc" }, | 
 | 	.prcm_offs	  = AM43XX_PRM_RTC_INST, | 
 | 	.prcm_partition	  = AM43XX_PRM_PARTITION, | 
 | 	.pwrsts		  = PWRSTS_ON, | 
 | }; | 
 |  | 
 | static struct powerdomain wkup_43xx_pwrdm = { | 
 | 	.name		  = "wkup_pwrdm", | 
 | 	.voltdm		  = { .name = "core" }, | 
 | 	.prcm_offs	  = AM43XX_PRM_WKUP_INST, | 
 | 	.prcm_partition	  = AM43XX_PRM_PARTITION, | 
 | 	.pwrsts		  = PWRSTS_ON, | 
 | 	.banks		  = 1, | 
 | 	.pwrsts_mem_on	= { | 
 | 		[0] = PWRSTS_ON,	/* debugss_mem */ | 
 | 	}, | 
 | }; | 
 |  | 
 | static struct powerdomain tamper_43xx_pwrdm = { | 
 | 	.name		  = "tamper_pwrdm", | 
 | 	.voltdm		  = { .name = "tamper" }, | 
 | 	.prcm_offs	  = AM43XX_PRM_TAMPER_INST, | 
 | 	.prcm_partition	  = AM43XX_PRM_PARTITION, | 
 | 	.pwrsts		  = PWRSTS_ON, | 
 | }; | 
 |  | 
 | static struct powerdomain cefuse_43xx_pwrdm = { | 
 | 	.name		  = "cefuse_pwrdm", | 
 | 	.voltdm		  = { .name = "core" }, | 
 | 	.prcm_offs	  = AM43XX_PRM_CEFUSE_INST, | 
 | 	.prcm_partition	  = AM43XX_PRM_PARTITION, | 
 | 	.pwrsts		  = PWRSTS_OFF_ON, | 
 | 	.flags		  = PWRDM_HAS_LOWPOWERSTATECHANGE, | 
 | }; | 
 |  | 
 | static struct powerdomain per_43xx_pwrdm = { | 
 | 	.name		  = "per_pwrdm", | 
 | 	.voltdm		  = { .name = "core" }, | 
 | 	.prcm_offs	  = AM43XX_PRM_PER_INST, | 
 | 	.prcm_partition	  = AM43XX_PRM_PARTITION, | 
 | 	.pwrsts		  = PWRSTS_OFF_RET_ON, | 
 | 	.pwrsts_logic_ret = PWRSTS_OFF_RET, | 
 | 	.banks		  = 4, | 
 | 	.pwrsts_mem_ret	= { | 
 | 		[0] = PWRSTS_OFF_RET,	/* icss_mem */ | 
 | 		[1] = PWRSTS_OFF_RET,	/* per_mem */ | 
 | 		[2] = PWRSTS_OFF_RET,	/* ram1_mem */ | 
 | 		[3] = PWRSTS_OFF_RET,	/* ram2_mem */ | 
 | 	}, | 
 | 	.pwrsts_mem_on	= { | 
 | 		[0] = PWRSTS_ON,	/* icss_mem */ | 
 | 		[1] = PWRSTS_ON,	/* per_mem */ | 
 | 		[2] = PWRSTS_ON,	/* ram1_mem */ | 
 | 		[3] = PWRSTS_ON,	/* ram2_mem */ | 
 | 	}, | 
 | 	.flags		  = PWRDM_HAS_LOWPOWERSTATECHANGE, | 
 | }; | 
 |  | 
 | static struct powerdomain *powerdomains_am43xx[] __initdata = { | 
 | 	&gfx_43xx_pwrdm, | 
 | 	&mpu_43xx_pwrdm, | 
 | 	&rtc_43xx_pwrdm, | 
 | 	&wkup_43xx_pwrdm, | 
 | 	&tamper_43xx_pwrdm, | 
 | 	&cefuse_43xx_pwrdm, | 
 | 	&per_43xx_pwrdm, | 
 | 	NULL | 
 | }; | 
 |  | 
 | static int am43xx_check_vcvp(void) | 
 | { | 
 | 	return 0; | 
 | } | 
 |  | 
 | void __init am43xx_powerdomains_init(void) | 
 | { | 
 | 	omap4_pwrdm_operations.pwrdm_has_voltdm = am43xx_check_vcvp; | 
 | 	pwrdm_register_platform_funcs(&omap4_pwrdm_operations); | 
 | 	pwrdm_register_pwrdms(powerdomains_am43xx); | 
 | 	pwrdm_complete_init(); | 
 | } |