Lines Matching +full:monitor +full:- +full:interval +full:- +full:ms

1 // SPDX-License-Identifier: GPL-2.0
8 * Authors: xuhuicong <xhc@rock-chips.com>
53 /* poll interval from CellWise GPL Android driver example */
88 ret = regmap_bulk_read(cw_bat->regmap, reg, &value, sizeof(value)); in cw_read_word()
103 ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, &reg_val); in cw_update_profile()
109 dev_err(cw_bat->dev, in cw_update_profile()
111 return -EINVAL; in cw_update_profile()
115 ret = regmap_raw_write(cw_bat->regmap, CW2015_REG_BATINFO, in cw_update_profile()
116 cw_bat->bat_profile, in cw_update_profile()
124 reg_val |= CW2015_ATHD(cw_bat->alert_level); in cw_update_profile()
125 ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val); in cw_update_profile()
132 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val); in cw_update_profile()
140 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val); in cw_update_profile()
145 ret = regmap_read_poll_timeout(cw_bat->regmap, CW2015_REG_SOC, in cw_update_profile()
149 dev_err(cw_bat->dev, in cw_update_profile()
152 dev_dbg(cw_bat->dev, "Battery profile updated\n"); in cw_update_profile()
164 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val); in cw_init()
169 ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, &reg_val); in cw_init()
173 if ((reg_val & CW2015_MASK_ATHD) != CW2015_ATHD(cw_bat->alert_level)) { in cw_init()
174 dev_dbg(cw_bat->dev, "Setting new alert level\n"); in cw_init()
176 reg_val |= ~CW2015_ATHD(cw_bat->alert_level); in cw_init()
177 ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val); in cw_init()
182 ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, &reg_val); in cw_init()
187 dev_dbg(cw_bat->dev, in cw_init()
189 if (cw_bat->bat_profile) { in cw_init()
192 dev_err(cw_bat->dev, in cw_init()
197 dev_warn(cw_bat->dev, in cw_init()
200 } else if (cw_bat->bat_profile) { in cw_init()
203 ret = regmap_raw_read(cw_bat->regmap, CW2015_REG_BATINFO, in cw_init()
206 dev_err(cw_bat->dev, in cw_init()
211 if (memcmp(bat_info, cw_bat->bat_profile, CW2015_SIZE_BATINFO)) { in cw_init()
212 dev_warn(cw_bat->dev, "Replacing stored battery profile\n"); in cw_init()
218 dev_warn(cw_bat->dev, in cw_init()
222 dev_dbg(cw_bat->dev, "Battery profile configured\n"); in cw_init()
232 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val); in cw_power_on_reset()
240 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val); in cw_power_on_reset()
251 (((current) < (previous) + (up)) && ((current) > (previous) - (down)))
258 ret = regmap_read(cw_bat->regmap, CW2015_REG_SOC, &soc); in cw_get_soc()
264 CW2015_BAT_SOC_ERROR_MS / cw_bat->poll_interval_ms; in cw_get_soc()
266 dev_err(cw_bat->dev, "Invalid SoC %d%%\n", soc); in cw_get_soc()
267 cw_bat->read_errors++; in cw_get_soc()
268 if (cw_bat->read_errors > max_error_cycles) { in cw_get_soc()
269 dev_warn(cw_bat->dev, in cw_get_soc()
272 cw_bat->read_errors = 0; in cw_get_soc()
274 return cw_bat->soc; in cw_get_soc()
276 cw_bat->read_errors = 0; in cw_get_soc()
279 if (cw_bat->status == POWER_SUPPLY_STATUS_CHARGING && soc == cw_bat->soc) { in cw_get_soc()
281 CW2015_BAT_CHARGING_STUCK_MS / cw_bat->poll_interval_ms; in cw_get_soc()
283 cw_bat->charge_stuck_cnt++; in cw_get_soc()
284 if (cw_bat->charge_stuck_cnt > max_stuck_cycles) { in cw_get_soc()
285 dev_warn(cw_bat->dev, in cw_get_soc()
288 cw_bat->charge_stuck_cnt = 0; in cw_get_soc()
291 cw_bat->charge_stuck_cnt = 0; in cw_get_soc()
295 if (cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 0, 3)) in cw_get_soc()
296 soc = cw_bat->soc; in cw_get_soc()
299 if (!cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 3, 0)) in cw_get_soc()
300 soc = cw_bat->soc; in cw_get_soc()
327 dev_dbg(cw_bat->dev, "Read voltage: %d mV, raw=0x%04x\n", in cw_get_voltage()
348 ret = power_supply_am_i_supplied(cw_bat->rk_bat); in cw_update_charge_status()
350 dev_warn(cw_bat->dev, "Failed to get supply state: %d\n", ret); in cw_update_charge_status()
355 if (cw_bat->charger_attached != charger_attached) { in cw_update_charge_status()
356 cw_bat->battery_changed = true; in cw_update_charge_status()
358 cw_bat->charge_count++; in cw_update_charge_status()
360 cw_bat->charger_attached = charger_attached; in cw_update_charge_status()
370 dev_err(cw_bat->dev, "Failed to get SoC from gauge: %d\n", soc); in cw_update_soc()
371 else if (cw_bat->soc != soc) { in cw_update_soc()
372 cw_bat->soc = soc; in cw_update_soc()
373 cw_bat->battery_changed = true; in cw_update_soc()
383 dev_err(cw_bat->dev, "Failed to get voltage from gauge: %d\n", in cw_update_voltage()
386 cw_bat->voltage_mv = voltage_mv; in cw_update_voltage()
393 if (cw_bat->charger_attached) { in cw_update_status()
394 if (cw_bat->soc >= 100) in cw_update_status()
400 if (cw_bat->status != status) in cw_update_status()
401 cw_bat->battery_changed = true; in cw_update_status()
402 cw_bat->status = status; in cw_update_status()
411 dev_err(cw_bat->dev, "Failed to get time to empty from gauge: %d\n", in cw_update_time_to_empty()
413 else if (cw_bat->time_to_empty != time_to_empty) { in cw_update_time_to_empty()
414 cw_bat->time_to_empty = time_to_empty; in cw_update_time_to_empty()
415 cw_bat->battery_changed = true; in cw_update_time_to_empty()
428 ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, &reg_val); in cw_bat_work()
430 dev_err(cw_bat->dev, "Failed to read mode from gauge: %d\n", ret); in cw_bat_work()
446 dev_dbg(cw_bat->dev, "charger_attached = %d\n", cw_bat->charger_attached); in cw_bat_work()
447 dev_dbg(cw_bat->dev, "status = %d\n", cw_bat->status); in cw_bat_work()
448 dev_dbg(cw_bat->dev, "soc = %d%%\n", cw_bat->soc); in cw_bat_work()
449 dev_dbg(cw_bat->dev, "voltage = %dmV\n", cw_bat->voltage_mv); in cw_bat_work()
451 if (cw_bat->battery_changed) in cw_bat_work()
452 power_supply_changed(cw_bat->rk_bat); in cw_bat_work()
453 cw_bat->battery_changed = false; in cw_bat_work()
455 queue_delayed_work(cw_bat->battery_workqueue, in cw_bat_work()
456 &cw_bat->battery_delay_work, in cw_bat_work()
457 msecs_to_jiffies(cw_bat->poll_interval_ms)); in cw_bat_work()
462 return cw_bat->time_to_empty > 0 && in cw_battery_valid_time_to_empty()
463 cw_bat->time_to_empty < CW2015_MASK_SOC && in cw_battery_valid_time_to_empty()
464 cw_bat->status == POWER_SUPPLY_STATUS_DISCHARGING; in cw_battery_valid_time_to_empty()
476 val->intval = cw_bat->soc; in cw_battery_get_property()
480 val->intval = cw_bat->status; in cw_battery_get_property()
484 val->intval = !!cw_bat->voltage_mv; in cw_battery_get_property()
488 val->intval = cw_bat->voltage_mv * 1000; in cw_battery_get_property()
493 val->intval = cw_bat->time_to_empty; in cw_battery_get_property()
495 val->intval = 0; in cw_battery_get_property()
499 val->intval = POWER_SUPPLY_TECHNOLOGY_LION; in cw_battery_get_property()
503 val->intval = cw_bat->charge_count; in cw_battery_get_property()
508 if (cw_bat->battery.charge_full_design_uah > 0) in cw_battery_get_property()
509 val->intval = cw_bat->battery.charge_full_design_uah; in cw_battery_get_property()
511 val->intval = 0; in cw_battery_get_property()
516 cw_bat->battery.charge_full_design_uah > 0) { in cw_battery_get_property()
518 val->intval = cw_bat->battery.charge_full_design_uah; in cw_battery_get_property()
519 val->intval = val->intval * cw_bat->soc / 100; in cw_battery_get_property()
522 val->intval = 60 * val->intval / cw_bat->time_to_empty; in cw_battery_get_property()
524 val->intval = 0; in cw_battery_get_property()
549 .name = "cw2015-battery",
558 struct device *dev = cw_bat->dev; in cw2015_parse_properties()
562 length = device_property_count_u8(dev, "cellwise,battery-profile"); in cw2015_parse_properties()
564 dev_warn(cw_bat->dev, in cw2015_parse_properties()
565 "No battery-profile found, using current flash contents\n"); in cw2015_parse_properties()
567 dev_err(cw_bat->dev, "battery-profile must be %d bytes\n", in cw2015_parse_properties()
569 return -EINVAL; in cw2015_parse_properties()
571 cw_bat->bat_profile = devm_kzalloc(dev, length, GFP_KERNEL); in cw2015_parse_properties()
572 if (!cw_bat->bat_profile) in cw2015_parse_properties()
573 return -ENOMEM; in cw2015_parse_properties()
576 "cellwise,battery-profile", in cw2015_parse_properties()
577 cw_bat->bat_profile, in cw2015_parse_properties()
583 ret = device_property_read_u32(dev, "cellwise,monitor-interval-ms", in cw2015_parse_properties()
584 &cw_bat->poll_interval_ms); in cw2015_parse_properties()
586 dev_dbg(cw_bat->dev, "Using default poll interval\n"); in cw2015_parse_properties()
587 cw_bat->poll_interval_ms = CW2015_DEFAULT_POLL_INTERVAL_MS; in cw2015_parse_properties()
598 CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1),
610 CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1),
633 .max_register = CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1,
642 cw_bat = devm_kzalloc(&client->dev, sizeof(*cw_bat), GFP_KERNEL); in cw_bat_probe()
644 return -ENOMEM; in cw_bat_probe()
647 cw_bat->dev = &client->dev; in cw_bat_probe()
648 cw_bat->soc = 1; in cw_bat_probe()
652 dev_err(cw_bat->dev, "Failed to parse cw2015 properties\n"); in cw_bat_probe()
656 cw_bat->regmap = devm_regmap_init_i2c(client, &cw2015_regmap_config); in cw_bat_probe()
657 if (IS_ERR(cw_bat->regmap)) { in cw_bat_probe()
658 dev_err(cw_bat->dev, "Failed to allocate regmap: %ld\n", in cw_bat_probe()
659 PTR_ERR(cw_bat->regmap)); in cw_bat_probe()
660 return PTR_ERR(cw_bat->regmap); in cw_bat_probe()
665 dev_err(cw_bat->dev, "Init failed: %d\n", ret); in cw_bat_probe()
670 psy_cfg.fwnode = dev_fwnode(cw_bat->dev); in cw_bat_probe()
672 cw_bat->rk_bat = devm_power_supply_register(&client->dev, in cw_bat_probe()
675 if (IS_ERR(cw_bat->rk_bat)) { in cw_bat_probe()
676 dev_err(cw_bat->dev, "Failed to register power supply\n"); in cw_bat_probe()
677 return PTR_ERR(cw_bat->rk_bat); in cw_bat_probe()
680 ret = power_supply_get_battery_info(cw_bat->rk_bat, &cw_bat->battery); in cw_bat_probe()
682 dev_warn(cw_bat->dev, in cw_bat_probe()
686 cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery"); in cw_bat_probe()
687 INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work); in cw_bat_probe()
688 queue_delayed_work(cw_bat->battery_workqueue, in cw_bat_probe()
689 &cw_bat->battery_delay_work, msecs_to_jiffies(10)); in cw_bat_probe()
698 cancel_delayed_work_sync(&cw_bat->battery_delay_work); in cw_bat_suspend()
707 queue_delayed_work(cw_bat->battery_workqueue, in cw_bat_resume()
708 &cw_bat->battery_delay_work, 0); in cw_bat_resume()
718 cancel_delayed_work_sync(&cw_bat->battery_delay_work); in cw_bat_remove()
719 power_supply_put_battery_info(cw_bat->rk_bat, &cw_bat->battery); in cw_bat_remove()
747 MODULE_AUTHOR("xhc<xhc@rock-chips.com>");