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