regulator: tps6586x: Add support for the TPS658640
[deliverable/linux.git] / drivers / regulator / tps6586x-regulator.c
CommitLineData
49610235
MR
1/*
2 * Regulator driver for TI TPS6586x
3 *
4 * Copyright (C) 2010 Compulab Ltd.
5 * Author: Mike Rapoport <mike@compulab.co.il>
6 *
7 * Based on da903x
8 * Copyright (C) 2006-2008 Marvell International Ltd.
9 * Copyright (C) 2008 Compulab Ltd.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
49610235 16#include <linux/kernel.h>
65602c32 17#include <linux/module.h>
49610235
MR
18#include <linux/init.h>
19#include <linux/err.h>
64e48160 20#include <linux/of.h>
49610235
MR
21#include <linux/slab.h>
22#include <linux/platform_device.h>
23#include <linux/regulator/driver.h>
24#include <linux/regulator/machine.h>
64e48160 25#include <linux/regulator/of_regulator.h>
49610235
MR
26#include <linux/mfd/tps6586x.h>
27
28/* supply control and voltage setting */
29#define TPS6586X_SUPPLYENA 0x10
30#define TPS6586X_SUPPLYENB 0x11
31#define TPS6586X_SUPPLYENC 0x12
32#define TPS6586X_SUPPLYEND 0x13
33#define TPS6586X_SUPPLYENE 0x14
34#define TPS6586X_VCC1 0x20
35#define TPS6586X_VCC2 0x21
36#define TPS6586X_SM1V1 0x23
37#define TPS6586X_SM1V2 0x24
38#define TPS6586X_SM1SL 0x25
39#define TPS6586X_SM0V1 0x26
40#define TPS6586X_SM0V2 0x27
41#define TPS6586X_SM0SL 0x28
42#define TPS6586X_LDO2AV1 0x29
43#define TPS6586X_LDO2AV2 0x2A
44#define TPS6586X_LDO2BV1 0x2F
45#define TPS6586X_LDO2BV2 0x30
46#define TPS6586X_LDO4V1 0x32
47#define TPS6586X_LDO4V2 0x33
48
49/* converter settings */
50#define TPS6586X_SUPPLYV1 0x41
51#define TPS6586X_SUPPLYV2 0x42
52#define TPS6586X_SUPPLYV3 0x43
53#define TPS6586X_SUPPLYV4 0x44
54#define TPS6586X_SUPPLYV5 0x45
55#define TPS6586X_SUPPLYV6 0x46
56#define TPS6586X_SMODE1 0x47
57#define TPS6586X_SMODE2 0x48
58
59struct tps6586x_regulator {
60 struct regulator_desc desc;
61
49610235
MR
62 int enable_bit[2];
63 int enable_reg[2];
49610235
MR
64};
65
66static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
67{
7c7fac30 68 return rdev_get_dev(rdev)->parent;
49610235
MR
69}
70
ad0b40fe 71static struct regulator_ops tps6586x_rw_regulator_ops = {
f4647037 72 .list_voltage = regulator_list_voltage_table,
4d673bbc 73 .map_voltage = regulator_map_voltage_ascend,
7c7475c0 74 .get_voltage_sel = regulator_get_voltage_sel_regmap,
d645d591 75 .set_voltage_sel = regulator_set_voltage_sel_regmap,
49610235 76
7c7475c0
AL
77 .is_enabled = regulator_is_enabled_regmap,
78 .enable = regulator_enable_regmap,
79 .disable = regulator_disable_regmap,
49610235
MR
80};
81
ad0b40fe
AB
82static struct regulator_ops tps6586x_ro_regulator_ops = {
83 .list_voltage = regulator_list_voltage_table,
84 .map_voltage = regulator_map_voltage_ascend,
85 .get_voltage_sel = regulator_get_voltage_sel_regmap,
86
87 .is_enabled = regulator_is_enabled_regmap,
88 .enable = regulator_enable_regmap,
89 .disable = regulator_disable_regmap,
90};
91
9394b80c 92static struct regulator_ops tps6586x_sys_regulator_ops = {
49610235
MR
93};
94
f4647037
AL
95static const unsigned int tps6586x_ldo0_voltages[] = {
96 1200000, 1500000, 1800000, 2500000, 2700000, 2850000, 3100000, 3300000,
97};
98
99static const unsigned int tps6586x_ldo4_voltages[] = {
100 1700000, 1725000, 1750000, 1775000, 1800000, 1825000, 1850000, 1875000,
101 1900000, 1925000, 1950000, 1975000, 2000000, 2025000, 2050000, 2075000,
102 2100000, 2125000, 2150000, 2175000, 2200000, 2225000, 2250000, 2275000,
103 2300000, 2325000, 2350000, 2375000, 2400000, 2425000, 2450000, 2475000,
49610235
MR
104};
105
844a4f0d
SA
106#define tps658623_sm2_voltages tps6586x_ldo4_voltages
107
f4647037
AL
108static const unsigned int tps6586x_ldo_voltages[] = {
109 1250000, 1500000, 1800000, 2500000, 2700000, 2850000, 3100000, 3300000,
49610235
MR
110};
111
f4647037
AL
112static const unsigned int tps6586x_sm2_voltages[] = {
113 3000000, 3050000, 3100000, 3150000, 3200000, 3250000, 3300000, 3350000,
114 3400000, 3450000, 3500000, 3550000, 3600000, 3650000, 3700000, 3750000,
115 3800000, 3850000, 3900000, 3950000, 4000000, 4050000, 4100000, 4150000,
116 4200000, 4250000, 4300000, 4350000, 4400000, 4450000, 4500000, 4550000,
4cc2e393
GK
117};
118
6c46ccc8
AB
119static int tps658640_sm2_voltages[] = {
120 2150000, 2200000, 2250000, 2300000, 2350000, 2400000, 2450000, 2500000,
121 2550000, 2600000, 2650000, 2700000, 2750000, 2800000, 2850000, 2900000,
122 2950000, 3000000, 3050000, 3100000, 3150000, 3200000, 3250000, 3300000,
123 3350000, 3400000, 3450000, 3500000, 3550000, 3600000, 3650000, 3700000,
124};
125
844a4f0d
SA
126static const unsigned int tps658643_sm2_voltages[] = {
127 1025000, 1050000, 1075000, 1100000, 1125000, 1150000, 1175000, 1200000,
128 1225000, 1250000, 1275000, 1300000, 1325000, 1350000, 1375000, 1400000,
129 1425000, 1450000, 1475000, 1500000, 1525000, 1550000, 1575000, 1600000,
130 1625000, 1650000, 1675000, 1700000, 1725000, 1750000, 1775000, 1800000,
131};
132
f4647037
AL
133static const unsigned int tps6586x_dvm_voltages[] = {
134 725000, 750000, 775000, 800000, 825000, 850000, 875000, 900000,
135 925000, 950000, 975000, 1000000, 1025000, 1050000, 1075000, 1100000,
136 1125000, 1150000, 1175000, 1200000, 1225000, 1250000, 1275000, 1300000,
137 1325000, 1350000, 1375000, 1400000, 1425000, 1450000, 1475000, 1500000,
49610235
MR
138};
139
6c46ccc8
AB
140static int tps658640_rtc_voltages[] = {
141 2500000, 2850000, 3100000, 3300000,
142};
143
ad0b40fe 144#define TPS6586X_REGULATOR(_id, _ops, _pin_name, vdata, vreg, shift, nbits, \
d645d591 145 ereg0, ebit0, ereg1, ebit1, goreg, gobit) \
49610235 146 .desc = { \
7c7fac30 147 .supply_name = _pin_name, \
49610235 148 .name = "REG-" #_id, \
ad0b40fe 149 .ops = &tps6586x_## _ops ## _regulator_ops, \
49610235
MR
150 .type = REGULATOR_VOLTAGE, \
151 .id = TPS6586X_ID_##_id, \
844a4f0d
SA
152 .n_voltages = ARRAY_SIZE(vdata##_voltages), \
153 .volt_table = vdata##_voltages, \
49610235 154 .owner = THIS_MODULE, \
7c7475c0
AL
155 .enable_reg = TPS6586X_SUPPLY##ereg0, \
156 .enable_mask = 1 << (ebit0), \
157 .vsel_reg = TPS6586X_##vreg, \
158 .vsel_mask = ((1 << (nbits)) - 1) << (shift), \
d645d591
AL
159 .apply_reg = (goreg), \
160 .apply_bit = (gobit), \
49610235 161 }, \
49610235
MR
162 .enable_reg[0] = TPS6586X_SUPPLY##ereg0, \
163 .enable_bit[0] = (ebit0), \
164 .enable_reg[1] = TPS6586X_SUPPLY##ereg1, \
f4647037 165 .enable_bit[1] = (ebit1),
64db657b 166
7c7fac30 167#define TPS6586X_LDO(_id, _pname, vdata, vreg, shift, nbits, \
49610235 168 ereg0, ebit0, ereg1, ebit1) \
64db657b 169{ \
ad0b40fe
AB
170 TPS6586X_REGULATOR(_id, rw, _pname, vdata, vreg, shift, nbits, \
171 ereg0, ebit0, ereg1, ebit1, 0, 0) \
172}
173
174#define TPS6586X_FIXED_LDO(_id, _pname, vdata, vreg, shift, nbits, \
175 ereg0, ebit0, ereg1, ebit1) \
176{ \
177 TPS6586X_REGULATOR(_id, ro, _pname, vdata, vreg, shift, nbits, \
d645d591 178 ereg0, ebit0, ereg1, ebit1, 0, 0) \
64db657b 179}
49610235 180
7c7fac30 181#define TPS6586X_DVM(_id, _pname, vdata, vreg, shift, nbits, \
49610235 182 ereg0, ebit0, ereg1, ebit1, goreg, gobit) \
64db657b 183{ \
ad0b40fe 184 TPS6586X_REGULATOR(_id, rw, _pname, vdata, vreg, shift, nbits, \
d645d591 185 ereg0, ebit0, ereg1, ebit1, goreg, gobit) \
64db657b 186}
49610235 187
9394b80c
LD
188#define TPS6586X_SYS_REGULATOR() \
189{ \
190 .desc = { \
191 .supply_name = "sys", \
192 .name = "REG-SYS", \
193 .ops = &tps6586x_sys_regulator_ops, \
194 .type = REGULATOR_VOLTAGE, \
195 .id = TPS6586X_ID_SYS, \
196 .owner = THIS_MODULE, \
197 }, \
198}
199
49610235 200static struct tps6586x_regulator tps6586x_regulator[] = {
9394b80c 201 TPS6586X_SYS_REGULATOR(),
844a4f0d
SA
202 TPS6586X_LDO(LDO_0, "vinldo01", tps6586x_ldo0, SUPPLYV1, 5, 3, ENC, 0,
203 END, 0),
204 TPS6586X_LDO(LDO_3, "vinldo23", tps6586x_ldo, SUPPLYV4, 0, 3, ENC, 2,
205 END, 2),
206 TPS6586X_LDO(LDO_5, "REG-SYS", tps6586x_ldo, SUPPLYV6, 0, 3, ENE, 6,
207 ENE, 6),
208 TPS6586X_LDO(LDO_6, "vinldo678", tps6586x_ldo, SUPPLYV3, 0, 3, ENC, 4,
209 END, 4),
210 TPS6586X_LDO(LDO_7, "vinldo678", tps6586x_ldo, SUPPLYV3, 3, 3, ENC, 5,
211 END, 5),
212 TPS6586X_LDO(LDO_8, "vinldo678", tps6586x_ldo, SUPPLYV2, 5, 3, ENC, 6,
213 END, 6),
214 TPS6586X_LDO(LDO_9, "vinldo9", tps6586x_ldo, SUPPLYV6, 3, 3, ENE, 7,
215 ENE, 7),
216 TPS6586X_LDO(LDO_RTC, "REG-SYS", tps6586x_ldo, SUPPLYV4, 3, 3, V4, 7,
217 V4, 7),
218 TPS6586X_LDO(LDO_1, "vinldo01", tps6586x_dvm, SUPPLYV1, 0, 5, ENC, 1,
219 END, 1),
220 TPS6586X_LDO(SM_2, "vin-sm2", tps6586x_sm2, SUPPLYV2, 0, 5, ENC, 7,
221 END, 7),
222
223 TPS6586X_DVM(LDO_2, "vinldo23", tps6586x_dvm, LDO2BV1, 0, 5, ENA, 3,
d645d591 224 ENB, 3, TPS6586X_VCC2, BIT(6)),
844a4f0d 225 TPS6586X_DVM(LDO_4, "vinldo4", tps6586x_ldo4, LDO4V1, 0, 5, ENC, 3,
d645d591 226 END, 3, TPS6586X_VCC1, BIT(6)),
844a4f0d 227 TPS6586X_DVM(SM_0, "vin-sm0", tps6586x_dvm, SM0V1, 0, 5, ENA, 1,
d645d591 228 ENB, 1, TPS6586X_VCC1, BIT(2)),
844a4f0d 229 TPS6586X_DVM(SM_1, "vin-sm1", tps6586x_dvm, SM1V1, 0, 5, ENA, 0,
d645d591 230 ENB, 0, TPS6586X_VCC1, BIT(0)),
49610235
MR
231};
232
844a4f0d
SA
233static struct tps6586x_regulator tps658623_regulator[] = {
234 TPS6586X_LDO(SM_2, "vin-sm2", tps658623_sm2, SUPPLYV2, 0, 5, ENC, 7,
235 END, 7),
236};
237
6c46ccc8
AB
238static struct tps6586x_regulator tps658640_regulator[] = {
239 TPS6586X_LDO(LDO_3, "vinldo23", tps6586x_ldo0, SUPPLYV4, 0, 3,
240 ENC, 2, END, 2),
241 TPS6586X_LDO(LDO_5, "REG-SYS", tps6586x_ldo0, SUPPLYV6, 0, 3,
242 ENE, 6, ENE, 6),
243 TPS6586X_LDO(LDO_6, "vinldo678", tps6586x_ldo0, SUPPLYV3, 0, 3,
244 ENC, 4, END, 4),
245 TPS6586X_LDO(LDO_7, "vinldo678", tps6586x_ldo0, SUPPLYV3, 3, 3,
246 ENC, 5, END, 5),
247 TPS6586X_LDO(LDO_8, "vinldo678", tps6586x_ldo0, SUPPLYV2, 5, 3,
248 ENC, 6, END, 6),
249 TPS6586X_LDO(LDO_9, "vinldo9", tps6586x_ldo0, SUPPLYV6, 3, 3,
250 ENE, 7, ENE, 7),
251 TPS6586X_LDO(SM_2, "vin-sm2", tps658640_sm2, SUPPLYV2, 0, 5,
252 ENC, 7, END, 7),
253
254 TPS6586X_FIXED_LDO(LDO_RTC, "REG-SYS", tps658640_rtc, SUPPLYV4, 3, 2,
255 V4, 7, V4, 7),
256};
257
844a4f0d
SA
258static struct tps6586x_regulator tps658643_regulator[] = {
259 TPS6586X_LDO(SM_2, "vin-sm2", tps658643_sm2, SUPPLYV2, 0, 5, ENC, 7,
260 END, 7),
261};
262
49610235
MR
263/*
264 * TPS6586X has 2 enable bits that are OR'ed to determine the actual
265 * regulator state. Clearing one of this bits allows switching
266 * regulator on and of with single register write.
267 */
268static inline int tps6586x_regulator_preinit(struct device *parent,
269 struct tps6586x_regulator *ri)
270{
271 uint8_t val1, val2;
272 int ret;
273
1dbcf35c
DH
274 if (ri->enable_reg[0] == ri->enable_reg[1] &&
275 ri->enable_bit[0] == ri->enable_bit[1])
276 return 0;
277
49610235
MR
278 ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
279 if (ret)
280 return ret;
281
282 ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
283 if (ret)
284 return ret;
285
4f586707 286 if (!(val2 & (1 << ri->enable_bit[1])))
49610235
MR
287 return 0;
288
289 /*
290 * The regulator is on, but it's enabled with the bit we don't
291 * want to use, so we switch the enable bits
292 */
4f586707 293 if (!(val1 & (1 << ri->enable_bit[0]))) {
49610235
MR
294 ret = tps6586x_set_bits(parent, ri->enable_reg[0],
295 1 << ri->enable_bit[0]);
296 if (ret)
297 return ret;
298 }
299
300 return tps6586x_clr_bits(parent, ri->enable_reg[1],
301 1 << ri->enable_bit[1]);
302}
303
64e48160
LD
304static int tps6586x_regulator_set_slew_rate(struct platform_device *pdev,
305 int id, struct regulator_init_data *p)
500c524a
XX
306{
307 struct device *parent = pdev->dev.parent;
500c524a
XX
308 struct tps6586x_settings *setting = p->driver_data;
309 uint8_t reg;
310
311 if (setting == NULL)
312 return 0;
313
314 if (!(setting->slew_rate & TPS6586X_SLEW_RATE_SET))
315 return 0;
316
317 /* only SM0 and SM1 can have the slew rate settings */
64e48160 318 switch (id) {
500c524a
XX
319 case TPS6586X_ID_SM_0:
320 reg = TPS6586X_SM0SL;
321 break;
322 case TPS6586X_ID_SM_1:
323 reg = TPS6586X_SM1SL;
324 break;
325 default:
6673d66e 326 dev_err(&pdev->dev, "Only SM0/SM1 can set slew rate\n");
500c524a
XX
327 return -EINVAL;
328 }
329
330 return tps6586x_write(parent, reg,
331 setting->slew_rate & TPS6586X_SLEW_RATE_MASK);
332}
333
844a4f0d 334static struct tps6586x_regulator *find_regulator_info(int id, int version)
49610235
MR
335{
336 struct tps6586x_regulator *ri;
844a4f0d
SA
337 struct tps6586x_regulator *table = NULL;
338 int num;
49610235
MR
339 int i;
340
844a4f0d
SA
341 switch (version) {
342 case TPS658623:
343 table = tps658623_regulator;
344 num = ARRAY_SIZE(tps658623_regulator);
345 break;
6c46ccc8
AB
346 case TPS658640:
347 case TPS658640v2:
348 table = tps658640_regulator;
349 num = ARRAY_SIZE(tps658640_regulator);
350 break;
844a4f0d
SA
351 case TPS658643:
352 table = tps658643_regulator;
353 num = ARRAY_SIZE(tps658643_regulator);
354 break;
355 }
356
357 /* Search version specific table first */
358 if (table) {
359 for (i = 0; i < num; i++) {
360 ri = &table[i];
361 if (ri->desc.id == id)
362 return ri;
363 }
364 }
365
49610235
MR
366 for (i = 0; i < ARRAY_SIZE(tps6586x_regulator); i++) {
367 ri = &tps6586x_regulator[i];
368 if (ri->desc.id == id)
369 return ri;
370 }
371 return NULL;
372}
373
64e48160
LD
374#ifdef CONFIG_OF
375static struct of_regulator_match tps6586x_matches[] = {
376 { .name = "sys", .driver_data = (void *)TPS6586X_ID_SYS },
377 { .name = "sm0", .driver_data = (void *)TPS6586X_ID_SM_0 },
378 { .name = "sm1", .driver_data = (void *)TPS6586X_ID_SM_1 },
379 { .name = "sm2", .driver_data = (void *)TPS6586X_ID_SM_2 },
380 { .name = "ldo0", .driver_data = (void *)TPS6586X_ID_LDO_0 },
381 { .name = "ldo1", .driver_data = (void *)TPS6586X_ID_LDO_1 },
382 { .name = "ldo2", .driver_data = (void *)TPS6586X_ID_LDO_2 },
383 { .name = "ldo3", .driver_data = (void *)TPS6586X_ID_LDO_3 },
384 { .name = "ldo4", .driver_data = (void *)TPS6586X_ID_LDO_4 },
385 { .name = "ldo5", .driver_data = (void *)TPS6586X_ID_LDO_5 },
386 { .name = "ldo6", .driver_data = (void *)TPS6586X_ID_LDO_6 },
387 { .name = "ldo7", .driver_data = (void *)TPS6586X_ID_LDO_7 },
388 { .name = "ldo8", .driver_data = (void *)TPS6586X_ID_LDO_8 },
389 { .name = "ldo9", .driver_data = (void *)TPS6586X_ID_LDO_9 },
390 { .name = "ldo_rtc", .driver_data = (void *)TPS6586X_ID_LDO_RTC },
391};
392
393static struct tps6586x_platform_data *tps6586x_parse_regulator_dt(
394 struct platform_device *pdev,
395 struct of_regulator_match **tps6586x_reg_matches)
396{
397 const unsigned int num = ARRAY_SIZE(tps6586x_matches);
398 struct device_node *np = pdev->dev.parent->of_node;
399 struct device_node *regs;
400 const char *sys_rail = NULL;
401 unsigned int i;
402 struct tps6586x_platform_data *pdata;
403 int err;
404
712c967f 405 regs = of_get_child_by_name(np, "regulators");
64e48160
LD
406 if (!regs) {
407 dev_err(&pdev->dev, "regulator node not found\n");
408 return NULL;
409 }
410
411 err = of_regulator_match(&pdev->dev, regs, tps6586x_matches, num);
0a4cccaa 412 of_node_put(regs);
64e48160
LD
413 if (err < 0) {
414 dev_err(&pdev->dev, "Regulator match failed, e %d\n", err);
64e48160
LD
415 return NULL;
416 }
417
64e48160 418 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
02e90584 419 if (!pdata)
64e48160 420 return NULL;
64e48160
LD
421
422 for (i = 0; i < num; i++) {
423 int id;
424 if (!tps6586x_matches[i].init_data)
425 continue;
426
427 pdata->reg_init_data[i] = tps6586x_matches[i].init_data;
428 id = (int)tps6586x_matches[i].driver_data;
429 if (id == TPS6586X_ID_SYS)
430 sys_rail = pdata->reg_init_data[i]->constraints.name;
431
432 if ((id == TPS6586X_ID_LDO_5) || (id == TPS6586X_ID_LDO_RTC))
433 pdata->reg_init_data[i]->supply_regulator = sys_rail;
434 }
435 *tps6586x_reg_matches = tps6586x_matches;
436 return pdata;
437}
438#else
439static struct tps6586x_platform_data *tps6586x_parse_regulator_dt(
440 struct platform_device *pdev,
441 struct of_regulator_match **tps6586x_reg_matches)
442{
443 *tps6586x_reg_matches = NULL;
444 return NULL;
445}
446#endif
447
a5023574 448static int tps6586x_regulator_probe(struct platform_device *pdev)
49610235
MR
449{
450 struct tps6586x_regulator *ri = NULL;
c172708d 451 struct regulator_config config = { };
d6fe2c72 452 struct regulator_dev *rdev;
64e48160
LD
453 struct regulator_init_data *reg_data;
454 struct tps6586x_platform_data *pdata;
455 struct of_regulator_match *tps6586x_reg_matches = NULL;
844a4f0d 456 int version;
64e48160 457 int id;
49610235
MR
458 int err;
459
10835600 460 dev_dbg(&pdev->dev, "Probing regulator\n");
49610235 461
64e48160
LD
462 pdata = dev_get_platdata(pdev->dev.parent);
463 if ((!pdata) && (pdev->dev.parent->of_node))
464 pdata = tps6586x_parse_regulator_dt(pdev,
465 &tps6586x_reg_matches);
49610235 466
64e48160
LD
467 if (!pdata) {
468 dev_err(&pdev->dev, "Platform data not available, exiting\n");
469 return -ENODEV;
470 }
49610235 471
844a4f0d
SA
472 version = tps6586x_get_version(pdev->dev.parent);
473
64e48160
LD
474 for (id = 0; id < TPS6586X_ID_MAX_REGULATOR; ++id) {
475 reg_data = pdata->reg_init_data[id];
476
844a4f0d
SA
477 ri = find_regulator_info(id, version);
478
64e48160
LD
479 if (!ri) {
480 dev_err(&pdev->dev, "invalid regulator ID specified\n");
884ea557 481 return -EINVAL;
64e48160
LD
482 }
483
484 err = tps6586x_regulator_preinit(pdev->dev.parent, ri);
485 if (err) {
486 dev_err(&pdev->dev,
487 "regulator %d preinit failed, e %d\n", id, err);
884ea557 488 return err;
64e48160
LD
489 }
490
491 config.dev = pdev->dev.parent;
492 config.init_data = reg_data;
493 config.driver_data = ri;
494
495 if (tps6586x_reg_matches)
496 config.of_node = tps6586x_reg_matches[id].of_node;
497
d6fe2c72
AL
498 rdev = devm_regulator_register(&pdev->dev, &ri->desc, &config);
499 if (IS_ERR(rdev)) {
64e48160
LD
500 dev_err(&pdev->dev, "failed to register regulator %s\n",
501 ri->desc.name);
d6fe2c72 502 return PTR_ERR(rdev);
64e48160
LD
503 }
504
505 if (reg_data) {
506 err = tps6586x_regulator_set_slew_rate(pdev, id,
507 reg_data);
508 if (err < 0) {
509 dev_err(&pdev->dev,
510 "Slew rate config failed, e %d\n", err);
884ea557 511 return err;
64e48160
LD
512 }
513 }
49610235
MR
514 }
515
e7973c3c 516 platform_set_drvdata(pdev, rdev);
64e48160 517 return 0;
49610235
MR
518}
519
520static struct platform_driver tps6586x_regulator_driver = {
521 .driver = {
ec8da805 522 .name = "tps6586x-regulator",
49610235
MR
523 .owner = THIS_MODULE,
524 },
525 .probe = tps6586x_regulator_probe,
49610235
MR
526};
527
528static int __init tps6586x_regulator_init(void)
529{
530 return platform_driver_register(&tps6586x_regulator_driver);
531}
532subsys_initcall(tps6586x_regulator_init);
533
534static void __exit tps6586x_regulator_exit(void)
535{
536 platform_driver_unregister(&tps6586x_regulator_driver);
537}
538module_exit(tps6586x_regulator_exit);
539
540MODULE_LICENSE("GPL");
541MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
542MODULE_DESCRIPTION("Regulator Driver for TI TPS6586X PMIC");
543MODULE_ALIAS("platform:tps6586x-regulator");
This page took 0.242044 seconds and 5 git commands to generate.