blob: 03a34d619880674bc8556141aeb58e4838f0db88 [file] [log] [blame]
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -07001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#define pr_fmt(fmt) "%s: " fmt, __func__
14
15#include <linux/err.h>
16#include <linux/kernel.h>
17#include <linux/module.h>
18#include <linux/init.h>
19#include <linux/delay.h>
20#include <linux/slab.h>
21#include <linux/string.h>
22#include <linux/io.h>
23#include <linux/of.h>
24#include <linux/of_device.h>
25#include <linux/platform_device.h>
26#include <linux/regulator/driver.h>
27#include <linux/regulator/machine.h>
28#include <linux/regulator/of_regulator.h>
29#include <linux/regulator/krait-regulator.h>
30
31#include "spm.h"
32
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -070033/*
34 * supply
35 * from
36 * pmic
37 * gang
38 * | LDO BYP [6]
39 * | /
40 * | /
41 * |_______/ _____
42 * | |
43 * ___|___ |
44 * | | |
45 * | | /
46 * | LDO | /
47 * | | / BHS[6]
48 * |_______| |
49 * | |
50 * |________________|
51 * |
52 * ________|________
53 * | |
54 * | KRAIT |
55 * |_________________|
56 */
57
58#define V_RETENTION 600000
59#define V_LDO_HEADROOM 150000
60
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -070061#define PMIC_VOLTAGE_MIN 350000
62#define PMIC_VOLTAGE_MAX 1355000
63#define LV_RANGE_STEP 5000
64#define LV_RANGE_MIN 80000
65
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -070066/* use LDO for core voltage below LDO_THRESH */
67#define CORE_VOLTAGE_LDO_THRESH 750000
68
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -070069#define LOAD_PER_PHASE 3200000
70
71#define CORE_VOLTAGE_MIN 500000
72
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -070073#define KRAIT_LDO_VOLTAGE_MIN 465000
74#define KRAIT_LDO_VOLTAGE_OFFSET 460000
75#define KRAIT_LDO_STEP 5000
76
77#define BHS_SETTLING_DELAY_US 1
78#define LDO_SETTLING_DELAY_US 1
79
80#define _KRAIT_MASK(BITS, POS) (((u32)(1 << (BITS)) - 1) << POS)
81#define KRAIT_MASK(LEFT_BIT_POS, RIGHT_BIT_POS) \
82 _KRAIT_MASK(LEFT_BIT_POS - RIGHT_BIT_POS + 1, RIGHT_BIT_POS)
83
84#define APC_SECURE 0x00000000
85#define CPU_PWR_CTL 0x00000004
86#define APC_PWR_STATUS 0x00000008
87#define APC_TEST_BUS_SEL 0x0000000C
88#define CPU_TRGTD_DBG_RST 0x00000010
89#define APC_PWR_GATE_CTL 0x00000014
90#define APC_LDO_VREF_SET 0x00000018
91
92/* bit definitions for APC_PWR_GATE_CTL */
93#define BHS_CNT_BIT_POS 24
94#define BHS_CNT_MASK KRAIT_MASK(31, 24)
95#define BHS_CNT_DEFAULT 64
96
97#define CLK_SRC_SEL_BIT_POS 15
98#define CLK_SRC_SEL_MASK KRAIT_MASK(15, 15)
99#define CLK_SRC_DEFAULT 0
100
101#define LDO_PWR_DWN_BIT_POS 16
102#define LDO_PWR_DWN_MASK KRAIT_MASK(21, 16)
103
104#define LDO_BYP_BIT_POS 8
105#define LDO_BYP_MASK KRAIT_MASK(13, 8)
106
107#define BHS_SEG_EN_BIT_POS 1
108#define BHS_SEG_EN_MASK KRAIT_MASK(6, 1)
109#define BHS_SEG_EN_DEFAULT 0x3F
110
111#define BHS_EN_BIT_POS 0
112#define BHS_EN_MASK KRAIT_MASK(0, 0)
113
114/* bit definitions for APC_LDO_VREF_SET register */
115#define VREF_RET_POS 8
116#define VREF_RET_MASK KRAIT_MASK(14, 8)
117
118#define VREF_LDO_BIT_POS 0
119#define VREF_LDO_MASK KRAIT_MASK(6, 0)
120
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700121/**
122 * struct pmic_gang_vreg -
123 * @name: the string used to represent the gang
124 * @pmic_vmax_uV: the current pmic gang voltage
125 * @pmic_phase_count: the number of phases turned on in the gang
126 * @krait_power_vregs: a list of krait consumers this gang supplies to
127 * @krait_power_vregs_lock: lock to prevent simultaneous access to the list
128 * and its nodes. This needs to be taken by each
129 * regulator's callback functions to prevent
130 * simultaneous updates to the pmic's phase
131 * voltage.
132 */
133struct pmic_gang_vreg {
134 const char *name;
135 int pmic_vmax_uV;
136 int pmic_phase_count;
137 struct list_head krait_power_vregs;
138 struct mutex krait_power_vregs_lock;
139};
140
141static struct pmic_gang_vreg *the_gang;
142
143enum krait_supply_mode {
144 HS_MODE = REGULATOR_MODE_NORMAL,
145 LDO_MODE = REGULATOR_MODE_IDLE,
146};
147
148struct krait_power_vreg {
149 struct list_head link;
150 struct regulator_desc desc;
151 struct regulator_dev *rdev;
152 const char *name;
153 struct pmic_gang_vreg *pvreg;
154 int uV;
155 int load_uA;
156 enum krait_supply_mode mode;
157 void __iomem *reg_base;
158};
159
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700160static void krait_masked_write(struct krait_power_vreg *kvreg,
161 int reg, uint32_t mask, uint32_t val)
162{
163 uint32_t reg_val;
164
165 reg_val = readl_relaxed(kvreg->reg_base + reg);
166 reg_val &= ~mask;
167 reg_val |= (val & mask);
168 writel_relaxed(reg_val, kvreg->reg_base + reg);
169
170 /*
171 * Barrier to ensure that the reads and writes from
172 * other regulator regions (they are 1k apart) execute in
173 * order to the above write.
174 */
175 mb();
176}
177
178static int get_krait_ldo_uv(struct krait_power_vreg *kvreg)
179{
180 uint32_t reg_val;
181 int uV;
182
183 reg_val = readl_relaxed(kvreg->reg_base + APC_LDO_VREF_SET);
184 reg_val &= VREF_LDO_MASK;
185 reg_val >>= VREF_LDO_BIT_POS;
186
187 if (reg_val == 0)
188 uV = 0;
189 else
190 uV = KRAIT_LDO_VOLTAGE_OFFSET + reg_val * KRAIT_LDO_STEP;
191
192 return uV;
193}
194
195static int set_krait_ldo_uv(struct krait_power_vreg *kvreg)
196{
197 uint32_t reg_val;
198
199 reg_val = kvreg->uV - KRAIT_LDO_VOLTAGE_OFFSET / KRAIT_LDO_STEP;
200 krait_masked_write(kvreg, APC_LDO_VREF_SET, VREF_LDO_MASK,
201 reg_val << VREF_LDO_BIT_POS);
202
203 return 0;
204}
205
206static int switch_to_using_hs(struct krait_power_vreg *kvreg)
207{
208 if (kvreg->mode == HS_MODE)
209 return 0;
210
211 /*
212 * enable ldo bypass - the krait is powered still by LDO since
213 * LDO is enabled and BHS is disabled
214 */
215 krait_masked_write(kvreg, APC_PWR_GATE_CTL, LDO_BYP_MASK, LDO_BYP_MASK);
216
217 /* enable bhs */
218 krait_masked_write(kvreg, APC_PWR_GATE_CTL, BHS_EN_MASK, BHS_EN_MASK);
219
220 /*
221 * wait for the bhs to settle - note that
222 * after the voltage has settled both BHS and LDO are supplying power
223 * to the krait. This avoids glitches during switching
224 */
225 udelay(BHS_SETTLING_DELAY_US);
226
227 /* disable ldo - only the BHS provides voltage to the cpu after this */
228 krait_masked_write(kvreg, APC_PWR_GATE_CTL,
229 LDO_PWR_DWN_MASK, LDO_PWR_DWN_MASK);
230
231 kvreg->mode = HS_MODE;
232 return 0;
233}
234
235static int switch_to_using_ldo(struct krait_power_vreg *kvreg)
236{
237 if (kvreg->mode == LDO_MODE && get_krait_ldo_uv(kvreg) == kvreg->uV)
238 return 0;
239
240 /*
241 * if the krait is in ldo mode and a voltage change is requested on the
242 * ldo switch to using hs before changing ldo voltage
243 */
244 if (kvreg->mode == LDO_MODE)
245 switch_to_using_hs(kvreg);
246
247 set_krait_ldo_uv(kvreg);
248
249 /*
250 * enable ldo - note that both LDO and BHS are are supplying voltage to
251 * the cpu after this. This avoids glitches during switching from BHS
252 * to LDO.
253 */
254 krait_masked_write(kvreg, APC_PWR_GATE_CTL, LDO_PWR_DWN_MASK, 0);
255
256 /* wait for the ldo to settle */
257 udelay(LDO_SETTLING_DELAY_US);
258
259 /*
260 * disable BHS and disable LDO bypass seperate from enabling
261 * the LDO above.
262 */
263 krait_masked_write(kvreg, APC_PWR_GATE_CTL,
264 BHS_EN_MASK | LDO_BYP_MASK, 0);
265
266 kvreg->mode = LDO_MODE;
267 return 0;
268}
269
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700270static int set_pmic_gang_phases(int phase_count)
271{
272 return msm_spm_apcs_set_phase(phase_count);
273}
274
275static int set_pmic_gang_voltage(int uV)
276{
277 int setpoint;
278
279 if (uV < PMIC_VOLTAGE_MIN) {
280 pr_err("requested %d < %d, restricting it to %d\n",
281 uV, PMIC_VOLTAGE_MIN, PMIC_VOLTAGE_MIN);
282 uV = PMIC_VOLTAGE_MIN;
283 }
284 if (uV > PMIC_VOLTAGE_MAX) {
285 pr_err("requested %d > %d, restricting it to %d\n",
286 uV, PMIC_VOLTAGE_MAX, PMIC_VOLTAGE_MAX);
287 uV = PMIC_VOLTAGE_MAX;
288 }
289
290 setpoint = DIV_ROUND_UP(uV - LV_RANGE_MIN, LV_RANGE_STEP);
291 return msm_spm_apcs_set_vdd(setpoint);
292}
293
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700294static int configure_ldo_or_hs(struct krait_power_vreg *from, int vmax)
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700295{
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700296 struct pmic_gang_vreg *pvreg = from->pvreg;
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700297 struct krait_power_vreg *kvreg;
298 int rc = 0;
299
300 list_for_each_entry(kvreg, &pvreg->krait_power_vregs, link) {
301 if (kvreg->uV > CORE_VOLTAGE_LDO_THRESH
302 || kvreg->uV > vmax - V_LDO_HEADROOM) {
303 rc = switch_to_using_hs(kvreg);
304 if (rc < 0) {
305 pr_err("could not switch %s to hs rc = %d\n",
306 kvreg->name, rc);
307 return rc;
308 }
309 } else {
310 rc = switch_to_using_ldo(kvreg);
311 if (rc < 0) {
312 pr_err("could not switch %s to ldo rc = %d\n",
313 kvreg->name, rc);
314 return rc;
315 }
316 }
317 }
318
319 return rc;
320}
321
322#define SLEW_RATE 2994
323static int pmic_gang_set_voltage_increase(struct krait_power_vreg *from,
324 int vmax)
325{
326 struct pmic_gang_vreg *pvreg = from->pvreg;
327 int rc = 0;
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700328 int settling_us;
329
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700330 /*
331 * since pmic gang voltage is increasing set the gang voltage
332 * prior to changing ldo/hs states of the requesting krait
333 */
334 rc = set_pmic_gang_voltage(vmax);
335 if (rc < 0) {
336 dev_err(&from->rdev->dev, "%s failed set voltage %d rc = %d\n",
337 pvreg->name, vmax, rc);
338 }
339
340 /* delay until the voltage is settled when it is raised */
341 settling_us = DIV_ROUND_UP(vmax - pvreg->pmic_vmax_uV, SLEW_RATE);
342 udelay(settling_us);
343
344 rc = configure_ldo_or_hs(from, vmax);
345 if (rc < 0) {
346 dev_err(&from->rdev->dev, "%s failed ldo/hs conf %d rc = %d\n",
347 pvreg->name, vmax, rc);
348 }
349
350 return rc;
351}
352
353static int pmic_gang_set_voltage_decrease(struct krait_power_vreg *from,
354 int vmax)
355{
356 struct pmic_gang_vreg *pvreg = from->pvreg;
357 int rc = 0;
358
359 /*
360 * since pmic gang voltage is decreasing ldos might get out of their
361 * operating range. Hence configure such kraits to be in hs mode prior
362 * to setting the pmic gang voltage
363 */
364 rc = configure_ldo_or_hs(from, vmax);
365 if (rc < 0) {
366 dev_err(&from->rdev->dev, "%s failed ldo/hs conf %d rc = %d\n",
367 pvreg->name, vmax, rc);
368 return rc;
369 }
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700370
371 rc = set_pmic_gang_voltage(vmax);
372 if (rc < 0) {
373 dev_err(&from->rdev->dev, "%s failed set voltage %d rc = %d\n",
374 pvreg->name, vmax, rc);
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700375 }
376
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700377 return rc;
378}
379
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700380static int pmic_gang_set_voltage(struct krait_power_vreg *from,
381 int vmax)
382{
383 struct pmic_gang_vreg *pvreg = from->pvreg;
384
385 if (pvreg->pmic_vmax_uV == vmax)
386 return 0;
387 else if (vmax < pvreg->pmic_vmax_uV)
388 return pmic_gang_set_voltage_decrease(from, vmax);
389
390 return pmic_gang_set_voltage_increase(from, vmax);
391}
392
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700393#define PHASE_SETTLING_TIME_US 10
394static unsigned int pmic_gang_set_phases(struct krait_power_vreg *from,
395 int load_uA)
396{
397 struct pmic_gang_vreg *pvreg = from->pvreg;
398 int phase_count = DIV_ROUND_UP(load_uA, LOAD_PER_PHASE) - 1;
399 int rc = 0;
400
401 if (phase_count < 0)
402 phase_count = 0;
403
404 if (phase_count != pvreg->pmic_phase_count) {
405 rc = set_pmic_gang_phases(phase_count);
406 if (rc < 0) {
407 dev_err(&from->rdev->dev,
408 "%s failed set phase %d rc = %d\n",
409 pvreg->name, phase_count, rc);
410 return rc;
411 }
412
413 /*
414 * delay until the phases are settled when
415 * the count is raised
416 */
417 if (phase_count > pvreg->pmic_phase_count)
418 udelay(PHASE_SETTLING_TIME_US);
419
420 pvreg->pmic_phase_count = phase_count;
421 }
422 return rc;
423}
424
425static int __init pvreg_init(struct platform_device *pdev)
426{
427 struct pmic_gang_vreg *pvreg;
428
429 pvreg = devm_kzalloc(&pdev->dev,
430 sizeof(struct pmic_gang_vreg), GFP_KERNEL);
431 if (!pvreg) {
432 pr_err("kzalloc failed.\n");
433 return -ENOMEM;
434 }
435
436 pvreg->name = "pmic_gang";
437 pvreg->pmic_vmax_uV = PMIC_VOLTAGE_MIN;
438 pvreg->pmic_phase_count = 1;
439
440 mutex_init(&pvreg->krait_power_vregs_lock);
441 INIT_LIST_HEAD(&pvreg->krait_power_vregs);
442 the_gang = pvreg;
443
444 pr_debug("name=%s inited\n", pvreg->name);
445
446 return 0;
447}
448
449static int krait_power_get_voltage(struct regulator_dev *rdev)
450{
451 struct krait_power_vreg *kvreg = rdev_get_drvdata(rdev);
452
453 return kvreg->uV;
454}
455
456static int get_vmax(struct krait_power_vreg *from, int min_uV)
457{
458 int vmax = 0;
459 int v;
460 struct krait_power_vreg *kvreg;
461 struct pmic_gang_vreg *pvreg = from->pvreg;
462
463 list_for_each_entry(kvreg, &pvreg->krait_power_vregs, link) {
464 v = kvreg->uV;
465
466 if (kvreg == from)
467 v = min_uV;
468
469 if (vmax < v)
470 vmax = v;
471 }
472 return vmax;
473}
474
475static int get_total_load(struct krait_power_vreg *from)
476{
477 int load_total = 0;
478 struct krait_power_vreg *kvreg;
479 struct pmic_gang_vreg *pvreg = from->pvreg;
480
481 list_for_each_entry(kvreg, &pvreg->krait_power_vregs, link)
482 load_total += kvreg->load_uA;
483
484 return load_total;
485}
486
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700487#define ROUND_UP_VOLTAGE(v, res) (DIV_ROUND_UP(v, res) * res)
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700488static int krait_power_set_voltage(struct regulator_dev *rdev,
489 int min_uV, int max_uV, unsigned *selector)
490{
491 struct krait_power_vreg *kvreg = rdev_get_drvdata(rdev);
492 struct pmic_gang_vreg *pvreg = kvreg->pvreg;
493 int rc;
494 int vmax;
495
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700496 /*
497 * if the voltage requested is below LDO_THRESHOLD this cpu could
498 * switch to LDO mode. Hence round the voltage as per the LDO
499 * resolution
500 */
501 if (min_uV < CORE_VOLTAGE_LDO_THRESH) {
502 if (min_uV < KRAIT_LDO_VOLTAGE_MIN)
503 min_uV = KRAIT_LDO_VOLTAGE_MIN;
504 min_uV = ROUND_UP_VOLTAGE(min_uV, KRAIT_LDO_STEP);
505 }
506
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700507 mutex_lock(&pvreg->krait_power_vregs_lock);
508
509 vmax = get_vmax(kvreg, min_uV);
510
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700511 /* round up the pmic voltage as per its resolution */
512 vmax = ROUND_UP_VOLTAGE(vmax, LV_RANGE_STEP);
513
514 /*
515 * Assign the voltage before updating the gang voltage as we iterate
516 * over all the core voltages and choose HS or LDO for each of them
517 */
518 kvreg->uV = min_uV;
519
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700520 rc = pmic_gang_set_voltage(kvreg, vmax);
521 if (rc < 0) {
522 dev_err(&rdev->dev, "%s failed set voltage (%d, %d) rc = %d\n",
523 kvreg->name, min_uV, max_uV, rc);
524 goto out;
525 }
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700526
527 pvreg->pmic_vmax_uV = vmax;
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700528
529out:
530 mutex_unlock(&pvreg->krait_power_vregs_lock);
531 return rc;
532}
533
534static unsigned int krait_power_get_optimum_mode(struct regulator_dev *rdev,
535 int input_uV, int output_uV, int load_uA)
536{
537 struct krait_power_vreg *kvreg = rdev_get_drvdata(rdev);
538 struct pmic_gang_vreg *pvreg = kvreg->pvreg;
539 int rc;
540 int load_total_uA;
541 int reg_mode = -EINVAL;
542
543 mutex_lock(&pvreg->krait_power_vregs_lock);
544
545 kvreg->load_uA = load_uA;
546
547 load_total_uA = get_total_load(kvreg);
548
549 rc = pmic_gang_set_phases(kvreg, load_total_uA);
550 if (rc < 0) {
551 dev_err(&rdev->dev, "%s failed set mode %d rc = %d\n",
552 kvreg->name, load_total_uA, rc);
553 goto out;
554 }
555
556 reg_mode = kvreg->mode;
557out:
558 mutex_unlock(&pvreg->krait_power_vregs_lock);
559 return reg_mode;
560}
561
562static int krait_power_set_mode(struct regulator_dev *rdev, unsigned int mode)
563{
564 return 0;
565}
566
567static unsigned int krait_power_get_mode(struct regulator_dev *rdev)
568{
569 struct krait_power_vreg *kvreg = rdev_get_drvdata(rdev);
570
571 return kvreg->mode;
572}
573
574static struct regulator_ops krait_power_ops = {
575 .get_voltage = krait_power_get_voltage,
576 .set_voltage = krait_power_set_voltage,
577 .get_optimum_mode = krait_power_get_optimum_mode,
578 .set_mode = krait_power_set_mode,
579 .get_mode = krait_power_get_mode,
580};
581
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700582static void kvreg_hw_init(struct krait_power_vreg *kvreg)
583{
584 /*
585 * bhs_cnt value sets the ramp-up time from power collapse,
586 * initialize the ramp up time
587 */
588 krait_masked_write(kvreg, APC_PWR_GATE_CTL,
589 BHS_CNT_MASK, BHS_CNT_DEFAULT << BHS_CNT_BIT_POS);
590
591 krait_masked_write(kvreg, APC_PWR_GATE_CTL,
592 CLK_SRC_SEL_MASK, CLK_SRC_DEFAULT << CLK_SRC_SEL_BIT_POS);
593
594 /* BHS has six different segments, turn them all on */
595 krait_masked_write(kvreg, APC_PWR_GATE_CTL,
596 BHS_SEG_EN_MASK, BHS_SEG_EN_DEFAULT << BHS_SEG_EN_BIT_POS);
597}
598
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700599static int __devinit krait_power_probe(struct platform_device *pdev)
600{
601 struct krait_power_vreg *kvreg;
602 struct resource *res;
603 struct regulator_init_data *init_data = pdev->dev.platform_data;
604 int rc = 0;
605
606 /* Initialize the pmic gang if it hasn't been initialized already */
607 if (the_gang == NULL) {
608 rc = pvreg_init(pdev);
609 if (rc < 0) {
610 dev_err(&pdev->dev,
611 "failed to init pmic gang rc = %d\n", rc);
612 return rc;
613 }
614 }
615
616 if (pdev->dev.of_node) {
617 /* Get init_data from device tree. */
618 init_data = of_get_regulator_init_data(&pdev->dev,
619 pdev->dev.of_node);
620 init_data->constraints.valid_ops_mask
621 |= REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_DRMS
622 | REGULATOR_CHANGE_MODE;
623 init_data->constraints.valid_modes_mask
624 |= REGULATOR_MODE_NORMAL | REGULATOR_MODE_IDLE
625 | REGULATOR_MODE_FAST;
626 init_data->constraints.input_uV = init_data->constraints.max_uV;
627 }
628
629 if (!init_data) {
630 dev_err(&pdev->dev, "init data required.\n");
631 return -EINVAL;
632 }
633
634 if (!init_data->constraints.name) {
635 dev_err(&pdev->dev,
636 "regulator name must be specified in constraints.\n");
637 return -EINVAL;
638 }
639
640 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
641 if (!res) {
642 dev_err(&pdev->dev, "missing physical register addresses\n");
643 return -EINVAL;
644 }
645
646 kvreg = devm_kzalloc(&pdev->dev,
647 sizeof(struct krait_power_vreg), GFP_KERNEL);
648 if (!kvreg) {
649 dev_err(&pdev->dev, "kzalloc failed.\n");
650 return -ENOMEM;
651 }
652
653 kvreg->reg_base = devm_ioremap(&pdev->dev,
654 res->start, resource_size(res));
655
656 kvreg->pvreg = the_gang;
657 kvreg->name = init_data->constraints.name;
658 kvreg->desc.name = kvreg->name;
659 kvreg->desc.ops = &krait_power_ops;
660 kvreg->desc.type = REGULATOR_VOLTAGE;
661 kvreg->desc.owner = THIS_MODULE;
662 kvreg->uV = CORE_VOLTAGE_MIN;
663 kvreg->mode = HS_MODE;
664 kvreg->desc.ops = &krait_power_ops;
665
666 platform_set_drvdata(pdev, kvreg);
667
668 mutex_lock(&the_gang->krait_power_vregs_lock);
669 list_add_tail(&kvreg->link, &the_gang->krait_power_vregs);
670 mutex_unlock(&the_gang->krait_power_vregs_lock);
671
672 kvreg->rdev = regulator_register(&kvreg->desc, &pdev->dev, init_data,
673 kvreg, pdev->dev.of_node);
674 if (IS_ERR(kvreg->rdev)) {
675 rc = PTR_ERR(kvreg->rdev);
676 pr_err("regulator_register failed, rc=%d.\n", rc);
677 goto out;
678 }
679
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700680 kvreg_hw_init(kvreg);
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700681 dev_dbg(&pdev->dev, "id=%d, name=%s\n", pdev->id, kvreg->name);
682
683 return 0;
684out:
685 mutex_lock(&the_gang->krait_power_vregs_lock);
686 list_del(&kvreg->link);
687 mutex_unlock(&the_gang->krait_power_vregs_lock);
688
689 platform_set_drvdata(pdev, NULL);
690 return rc;
691}
692
693static int __devexit krait_power_remove(struct platform_device *pdev)
694{
695 struct krait_power_vreg *kvreg = platform_get_drvdata(pdev);
696 struct pmic_gang_vreg *pvreg = kvreg->pvreg;
697
698 mutex_lock(&pvreg->krait_power_vregs_lock);
699 list_del(&kvreg->link);
700 mutex_unlock(&pvreg->krait_power_vregs_lock);
701
702 regulator_unregister(kvreg->rdev);
703 platform_set_drvdata(pdev, NULL);
704 return 0;
705}
706
707static struct of_device_id krait_power_match_table[] = {
708 { .compatible = "qcom,krait-regulator", },
709 {}
710};
711
712static struct platform_driver krait_power_driver = {
713 .probe = krait_power_probe,
714 .remove = __devexit_p(krait_power_remove),
715 .driver = {
716 .name = KRAIT_REGULATOR_DRIVER_NAME,
717 .of_match_table = krait_power_match_table,
718 .owner = THIS_MODULE,
719 },
720};
721
722int __init krait_power_init(void)
723{
724 return platform_driver_register(&krait_power_driver);
725}
726
727static void __exit krait_power_exit(void)
728{
729 platform_driver_unregister(&krait_power_driver);
730}
731
732module_exit(krait_power_exit);
733
734MODULE_LICENSE("GPL v2");
735MODULE_DESCRIPTION("KRAIT POWER regulator driver");
736MODULE_VERSION("1.0");
737MODULE_ALIAS("platform:"KRAIT_REGULATOR_DRIVER_NAME);