1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * act8865-regulator.c - Voltage regulation for active-semi ACT88xx PMUs
5 * http://www.active-semi.com/products/power-management-units/act88xx/
7 * Copyright (C) 2013 Atmel Corporation
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/i2c.h>
13 #include <linux/err.h>
14 #include <linux/platform_device.h>
15 #include <linux/regulator/driver.h>
16 #include <linux/regulator/act8865.h>
18 #include <linux/of_device.h>
19 #include <linux/power_supply.h>
20 #include <linux/regulator/of_regulator.h>
21 #include <linux/regmap.h>
22 #include <dt-bindings/regulator/active-semi,8865-regulator.h>
25 * ACT8600 Global Register Map.
27 #define ACT8600_SYS_MODE 0x00
28 #define ACT8600_SYS_CTRL 0x01
29 #define ACT8600_DCDC1_VSET 0x10
30 #define ACT8600_DCDC1_CTRL 0x12
31 #define ACT8600_DCDC2_VSET 0x20
32 #define ACT8600_DCDC2_CTRL 0x22
33 #define ACT8600_DCDC3_VSET 0x30
34 #define ACT8600_DCDC3_CTRL 0x32
35 #define ACT8600_SUDCDC4_VSET 0x40
36 #define ACT8600_SUDCDC4_CTRL 0x41
37 #define ACT8600_LDO5_VSET 0x50
38 #define ACT8600_LDO5_CTRL 0x51
39 #define ACT8600_LDO6_VSET 0x60
40 #define ACT8600_LDO6_CTRL 0x61
41 #define ACT8600_LDO7_VSET 0x70
42 #define ACT8600_LDO7_CTRL 0x71
43 #define ACT8600_LDO8_VSET 0x80
44 #define ACT8600_LDO8_CTRL 0x81
45 #define ACT8600_LDO910_CTRL 0x91
46 #define ACT8600_APCH0 0xA1
47 #define ACT8600_APCH1 0xA8
48 #define ACT8600_APCH2 0xA9
49 #define ACT8600_APCH_STAT 0xAA
50 #define ACT8600_OTG0 0xB0
51 #define ACT8600_OTG1 0xB2
54 * ACT8846 Global Register Map.
56 #define ACT8846_SYS0 0x00
57 #define ACT8846_SYS1 0x01
58 #define ACT8846_REG1_VSET 0x10
59 #define ACT8846_REG1_CTRL 0x12
60 #define ACT8846_REG2_VSET0 0x20
61 #define ACT8846_REG2_VSET1 0x21
62 #define ACT8846_REG2_CTRL 0x22
63 #define ACT8846_REG3_VSET0 0x30
64 #define ACT8846_REG3_VSET1 0x31
65 #define ACT8846_REG3_CTRL 0x32
66 #define ACT8846_REG4_VSET0 0x40
67 #define ACT8846_REG4_VSET1 0x41
68 #define ACT8846_REG4_CTRL 0x42
69 #define ACT8846_REG5_VSET 0x50
70 #define ACT8846_REG5_CTRL 0x51
71 #define ACT8846_REG6_VSET 0x58
72 #define ACT8846_REG6_CTRL 0x59
73 #define ACT8846_REG7_VSET 0x60
74 #define ACT8846_REG7_CTRL 0x61
75 #define ACT8846_REG8_VSET 0x68
76 #define ACT8846_REG8_CTRL 0x69
77 #define ACT8846_REG9_VSET 0x70
78 #define ACT8846_REG9_CTRL 0x71
79 #define ACT8846_REG10_VSET 0x80
80 #define ACT8846_REG10_CTRL 0x81
81 #define ACT8846_REG11_VSET 0x90
82 #define ACT8846_REG11_CTRL 0x91
83 #define ACT8846_REG12_VSET 0xa0
84 #define ACT8846_REG12_CTRL 0xa1
85 #define ACT8846_REG13_CTRL 0xb1
86 #define ACT8846_GLB_OFF_CTRL 0xc3
87 #define ACT8846_OFF_SYSMASK 0x18
90 * ACT8865 Global Register Map.
92 #define ACT8865_SYS_MODE 0x00
93 #define ACT8865_SYS_CTRL 0x01
94 #define ACT8865_SYS_UNLK_REGS 0x0b
95 #define ACT8865_DCDC1_VSET1 0x20
96 #define ACT8865_DCDC1_VSET2 0x21
97 #define ACT8865_DCDC1_CTRL 0x22
98 #define ACT8865_DCDC1_SUS 0x24
99 #define ACT8865_DCDC2_VSET1 0x30
100 #define ACT8865_DCDC2_VSET2 0x31
101 #define ACT8865_DCDC2_CTRL 0x32
102 #define ACT8865_DCDC2_SUS 0x34
103 #define ACT8865_DCDC3_VSET1 0x40
104 #define ACT8865_DCDC3_VSET2 0x41
105 #define ACT8865_DCDC3_CTRL 0x42
106 #define ACT8865_DCDC3_SUS 0x44
107 #define ACT8865_LDO1_VSET 0x50
108 #define ACT8865_LDO1_CTRL 0x51
109 #define ACT8865_LDO1_SUS 0x52
110 #define ACT8865_LDO2_VSET 0x54
111 #define ACT8865_LDO2_CTRL 0x55
112 #define ACT8865_LDO2_SUS 0x56
113 #define ACT8865_LDO3_VSET 0x60
114 #define ACT8865_LDO3_CTRL 0x61
115 #define ACT8865_LDO3_SUS 0x62
116 #define ACT8865_LDO4_VSET 0x64
117 #define ACT8865_LDO4_CTRL 0x65
118 #define ACT8865_LDO4_SUS 0x66
119 #define ACT8865_MSTROFF 0x20
124 #define ACT8865_ENA 0x80 /* ON - [7] */
125 #define ACT8865_DIS 0x40 /* DIS - [6] */
127 #define ACT8865_VSEL_MASK 0x3F /* VSET - [5:0] */
130 #define ACT8600_LDO10_ENA 0x40 /* ON - [6] */
131 #define ACT8600_SUDCDC_VSEL_MASK 0xFF /* SUDCDC VSET - [7:0] */
133 #define ACT8600_APCH_CHG_ACIN BIT(7)
134 #define ACT8600_APCH_CHG_USB BIT(6)
135 #define ACT8600_APCH_CSTATE0 BIT(5)
136 #define ACT8600_APCH_CSTATE1 BIT(4)
139 * ACT8865 voltage number
141 #define ACT8865_VOLTAGE_NUM 64
142 #define ACT8600_SUDCDC_VOLTAGE_NUM 256
145 struct regmap
*regmap
;
150 static const struct regmap_range act8600_reg_ranges
[] = {
151 regmap_reg_range(0x00, 0x01),
152 regmap_reg_range(0x10, 0x10),
153 regmap_reg_range(0x12, 0x12),
154 regmap_reg_range(0x20, 0x20),
155 regmap_reg_range(0x22, 0x22),
156 regmap_reg_range(0x30, 0x30),
157 regmap_reg_range(0x32, 0x32),
158 regmap_reg_range(0x40, 0x41),
159 regmap_reg_range(0x50, 0x51),
160 regmap_reg_range(0x60, 0x61),
161 regmap_reg_range(0x70, 0x71),
162 regmap_reg_range(0x80, 0x81),
163 regmap_reg_range(0x91, 0x91),
164 regmap_reg_range(0xA1, 0xA1),
165 regmap_reg_range(0xA8, 0xAA),
166 regmap_reg_range(0xB0, 0xB0),
167 regmap_reg_range(0xB2, 0xB2),
168 regmap_reg_range(0xC1, 0xC1),
171 static const struct regmap_range act8600_reg_ro_ranges
[] = {
172 regmap_reg_range(0xAA, 0xAA),
173 regmap_reg_range(0xC1, 0xC1),
176 static const struct regmap_range act8600_reg_volatile_ranges
[] = {
177 regmap_reg_range(0x00, 0x01),
178 regmap_reg_range(0x12, 0x12),
179 regmap_reg_range(0x22, 0x22),
180 regmap_reg_range(0x32, 0x32),
181 regmap_reg_range(0x41, 0x41),
182 regmap_reg_range(0x51, 0x51),
183 regmap_reg_range(0x61, 0x61),
184 regmap_reg_range(0x71, 0x71),
185 regmap_reg_range(0x81, 0x81),
186 regmap_reg_range(0xA8, 0xA8),
187 regmap_reg_range(0xAA, 0xAA),
188 regmap_reg_range(0xB0, 0xB0),
189 regmap_reg_range(0xC1, 0xC1),
192 static const struct regmap_access_table act8600_write_ranges_table
= {
193 .yes_ranges
= act8600_reg_ranges
,
194 .n_yes_ranges
= ARRAY_SIZE(act8600_reg_ranges
),
195 .no_ranges
= act8600_reg_ro_ranges
,
196 .n_no_ranges
= ARRAY_SIZE(act8600_reg_ro_ranges
),
199 static const struct regmap_access_table act8600_read_ranges_table
= {
200 .yes_ranges
= act8600_reg_ranges
,
201 .n_yes_ranges
= ARRAY_SIZE(act8600_reg_ranges
),
204 static const struct regmap_access_table act8600_volatile_ranges_table
= {
205 .yes_ranges
= act8600_reg_volatile_ranges
,
206 .n_yes_ranges
= ARRAY_SIZE(act8600_reg_volatile_ranges
),
209 static const struct regmap_config act8600_regmap_config
= {
212 .max_register
= 0xFF,
213 .wr_table
= &act8600_write_ranges_table
,
214 .rd_table
= &act8600_read_ranges_table
,
215 .volatile_table
= &act8600_volatile_ranges_table
,
218 static const struct regmap_config act8865_regmap_config
= {
223 static const struct regulator_linear_range act8865_voltage_ranges
[] = {
224 REGULATOR_LINEAR_RANGE(600000, 0, 23, 25000),
225 REGULATOR_LINEAR_RANGE(1200000, 24, 47, 50000),
226 REGULATOR_LINEAR_RANGE(2400000, 48, 63, 100000),
229 static const struct regulator_linear_range act8600_sudcdc_voltage_ranges
[] = {
230 REGULATOR_LINEAR_RANGE(3000000, 0, 63, 0),
231 REGULATOR_LINEAR_RANGE(3000000, 64, 159, 100000),
232 REGULATOR_LINEAR_RANGE(12600000, 160, 191, 200000),
233 REGULATOR_LINEAR_RANGE(19000000, 192, 247, 400000),
234 REGULATOR_LINEAR_RANGE(41400000, 248, 255, 0),
237 static int act8865_set_suspend_state(struct regulator_dev
*rdev
, bool enable
)
239 struct regmap
*regmap
= rdev
->regmap
;
240 int id
= rdev
->desc
->id
, reg
, val
;
243 case ACT8865_ID_DCDC1
:
244 reg
= ACT8865_DCDC1_SUS
;
247 case ACT8865_ID_DCDC2
:
248 reg
= ACT8865_DCDC2_SUS
;
251 case ACT8865_ID_DCDC3
:
252 reg
= ACT8865_DCDC3_SUS
;
255 case ACT8865_ID_LDO1
:
256 reg
= ACT8865_LDO1_SUS
;
259 case ACT8865_ID_LDO2
:
260 reg
= ACT8865_LDO2_SUS
;
263 case ACT8865_ID_LDO3
:
264 reg
= ACT8865_LDO3_SUS
;
267 case ACT8865_ID_LDO4
:
268 reg
= ACT8865_LDO4_SUS
;
279 * Ask the PMIC to enable/disable this output when entering hibernate
282 return regmap_write(regmap
, reg
, val
);
285 static int act8865_set_suspend_enable(struct regulator_dev
*rdev
)
287 return act8865_set_suspend_state(rdev
, true);
290 static int act8865_set_suspend_disable(struct regulator_dev
*rdev
)
292 return act8865_set_suspend_state(rdev
, false);
295 static unsigned int act8865_of_map_mode(unsigned int mode
)
298 case ACT8865_REGULATOR_MODE_FIXED
:
299 return REGULATOR_MODE_FAST
;
300 case ACT8865_REGULATOR_MODE_NORMAL
:
301 return REGULATOR_MODE_NORMAL
;
302 case ACT8865_REGULATOR_MODE_LOWPOWER
:
303 return REGULATOR_MODE_STANDBY
;
305 return REGULATOR_MODE_INVALID
;
309 static int act8865_set_mode(struct regulator_dev
*rdev
, unsigned int mode
)
311 struct regmap
*regmap
= rdev
->regmap
;
312 int id
= rdev_get_id(rdev
);
316 case ACT8865_ID_DCDC1
:
317 reg
= ACT8865_DCDC1_CTRL
;
319 case ACT8865_ID_DCDC2
:
320 reg
= ACT8865_DCDC2_CTRL
;
322 case ACT8865_ID_DCDC3
:
323 reg
= ACT8865_DCDC3_CTRL
;
325 case ACT8865_ID_LDO1
:
326 reg
= ACT8865_LDO1_CTRL
;
328 case ACT8865_ID_LDO2
:
329 reg
= ACT8865_LDO2_CTRL
;
331 case ACT8865_ID_LDO3
:
332 reg
= ACT8865_LDO3_CTRL
;
334 case ACT8865_ID_LDO4
:
335 reg
= ACT8865_LDO4_CTRL
;
342 case REGULATOR_MODE_FAST
:
343 case REGULATOR_MODE_NORMAL
:
344 if (id
<= ACT8865_ID_DCDC3
)
347 case REGULATOR_MODE_STANDBY
:
348 if (id
> ACT8865_ID_DCDC3
)
355 return regmap_update_bits(regmap
, reg
, BIT(5), val
);
358 static unsigned int act8865_get_mode(struct regulator_dev
*rdev
)
360 struct regmap
*regmap
= rdev
->regmap
;
361 int id
= rdev_get_id(rdev
);
362 int reg
, ret
, val
= 0;
365 case ACT8865_ID_DCDC1
:
366 reg
= ACT8865_DCDC1_CTRL
;
368 case ACT8865_ID_DCDC2
:
369 reg
= ACT8865_DCDC2_CTRL
;
371 case ACT8865_ID_DCDC3
:
372 reg
= ACT8865_DCDC3_CTRL
;
374 case ACT8865_ID_LDO1
:
375 reg
= ACT8865_LDO1_CTRL
;
377 case ACT8865_ID_LDO2
:
378 reg
= ACT8865_LDO2_CTRL
;
380 case ACT8865_ID_LDO3
:
381 reg
= ACT8865_LDO3_CTRL
;
383 case ACT8865_ID_LDO4
:
384 reg
= ACT8865_LDO4_CTRL
;
390 ret
= regmap_read(regmap
, reg
, &val
);
394 if (id
<= ACT8865_ID_DCDC3
&& (val
& BIT(5)))
395 return REGULATOR_MODE_FAST
;
396 else if (id
> ACT8865_ID_DCDC3
&& !(val
& BIT(5)))
397 return REGULATOR_MODE_NORMAL
;
399 return REGULATOR_MODE_STANDBY
;
402 static const struct regulator_ops act8865_ops
= {
403 .list_voltage
= regulator_list_voltage_linear_range
,
404 .map_voltage
= regulator_map_voltage_linear_range
,
405 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
406 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
407 .enable
= regulator_enable_regmap
,
408 .disable
= regulator_disable_regmap
,
409 .set_mode
= act8865_set_mode
,
410 .get_mode
= act8865_get_mode
,
411 .is_enabled
= regulator_is_enabled_regmap
,
412 .set_suspend_enable
= act8865_set_suspend_enable
,
413 .set_suspend_disable
= act8865_set_suspend_disable
,
416 static const struct regulator_ops act8865_ldo_ops
= {
417 .list_voltage
= regulator_list_voltage_linear_range
,
418 .map_voltage
= regulator_map_voltage_linear_range
,
419 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
420 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
421 .enable
= regulator_enable_regmap
,
422 .disable
= regulator_disable_regmap
,
423 .set_mode
= act8865_set_mode
,
424 .get_mode
= act8865_get_mode
,
425 .is_enabled
= regulator_is_enabled_regmap
,
426 .set_suspend_enable
= act8865_set_suspend_enable
,
427 .set_suspend_disable
= act8865_set_suspend_disable
,
428 .set_pull_down
= regulator_set_pull_down_regmap
,
431 static const struct regulator_ops act8865_fixed_ldo_ops
= {
432 .enable
= regulator_enable_regmap
,
433 .disable
= regulator_disable_regmap
,
434 .is_enabled
= regulator_is_enabled_regmap
,
437 #define ACT88xx_REG_(_name, _family, _id, _vsel_reg, _supply, _ops) \
438 [_family##_ID_##_id] = { \
440 .of_match = of_match_ptr(_name), \
441 .of_map_mode = act8865_of_map_mode, \
442 .regulators_node = of_match_ptr("regulators"), \
443 .supply_name = _supply, \
444 .id = _family##_ID_##_id, \
445 .type = REGULATOR_VOLTAGE, \
447 .n_voltages = ACT8865_VOLTAGE_NUM, \
448 .linear_ranges = act8865_voltage_ranges, \
449 .n_linear_ranges = ARRAY_SIZE(act8865_voltage_ranges), \
450 .vsel_reg = _family##_##_id##_##_vsel_reg, \
451 .vsel_mask = ACT8865_VSEL_MASK, \
452 .enable_reg = _family##_##_id##_CTRL, \
453 .enable_mask = ACT8865_ENA, \
454 .pull_down_reg = _family##_##_id##_CTRL, \
455 .pull_down_mask = ACT8865_DIS, \
456 .owner = THIS_MODULE, \
459 #define ACT88xx_REG(_name, _family, _id, _vsel_reg, _supply) \
460 ACT88xx_REG_(_name, _family, _id, _vsel_reg, _supply, &act8865_ops)
462 #define ACT88xx_LDO(_name, _family, _id, _vsel_reg, _supply) \
463 ACT88xx_REG_(_name, _family, _id, _vsel_reg, _supply, &act8865_ldo_ops)
465 static const struct regulator_desc act8600_regulators
[] = {
466 ACT88xx_REG("DCDC1", ACT8600
, DCDC1
, VSET
, "vp1"),
467 ACT88xx_REG("DCDC2", ACT8600
, DCDC2
, VSET
, "vp2"),
468 ACT88xx_REG("DCDC3", ACT8600
, DCDC3
, VSET
, "vp3"),
470 .name
= "SUDCDC_REG4",
471 .of_match
= of_match_ptr("SUDCDC_REG4"),
472 .regulators_node
= of_match_ptr("regulators"),
473 .id
= ACT8600_ID_SUDCDC4
,
475 .type
= REGULATOR_VOLTAGE
,
476 .n_voltages
= ACT8600_SUDCDC_VOLTAGE_NUM
,
477 .linear_ranges
= act8600_sudcdc_voltage_ranges
,
478 .n_linear_ranges
= ARRAY_SIZE(act8600_sudcdc_voltage_ranges
),
479 .vsel_reg
= ACT8600_SUDCDC4_VSET
,
480 .vsel_mask
= ACT8600_SUDCDC_VSEL_MASK
,
481 .enable_reg
= ACT8600_SUDCDC4_CTRL
,
482 .enable_mask
= ACT8865_ENA
,
483 .owner
= THIS_MODULE
,
485 ACT88xx_REG("LDO5", ACT8600
, LDO5
, VSET
, "inl"),
486 ACT88xx_REG("LDO6", ACT8600
, LDO6
, VSET
, "inl"),
487 ACT88xx_REG("LDO7", ACT8600
, LDO7
, VSET
, "inl"),
488 ACT88xx_REG("LDO8", ACT8600
, LDO8
, VSET
, "inl"),
491 .of_match
= of_match_ptr("LDO_REG9"),
492 .regulators_node
= of_match_ptr("regulators"),
493 .id
= ACT8600_ID_LDO9
,
494 .ops
= &act8865_fixed_ldo_ops
,
495 .type
= REGULATOR_VOLTAGE
,
498 .enable_reg
= ACT8600_LDO910_CTRL
,
499 .enable_mask
= ACT8865_ENA
,
500 .owner
= THIS_MODULE
,
504 .of_match
= of_match_ptr("LDO_REG10"),
505 .regulators_node
= of_match_ptr("regulators"),
506 .id
= ACT8600_ID_LDO10
,
507 .ops
= &act8865_fixed_ldo_ops
,
508 .type
= REGULATOR_VOLTAGE
,
511 .enable_reg
= ACT8600_LDO910_CTRL
,
512 .enable_mask
= ACT8600_LDO10_ENA
,
513 .owner
= THIS_MODULE
,
517 static const struct regulator_desc act8846_regulators
[] = {
518 ACT88xx_REG("REG1", ACT8846
, REG1
, VSET
, "vp1"),
519 ACT88xx_REG("REG2", ACT8846
, REG2
, VSET0
, "vp2"),
520 ACT88xx_REG("REG3", ACT8846
, REG3
, VSET0
, "vp3"),
521 ACT88xx_REG("REG4", ACT8846
, REG4
, VSET0
, "vp4"),
522 ACT88xx_REG("REG5", ACT8846
, REG5
, VSET
, "inl1"),
523 ACT88xx_REG("REG6", ACT8846
, REG6
, VSET
, "inl1"),
524 ACT88xx_REG("REG7", ACT8846
, REG7
, VSET
, "inl1"),
525 ACT88xx_REG("REG8", ACT8846
, REG8
, VSET
, "inl2"),
526 ACT88xx_REG("REG9", ACT8846
, REG9
, VSET
, "inl2"),
527 ACT88xx_REG("REG10", ACT8846
, REG10
, VSET
, "inl3"),
528 ACT88xx_REG("REG11", ACT8846
, REG11
, VSET
, "inl3"),
529 ACT88xx_REG("REG12", ACT8846
, REG12
, VSET
, "inl3"),
532 static const struct regulator_desc act8865_regulators
[] = {
533 ACT88xx_REG("DCDC_REG1", ACT8865
, DCDC1
, VSET1
, "vp1"),
534 ACT88xx_REG("DCDC_REG2", ACT8865
, DCDC2
, VSET1
, "vp2"),
535 ACT88xx_REG("DCDC_REG3", ACT8865
, DCDC3
, VSET1
, "vp3"),
536 ACT88xx_LDO("LDO_REG1", ACT8865
, LDO1
, VSET
, "inl45"),
537 ACT88xx_LDO("LDO_REG2", ACT8865
, LDO2
, VSET
, "inl45"),
538 ACT88xx_LDO("LDO_REG3", ACT8865
, LDO3
, VSET
, "inl67"),
539 ACT88xx_LDO("LDO_REG4", ACT8865
, LDO4
, VSET
, "inl67"),
542 static const struct regulator_desc act8865_alt_regulators
[] = {
543 ACT88xx_REG("DCDC_REG1", ACT8865
, DCDC1
, VSET2
, "vp1"),
544 ACT88xx_REG("DCDC_REG2", ACT8865
, DCDC2
, VSET2
, "vp2"),
545 ACT88xx_REG("DCDC_REG3", ACT8865
, DCDC3
, VSET2
, "vp3"),
546 ACT88xx_LDO("LDO_REG1", ACT8865
, LDO1
, VSET
, "inl45"),
547 ACT88xx_LDO("LDO_REG2", ACT8865
, LDO2
, VSET
, "inl45"),
548 ACT88xx_LDO("LDO_REG3", ACT8865
, LDO3
, VSET
, "inl67"),
549 ACT88xx_LDO("LDO_REG4", ACT8865
, LDO4
, VSET
, "inl67"),
553 static const struct of_device_id act8865_dt_ids
[] = {
554 { .compatible
= "active-semi,act8600", .data
= (void *)ACT8600
},
555 { .compatible
= "active-semi,act8846", .data
= (void *)ACT8846
},
556 { .compatible
= "active-semi,act8865", .data
= (void *)ACT8865
},
559 MODULE_DEVICE_TABLE(of
, act8865_dt_ids
);
562 static struct act8865_regulator_data
*act8865_get_regulator_data(
563 int id
, struct act8865_platform_data
*pdata
)
567 for (i
= 0; i
< pdata
->num_regulators
; i
++) {
568 if (pdata
->regulators
[i
].id
== id
)
569 return &pdata
->regulators
[i
];
575 static struct i2c_client
*act8865_i2c_client
;
576 static void act8865_power_off(void)
578 struct act8865
*act8865
;
580 act8865
= i2c_get_clientdata(act8865_i2c_client
);
581 regmap_write(act8865
->regmap
, act8865
->off_reg
, act8865
->off_mask
);
585 static int act8600_charger_get_status(struct regmap
*map
)
591 ret
= regmap_read(map
, ACT8600_APCH_STAT
, &val
);
595 state0
= val
& ACT8600_APCH_CSTATE0
;
596 state1
= val
& ACT8600_APCH_CSTATE1
;
598 if (state0
&& !state1
)
599 return POWER_SUPPLY_STATUS_CHARGING
;
600 if (!state0
&& state1
)
601 return POWER_SUPPLY_STATUS_NOT_CHARGING
;
602 if (!state0
&& !state1
)
603 return POWER_SUPPLY_STATUS_DISCHARGING
;
605 return POWER_SUPPLY_STATUS_UNKNOWN
;
608 static int act8600_charger_get_property(struct power_supply
*psy
,
609 enum power_supply_property psp
, union power_supply_propval
*val
)
611 struct regmap
*map
= power_supply_get_drvdata(psy
);
615 case POWER_SUPPLY_PROP_STATUS
:
616 ret
= act8600_charger_get_status(map
);
629 static enum power_supply_property act8600_charger_properties
[] = {
630 POWER_SUPPLY_PROP_STATUS
,
633 static const struct power_supply_desc act8600_charger_desc
= {
634 .name
= "act8600-charger",
635 .type
= POWER_SUPPLY_TYPE_BATTERY
,
636 .properties
= act8600_charger_properties
,
637 .num_properties
= ARRAY_SIZE(act8600_charger_properties
),
638 .get_property
= act8600_charger_get_property
,
641 static int act8600_charger_probe(struct device
*dev
, struct regmap
*regmap
)
643 struct power_supply
*charger
;
644 struct power_supply_config cfg
= {
646 .of_node
= dev
->of_node
,
649 charger
= devm_power_supply_register(dev
, &act8600_charger_desc
, &cfg
);
651 return PTR_ERR_OR_ZERO(charger
);
654 static int act8865_pmic_probe(struct i2c_client
*client
,
655 const struct i2c_device_id
*i2c_id
)
657 const struct regulator_desc
*regulators
;
658 struct act8865_platform_data
*pdata
= NULL
;
659 struct device
*dev
= &client
->dev
;
660 int i
, ret
, num_regulators
;
661 struct act8865
*act8865
;
662 const struct regmap_config
*regmap_config
;
664 int off_reg
, off_mask
;
665 int voltage_select
= 0;
668 const struct of_device_id
*id
;
670 id
= of_match_device(of_match_ptr(act8865_dt_ids
), dev
);
674 type
= (unsigned long) id
->data
;
676 voltage_select
= !!of_get_property(dev
->of_node
,
677 "active-semi,vsel-high",
680 type
= i2c_id
->driver_data
;
681 pdata
= dev_get_platdata(dev
);
686 regulators
= act8600_regulators
;
687 num_regulators
= ARRAY_SIZE(act8600_regulators
);
688 regmap_config
= &act8600_regmap_config
;
693 regulators
= act8846_regulators
;
694 num_regulators
= ARRAY_SIZE(act8846_regulators
);
695 regmap_config
= &act8865_regmap_config
;
696 off_reg
= ACT8846_GLB_OFF_CTRL
;
697 off_mask
= ACT8846_OFF_SYSMASK
;
700 if (voltage_select
) {
701 regulators
= act8865_alt_regulators
;
702 num_regulators
= ARRAY_SIZE(act8865_alt_regulators
);
704 regulators
= act8865_regulators
;
705 num_regulators
= ARRAY_SIZE(act8865_regulators
);
707 regmap_config
= &act8865_regmap_config
;
708 off_reg
= ACT8865_SYS_CTRL
;
709 off_mask
= ACT8865_MSTROFF
;
712 dev_err(dev
, "invalid device id %lu\n", type
);
716 act8865
= devm_kzalloc(dev
, sizeof(struct act8865
), GFP_KERNEL
);
720 act8865
->regmap
= devm_regmap_init_i2c(client
, regmap_config
);
721 if (IS_ERR(act8865
->regmap
)) {
722 ret
= PTR_ERR(act8865
->regmap
);
723 dev_err(dev
, "Failed to allocate register map: %d\n", ret
);
727 if (of_device_is_system_power_controller(dev
->of_node
)) {
728 if (!pm_power_off
&& (off_reg
> 0)) {
729 act8865_i2c_client
= client
;
730 act8865
->off_reg
= off_reg
;
731 act8865
->off_mask
= off_mask
;
732 pm_power_off
= act8865_power_off
;
734 dev_err(dev
, "Failed to set poweroff capability, already defined\n");
738 /* Finally register devices */
739 for (i
= 0; i
< num_regulators
; i
++) {
740 const struct regulator_desc
*desc
= ®ulators
[i
];
741 struct regulator_config config
= { };
742 struct regulator_dev
*rdev
;
745 config
.driver_data
= act8865
;
746 config
.regmap
= act8865
->regmap
;
749 struct act8865_regulator_data
*rdata
;
751 rdata
= act8865_get_regulator_data(desc
->id
, pdata
);
753 config
.init_data
= rdata
->init_data
;
754 config
.of_node
= rdata
->of_node
;
758 rdev
= devm_regulator_register(dev
, desc
, &config
);
760 dev_err(dev
, "failed to register %s\n", desc
->name
);
761 return PTR_ERR(rdev
);
765 if (type
== ACT8600
) {
766 ret
= act8600_charger_probe(dev
, act8865
->regmap
);
768 if (ret
!= -EPROBE_DEFER
)
769 dev_err(dev
, "Failed to probe charger");
774 i2c_set_clientdata(client
, act8865
);
776 /* Unlock expert registers for ACT8865. */
777 return type
!= ACT8865
? 0 : regmap_write(act8865
->regmap
,
778 ACT8865_SYS_UNLK_REGS
, 0xef);
781 static const struct i2c_device_id act8865_ids
[] = {
782 { .name
= "act8600", .driver_data
= ACT8600
},
783 { .name
= "act8846", .driver_data
= ACT8846
},
784 { .name
= "act8865", .driver_data
= ACT8865
},
787 MODULE_DEVICE_TABLE(i2c
, act8865_ids
);
789 static struct i2c_driver act8865_pmic_driver
= {
793 .probe
= act8865_pmic_probe
,
794 .id_table
= act8865_ids
,
797 module_i2c_driver(act8865_pmic_driver
);
799 MODULE_DESCRIPTION("active-semi act88xx voltage regulator driver");
800 MODULE_AUTHOR("Wenyou Yang <wenyou.yang@atmel.com>");
801 MODULE_LICENSE("GPL v2");