0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/bug.h>
0011 #include <linux/err.h>
0012 #include <linux/gpio.h>
0013 #include <linux/of_gpio.h>
0014 #include <linux/slab.h>
0015 #include <linux/module.h>
0016 #include <linux/platform_device.h>
0017 #include <linux/regulator/driver.h>
0018 #include <linux/regulator/machine.h>
0019 #include <linux/mfd/max8997.h>
0020 #include <linux/mfd/max8997-private.h>
0021 #include <linux/regulator/of_regulator.h>
0022
0023 struct max8997_data {
0024 struct device *dev;
0025 struct max8997_dev *iodev;
0026 int num_regulators;
0027 int ramp_delay;
0028
0029 bool buck1_gpiodvs;
0030 bool buck2_gpiodvs;
0031 bool buck5_gpiodvs;
0032 u8 buck1_vol[8];
0033 u8 buck2_vol[8];
0034 u8 buck5_vol[8];
0035 int buck125_gpios[3];
0036 int buck125_gpioindex;
0037 bool ignore_gpiodvs_side_effect;
0038
0039 u8 saved_states[MAX8997_REG_MAX];
0040 };
0041
0042 static const unsigned int safeoutvolt[] = {
0043 4850000,
0044 4900000,
0045 4950000,
0046 3300000,
0047 };
0048
0049 static inline void max8997_set_gpio(struct max8997_data *max8997)
0050 {
0051 int set3 = (max8997->buck125_gpioindex) & 0x1;
0052 int set2 = ((max8997->buck125_gpioindex) >> 1) & 0x1;
0053 int set1 = ((max8997->buck125_gpioindex) >> 2) & 0x1;
0054
0055 gpio_set_value(max8997->buck125_gpios[0], set1);
0056 gpio_set_value(max8997->buck125_gpios[1], set2);
0057 gpio_set_value(max8997->buck125_gpios[2], set3);
0058 }
0059
0060 struct voltage_map_desc {
0061 int min;
0062 int max;
0063 int step;
0064 };
0065
0066
0067 static const struct voltage_map_desc ldo_voltage_map_desc = {
0068 .min = 800000, .max = 3950000, .step = 50000,
0069 };
0070
0071 static const struct voltage_map_desc buck1245_voltage_map_desc = {
0072 .min = 650000, .max = 2225000, .step = 25000,
0073 };
0074
0075 static const struct voltage_map_desc buck37_voltage_map_desc = {
0076 .min = 750000, .max = 3900000, .step = 50000,
0077 };
0078
0079
0080 static const struct voltage_map_desc charger_current_map_desc = {
0081 .min = 200000, .max = 950000, .step = 50000,
0082 };
0083
0084 static const struct voltage_map_desc topoff_current_map_desc = {
0085 .min = 50000, .max = 200000, .step = 10000,
0086 };
0087
0088 static const struct voltage_map_desc *reg_voltage_map[] = {
0089 [MAX8997_LDO1] = &ldo_voltage_map_desc,
0090 [MAX8997_LDO2] = &ldo_voltage_map_desc,
0091 [MAX8997_LDO3] = &ldo_voltage_map_desc,
0092 [MAX8997_LDO4] = &ldo_voltage_map_desc,
0093 [MAX8997_LDO5] = &ldo_voltage_map_desc,
0094 [MAX8997_LDO6] = &ldo_voltage_map_desc,
0095 [MAX8997_LDO7] = &ldo_voltage_map_desc,
0096 [MAX8997_LDO8] = &ldo_voltage_map_desc,
0097 [MAX8997_LDO9] = &ldo_voltage_map_desc,
0098 [MAX8997_LDO10] = &ldo_voltage_map_desc,
0099 [MAX8997_LDO11] = &ldo_voltage_map_desc,
0100 [MAX8997_LDO12] = &ldo_voltage_map_desc,
0101 [MAX8997_LDO13] = &ldo_voltage_map_desc,
0102 [MAX8997_LDO14] = &ldo_voltage_map_desc,
0103 [MAX8997_LDO15] = &ldo_voltage_map_desc,
0104 [MAX8997_LDO16] = &ldo_voltage_map_desc,
0105 [MAX8997_LDO17] = &ldo_voltage_map_desc,
0106 [MAX8997_LDO18] = &ldo_voltage_map_desc,
0107 [MAX8997_LDO21] = &ldo_voltage_map_desc,
0108 [MAX8997_BUCK1] = &buck1245_voltage_map_desc,
0109 [MAX8997_BUCK2] = &buck1245_voltage_map_desc,
0110 [MAX8997_BUCK3] = &buck37_voltage_map_desc,
0111 [MAX8997_BUCK4] = &buck1245_voltage_map_desc,
0112 [MAX8997_BUCK5] = &buck1245_voltage_map_desc,
0113 [MAX8997_BUCK6] = NULL,
0114 [MAX8997_BUCK7] = &buck37_voltage_map_desc,
0115 [MAX8997_EN32KHZ_AP] = NULL,
0116 [MAX8997_EN32KHZ_CP] = NULL,
0117 [MAX8997_ENVICHG] = NULL,
0118 [MAX8997_ESAFEOUT1] = NULL,
0119 [MAX8997_ESAFEOUT2] = NULL,
0120 [MAX8997_CHARGER_CV] = NULL,
0121 [MAX8997_CHARGER] = &charger_current_map_desc,
0122 [MAX8997_CHARGER_TOPOFF] = &topoff_current_map_desc,
0123 };
0124
0125 static int max8997_list_voltage_charger_cv(struct regulator_dev *rdev,
0126 unsigned int selector)
0127 {
0128 int rid = rdev_get_id(rdev);
0129
0130 if (rid != MAX8997_CHARGER_CV)
0131 goto err;
0132
0133 switch (selector) {
0134 case 0x00:
0135 return 4200000;
0136 case 0x01 ... 0x0E:
0137 return 4000000 + 20000 * (selector - 0x01);
0138 case 0x0F:
0139 return 4350000;
0140 default:
0141 return -EINVAL;
0142 }
0143 err:
0144 return -EINVAL;
0145 }
0146
0147 static int max8997_list_voltage(struct regulator_dev *rdev,
0148 unsigned int selector)
0149 {
0150 const struct voltage_map_desc *desc;
0151 int rid = rdev_get_id(rdev);
0152 int val;
0153
0154 if (rid < 0 || rid >= ARRAY_SIZE(reg_voltage_map))
0155 return -EINVAL;
0156
0157 desc = reg_voltage_map[rid];
0158 if (desc == NULL)
0159 return -EINVAL;
0160
0161 val = desc->min + desc->step * selector;
0162 if (val > desc->max)
0163 return -EINVAL;
0164
0165 return val;
0166 }
0167
0168 static int max8997_get_enable_register(struct regulator_dev *rdev,
0169 int *reg, int *mask, int *pattern)
0170 {
0171 int rid = rdev_get_id(rdev);
0172
0173 switch (rid) {
0174 case MAX8997_LDO1 ... MAX8997_LDO21:
0175 *reg = MAX8997_REG_LDO1CTRL + (rid - MAX8997_LDO1);
0176 *mask = 0xC0;
0177 *pattern = 0xC0;
0178 break;
0179 case MAX8997_BUCK1:
0180 *reg = MAX8997_REG_BUCK1CTRL;
0181 *mask = 0x01;
0182 *pattern = 0x01;
0183 break;
0184 case MAX8997_BUCK2:
0185 *reg = MAX8997_REG_BUCK2CTRL;
0186 *mask = 0x01;
0187 *pattern = 0x01;
0188 break;
0189 case MAX8997_BUCK3:
0190 *reg = MAX8997_REG_BUCK3CTRL;
0191 *mask = 0x01;
0192 *pattern = 0x01;
0193 break;
0194 case MAX8997_BUCK4:
0195 *reg = MAX8997_REG_BUCK4CTRL;
0196 *mask = 0x01;
0197 *pattern = 0x01;
0198 break;
0199 case MAX8997_BUCK5:
0200 *reg = MAX8997_REG_BUCK5CTRL;
0201 *mask = 0x01;
0202 *pattern = 0x01;
0203 break;
0204 case MAX8997_BUCK6:
0205 *reg = MAX8997_REG_BUCK6CTRL;
0206 *mask = 0x01;
0207 *pattern = 0x01;
0208 break;
0209 case MAX8997_BUCK7:
0210 *reg = MAX8997_REG_BUCK7CTRL;
0211 *mask = 0x01;
0212 *pattern = 0x01;
0213 break;
0214 case MAX8997_EN32KHZ_AP ... MAX8997_EN32KHZ_CP:
0215 *reg = MAX8997_REG_MAINCON1;
0216 *mask = 0x01 << (rid - MAX8997_EN32KHZ_AP);
0217 *pattern = 0x01 << (rid - MAX8997_EN32KHZ_AP);
0218 break;
0219 case MAX8997_ENVICHG:
0220 *reg = MAX8997_REG_MBCCTRL1;
0221 *mask = 0x80;
0222 *pattern = 0x80;
0223 break;
0224 case MAX8997_ESAFEOUT1 ... MAX8997_ESAFEOUT2:
0225 *reg = MAX8997_REG_SAFEOUTCTRL;
0226 *mask = 0x40 << (rid - MAX8997_ESAFEOUT1);
0227 *pattern = 0x40 << (rid - MAX8997_ESAFEOUT1);
0228 break;
0229 case MAX8997_CHARGER:
0230 *reg = MAX8997_REG_MBCCTRL2;
0231 *mask = 0x40;
0232 *pattern = 0x40;
0233 break;
0234 default:
0235
0236 return -EINVAL;
0237 }
0238
0239 return 0;
0240 }
0241
0242 static int max8997_reg_is_enabled(struct regulator_dev *rdev)
0243 {
0244 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0245 struct i2c_client *i2c = max8997->iodev->i2c;
0246 int ret, reg, mask, pattern;
0247 u8 val;
0248
0249 ret = max8997_get_enable_register(rdev, ®, &mask, &pattern);
0250 if (ret)
0251 return ret;
0252
0253 ret = max8997_read_reg(i2c, reg, &val);
0254 if (ret)
0255 return ret;
0256
0257 return (val & mask) == pattern;
0258 }
0259
0260 static int max8997_reg_enable(struct regulator_dev *rdev)
0261 {
0262 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0263 struct i2c_client *i2c = max8997->iodev->i2c;
0264 int ret, reg, mask, pattern;
0265
0266 ret = max8997_get_enable_register(rdev, ®, &mask, &pattern);
0267 if (ret)
0268 return ret;
0269
0270 return max8997_update_reg(i2c, reg, pattern, mask);
0271 }
0272
0273 static int max8997_reg_disable(struct regulator_dev *rdev)
0274 {
0275 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0276 struct i2c_client *i2c = max8997->iodev->i2c;
0277 int ret, reg, mask, pattern;
0278
0279 ret = max8997_get_enable_register(rdev, ®, &mask, &pattern);
0280 if (ret)
0281 return ret;
0282
0283 return max8997_update_reg(i2c, reg, ~pattern, mask);
0284 }
0285
0286 static int max8997_get_voltage_register(struct regulator_dev *rdev,
0287 int *_reg, int *_shift, int *_mask)
0288 {
0289 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0290 int rid = rdev_get_id(rdev);
0291 int reg, shift = 0, mask = 0x3f;
0292
0293 switch (rid) {
0294 case MAX8997_LDO1 ... MAX8997_LDO21:
0295 reg = MAX8997_REG_LDO1CTRL + (rid - MAX8997_LDO1);
0296 break;
0297 case MAX8997_BUCK1:
0298 reg = MAX8997_REG_BUCK1DVS1;
0299 if (max8997->buck1_gpiodvs)
0300 reg += max8997->buck125_gpioindex;
0301 break;
0302 case MAX8997_BUCK2:
0303 reg = MAX8997_REG_BUCK2DVS1;
0304 if (max8997->buck2_gpiodvs)
0305 reg += max8997->buck125_gpioindex;
0306 break;
0307 case MAX8997_BUCK3:
0308 reg = MAX8997_REG_BUCK3DVS;
0309 break;
0310 case MAX8997_BUCK4:
0311 reg = MAX8997_REG_BUCK4DVS;
0312 break;
0313 case MAX8997_BUCK5:
0314 reg = MAX8997_REG_BUCK5DVS1;
0315 if (max8997->buck5_gpiodvs)
0316 reg += max8997->buck125_gpioindex;
0317 break;
0318 case MAX8997_BUCK7:
0319 reg = MAX8997_REG_BUCK7DVS;
0320 break;
0321 case MAX8997_ESAFEOUT1 ... MAX8997_ESAFEOUT2:
0322 reg = MAX8997_REG_SAFEOUTCTRL;
0323 shift = (rid == MAX8997_ESAFEOUT2) ? 2 : 0;
0324 mask = 0x3;
0325 break;
0326 case MAX8997_CHARGER_CV:
0327 reg = MAX8997_REG_MBCCTRL3;
0328 shift = 0;
0329 mask = 0xf;
0330 break;
0331 case MAX8997_CHARGER:
0332 reg = MAX8997_REG_MBCCTRL4;
0333 shift = 0;
0334 mask = 0xf;
0335 break;
0336 case MAX8997_CHARGER_TOPOFF:
0337 reg = MAX8997_REG_MBCCTRL5;
0338 shift = 0;
0339 mask = 0xf;
0340 break;
0341 default:
0342 return -EINVAL;
0343 }
0344
0345 *_reg = reg;
0346 *_shift = shift;
0347 *_mask = mask;
0348
0349 return 0;
0350 }
0351
0352 static int max8997_get_voltage_sel(struct regulator_dev *rdev)
0353 {
0354 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0355 struct i2c_client *i2c = max8997->iodev->i2c;
0356 int reg, shift, mask, ret;
0357 u8 val;
0358
0359 ret = max8997_get_voltage_register(rdev, ®, &shift, &mask);
0360 if (ret)
0361 return ret;
0362
0363 ret = max8997_read_reg(i2c, reg, &val);
0364 if (ret)
0365 return ret;
0366
0367 val >>= shift;
0368 val &= mask;
0369
0370 return val;
0371 }
0372
0373 static inline int max8997_get_voltage_proper_val(
0374 const struct voltage_map_desc *desc,
0375 int min_vol, int max_vol)
0376 {
0377 int i;
0378
0379 if (desc == NULL)
0380 return -EINVAL;
0381
0382 if (max_vol < desc->min || min_vol > desc->max)
0383 return -EINVAL;
0384
0385 if (min_vol < desc->min)
0386 min_vol = desc->min;
0387
0388 i = DIV_ROUND_UP(min_vol - desc->min, desc->step);
0389
0390 if (desc->min + desc->step * i > max_vol)
0391 return -EINVAL;
0392
0393 return i;
0394 }
0395
0396 static int max8997_set_voltage_charger_cv(struct regulator_dev *rdev,
0397 int min_uV, int max_uV, unsigned *selector)
0398 {
0399 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0400 struct i2c_client *i2c = max8997->iodev->i2c;
0401 int rid = rdev_get_id(rdev);
0402 int lb, ub;
0403 int reg, shift = 0, mask, ret = 0;
0404 u8 val = 0x0;
0405
0406 if (rid != MAX8997_CHARGER_CV)
0407 return -EINVAL;
0408
0409 ret = max8997_get_voltage_register(rdev, ®, &shift, &mask);
0410 if (ret)
0411 return ret;
0412
0413 if (max_uV < 4000000 || min_uV > 4350000)
0414 return -EINVAL;
0415
0416 if (min_uV <= 4000000)
0417 val = 0x1;
0418 else if (min_uV <= 4200000 && max_uV >= 4200000)
0419 val = 0x0;
0420 else {
0421 lb = (min_uV - 4000001) / 20000 + 2;
0422 ub = (max_uV - 4000000) / 20000 + 1;
0423
0424 if (lb > ub)
0425 return -EINVAL;
0426
0427 if (lb < 0xf)
0428 val = lb;
0429 else {
0430 if (ub >= 0xf)
0431 val = 0xf;
0432 else
0433 return -EINVAL;
0434 }
0435 }
0436
0437 *selector = val;
0438
0439 ret = max8997_update_reg(i2c, reg, val << shift, mask);
0440
0441 return ret;
0442 }
0443
0444
0445
0446
0447
0448 static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev,
0449 int min_uV, int max_uV, unsigned *selector)
0450 {
0451 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0452 struct i2c_client *i2c = max8997->iodev->i2c;
0453 const struct voltage_map_desc *desc;
0454 int rid = rdev_get_id(rdev);
0455 int i, reg, shift, mask, ret;
0456
0457 switch (rid) {
0458 case MAX8997_LDO1 ... MAX8997_LDO21:
0459 break;
0460 case MAX8997_BUCK1 ... MAX8997_BUCK5:
0461 break;
0462 case MAX8997_BUCK6:
0463 return -EINVAL;
0464 case MAX8997_BUCK7:
0465 break;
0466 case MAX8997_CHARGER:
0467 break;
0468 case MAX8997_CHARGER_TOPOFF:
0469 break;
0470 default:
0471 return -EINVAL;
0472 }
0473
0474 desc = reg_voltage_map[rid];
0475
0476 i = max8997_get_voltage_proper_val(desc, min_uV, max_uV);
0477 if (i < 0)
0478 return i;
0479
0480 ret = max8997_get_voltage_register(rdev, ®, &shift, &mask);
0481 if (ret)
0482 return ret;
0483
0484 ret = max8997_update_reg(i2c, reg, i << shift, mask << shift);
0485 *selector = i;
0486
0487 return ret;
0488 }
0489
0490 static int max8997_set_voltage_buck_time_sel(struct regulator_dev *rdev,
0491 unsigned int old_selector,
0492 unsigned int new_selector)
0493 {
0494 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0495 int rid = rdev_get_id(rdev);
0496 const struct voltage_map_desc *desc = reg_voltage_map[rid];
0497
0498
0499 if (old_selector >= new_selector)
0500 return 0;
0501
0502
0503 switch (rid) {
0504 case MAX8997_BUCK1:
0505 if (max8997->buck1_gpiodvs)
0506 return 0;
0507 break;
0508 case MAX8997_BUCK2:
0509 if (max8997->buck2_gpiodvs)
0510 return 0;
0511 break;
0512 case MAX8997_BUCK5:
0513 if (max8997->buck5_gpiodvs)
0514 return 0;
0515 break;
0516 }
0517
0518 switch (rid) {
0519 case MAX8997_BUCK1:
0520 case MAX8997_BUCK2:
0521 case MAX8997_BUCK4:
0522 case MAX8997_BUCK5:
0523 return DIV_ROUND_UP(desc->step * (new_selector - old_selector),
0524 max8997->ramp_delay * 1000);
0525 }
0526
0527 return 0;
0528 }
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538 static int max8997_assess_side_effect(struct regulator_dev *rdev,
0539 u8 new_val, int *best)
0540 {
0541 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0542 int rid = rdev_get_id(rdev);
0543 u8 *buckx_val[3];
0544 bool buckx_gpiodvs[3];
0545 int side_effect[8];
0546 int min_side_effect = INT_MAX;
0547 int i;
0548
0549 *best = -1;
0550
0551 switch (rid) {
0552 case MAX8997_BUCK1:
0553 rid = 0;
0554 break;
0555 case MAX8997_BUCK2:
0556 rid = 1;
0557 break;
0558 case MAX8997_BUCK5:
0559 rid = 2;
0560 break;
0561 default:
0562 return -EINVAL;
0563 }
0564
0565 buckx_val[0] = max8997->buck1_vol;
0566 buckx_val[1] = max8997->buck2_vol;
0567 buckx_val[2] = max8997->buck5_vol;
0568 buckx_gpiodvs[0] = max8997->buck1_gpiodvs;
0569 buckx_gpiodvs[1] = max8997->buck2_gpiodvs;
0570 buckx_gpiodvs[2] = max8997->buck5_gpiodvs;
0571
0572 for (i = 0; i < 8; i++) {
0573 int others;
0574
0575 if (new_val != (buckx_val[rid])[i]) {
0576 side_effect[i] = -1;
0577 continue;
0578 }
0579
0580 side_effect[i] = 0;
0581 for (others = 0; others < 3; others++) {
0582 int diff;
0583
0584 if (others == rid)
0585 continue;
0586 if (buckx_gpiodvs[others] == false)
0587 continue;
0588 diff = (buckx_val[others])[i] -
0589 (buckx_val[others])[max8997->buck125_gpioindex];
0590 if (diff > 0)
0591 side_effect[i] += diff;
0592 else if (diff < 0)
0593 side_effect[i] -= diff;
0594 }
0595 if (side_effect[i] == 0) {
0596 *best = i;
0597 return 0;
0598 }
0599 if (side_effect[i] < min_side_effect) {
0600 min_side_effect = side_effect[i];
0601 *best = i;
0602 }
0603 }
0604
0605 if (*best == -1)
0606 return -EINVAL;
0607
0608 return side_effect[*best];
0609 }
0610
0611
0612
0613
0614
0615 static int max8997_set_voltage_buck(struct regulator_dev *rdev,
0616 int min_uV, int max_uV, unsigned *selector)
0617 {
0618 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0619 int rid = rdev_get_id(rdev);
0620 const struct voltage_map_desc *desc;
0621 int new_val, new_idx, damage, tmp_val, tmp_idx, tmp_dmg;
0622 bool gpio_dvs_mode = false;
0623
0624 if (rid < MAX8997_BUCK1 || rid > MAX8997_BUCK7)
0625 return -EINVAL;
0626
0627 switch (rid) {
0628 case MAX8997_BUCK1:
0629 if (max8997->buck1_gpiodvs)
0630 gpio_dvs_mode = true;
0631 break;
0632 case MAX8997_BUCK2:
0633 if (max8997->buck2_gpiodvs)
0634 gpio_dvs_mode = true;
0635 break;
0636 case MAX8997_BUCK5:
0637 if (max8997->buck5_gpiodvs)
0638 gpio_dvs_mode = true;
0639 break;
0640 }
0641
0642 if (!gpio_dvs_mode)
0643 return max8997_set_voltage_ldobuck(rdev, min_uV, max_uV,
0644 selector);
0645
0646 desc = reg_voltage_map[rid];
0647 new_val = max8997_get_voltage_proper_val(desc, min_uV, max_uV);
0648 if (new_val < 0)
0649 return new_val;
0650
0651 tmp_dmg = INT_MAX;
0652 tmp_idx = -1;
0653 tmp_val = -1;
0654 do {
0655 damage = max8997_assess_side_effect(rdev, new_val, &new_idx);
0656 if (damage == 0)
0657 goto out;
0658
0659 if (tmp_dmg > damage) {
0660 tmp_idx = new_idx;
0661 tmp_val = new_val;
0662 tmp_dmg = damage;
0663 }
0664
0665 new_val++;
0666 } while (desc->min + desc->step * new_val <= desc->max);
0667
0668 new_idx = tmp_idx;
0669 new_val = tmp_val;
0670
0671 if (max8997->ignore_gpiodvs_side_effect == false)
0672 return -EINVAL;
0673
0674 dev_warn(&rdev->dev,
0675 "MAX8997 GPIO-DVS Side Effect Warning: GPIO SET: %d -> %d\n",
0676 max8997->buck125_gpioindex, tmp_idx);
0677
0678 out:
0679 if (new_idx < 0 || new_val < 0)
0680 return -EINVAL;
0681
0682 max8997->buck125_gpioindex = new_idx;
0683 max8997_set_gpio(max8997);
0684 *selector = new_val;
0685
0686 return 0;
0687 }
0688
0689
0690 static int max8997_set_voltage_safeout_sel(struct regulator_dev *rdev,
0691 unsigned selector)
0692 {
0693 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0694 struct i2c_client *i2c = max8997->iodev->i2c;
0695 int rid = rdev_get_id(rdev);
0696 int reg, shift = 0, mask, ret;
0697
0698 if (rid != MAX8997_ESAFEOUT1 && rid != MAX8997_ESAFEOUT2)
0699 return -EINVAL;
0700
0701 ret = max8997_get_voltage_register(rdev, ®, &shift, &mask);
0702 if (ret)
0703 return ret;
0704
0705 return max8997_update_reg(i2c, reg, selector << shift, mask << shift);
0706 }
0707
0708 static int max8997_reg_disable_suspend(struct regulator_dev *rdev)
0709 {
0710 struct max8997_data *max8997 = rdev_get_drvdata(rdev);
0711 struct i2c_client *i2c = max8997->iodev->i2c;
0712 int ret, reg, mask, pattern;
0713 int rid = rdev_get_id(rdev);
0714
0715 ret = max8997_get_enable_register(rdev, ®, &mask, &pattern);
0716 if (ret)
0717 return ret;
0718
0719 max8997_read_reg(i2c, reg, &max8997->saved_states[rid]);
0720
0721 if (rid == MAX8997_LDO1 ||
0722 rid == MAX8997_LDO10 ||
0723 rid == MAX8997_LDO21) {
0724 dev_dbg(&rdev->dev, "Conditional Power-Off for %s\n",
0725 rdev->desc->name);
0726 return max8997_update_reg(i2c, reg, 0x40, mask);
0727 }
0728
0729 dev_dbg(&rdev->dev, "Full Power-Off for %s (%xh -> %xh)\n",
0730 rdev->desc->name, max8997->saved_states[rid] & mask,
0731 (~pattern) & mask);
0732 return max8997_update_reg(i2c, reg, ~pattern, mask);
0733 }
0734
0735 static const struct regulator_ops max8997_ldo_ops = {
0736 .list_voltage = max8997_list_voltage,
0737 .is_enabled = max8997_reg_is_enabled,
0738 .enable = max8997_reg_enable,
0739 .disable = max8997_reg_disable,
0740 .get_voltage_sel = max8997_get_voltage_sel,
0741 .set_voltage = max8997_set_voltage_ldobuck,
0742 .set_suspend_disable = max8997_reg_disable_suspend,
0743 };
0744
0745 static const struct regulator_ops max8997_buck_ops = {
0746 .list_voltage = max8997_list_voltage,
0747 .is_enabled = max8997_reg_is_enabled,
0748 .enable = max8997_reg_enable,
0749 .disable = max8997_reg_disable,
0750 .get_voltage_sel = max8997_get_voltage_sel,
0751 .set_voltage = max8997_set_voltage_buck,
0752 .set_voltage_time_sel = max8997_set_voltage_buck_time_sel,
0753 .set_suspend_disable = max8997_reg_disable_suspend,
0754 };
0755
0756 static const struct regulator_ops max8997_fixedvolt_ops = {
0757 .list_voltage = max8997_list_voltage,
0758 .is_enabled = max8997_reg_is_enabled,
0759 .enable = max8997_reg_enable,
0760 .disable = max8997_reg_disable,
0761 .set_suspend_disable = max8997_reg_disable_suspend,
0762 };
0763
0764 static const struct regulator_ops max8997_safeout_ops = {
0765 .list_voltage = regulator_list_voltage_table,
0766 .is_enabled = max8997_reg_is_enabled,
0767 .enable = max8997_reg_enable,
0768 .disable = max8997_reg_disable,
0769 .get_voltage_sel = max8997_get_voltage_sel,
0770 .set_voltage_sel = max8997_set_voltage_safeout_sel,
0771 .set_suspend_disable = max8997_reg_disable_suspend,
0772 };
0773
0774 static const struct regulator_ops max8997_fixedstate_ops = {
0775 .list_voltage = max8997_list_voltage_charger_cv,
0776 .get_voltage_sel = max8997_get_voltage_sel,
0777 .set_voltage = max8997_set_voltage_charger_cv,
0778 };
0779
0780 static int max8997_set_current_limit(struct regulator_dev *rdev,
0781 int min_uA, int max_uA)
0782 {
0783 unsigned dummy;
0784 int rid = rdev_get_id(rdev);
0785
0786 if (rid != MAX8997_CHARGER && rid != MAX8997_CHARGER_TOPOFF)
0787 return -EINVAL;
0788
0789
0790 return max8997_set_voltage_ldobuck(rdev, min_uA, max_uA, &dummy);
0791 }
0792
0793 static int max8997_get_current_limit(struct regulator_dev *rdev)
0794 {
0795 int sel, rid = rdev_get_id(rdev);
0796
0797 if (rid != MAX8997_CHARGER && rid != MAX8997_CHARGER_TOPOFF)
0798 return -EINVAL;
0799
0800 sel = max8997_get_voltage_sel(rdev);
0801 if (sel < 0)
0802 return sel;
0803
0804
0805 return max8997_list_voltage(rdev, sel);
0806 }
0807
0808 static const struct regulator_ops max8997_charger_ops = {
0809 .is_enabled = max8997_reg_is_enabled,
0810 .enable = max8997_reg_enable,
0811 .disable = max8997_reg_disable,
0812 .get_current_limit = max8997_get_current_limit,
0813 .set_current_limit = max8997_set_current_limit,
0814 };
0815
0816 static const struct regulator_ops max8997_charger_fixedstate_ops = {
0817 .get_current_limit = max8997_get_current_limit,
0818 .set_current_limit = max8997_set_current_limit,
0819 };
0820
0821 #define MAX8997_VOLTAGE_REGULATOR(_name, _ops) {\
0822 .name = #_name, \
0823 .id = MAX8997_##_name, \
0824 .ops = &_ops, \
0825 .type = REGULATOR_VOLTAGE, \
0826 .owner = THIS_MODULE, \
0827 }
0828
0829 #define MAX8997_CURRENT_REGULATOR(_name, _ops) {\
0830 .name = #_name, \
0831 .id = MAX8997_##_name, \
0832 .ops = &_ops, \
0833 .type = REGULATOR_CURRENT, \
0834 .owner = THIS_MODULE, \
0835 }
0836
0837 static struct regulator_desc regulators[] = {
0838 MAX8997_VOLTAGE_REGULATOR(LDO1, max8997_ldo_ops),
0839 MAX8997_VOLTAGE_REGULATOR(LDO2, max8997_ldo_ops),
0840 MAX8997_VOLTAGE_REGULATOR(LDO3, max8997_ldo_ops),
0841 MAX8997_VOLTAGE_REGULATOR(LDO4, max8997_ldo_ops),
0842 MAX8997_VOLTAGE_REGULATOR(LDO5, max8997_ldo_ops),
0843 MAX8997_VOLTAGE_REGULATOR(LDO6, max8997_ldo_ops),
0844 MAX8997_VOLTAGE_REGULATOR(LDO7, max8997_ldo_ops),
0845 MAX8997_VOLTAGE_REGULATOR(LDO8, max8997_ldo_ops),
0846 MAX8997_VOLTAGE_REGULATOR(LDO9, max8997_ldo_ops),
0847 MAX8997_VOLTAGE_REGULATOR(LDO10, max8997_ldo_ops),
0848 MAX8997_VOLTAGE_REGULATOR(LDO11, max8997_ldo_ops),
0849 MAX8997_VOLTAGE_REGULATOR(LDO12, max8997_ldo_ops),
0850 MAX8997_VOLTAGE_REGULATOR(LDO13, max8997_ldo_ops),
0851 MAX8997_VOLTAGE_REGULATOR(LDO14, max8997_ldo_ops),
0852 MAX8997_VOLTAGE_REGULATOR(LDO15, max8997_ldo_ops),
0853 MAX8997_VOLTAGE_REGULATOR(LDO16, max8997_ldo_ops),
0854 MAX8997_VOLTAGE_REGULATOR(LDO17, max8997_ldo_ops),
0855 MAX8997_VOLTAGE_REGULATOR(LDO18, max8997_ldo_ops),
0856 MAX8997_VOLTAGE_REGULATOR(LDO21, max8997_ldo_ops),
0857 MAX8997_VOLTAGE_REGULATOR(BUCK1, max8997_buck_ops),
0858 MAX8997_VOLTAGE_REGULATOR(BUCK2, max8997_buck_ops),
0859 MAX8997_VOLTAGE_REGULATOR(BUCK3, max8997_buck_ops),
0860 MAX8997_VOLTAGE_REGULATOR(BUCK4, max8997_buck_ops),
0861 MAX8997_VOLTAGE_REGULATOR(BUCK5, max8997_buck_ops),
0862 MAX8997_VOLTAGE_REGULATOR(BUCK6, max8997_fixedvolt_ops),
0863 MAX8997_VOLTAGE_REGULATOR(BUCK7, max8997_buck_ops),
0864 MAX8997_VOLTAGE_REGULATOR(EN32KHZ_AP, max8997_fixedvolt_ops),
0865 MAX8997_VOLTAGE_REGULATOR(EN32KHZ_CP, max8997_fixedvolt_ops),
0866 MAX8997_VOLTAGE_REGULATOR(ENVICHG, max8997_fixedvolt_ops),
0867 MAX8997_VOLTAGE_REGULATOR(ESAFEOUT1, max8997_safeout_ops),
0868 MAX8997_VOLTAGE_REGULATOR(ESAFEOUT2, max8997_safeout_ops),
0869 MAX8997_VOLTAGE_REGULATOR(CHARGER_CV, max8997_fixedstate_ops),
0870 MAX8997_CURRENT_REGULATOR(CHARGER, max8997_charger_ops),
0871 MAX8997_CURRENT_REGULATOR(CHARGER_TOPOFF,
0872 max8997_charger_fixedstate_ops),
0873 };
0874
0875 #ifdef CONFIG_OF
0876 static int max8997_pmic_dt_parse_dvs_gpio(struct platform_device *pdev,
0877 struct max8997_platform_data *pdata,
0878 struct device_node *pmic_np)
0879 {
0880 int i, gpio;
0881
0882 for (i = 0; i < 3; i++) {
0883 gpio = of_get_named_gpio(pmic_np,
0884 "max8997,pmic-buck125-dvs-gpios", i);
0885 if (!gpio_is_valid(gpio)) {
0886 dev_err(&pdev->dev, "invalid gpio[%d]: %d\n", i, gpio);
0887 return -EINVAL;
0888 }
0889 pdata->buck125_gpios[i] = gpio;
0890 }
0891 return 0;
0892 }
0893
0894 static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
0895 struct max8997_platform_data *pdata)
0896 {
0897 struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
0898 struct device_node *pmic_np, *regulators_np, *reg_np;
0899 struct max8997_regulator_data *rdata;
0900 unsigned int i, dvs_voltage_nr = 1, ret;
0901
0902 pmic_np = iodev->dev->of_node;
0903 if (!pmic_np) {
0904 dev_err(&pdev->dev, "could not find pmic sub-node\n");
0905 return -ENODEV;
0906 }
0907
0908 regulators_np = of_get_child_by_name(pmic_np, "regulators");
0909 if (!regulators_np) {
0910 dev_err(&pdev->dev, "could not find regulators sub-node\n");
0911 return -EINVAL;
0912 }
0913
0914
0915 pdata->num_regulators = of_get_child_count(regulators_np);
0916
0917 rdata = devm_kcalloc(&pdev->dev,
0918 pdata->num_regulators, sizeof(*rdata),
0919 GFP_KERNEL);
0920 if (!rdata) {
0921 of_node_put(regulators_np);
0922 return -ENOMEM;
0923 }
0924
0925 pdata->regulators = rdata;
0926 for_each_child_of_node(regulators_np, reg_np) {
0927 for (i = 0; i < ARRAY_SIZE(regulators); i++)
0928 if (of_node_name_eq(reg_np, regulators[i].name))
0929 break;
0930
0931 if (i == ARRAY_SIZE(regulators)) {
0932 dev_warn(&pdev->dev, "don't know how to configure regulator %pOFn\n",
0933 reg_np);
0934 continue;
0935 }
0936
0937 rdata->id = i;
0938 rdata->initdata = of_get_regulator_init_data(&pdev->dev,
0939 reg_np,
0940 ®ulators[i]);
0941 rdata->reg_node = reg_np;
0942 rdata++;
0943 }
0944 of_node_put(regulators_np);
0945
0946 if (of_get_property(pmic_np, "max8997,pmic-buck1-uses-gpio-dvs", NULL))
0947 pdata->buck1_gpiodvs = true;
0948
0949 if (of_get_property(pmic_np, "max8997,pmic-buck2-uses-gpio-dvs", NULL))
0950 pdata->buck2_gpiodvs = true;
0951
0952 if (of_get_property(pmic_np, "max8997,pmic-buck5-uses-gpio-dvs", NULL))
0953 pdata->buck5_gpiodvs = true;
0954
0955 if (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs ||
0956 pdata->buck5_gpiodvs) {
0957 ret = max8997_pmic_dt_parse_dvs_gpio(pdev, pdata, pmic_np);
0958 if (ret)
0959 return -EINVAL;
0960
0961 if (of_property_read_u32(pmic_np,
0962 "max8997,pmic-buck125-default-dvs-idx",
0963 &pdata->buck125_default_idx)) {
0964 pdata->buck125_default_idx = 0;
0965 } else {
0966 if (pdata->buck125_default_idx >= 8) {
0967 pdata->buck125_default_idx = 0;
0968 dev_info(&pdev->dev, "invalid value for default dvs index, using 0 instead\n");
0969 }
0970 }
0971
0972 if (of_get_property(pmic_np,
0973 "max8997,pmic-ignore-gpiodvs-side-effect", NULL))
0974 pdata->ignore_gpiodvs_side_effect = true;
0975
0976 dvs_voltage_nr = 8;
0977 }
0978
0979 if (of_property_read_u32_array(pmic_np,
0980 "max8997,pmic-buck1-dvs-voltage",
0981 pdata->buck1_voltage, dvs_voltage_nr)) {
0982 dev_err(&pdev->dev, "buck1 voltages not specified\n");
0983 return -EINVAL;
0984 }
0985
0986 if (of_property_read_u32_array(pmic_np,
0987 "max8997,pmic-buck2-dvs-voltage",
0988 pdata->buck2_voltage, dvs_voltage_nr)) {
0989 dev_err(&pdev->dev, "buck2 voltages not specified\n");
0990 return -EINVAL;
0991 }
0992
0993 if (of_property_read_u32_array(pmic_np,
0994 "max8997,pmic-buck5-dvs-voltage",
0995 pdata->buck5_voltage, dvs_voltage_nr)) {
0996 dev_err(&pdev->dev, "buck5 voltages not specified\n");
0997 return -EINVAL;
0998 }
0999
1000 return 0;
1001 }
1002 #else
1003 static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev,
1004 struct max8997_platform_data *pdata)
1005 {
1006 return 0;
1007 }
1008 #endif
1009
1010 static int max8997_pmic_probe(struct platform_device *pdev)
1011 {
1012 struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
1013 struct max8997_platform_data *pdata = iodev->pdata;
1014 struct regulator_config config = { };
1015 struct regulator_dev *rdev;
1016 struct max8997_data *max8997;
1017 struct i2c_client *i2c;
1018 int i, ret, nr_dvs;
1019 u8 max_buck1 = 0, max_buck2 = 0, max_buck5 = 0;
1020
1021 if (!pdata) {
1022 dev_err(&pdev->dev, "No platform init data supplied.\n");
1023 return -ENODEV;
1024 }
1025
1026 if (iodev->dev->of_node) {
1027 ret = max8997_pmic_dt_parse_pdata(pdev, pdata);
1028 if (ret)
1029 return ret;
1030 }
1031
1032 max8997 = devm_kzalloc(&pdev->dev, sizeof(struct max8997_data),
1033 GFP_KERNEL);
1034 if (!max8997)
1035 return -ENOMEM;
1036
1037 max8997->dev = &pdev->dev;
1038 max8997->iodev = iodev;
1039 max8997->num_regulators = pdata->num_regulators;
1040 platform_set_drvdata(pdev, max8997);
1041 i2c = max8997->iodev->i2c;
1042
1043 max8997->buck125_gpioindex = pdata->buck125_default_idx;
1044 max8997->buck1_gpiodvs = pdata->buck1_gpiodvs;
1045 max8997->buck2_gpiodvs = pdata->buck2_gpiodvs;
1046 max8997->buck5_gpiodvs = pdata->buck5_gpiodvs;
1047 memcpy(max8997->buck125_gpios, pdata->buck125_gpios, sizeof(int) * 3);
1048 max8997->ignore_gpiodvs_side_effect = pdata->ignore_gpiodvs_side_effect;
1049
1050 nr_dvs = (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs ||
1051 pdata->buck5_gpiodvs) ? 8 : 1;
1052
1053 for (i = 0; i < nr_dvs; i++) {
1054 max8997->buck1_vol[i] = ret =
1055 max8997_get_voltage_proper_val(
1056 &buck1245_voltage_map_desc,
1057 pdata->buck1_voltage[i],
1058 pdata->buck1_voltage[i] +
1059 buck1245_voltage_map_desc.step);
1060 if (ret < 0)
1061 return ret;
1062
1063 max8997->buck2_vol[i] = ret =
1064 max8997_get_voltage_proper_val(
1065 &buck1245_voltage_map_desc,
1066 pdata->buck2_voltage[i],
1067 pdata->buck2_voltage[i] +
1068 buck1245_voltage_map_desc.step);
1069 if (ret < 0)
1070 return ret;
1071
1072 max8997->buck5_vol[i] = ret =
1073 max8997_get_voltage_proper_val(
1074 &buck1245_voltage_map_desc,
1075 pdata->buck5_voltage[i],
1076 pdata->buck5_voltage[i] +
1077 buck1245_voltage_map_desc.step);
1078 if (ret < 0)
1079 return ret;
1080
1081 if (max_buck1 < max8997->buck1_vol[i])
1082 max_buck1 = max8997->buck1_vol[i];
1083 if (max_buck2 < max8997->buck2_vol[i])
1084 max_buck2 = max8997->buck2_vol[i];
1085 if (max_buck5 < max8997->buck5_vol[i])
1086 max_buck5 = max8997->buck5_vol[i];
1087 }
1088
1089
1090 for (i = 0; i < 8; i++) {
1091 max8997_update_reg(i2c, MAX8997_REG_BUCK1DVS1 + i,
1092 max_buck1, 0x3f);
1093 max8997_update_reg(i2c, MAX8997_REG_BUCK2DVS1 + i,
1094 max_buck2, 0x3f);
1095 max8997_update_reg(i2c, MAX8997_REG_BUCK5DVS1 + i,
1096 max_buck5, 0x3f);
1097 }
1098
1099
1100 for (i = 0; i < nr_dvs; i++) {
1101 max8997_update_reg(i2c, MAX8997_REG_BUCK1DVS1 + i,
1102 max8997->buck1_vol[i],
1103 0x3f);
1104 max8997_update_reg(i2c, MAX8997_REG_BUCK2DVS1 + i,
1105 max8997->buck2_vol[i],
1106 0x3f);
1107 max8997_update_reg(i2c, MAX8997_REG_BUCK5DVS1 + i,
1108 max8997->buck5_vol[i],
1109 0x3f);
1110 }
1111
1112
1113
1114
1115
1116 if (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs ||
1117 pdata->buck5_gpiodvs) {
1118
1119 if (!gpio_is_valid(pdata->buck125_gpios[0]) ||
1120 !gpio_is_valid(pdata->buck125_gpios[1]) ||
1121 !gpio_is_valid(pdata->buck125_gpios[2])) {
1122 dev_err(&pdev->dev, "GPIO NOT VALID\n");
1123 return -EINVAL;
1124 }
1125
1126 ret = devm_gpio_request(&pdev->dev, pdata->buck125_gpios[0],
1127 "MAX8997 SET1");
1128 if (ret)
1129 return ret;
1130
1131 ret = devm_gpio_request(&pdev->dev, pdata->buck125_gpios[1],
1132 "MAX8997 SET2");
1133 if (ret)
1134 return ret;
1135
1136 ret = devm_gpio_request(&pdev->dev, pdata->buck125_gpios[2],
1137 "MAX8997 SET3");
1138 if (ret)
1139 return ret;
1140
1141 gpio_direction_output(pdata->buck125_gpios[0],
1142 (max8997->buck125_gpioindex >> 2)
1143 & 0x1);
1144 gpio_direction_output(pdata->buck125_gpios[1],
1145 (max8997->buck125_gpioindex >> 1)
1146 & 0x1);
1147 gpio_direction_output(pdata->buck125_gpios[2],
1148 (max8997->buck125_gpioindex >> 0)
1149 & 0x1);
1150 }
1151
1152
1153 max8997_update_reg(i2c, MAX8997_REG_BUCK1CTRL, (pdata->buck1_gpiodvs) ?
1154 (1 << 1) : (0 << 1), 1 << 1);
1155 max8997_update_reg(i2c, MAX8997_REG_BUCK2CTRL, (pdata->buck2_gpiodvs) ?
1156 (1 << 1) : (0 << 1), 1 << 1);
1157 max8997_update_reg(i2c, MAX8997_REG_BUCK5CTRL, (pdata->buck5_gpiodvs) ?
1158 (1 << 1) : (0 << 1), 1 << 1);
1159
1160
1161 max8997->ramp_delay = 10;
1162 max8997_write_reg(i2c, MAX8997_REG_BUCKRAMP, (0xf << 4) | 0x9);
1163
1164 for (i = 0; i < pdata->num_regulators; i++) {
1165 const struct voltage_map_desc *desc;
1166 int id = pdata->regulators[i].id;
1167
1168 desc = reg_voltage_map[id];
1169 if (desc) {
1170 regulators[id].n_voltages =
1171 (desc->max - desc->min) / desc->step + 1;
1172 } else if (id == MAX8997_ESAFEOUT1 || id == MAX8997_ESAFEOUT2) {
1173 regulators[id].volt_table = safeoutvolt;
1174 regulators[id].n_voltages = ARRAY_SIZE(safeoutvolt);
1175 } else if (id == MAX8997_CHARGER_CV) {
1176 regulators[id].n_voltages = 16;
1177 }
1178
1179 config.dev = max8997->dev;
1180 config.init_data = pdata->regulators[i].initdata;
1181 config.driver_data = max8997;
1182 config.of_node = pdata->regulators[i].reg_node;
1183
1184 rdev = devm_regulator_register(&pdev->dev, ®ulators[id],
1185 &config);
1186 if (IS_ERR(rdev)) {
1187 dev_err(max8997->dev, "regulator init failed for %d\n",
1188 id);
1189 return PTR_ERR(rdev);
1190 }
1191 }
1192
1193 return 0;
1194 }
1195
1196 static const struct platform_device_id max8997_pmic_id[] = {
1197 { "max8997-pmic", 0},
1198 { },
1199 };
1200 MODULE_DEVICE_TABLE(platform, max8997_pmic_id);
1201
1202 static struct platform_driver max8997_pmic_driver = {
1203 .driver = {
1204 .name = "max8997-pmic",
1205 },
1206 .probe = max8997_pmic_probe,
1207 .id_table = max8997_pmic_id,
1208 };
1209
1210 static int __init max8997_pmic_init(void)
1211 {
1212 return platform_driver_register(&max8997_pmic_driver);
1213 }
1214 subsys_initcall(max8997_pmic_init);
1215
1216 static void __exit max8997_pmic_cleanup(void)
1217 {
1218 platform_driver_unregister(&max8997_pmic_driver);
1219 }
1220 module_exit(max8997_pmic_cleanup);
1221
1222 MODULE_DESCRIPTION("MAXIM 8997/8966 Regulator Driver");
1223 MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");
1224 MODULE_LICENSE("GPL");