1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * AM43xx Power domains framework
4  *
5  * Copyright (C) 2013 Texas Instruments, Inc.
6  */
7 
8 #include <linux/kernel.h>
9 #include <linux/init.h>
10 
11 #include "powerdomain.h"
12 
13 #include "prcm-common.h"
14 #include "prcm44xx.h"
15 #include "prcm43xx.h"
16 
17 static struct powerdomain gfx_43xx_pwrdm = {
18 	.name		  = "gfx_pwrdm",
19 	.voltdm		  = { .name = "core" },
20 	.prcm_offs	  = AM43XX_PRM_GFX_INST,
21 	.prcm_partition	  = AM43XX_PRM_PARTITION,
22 	.pwrsts		  = PWRSTS_OFF_ON,
23 	.banks		  = 1,
24 	.pwrsts_mem_on	= {
25 		[0] = PWRSTS_ON,	/* gfx_mem */
26 	},
27 	.flags		  = PWRDM_HAS_LOWPOWERSTATECHANGE,
28 };
29 
30 static struct powerdomain mpu_43xx_pwrdm = {
31 	.name		  = "mpu_pwrdm",
32 	.voltdm		  = { .name = "mpu" },
33 	.prcm_offs	  = AM43XX_PRM_MPU_INST,
34 	.prcm_partition	  = AM43XX_PRM_PARTITION,
35 	.pwrsts		  = PWRSTS_OFF_RET_ON,
36 	.pwrsts_logic_ret = PWRSTS_OFF_RET,
37 	.banks		  = 3,
38 	.pwrsts_mem_ret	= {
39 		[0] = PWRSTS_OFF_RET,	/* mpu_l1 */
40 		[1] = PWRSTS_OFF_RET,	/* mpu_l2 */
41 		[2] = PWRSTS_OFF_RET,	/* mpu_ram */
42 	},
43 	.pwrsts_mem_on	= {
44 		[0] = PWRSTS_ON,	/* mpu_l1 */
45 		[1] = PWRSTS_ON,	/* mpu_l2 */
46 		[2] = PWRSTS_ON,	/* mpu_ram */
47 	},
48 	.flags		  = PWRDM_HAS_LOWPOWERSTATECHANGE,
49 };
50 
51 static struct powerdomain rtc_43xx_pwrdm = {
52 	.name		  = "rtc_pwrdm",
53 	.voltdm		  = { .name = "rtc" },
54 	.prcm_offs	  = AM43XX_PRM_RTC_INST,
55 	.prcm_partition	  = AM43XX_PRM_PARTITION,
56 	.pwrsts		  = PWRSTS_ON,
57 };
58 
59 static struct powerdomain wkup_43xx_pwrdm = {
60 	.name		  = "wkup_pwrdm",
61 	.voltdm		  = { .name = "core" },
62 	.prcm_offs	  = AM43XX_PRM_WKUP_INST,
63 	.prcm_partition	  = AM43XX_PRM_PARTITION,
64 	.pwrsts		  = PWRSTS_ON,
65 	.banks		  = 1,
66 	.pwrsts_mem_on	= {
67 		[0] = PWRSTS_ON,	/* debugss_mem */
68 	},
69 };
70 
71 static struct powerdomain tamper_43xx_pwrdm = {
72 	.name		  = "tamper_pwrdm",
73 	.voltdm		  = { .name = "tamper" },
74 	.prcm_offs	  = AM43XX_PRM_TAMPER_INST,
75 	.prcm_partition	  = AM43XX_PRM_PARTITION,
76 	.pwrsts		  = PWRSTS_ON,
77 };
78 
79 static struct powerdomain cefuse_43xx_pwrdm = {
80 	.name		  = "cefuse_pwrdm",
81 	.voltdm		  = { .name = "core" },
82 	.prcm_offs	  = AM43XX_PRM_CEFUSE_INST,
83 	.prcm_partition	  = AM43XX_PRM_PARTITION,
84 	.pwrsts		  = PWRSTS_OFF_ON,
85 	.flags		  = PWRDM_HAS_LOWPOWERSTATECHANGE,
86 };
87 
88 static struct powerdomain per_43xx_pwrdm = {
89 	.name		  = "per_pwrdm",
90 	.voltdm		  = { .name = "core" },
91 	.prcm_offs	  = AM43XX_PRM_PER_INST,
92 	.prcm_partition	  = AM43XX_PRM_PARTITION,
93 	.pwrsts		  = PWRSTS_OFF_RET_ON,
94 	.pwrsts_logic_ret = PWRSTS_OFF_RET,
95 	.banks		  = 4,
96 	.pwrsts_mem_ret	= {
97 		[0] = PWRSTS_OFF_RET,	/* icss_mem */
98 		[1] = PWRSTS_OFF_RET,	/* per_mem */
99 		[2] = PWRSTS_OFF_RET,	/* ram1_mem */
100 		[3] = PWRSTS_OFF_RET,	/* ram2_mem */
101 	},
102 	.pwrsts_mem_on	= {
103 		[0] = PWRSTS_ON,	/* icss_mem */
104 		[1] = PWRSTS_ON,	/* per_mem */
105 		[2] = PWRSTS_ON,	/* ram1_mem */
106 		[3] = PWRSTS_ON,	/* ram2_mem */
107 	},
108 	.flags		  = PWRDM_HAS_LOWPOWERSTATECHANGE,
109 };
110 
111 static struct powerdomain *powerdomains_am43xx[] __initdata = {
112 	&gfx_43xx_pwrdm,
113 	&mpu_43xx_pwrdm,
114 	&rtc_43xx_pwrdm,
115 	&wkup_43xx_pwrdm,
116 	&tamper_43xx_pwrdm,
117 	&cefuse_43xx_pwrdm,
118 	&per_43xx_pwrdm,
119 	NULL
120 };
121 
am43xx_check_vcvp(void)122 static int am43xx_check_vcvp(void)
123 {
124 	return 0;
125 }
126 
am43xx_powerdomains_init(void)127 void __init am43xx_powerdomains_init(void)
128 {
129 	omap4_pwrdm_operations.pwrdm_has_voltdm = am43xx_check_vcvp;
130 	pwrdm_register_platform_funcs(&omap4_pwrdm_operations);
131 	pwrdm_register_pwrdms(powerdomains_am43xx);
132 	pwrdm_complete_init();
133 }
134