1 // SPDX-License-Identifier: GPL-2.0+
3 // da9211-regulator.c - Regulator device driver for DA9211/DA9212
4 // /DA9213/DA9223/DA9214/DA9224/DA9215/DA9225
5 // Copyright (C) 2015 Dialog Semiconductor Ltd.
9 #include <linux/module.h>
10 #include <linux/init.h>
11 #include <linux/slab.h>
12 #include <linux/regulator/driver.h>
13 #include <linux/regulator/machine.h>
14 #include <linux/regmap.h>
15 #include <linux/irq.h>
16 #include <linux/interrupt.h>
17 #include <linux/gpio/consumer.h>
18 #include <linux/regulator/of_regulator.h>
19 #include <linux/regulator/da9211.h>
20 #include "da9211-regulator.h"
23 #define DA9211_DEVICE_ID 0x22
24 #define DA9213_DEVICE_ID 0x23
25 #define DA9215_DEVICE_ID 0x24
27 #define DA9211_BUCK_MODE_SLEEP 1
28 #define DA9211_BUCK_MODE_SYNC 2
29 #define DA9211_BUCK_MODE_AUTO 3
31 /* DA9211 REGULATOR IDs */
32 #define DA9211_ID_BUCKA 0
33 #define DA9211_ID_BUCKB 1
37 struct regmap
*regmap
;
38 struct da9211_pdata
*pdata
;
39 struct regulator_dev
*rdev
[DA9211_MAX_REGULATORS
];
45 static const struct regmap_range_cfg da9211_regmap_range
[] = {
47 .selector_reg
= DA9211_REG_PAGE_CON
,
48 .selector_mask
= DA9211_REG_PAGE_MASK
,
49 .selector_shift
= DA9211_REG_PAGE_SHIFT
,
57 static const struct regmap_config da9211_regmap_config
= {
60 .max_register
= 5 * 128,
61 .ranges
= da9211_regmap_range
,
62 .num_ranges
= ARRAY_SIZE(da9211_regmap_range
),
65 /* Default limits measured in millivolts and milliamps */
66 #define DA9211_MIN_MV 300
67 #define DA9211_MAX_MV 1570
68 #define DA9211_STEP_MV 10
70 /* Current limits for DA9211 buck (uA) indices
71 * corresponds with register values
73 static const int da9211_current_limits
[] = {
74 2000000, 2200000, 2400000, 2600000, 2800000, 3000000, 3200000, 3400000,
75 3600000, 3800000, 4000000, 4200000, 4400000, 4600000, 4800000, 5000000
77 /* Current limits for DA9213 buck (uA) indices
78 * corresponds with register values
80 static const int da9213_current_limits
[] = {
81 3000000, 3200000, 3400000, 3600000, 3800000, 4000000, 4200000, 4400000,
82 4600000, 4800000, 5000000, 5200000, 5400000, 5600000, 5800000, 6000000
84 /* Current limits for DA9215 buck (uA) indices
85 * corresponds with register values
87 static const int da9215_current_limits
[] = {
88 4000000, 4200000, 4400000, 4600000, 4800000, 5000000, 5200000, 5400000,
89 5600000, 5800000, 6000000, 6200000, 6400000, 6600000, 6800000, 7000000
92 static unsigned int da9211_buck_get_mode(struct regulator_dev
*rdev
)
94 int id
= rdev_get_id(rdev
);
95 struct da9211
*chip
= rdev_get_drvdata(rdev
);
99 ret
= regmap_read(chip
->regmap
, DA9211_REG_BUCKA_CONF
+id
, &data
);
103 switch (data
& 0x03) {
104 case DA9211_BUCK_MODE_SYNC
:
105 mode
= REGULATOR_MODE_FAST
;
107 case DA9211_BUCK_MODE_AUTO
:
108 mode
= REGULATOR_MODE_NORMAL
;
110 case DA9211_BUCK_MODE_SLEEP
:
111 mode
= REGULATOR_MODE_STANDBY
;
118 static int da9211_buck_set_mode(struct regulator_dev
*rdev
,
121 int id
= rdev_get_id(rdev
);
122 struct da9211
*chip
= rdev_get_drvdata(rdev
);
126 case REGULATOR_MODE_FAST
:
127 val
= DA9211_BUCK_MODE_SYNC
;
129 case REGULATOR_MODE_NORMAL
:
130 val
= DA9211_BUCK_MODE_AUTO
;
132 case REGULATOR_MODE_STANDBY
:
133 val
= DA9211_BUCK_MODE_SLEEP
;
137 return regmap_update_bits(chip
->regmap
, DA9211_REG_BUCKA_CONF
+id
,
141 static int da9211_set_current_limit(struct regulator_dev
*rdev
, int min
,
144 int id
= rdev_get_id(rdev
);
145 struct da9211
*chip
= rdev_get_drvdata(rdev
);
147 const int *current_limits
;
149 switch (chip
->chip_id
) {
151 current_limits
= da9211_current_limits
;
152 max_size
= ARRAY_SIZE(da9211_current_limits
)-1;
155 current_limits
= da9213_current_limits
;
156 max_size
= ARRAY_SIZE(da9213_current_limits
)-1;
159 current_limits
= da9215_current_limits
;
160 max_size
= ARRAY_SIZE(da9215_current_limits
)-1;
166 /* search for closest to maximum */
167 for (i
= max_size
; i
>= 0; i
--) {
168 if (min
<= current_limits
[i
] &&
169 max
>= current_limits
[i
]) {
170 return regmap_update_bits(chip
->regmap
,
171 DA9211_REG_BUCK_ILIM
,
172 (0x0F << id
*4), (i
<< id
*4));
179 static int da9211_get_current_limit(struct regulator_dev
*rdev
)
181 int id
= rdev_get_id(rdev
);
182 struct da9211
*chip
= rdev_get_drvdata(rdev
);
185 const int *current_limits
;
187 switch (chip
->chip_id
) {
189 current_limits
= da9211_current_limits
;
192 current_limits
= da9213_current_limits
;
195 current_limits
= da9215_current_limits
;
201 ret
= regmap_read(chip
->regmap
, DA9211_REG_BUCK_ILIM
, &data
);
205 /* select one of 16 values: 0000 (2000mA or 3000mA)
206 * to 1111 (5000mA or 6000mA).
208 data
= (data
>> id
*4) & 0x0F;
209 return current_limits
[data
];
212 static const struct regulator_ops da9211_buck_ops
= {
213 .get_mode
= da9211_buck_get_mode
,
214 .set_mode
= da9211_buck_set_mode
,
215 .enable
= regulator_enable_regmap
,
216 .disable
= regulator_disable_regmap
,
217 .is_enabled
= regulator_is_enabled_regmap
,
218 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
219 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
220 .list_voltage
= regulator_list_voltage_linear
,
221 .set_current_limit
= da9211_set_current_limit
,
222 .get_current_limit
= da9211_get_current_limit
,
225 #define DA9211_BUCK(_id) \
228 .ops = &da9211_buck_ops,\
229 .type = REGULATOR_VOLTAGE,\
230 .id = DA9211_ID_##_id,\
231 .n_voltages = (DA9211_MAX_MV - DA9211_MIN_MV) / DA9211_STEP_MV + 1,\
232 .min_uV = (DA9211_MIN_MV * 1000),\
233 .uV_step = (DA9211_STEP_MV * 1000),\
234 .enable_reg = DA9211_REG_BUCKA_CONT + DA9211_ID_##_id,\
235 .enable_mask = DA9211_BUCKA_EN,\
236 .vsel_reg = DA9211_REG_VBUCKA_A + DA9211_ID_##_id * 2,\
237 .vsel_mask = DA9211_VBUCK_MASK,\
238 .owner = THIS_MODULE,\
241 static struct regulator_desc da9211_regulators
[] = {
247 static struct of_regulator_match da9211_matches
[] = {
248 [DA9211_ID_BUCKA
] = { .name
= "BUCKA" },
249 [DA9211_ID_BUCKB
] = { .name
= "BUCKB" },
252 static struct da9211_pdata
*da9211_parse_regulators_dt(
255 struct da9211_pdata
*pdata
;
256 struct device_node
*node
;
259 node
= of_get_child_by_name(dev
->of_node
, "regulators");
261 dev_err(dev
, "regulators node not found\n");
262 return ERR_PTR(-ENODEV
);
265 num
= of_regulator_match(dev
, node
, da9211_matches
,
266 ARRAY_SIZE(da9211_matches
));
269 dev_err(dev
, "Failed to match regulators\n");
270 return ERR_PTR(-EINVAL
);
273 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
275 return ERR_PTR(-ENOMEM
);
277 pdata
->num_buck
= num
;
280 for (i
= 0; i
< ARRAY_SIZE(da9211_matches
); i
++) {
281 if (!da9211_matches
[i
].init_data
)
284 pdata
->init_data
[n
] = da9211_matches
[i
].init_data
;
285 pdata
->reg_node
[n
] = da9211_matches
[i
].of_node
;
286 pdata
->gpiod_ren
[n
] = devm_fwnode_gpiod_get(dev
,
287 of_fwnode_handle(pdata
->reg_node
[n
]),
290 GPIOD_FLAGS_BIT_NONEXCLUSIVE
,
292 if (IS_ERR(pdata
->gpiod_ren
[n
]))
293 pdata
->gpiod_ren
[n
] = NULL
;
300 static struct da9211_pdata
*da9211_parse_regulators_dt(
303 return ERR_PTR(-ENODEV
);
307 static irqreturn_t
da9211_irq_handler(int irq
, void *data
)
309 struct da9211
*chip
= data
;
310 int reg_val
, err
, ret
= IRQ_NONE
;
312 err
= regmap_read(chip
->regmap
, DA9211_REG_EVENT_B
, ®_val
);
316 if (reg_val
& DA9211_E_OV_CURR_A
) {
317 regulator_lock(chip
->rdev
[0]);
318 regulator_notifier_call_chain(chip
->rdev
[0],
319 REGULATOR_EVENT_OVER_CURRENT
, NULL
);
320 regulator_unlock(chip
->rdev
[0]);
322 err
= regmap_write(chip
->regmap
, DA9211_REG_EVENT_B
,
330 if (reg_val
& DA9211_E_OV_CURR_B
) {
331 regulator_lock(chip
->rdev
[1]);
332 regulator_notifier_call_chain(chip
->rdev
[1],
333 REGULATOR_EVENT_OVER_CURRENT
, NULL
);
334 regulator_unlock(chip
->rdev
[1]);
336 err
= regmap_write(chip
->regmap
, DA9211_REG_EVENT_B
,
347 dev_err(chip
->dev
, "I2C error : %d\n", err
);
351 static int da9211_regulator_init(struct da9211
*chip
)
353 struct regulator_config config
= { };
357 ret
= regmap_read(chip
->regmap
, DA9211_REG_CONFIG_E
, &data
);
359 dev_err(chip
->dev
, "Failed to read CONFIG_E reg: %d\n", ret
);
363 data
&= DA9211_SLAVE_SEL
;
364 /* If configuration for 1/2 bucks is different between platform data
365 * and the register, driver should exit.
367 if (chip
->pdata
->num_buck
== 1 && data
== 0x00)
368 chip
->num_regulator
= 1;
369 else if (chip
->pdata
->num_buck
== 2 && data
!= 0x00)
370 chip
->num_regulator
= 2;
372 dev_err(chip
->dev
, "Configuration is mismatched\n");
376 for (i
= 0; i
< chip
->num_regulator
; i
++) {
377 config
.init_data
= chip
->pdata
->init_data
[i
];
378 config
.dev
= chip
->dev
;
379 config
.driver_data
= chip
;
380 config
.regmap
= chip
->regmap
;
381 config
.of_node
= chip
->pdata
->reg_node
[i
];
383 if (chip
->pdata
->gpiod_ren
[i
])
384 config
.ena_gpiod
= chip
->pdata
->gpiod_ren
[i
];
386 config
.ena_gpiod
= NULL
;
389 * Hand the GPIO descriptor management over to the regulator
390 * core, remove it from GPIO devres management.
392 if (config
.ena_gpiod
)
393 devm_gpiod_unhinge(chip
->dev
, config
.ena_gpiod
);
394 chip
->rdev
[i
] = devm_regulator_register(chip
->dev
,
395 &da9211_regulators
[i
], &config
);
396 if (IS_ERR(chip
->rdev
[i
])) {
398 "Failed to register DA9211 regulator\n");
399 return PTR_ERR(chip
->rdev
[i
]);
402 if (chip
->chip_irq
!= 0) {
403 ret
= regmap_update_bits(chip
->regmap
,
404 DA9211_REG_MASK_B
, DA9211_M_OV_CURR_A
<< i
, 0);
407 "Failed to update mask reg: %d\n", ret
);
417 * I2C driver interface functions
419 static int da9211_i2c_probe(struct i2c_client
*i2c
)
425 chip
= devm_kzalloc(&i2c
->dev
, sizeof(struct da9211
), GFP_KERNEL
);
429 chip
->dev
= &i2c
->dev
;
430 chip
->regmap
= devm_regmap_init_i2c(i2c
, &da9211_regmap_config
);
431 if (IS_ERR(chip
->regmap
)) {
432 error
= PTR_ERR(chip
->regmap
);
433 dev_err(chip
->dev
, "Failed to allocate register map: %d\n",
438 i2c_set_clientdata(i2c
, chip
);
440 chip
->pdata
= i2c
->dev
.platform_data
;
442 ret
= regmap_read(chip
->regmap
, DA9211_REG_DEVICE_ID
, &data
);
444 dev_err(chip
->dev
, "Failed to read DEVICE_ID reg: %d\n", ret
);
449 case DA9211_DEVICE_ID
:
450 chip
->chip_id
= DA9211
;
452 case DA9213_DEVICE_ID
:
453 chip
->chip_id
= DA9213
;
455 case DA9215_DEVICE_ID
:
456 chip
->chip_id
= DA9215
;
459 dev_err(chip
->dev
, "Unsupported device id = 0x%x.\n", data
);
464 chip
->pdata
= da9211_parse_regulators_dt(chip
->dev
);
466 if (IS_ERR(chip
->pdata
)) {
467 dev_err(chip
->dev
, "No regulators defined for the platform\n");
468 return PTR_ERR(chip
->pdata
);
471 chip
->chip_irq
= i2c
->irq
;
473 if (chip
->chip_irq
!= 0) {
474 ret
= devm_request_threaded_irq(chip
->dev
, chip
->chip_irq
, NULL
,
476 IRQF_TRIGGER_LOW
|IRQF_ONESHOT
,
479 dev_err(chip
->dev
, "Failed to request IRQ: %d\n",
484 dev_warn(chip
->dev
, "No IRQ configured\n");
487 ret
= da9211_regulator_init(chip
);
490 dev_err(chip
->dev
, "Failed to initialize regulator: %d\n", ret
);
495 static const struct i2c_device_id da9211_i2c_id
[] = {
506 MODULE_DEVICE_TABLE(i2c
, da9211_i2c_id
);
509 static const struct of_device_id da9211_dt_ids
[] = {
510 { .compatible
= "dlg,da9211", .data
= &da9211_i2c_id
[0] },
511 { .compatible
= "dlg,da9212", .data
= &da9211_i2c_id
[1] },
512 { .compatible
= "dlg,da9213", .data
= &da9211_i2c_id
[2] },
513 { .compatible
= "dlg,da9223", .data
= &da9211_i2c_id
[3] },
514 { .compatible
= "dlg,da9214", .data
= &da9211_i2c_id
[4] },
515 { .compatible
= "dlg,da9224", .data
= &da9211_i2c_id
[5] },
516 { .compatible
= "dlg,da9215", .data
= &da9211_i2c_id
[6] },
517 { .compatible
= "dlg,da9225", .data
= &da9211_i2c_id
[7] },
520 MODULE_DEVICE_TABLE(of
, da9211_dt_ids
);
523 static struct i2c_driver da9211_regulator_driver
= {
526 .of_match_table
= of_match_ptr(da9211_dt_ids
),
528 .probe_new
= da9211_i2c_probe
,
529 .id_table
= da9211_i2c_id
,
532 module_i2c_driver(da9211_regulator_driver
);
534 MODULE_AUTHOR("James Ban <James.Ban.opensource@diasemi.com>");
535 MODULE_DESCRIPTION("DA9211/DA9212/DA9213/DA9223/DA9214/DA9224/DA9215/DA9225 regulator driver");
536 MODULE_LICENSE("GPL");