blob: 63b00c28692d0e37922e2171bd9b93ebf936ce0f [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{
Abhijeet Dharmapurikare4b89ee2012-08-07 18:53:53 -0700272 /*
273 * TODO : spm writes for phase control,
274 * pmic phase control is not working yet
275 */
276 return 0;
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700277}
278
279static int set_pmic_gang_voltage(int uV)
280{
281 int setpoint;
282
283 if (uV < PMIC_VOLTAGE_MIN) {
284 pr_err("requested %d < %d, restricting it to %d\n",
285 uV, PMIC_VOLTAGE_MIN, PMIC_VOLTAGE_MIN);
286 uV = PMIC_VOLTAGE_MIN;
287 }
288 if (uV > PMIC_VOLTAGE_MAX) {
289 pr_err("requested %d > %d, restricting it to %d\n",
290 uV, PMIC_VOLTAGE_MAX, PMIC_VOLTAGE_MAX);
291 uV = PMIC_VOLTAGE_MAX;
292 }
293
294 setpoint = DIV_ROUND_UP(uV - LV_RANGE_MIN, LV_RANGE_STEP);
295 return msm_spm_apcs_set_vdd(setpoint);
296}
297
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700298static int configure_ldo_or_hs(struct krait_power_vreg *from, int vmax)
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700299{
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700300 struct pmic_gang_vreg *pvreg = from->pvreg;
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700301 struct krait_power_vreg *kvreg;
302 int rc = 0;
303
304 list_for_each_entry(kvreg, &pvreg->krait_power_vregs, link) {
305 if (kvreg->uV > CORE_VOLTAGE_LDO_THRESH
306 || kvreg->uV > vmax - V_LDO_HEADROOM) {
307 rc = switch_to_using_hs(kvreg);
308 if (rc < 0) {
309 pr_err("could not switch %s to hs rc = %d\n",
310 kvreg->name, rc);
311 return rc;
312 }
313 } else {
314 rc = switch_to_using_ldo(kvreg);
315 if (rc < 0) {
316 pr_err("could not switch %s to ldo rc = %d\n",
317 kvreg->name, rc);
318 return rc;
319 }
320 }
321 }
322
323 return rc;
324}
325
326#define SLEW_RATE 2994
327static int pmic_gang_set_voltage_increase(struct krait_power_vreg *from,
328 int vmax)
329{
330 struct pmic_gang_vreg *pvreg = from->pvreg;
331 int rc = 0;
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700332 int settling_us;
333
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700334 /*
335 * since pmic gang voltage is increasing set the gang voltage
336 * prior to changing ldo/hs states of the requesting krait
337 */
338 rc = set_pmic_gang_voltage(vmax);
339 if (rc < 0) {
340 dev_err(&from->rdev->dev, "%s failed set voltage %d rc = %d\n",
341 pvreg->name, vmax, rc);
342 }
343
344 /* delay until the voltage is settled when it is raised */
345 settling_us = DIV_ROUND_UP(vmax - pvreg->pmic_vmax_uV, SLEW_RATE);
346 udelay(settling_us);
347
348 rc = configure_ldo_or_hs(from, vmax);
349 if (rc < 0) {
350 dev_err(&from->rdev->dev, "%s failed ldo/hs conf %d rc = %d\n",
351 pvreg->name, vmax, rc);
352 }
353
354 return rc;
355}
356
357static int pmic_gang_set_voltage_decrease(struct krait_power_vreg *from,
358 int vmax)
359{
360 struct pmic_gang_vreg *pvreg = from->pvreg;
361 int rc = 0;
362
363 /*
364 * since pmic gang voltage is decreasing ldos might get out of their
365 * operating range. Hence configure such kraits to be in hs mode prior
366 * to setting the pmic gang voltage
367 */
368 rc = configure_ldo_or_hs(from, vmax);
369 if (rc < 0) {
370 dev_err(&from->rdev->dev, "%s failed ldo/hs conf %d rc = %d\n",
371 pvreg->name, vmax, rc);
372 return rc;
373 }
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700374
375 rc = set_pmic_gang_voltage(vmax);
376 if (rc < 0) {
377 dev_err(&from->rdev->dev, "%s failed set voltage %d rc = %d\n",
378 pvreg->name, vmax, rc);
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700379 }
380
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700381 return rc;
382}
383
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700384static int pmic_gang_set_voltage(struct krait_power_vreg *from,
385 int vmax)
386{
387 struct pmic_gang_vreg *pvreg = from->pvreg;
388
389 if (pvreg->pmic_vmax_uV == vmax)
390 return 0;
391 else if (vmax < pvreg->pmic_vmax_uV)
392 return pmic_gang_set_voltage_decrease(from, vmax);
393
394 return pmic_gang_set_voltage_increase(from, vmax);
395}
396
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700397#define PHASE_SETTLING_TIME_US 10
398static unsigned int pmic_gang_set_phases(struct krait_power_vreg *from,
399 int load_uA)
400{
401 struct pmic_gang_vreg *pvreg = from->pvreg;
402 int phase_count = DIV_ROUND_UP(load_uA, LOAD_PER_PHASE) - 1;
403 int rc = 0;
404
405 if (phase_count < 0)
406 phase_count = 0;
407
408 if (phase_count != pvreg->pmic_phase_count) {
409 rc = set_pmic_gang_phases(phase_count);
410 if (rc < 0) {
411 dev_err(&from->rdev->dev,
412 "%s failed set phase %d rc = %d\n",
413 pvreg->name, phase_count, rc);
414 return rc;
415 }
416
417 /*
418 * delay until the phases are settled when
419 * the count is raised
420 */
421 if (phase_count > pvreg->pmic_phase_count)
422 udelay(PHASE_SETTLING_TIME_US);
423
424 pvreg->pmic_phase_count = phase_count;
425 }
426 return rc;
427}
428
429static int __init pvreg_init(struct platform_device *pdev)
430{
431 struct pmic_gang_vreg *pvreg;
432
433 pvreg = devm_kzalloc(&pdev->dev,
434 sizeof(struct pmic_gang_vreg), GFP_KERNEL);
435 if (!pvreg) {
436 pr_err("kzalloc failed.\n");
437 return -ENOMEM;
438 }
439
440 pvreg->name = "pmic_gang";
441 pvreg->pmic_vmax_uV = PMIC_VOLTAGE_MIN;
442 pvreg->pmic_phase_count = 1;
443
444 mutex_init(&pvreg->krait_power_vregs_lock);
445 INIT_LIST_HEAD(&pvreg->krait_power_vregs);
446 the_gang = pvreg;
447
448 pr_debug("name=%s inited\n", pvreg->name);
449
450 return 0;
451}
452
453static int krait_power_get_voltage(struct regulator_dev *rdev)
454{
455 struct krait_power_vreg *kvreg = rdev_get_drvdata(rdev);
456
457 return kvreg->uV;
458}
459
460static int get_vmax(struct krait_power_vreg *from, int min_uV)
461{
462 int vmax = 0;
463 int v;
464 struct krait_power_vreg *kvreg;
465 struct pmic_gang_vreg *pvreg = from->pvreg;
466
467 list_for_each_entry(kvreg, &pvreg->krait_power_vregs, link) {
468 v = kvreg->uV;
469
470 if (kvreg == from)
471 v = min_uV;
472
473 if (vmax < v)
474 vmax = v;
475 }
476 return vmax;
477}
478
479static int get_total_load(struct krait_power_vreg *from)
480{
481 int load_total = 0;
482 struct krait_power_vreg *kvreg;
483 struct pmic_gang_vreg *pvreg = from->pvreg;
484
485 list_for_each_entry(kvreg, &pvreg->krait_power_vregs, link)
486 load_total += kvreg->load_uA;
487
488 return load_total;
489}
490
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700491#define ROUND_UP_VOLTAGE(v, res) (DIV_ROUND_UP(v, res) * res)
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700492static int krait_power_set_voltage(struct regulator_dev *rdev,
493 int min_uV, int max_uV, unsigned *selector)
494{
495 struct krait_power_vreg *kvreg = rdev_get_drvdata(rdev);
496 struct pmic_gang_vreg *pvreg = kvreg->pvreg;
497 int rc;
498 int vmax;
499
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700500 /*
501 * if the voltage requested is below LDO_THRESHOLD this cpu could
502 * switch to LDO mode. Hence round the voltage as per the LDO
503 * resolution
504 */
505 if (min_uV < CORE_VOLTAGE_LDO_THRESH) {
506 if (min_uV < KRAIT_LDO_VOLTAGE_MIN)
507 min_uV = KRAIT_LDO_VOLTAGE_MIN;
508 min_uV = ROUND_UP_VOLTAGE(min_uV, KRAIT_LDO_STEP);
509 }
510
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700511 mutex_lock(&pvreg->krait_power_vregs_lock);
512
513 vmax = get_vmax(kvreg, min_uV);
514
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700515 /* round up the pmic voltage as per its resolution */
516 vmax = ROUND_UP_VOLTAGE(vmax, LV_RANGE_STEP);
517
518 /*
519 * Assign the voltage before updating the gang voltage as we iterate
520 * over all the core voltages and choose HS or LDO for each of them
521 */
522 kvreg->uV = min_uV;
523
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700524 rc = pmic_gang_set_voltage(kvreg, vmax);
525 if (rc < 0) {
526 dev_err(&rdev->dev, "%s failed set voltage (%d, %d) rc = %d\n",
527 kvreg->name, min_uV, max_uV, rc);
528 goto out;
529 }
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700530
531 pvreg->pmic_vmax_uV = vmax;
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700532
533out:
534 mutex_unlock(&pvreg->krait_power_vregs_lock);
535 return rc;
536}
537
538static unsigned int krait_power_get_optimum_mode(struct regulator_dev *rdev,
539 int input_uV, int output_uV, int load_uA)
540{
541 struct krait_power_vreg *kvreg = rdev_get_drvdata(rdev);
542 struct pmic_gang_vreg *pvreg = kvreg->pvreg;
543 int rc;
544 int load_total_uA;
545 int reg_mode = -EINVAL;
546
547 mutex_lock(&pvreg->krait_power_vregs_lock);
548
549 kvreg->load_uA = load_uA;
550
551 load_total_uA = get_total_load(kvreg);
552
553 rc = pmic_gang_set_phases(kvreg, load_total_uA);
554 if (rc < 0) {
555 dev_err(&rdev->dev, "%s failed set mode %d rc = %d\n",
556 kvreg->name, load_total_uA, rc);
557 goto out;
558 }
559
560 reg_mode = kvreg->mode;
561out:
562 mutex_unlock(&pvreg->krait_power_vregs_lock);
563 return reg_mode;
564}
565
566static int krait_power_set_mode(struct regulator_dev *rdev, unsigned int mode)
567{
568 return 0;
569}
570
571static unsigned int krait_power_get_mode(struct regulator_dev *rdev)
572{
573 struct krait_power_vreg *kvreg = rdev_get_drvdata(rdev);
574
575 return kvreg->mode;
576}
577
578static struct regulator_ops krait_power_ops = {
579 .get_voltage = krait_power_get_voltage,
580 .set_voltage = krait_power_set_voltage,
581 .get_optimum_mode = krait_power_get_optimum_mode,
582 .set_mode = krait_power_set_mode,
583 .get_mode = krait_power_get_mode,
584};
585
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700586static void kvreg_hw_init(struct krait_power_vreg *kvreg)
587{
588 /*
589 * bhs_cnt value sets the ramp-up time from power collapse,
590 * initialize the ramp up time
591 */
592 krait_masked_write(kvreg, APC_PWR_GATE_CTL,
593 BHS_CNT_MASK, BHS_CNT_DEFAULT << BHS_CNT_BIT_POS);
594
595 krait_masked_write(kvreg, APC_PWR_GATE_CTL,
596 CLK_SRC_SEL_MASK, CLK_SRC_DEFAULT << CLK_SRC_SEL_BIT_POS);
597
598 /* BHS has six different segments, turn them all on */
599 krait_masked_write(kvreg, APC_PWR_GATE_CTL,
600 BHS_SEG_EN_MASK, BHS_SEG_EN_DEFAULT << BHS_SEG_EN_BIT_POS);
601}
602
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700603static int __devinit krait_power_probe(struct platform_device *pdev)
604{
605 struct krait_power_vreg *kvreg;
606 struct resource *res;
607 struct regulator_init_data *init_data = pdev->dev.platform_data;
608 int rc = 0;
609
610 /* Initialize the pmic gang if it hasn't been initialized already */
611 if (the_gang == NULL) {
612 rc = pvreg_init(pdev);
613 if (rc < 0) {
614 dev_err(&pdev->dev,
615 "failed to init pmic gang rc = %d\n", rc);
616 return rc;
617 }
618 }
619
620 if (pdev->dev.of_node) {
621 /* Get init_data from device tree. */
622 init_data = of_get_regulator_init_data(&pdev->dev,
623 pdev->dev.of_node);
624 init_data->constraints.valid_ops_mask
625 |= REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_DRMS
626 | REGULATOR_CHANGE_MODE;
627 init_data->constraints.valid_modes_mask
628 |= REGULATOR_MODE_NORMAL | REGULATOR_MODE_IDLE
629 | REGULATOR_MODE_FAST;
630 init_data->constraints.input_uV = init_data->constraints.max_uV;
631 }
632
633 if (!init_data) {
634 dev_err(&pdev->dev, "init data required.\n");
635 return -EINVAL;
636 }
637
638 if (!init_data->constraints.name) {
639 dev_err(&pdev->dev,
640 "regulator name must be specified in constraints.\n");
641 return -EINVAL;
642 }
643
644 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
645 if (!res) {
646 dev_err(&pdev->dev, "missing physical register addresses\n");
647 return -EINVAL;
648 }
649
650 kvreg = devm_kzalloc(&pdev->dev,
651 sizeof(struct krait_power_vreg), GFP_KERNEL);
652 if (!kvreg) {
653 dev_err(&pdev->dev, "kzalloc failed.\n");
654 return -ENOMEM;
655 }
656
657 kvreg->reg_base = devm_ioremap(&pdev->dev,
658 res->start, resource_size(res));
659
660 kvreg->pvreg = the_gang;
661 kvreg->name = init_data->constraints.name;
662 kvreg->desc.name = kvreg->name;
663 kvreg->desc.ops = &krait_power_ops;
664 kvreg->desc.type = REGULATOR_VOLTAGE;
665 kvreg->desc.owner = THIS_MODULE;
666 kvreg->uV = CORE_VOLTAGE_MIN;
667 kvreg->mode = HS_MODE;
668 kvreg->desc.ops = &krait_power_ops;
669
670 platform_set_drvdata(pdev, kvreg);
671
672 mutex_lock(&the_gang->krait_power_vregs_lock);
673 list_add_tail(&kvreg->link, &the_gang->krait_power_vregs);
674 mutex_unlock(&the_gang->krait_power_vregs_lock);
675
676 kvreg->rdev = regulator_register(&kvreg->desc, &pdev->dev, init_data,
677 kvreg, pdev->dev.of_node);
678 if (IS_ERR(kvreg->rdev)) {
679 rc = PTR_ERR(kvreg->rdev);
680 pr_err("regulator_register failed, rc=%d.\n", rc);
681 goto out;
682 }
683
Abhijeet Dharmapurikar152a7082012-05-14 20:25:59 -0700684 kvreg_hw_init(kvreg);
Abhijeet Dharmapurikar00269e52012-05-14 17:59:10 -0700685 dev_dbg(&pdev->dev, "id=%d, name=%s\n", pdev->id, kvreg->name);
686
687 return 0;
688out:
689 mutex_lock(&the_gang->krait_power_vregs_lock);
690 list_del(&kvreg->link);
691 mutex_unlock(&the_gang->krait_power_vregs_lock);
692
693 platform_set_drvdata(pdev, NULL);
694 return rc;
695}
696
697static int __devexit krait_power_remove(struct platform_device *pdev)
698{
699 struct krait_power_vreg *kvreg = platform_get_drvdata(pdev);
700 struct pmic_gang_vreg *pvreg = kvreg->pvreg;
701
702 mutex_lock(&pvreg->krait_power_vregs_lock);
703 list_del(&kvreg->link);
704 mutex_unlock(&pvreg->krait_power_vregs_lock);
705
706 regulator_unregister(kvreg->rdev);
707 platform_set_drvdata(pdev, NULL);
708 return 0;
709}
710
711static struct of_device_id krait_power_match_table[] = {
712 { .compatible = "qcom,krait-regulator", },
713 {}
714};
715
716static struct platform_driver krait_power_driver = {
717 .probe = krait_power_probe,
718 .remove = __devexit_p(krait_power_remove),
719 .driver = {
720 .name = KRAIT_REGULATOR_DRIVER_NAME,
721 .of_match_table = krait_power_match_table,
722 .owner = THIS_MODULE,
723 },
724};
725
726int __init krait_power_init(void)
727{
728 return platform_driver_register(&krait_power_driver);
729}
730
731static void __exit krait_power_exit(void)
732{
733 platform_driver_unregister(&krait_power_driver);
734}
735
736module_exit(krait_power_exit);
737
738MODULE_LICENSE("GPL v2");
739MODULE_DESCRIPTION("KRAIT POWER regulator driver");
740MODULE_VERSION("1.0");
741MODULE_ALIAS("platform:"KRAIT_REGULATOR_DRIVER_NAME);