Commit 8b5d8c0d718379ce29dad74b4bda8b669fc1f1c2

Authored by Tero Kristo
Committed by Kevin Hilman
1 parent b254012b21

ARM: OMAP3+: voltage: introduce omap vc / vp params for voltagedomains

These new structs will hold the sleep voltage levels (omap_vc_params)
and voltage processor min / max voltages (omap_vp_params.) Previously
these were part of the PMIC struct, but they do not really belong there,
as they are OMAP chip specific, not PMIC specific parameters. voltdm
code is also changed to use the new structs.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>

Showing 11 changed files with 147 additions and 28 deletions Side-by-side Diff

arch/arm/mach-omap2/omap_twl.c
... ... @@ -141,10 +141,6 @@
141 141 static struct omap_voltdm_pmic omap3_mpu_pmic = {
142 142 .slew_rate = 4000,
143 143 .step_size = 12500,
144   - .on_volt = 1200000,
145   - .onlp_volt = 1000000,
146   - .ret_volt = 975000,
147   - .off_volt = 600000,
148 144 .volt_setup_time = 0xfff,
149 145 .vp_erroroffset = OMAP3_VP_CONFIG_ERROROFFSET,
150 146 .vp_vstepmin = OMAP3_VP_VSTEPMIN_VSTEPMIN,
... ... @@ -162,10 +158,6 @@
162 158 static struct omap_voltdm_pmic omap3_core_pmic = {
163 159 .slew_rate = 4000,
164 160 .step_size = 12500,
165   - .on_volt = 1200000,
166   - .onlp_volt = 1000000,
167   - .ret_volt = 975000,
168   - .off_volt = 600000,
169 161 .volt_setup_time = 0xfff,
170 162 .vp_erroroffset = OMAP3_VP_CONFIG_ERROROFFSET,
171 163 .vp_vstepmin = OMAP3_VP_VSTEPMIN_VSTEPMIN,
... ... @@ -183,10 +175,6 @@
183 175 static struct omap_voltdm_pmic omap4_mpu_pmic = {
184 176 .slew_rate = 4000,
185 177 .step_size = 12660,
186   - .on_volt = 1375000,
187   - .onlp_volt = 1375000,
188   - .ret_volt = 830000,
189   - .off_volt = 0,
190 178 .volt_setup_time = 0,
191 179 .vp_erroroffset = OMAP4_VP_CONFIG_ERROROFFSET,
192 180 .vp_vstepmin = OMAP4_VP_VSTEPMIN_VSTEPMIN,
... ... @@ -205,10 +193,6 @@
205 193 static struct omap_voltdm_pmic omap4_iva_pmic = {
206 194 .slew_rate = 4000,
207 195 .step_size = 12660,
208   - .on_volt = 1188000,
209   - .onlp_volt = 1188000,
210   - .ret_volt = 830000,
211   - .off_volt = 0,
212 196 .volt_setup_time = 0,
213 197 .vp_erroroffset = OMAP4_VP_CONFIG_ERROROFFSET,
214 198 .vp_vstepmin = OMAP4_VP_VSTEPMIN_VSTEPMIN,
... ... @@ -227,10 +211,6 @@
227 211 static struct omap_voltdm_pmic omap4_core_pmic = {
228 212 .slew_rate = 4000,
229 213 .step_size = 12660,
230   - .on_volt = 1200000,
231   - .onlp_volt = 1200000,
232   - .ret_volt = 830000,
233   - .off_volt = 0,
234 214 .volt_setup_time = 0,
235 215 .vp_erroroffset = OMAP4_VP_CONFIG_ERROROFFSET,
236 216 .vp_vstepmin = OMAP4_VP_VSTEPMIN_VSTEPMIN,
arch/arm/mach-omap2/vc.c
... ... @@ -135,6 +135,8 @@
135 135 vc_cmdval |= (*target_vsel << vc->common->cmd_on_shift);
136 136 voltdm->write(vc_cmdval, vc->cmdval_reg);
137 137  
  138 + voltdm->vc_param->on = target_volt;
  139 +
138 140 omap_vp_update_errorgain(voltdm, target_volt);
139 141  
140 142 return 0;
... ... @@ -284,6 +286,30 @@
284 286 initialized = true;
285 287 }
286 288  
  289 +/**
  290 + * omap_vc_calc_vsel - calculate vsel value for a channel
  291 + * @voltdm: channel to calculate value for
  292 + * @uvolt: microvolt value to convert to vsel
  293 + *
  294 + * Converts a microvolt value to vsel value for the used PMIC.
  295 + * This checks whether the microvolt value is out of bounds, and
  296 + * adjusts the value accordingly. If unsupported value detected,
  297 + * warning is thrown.
  298 + */
  299 +static u8 omap_vc_calc_vsel(struct voltagedomain *voltdm, u32 uvolt)
  300 +{
  301 + if (voltdm->pmic->vddmin > uvolt)
  302 + uvolt = voltdm->pmic->vddmin;
  303 + if (voltdm->pmic->vddmax < uvolt) {
  304 + WARN(1, "%s: voltage not supported by pmic: %u vs max %u\n",
  305 + __func__, uvolt, voltdm->pmic->vddmax);
  306 + /* Lets try maximum value anyway */
  307 + uvolt = voltdm->pmic->vddmax;
  308 + }
  309 +
  310 + return voltdm->pmic->uv_to_vsel(uvolt);
  311 +}
  312 +
287 313 void __init omap_vc_init_channel(struct voltagedomain *voltdm)
288 314 {
289 315 struct omap_vc_channel *vc = voltdm->vc;
... ... @@ -335,10 +361,11 @@
335 361 }
336 362  
337 363 /* Set up the on, inactive, retention and off voltage */
338   - on_vsel = voltdm->pmic->uv_to_vsel(voltdm->pmic->on_volt);
339   - onlp_vsel = voltdm->pmic->uv_to_vsel(voltdm->pmic->onlp_volt);
340   - ret_vsel = voltdm->pmic->uv_to_vsel(voltdm->pmic->ret_volt);
341   - off_vsel = voltdm->pmic->uv_to_vsel(voltdm->pmic->off_volt);
  364 + on_vsel = omap_vc_calc_vsel(voltdm, voltdm->vc_param->on);
  365 + onlp_vsel = omap_vc_calc_vsel(voltdm, voltdm->vc_param->onlp);
  366 + ret_vsel = omap_vc_calc_vsel(voltdm, voltdm->vc_param->ret);
  367 + off_vsel = omap_vc_calc_vsel(voltdm, voltdm->vc_param->off);
  368 +
342 369 val = ((on_vsel << vc->common->cmd_on_shift) |
343 370 (onlp_vsel << vc->common->cmd_onlp_shift) |
344 371 (ret_vsel << vc->common->cmd_ret_shift) |
arch/arm/mach-omap2/vc.h
... ... @@ -111,6 +111,13 @@
111 111 extern struct omap_vc_channel omap4_vc_iva;
112 112 extern struct omap_vc_channel omap4_vc_core;
113 113  
  114 +extern struct omap_vc_param omap3_mpu_vc_data;
  115 +extern struct omap_vc_param omap3_core_vc_data;
  116 +
  117 +extern struct omap_vc_param omap4_mpu_vc_data;
  118 +extern struct omap_vc_param omap4_iva_vc_data;
  119 +extern struct omap_vc_param omap4_core_vc_data;
  120 +
114 121 void omap_vc_init_channel(struct voltagedomain *voltdm);
115 122 int omap_vc_pre_scale(struct voltagedomain *voltdm,
116 123 unsigned long target_volt,
arch/arm/mach-omap2/vc3xxx_data.c
... ... @@ -71,4 +71,26 @@
71 71 .smps_cmdra_mask = OMAP3430_CMDRA1_MASK,
72 72 .cfg_channel_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT,
73 73 };
  74 +
  75 +/*
  76 + * Voltage levels for different operating modes: on, sleep, retention and off
  77 + */
  78 +#define OMAP3_ON_VOLTAGE_UV 1200000
  79 +#define OMAP3_ONLP_VOLTAGE_UV 1000000
  80 +#define OMAP3_RET_VOLTAGE_UV 975000
  81 +#define OMAP3_OFF_VOLTAGE_UV 600000
  82 +
  83 +struct omap_vc_param omap3_mpu_vc_data = {
  84 + .on = OMAP3_ON_VOLTAGE_UV,
  85 + .onlp = OMAP3_ONLP_VOLTAGE_UV,
  86 + .ret = OMAP3_RET_VOLTAGE_UV,
  87 + .off = OMAP3_OFF_VOLTAGE_UV,
  88 +};
  89 +
  90 +struct omap_vc_param omap3_core_vc_data = {
  91 + .on = OMAP3_ON_VOLTAGE_UV,
  92 + .onlp = OMAP3_ONLP_VOLTAGE_UV,
  93 + .ret = OMAP3_RET_VOLTAGE_UV,
  94 + .off = OMAP3_OFF_VOLTAGE_UV,
  95 +};
arch/arm/mach-omap2/vc44xx_data.c
... ... @@ -86,4 +86,33 @@
86 86 .smps_cmdra_mask = OMAP4430_CMDRA_VDD_CORE_L_MASK,
87 87 .cfg_channel_sa_shift = OMAP4430_SA_VDD_CORE_L_SHIFT,
88 88 };
  89 +
  90 +/*
  91 + * Voltage levels for different operating modes: on, sleep, retention and off
  92 + */
  93 +#define OMAP4_ON_VOLTAGE_UV 1375000
  94 +#define OMAP4_ONLP_VOLTAGE_UV 1375000
  95 +#define OMAP4_RET_VOLTAGE_UV 837500
  96 +#define OMAP4_OFF_VOLTAGE_UV 0
  97 +
  98 +struct omap_vc_param omap4_mpu_vc_data = {
  99 + .on = OMAP4_ON_VOLTAGE_UV,
  100 + .onlp = OMAP4_ONLP_VOLTAGE_UV,
  101 + .ret = OMAP4_RET_VOLTAGE_UV,
  102 + .off = OMAP4_OFF_VOLTAGE_UV,
  103 +};
  104 +
  105 +struct omap_vc_param omap4_iva_vc_data = {
  106 + .on = OMAP4_ON_VOLTAGE_UV,
  107 + .onlp = OMAP4_ONLP_VOLTAGE_UV,
  108 + .ret = OMAP4_RET_VOLTAGE_UV,
  109 + .off = OMAP4_OFF_VOLTAGE_UV,
  110 +};
  111 +
  112 +struct omap_vc_param omap4_core_vc_data = {
  113 + .on = OMAP4_ON_VOLTAGE_UV,
  114 + .onlp = OMAP4_ONLP_VOLTAGE_UV,
  115 + .ret = OMAP4_RET_VOLTAGE_UV,
  116 + .off = OMAP4_OFF_VOLTAGE_UV,
  117 +};
arch/arm/mach-omap2/voltage.h
... ... @@ -74,6 +74,8 @@
74 74 const struct omap_vfsm_instance *vfsm;
75 75 struct omap_vp_instance *vp;
76 76 struct omap_voltdm_pmic *pmic;
  77 + struct omap_vp_param *vp_param;
  78 + struct omap_vc_param *vc_param;
77 79  
78 80 /* VC/VP register access functions: SoC specific */
79 81 u32 (*read) (u8 offset);
... ... @@ -125,10 +127,6 @@
125 127 struct omap_voltdm_pmic {
126 128 int slew_rate;
127 129 int step_size;
128   - u32 on_volt;
129   - u32 onlp_volt;
130   - u32 ret_volt;
131   - u32 off_volt;
132 130 u16 volt_setup_time;
133 131 u16 i2c_slave_addr;
134 132 u16 volt_reg_addr;
... ... @@ -143,6 +141,18 @@
143 141 u8 i2c_mcode;
144 142 unsigned long (*vsel_to_uv) (const u8 vsel);
145 143 u8 (*uv_to_vsel) (unsigned long uV);
  144 +};
  145 +
  146 +struct omap_vp_param {
  147 + u32 vddmax;
  148 + u32 vddmin;
  149 +};
  150 +
  151 +struct omap_vc_param {
  152 + u32 on;
  153 + u32 onlp;
  154 + u32 ret;
  155 + u32 off;
146 156 };
147 157  
148 158 void omap_voltage_get_volttable(struct voltagedomain *voltdm,
arch/arm/mach-omap2/voltagedomains3xxx_data.c
... ... @@ -117,6 +117,11 @@
117 117 }
118 118 #endif
119 119  
  120 + omap3_voltdm_mpu.vp_param = &omap3_mpu_vp_data;
  121 + omap3_voltdm_core.vp_param = &omap3_core_vp_data;
  122 + omap3_voltdm_mpu.vc_param = &omap3_mpu_vc_data;
  123 + omap3_voltdm_core.vc_param = &omap3_core_vc_data;
  124 +
120 125 if (soc_is_am35xx())
121 126 voltdms = voltagedomains_am35xx;
122 127 else
arch/arm/mach-omap2/voltagedomains44xx_data.c
... ... @@ -106,6 +106,14 @@
106 106 omap4_voltdm_core.volt_data = omap44xx_vdd_core_volt_data;
107 107 #endif
108 108  
  109 + omap4_voltdm_mpu.vp_param = &omap4_mpu_vp_data;
  110 + omap4_voltdm_iva.vp_param = &omap4_iva_vp_data;
  111 + omap4_voltdm_core.vp_param = &omap4_core_vp_data;
  112 +
  113 + omap4_voltdm_mpu.vc_param = &omap4_mpu_vc_data;
  114 + omap4_voltdm_iva.vc_param = &omap4_iva_vc_data;
  115 + omap4_voltdm_core.vc_param = &omap4_core_vc_data;
  116 +
109 117 for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++)
110 118 voltdm->sys_clk.name = sys_clk_name;
111 119  
arch/arm/mach-omap2/vp.h
... ... @@ -117,6 +117,13 @@
117 117 extern struct omap_vp_instance omap4_vp_iva;
118 118 extern struct omap_vp_instance omap4_vp_core;
119 119  
  120 +extern struct omap_vp_param omap3_mpu_vp_data;
  121 +extern struct omap_vp_param omap3_core_vp_data;
  122 +
  123 +extern struct omap_vp_param omap4_mpu_vp_data;
  124 +extern struct omap_vp_param omap4_iva_vp_data;
  125 +extern struct omap_vp_param omap4_core_vp_data;
  126 +
120 127 void omap_vp_init(struct voltagedomain *voltdm);
121 128 void omap_vp_enable(struct voltagedomain *voltdm);
122 129 void omap_vp_disable(struct voltagedomain *voltdm);
arch/arm/mach-omap2/vp3xxx_data.c
... ... @@ -77,4 +77,14 @@
77 77 .vstatus = OMAP3_PRM_VP2_STATUS_OFFSET,
78 78 .voltage = OMAP3_PRM_VP2_VOLTAGE_OFFSET,
79 79 };
  80 +
  81 +struct omap_vp_param omap3_mpu_vp_data = {
  82 + .vddmin = OMAP3430_VP1_VLIMITTO_VDDMIN,
  83 + .vddmax = OMAP3430_VP1_VLIMITTO_VDDMAX,
  84 +};
  85 +
  86 +struct omap_vp_param omap3_core_vp_data = {
  87 + .vddmin = OMAP3430_VP2_VLIMITTO_VDDMIN,
  88 + .vddmax = OMAP3430_VP2_VLIMITTO_VDDMAX,
  89 +};
arch/arm/mach-omap2/vp44xx_data.c
... ... @@ -87,4 +87,19 @@
87 87 .vstatus = OMAP4_PRM_VP_CORE_STATUS_OFFSET,
88 88 .voltage = OMAP4_PRM_VP_CORE_VOLTAGE_OFFSET,
89 89 };
  90 +
  91 +struct omap_vp_param omap4_mpu_vp_data = {
  92 + .vddmin = OMAP4_VP_MPU_VLIMITTO_VDDMIN,
  93 + .vddmax = OMAP4_VP_MPU_VLIMITTO_VDDMAX,
  94 +};
  95 +
  96 +struct omap_vp_param omap4_iva_vp_data = {
  97 + .vddmin = OMAP4_VP_IVA_VLIMITTO_VDDMIN,
  98 + .vddmax = OMAP4_VP_IVA_VLIMITTO_VDDMAX,
  99 +};
  100 +
  101 +struct omap_vp_param omap4_core_vp_data = {
  102 + .vddmin = OMAP4_VP_CORE_VLIMITTO_VDDMIN,
  103 + .vddmax = OMAP4_VP_CORE_VLIMITTO_VDDMAX,
  104 +};