0001
0002
0003
0004
0005
0006
0007 #include <linux/err.h>
0008 #include <linux/i2c.h>
0009 #include <linux/module.h>
0010 #include <linux/init.h>
0011 #include <linux/slab.h>
0012 #include <linux/regulator/driver.h>
0013 #include <linux/regulator/machine.h>
0014 #include <linux/regmap.h>
0015 #include <linux/irq.h>
0016 #include <linux/interrupt.h>
0017 #include <linux/gpio/consumer.h>
0018 #include <linux/regulator/of_regulator.h>
0019 #include <linux/regulator/da9211.h>
0020 #include <dt-bindings/regulator/dlg,da9211-regulator.h>
0021 #include "da9211-regulator.h"
0022
0023
0024 #define DA9211_DEVICE_ID 0x22
0025 #define DA9213_DEVICE_ID 0x23
0026 #define DA9215_DEVICE_ID 0x24
0027
0028
0029 #define DA9211_ID_BUCKA 0
0030 #define DA9211_ID_BUCKB 1
0031
0032 struct da9211 {
0033 struct device *dev;
0034 struct regmap *regmap;
0035 struct da9211_pdata *pdata;
0036 struct regulator_dev *rdev[DA9211_MAX_REGULATORS];
0037 int num_regulator;
0038 int chip_irq;
0039 int chip_id;
0040 };
0041
0042 static const struct regmap_range_cfg da9211_regmap_range[] = {
0043 {
0044 .selector_reg = DA9211_REG_PAGE_CON,
0045 .selector_mask = DA9211_REG_PAGE_MASK,
0046 .selector_shift = DA9211_REG_PAGE_SHIFT,
0047 .window_start = 0,
0048 .window_len = 256,
0049 .range_min = 0,
0050 .range_max = 5*128,
0051 },
0052 };
0053
0054 static bool da9211_volatile_reg(struct device *dev, unsigned int reg)
0055 {
0056 switch (reg) {
0057 case DA9211_REG_STATUS_A:
0058 case DA9211_REG_STATUS_B:
0059 case DA9211_REG_EVENT_A:
0060 case DA9211_REG_EVENT_B:
0061 return true;
0062 }
0063 return false;
0064 }
0065
0066 static const struct regmap_config da9211_regmap_config = {
0067 .reg_bits = 8,
0068 .val_bits = 8,
0069 .max_register = 5 * 128,
0070 .volatile_reg = da9211_volatile_reg,
0071 .cache_type = REGCACHE_RBTREE,
0072 .ranges = da9211_regmap_range,
0073 .num_ranges = ARRAY_SIZE(da9211_regmap_range),
0074 };
0075
0076
0077 #define DA9211_MIN_MV 300
0078 #define DA9211_MAX_MV 1570
0079 #define DA9211_STEP_MV 10
0080
0081
0082
0083
0084 static const int da9211_current_limits[] = {
0085 2000000, 2200000, 2400000, 2600000, 2800000, 3000000, 3200000, 3400000,
0086 3600000, 3800000, 4000000, 4200000, 4400000, 4600000, 4800000, 5000000
0087 };
0088
0089
0090
0091 static const int da9213_current_limits[] = {
0092 3000000, 3200000, 3400000, 3600000, 3800000, 4000000, 4200000, 4400000,
0093 4600000, 4800000, 5000000, 5200000, 5400000, 5600000, 5800000, 6000000
0094 };
0095
0096
0097
0098 static const int da9215_current_limits[] = {
0099 4000000, 4200000, 4400000, 4600000, 4800000, 5000000, 5200000, 5400000,
0100 5600000, 5800000, 6000000, 6200000, 6400000, 6600000, 6800000, 7000000
0101 };
0102
0103 static unsigned int da9211_map_buck_mode(unsigned int mode)
0104 {
0105 switch (mode) {
0106 case DA9211_BUCK_MODE_SLEEP:
0107 return REGULATOR_MODE_STANDBY;
0108 case DA9211_BUCK_MODE_SYNC:
0109 return REGULATOR_MODE_FAST;
0110 case DA9211_BUCK_MODE_AUTO:
0111 return REGULATOR_MODE_NORMAL;
0112 default:
0113 return REGULATOR_MODE_INVALID;
0114 }
0115 }
0116
0117 static unsigned int da9211_buck_get_mode(struct regulator_dev *rdev)
0118 {
0119 int id = rdev_get_id(rdev);
0120 struct da9211 *chip = rdev_get_drvdata(rdev);
0121 unsigned int data;
0122 int ret, mode = 0;
0123
0124 ret = regmap_read(chip->regmap, DA9211_REG_BUCKA_CONF+id, &data);
0125 if (ret < 0)
0126 return ret;
0127
0128 switch (data & 0x03) {
0129 case DA9211_BUCK_MODE_SYNC:
0130 mode = REGULATOR_MODE_FAST;
0131 break;
0132 case DA9211_BUCK_MODE_AUTO:
0133 mode = REGULATOR_MODE_NORMAL;
0134 break;
0135 case DA9211_BUCK_MODE_SLEEP:
0136 mode = REGULATOR_MODE_STANDBY;
0137 break;
0138 }
0139
0140 return mode;
0141 }
0142
0143 static int da9211_buck_set_mode(struct regulator_dev *rdev,
0144 unsigned int mode)
0145 {
0146 int id = rdev_get_id(rdev);
0147 struct da9211 *chip = rdev_get_drvdata(rdev);
0148 int val = 0;
0149
0150 switch (mode) {
0151 case REGULATOR_MODE_FAST:
0152 val = DA9211_BUCK_MODE_SYNC;
0153 break;
0154 case REGULATOR_MODE_NORMAL:
0155 val = DA9211_BUCK_MODE_AUTO;
0156 break;
0157 case REGULATOR_MODE_STANDBY:
0158 val = DA9211_BUCK_MODE_SLEEP;
0159 break;
0160 }
0161
0162 return regmap_update_bits(chip->regmap, DA9211_REG_BUCKA_CONF+id,
0163 0x03, val);
0164 }
0165
0166 static int da9211_set_current_limit(struct regulator_dev *rdev, int min,
0167 int max)
0168 {
0169 int id = rdev_get_id(rdev);
0170 struct da9211 *chip = rdev_get_drvdata(rdev);
0171 int i, max_size;
0172 const int *current_limits;
0173
0174 switch (chip->chip_id) {
0175 case DA9211:
0176 current_limits = da9211_current_limits;
0177 max_size = ARRAY_SIZE(da9211_current_limits)-1;
0178 break;
0179 case DA9213:
0180 current_limits = da9213_current_limits;
0181 max_size = ARRAY_SIZE(da9213_current_limits)-1;
0182 break;
0183 case DA9215:
0184 current_limits = da9215_current_limits;
0185 max_size = ARRAY_SIZE(da9215_current_limits)-1;
0186 break;
0187 default:
0188 return -EINVAL;
0189 }
0190
0191
0192 for (i = max_size; i >= 0; i--) {
0193 if (min <= current_limits[i] &&
0194 max >= current_limits[i]) {
0195 return regmap_update_bits(chip->regmap,
0196 DA9211_REG_BUCK_ILIM,
0197 (0x0F << id*4), (i << id*4));
0198 }
0199 }
0200
0201 return -EINVAL;
0202 }
0203
0204 static int da9211_get_current_limit(struct regulator_dev *rdev)
0205 {
0206 int id = rdev_get_id(rdev);
0207 struct da9211 *chip = rdev_get_drvdata(rdev);
0208 unsigned int data;
0209 int ret;
0210 const int *current_limits;
0211
0212 switch (chip->chip_id) {
0213 case DA9211:
0214 current_limits = da9211_current_limits;
0215 break;
0216 case DA9213:
0217 current_limits = da9213_current_limits;
0218 break;
0219 case DA9215:
0220 current_limits = da9215_current_limits;
0221 break;
0222 default:
0223 return -EINVAL;
0224 }
0225
0226 ret = regmap_read(chip->regmap, DA9211_REG_BUCK_ILIM, &data);
0227 if (ret < 0)
0228 return ret;
0229
0230
0231
0232
0233 data = (data >> id*4) & 0x0F;
0234 return current_limits[data];
0235 }
0236
0237 static const struct regulator_ops da9211_buck_ops = {
0238 .get_mode = da9211_buck_get_mode,
0239 .set_mode = da9211_buck_set_mode,
0240 .enable = regulator_enable_regmap,
0241 .disable = regulator_disable_regmap,
0242 .is_enabled = regulator_is_enabled_regmap,
0243 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0244 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0245 .list_voltage = regulator_list_voltage_linear,
0246 .set_current_limit = da9211_set_current_limit,
0247 .get_current_limit = da9211_get_current_limit,
0248 };
0249
0250 #define DA9211_BUCK(_id) \
0251 {\
0252 .name = #_id,\
0253 .ops = &da9211_buck_ops,\
0254 .type = REGULATOR_VOLTAGE,\
0255 .id = DA9211_ID_##_id,\
0256 .n_voltages = (DA9211_MAX_MV - DA9211_MIN_MV) / DA9211_STEP_MV + 1,\
0257 .min_uV = (DA9211_MIN_MV * 1000),\
0258 .uV_step = (DA9211_STEP_MV * 1000),\
0259 .enable_reg = DA9211_REG_BUCKA_CONT + DA9211_ID_##_id,\
0260 .enable_mask = DA9211_BUCKA_EN,\
0261 .vsel_reg = DA9211_REG_VBUCKA_A + DA9211_ID_##_id * 2,\
0262 .vsel_mask = DA9211_VBUCK_MASK,\
0263 .owner = THIS_MODULE,\
0264 .of_map_mode = da9211_map_buck_mode,\
0265 }
0266
0267 static struct regulator_desc da9211_regulators[] = {
0268 DA9211_BUCK(BUCKA),
0269 DA9211_BUCK(BUCKB),
0270 };
0271
0272 #ifdef CONFIG_OF
0273 static struct of_regulator_match da9211_matches[] = {
0274 [DA9211_ID_BUCKA] = {
0275 .name = "BUCKA",
0276 .desc = &da9211_regulators[DA9211_ID_BUCKA],
0277 },
0278 [DA9211_ID_BUCKB] = {
0279 .name = "BUCKB",
0280 .desc = &da9211_regulators[DA9211_ID_BUCKB],
0281 },
0282 };
0283
0284 static struct da9211_pdata *da9211_parse_regulators_dt(
0285 struct device *dev)
0286 {
0287 struct da9211_pdata *pdata;
0288 struct device_node *node;
0289 int i, num, n;
0290
0291 node = of_get_child_by_name(dev->of_node, "regulators");
0292 if (!node) {
0293 dev_err(dev, "regulators node not found\n");
0294 return ERR_PTR(-ENODEV);
0295 }
0296
0297 num = of_regulator_match(dev, node, da9211_matches,
0298 ARRAY_SIZE(da9211_matches));
0299 of_node_put(node);
0300 if (num < 0) {
0301 dev_err(dev, "Failed to match regulators\n");
0302 return ERR_PTR(-EINVAL);
0303 }
0304
0305 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
0306 if (!pdata)
0307 return ERR_PTR(-ENOMEM);
0308
0309 pdata->num_buck = num;
0310
0311 n = 0;
0312 for (i = 0; i < ARRAY_SIZE(da9211_matches); i++) {
0313 if (!da9211_matches[i].init_data)
0314 continue;
0315
0316 pdata->init_data[n] = da9211_matches[i].init_data;
0317 pdata->reg_node[n] = da9211_matches[i].of_node;
0318 pdata->gpiod_ren[n] = devm_fwnode_gpiod_get(dev,
0319 of_fwnode_handle(pdata->reg_node[n]),
0320 "enable",
0321 GPIOD_OUT_HIGH |
0322 GPIOD_FLAGS_BIT_NONEXCLUSIVE,
0323 "da9211-enable");
0324 if (IS_ERR(pdata->gpiod_ren[n]))
0325 pdata->gpiod_ren[n] = NULL;
0326 n++;
0327 }
0328
0329 return pdata;
0330 }
0331 #else
0332 static struct da9211_pdata *da9211_parse_regulators_dt(
0333 struct device *dev)
0334 {
0335 return ERR_PTR(-ENODEV);
0336 }
0337 #endif
0338
0339 static irqreturn_t da9211_irq_handler(int irq, void *data)
0340 {
0341 struct da9211 *chip = data;
0342 int reg_val, err, ret = IRQ_NONE;
0343
0344 err = regmap_read(chip->regmap, DA9211_REG_EVENT_B, ®_val);
0345 if (err < 0)
0346 goto error_i2c;
0347
0348 if (reg_val & DA9211_E_OV_CURR_A) {
0349 regulator_notifier_call_chain(chip->rdev[0],
0350 REGULATOR_EVENT_OVER_CURRENT, NULL);
0351
0352 err = regmap_write(chip->regmap, DA9211_REG_EVENT_B,
0353 DA9211_E_OV_CURR_A);
0354 if (err < 0)
0355 goto error_i2c;
0356
0357 ret = IRQ_HANDLED;
0358 }
0359
0360 if (reg_val & DA9211_E_OV_CURR_B) {
0361 regulator_notifier_call_chain(chip->rdev[1],
0362 REGULATOR_EVENT_OVER_CURRENT, NULL);
0363
0364 err = regmap_write(chip->regmap, DA9211_REG_EVENT_B,
0365 DA9211_E_OV_CURR_B);
0366 if (err < 0)
0367 goto error_i2c;
0368
0369 ret = IRQ_HANDLED;
0370 }
0371
0372 return ret;
0373
0374 error_i2c:
0375 dev_err(chip->dev, "I2C error : %d\n", err);
0376 return IRQ_NONE;
0377 }
0378
0379 static int da9211_regulator_init(struct da9211 *chip)
0380 {
0381 struct regulator_config config = { };
0382 int i, ret;
0383 unsigned int data;
0384
0385 ret = regmap_read(chip->regmap, DA9211_REG_CONFIG_E, &data);
0386 if (ret < 0) {
0387 dev_err(chip->dev, "Failed to read CONFIG_E reg: %d\n", ret);
0388 return ret;
0389 }
0390
0391 data &= DA9211_SLAVE_SEL;
0392
0393
0394
0395 if (chip->pdata->num_buck == 1 && data == 0x00)
0396 chip->num_regulator = 1;
0397 else if (chip->pdata->num_buck == 2 && data != 0x00)
0398 chip->num_regulator = 2;
0399 else {
0400 dev_err(chip->dev, "Configuration is mismatched\n");
0401 return -EINVAL;
0402 }
0403
0404 for (i = 0; i < chip->num_regulator; i++) {
0405 config.init_data = chip->pdata->init_data[i];
0406 config.dev = chip->dev;
0407 config.driver_data = chip;
0408 config.regmap = chip->regmap;
0409 config.of_node = chip->pdata->reg_node[i];
0410
0411 if (chip->pdata->gpiod_ren[i])
0412 config.ena_gpiod = chip->pdata->gpiod_ren[i];
0413 else
0414 config.ena_gpiod = NULL;
0415
0416
0417
0418
0419
0420 if (config.ena_gpiod)
0421 devm_gpiod_unhinge(chip->dev, config.ena_gpiod);
0422 chip->rdev[i] = devm_regulator_register(chip->dev,
0423 &da9211_regulators[i], &config);
0424 if (IS_ERR(chip->rdev[i])) {
0425 dev_err(chip->dev,
0426 "Failed to register DA9211 regulator\n");
0427 return PTR_ERR(chip->rdev[i]);
0428 }
0429
0430 if (chip->chip_irq != 0) {
0431 ret = regmap_update_bits(chip->regmap,
0432 DA9211_REG_MASK_B, DA9211_M_OV_CURR_A << i, 0);
0433 if (ret < 0) {
0434 dev_err(chip->dev,
0435 "Failed to update mask reg: %d\n", ret);
0436 return ret;
0437 }
0438 }
0439 }
0440
0441 return 0;
0442 }
0443
0444
0445
0446
0447 static int da9211_i2c_probe(struct i2c_client *i2c)
0448 {
0449 struct da9211 *chip;
0450 int error, ret;
0451 unsigned int data;
0452
0453 chip = devm_kzalloc(&i2c->dev, sizeof(struct da9211), GFP_KERNEL);
0454 if (!chip)
0455 return -ENOMEM;
0456
0457 chip->dev = &i2c->dev;
0458 chip->regmap = devm_regmap_init_i2c(i2c, &da9211_regmap_config);
0459 if (IS_ERR(chip->regmap)) {
0460 error = PTR_ERR(chip->regmap);
0461 dev_err(chip->dev, "Failed to allocate register map: %d\n",
0462 error);
0463 return error;
0464 }
0465
0466 i2c_set_clientdata(i2c, chip);
0467
0468 chip->pdata = i2c->dev.platform_data;
0469
0470 ret = regmap_read(chip->regmap, DA9211_REG_DEVICE_ID, &data);
0471 if (ret < 0) {
0472 dev_err(chip->dev, "Failed to read DEVICE_ID reg: %d\n", ret);
0473 return ret;
0474 }
0475
0476 switch (data) {
0477 case DA9211_DEVICE_ID:
0478 chip->chip_id = DA9211;
0479 break;
0480 case DA9213_DEVICE_ID:
0481 chip->chip_id = DA9213;
0482 break;
0483 case DA9215_DEVICE_ID:
0484 chip->chip_id = DA9215;
0485 break;
0486 default:
0487 dev_err(chip->dev, "Unsupported device id = 0x%x.\n", data);
0488 return -ENODEV;
0489 }
0490
0491 if (!chip->pdata)
0492 chip->pdata = da9211_parse_regulators_dt(chip->dev);
0493
0494 if (IS_ERR(chip->pdata)) {
0495 dev_err(chip->dev, "No regulators defined for the platform\n");
0496 return PTR_ERR(chip->pdata);
0497 }
0498
0499 chip->chip_irq = i2c->irq;
0500
0501 if (chip->chip_irq != 0) {
0502 ret = devm_request_threaded_irq(chip->dev, chip->chip_irq, NULL,
0503 da9211_irq_handler,
0504 IRQF_TRIGGER_LOW|IRQF_ONESHOT,
0505 "da9211", chip);
0506 if (ret != 0) {
0507 dev_err(chip->dev, "Failed to request IRQ: %d\n",
0508 chip->chip_irq);
0509 return ret;
0510 }
0511 } else {
0512 dev_warn(chip->dev, "No IRQ configured\n");
0513 }
0514
0515 ret = da9211_regulator_init(chip);
0516
0517 if (ret < 0)
0518 dev_err(chip->dev, "Failed to initialize regulator: %d\n", ret);
0519
0520 return ret;
0521 }
0522
0523 static const struct i2c_device_id da9211_i2c_id[] = {
0524 {"da9211", DA9211},
0525 {"da9212", DA9212},
0526 {"da9213", DA9213},
0527 {"da9223", DA9223},
0528 {"da9214", DA9214},
0529 {"da9224", DA9224},
0530 {"da9215", DA9215},
0531 {"da9225", DA9225},
0532 {},
0533 };
0534 MODULE_DEVICE_TABLE(i2c, da9211_i2c_id);
0535
0536 #ifdef CONFIG_OF
0537 static const struct of_device_id da9211_dt_ids[] = {
0538 { .compatible = "dlg,da9211", .data = &da9211_i2c_id[0] },
0539 { .compatible = "dlg,da9212", .data = &da9211_i2c_id[1] },
0540 { .compatible = "dlg,da9213", .data = &da9211_i2c_id[2] },
0541 { .compatible = "dlg,da9223", .data = &da9211_i2c_id[3] },
0542 { .compatible = "dlg,da9214", .data = &da9211_i2c_id[4] },
0543 { .compatible = "dlg,da9224", .data = &da9211_i2c_id[5] },
0544 { .compatible = "dlg,da9215", .data = &da9211_i2c_id[6] },
0545 { .compatible = "dlg,da9225", .data = &da9211_i2c_id[7] },
0546 {},
0547 };
0548 MODULE_DEVICE_TABLE(of, da9211_dt_ids);
0549 #endif
0550
0551 static struct i2c_driver da9211_regulator_driver = {
0552 .driver = {
0553 .name = "da9211",
0554 .of_match_table = of_match_ptr(da9211_dt_ids),
0555 },
0556 .probe_new = da9211_i2c_probe,
0557 .id_table = da9211_i2c_id,
0558 };
0559
0560 module_i2c_driver(da9211_regulator_driver);
0561
0562 MODULE_AUTHOR("James Ban <James.Ban.opensource@diasemi.com>");
0563 MODULE_DESCRIPTION("DA9211/DA9212/DA9213/DA9223/DA9214/DA9224/DA9215/DA9225 regulator driver");
0564 MODULE_LICENSE("GPL");