4 * Copyright (c) 2011 Samsung Electronics Co., Ltd
5 * http://www.samsung.com
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
14 #include <linux/bug.h>
15 #include <linux/delay.h>
16 #include <linux/err.h>
17 #include <linux/gpio.h>
18 #include <linux/slab.h>
19 #include <linux/module.h>
20 #include <linux/platform_device.h>
21 #include <linux/regulator/driver.h>
22 #include <linux/regulator/machine.h>
23 #include <linux/mfd/s5m87xx/s5m-core.h>
24 #include <linux/mfd/s5m87xx/s5m-pmic.h>
28 struct s5m87xx_dev
*iodev
;
30 struct regulator_dev
**rdev
;
47 struct s5m_voltage_desc
{
53 static const struct s5m_voltage_desc buck_voltage_val1
= {
59 static const struct s5m_voltage_desc buck_voltage_val2
= {
65 static const struct s5m_voltage_desc buck_voltage_val3
= {
71 static const struct s5m_voltage_desc ldo_voltage_val1
= {
77 static const struct s5m_voltage_desc ldo_voltage_val2
= {
83 static const struct s5m_voltage_desc
*reg_voltage_map
[] = {
84 [S5M8767_LDO1
] = &ldo_voltage_val2
,
85 [S5M8767_LDO2
] = &ldo_voltage_val2
,
86 [S5M8767_LDO3
] = &ldo_voltage_val1
,
87 [S5M8767_LDO4
] = &ldo_voltage_val1
,
88 [S5M8767_LDO5
] = &ldo_voltage_val1
,
89 [S5M8767_LDO6
] = &ldo_voltage_val2
,
90 [S5M8767_LDO7
] = &ldo_voltage_val2
,
91 [S5M8767_LDO8
] = &ldo_voltage_val2
,
92 [S5M8767_LDO9
] = &ldo_voltage_val1
,
93 [S5M8767_LDO10
] = &ldo_voltage_val1
,
94 [S5M8767_LDO11
] = &ldo_voltage_val1
,
95 [S5M8767_LDO12
] = &ldo_voltage_val1
,
96 [S5M8767_LDO13
] = &ldo_voltage_val1
,
97 [S5M8767_LDO14
] = &ldo_voltage_val1
,
98 [S5M8767_LDO15
] = &ldo_voltage_val2
,
99 [S5M8767_LDO16
] = &ldo_voltage_val1
,
100 [S5M8767_LDO17
] = &ldo_voltage_val1
,
101 [S5M8767_LDO18
] = &ldo_voltage_val1
,
102 [S5M8767_LDO19
] = &ldo_voltage_val1
,
103 [S5M8767_LDO20
] = &ldo_voltage_val1
,
104 [S5M8767_LDO21
] = &ldo_voltage_val1
,
105 [S5M8767_LDO22
] = &ldo_voltage_val1
,
106 [S5M8767_LDO23
] = &ldo_voltage_val1
,
107 [S5M8767_LDO24
] = &ldo_voltage_val1
,
108 [S5M8767_LDO25
] = &ldo_voltage_val1
,
109 [S5M8767_LDO26
] = &ldo_voltage_val1
,
110 [S5M8767_LDO27
] = &ldo_voltage_val1
,
111 [S5M8767_LDO28
] = &ldo_voltage_val1
,
112 [S5M8767_BUCK1
] = &buck_voltage_val1
,
113 [S5M8767_BUCK2
] = &buck_voltage_val2
,
114 [S5M8767_BUCK3
] = &buck_voltage_val2
,
115 [S5M8767_BUCK4
] = &buck_voltage_val2
,
116 [S5M8767_BUCK5
] = &buck_voltage_val1
,
117 [S5M8767_BUCK6
] = &buck_voltage_val1
,
118 [S5M8767_BUCK7
] = NULL
,
119 [S5M8767_BUCK8
] = NULL
,
120 [S5M8767_BUCK9
] = &buck_voltage_val3
,
123 static int s5m8767_list_voltage(struct regulator_dev
*rdev
,
124 unsigned int selector
)
126 const struct s5m_voltage_desc
*desc
;
127 int reg_id
= rdev_get_id(rdev
);
130 if (reg_id
>= ARRAY_SIZE(reg_voltage_map
) || reg_id
< 0)
133 desc
= reg_voltage_map
[reg_id
];
137 val
= desc
->min
+ desc
->step
* selector
;
144 static int s5m8767_get_register(struct regulator_dev
*rdev
, int *reg
)
146 int reg_id
= rdev_get_id(rdev
);
149 case S5M8767_LDO1
... S5M8767_LDO2
:
150 *reg
= S5M8767_REG_LDO1CTRL
+ (reg_id
- S5M8767_LDO1
);
152 case S5M8767_LDO3
... S5M8767_LDO28
:
153 *reg
= S5M8767_REG_LDO3CTRL
+ (reg_id
- S5M8767_LDO3
);
156 *reg
= S5M8767_REG_BUCK1CTRL1
;
158 case S5M8767_BUCK2
... S5M8767_BUCK4
:
159 *reg
= S5M8767_REG_BUCK2CTRL
+ (reg_id
- S5M8767_BUCK2
) * 9;
162 *reg
= S5M8767_REG_BUCK5CTRL1
;
164 case S5M8767_BUCK6
... S5M8767_BUCK9
:
165 *reg
= S5M8767_REG_BUCK6CTRL1
+ (reg_id
- S5M8767_BUCK6
) * 2;
174 static int s5m8767_reg_is_enabled(struct regulator_dev
*rdev
)
176 struct s5m8767_info
*s5m8767
= rdev_get_drvdata(rdev
);
178 int mask
= 0xc0, pattern
= 0xc0;
181 ret
= s5m8767_get_register(rdev
, ®
);
187 ret
= s5m_reg_read(s5m8767
->iodev
, reg
, &val
);
191 return (val
& mask
) == pattern
;
194 static int s5m8767_reg_enable(struct regulator_dev
*rdev
)
196 struct s5m8767_info
*s5m8767
= rdev_get_drvdata(rdev
);
198 int mask
= 0xc0, pattern
= 0xc0;
200 ret
= s5m8767_get_register(rdev
, ®
);
204 return s5m_reg_update(s5m8767
->iodev
, reg
, pattern
, mask
);
207 static int s5m8767_reg_disable(struct regulator_dev
*rdev
)
209 struct s5m8767_info
*s5m8767
= rdev_get_drvdata(rdev
);
211 int mask
= 0xc0, pattern
= 0xc0;
213 ret
= s5m8767_get_register(rdev
, ®
);
217 return s5m_reg_update(s5m8767
->iodev
, reg
, ~pattern
, mask
);
220 static int s5m8767_get_voltage_register(struct regulator_dev
*rdev
, int *_reg
)
222 struct s5m8767_info
*s5m8767
= rdev_get_drvdata(rdev
);
223 int reg_id
= rdev_get_id(rdev
);
227 case S5M8767_LDO1
... S5M8767_LDO2
:
228 reg
= S5M8767_REG_LDO1CTRL
+ (reg_id
- S5M8767_LDO1
);
230 case S5M8767_LDO3
... S5M8767_LDO28
:
231 reg
= S5M8767_REG_LDO3CTRL
+ (reg_id
- S5M8767_LDO3
);
234 reg
= S5M8767_REG_BUCK1CTRL2
;
237 reg
= S5M8767_REG_BUCK2DVS1
;
238 if (s5m8767
->buck2_gpiodvs
)
239 reg
+= s5m8767
->buck_gpioindex
;
242 reg
= S5M8767_REG_BUCK3DVS1
;
243 if (s5m8767
->buck3_gpiodvs
)
244 reg
+= s5m8767
->buck_gpioindex
;
247 reg
= S5M8767_REG_BUCK4DVS1
;
248 if (s5m8767
->buck4_gpiodvs
)
249 reg
+= s5m8767
->buck_gpioindex
;
252 reg
= S5M8767_REG_BUCK5CTRL2
;
254 case S5M8767_BUCK6
... S5M8767_BUCK9
:
255 reg
= S5M8767_REG_BUCK6CTRL2
+ (reg_id
- S5M8767_BUCK6
) * 2;
266 static int s5m8767_get_voltage_sel(struct regulator_dev
*rdev
)
268 struct s5m8767_info
*s5m8767
= rdev_get_drvdata(rdev
);
270 int reg_id
= rdev_get_id(rdev
);
273 ret
= s5m8767_get_voltage_register(rdev
, ®
);
277 mask
= (reg_id
< S5M8767_BUCK1
) ? 0x3f : 0xff;
279 ret
= s5m_reg_read(s5m8767
->iodev
, reg
, &val
);
288 static int s5m8767_convert_voltage_to_sel(
289 const struct s5m_voltage_desc
*desc
,
290 int min_vol
, int max_vol
)
297 if (max_vol
< desc
->min
|| min_vol
> desc
->max
)
300 selector
= (min_vol
- desc
->min
) / desc
->step
;
302 if (desc
->min
+ desc
->step
* selector
> max_vol
)
308 static int s5m8767_set_voltage(struct regulator_dev
*rdev
,
309 int min_uV
, int max_uV
, unsigned *selector
)
311 struct s5m8767_info
*s5m8767
= rdev_get_drvdata(rdev
);
312 const struct s5m_voltage_desc
*desc
;
313 int reg_id
= rdev_get_id(rdev
);
314 int sel
, reg
, mask
, ret
;
318 case S5M8767_LDO1
... S5M8767_LDO28
:
321 case S5M8767_BUCK1
... S5M8767_BUCK6
:
324 case S5M8767_BUCK7
... S5M8767_BUCK8
:
333 desc
= reg_voltage_map
[reg_id
];
335 sel
= s5m8767_convert_voltage_to_sel(desc
, min_uV
, max_uV
);
339 ret
= s5m8767_get_voltage_register(rdev
, ®
);
343 s5m_reg_read(s5m8767
->iodev
, reg
, &val
);
347 ret
= s5m_reg_write(s5m8767
->iodev
, reg
, val
);
353 static inline void s5m8767_set_high(struct s5m8767_info
*s5m8767
)
355 int temp_index
= s5m8767
->buck_gpioindex
;
357 gpio_set_value(s5m8767
->buck_gpios
[0], (temp_index
>> 2) & 0x1);
358 gpio_set_value(s5m8767
->buck_gpios
[1], (temp_index
>> 1) & 0x1);
359 gpio_set_value(s5m8767
->buck_gpios
[2], temp_index
& 0x1);
362 static inline void s5m8767_set_low(struct s5m8767_info
*s5m8767
)
364 int temp_index
= s5m8767
->buck_gpioindex
;
366 gpio_set_value(s5m8767
->buck_gpios
[2], temp_index
& 0x1);
367 gpio_set_value(s5m8767
->buck_gpios
[1], (temp_index
>> 1) & 0x1);
368 gpio_set_value(s5m8767
->buck_gpios
[0], (temp_index
>> 2) & 0x1);
371 static int s5m8767_set_voltage_buck(struct regulator_dev
*rdev
,
372 int min_uV
, int max_uV
, unsigned *selector
)
374 struct s5m8767_info
*s5m8767
= rdev_get_drvdata(rdev
);
375 int reg_id
= rdev_get_id(rdev
);
376 const struct s5m_voltage_desc
*desc
;
377 int new_val
, old_val
, i
= 0;
379 if (reg_id
< S5M8767_BUCK1
|| reg_id
> S5M8767_BUCK6
)
384 return s5m8767_set_voltage(rdev
, min_uV
, max_uV
, selector
);
385 case S5M8767_BUCK2
... S5M8767_BUCK4
:
387 case S5M8767_BUCK5
... S5M8767_BUCK6
:
388 return s5m8767_set_voltage(rdev
, min_uV
, max_uV
, selector
);
390 return s5m8767_set_voltage(rdev
, min_uV
, max_uV
, selector
);
393 desc
= reg_voltage_map
[reg_id
];
394 new_val
= s5m8767_convert_voltage_to_sel(desc
, min_uV
, max_uV
);
400 if (s5m8767
->buck2_gpiodvs
) {
401 while (s5m8767
->buck2_vol
[i
] != new_val
)
404 return s5m8767_set_voltage(rdev
, min_uV
,
408 if (s5m8767
->buck3_gpiodvs
) {
409 while (s5m8767
->buck3_vol
[i
] != new_val
)
412 return s5m8767_set_voltage(rdev
, min_uV
,
416 if (s5m8767
->buck3_gpiodvs
) {
417 while (s5m8767
->buck4_vol
[i
] != new_val
)
420 return s5m8767_set_voltage(rdev
, min_uV
,
425 old_val
= s5m8767
->buck_gpioindex
;
426 s5m8767
->buck_gpioindex
= i
;
429 s5m8767_set_high(s5m8767
);
431 s5m8767_set_low(s5m8767
);
437 static int s5m8767_set_voltage_time_sel(struct regulator_dev
*rdev
,
438 unsigned int old_sel
,
439 unsigned int new_sel
)
441 struct s5m8767_info
*s5m8767
= rdev_get_drvdata(rdev
);
442 const struct s5m_voltage_desc
*desc
;
443 int reg_id
= rdev_get_id(rdev
);
445 desc
= reg_voltage_map
[reg_id
];
447 if (old_sel
< new_sel
)
448 return DIV_ROUND_UP(desc
->step
* (new_sel
- old_sel
),
449 s5m8767
->ramp_delay
* 1000);
453 static struct regulator_ops s5m8767_ldo_ops
= {
454 .list_voltage
= s5m8767_list_voltage
,
455 .is_enabled
= s5m8767_reg_is_enabled
,
456 .enable
= s5m8767_reg_enable
,
457 .disable
= s5m8767_reg_disable
,
458 .get_voltage_sel
= s5m8767_get_voltage_sel
,
459 .set_voltage
= s5m8767_set_voltage
,
460 .set_voltage_time_sel
= s5m8767_set_voltage_time_sel
,
463 static struct regulator_ops s5m8767_buck_ops
= {
464 .list_voltage
= s5m8767_list_voltage
,
465 .is_enabled
= s5m8767_reg_is_enabled
,
466 .enable
= s5m8767_reg_enable
,
467 .disable
= s5m8767_reg_disable
,
468 .get_voltage_sel
= s5m8767_get_voltage_sel
,
469 .set_voltage
= s5m8767_set_voltage_buck
,
470 .set_voltage_time_sel
= s5m8767_set_voltage_time_sel
,
473 #define regulator_desc_ldo(num) { \
475 .id = S5M8767_LDO##num, \
476 .ops = &s5m8767_ldo_ops, \
477 .type = REGULATOR_VOLTAGE, \
478 .owner = THIS_MODULE, \
480 #define regulator_desc_buck(num) { \
481 .name = "BUCK"#num, \
482 .id = S5M8767_BUCK##num, \
483 .ops = &s5m8767_buck_ops, \
484 .type = REGULATOR_VOLTAGE, \
485 .owner = THIS_MODULE, \
488 static struct regulator_desc regulators
[] = {
489 regulator_desc_ldo(1),
490 regulator_desc_ldo(2),
491 regulator_desc_ldo(3),
492 regulator_desc_ldo(4),
493 regulator_desc_ldo(5),
494 regulator_desc_ldo(6),
495 regulator_desc_ldo(7),
496 regulator_desc_ldo(8),
497 regulator_desc_ldo(9),
498 regulator_desc_ldo(10),
499 regulator_desc_ldo(11),
500 regulator_desc_ldo(12),
501 regulator_desc_ldo(13),
502 regulator_desc_ldo(14),
503 regulator_desc_ldo(15),
504 regulator_desc_ldo(16),
505 regulator_desc_ldo(17),
506 regulator_desc_ldo(18),
507 regulator_desc_ldo(19),
508 regulator_desc_ldo(20),
509 regulator_desc_ldo(21),
510 regulator_desc_ldo(22),
511 regulator_desc_ldo(23),
512 regulator_desc_ldo(24),
513 regulator_desc_ldo(25),
514 regulator_desc_ldo(26),
515 regulator_desc_ldo(27),
516 regulator_desc_ldo(28),
517 regulator_desc_buck(1),
518 regulator_desc_buck(2),
519 regulator_desc_buck(3),
520 regulator_desc_buck(4),
521 regulator_desc_buck(5),
522 regulator_desc_buck(6),
523 regulator_desc_buck(7),
524 regulator_desc_buck(8),
525 regulator_desc_buck(9),
528 static __devinit
int s5m8767_pmic_probe(struct platform_device
*pdev
)
530 struct s5m87xx_dev
*iodev
= dev_get_drvdata(pdev
->dev
.parent
);
531 struct s5m_platform_data
*pdata
= dev_get_platdata(iodev
->dev
);
532 struct regulator_dev
**rdev
;
533 struct s5m8767_info
*s5m8767
;
537 dev_err(pdev
->dev
.parent
, "Platform data not supplied\n");
541 if (pdata
->buck2_gpiodvs
) {
542 if (pdata
->buck3_gpiodvs
|| pdata
->buck4_gpiodvs
) {
543 dev_err(&pdev
->dev
, "S5M8767 GPIO DVS NOT VALID\n");
548 if (pdata
->buck3_gpiodvs
) {
549 if (pdata
->buck2_gpiodvs
|| pdata
->buck4_gpiodvs
) {
550 dev_err(&pdev
->dev
, "S5M8767 GPIO DVS NOT VALID\n");
555 if (pdata
->buck4_gpiodvs
) {
556 if (pdata
->buck2_gpiodvs
|| pdata
->buck3_gpiodvs
) {
557 dev_err(&pdev
->dev
, "S5M8767 GPIO DVS NOT VALID\n");
562 s5m8767
= devm_kzalloc(&pdev
->dev
, sizeof(struct s5m8767_info
),
567 size
= sizeof(struct regulator_dev
*) * (S5M8767_REG_MAX
- 2);
568 s5m8767
->rdev
= devm_kzalloc(&pdev
->dev
, size
, GFP_KERNEL
);
572 rdev
= s5m8767
->rdev
;
573 s5m8767
->dev
= &pdev
->dev
;
574 s5m8767
->iodev
= iodev
;
575 s5m8767
->num_regulators
= S5M8767_REG_MAX
- 2;
576 platform_set_drvdata(pdev
, s5m8767
);
578 s5m8767
->buck_gpioindex
= pdata
->buck_default_idx
;
579 s5m8767
->buck2_gpiodvs
= pdata
->buck2_gpiodvs
;
580 s5m8767
->buck3_gpiodvs
= pdata
->buck3_gpiodvs
;
581 s5m8767
->buck4_gpiodvs
= pdata
->buck4_gpiodvs
;
582 s5m8767
->buck_gpios
[0] = pdata
->buck_gpios
[0];
583 s5m8767
->buck_gpios
[1] = pdata
->buck_gpios
[1];
584 s5m8767
->buck_gpios
[2] = pdata
->buck_gpios
[2];
585 s5m8767
->ramp_delay
= pdata
->buck_ramp_delay
;
586 s5m8767
->buck2_ramp
= pdata
->buck2_ramp_enable
;
587 s5m8767
->buck3_ramp
= pdata
->buck3_ramp_enable
;
588 s5m8767
->buck4_ramp
= pdata
->buck4_ramp_enable
;
590 for (i
= 0; i
< 8; i
++) {
591 if (s5m8767
->buck2_gpiodvs
) {
592 s5m8767
->buck2_vol
[i
] =
593 s5m8767_convert_voltage_to_sel(
595 pdata
->buck2_voltage
[i
],
596 pdata
->buck2_voltage
[i
] +
597 buck_voltage_val2
.step
);
600 if (s5m8767
->buck3_gpiodvs
) {
601 s5m8767
->buck3_vol
[i
] =
602 s5m8767_convert_voltage_to_sel(
604 pdata
->buck3_voltage
[i
],
605 pdata
->buck3_voltage
[i
] +
606 buck_voltage_val2
.step
);
609 if (s5m8767
->buck4_gpiodvs
) {
610 s5m8767
->buck4_vol
[i
] =
611 s5m8767_convert_voltage_to_sel(
613 pdata
->buck4_voltage
[i
],
614 pdata
->buck4_voltage
[i
] +
615 buck_voltage_val2
.step
);
619 if (pdata
->buck2_gpiodvs
|| pdata
->buck3_gpiodvs
||
620 pdata
->buck4_gpiodvs
) {
621 if (gpio_is_valid(pdata
->buck_gpios
[0]) &&
622 gpio_is_valid(pdata
->buck_gpios
[1]) &&
623 gpio_is_valid(pdata
->buck_gpios
[2])) {
624 ret
= gpio_request(pdata
->buck_gpios
[0],
627 dev_warn(&pdev
->dev
, "Duplicated gpio request for SET1\n");
629 ret
= gpio_request(pdata
->buck_gpios
[1],
632 dev_warn(&pdev
->dev
, "Duplicated gpio request for SET2\n");
634 ret
= gpio_request(pdata
->buck_gpios
[2],
637 dev_warn(&pdev
->dev
, "Duplicated gpio request for SET3\n");
639 gpio_direction_output(pdata
->buck_gpios
[0],
640 (s5m8767
->buck_gpioindex
>> 2) & 0x1);
642 gpio_direction_output(pdata
->buck_gpios
[1],
643 (s5m8767
->buck_gpioindex
>> 1) & 0x1);
645 gpio_direction_output(pdata
->buck_gpios
[2],
646 (s5m8767
->buck_gpioindex
>> 0) & 0x1);
649 dev_err(&pdev
->dev
, "GPIO NOT VALID\n");
655 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_BUCK2CTRL
,
656 (pdata
->buck2_gpiodvs
) ? (1 << 1) : (0 << 1), 1 << 1);
657 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_BUCK3CTRL
,
658 (pdata
->buck3_gpiodvs
) ? (1 << 1) : (0 << 1), 1 << 1);
659 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_BUCK4CTRL
,
660 (pdata
->buck4_gpiodvs
) ? (1 << 1) : (0 << 1), 1 << 1);
662 /* Initialize GPIO DVS registers */
663 for (i
= 0; i
< 8; i
++) {
664 if (s5m8767
->buck2_gpiodvs
) {
665 s5m_reg_write(s5m8767
->iodev
, S5M8767_REG_BUCK2DVS1
+ i
,
666 s5m8767
->buck2_vol
[i
]);
669 if (s5m8767
->buck3_gpiodvs
) {
670 s5m_reg_write(s5m8767
->iodev
, S5M8767_REG_BUCK3DVS1
+ i
,
671 s5m8767
->buck3_vol
[i
]);
674 if (s5m8767
->buck4_gpiodvs
) {
675 s5m_reg_write(s5m8767
->iodev
, S5M8767_REG_BUCK4DVS1
+ i
,
676 s5m8767
->buck4_vol
[i
]);
679 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_BUCK2CTRL
, 0x78, 0xff);
680 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_BUCK3CTRL
, 0x58, 0xff);
681 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_BUCK4CTRL
, 0x78, 0xff);
683 if (s5m8767
->buck2_ramp
)
684 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_DVSRAMP
, 0x08, 0x08);
686 if (s5m8767
->buck3_ramp
)
687 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_DVSRAMP
, 0x04, 0x04);
689 if (s5m8767
->buck4_ramp
)
690 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_DVSRAMP
, 0x02, 0x02);
692 if (s5m8767
->buck2_ramp
|| s5m8767
->buck3_ramp
693 || s5m8767
->buck4_ramp
) {
694 switch (s5m8767
->ramp_delay
) {
696 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_DVSRAMP
,
700 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_DVSRAMP
,
704 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_DVSRAMP
,
708 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_DVSRAMP
,
712 s5m_reg_update(s5m8767
->iodev
, S5M8767_REG_DVSRAMP
,
717 for (i
= 0; i
< pdata
->num_regulators
; i
++) {
718 const struct s5m_voltage_desc
*desc
;
719 int id
= pdata
->regulators
[i
].id
;
721 desc
= reg_voltage_map
[id
];
723 regulators
[id
].n_voltages
=
724 (desc
->max
- desc
->min
) / desc
->step
+ 1;
726 rdev
[i
] = regulator_register(®ulators
[id
], s5m8767
->dev
,
727 pdata
->regulators
[i
].initdata
, s5m8767
, NULL
);
728 if (IS_ERR(rdev
[i
])) {
729 ret
= PTR_ERR(rdev
[i
]);
730 dev_err(s5m8767
->dev
, "regulator init failed for %d\n",
739 for (i
= 0; i
< s5m8767
->num_regulators
; i
++)
741 regulator_unregister(rdev
[i
]);
746 static int __devexit
s5m8767_pmic_remove(struct platform_device
*pdev
)
748 struct s5m8767_info
*s5m8767
= platform_get_drvdata(pdev
);
749 struct regulator_dev
**rdev
= s5m8767
->rdev
;
752 for (i
= 0; i
< s5m8767
->num_regulators
; i
++)
754 regulator_unregister(rdev
[i
]);
759 static const struct platform_device_id s5m8767_pmic_id
[] = {
760 { "s5m8767-pmic", 0},
763 MODULE_DEVICE_TABLE(platform
, s5m8767_pmic_id
);
765 static struct platform_driver s5m8767_pmic_driver
= {
767 .name
= "s5m8767-pmic",
768 .owner
= THIS_MODULE
,
770 .probe
= s5m8767_pmic_probe
,
771 .remove
= __devexit_p(s5m8767_pmic_remove
),
772 .id_table
= s5m8767_pmic_id
,
775 static int __init
s5m8767_pmic_init(void)
777 return platform_driver_register(&s5m8767_pmic_driver
);
779 subsys_initcall(s5m8767_pmic_init
);
781 static void __exit
s5m8767_pmic_exit(void)
783 platform_driver_unregister(&s5m8767_pmic_driver
);
785 module_exit(s5m8767_pmic_exit
);
787 /* Module information */
788 MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
789 MODULE_DESCRIPTION("SAMSUNG S5M8767 Regulator Driver");
790 MODULE_LICENSE("GPL");