Commit 8d9459b2cf35acb48021fd22e501a3e9469d5f7a

Authored by Vishwanath BS
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++)