1 // SPDX-License-Identifier: GPL-2.0-only
3 * Motorola CPCAP PMIC regulator driver
5 * Based on cpcap-regulator.c from Motorola Linux kernel tree
6 * Copyright (C) 2009-2011 Motorola, Inc.
8 * Rewritten for mainline kernel to use device tree and regmap
9 * Copyright (C) 2017 Tony Lindgren <tony@atomide.com>
12 #include <linux/err.h>
13 #include <linux/module.h>
15 #include <linux/of_platform.h>
16 #include <linux/regmap.h>
17 #include <linux/regulator/driver.h>
18 #include <linux/regulator/machine.h>
19 #include <linux/regulator/of_regulator.h>
20 #include <linux/mfd/motorola-cpcap.h>
23 * Resource assignment register bits. These seem to control the state
24 * idle modes adn are used at least for omap4.
27 /* CPCAP_REG_ASSIGN2 bits - Resource Assignment 2 */
28 #define CPCAP_BIT_VSDIO_SEL BIT(15)
29 #define CPCAP_BIT_VDIG_SEL BIT(14)
30 #define CPCAP_BIT_VCAM_SEL BIT(13)
31 #define CPCAP_BIT_SW6_SEL BIT(12)
32 #define CPCAP_BIT_SW5_SEL BIT(11)
33 #define CPCAP_BIT_SW4_SEL BIT(10)
34 #define CPCAP_BIT_SW3_SEL BIT(9)
35 #define CPCAP_BIT_SW2_SEL BIT(8)
36 #define CPCAP_BIT_SW1_SEL BIT(7)
38 /* CPCAP_REG_ASSIGN3 bits - Resource Assignment 3 */
39 #define CPCAP_BIT_VUSBINT2_SEL BIT(15)
40 #define CPCAP_BIT_VUSBINT1_SEL BIT(14)
41 #define CPCAP_BIT_VVIB_SEL BIT(13)
42 #define CPCAP_BIT_VWLAN1_SEL BIT(12)
43 #define CPCAP_BIT_VRF1_SEL BIT(11)
44 #define CPCAP_BIT_VHVIO_SEL BIT(10)
45 #define CPCAP_BIT_VDAC_SEL BIT(9)
46 #define CPCAP_BIT_VUSB_SEL BIT(8)
47 #define CPCAP_BIT_VSIM_SEL BIT(7)
48 #define CPCAP_BIT_VRFREF_SEL BIT(6)
49 #define CPCAP_BIT_VPLL_SEL BIT(5)
50 #define CPCAP_BIT_VFUSE_SEL BIT(4)
51 #define CPCAP_BIT_VCSI_SEL BIT(3)
52 #define CPCAP_BIT_SPARE_14_2 BIT(2)
53 #define CPCAP_BIT_VWLAN2_SEL BIT(1)
54 #define CPCAP_BIT_VRF2_SEL BIT(0)
56 /* CPCAP_REG_ASSIGN4 bits - Resource Assignment 4 */
57 #define CPCAP_BIT_VAUDIO_SEL BIT(0)
60 * Enable register bits. At least CPCAP_BIT_AUDIO_LOW_PWR is generic,
61 * and not limited to audio regulator. Let's use the Motorola kernel
62 * naming for now until we have a better understanding of the other
63 * enable register bits. No idea why BIT(3) is not defined.
65 #define CPCAP_BIT_AUDIO_LOW_PWR BIT(6)
66 #define CPCAP_BIT_AUD_LOWPWR_SPEED BIT(5)
67 #define CPCAP_BIT_VAUDIOPRISTBY BIT(4)
68 #define CPCAP_BIT_VAUDIO_MODE1 BIT(2)
69 #define CPCAP_BIT_VAUDIO_MODE0 BIT(1)
70 #define CPCAP_BIT_V_AUDIO_EN BIT(0)
72 #define CPCAP_BIT_AUDIO_NORMAL_MODE 0x00
75 * Off mode configuration bit. Used currently only by SW5 on omap4. There's
76 * the following comment in Motorola Linux kernel tree for it:
78 * When set in the regulator mode, the regulator assignment will be changed
79 * to secondary when the regulator is disabled. The mode will be set back to
80 * primary when the regulator is turned on.
82 #define CPCAP_REG_OFF_MODE_SEC BIT(15)
85 * SoC specific configuration for CPCAP regulator. There are at least three
86 * different SoCs each with their own parameters: omap3, omap4 and tegra2.
88 * The assign_reg and assign_mask seem to allow toggling between primary
89 * and secondary mode that at least omap4 uses for off mode.
91 struct cpcap_regulator {
92 struct regulator_desc rdesc;
94 const u16 assign_mask;
97 #define CPCAP_REG(_ID, reg, assignment_reg, assignment_mask, val_tbl, \
98 mode_mask, volt_mask, mode_val, off_val, \
102 .of_match = of_match_ptr(#_ID), \
103 .ops = &cpcap_regulator_ops, \
104 .regulators_node = of_match_ptr("regulators"), \
105 .type = REGULATOR_VOLTAGE, \
107 .owner = THIS_MODULE, \
108 .n_voltages = ARRAY_SIZE(val_tbl), \
109 .volt_table = (val_tbl), \
111 .vsel_mask = (volt_mask), \
112 .enable_reg = (reg), \
113 .enable_mask = (mode_mask), \
114 .enable_val = (mode_val), \
115 .disable_val = (off_val), \
116 .ramp_delay = (volt_trans_time), \
117 .of_map_mode = cpcap_map_mode, \
119 .assign_reg = (assignment_reg), \
120 .assign_mask = (assignment_mask), \
126 const struct cpcap_regulator *soc;
129 enum cpcap_regulator_id {
158 * We need to also configure regulator idle mode for SoC off mode if
159 * CPCAP_REG_OFF_MODE_SEC is set.
161 static int cpcap_regulator_enable(struct regulator_dev *rdev)
163 struct cpcap_regulator *regulator = rdev_get_drvdata(rdev);
166 error = regulator_enable_regmap(rdev);
170 if (rdev->desc->enable_val & CPCAP_REG_OFF_MODE_SEC) {
171 error = regmap_update_bits(rdev->regmap, regulator->assign_reg,
172 regulator->assign_mask,
173 regulator->assign_mask);
175 regulator_disable_regmap(rdev);
182 * We need to also configure regulator idle mode for SoC off mode if
183 * CPCAP_REG_OFF_MODE_SEC is set.
185 static int cpcap_regulator_disable(struct regulator_dev *rdev)
187 struct cpcap_regulator *regulator = rdev_get_drvdata(rdev);
190 if (rdev->desc->enable_val & CPCAP_REG_OFF_MODE_SEC) {
191 error = regmap_update_bits(rdev->regmap, regulator->assign_reg,
192 regulator->assign_mask, 0);
197 error = regulator_disable_regmap(rdev);
198 if (error && (rdev->desc->enable_val & CPCAP_REG_OFF_MODE_SEC)) {
199 regmap_update_bits(rdev->regmap, regulator->assign_reg,
200 regulator->assign_mask,
201 regulator->assign_mask);
207 static unsigned int cpcap_map_mode(unsigned int mode)
210 case CPCAP_BIT_AUDIO_NORMAL_MODE:
211 return REGULATOR_MODE_NORMAL;
212 case CPCAP_BIT_AUDIO_LOW_PWR:
213 return REGULATOR_MODE_STANDBY;
215 return REGULATOR_MODE_INVALID;
219 static unsigned int cpcap_regulator_get_mode(struct regulator_dev *rdev)
223 regmap_read(rdev->regmap, rdev->desc->enable_reg, &value);
225 if (value & CPCAP_BIT_AUDIO_LOW_PWR)
226 return REGULATOR_MODE_STANDBY;
228 return REGULATOR_MODE_NORMAL;
231 static int cpcap_regulator_set_mode(struct regulator_dev *rdev,
237 case REGULATOR_MODE_NORMAL:
238 value = CPCAP_BIT_AUDIO_NORMAL_MODE;
240 case REGULATOR_MODE_STANDBY:
241 value = CPCAP_BIT_AUDIO_LOW_PWR;
247 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
248 CPCAP_BIT_AUDIO_LOW_PWR, value);
251 static const struct regulator_ops cpcap_regulator_ops = {
252 .enable = cpcap_regulator_enable,
253 .disable = cpcap_regulator_disable,
254 .is_enabled = regulator_is_enabled_regmap,
255 .list_voltage = regulator_list_voltage_table,
256 .map_voltage = regulator_map_voltage_iterate,
257 .get_voltage_sel = regulator_get_voltage_sel_regmap,
258 .set_voltage_sel = regulator_set_voltage_sel_regmap,
259 .get_mode = cpcap_regulator_get_mode,
260 .set_mode = cpcap_regulator_set_mode,
263 static const unsigned int unknown_val_tbl[] = { 0, };
264 static const unsigned int sw2_sw4_val_tbl[] = { 612500, 625000, 637500,
265 650000, 662500, 675000,
266 687500, 700000, 712500,
267 725000, 737500, 750000,
268 762500, 775000, 787500,
269 800000, 812500, 825000,
270 837500, 850000, 862500,
271 875000, 887500, 900000,
272 912500, 925000, 937500,
273 950000, 962500, 975000,
274 987500, 1000000, 1012500,
275 1025000, 1037500, 1050000,
276 1062500, 1075000, 1087500,
277 1100000, 1112500, 1125000,
278 1137500, 1150000, 1162500,
279 1175000, 1187500, 1200000,
280 1212500, 1225000, 1237500,
281 1250000, 1262500, 1275000,
282 1287500, 1300000, 1312500,
283 1325000, 1337500, 1350000,
284 1362500, 1375000, 1387500,
285 1400000, 1412500, 1425000,
286 1437500, 1450000, 1462500, };
287 static const unsigned int sw5_val_tbl[] = { 0, 5050000, };
288 static const unsigned int vcam_val_tbl[] = { 2600000, 2700000, 2800000,
290 static const unsigned int vcsi_val_tbl[] = { 1200000, 1800000, };
291 static const unsigned int vdac_val_tbl[] = { 1200000, 1500000, 1800000,
293 static const unsigned int vdig_val_tbl[] = { 1200000, 1350000, 1500000,
295 static const unsigned int vfuse_val_tbl[] = { 1500000, 1600000, 1700000,
296 1800000, 1900000, 2000000,
297 2100000, 2200000, 2300000,
298 2400000, 2500000, 2600000,
300 static const unsigned int vhvio_val_tbl[] = { 2775000, };
301 static const unsigned int vsdio_val_tbl[] = { 1500000, 1600000, 1800000,
302 2600000, 2700000, 2800000,
304 static const unsigned int vpll_val_tbl[] = { 1200000, 1300000, 1400000,
306 /* Quirk: 2775000 is before 2500000 for vrf1 regulator */
307 static const unsigned int vrf1_val_tbl[] = { 2775000, 2500000, };
308 static const unsigned int vrf2_val_tbl[] = { 0, 2775000, };
309 static const unsigned int vrfref_val_tbl[] = { 2500000, 2775000, };
310 static const unsigned int vwlan1_val_tbl[] = { 1800000, 1900000, };
311 static const unsigned int vwlan2_val_tbl[] = { 2775000, 3000000, 3300000,
313 static const unsigned int vsim_val_tbl[] = { 1800000, 2900000, };
314 static const unsigned int vsimcard_val_tbl[] = { 1800000, 2900000, };
315 static const unsigned int vvib_val_tbl[] = { 1300000, 1800000, 2000000,
317 static const unsigned int vusb_val_tbl[] = { 0, 3300000, };
318 static const unsigned int vaudio_val_tbl[] = { 0, 2775000, };
321 * SoC specific configuration for omap4. The data below is comes from Motorola
322 * Linux kernel tree. It's basically the values of cpcap_regltr_data,
323 * cpcap_regulator_mode_values and cpcap_regulator_off_mode_values, see
324 * CPCAP_REG macro above.
326 * SW1 to SW4 and SW6 seems to be unused for mapphone. Note that VSIM and
327 * VSIMCARD have a shared resource assignment bit.
329 static const struct cpcap_regulator omap4_regulators[] = {
330 CPCAP_REG(SW1, CPCAP_REG_S1C1, CPCAP_REG_ASSIGN2,
331 CPCAP_BIT_SW1_SEL, unknown_val_tbl,
333 CPCAP_REG(SW2, CPCAP_REG_S2C1, CPCAP_REG_ASSIGN2,
334 CPCAP_BIT_SW2_SEL, unknown_val_tbl,
336 CPCAP_REG(SW3, CPCAP_REG_S3C, CPCAP_REG_ASSIGN2,
337 CPCAP_BIT_SW3_SEL, unknown_val_tbl,
339 CPCAP_REG(SW4, CPCAP_REG_S4C1, CPCAP_REG_ASSIGN2,
340 CPCAP_BIT_SW4_SEL, unknown_val_tbl,
342 CPCAP_REG(SW5, CPCAP_REG_S5C, CPCAP_REG_ASSIGN2,
343 CPCAP_BIT_SW5_SEL, sw5_val_tbl,
344 0x28, 0, 0x20 | CPCAP_REG_OFF_MODE_SEC, 0, 0),
345 CPCAP_REG(SW6, CPCAP_REG_S6C, CPCAP_REG_ASSIGN2,
346 CPCAP_BIT_SW6_SEL, unknown_val_tbl,
348 CPCAP_REG(VCAM, CPCAP_REG_VCAMC, CPCAP_REG_ASSIGN2,
349 CPCAP_BIT_VCAM_SEL, vcam_val_tbl,
350 0x87, 0x30, 0x3, 0, 420),
351 CPCAP_REG(VCSI, CPCAP_REG_VCSIC, CPCAP_REG_ASSIGN3,
352 CPCAP_BIT_VCSI_SEL, vcsi_val_tbl,
353 0x47, 0x10, 0x43, 0x41, 350),
354 CPCAP_REG(VDAC, CPCAP_REG_VDACC, CPCAP_REG_ASSIGN3,
355 CPCAP_BIT_VDAC_SEL, vdac_val_tbl,
356 0x87, 0x30, 0x3, 0, 420),
357 CPCAP_REG(VDIG, CPCAP_REG_VDIGC, CPCAP_REG_ASSIGN2,
358 CPCAP_BIT_VDIG_SEL, vdig_val_tbl,
359 0x87, 0x30, 0x82, 0, 420),
360 CPCAP_REG(VFUSE, CPCAP_REG_VFUSEC, CPCAP_REG_ASSIGN3,
361 CPCAP_BIT_VFUSE_SEL, vfuse_val_tbl,
362 0x80, 0xf, 0x80, 0, 420),
363 CPCAP_REG(VHVIO, CPCAP_REG_VHVIOC, CPCAP_REG_ASSIGN3,
364 CPCAP_BIT_VHVIO_SEL, vhvio_val_tbl,
365 0x17, 0, 0, 0x12, 0),
366 CPCAP_REG(VSDIO, CPCAP_REG_VSDIOC, CPCAP_REG_ASSIGN2,
367 CPCAP_BIT_VSDIO_SEL, vsdio_val_tbl,
368 0x87, 0x38, 0x82, 0, 420),
369 CPCAP_REG(VPLL, CPCAP_REG_VPLLC, CPCAP_REG_ASSIGN3,
370 CPCAP_BIT_VPLL_SEL, vpll_val_tbl,
371 0x43, 0x18, 0x2, 0, 420),
372 CPCAP_REG(VRF1, CPCAP_REG_VRF1C, CPCAP_REG_ASSIGN3,
373 CPCAP_BIT_VRF1_SEL, vrf1_val_tbl,
374 0xac, 0x2, 0x4, 0, 10),
375 CPCAP_REG(VRF2, CPCAP_REG_VRF2C, CPCAP_REG_ASSIGN3,
376 CPCAP_BIT_VRF2_SEL, vrf2_val_tbl,
377 0x23, 0x8, 0, 0, 10),
378 CPCAP_REG(VRFREF, CPCAP_REG_VRFREFC, CPCAP_REG_ASSIGN3,
379 CPCAP_BIT_VRFREF_SEL, vrfref_val_tbl,
380 0x23, 0x8, 0, 0, 420),
381 CPCAP_REG(VWLAN1, CPCAP_REG_VWLAN1C, CPCAP_REG_ASSIGN3,
382 CPCAP_BIT_VWLAN1_SEL, vwlan1_val_tbl,
383 0x47, 0x10, 0, 0, 420),
384 CPCAP_REG(VWLAN2, CPCAP_REG_VWLAN2C, CPCAP_REG_ASSIGN3,
385 CPCAP_BIT_VWLAN2_SEL, vwlan2_val_tbl,
386 0x20c, 0xc0, 0x20c, 0, 420),
387 CPCAP_REG(VSIM, CPCAP_REG_VSIMC, CPCAP_REG_ASSIGN3,
388 0xffff, vsim_val_tbl,
389 0x23, 0x8, 0x3, 0, 420),
390 CPCAP_REG(VSIMCARD, CPCAP_REG_VSIMC, CPCAP_REG_ASSIGN3,
391 0xffff, vsimcard_val_tbl,
392 0x1e80, 0x8, 0x1e00, 0, 420),
393 CPCAP_REG(VVIB, CPCAP_REG_VVIBC, CPCAP_REG_ASSIGN3,
394 CPCAP_BIT_VVIB_SEL, vvib_val_tbl,
395 0x1, 0xc, 0x1, 0, 500),
396 CPCAP_REG(VUSB, CPCAP_REG_VUSBC, CPCAP_REG_ASSIGN3,
397 CPCAP_BIT_VUSB_SEL, vusb_val_tbl,
398 0x11c, 0x40, 0xc, 0, 0),
399 CPCAP_REG(VAUDIO, CPCAP_REG_VAUDIOC, CPCAP_REG_ASSIGN4,
400 CPCAP_BIT_VAUDIO_SEL, vaudio_val_tbl,
401 0x16, 0x1, 0x4, 0, 0),
405 static const struct cpcap_regulator xoom_regulators[] = {
406 CPCAP_REG(SW1, CPCAP_REG_S1C1, CPCAP_REG_ASSIGN2,
407 CPCAP_BIT_SW1_SEL, unknown_val_tbl,
409 CPCAP_REG(SW2, CPCAP_REG_S2C1, CPCAP_REG_ASSIGN2,
410 CPCAP_BIT_SW2_SEL, sw2_sw4_val_tbl,
411 0xf00, 0x7f, 0x800, 0, 120),
412 CPCAP_REG(SW3, CPCAP_REG_S3C, CPCAP_REG_ASSIGN2,
413 CPCAP_BIT_SW3_SEL, unknown_val_tbl,
415 CPCAP_REG(SW4, CPCAP_REG_S4C1, CPCAP_REG_ASSIGN2,
416 CPCAP_BIT_SW4_SEL, sw2_sw4_val_tbl,
417 0xf00, 0x7f, 0x900, 0, 100),
418 CPCAP_REG(SW5, CPCAP_REG_S5C, CPCAP_REG_ASSIGN2,
419 CPCAP_BIT_SW5_SEL, sw5_val_tbl,
420 0x2a, 0, 0x22, 0, 0),
421 CPCAP_REG(SW6, CPCAP_REG_S6C, CPCAP_REG_ASSIGN2,
422 CPCAP_BIT_SW6_SEL, unknown_val_tbl,
424 CPCAP_REG(VCAM, CPCAP_REG_VCAMC, CPCAP_REG_ASSIGN2,
425 CPCAP_BIT_VCAM_SEL, vcam_val_tbl,
426 0x87, 0x30, 0x7, 0, 420),
427 CPCAP_REG(VCSI, CPCAP_REG_VCSIC, CPCAP_REG_ASSIGN3,
428 CPCAP_BIT_VCSI_SEL, vcsi_val_tbl,
429 0x47, 0x10, 0x7, 0, 350),
430 CPCAP_REG(VDAC, CPCAP_REG_VDACC, CPCAP_REG_ASSIGN3,
431 CPCAP_BIT_VDAC_SEL, vdac_val_tbl,
432 0x87, 0x30, 0x3, 0, 420),
433 CPCAP_REG(VDIG, CPCAP_REG_VDIGC, CPCAP_REG_ASSIGN2,
434 CPCAP_BIT_VDIG_SEL, vdig_val_tbl,
435 0x87, 0x30, 0x5, 0, 420),
436 CPCAP_REG(VFUSE, CPCAP_REG_VFUSEC, CPCAP_REG_ASSIGN3,
437 CPCAP_BIT_VFUSE_SEL, vfuse_val_tbl,
438 0x80, 0xf, 0x80, 0, 420),
439 CPCAP_REG(VHVIO, CPCAP_REG_VHVIOC, CPCAP_REG_ASSIGN3,
440 CPCAP_BIT_VHVIO_SEL, vhvio_val_tbl,
442 CPCAP_REG(VSDIO, CPCAP_REG_VSDIOC, CPCAP_REG_ASSIGN2,
443 CPCAP_BIT_VSDIO_SEL, vsdio_val_tbl,
444 0x87, 0x38, 0x2, 0, 420),
445 CPCAP_REG(VPLL, CPCAP_REG_VPLLC, CPCAP_REG_ASSIGN3,
446 CPCAP_BIT_VPLL_SEL, vpll_val_tbl,
447 0x43, 0x18, 0x1, 0, 420),
448 CPCAP_REG(VRF1, CPCAP_REG_VRF1C, CPCAP_REG_ASSIGN3,
449 CPCAP_BIT_VRF1_SEL, vrf1_val_tbl,
450 0xac, 0x2, 0xc, 0, 10),
451 CPCAP_REG(VRF2, CPCAP_REG_VRF2C, CPCAP_REG_ASSIGN3,
452 CPCAP_BIT_VRF2_SEL, vrf2_val_tbl,
453 0x23, 0x8, 0x3, 0, 10),
454 CPCAP_REG(VRFREF, CPCAP_REG_VRFREFC, CPCAP_REG_ASSIGN3,
455 CPCAP_BIT_VRFREF_SEL, vrfref_val_tbl,
456 0x23, 0x8, 0x3, 0, 420),
457 CPCAP_REG(VWLAN1, CPCAP_REG_VWLAN1C, CPCAP_REG_ASSIGN3,
458 CPCAP_BIT_VWLAN1_SEL, vwlan1_val_tbl,
459 0x47, 0x10, 0x5, 0, 420),
460 CPCAP_REG(VWLAN2, CPCAP_REG_VWLAN2C, CPCAP_REG_ASSIGN3,
461 CPCAP_BIT_VWLAN2_SEL, vwlan2_val_tbl,
462 0x20c, 0xc0, 0x8, 0, 420),
463 CPCAP_REG(VSIM, CPCAP_REG_VSIMC, CPCAP_REG_ASSIGN3,
464 0xffff, vsim_val_tbl,
465 0x23, 0x8, 0x3, 0, 420),
466 CPCAP_REG(VSIMCARD, CPCAP_REG_VSIMC, CPCAP_REG_ASSIGN3,
467 0xffff, vsimcard_val_tbl,
468 0x1e80, 0x8, 0x1e00, 0, 420),
469 CPCAP_REG(VVIB, CPCAP_REG_VVIBC, CPCAP_REG_ASSIGN3,
470 CPCAP_BIT_VVIB_SEL, vvib_val_tbl,
471 0x1, 0xc, 0, 0x1, 500),
472 CPCAP_REG(VUSB, CPCAP_REG_VUSBC, CPCAP_REG_ASSIGN3,
473 CPCAP_BIT_VUSB_SEL, vusb_val_tbl,
474 0x11c, 0x40, 0xc, 0, 0),
475 CPCAP_REG(VAUDIO, CPCAP_REG_VAUDIOC, CPCAP_REG_ASSIGN4,
476 CPCAP_BIT_VAUDIO_SEL, vaudio_val_tbl,
477 0x16, 0x1, 0x4, 0, 0),
481 static const struct of_device_id cpcap_regulator_id_table[] = {
483 .compatible = "motorola,cpcap-regulator",
486 .compatible = "motorola,mapphone-cpcap-regulator",
487 .data = omap4_regulators,
490 .compatible = "motorola,xoom-cpcap-regulator",
491 .data = xoom_regulators,
495 MODULE_DEVICE_TABLE(of, cpcap_regulator_id_table);
497 static int cpcap_regulator_probe(struct platform_device *pdev)
499 struct cpcap_ddata *ddata;
500 const struct cpcap_regulator *match_data;
501 struct regulator_config config;
504 match_data = of_device_get_match_data(&pdev->dev);
506 dev_err(&pdev->dev, "no configuration data found\n");
511 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
515 ddata->reg = dev_get_regmap(pdev->dev.parent, NULL);
519 ddata->dev = &pdev->dev;
520 ddata->soc = match_data;
521 platform_set_drvdata(pdev, ddata);
523 memset(&config, 0, sizeof(config));
524 config.dev = &pdev->dev;
525 config.regmap = ddata->reg;
527 for (i = 0; i < CPCAP_NR_REGULATORS; i++) {
528 const struct cpcap_regulator *regulator = &ddata->soc[i];
529 struct regulator_dev *rdev;
531 if (!regulator->rdesc.name)
534 if (regulator->rdesc.volt_table == unknown_val_tbl)
537 config.driver_data = (void *)regulator;
538 rdev = devm_regulator_register(&pdev->dev,
542 dev_err(&pdev->dev, "failed to register regulator %s\n",
543 regulator->rdesc.name);
545 return PTR_ERR(rdev);
552 static struct platform_driver cpcap_regulator_driver = {
553 .probe = cpcap_regulator_probe,
555 .name = "cpcap-regulator",
556 .of_match_table = of_match_ptr(cpcap_regulator_id_table),
560 module_platform_driver(cpcap_regulator_driver);
562 MODULE_ALIAS("platform:cpcap-regulator");
563 MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
564 MODULE_DESCRIPTION("CPCAP regulator driver");
565 MODULE_LICENSE("GPL v2");