Lines Matching refs:cw_bat
83 static int cw_read_word(struct cw_battery *cw_bat, u8 reg, u16 *val)
88 ret = regmap_bulk_read(cw_bat->regmap, reg, &value, sizeof(value));
96 static int cw_update_profile(struct cw_battery *cw_bat)
103 ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, ®_val);
109 dev_err(cw_bat->dev,
115 ret = regmap_raw_write(cw_bat->regmap, CW2015_REG_BATINFO,
116 cw_bat->bat_profile,
124 reg_val |= CW2015_ATHD(cw_bat->alert_level);
125 ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val);
132 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
140 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
145 ret = regmap_read_poll_timeout(cw_bat->regmap, CW2015_REG_SOC,
149 dev_err(cw_bat->dev,
152 dev_dbg(cw_bat->dev, "Battery profile updated\n");
157 static int cw_init(struct cw_battery *cw_bat)
164 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
169 ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, ®_val);
173 if ((reg_val & CW2015_MASK_ATHD) != CW2015_ATHD(cw_bat->alert_level)) {
174 dev_dbg(cw_bat->dev, "Setting new alert level\n");
176 reg_val |= ~CW2015_ATHD(cw_bat->alert_level);
177 ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val);
182 ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, ®_val);
187 dev_dbg(cw_bat->dev,
189 if (cw_bat->bat_profile) {
190 ret = cw_update_profile(cw_bat);
192 dev_err(cw_bat->dev,
197 dev_warn(cw_bat->dev,
200 } else if (cw_bat->bat_profile) {
203 ret = regmap_raw_read(cw_bat->regmap, CW2015_REG_BATINFO,
206 dev_err(cw_bat->dev,
211 if (memcmp(bat_info, cw_bat->bat_profile, CW2015_SIZE_BATINFO)) {
212 dev_warn(cw_bat->dev, "Replacing stored battery profile\n");
213 ret = cw_update_profile(cw_bat);
218 dev_warn(cw_bat->dev,
222 dev_dbg(cw_bat->dev, "Battery profile configured\n");
226 static int cw_power_on_reset(struct cw_battery *cw_bat)
232 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
240 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
244 ret = cw_init(cw_bat);
253 static int cw_get_soc(struct cw_battery *cw_bat)
258 ret = regmap_read(cw_bat->regmap, CW2015_REG_SOC, &soc);
264 CW2015_BAT_SOC_ERROR_MS / cw_bat->poll_interval_ms;
266 dev_err(cw_bat->dev, "Invalid SoC %d%%\n", soc);
267 cw_bat->read_errors++;
268 if (cw_bat->read_errors > max_error_cycles) {
269 dev_warn(cw_bat->dev,
271 cw_power_on_reset(cw_bat);
272 cw_bat->read_errors = 0;
274 return cw_bat->soc;
276 cw_bat->read_errors = 0;
279 if (cw_bat->status == POWER_SUPPLY_STATUS_CHARGING && soc == cw_bat->soc) {
281 CW2015_BAT_CHARGING_STUCK_MS / cw_bat->poll_interval_ms;
283 cw_bat->charge_stuck_cnt++;
284 if (cw_bat->charge_stuck_cnt > max_stuck_cycles) {
285 dev_warn(cw_bat->dev,
287 cw_power_on_reset(cw_bat);
288 cw_bat->charge_stuck_cnt = 0;
291 cw_bat->charge_stuck_cnt = 0;
295 if (cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 0, 3))
296 soc = cw_bat->soc;
299 if (!cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 3, 0))
300 soc = cw_bat->soc;
305 static int cw_get_voltage(struct cw_battery *cw_bat)
312 ret = cw_read_word(cw_bat, CW2015_REG_VCELL, ®_val);
327 dev_dbg(cw_bat->dev, "Read voltage: %d mV, raw=0x%04x\n",
332 static int cw_get_time_to_empty(struct cw_battery *cw_bat)
337 ret = cw_read_word(cw_bat, CW2015_REG_RRT_ALERT, &value16);
344 static void cw_update_charge_status(struct cw_battery *cw_bat)
348 ret = power_supply_am_i_supplied(cw_bat->rk_bat);
350 dev_warn(cw_bat->dev, "Failed to get supply state: %d\n", ret);
355 if (cw_bat->charger_attached != charger_attached) {
356 cw_bat->battery_changed = true;
358 cw_bat->charge_count++;
360 cw_bat->charger_attached = charger_attached;
364 static void cw_update_soc(struct cw_battery *cw_bat)
368 soc = cw_get_soc(cw_bat);
370 dev_err(cw_bat->dev, "Failed to get SoC from gauge: %d\n", soc);
371 else if (cw_bat->soc != soc) {
372 cw_bat->soc = soc;
373 cw_bat->battery_changed = true;
377 static void cw_update_voltage(struct cw_battery *cw_bat)
381 voltage_mv = cw_get_voltage(cw_bat);
383 dev_err(cw_bat->dev, "Failed to get voltage from gauge: %d\n",
386 cw_bat->voltage_mv = voltage_mv;
389 static void cw_update_status(struct cw_battery *cw_bat)
393 if (cw_bat->charger_attached) {
394 if (cw_bat->soc >= 100)
400 if (cw_bat->status != status)
401 cw_bat->battery_changed = true;
402 cw_bat->status = status;
405 static void cw_update_time_to_empty(struct cw_battery *cw_bat)
409 time_to_empty = cw_get_time_to_empty(cw_bat);
411 dev_err(cw_bat->dev, "Failed to get time to empty from gauge: %d\n",
413 else if (cw_bat->time_to_empty != time_to_empty) {
414 cw_bat->time_to_empty = time_to_empty;
415 cw_bat->battery_changed = true;
422 struct cw_battery *cw_bat;
427 cw_bat = container_of(delay_work, struct cw_battery, battery_delay_work);
428 ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, ®_val);
430 dev_err(cw_bat->dev, "Failed to read mode from gauge: %d\n", ret);
436 if (!cw_power_on_reset(cw_bat))
440 cw_update_soc(cw_bat);
441 cw_update_voltage(cw_bat);
442 cw_update_charge_status(cw_bat);
443 cw_update_status(cw_bat);
444 cw_update_time_to_empty(cw_bat);
446 dev_dbg(cw_bat->dev, "charger_attached = %d\n", cw_bat->charger_attached);
447 dev_dbg(cw_bat->dev, "status = %d\n", cw_bat->status);
448 dev_dbg(cw_bat->dev, "soc = %d%%\n", cw_bat->soc);
449 dev_dbg(cw_bat->dev, "voltage = %dmV\n", cw_bat->voltage_mv);
451 if (cw_bat->battery_changed)
452 power_supply_changed(cw_bat->rk_bat);
453 cw_bat->battery_changed = false;
455 queue_delayed_work(cw_bat->battery_workqueue,
456 &cw_bat->battery_delay_work,
457 msecs_to_jiffies(cw_bat->poll_interval_ms));
460 static bool cw_battery_valid_time_to_empty(struct cw_battery *cw_bat)
462 return cw_bat->time_to_empty > 0 &&
463 cw_bat->time_to_empty < CW2015_MASK_SOC &&
464 cw_bat->status == POWER_SUPPLY_STATUS_DISCHARGING;
471 struct cw_battery *cw_bat;
473 cw_bat = power_supply_get_drvdata(psy);
476 val->intval = cw_bat->soc;
480 val->intval = cw_bat->status;
484 val->intval = !!cw_bat->voltage_mv;
488 val->intval = cw_bat->voltage_mv * 1000;
492 if (cw_battery_valid_time_to_empty(cw_bat))
493 val->intval = cw_bat->time_to_empty * 60;
503 val->intval = cw_bat->charge_count;
508 if (cw_bat->battery.charge_full_design_uah > 0)
509 val->intval = cw_bat->battery.charge_full_design_uah;
515 if (cw_battery_valid_time_to_empty(cw_bat) &&
516 cw_bat->battery.charge_full_design_uah > 0) {
518 val->intval = cw_bat->battery.charge_full_design_uah;
519 val->intval = val->intval * cw_bat->soc / 100;
522 val->intval = 60 * val->intval / cw_bat->time_to_empty;
556 static int cw2015_parse_properties(struct cw_battery *cw_bat)
558 struct device *dev = cw_bat->dev;
564 dev_warn(cw_bat->dev,
567 dev_err(cw_bat->dev, "battery-profile must be %d bytes\n",
571 cw_bat->bat_profile = devm_kzalloc(dev, length, GFP_KERNEL);
572 if (!cw_bat->bat_profile)
577 cw_bat->bat_profile,
584 &cw_bat->poll_interval_ms);
586 dev_dbg(cw_bat->dev, "Using default poll interval\n");
587 cw_bat->poll_interval_ms = CW2015_DEFAULT_POLL_INTERVAL_MS;
639 struct cw_battery *cw_bat;
642 cw_bat = devm_kzalloc(&client->dev, sizeof(*cw_bat), GFP_KERNEL);
643 if (!cw_bat)
646 i2c_set_clientdata(client, cw_bat);
647 cw_bat->dev = &client->dev;
648 cw_bat->soc = 1;
650 ret = cw2015_parse_properties(cw_bat);
652 dev_err(cw_bat->dev, "Failed to parse cw2015 properties\n");
656 cw_bat->regmap = devm_regmap_init_i2c(client, &cw2015_regmap_config);
657 if (IS_ERR(cw_bat->regmap)) {
658 dev_err(cw_bat->dev, "Failed to allocate regmap: %ld\n",
659 PTR_ERR(cw_bat->regmap));
660 return PTR_ERR(cw_bat->regmap);
663 ret = cw_init(cw_bat);
665 dev_err(cw_bat->dev, "Init failed: %d\n", ret);
669 psy_cfg.drv_data = cw_bat;
670 psy_cfg.fwnode = dev_fwnode(cw_bat->dev);
672 cw_bat->rk_bat = devm_power_supply_register(&client->dev,
675 if (IS_ERR(cw_bat->rk_bat)) {
677 dev_err_probe(&client->dev, PTR_ERR(cw_bat->rk_bat),
679 return PTR_ERR(cw_bat->rk_bat);
682 ret = power_supply_get_battery_info(cw_bat->rk_bat, &cw_bat->battery);
684 dev_warn(cw_bat->dev,
688 cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery");
689 INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work);
690 queue_delayed_work(cw_bat->battery_workqueue,
691 &cw_bat->battery_delay_work, msecs_to_jiffies(10));
698 struct cw_battery *cw_bat = i2c_get_clientdata(client);
700 cancel_delayed_work_sync(&cw_bat->battery_delay_work);
707 struct cw_battery *cw_bat = i2c_get_clientdata(client);
709 queue_delayed_work(cw_bat->battery_workqueue,
710 &cw_bat->battery_delay_work, 0);
718 struct cw_battery *cw_bat = i2c_get_clientdata(client);
720 cancel_delayed_work_sync(&cw_bat->battery_delay_work);
721 power_supply_put_battery_info(cw_bat->rk_bat, &cw_bat->battery);