aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator/88pm8607.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/regulator/88pm8607.c')
-rw-r--r--drivers/regulator/88pm8607.c290
1 files changed, 77 insertions, 213 deletions
diff --git a/drivers/regulator/88pm8607.c b/drivers/regulator/88pm8607.c
index 97897a6bf4f3..5fb83e2ced25 100644
--- a/drivers/regulator/88pm8607.c
+++ b/drivers/regulator/88pm8607.c
@@ -48,7 +48,6 @@ static inline int check_range(struct pm8607_regulator_info *info,
48static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index) 48static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
49{ 49{
50 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); 50 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
51 uint8_t chip_id = info->chip->chip_version;
52 int ret = -EINVAL; 51 int ret = -EINVAL;
53 52
54 switch (info->desc.id) { 53 switch (info->desc.id) {
@@ -90,79 +89,29 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
90 case PM8607_ID_LDO2: 89 case PM8607_ID_LDO2:
91 case PM8607_ID_LDO3: 90 case PM8607_ID_LDO3:
92 case PM8607_ID_LDO9: 91 case PM8607_ID_LDO9:
93 switch (chip_id) { 92 ret = (index < 3) ? (index * 50000 + 1800000) :
94 case PM8607_CHIP_A0: 93 ((index < 7) ? (index * 50000 + 2550000) :
95 case PM8607_CHIP_A1: 94 3300000);
96 ret = (index < 3) ? (index * 50000 + 1800000) :
97 ((index < 8) ? (index * 50000 + 2550000) :
98 -EINVAL);
99 break;
100 case PM8607_CHIP_B0:
101 ret = (index < 3) ? (index * 50000 + 1800000) :
102 ((index < 7) ? (index * 50000 + 2550000) :
103 3300000);
104 break;
105 }
106 break; 95 break;
107 case PM8607_ID_LDO4: 96 case PM8607_ID_LDO4:
108 switch (chip_id) { 97 ret = (index < 3) ? (index * 50000 + 1800000) :
109 case PM8607_CHIP_A0: 98 ((index < 6) ? (index * 50000 + 2550000) :
110 case PM8607_CHIP_A1: 99 ((index == 6) ? 2900000 : 3300000));
111 ret = (index < 3) ? (index * 50000 + 1800000) :
112 ((index < 8) ? (index * 50000 + 2550000) :
113 -EINVAL);
114 break;
115 case PM8607_CHIP_B0:
116 ret = (index < 3) ? (index * 50000 + 1800000) :
117 ((index < 6) ? (index * 50000 + 2550000) :
118 ((index == 6) ? 2900000 : 3300000));
119 break;
120 }
121 break; 100 break;
122 case PM8607_ID_LDO6: 101 case PM8607_ID_LDO6:
123 switch (chip_id) { 102 ret = (index < 2) ? (index * 50000 + 1800000) :
124 case PM8607_CHIP_A0: 103 ((index < 7) ? (index * 50000 + 2500000) :
125 case PM8607_CHIP_A1: 104 3300000);
126 ret = (index < 3) ? (index * 50000 + 1800000) :
127 ((index < 8) ? (index * 50000 + 2450000) :
128 -EINVAL);
129 break;
130 case PM8607_CHIP_B0:
131 ret = (index < 2) ? (index * 50000 + 1800000) :
132 ((index < 7) ? (index * 50000 + 2500000) :
133 3300000);
134 break;
135 }
136 break; 105 break;
137 case PM8607_ID_LDO10: 106 case PM8607_ID_LDO10:
138 switch (chip_id) { 107 ret = (index < 3) ? (index * 50000 + 1800000) :
139 case PM8607_CHIP_A0: 108 ((index < 7) ? (index * 50000 + 2550000) :
140 case PM8607_CHIP_A1: 109 ((index == 7) ? 3300000 : 1200000));
141 ret = (index < 3) ? (index * 50000 + 1800000) :
142 ((index < 8) ? (index * 50000 + 2550000) :
143 1200000);
144 break;
145 case PM8607_CHIP_B0:
146 ret = (index < 3) ? (index * 50000 + 1800000) :
147 ((index < 7) ? (index * 50000 + 2550000) :
148 ((index == 7) ? 3300000 : 1200000));
149 break;
150 }
151 break; 110 break;
152 case PM8607_ID_LDO14: 111 case PM8607_ID_LDO14:
153 switch (chip_id) { 112 ret = (index < 2) ? (index * 50000 + 1800000) :
154 case PM8607_CHIP_A0: 113 ((index < 7) ? (index * 50000 + 2600000) :
155 case PM8607_CHIP_A1: 114 3300000);
156 ret = (index < 3) ? (index * 50000 + 1800000) :
157 ((index < 8) ? (index * 50000 + 2550000) :
158 -EINVAL);
159 break;
160 case PM8607_CHIP_B0:
161 ret = (index < 2) ? (index * 50000 + 1800000) :
162 ((index < 7) ? (index * 50000 + 2600000) :
163 3300000);
164 break;
165 }
166 break; 115 break;
167 } 116 }
168 return ret; 117 return ret;
@@ -171,7 +120,6 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
171static int choose_voltage(struct regulator_dev *rdev, int min_uV, int max_uV) 120static int choose_voltage(struct regulator_dev *rdev, int min_uV, int max_uV)
172{ 121{
173 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); 122 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
174 uint8_t chip_id = info->chip->chip_version;
175 int val = -ENOENT; 123 int val = -ENOENT;
176 int ret; 124 int ret;
177 125
@@ -256,161 +204,77 @@ static int choose_voltage(struct regulator_dev *rdev, int min_uV, int max_uV)
256 case PM8607_ID_LDO2: 204 case PM8607_ID_LDO2:
257 case PM8607_ID_LDO3: 205 case PM8607_ID_LDO3:
258 case PM8607_ID_LDO9: 206 case PM8607_ID_LDO9:
259 switch (chip_id) { 207 if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */
260 case PM8607_CHIP_A0: 208 if (min_uV <= 1800000)
261 case PM8607_CHIP_A1: 209 val = 0;
262 if (min_uV < 2700000) /* 1800mV ~ 1900mV / 50mV */ 210 else if (min_uV <= 1900000)
263 if (min_uV <= 1800000) 211 val = (min_uV - 1750001) / 50000;
264 val = 0; 212 else
265 else if (min_uV <= 1900000) 213 val = 3; /* 2700mV */
266 val = (min_uV - 1750001) / 50000; 214 } else { /* 2700mV ~ 2850mV / 50mV */
267 else 215 if (min_uV <= 2850000) {
268 val = 3; /* 2700mV */ 216 val = (min_uV - 2650001) / 50000;
269 else { /* 2700mV ~ 2900mV / 50mV */ 217 val += 3;
270 if (min_uV <= 2900000) { 218 } else if (min_uV <= 3300000)
271 val = (min_uV - 2650001) / 50000; 219 val = 7;
272 val += 3; 220 else
273 } else 221 val = -EINVAL;
274 val = -EINVAL;
275 }
276 break;
277 case PM8607_CHIP_B0:
278 if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */
279 if (min_uV <= 1800000)
280 val = 0;
281 else if (min_uV <= 1900000)
282 val = (min_uV - 1750001) / 50000;
283 else
284 val = 3; /* 2700mV */
285 } else { /* 2700mV ~ 2850mV / 50mV */
286 if (min_uV <= 2850000) {
287 val = (min_uV - 2650001) / 50000;
288 val += 3;
289 } else if (min_uV <= 3300000)
290 val = 7;
291 else
292 val = -EINVAL;
293 }
294 break;
295 } 222 }
296 break; 223 break;
297 case PM8607_ID_LDO4: 224 case PM8607_ID_LDO4:
298 switch (chip_id) { 225 if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */
299 case PM8607_CHIP_A0: 226 if (min_uV <= 1800000)
300 case PM8607_CHIP_A1: 227 val = 0;
301 if (min_uV < 2700000) /* 1800mV ~ 1900mV / 50mV */ 228 else if (min_uV <= 1900000)
302 if (min_uV <= 1800000) 229 val = (min_uV - 1750001) / 50000;
303 val = 0; 230 else
304 else if (min_uV <= 1900000) 231 val = 3; /* 2700mV */
305 val = (min_uV - 1750001) / 50000; 232 } else { /* 2700mV ~ 2800mV / 50mV */
306 else 233 if (min_uV <= 2850000) {
307 val = 3; /* 2700mV */ 234 val = (min_uV - 2650001) / 50000;
308 else { /* 2700mV ~ 2900mV / 50mV */ 235 val += 3;
309 if (min_uV <= 2900000) { 236 } else if (min_uV <= 2900000)
310 val = (min_uV - 2650001) / 50000; 237 val = 6;
311 val += 3; 238 else if (min_uV <= 3300000)
312 } else 239 val = 7;
313 val = -EINVAL; 240 else
314 } 241 val = -EINVAL;
315 break;
316 case PM8607_CHIP_B0:
317 if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */
318 if (min_uV <= 1800000)
319 val = 0;
320 else if (min_uV <= 1900000)
321 val = (min_uV - 1750001) / 50000;
322 else
323 val = 3; /* 2700mV */
324 } else { /* 2700mV ~ 2800mV / 50mV */
325 if (min_uV <= 2850000) {
326 val = (min_uV - 2650001) / 50000;
327 val += 3;
328 } else if (min_uV <= 2900000)
329 val = 6;
330 else if (min_uV <= 3300000)
331 val = 7;
332 else
333 val = -EINVAL;
334 }
335 break;
336 } 242 }
337 break; 243 break;
338 case PM8607_ID_LDO6: 244 case PM8607_ID_LDO6:
339 switch (chip_id) { 245 if (min_uV < 2600000) { /* 1800mV ~ 1850mV / 50mV */
340 case PM8607_CHIP_A0: 246 if (min_uV <= 1800000)
341 case PM8607_CHIP_A1: 247 val = 0;
342 if (min_uV < 2600000) { /* 1800mV ~ 1900mV / 50mV */ 248 else if (min_uV <= 1850000)
343 if (min_uV <= 1800000) 249 val = (min_uV - 1750001) / 50000;
344 val = 0; 250 else
345 else if (min_uV <= 1900000) 251 val = 2; /* 2600mV */
346 val = (min_uV - 1750001) / 50000; 252 } else { /* 2600mV ~ 2800mV / 50mV */
347 else 253 if (min_uV <= 2800000) {
348 val = 3; /* 2600mV */ 254 val = (min_uV - 2550001) / 50000;
349 } else { /* 2600mV ~ 2800mV / 50mV */ 255 val += 2;
350 if (min_uV <= 2800000) { 256 } else if (min_uV <= 3300000)
351 val = (min_uV - 2550001) / 50000; 257 val = 7;
352 val += 3; 258 else
353 } else 259 val = -EINVAL;
354 val = -EINVAL;
355 }
356 break;
357 case PM8607_CHIP_B0:
358 if (min_uV < 2600000) { /* 1800mV ~ 1850mV / 50mV */
359 if (min_uV <= 1800000)
360 val = 0;
361 else if (min_uV <= 1850000)
362 val = (min_uV - 1750001) / 50000;
363 else
364 val = 2; /* 2600mV */
365 } else { /* 2600mV ~ 2800mV / 50mV */
366 if (min_uV <= 2800000) {
367 val = (min_uV - 2550001) / 50000;
368 val += 2;
369 } else if (min_uV <= 3300000)
370 val = 7;
371 else
372 val = -EINVAL;
373 }
374 break;
375 } 260 }
376 break; 261 break;
377 case PM8607_ID_LDO14: 262 case PM8607_ID_LDO14:
378 switch (chip_id) { 263 if (min_uV < 2700000) { /* 1800mV ~ 1850mV / 50mV */
379 case PM8607_CHIP_A0: 264 if (min_uV <= 1800000)
380 case PM8607_CHIP_A1: 265 val = 0;
381 if (min_uV < 2700000) { /* 1800mV ~ 1900mV / 50mV */ 266 else if (min_uV <= 1850000)
382 if (min_uV <= 1800000) 267 val = (min_uV - 1750001) / 50000;
383 val = 0; 268 else
384 else if (min_uV <= 1900000) 269 val = 2; /* 2700mV */
385 val = (min_uV - 1750001) / 50000; 270 } else { /* 2700mV ~ 2900mV / 50mV */
386 else 271 if (min_uV <= 2900000) {
387 val = 3; /* 2700mV */ 272 val = (min_uV - 2650001) / 50000;
388 } else { /* 2700mV ~ 2900mV / 50mV */ 273 val += 2;
389 if (min_uV <= 2900000) { 274 } else if (min_uV <= 3300000)
390 val = (min_uV - 2650001) / 50000; 275 val = 7;
391 val += 3; 276 else
392 } else 277 val = -EINVAL;
393 val = -EINVAL;
394 }
395 break;
396 case PM8607_CHIP_B0:
397 if (min_uV < 2700000) { /* 1800mV ~ 1850mV / 50mV */
398 if (min_uV <= 1800000)
399 val = 0;
400 else if (min_uV <= 1850000)
401 val = (min_uV - 1750001) / 50000;
402 else
403 val = 2; /* 2700mV */
404 } else { /* 2700mV ~ 2900mV / 50mV */
405 if (min_uV <= 2900000) {
406 val = (min_uV - 2650001) / 50000;
407 val += 2;
408 } else if (min_uV <= 3300000)
409 val = 7;
410 else
411 val = -EINVAL;
412 }
413 break;
414 } 278 }
415 break; 279 break;
416 } 280 }