Commit 8d9459b2cf35acb48021fd22e501a3e9469d5f7a
Committed by
Afzal Mohammed
1 parent
1c1cb20572
Exists in
master
OMAP3+: PM: voltagedomain: introduce dependent voltage domain support
There could be dependencies between various voltage domains for maintaining system performance or hardware limitation reasons like VDD<X> should be at voltage v1 when VDD<Y> is at voltage v2. This patch introduce dependent vdd information structures in the voltage layer which can be used to populate these dependencies for a voltage domain. Based on original patch from Thara. NOTE: OMAP4460 dependency table is not frozen yet, hence not added. [nm@ti.com: cleanups and squash for OMAP3,4 data] Signed-off-by: Vishwanath BS <vishwanath.bs@ti.com> Cc: Thara Gopinath <thara@ti.com> [vaibhav.bedia@ti.com: Pull in for AM33xx] Signed-off-by: Vaibhav Bedia <vaibhav.bedia@ti.com>
Showing 6 changed files with 146 additions and 0 deletions Side-by-side Diff
arch/arm/mach-omap2/omap_opp_data.h
... | ... | @@ -86,12 +86,17 @@ |
86 | 86 | |
87 | 87 | extern struct omap_volt_data omap34xx_vddmpu_volt_data[]; |
88 | 88 | extern struct omap_volt_data omap34xx_vddcore_volt_data[]; |
89 | +extern struct omap_vdd_dep_info omap34xx_vddmpu_dep_info[]; | |
89 | 90 | extern struct omap_volt_data omap36xx_vddmpu_volt_data[]; |
90 | 91 | extern struct omap_volt_data omap36xx_vddcore_volt_data[]; |
92 | +extern struct omap_vdd_dep_info omap36xx_vddmpu_dep_info[]; | |
91 | 93 | |
92 | 94 | extern struct omap_volt_data omap44xx_vdd_mpu_volt_data[]; |
93 | 95 | extern struct omap_volt_data omap44xx_vdd_iva_volt_data[]; |
94 | 96 | extern struct omap_volt_data omap44xx_vdd_core_volt_data[]; |
97 | + | |
98 | +extern struct omap_vdd_dep_info omap443x_vddmpu_dep_info[]; | |
99 | +extern struct omap_vdd_dep_info omap443x_vddiva_dep_info[]; | |
95 | 100 | |
96 | 101 | #endif /* __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H */ |
arch/arm/mach-omap2/opp3xxx_data.c
... | ... | @@ -57,6 +57,24 @@ |
57 | 57 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
58 | 58 | }; |
59 | 59 | |
60 | +/* OMAP 3430 MPU Core VDD dependency table */ | |
61 | +static struct omap_vdd_dep_volt omap34xx_vdd_mpu_core_dep_data[] = { | |
62 | + {.main_vdd_volt = OMAP3430_VDD_MPU_OPP1_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP2_UV}, | |
63 | + {.main_vdd_volt = OMAP3430_VDD_MPU_OPP2_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP2_UV}, | |
64 | + {.main_vdd_volt = OMAP3430_VDD_MPU_OPP3_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, | |
65 | + {.main_vdd_volt = OMAP3430_VDD_MPU_OPP4_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, | |
66 | + {.main_vdd_volt = OMAP3430_VDD_MPU_OPP5_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, | |
67 | +}; | |
68 | + | |
69 | +struct omap_vdd_dep_info omap34xx_vddmpu_dep_info[] = { | |
70 | + { | |
71 | + .name = "core", | |
72 | + .dep_table = omap34xx_vdd_mpu_core_dep_data, | |
73 | + .nr_dep_entries = ARRAY_SIZE(omap34xx_vdd_mpu_core_dep_data), | |
74 | + }, | |
75 | + {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | |
76 | +}; | |
77 | + | |
60 | 78 | /* 36xx */ |
61 | 79 | |
62 | 80 | /* VDD1 */ |
... | ... | @@ -148,6 +166,23 @@ |
148 | 166 | OPP_INITIALIZER("iva", false, 660000000, OMAP3630_VDD_MPU_OPP120_UV), |
149 | 167 | /* DSP OPP4 - OPP-SB */ |
150 | 168 | OPP_INITIALIZER("iva", false, 800000000, OMAP3630_VDD_MPU_OPP1G_UV), |
169 | +}; | |
170 | + | |
171 | +/* OMAP 3630 MPU Core VDD dependency table */ | |
172 | +static struct omap_vdd_dep_volt omap36xx_vdd_mpu_core_dep_data[] = { | |
173 | + {.main_vdd_volt = OMAP3630_VDD_MPU_OPP50_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP50_UV}, | |
174 | + {.main_vdd_volt = OMAP3630_VDD_MPU_OPP100_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, | |
175 | + {.main_vdd_volt = OMAP3630_VDD_MPU_OPP120_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, | |
176 | + {.main_vdd_volt = OMAP3630_VDD_MPU_OPP1G_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, | |
177 | +}; | |
178 | + | |
179 | +struct omap_vdd_dep_info omap36xx_vddmpu_dep_info[] = { | |
180 | + { | |
181 | + .name = "core", | |
182 | + .dep_table = omap36xx_vdd_mpu_core_dep_data, | |
183 | + .nr_dep_entries = ARRAY_SIZE(omap36xx_vdd_mpu_core_dep_data), | |
184 | + }, | |
185 | + {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | |
151 | 186 | }; |
152 | 187 | |
153 | 188 | /** |
arch/arm/mach-omap2/opp4xxx_data.c
... | ... | @@ -64,6 +64,47 @@ |
64 | 64 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
65 | 65 | }; |
66 | 66 | |
67 | +/* Dependency of domains are as follows for OMAP4430 (OPP based): | |
68 | + * | |
69 | + * MPU IVA CORE | |
70 | + * 50 50 50+ | |
71 | + * 50 100+ 100 | |
72 | + * 100+ 50 100 | |
73 | + * 100+ 100+ 100 | |
74 | + */ | |
75 | + | |
76 | +/* OMAP 4430 MPU Core VDD dependency table */ | |
77 | +static struct omap_vdd_dep_volt omap443x_vdd_mpu_core_dep_data[] = { | |
78 | + {.main_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV, .dep_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV}, | |
79 | + {.main_vdd_volt = OMAP4430_VDD_MPU_OPP100_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | |
80 | + {.main_vdd_volt = OMAP4430_VDD_MPU_OPPTURBO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | |
81 | + {.main_vdd_volt = OMAP4430_VDD_MPU_OPPNITRO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | |
82 | +}; | |
83 | + | |
84 | +struct omap_vdd_dep_info omap443x_vddmpu_dep_info[] = { | |
85 | + { | |
86 | + .name = "core", | |
87 | + .dep_table = omap443x_vdd_mpu_core_dep_data, | |
88 | + .nr_dep_entries = ARRAY_SIZE(omap443x_vdd_mpu_core_dep_data), | |
89 | + }, | |
90 | + {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | |
91 | +}; | |
92 | + | |
93 | +/* OMAP 4430 MPU IVA VDD dependency table */ | |
94 | +static struct omap_vdd_dep_volt omap443x_vdd_iva_core_dep_data[] = { | |
95 | + {.main_vdd_volt = OMAP4430_VDD_IVA_OPP50_UV, .dep_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV}, | |
96 | + {.main_vdd_volt = OMAP4430_VDD_IVA_OPP100_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | |
97 | + {.main_vdd_volt = OMAP4430_VDD_IVA_OPPTURBO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | |
98 | +}; | |
99 | + | |
100 | +struct omap_vdd_dep_info omap443x_vddiva_dep_info[] = { | |
101 | + { | |
102 | + .name = "core", | |
103 | + .dep_table = omap443x_vdd_iva_core_dep_data, | |
104 | + .nr_dep_entries = ARRAY_SIZE(omap443x_vdd_iva_core_dep_data), | |
105 | + }, | |
106 | + {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | |
107 | +}; | |
67 | 108 | |
68 | 109 | static struct omap_opp_def __initdata omap44xx_opp_def_list[] = { |
69 | 110 | /* MPU OPP1 - OPP50 */ |
arch/arm/mach-omap2/voltage.h
... | ... | @@ -33,6 +33,8 @@ |
33 | 33 | #define OMAP3_VOLTOFFSET 0xff |
34 | 34 | #define OMAP3_VOLTSETUP2 0xff |
35 | 35 | |
36 | +struct omap_vdd_info; | |
37 | + | |
36 | 38 | /** |
37 | 39 | * struct omap_vfsm_instance - per-voltage manager FSM register/bitfield |
38 | 40 | * data |
... | ... | @@ -88,6 +90,8 @@ |
88 | 90 | |
89 | 91 | u32 nominal_volt; |
90 | 92 | struct omap_volt_data *volt_data; |
93 | + struct omap_vdd_info *vdd; | |
94 | + struct dentry *debug_dir; | |
91 | 95 | }; |
92 | 96 | |
93 | 97 | /** |
... | ... | @@ -142,6 +146,48 @@ |
142 | 146 | u8 i2c_mcode; |
143 | 147 | unsigned long (*vsel_to_uv) (const u8 vsel); |
144 | 148 | u8 (*uv_to_vsel) (unsigned long uV); |
149 | +}; | |
150 | + | |
151 | +/** | |
152 | + * struct omap_vdd_dep_volt - Map table for voltage dependencies | |
153 | + * @main_vdd_volt : The main vdd voltage | |
154 | + * @dep_vdd_volt : The voltage at which the dependent vdd should be | |
155 | + * when the main vdd is at <main_vdd_volt> voltage | |
156 | + * | |
157 | + * Table containing the parent vdd voltage and the dependent vdd voltage | |
158 | + * corresponding to it. | |
159 | + */ | |
160 | +struct omap_vdd_dep_volt { | |
161 | + u32 main_vdd_volt; | |
162 | + u32 dep_vdd_volt; | |
163 | +}; | |
164 | + | |
165 | +/** | |
166 | + * struct omap_vdd_dep_info - Dependent vdd info | |
167 | + * @name : Dependent vdd name | |
168 | + * @_dep_voltdm : internal structure meant to prevent multiple lookups | |
169 | + * @dep_table : Table containing the dependent vdd voltage | |
170 | + * corresponding to every main vdd voltage. | |
171 | + * @nr_dep_entries : number of dependency voltage entries | |
172 | + */ | |
173 | +struct omap_vdd_dep_info { | |
174 | + char *name; | |
175 | + struct voltagedomain *_dep_voltdm; | |
176 | + struct omap_vdd_dep_volt *dep_table; | |
177 | + int nr_dep_entries; | |
178 | +}; | |
179 | + | |
180 | +/** | |
181 | + * omap_vdd_info - Per Voltage Domain info | |
182 | + * | |
183 | + * @volt_data : voltage table having the distinct voltages supported | |
184 | + * by the domain and other associated per voltage data. | |
185 | + * @dep_vdd_info : Array ending with a 0 terminator for dependency | |
186 | + * voltage information. | |
187 | + */ | |
188 | +struct omap_vdd_info { | |
189 | + struct omap_volt_data *volt_data; | |
190 | + struct omap_vdd_dep_info *dep_vdd_info; | |
145 | 191 | }; |
146 | 192 | |
147 | 193 | void omap_voltage_get_volttable(struct voltagedomain *voltdm, |
arch/arm/mach-omap2/voltagedomains3xxx_data.c
... | ... | @@ -36,6 +36,8 @@ |
36 | 36 | .voltsetup_mask = OMAP3430_SETUP_TIME1_MASK, |
37 | 37 | }; |
38 | 38 | |
39 | +static struct omap_vdd_info omap3_vdd1_info; | |
40 | + | |
39 | 41 | static const struct omap_vfsm_instance omap3_vdd2_vfsm = { |
40 | 42 | .voltsetup_reg = OMAP3_PRM_VOLTSETUP1_OFFSET, |
41 | 43 | .voltsetup_mask = OMAP3430_SETUP_TIME2_MASK, |
42 | 44 | |
... | ... | @@ -50,8 +52,11 @@ |
50 | 52 | .vc = &omap3_vc_mpu, |
51 | 53 | .vfsm = &omap3_vdd1_vfsm, |
52 | 54 | .vp = &omap3_vp_mpu, |
55 | + .vdd = &omap3_vdd1_info, | |
53 | 56 | }; |
54 | 57 | |
58 | +static struct omap_vdd_info omap3_vdd2_info; | |
59 | + | |
55 | 60 | static struct voltagedomain omap3_voltdm_core = { |
56 | 61 | .name = "core", |
57 | 62 | .scalable = true, |
... | ... | @@ -61,6 +66,7 @@ |
61 | 66 | .vc = &omap3_vc_core, |
62 | 67 | .vfsm = &omap3_vdd2_vfsm, |
63 | 68 | .vp = &omap3_vp_core, |
69 | + .vdd = &omap3_vdd2_info, | |
64 | 70 | }; |
65 | 71 | |
66 | 72 | static struct voltagedomain omap3_voltdm_wkup = { |
67 | 73 | |
... | ... | @@ -88,9 +94,11 @@ |
88 | 94 | if (cpu_is_omap3630()) { |
89 | 95 | omap3_voltdm_mpu.volt_data = omap36xx_vddmpu_volt_data; |
90 | 96 | omap3_voltdm_core.volt_data = omap36xx_vddcore_volt_data; |
97 | + omap3_vdd1_info.dep_vdd_info = omap36xx_vddmpu_dep_info; | |
91 | 98 | } else { |
92 | 99 | omap3_voltdm_mpu.volt_data = omap34xx_vddmpu_volt_data; |
93 | 100 | omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data; |
101 | + omap3_vdd1_info.dep_vdd_info = omap34xx_vddmpu_dep_info; | |
94 | 102 | } |
95 | 103 | |
96 | 104 | for (i = 0; voltdm = voltagedomains_omap3[i], voltdm; i++) |
arch/arm/mach-omap2/voltagedomains44xx_data.c
... | ... | @@ -35,14 +35,18 @@ |
35 | 35 | static const struct omap_vfsm_instance omap4_vdd_mpu_vfsm = { |
36 | 36 | .voltsetup_reg = OMAP4_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET, |
37 | 37 | }; |
38 | +static struct omap_vdd_info omap4_vdd_mpu_info; | |
38 | 39 | |
40 | + | |
39 | 41 | static const struct omap_vfsm_instance omap4_vdd_iva_vfsm = { |
40 | 42 | .voltsetup_reg = OMAP4_PRM_VOLTSETUP_IVA_RET_SLEEP_OFFSET, |
41 | 43 | }; |
44 | +static struct omap_vdd_info omap4_vdd_iva_info; | |
42 | 45 | |
43 | 46 | static const struct omap_vfsm_instance omap4_vdd_core_vfsm = { |
44 | 47 | .voltsetup_reg = OMAP4_PRM_VOLTSETUP_CORE_RET_SLEEP_OFFSET, |
45 | 48 | }; |
49 | +static struct omap_vdd_info omap4_vdd_core_info; | |
46 | 50 | |
47 | 51 | static struct voltagedomain omap4_voltdm_mpu = { |
48 | 52 | .name = "mpu", |
... | ... | @@ -53,6 +57,7 @@ |
53 | 57 | .vc = &omap4_vc_mpu, |
54 | 58 | .vfsm = &omap4_vdd_mpu_vfsm, |
55 | 59 | .vp = &omap4_vp_mpu, |
60 | + .vdd = &omap4_vdd_mpu_info, | |
56 | 61 | }; |
57 | 62 | |
58 | 63 | static struct voltagedomain omap4_voltdm_iva = { |
... | ... | @@ -64,6 +69,7 @@ |
64 | 69 | .vc = &omap4_vc_iva, |
65 | 70 | .vfsm = &omap4_vdd_iva_vfsm, |
66 | 71 | .vp = &omap4_vp_iva, |
72 | + .vdd = &omap4_vdd_iva_info, | |
67 | 73 | }; |
68 | 74 | |
69 | 75 | static struct voltagedomain omap4_voltdm_core = { |
... | ... | @@ -75,6 +81,7 @@ |
75 | 81 | .vc = &omap4_vc_core, |
76 | 82 | .vfsm = &omap4_vdd_core_vfsm, |
77 | 83 | .vp = &omap4_vp_core, |
84 | + .vdd = &omap4_vdd_core_info, | |
78 | 85 | }; |
79 | 86 | |
80 | 87 | static struct voltagedomain omap4_voltdm_wkup = { |
81 | 88 | |
... | ... | @@ -101,7 +108,11 @@ |
101 | 108 | * for the currently-running IC |
102 | 109 | */ |
103 | 110 | omap4_voltdm_mpu.volt_data = omap44xx_vdd_mpu_volt_data; |
111 | + omap4_vdd_mpu_info.dep_vdd_info = omap443x_vddmpu_dep_info; | |
112 | + | |
104 | 113 | omap4_voltdm_iva.volt_data = omap44xx_vdd_iva_volt_data; |
114 | + omap4_vdd_iva_info.dep_vdd_info = omap443x_vddiva_dep_info; | |
115 | + | |
105 | 116 | omap4_voltdm_core.volt_data = omap44xx_vdd_core_volt_data; |
106 | 117 | |
107 | 118 | for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++) |