0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/platform_device.h>
0010 #include <linux/power_supply.h>
0011 #include <linux/mfd/max14577-private.h>
0012 #include <linux/mfd/max14577.h>
0013
0014 struct max14577_charger {
0015 struct device *dev;
0016 struct max14577 *max14577;
0017 struct power_supply *charger;
0018
0019 struct max14577_charger_platform_data *pdata;
0020 };
0021
0022
0023
0024
0025
0026 static enum max14577_muic_charger_type maxim_get_charger_type(
0027 enum maxim_device_type dev_type, u8 val) {
0028 switch (val) {
0029 case MAX14577_CHARGER_TYPE_NONE:
0030 case MAX14577_CHARGER_TYPE_USB:
0031 case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT:
0032 case MAX14577_CHARGER_TYPE_DEDICATED_CHG:
0033 case MAX14577_CHARGER_TYPE_SPECIAL_500MA:
0034 case MAX14577_CHARGER_TYPE_SPECIAL_1A:
0035 return val;
0036 case MAX14577_CHARGER_TYPE_DEAD_BATTERY:
0037 case MAX14577_CHARGER_TYPE_RESERVED:
0038 if (dev_type == MAXIM_DEVICE_TYPE_MAX77836)
0039 val |= 0x8;
0040 return val;
0041 default:
0042 WARN_ONCE(1, "max14577: Unsupported chgtyp register value 0x%02x", val);
0043 return val;
0044 }
0045 }
0046
0047 static int max14577_get_charger_state(struct max14577_charger *chg, int *val)
0048 {
0049 struct regmap *rmap = chg->max14577->regmap;
0050 int ret;
0051 u8 reg_data;
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 ret = max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL2, ®_data);
0065 if (ret < 0)
0066 goto out;
0067
0068 if ((reg_data & CHGCTRL2_MBCHOSTEN_MASK) == 0) {
0069 *val = POWER_SUPPLY_STATUS_DISCHARGING;
0070 goto out;
0071 }
0072
0073 ret = max14577_read_reg(rmap, MAX14577_CHG_REG_STATUS3, ®_data);
0074 if (ret < 0)
0075 goto out;
0076
0077 if (reg_data & STATUS3_CGMBC_MASK) {
0078
0079 if (reg_data & STATUS3_EOC_MASK)
0080 *val = POWER_SUPPLY_STATUS_FULL;
0081 else
0082 *val = POWER_SUPPLY_STATUS_CHARGING;
0083 goto out;
0084 }
0085
0086 *val = POWER_SUPPLY_STATUS_DISCHARGING;
0087
0088 out:
0089 return ret;
0090 }
0091
0092
0093
0094
0095
0096
0097 static int max14577_get_charge_type(struct max14577_charger *chg, int *val)
0098 {
0099 int ret, charging;
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109 ret = max14577_get_charger_state(chg, &charging);
0110 if (ret < 0)
0111 return ret;
0112
0113 if (charging == POWER_SUPPLY_STATUS_CHARGING)
0114 *val = POWER_SUPPLY_CHARGE_TYPE_FAST;
0115 else
0116 *val = POWER_SUPPLY_CHARGE_TYPE_NONE;
0117
0118 return 0;
0119 }
0120
0121 static int max14577_get_online(struct max14577_charger *chg, int *val)
0122 {
0123 struct regmap *rmap = chg->max14577->regmap;
0124 u8 reg_data;
0125 int ret;
0126 enum max14577_muic_charger_type chg_type;
0127
0128 ret = max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, ®_data);
0129 if (ret < 0)
0130 return ret;
0131
0132 reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT);
0133 chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data);
0134 switch (chg_type) {
0135 case MAX14577_CHARGER_TYPE_USB:
0136 case MAX14577_CHARGER_TYPE_DEDICATED_CHG:
0137 case MAX14577_CHARGER_TYPE_SPECIAL_500MA:
0138 case MAX14577_CHARGER_TYPE_SPECIAL_1A:
0139 case MAX14577_CHARGER_TYPE_DEAD_BATTERY:
0140 case MAX77836_CHARGER_TYPE_SPECIAL_BIAS:
0141 *val = 1;
0142 break;
0143 case MAX14577_CHARGER_TYPE_NONE:
0144 case MAX14577_CHARGER_TYPE_DOWNSTREAM_PORT:
0145 case MAX14577_CHARGER_TYPE_RESERVED:
0146 case MAX77836_CHARGER_TYPE_RESERVED:
0147 default:
0148 *val = 0;
0149 }
0150
0151 return 0;
0152 }
0153
0154
0155
0156
0157
0158
0159
0160 static int max14577_get_battery_health(struct max14577_charger *chg, int *val)
0161 {
0162 struct regmap *rmap = chg->max14577->regmap;
0163 int ret;
0164 u8 reg_data;
0165 enum max14577_muic_charger_type chg_type;
0166
0167 ret = max14577_read_reg(rmap, MAX14577_MUIC_REG_STATUS2, ®_data);
0168 if (ret < 0)
0169 goto out;
0170
0171 reg_data = ((reg_data & STATUS2_CHGTYP_MASK) >> STATUS2_CHGTYP_SHIFT);
0172 chg_type = maxim_get_charger_type(chg->max14577->dev_type, reg_data);
0173 if (chg_type == MAX14577_CHARGER_TYPE_DEAD_BATTERY) {
0174 *val = POWER_SUPPLY_HEALTH_DEAD;
0175 goto out;
0176 }
0177
0178 ret = max14577_read_reg(rmap, MAX14577_CHG_REG_STATUS3, ®_data);
0179 if (ret < 0)
0180 goto out;
0181
0182 if (reg_data & STATUS3_OVP_MASK) {
0183 *val = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
0184 goto out;
0185 }
0186
0187
0188 *val = POWER_SUPPLY_HEALTH_GOOD;
0189
0190 out:
0191 return ret;
0192 }
0193
0194
0195
0196
0197
0198
0199 static int max14577_get_present(struct max14577_charger *chg, int *val)
0200 {
0201 *val = 1;
0202
0203 return 0;
0204 }
0205
0206 static int max14577_set_fast_charge_timer(struct max14577_charger *chg,
0207 unsigned long hours)
0208 {
0209 u8 reg_data;
0210
0211 switch (hours) {
0212 case 5 ... 7:
0213 reg_data = hours - 3;
0214 break;
0215 case 0:
0216
0217 reg_data = 0x7;
0218 break;
0219 default:
0220 dev_err(chg->dev, "Wrong value for Fast-Charge Timer: %lu\n",
0221 hours);
0222 return -EINVAL;
0223 }
0224 reg_data <<= CHGCTRL1_TCHW_SHIFT;
0225
0226 return max14577_update_reg(chg->max14577->regmap,
0227 MAX14577_REG_CHGCTRL1, CHGCTRL1_TCHW_MASK, reg_data);
0228 }
0229
0230 static int max14577_init_constant_voltage(struct max14577_charger *chg,
0231 unsigned int uvolt)
0232 {
0233 u8 reg_data;
0234
0235 if (uvolt < MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN ||
0236 uvolt > MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX)
0237 return -EINVAL;
0238
0239 if (uvolt == 4200000)
0240 reg_data = 0x0;
0241 else if (uvolt == MAXIM_CHARGER_CONSTANT_VOLTAGE_MAX)
0242 reg_data = 0x1f;
0243 else if (uvolt <= 4280000) {
0244 unsigned int val = uvolt;
0245
0246 val -= MAXIM_CHARGER_CONSTANT_VOLTAGE_MIN;
0247 val /= MAXIM_CHARGER_CONSTANT_VOLTAGE_STEP;
0248 if (uvolt <= 4180000)
0249 reg_data = 0x1 + val;
0250 else
0251 reg_data = val;
0252 } else
0253 return -EINVAL;
0254
0255 reg_data <<= CHGCTRL3_MBCCVWRC_SHIFT;
0256
0257 return max14577_write_reg(chg->max14577->regmap,
0258 MAX14577_CHG_REG_CHG_CTRL3, reg_data);
0259 }
0260
0261 static int max14577_init_eoc(struct max14577_charger *chg,
0262 unsigned int uamp)
0263 {
0264 unsigned int current_bits;
0265 u8 reg_data;
0266
0267 switch (chg->max14577->dev_type) {
0268 case MAXIM_DEVICE_TYPE_MAX77836:
0269 if (uamp < 5000)
0270 return -EINVAL;
0271
0272 if (uamp >= 7500 && uamp < 10000)
0273 current_bits = 0x0;
0274 else if (uamp <= 50000) {
0275
0276 current_bits = uamp / 5000;
0277 } else {
0278 uamp = min(uamp, 100000U) - 50000U;
0279 current_bits = 0xa + uamp / 10000;
0280 }
0281 break;
0282
0283 case MAXIM_DEVICE_TYPE_MAX14577:
0284 default:
0285 if (uamp < MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN)
0286 return -EINVAL;
0287
0288 uamp = min(uamp, MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX);
0289 uamp -= MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN;
0290 current_bits = uamp / MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP;
0291 break;
0292 }
0293
0294 reg_data = current_bits << CHGCTRL5_EOCS_SHIFT;
0295
0296 return max14577_update_reg(chg->max14577->regmap,
0297 MAX14577_CHG_REG_CHG_CTRL5, CHGCTRL5_EOCS_MASK,
0298 reg_data);
0299 }
0300
0301 static int max14577_init_fast_charge(struct max14577_charger *chg,
0302 unsigned int uamp)
0303 {
0304 u8 reg_data;
0305 int ret;
0306 const struct maxim_charger_current *limits =
0307 &maxim_charger_currents[chg->max14577->dev_type];
0308
0309 ret = maxim_charger_calc_reg_current(limits, uamp, uamp, ®_data);
0310 if (ret) {
0311 dev_err(chg->dev, "Wrong value for fast charge: %u\n", uamp);
0312 return ret;
0313 }
0314
0315 return max14577_update_reg(chg->max14577->regmap,
0316 MAX14577_CHG_REG_CHG_CTRL4,
0317 CHGCTRL4_MBCICHWRCL_MASK | CHGCTRL4_MBCICHWRCH_MASK,
0318 reg_data);
0319 }
0320
0321
0322
0323
0324
0325
0326 static int max14577_charger_reg_init(struct max14577_charger *chg)
0327 {
0328 struct regmap *rmap = chg->max14577->regmap;
0329 u8 reg_data;
0330 int ret;
0331
0332
0333
0334
0335
0336
0337 reg_data = 0x1 << CDETCTRL1_CHGDETEN_SHIFT;
0338 max14577_update_reg(rmap, MAX14577_REG_CDETCTRL1,
0339 CDETCTRL1_CHGDETEN_MASK | CDETCTRL1_CHGTYPMAN_MASK,
0340 reg_data);
0341
0342
0343
0344
0345
0346 reg_data = 0x1 << CHGCTRL2_VCHGR_RC_SHIFT;
0347 reg_data |= 0x1 << CHGCTRL2_MBCHOSTEN_SHIFT;
0348 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL2, reg_data);
0349
0350
0351 reg_data = 0x0 << CHGCTRL6_AUTOSTOP_SHIFT;
0352 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL6, reg_data);
0353
0354 ret = max14577_init_constant_voltage(chg, chg->pdata->constant_uvolt);
0355 if (ret)
0356 return ret;
0357
0358 ret = max14577_init_eoc(chg, chg->pdata->eoc_uamp);
0359 if (ret)
0360 return ret;
0361
0362 ret = max14577_init_fast_charge(chg, chg->pdata->fast_charge_uamp);
0363 if (ret)
0364 return ret;
0365
0366 ret = max14577_set_fast_charge_timer(chg,
0367 MAXIM_CHARGER_FAST_CHARGE_TIMER_DEFAULT);
0368 if (ret)
0369 return ret;
0370
0371
0372 switch (chg->pdata->ovp_uvolt) {
0373 case 7500000:
0374 reg_data = 0x0;
0375 break;
0376 case 6000000:
0377 case 6500000:
0378 case 7000000:
0379 reg_data = 0x1 + (chg->pdata->ovp_uvolt - 6000000) / 500000;
0380 break;
0381 default:
0382 dev_err(chg->dev, "Wrong value for OVP: %u\n",
0383 chg->pdata->ovp_uvolt);
0384 return -EINVAL;
0385 }
0386 reg_data <<= CHGCTRL7_OTPCGHCVS_SHIFT;
0387 max14577_write_reg(rmap, MAX14577_REG_CHGCTRL7, reg_data);
0388
0389 return 0;
0390 }
0391
0392
0393 static enum power_supply_property max14577_charger_props[] = {
0394 POWER_SUPPLY_PROP_STATUS,
0395 POWER_SUPPLY_PROP_CHARGE_TYPE,
0396 POWER_SUPPLY_PROP_HEALTH,
0397 POWER_SUPPLY_PROP_PRESENT,
0398 POWER_SUPPLY_PROP_ONLINE,
0399 POWER_SUPPLY_PROP_MODEL_NAME,
0400 POWER_SUPPLY_PROP_MANUFACTURER,
0401 };
0402
0403 static const char * const model_names[] = {
0404 [MAXIM_DEVICE_TYPE_UNKNOWN] = "MAX14577-like",
0405 [MAXIM_DEVICE_TYPE_MAX14577] = "MAX14577",
0406 [MAXIM_DEVICE_TYPE_MAX77836] = "MAX77836",
0407 };
0408 static const char *manufacturer = "Maxim Integrated";
0409
0410 static int max14577_charger_get_property(struct power_supply *psy,
0411 enum power_supply_property psp,
0412 union power_supply_propval *val)
0413 {
0414 struct max14577_charger *chg = power_supply_get_drvdata(psy);
0415 int ret = 0;
0416
0417 switch (psp) {
0418 case POWER_SUPPLY_PROP_STATUS:
0419 ret = max14577_get_charger_state(chg, &val->intval);
0420 break;
0421 case POWER_SUPPLY_PROP_CHARGE_TYPE:
0422 ret = max14577_get_charge_type(chg, &val->intval);
0423 break;
0424 case POWER_SUPPLY_PROP_HEALTH:
0425 ret = max14577_get_battery_health(chg, &val->intval);
0426 break;
0427 case POWER_SUPPLY_PROP_PRESENT:
0428 ret = max14577_get_present(chg, &val->intval);
0429 break;
0430 case POWER_SUPPLY_PROP_ONLINE:
0431 ret = max14577_get_online(chg, &val->intval);
0432 break;
0433 case POWER_SUPPLY_PROP_MODEL_NAME:
0434 BUILD_BUG_ON(ARRAY_SIZE(model_names) != MAXIM_DEVICE_TYPE_NUM);
0435 val->strval = model_names[chg->max14577->dev_type];
0436 break;
0437 case POWER_SUPPLY_PROP_MANUFACTURER:
0438 val->strval = manufacturer;
0439 break;
0440 default:
0441 return -EINVAL;
0442 }
0443
0444 return ret;
0445 }
0446
0447 static const struct power_supply_desc max14577_charger_desc = {
0448 .name = "max14577-charger",
0449 .type = POWER_SUPPLY_TYPE_BATTERY,
0450 .properties = max14577_charger_props,
0451 .num_properties = ARRAY_SIZE(max14577_charger_props),
0452 .get_property = max14577_charger_get_property,
0453 };
0454
0455 #ifdef CONFIG_OF
0456 static struct max14577_charger_platform_data *max14577_charger_dt_init(
0457 struct platform_device *pdev)
0458 {
0459 struct max14577_charger_platform_data *pdata;
0460 struct device_node *np = pdev->dev.of_node;
0461 int ret;
0462
0463 if (!np) {
0464 dev_err(&pdev->dev, "No charger OF node\n");
0465 return ERR_PTR(-EINVAL);
0466 }
0467
0468 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
0469 if (!pdata)
0470 return ERR_PTR(-ENOMEM);
0471
0472 ret = of_property_read_u32(np, "maxim,constant-uvolt",
0473 &pdata->constant_uvolt);
0474 if (ret) {
0475 dev_err(&pdev->dev, "Cannot parse maxim,constant-uvolt field from DT\n");
0476 return ERR_PTR(ret);
0477 }
0478
0479 ret = of_property_read_u32(np, "maxim,fast-charge-uamp",
0480 &pdata->fast_charge_uamp);
0481 if (ret) {
0482 dev_err(&pdev->dev, "Cannot parse maxim,fast-charge-uamp field from DT\n");
0483 return ERR_PTR(ret);
0484 }
0485
0486 ret = of_property_read_u32(np, "maxim,eoc-uamp", &pdata->eoc_uamp);
0487 if (ret) {
0488 dev_err(&pdev->dev, "Cannot parse maxim,eoc-uamp field from DT\n");
0489 return ERR_PTR(ret);
0490 }
0491
0492 ret = of_property_read_u32(np, "maxim,ovp-uvolt", &pdata->ovp_uvolt);
0493 if (ret) {
0494 dev_err(&pdev->dev, "Cannot parse maxim,ovp-uvolt field from DT\n");
0495 return ERR_PTR(ret);
0496 }
0497
0498 return pdata;
0499 }
0500 #else
0501 static struct max14577_charger_platform_data *max14577_charger_dt_init(
0502 struct platform_device *pdev)
0503 {
0504 return NULL;
0505 }
0506 #endif
0507
0508 static ssize_t show_fast_charge_timer(struct device *dev,
0509 struct device_attribute *attr, char *buf)
0510 {
0511 struct max14577_charger *chg = dev_get_drvdata(dev);
0512 u8 reg_data;
0513 int ret;
0514 unsigned int val;
0515
0516 ret = max14577_read_reg(chg->max14577->regmap, MAX14577_REG_CHGCTRL1,
0517 ®_data);
0518 if (ret)
0519 return ret;
0520
0521 reg_data &= CHGCTRL1_TCHW_MASK;
0522 reg_data >>= CHGCTRL1_TCHW_SHIFT;
0523 switch (reg_data) {
0524 case 0x2 ... 0x4:
0525 val = reg_data + 3;
0526 break;
0527 case 0x7:
0528 val = 0;
0529 break;
0530 default:
0531 val = 5;
0532 break;
0533 }
0534
0535 return scnprintf(buf, PAGE_SIZE, "%u\n", val);
0536 }
0537
0538 static ssize_t store_fast_charge_timer(struct device *dev,
0539 struct device_attribute *attr, const char *buf, size_t count)
0540 {
0541 struct max14577_charger *chg = dev_get_drvdata(dev);
0542 unsigned long val;
0543 int ret;
0544
0545 ret = kstrtoul(buf, 10, &val);
0546 if (ret)
0547 return ret;
0548
0549 ret = max14577_set_fast_charge_timer(chg, val);
0550 if (ret)
0551 return ret;
0552
0553 return count;
0554 }
0555
0556 static DEVICE_ATTR(fast_charge_timer, S_IRUGO | S_IWUSR,
0557 show_fast_charge_timer, store_fast_charge_timer);
0558
0559 static int max14577_charger_probe(struct platform_device *pdev)
0560 {
0561 struct max14577_charger *chg;
0562 struct power_supply_config psy_cfg = {};
0563 struct max14577 *max14577 = dev_get_drvdata(pdev->dev.parent);
0564 int ret;
0565
0566 chg = devm_kzalloc(&pdev->dev, sizeof(*chg), GFP_KERNEL);
0567 if (!chg)
0568 return -ENOMEM;
0569
0570 platform_set_drvdata(pdev, chg);
0571 chg->dev = &pdev->dev;
0572 chg->max14577 = max14577;
0573
0574 chg->pdata = max14577_charger_dt_init(pdev);
0575 if (IS_ERR_OR_NULL(chg->pdata))
0576 return PTR_ERR(chg->pdata);
0577
0578 ret = max14577_charger_reg_init(chg);
0579 if (ret)
0580 return ret;
0581
0582 ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer);
0583 if (ret) {
0584 dev_err(&pdev->dev, "failed: create sysfs entry\n");
0585 return ret;
0586 }
0587
0588 psy_cfg.drv_data = chg;
0589 chg->charger = power_supply_register(&pdev->dev, &max14577_charger_desc,
0590 &psy_cfg);
0591 if (IS_ERR(chg->charger)) {
0592 dev_err(&pdev->dev, "failed: power supply register\n");
0593 ret = PTR_ERR(chg->charger);
0594 goto err;
0595 }
0596
0597
0598 BUILD_BUG_ON(MAX14577_CHARGER_EOC_CURRENT_LIMIT_MIN +
0599 MAX14577_CHARGER_EOC_CURRENT_LIMIT_STEP * 0xf !=
0600 MAX14577_CHARGER_EOC_CURRENT_LIMIT_MAX);
0601 return 0;
0602
0603 err:
0604 device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
0605
0606 return ret;
0607 }
0608
0609 static int max14577_charger_remove(struct platform_device *pdev)
0610 {
0611 struct max14577_charger *chg = platform_get_drvdata(pdev);
0612
0613 device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
0614 power_supply_unregister(chg->charger);
0615
0616 return 0;
0617 }
0618
0619 static const struct platform_device_id max14577_charger_id[] = {
0620 { "max14577-charger", MAXIM_DEVICE_TYPE_MAX14577, },
0621 { "max77836-charger", MAXIM_DEVICE_TYPE_MAX77836, },
0622 { }
0623 };
0624 MODULE_DEVICE_TABLE(platform, max14577_charger_id);
0625
0626 static const struct of_device_id of_max14577_charger_dt_match[] = {
0627 { .compatible = "maxim,max14577-charger",
0628 .data = (void *)MAXIM_DEVICE_TYPE_MAX14577, },
0629 { .compatible = "maxim,max77836-charger",
0630 .data = (void *)MAXIM_DEVICE_TYPE_MAX77836, },
0631 { },
0632 };
0633 MODULE_DEVICE_TABLE(of, of_max14577_charger_dt_match);
0634
0635 static struct platform_driver max14577_charger_driver = {
0636 .driver = {
0637 .name = "max14577-charger",
0638 .of_match_table = of_max14577_charger_dt_match,
0639 },
0640 .probe = max14577_charger_probe,
0641 .remove = max14577_charger_remove,
0642 .id_table = max14577_charger_id,
0643 };
0644 module_platform_driver(max14577_charger_driver);
0645
0646 MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
0647 MODULE_DESCRIPTION("Maxim 14577/77836 charger driver");
0648 MODULE_LICENSE("GPL");