blob: 6d77dcd7dcf6cfb3a8f76745c779d09eae2f7d97 [file] [log] [blame]
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -04001/*
2 * Regulators driver for Marvell 88PM8607
3 *
4 * Copyright (C) 2009 Marvell International Ltd.
Jingoo Hane54f19b2014-02-26 10:22:05 +09005 * Haojian Zhuang <haojian.zhuang@marvell.com>
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -04006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/err.h>
Haojian Zhuang53dbab72010-01-08 06:01:24 -050014#include <linux/i2c.h>
Haojian Zhuang2e57d562012-09-21 18:06:52 +080015#include <linux/of.h>
16#include <linux/regulator/of_regulator.h>
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -040017#include <linux/platform_device.h>
18#include <linux/regulator/driver.h>
19#include <linux/regulator/machine.h>
Haojian Zhuang53dbab72010-01-08 06:01:24 -050020#include <linux/mfd/88pm860x.h>
Paul Gortmaker65602c32011-07-17 16:28:23 -040021#include <linux/module.h>
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -040022
23struct pm8607_regulator_info {
24 struct regulator_desc desc;
Haojian Zhuang53dbab72010-01-08 06:01:24 -050025 struct pm860x_chip *chip;
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -040026 struct regulator_dev *regulator;
Haojian Zhuang53dbab72010-01-08 06:01:24 -050027 struct i2c_client *i2c;
Jett.Zhoue7a78102012-09-17 12:19:06 +080028 struct i2c_client *i2c_8606;
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -040029
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -040030 unsigned int *vol_table;
31 unsigned int *vol_suspend;
32
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -040033 int slope_double;
34};
35
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -040036static const unsigned int BUCK1_table[] = {
37 725000, 750000, 775000, 800000, 825000, 850000, 875000, 900000,
38 925000, 950000, 975000, 1000000, 1025000, 1050000, 1075000, 1100000,
39 1125000, 1150000, 1175000, 1200000, 1225000, 1250000, 1275000, 1300000,
40 1325000, 1350000, 1375000, 1400000, 1425000, 1450000, 1475000, 1500000,
41 0, 25000, 50000, 75000, 100000, 125000, 150000, 175000,
42 200000, 225000, 250000, 275000, 300000, 325000, 350000, 375000,
43 400000, 425000, 450000, 475000, 500000, 525000, 550000, 575000,
44 600000, 625000, 650000, 675000, 700000, 725000, 750000, 775000,
45};
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -040046
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -040047static const unsigned int BUCK1_suspend_table[] = {
48 0, 25000, 50000, 75000, 100000, 125000, 150000, 175000,
49 200000, 225000, 250000, 275000, 300000, 325000, 350000, 375000,
50 400000, 425000, 450000, 475000, 500000, 525000, 550000, 575000,
51 600000, 625000, 650000, 675000, 700000, 725000, 750000, 775000,
52 800000, 825000, 850000, 875000, 900000, 925000, 950000, 975000,
53 1000000, 1025000, 1050000, 1075000, 1100000, 1125000, 1150000, 1175000,
54 1200000, 1225000, 1250000, 1275000, 1300000, 1325000, 1350000, 1375000,
55 1400000, 1425000, 1450000, 1475000, 1500000, 1500000, 1500000, 1500000,
56};
57
58static const unsigned int BUCK2_table[] = {
59 0, 50000, 100000, 150000, 200000, 250000, 300000, 350000,
60 400000, 450000, 500000, 550000, 600000, 650000, 700000, 750000,
61 800000, 850000, 900000, 950000, 1000000, 1050000, 1100000, 1150000,
62 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000, 1550000,
63 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000, 1950000,
64 2000000, 2050000, 2100000, 2150000, 2200000, 2250000, 2300000, 2350000,
65 2400000, 2450000, 2500000, 2550000, 2600000, 2650000, 2700000, 2750000,
66 2800000, 2850000, 2900000, 2950000, 3000000, 3000000, 3000000, 3000000,
67};
68
69static const unsigned int BUCK2_suspend_table[] = {
70 0, 50000, 100000, 150000, 200000, 250000, 300000, 350000,
71 400000, 450000, 500000, 550000, 600000, 650000, 700000, 750000,
72 800000, 850000, 900000, 950000, 1000000, 1050000, 1100000, 1150000,
73 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000, 1550000,
74 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000, 1950000,
75 2000000, 2050000, 2100000, 2150000, 2200000, 2250000, 2300000, 2350000,
76 2400000, 2450000, 2500000, 2550000, 2600000, 2650000, 2700000, 2750000,
77 2800000, 2850000, 2900000, 2950000, 3000000, 3000000, 3000000, 3000000,
78};
79
80static const unsigned int BUCK3_table[] = {
Jingoo Hane54f19b2014-02-26 10:22:05 +090081 0, 25000, 50000, 75000, 100000, 125000, 150000, 175000,
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -040082 200000, 225000, 250000, 275000, 300000, 325000, 350000, 375000,
83 400000, 425000, 450000, 475000, 500000, 525000, 550000, 575000,
84 600000, 625000, 650000, 675000, 700000, 725000, 750000, 775000,
85 800000, 825000, 850000, 875000, 900000, 925000, 950000, 975000,
86 1000000, 1025000, 1050000, 1075000, 1100000, 1125000, 1150000, 1175000,
87 1200000, 1225000, 1250000, 1275000, 1300000, 1325000, 1350000, 1375000,
88 1400000, 1425000, 1450000, 1475000, 1500000, 1500000, 1500000, 1500000,
89};
90
91static const unsigned int BUCK3_suspend_table[] = {
Jingoo Hane54f19b2014-02-26 10:22:05 +090092 0, 25000, 50000, 75000, 100000, 125000, 150000, 175000,
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -040093 200000, 225000, 250000, 275000, 300000, 325000, 350000, 375000,
94 400000, 425000, 450000, 475000, 500000, 525000, 550000, 575000,
95 600000, 625000, 650000, 675000, 700000, 725000, 750000, 775000,
96 800000, 825000, 850000, 875000, 900000, 925000, 950000, 975000,
97 1000000, 1025000, 1050000, 1075000, 1100000, 1125000, 1150000, 1175000,
98 1200000, 1225000, 1250000, 1275000, 1300000, 1325000, 1350000, 1375000,
99 1400000, 1425000, 1450000, 1475000, 1500000, 1500000, 1500000, 1500000,
100};
101
102static const unsigned int LDO1_table[] = {
103 1800000, 1200000, 2800000, 0,
104};
105
106static const unsigned int LDO1_suspend_table[] = {
107 1800000, 1200000, 0, 0,
108};
109
110static const unsigned int LDO2_table[] = {
111 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 3300000,
112};
113
114static const unsigned int LDO2_suspend_table[] = {
115 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 2900000,
116};
117
118static const unsigned int LDO3_table[] = {
119 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 3300000,
120};
121
122static const unsigned int LDO3_suspend_table[] = {
123 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 2900000,
124};
125
126static const unsigned int LDO4_table[] = {
127 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2900000, 3300000,
128};
129
130static const unsigned int LDO4_suspend_table[] = {
131 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2900000, 2900000,
132};
133
134static const unsigned int LDO5_table[] = {
135 2900000, 3000000, 3100000, 3300000,
136};
137
138static const unsigned int LDO5_suspend_table[] = {
139 2900000, 0, 0, 0,
140};
141
142static const unsigned int LDO6_table[] = {
143 1800000, 1850000, 2600000, 2650000, 2700000, 2750000, 2800000, 3300000,
144};
145
146static const unsigned int LDO6_suspend_table[] = {
147 1800000, 1850000, 2600000, 2650000, 2700000, 2750000, 2800000, 2900000,
148};
149
150static const unsigned int LDO7_table[] = {
151 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 2900000,
152};
153
154static const unsigned int LDO7_suspend_table[] = {
155 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 2900000,
156};
157
158static const unsigned int LDO8_table[] = {
159 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 2900000,
160};
161
162static const unsigned int LDO8_suspend_table[] = {
163 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 2900000,
164};
165
166static const unsigned int LDO9_table[] = {
167 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 3300000,
168};
169
170static const unsigned int LDO9_suspend_table[] = {
171 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 2900000,
172};
173
174static const unsigned int LDO10_table[] = {
175 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 3300000,
176 1200000, 1200000, 1200000, 1200000, 1200000, 1200000, 1200000, 1200000,
177};
178
179static const unsigned int LDO10_suspend_table[] = {
180 1800000, 1850000, 1900000, 2700000, 2750000, 2800000, 2850000, 2900000,
181 1200000, 1200000, 1200000, 1200000, 1200000, 1200000, 1200000, 1200000,
182};
183
184static const unsigned int LDO12_table[] = {
185 1800000, 1900000, 2700000, 2800000, 2900000, 3000000, 3100000, 3300000,
186 1200000, 1200000, 1200000, 1200000, 1200000, 1200000, 1200000, 1200000,
187};
188
189static const unsigned int LDO12_suspend_table[] = {
190 1800000, 1900000, 2700000, 2800000, 2900000, 2900000, 2900000, 2900000,
191 1200000, 1200000, 1200000, 1200000, 1200000, 1200000, 1200000, 1200000,
192};
193
194static const unsigned int LDO13_table[] = {
Jett.Zhou33806432012-02-23 19:52:08 +0800195 1200000, 1300000, 1800000, 2000000, 2500000, 2800000, 3000000, 0,
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -0400196};
197
198static const unsigned int LDO13_suspend_table[] = {
199 0,
200};
201
202static const unsigned int LDO14_table[] = {
203 1800000, 1850000, 2700000, 2750000, 2800000, 2850000, 2900000, 3300000,
204};
205
206static const unsigned int LDO14_suspend_table[] = {
207 1800000, 1850000, 2700000, 2750000, 2800000, 2850000, 2900000, 2900000,
208};
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400209
210static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
211{
212 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400213 int ret = -EINVAL;
214
Axel Lin53b69492012-03-28 14:59:23 +0800215 if (info->vol_table && (index < rdev->desc->n_voltages)) {
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -0400216 ret = info->vol_table[index];
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400217 if (info->slope_double)
218 ret <<= 1;
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400219 }
220 return ret;
221}
222
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400223static struct regulator_ops pm8607_regulator_ops = {
Axel Lind3d7bcc2012-03-28 14:58:29 +0800224 .list_voltage = pm8607_list_voltage,
Axel Linc6f0a0e2012-12-24 09:14:38 +0800225 .set_voltage_sel = regulator_set_voltage_sel_regmap,
Axel Linc006b212012-04-24 09:52:32 +0800226 .get_voltage_sel = regulator_get_voltage_sel_regmap,
Axel Linef26e0d2012-04-17 11:32:57 +0800227 .enable = regulator_enable_regmap,
228 .disable = regulator_disable_regmap,
229 .is_enabled = regulator_is_enabled_regmap,
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400230};
231
Jett.Zhoue7a78102012-09-17 12:19:06 +0800232static struct regulator_ops pm8606_preg_ops = {
Axel Lin318c6582013-03-05 14:16:58 +0800233 .enable = regulator_enable_regmap,
234 .disable = regulator_disable_regmap,
235 .is_enabled = regulator_is_enabled_regmap,
Jett.Zhoue7a78102012-09-17 12:19:06 +0800236};
237
238#define PM8606_PREG(ereg, ebit) \
239{ \
240 .desc = { \
241 .name = "PREG", \
242 .ops = &pm8606_preg_ops, \
243 .type = REGULATOR_CURRENT, \
244 .id = PM8606_ID_PREG, \
245 .owner = THIS_MODULE, \
246 .enable_reg = PM8606_##ereg, \
247 .enable_mask = (ebit), \
Axel Lin318c6582013-03-05 14:16:58 +0800248 .enable_is_inverted = true, \
Jett.Zhoue7a78102012-09-17 12:19:06 +0800249 }, \
250}
251
Axel Lin53b69492012-03-28 14:59:23 +0800252#define PM8607_DVC(vreg, ureg, ubit, ereg, ebit) \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400253{ \
254 .desc = { \
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -0400255 .name = #vreg, \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400256 .ops = &pm8607_regulator_ops, \
257 .type = REGULATOR_VOLTAGE, \
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -0400258 .id = PM8607_ID_##vreg, \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400259 .owner = THIS_MODULE, \
Axel Lin53b69492012-03-28 14:59:23 +0800260 .n_voltages = ARRAY_SIZE(vreg##_table), \
Axel Linc006b212012-04-24 09:52:32 +0800261 .vsel_reg = PM8607_##vreg, \
262 .vsel_mask = ARRAY_SIZE(vreg##_table) - 1, \
Axel Linc6f0a0e2012-12-24 09:14:38 +0800263 .apply_reg = PM8607_##ureg, \
264 .apply_bit = (ubit), \
Axel Linef26e0d2012-04-17 11:32:57 +0800265 .enable_reg = PM8607_##ereg, \
266 .enable_mask = 1 << (ebit), \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400267 }, \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400268 .slope_double = (0), \
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -0400269 .vol_table = (unsigned int *)&vreg##_table, \
270 .vol_suspend = (unsigned int *)&vreg##_suspend_table, \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400271}
272
Axel Lin53b69492012-03-28 14:59:23 +0800273#define PM8607_LDO(_id, vreg, shift, ereg, ebit) \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400274{ \
275 .desc = { \
276 .name = "LDO" #_id, \
277 .ops = &pm8607_regulator_ops, \
278 .type = REGULATOR_VOLTAGE, \
279 .id = PM8607_ID_LDO##_id, \
280 .owner = THIS_MODULE, \
Axel Lin53b69492012-03-28 14:59:23 +0800281 .n_voltages = ARRAY_SIZE(LDO##_id##_table), \
Axel Linc006b212012-04-24 09:52:32 +0800282 .vsel_reg = PM8607_##vreg, \
283 .vsel_mask = (ARRAY_SIZE(LDO##_id##_table) - 1) << (shift), \
Axel Linef26e0d2012-04-17 11:32:57 +0800284 .enable_reg = PM8607_##ereg, \
285 .enable_mask = 1 << (ebit), \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400286 }, \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400287 .slope_double = (0), \
Haojian Zhuang9f79e9d2010-05-04 09:54:51 -0400288 .vol_table = (unsigned int *)&LDO##_id##_table, \
289 .vol_suspend = (unsigned int *)&LDO##_id##_suspend_table, \
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400290}
291
292static struct pm8607_regulator_info pm8607_regulator_info[] = {
Axel Linc6f0a0e2012-12-24 09:14:38 +0800293 PM8607_DVC(BUCK1, GO, BIT(0), SUPPLIES_EN11, 0),
294 PM8607_DVC(BUCK2, GO, BIT(1), SUPPLIES_EN11, 1),
295 PM8607_DVC(BUCK3, GO, BIT(2), SUPPLIES_EN11, 2),
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400296
Axel Lin53b69492012-03-28 14:59:23 +0800297 PM8607_LDO(1, LDO1, 0, SUPPLIES_EN11, 3),
298 PM8607_LDO(2, LDO2, 0, SUPPLIES_EN11, 4),
299 PM8607_LDO(3, LDO3, 0, SUPPLIES_EN11, 5),
300 PM8607_LDO(4, LDO4, 0, SUPPLIES_EN11, 6),
301 PM8607_LDO(5, LDO5, 0, SUPPLIES_EN11, 7),
302 PM8607_LDO(6, LDO6, 0, SUPPLIES_EN12, 0),
303 PM8607_LDO(7, LDO7, 0, SUPPLIES_EN12, 1),
304 PM8607_LDO(8, LDO8, 0, SUPPLIES_EN12, 2),
305 PM8607_LDO(9, LDO9, 0, SUPPLIES_EN12, 3),
306 PM8607_LDO(10, LDO10, 0, SUPPLIES_EN12, 4),
307 PM8607_LDO(12, LDO12, 0, SUPPLIES_EN12, 5),
308 PM8607_LDO(13, VIBRATOR_SET, 1, VIBRATOR_SET, 0),
309 PM8607_LDO(14, LDO14, 0, SUPPLIES_EN12, 6),
Haojian Zhuangff13e9e2012-09-17 12:19:07 +0800310};
Jett.Zhoue7a78102012-09-17 12:19:06 +0800311
Haojian Zhuangff13e9e2012-09-17 12:19:07 +0800312static struct pm8607_regulator_info pm8606_regulator_info[] = {
Jett.Zhoue7a78102012-09-17 12:19:06 +0800313 PM8606_PREG(PREREGULATORB, 5),
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400314};
315
Haojian Zhuang2e57d562012-09-21 18:06:52 +0800316#ifdef CONFIG_OF
317static int pm8607_regulator_dt_init(struct platform_device *pdev,
318 struct pm8607_regulator_info *info,
319 struct regulator_config *config)
320{
321 struct device_node *nproot, *np;
Guodong Xub8b27a42014-09-10 11:50:39 +0800322 nproot = pdev->dev.parent->of_node;
Haojian Zhuang2e57d562012-09-21 18:06:52 +0800323 if (!nproot)
324 return -ENODEV;
Sachin Kamatca1e3f32014-02-14 17:19:53 +0530325 nproot = of_get_child_by_name(nproot, "regulators");
Haojian Zhuang2e57d562012-09-21 18:06:52 +0800326 if (!nproot) {
327 dev_err(&pdev->dev, "failed to find regulators node\n");
328 return -ENODEV;
329 }
330 for_each_child_of_node(nproot, np) {
331 if (!of_node_cmp(np->name, info->desc.name)) {
332 config->init_data =
333 of_get_regulator_init_data(&pdev->dev, np);
334 config->of_node = np;
335 break;
336 }
337 }
Axel Linc92f5dd2013-01-27 21:16:56 +0800338 of_node_put(nproot);
Haojian Zhuang2e57d562012-09-21 18:06:52 +0800339 return 0;
340}
341#else
342#define pm8607_regulator_dt_init(x, y, z) (-1)
343#endif
344
Bill Pembertona5023572012-11-19 13:22:22 -0500345static int pm8607_regulator_probe(struct platform_device *pdev)
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400346{
Haojian Zhuang53dbab72010-01-08 06:01:24 -0500347 struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400348 struct pm8607_regulator_info *info = NULL;
Jingoo Handff91d02013-07-30 17:20:47 +0900349 struct regulator_init_data *pdata = dev_get_platdata(&pdev->dev);
Mark Brownc1727082012-04-04 00:50:22 +0100350 struct regulator_config config = { };
Haojian Zhuang586e1a12011-05-06 17:21:23 +0800351 struct resource *res;
Haojian Zhuang22aad002011-03-07 23:43:11 +0800352 int i;
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400353
Mark Brown02367022012-08-07 19:42:48 +0100354 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
Haojian Zhuangff13e9e2012-09-17 12:19:07 +0800355 if (res) {
356 /* There're resources in 88PM8607 regulator driver */
357 for (i = 0; i < ARRAY_SIZE(pm8607_regulator_info); i++) {
358 info = &pm8607_regulator_info[i];
359 if (info->desc.vsel_reg == res->start)
360 break;
361 }
362 if (i == ARRAY_SIZE(pm8607_regulator_info)) {
363 dev_err(&pdev->dev, "Failed to find regulator %llu\n",
364 (unsigned long long)res->start);
365 return -EINVAL;
366 }
367 } else {
368 /* There's no resource in 88PM8606 PREG regulator driver */
369 info = &pm8606_regulator_info[0];
370 /* i is used to check regulator ID */
371 i = -1;
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400372 }
Haojian Zhuang53dbab72010-01-08 06:01:24 -0500373 info->i2c = (chip->id == CHIP_PM8607) ? chip->client : chip->companion;
Jett.Zhoue7a78102012-09-17 12:19:06 +0800374 info->i2c_8606 = (chip->id == CHIP_PM8607) ? chip->companion :
375 chip->client;
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400376 info->chip = chip;
377
Haojian Zhuang22aad002011-03-07 23:43:11 +0800378 /* check DVC ramp slope double */
Haojian Zhuang586e1a12011-05-06 17:21:23 +0800379 if ((i == PM8607_ID_BUCK3) && info->chip->buck3_double)
380 info->slope_double = 1;
Haojian Zhuang22aad002011-03-07 23:43:11 +0800381
Mark Brownc1727082012-04-04 00:50:22 +0100382 config.dev = &pdev->dev;
Mark Brownc1727082012-04-04 00:50:22 +0100383 config.driver_data = info;
384
Haojian Zhuang2e57d562012-09-21 18:06:52 +0800385 if (pm8607_regulator_dt_init(pdev, info, &config))
386 if (pdata)
387 config.init_data = pdata;
388
Axel Linef26e0d2012-04-17 11:32:57 +0800389 if (chip->id == CHIP_PM8607)
390 config.regmap = chip->regmap;
391 else
392 config.regmap = chip->regmap_companion;
393
Axel Linbcb5fe42013-09-03 14:17:36 +0800394 info->regulator = devm_regulator_register(&pdev->dev, &info->desc,
395 &config);
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400396 if (IS_ERR(info->regulator)) {
397 dev_err(&pdev->dev, "failed to register regulator %s\n",
398 info->desc.name);
399 return PTR_ERR(info->regulator);
400 }
401
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400402 platform_set_drvdata(pdev, info);
403 return 0;
404}
405
Jett.Zhoue7a78102012-09-17 12:19:06 +0800406static struct platform_device_id pm8607_regulator_driver_ids[] = {
407 {
408 .name = "88pm860x-regulator",
409 .driver_data = 0,
410 }, {
411 .name = "88pm860x-preg",
412 .driver_data = 0,
413 },
414 { },
415};
416MODULE_DEVICE_TABLE(platform, pm8607_regulator_driver_ids);
417
Haojian Zhuang192bbb92010-04-29 13:33:50 -0400418static struct platform_driver pm8607_regulator_driver = {
419 .driver = {
420 .name = "88pm860x-regulator",
421 .owner = THIS_MODULE,
422 },
423 .probe = pm8607_regulator_probe,
Jett.Zhoue7a78102012-09-17 12:19:06 +0800424 .id_table = pm8607_regulator_driver_ids,
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400425};
426
427static int __init pm8607_regulator_init(void)
428{
Haojian Zhuang192bbb92010-04-29 13:33:50 -0400429 return platform_driver_register(&pm8607_regulator_driver);
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400430}
431subsys_initcall(pm8607_regulator_init);
432
433static void __exit pm8607_regulator_exit(void)
434{
Haojian Zhuang192bbb92010-04-29 13:33:50 -0400435 platform_driver_unregister(&pm8607_regulator_driver);
Haojian Zhuangbe0e2d32009-10-08 02:03:57 -0400436}
437module_exit(pm8607_regulator_exit);
438
439MODULE_LICENSE("GPL");
440MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>");
441MODULE_DESCRIPTION("Regulator Driver for Marvell 88PM8607 PMIC");
442MODULE_ALIAS("platform:88pm8607-regulator");