Lines Matching refs:cw_bat
84 static int cw_read_word(struct cw_battery *cw_bat, u8 reg, u16 *val)
89 ret = regmap_bulk_read(cw_bat->regmap, reg, &value, sizeof(value));
97 static int cw_update_profile(struct cw_battery *cw_bat)
104 ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, ®_val);
110 dev_err(cw_bat->dev,
116 ret = regmap_raw_write(cw_bat->regmap, CW2015_REG_BATINFO,
117 cw_bat->bat_profile,
125 reg_val |= CW2015_ATHD(cw_bat->alert_level);
126 ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val);
133 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
141 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
146 ret = regmap_read_poll_timeout(cw_bat->regmap, CW2015_REG_SOC,
150 dev_err(cw_bat->dev,
153 dev_dbg(cw_bat->dev, "Battery profile updated\n");
158 static int cw_init(struct cw_battery *cw_bat)
165 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
170 ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, ®_val);
174 if ((reg_val & CW2015_MASK_ATHD) != CW2015_ATHD(cw_bat->alert_level)) {
175 dev_dbg(cw_bat->dev, "Setting new alert level\n");
177 reg_val |= ~CW2015_ATHD(cw_bat->alert_level);
178 ret = regmap_write(cw_bat->regmap, CW2015_REG_CONFIG, reg_val);
183 ret = regmap_read(cw_bat->regmap, CW2015_REG_CONFIG, ®_val);
188 dev_dbg(cw_bat->dev,
190 if (cw_bat->bat_profile) {
191 ret = cw_update_profile(cw_bat);
193 dev_err(cw_bat->dev,
198 dev_warn(cw_bat->dev,
201 } else if (cw_bat->bat_profile) {
204 ret = regmap_raw_read(cw_bat->regmap, CW2015_REG_BATINFO,
207 dev_err(cw_bat->dev,
212 if (memcmp(bat_info, cw_bat->bat_profile, CW2015_SIZE_BATINFO)) {
213 dev_warn(cw_bat->dev, "Replacing stored battery profile\n");
214 ret = cw_update_profile(cw_bat);
219 dev_warn(cw_bat->dev,
223 dev_dbg(cw_bat->dev, "Battery profile configured\n");
227 static int cw_power_on_reset(struct cw_battery *cw_bat)
233 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
241 ret = regmap_write(cw_bat->regmap, CW2015_REG_MODE, reset_val);
245 ret = cw_init(cw_bat);
254 static int cw_get_soc(struct cw_battery *cw_bat)
259 ret = regmap_read(cw_bat->regmap, CW2015_REG_SOC, &soc);
265 CW2015_BAT_SOC_ERROR_MS / cw_bat->poll_interval_ms;
267 dev_err(cw_bat->dev, "Invalid SoC %d%%\n", soc);
268 cw_bat->read_errors++;
269 if (cw_bat->read_errors > max_error_cycles) {
270 dev_warn(cw_bat->dev,
272 cw_power_on_reset(cw_bat);
273 cw_bat->read_errors = 0;
275 return cw_bat->soc;
277 cw_bat->read_errors = 0;
280 if (cw_bat->status == POWER_SUPPLY_STATUS_CHARGING && soc == cw_bat->soc) {
282 CW2015_BAT_CHARGING_STUCK_MS / cw_bat->poll_interval_ms;
284 cw_bat->charge_stuck_cnt++;
285 if (cw_bat->charge_stuck_cnt > max_stuck_cycles) {
286 dev_warn(cw_bat->dev,
288 cw_power_on_reset(cw_bat);
289 cw_bat->charge_stuck_cnt = 0;
292 cw_bat->charge_stuck_cnt = 0;
296 if (cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 0, 3))
297 soc = cw_bat->soc;
300 if (!cw_bat->charger_attached && HYSTERESIS(soc, cw_bat->soc, 3, 0))
301 soc = cw_bat->soc;
306 static int cw_get_voltage(struct cw_battery *cw_bat)
313 ret = cw_read_word(cw_bat, CW2015_REG_VCELL, ®_val);
328 dev_dbg(cw_bat->dev, "Read voltage: %d mV, raw=0x%04x\n",
333 static int cw_get_time_to_empty(struct cw_battery *cw_bat)
338 ret = cw_read_word(cw_bat, CW2015_REG_RRT_ALERT, &value16);
345 static void cw_update_charge_status(struct cw_battery *cw_bat)
349 ret = power_supply_am_i_supplied(cw_bat->rk_bat);
351 dev_warn(cw_bat->dev, "Failed to get supply state: %d\n", ret);
356 if (cw_bat->charger_attached != charger_attached) {
357 cw_bat->battery_changed = true;
359 cw_bat->charge_count++;
361 cw_bat->charger_attached = charger_attached;
365 static void cw_update_soc(struct cw_battery *cw_bat)
369 soc = cw_get_soc(cw_bat);
371 dev_err(cw_bat->dev, "Failed to get SoC from gauge: %d\n", soc);
372 else if (cw_bat->soc != soc) {
373 cw_bat->soc = soc;
374 cw_bat->battery_changed = true;
378 static void cw_update_voltage(struct cw_battery *cw_bat)
382 voltage_mv = cw_get_voltage(cw_bat);
384 dev_err(cw_bat->dev, "Failed to get voltage from gauge: %d\n",
387 cw_bat->voltage_mv = voltage_mv;
390 static void cw_update_status(struct cw_battery *cw_bat)
394 if (cw_bat->charger_attached) {
395 if (cw_bat->soc >= 100)
401 if (cw_bat->status != status)
402 cw_bat->battery_changed = true;
403 cw_bat->status = status;
406 static void cw_update_time_to_empty(struct cw_battery *cw_bat)
410 time_to_empty = cw_get_time_to_empty(cw_bat);
412 dev_err(cw_bat->dev, "Failed to get time to empty from gauge: %d\n",
414 else if (cw_bat->time_to_empty != time_to_empty) {
415 cw_bat->time_to_empty = time_to_empty;
416 cw_bat->battery_changed = true;
423 struct cw_battery *cw_bat;
428 cw_bat = container_of(delay_work, struct cw_battery, battery_delay_work);
429 ret = regmap_read(cw_bat->regmap, CW2015_REG_MODE, ®_val);
431 dev_err(cw_bat->dev, "Failed to read mode from gauge: %d\n", ret);
437 if (!cw_power_on_reset(cw_bat))
441 cw_update_soc(cw_bat);
442 cw_update_voltage(cw_bat);
443 cw_update_charge_status(cw_bat);
444 cw_update_status(cw_bat);
445 cw_update_time_to_empty(cw_bat);
447 dev_dbg(cw_bat->dev, "charger_attached = %d\n", cw_bat->charger_attached);
448 dev_dbg(cw_bat->dev, "status = %d\n", cw_bat->status);
449 dev_dbg(cw_bat->dev, "soc = %d%%\n", cw_bat->soc);
450 dev_dbg(cw_bat->dev, "voltage = %dmV\n", cw_bat->voltage_mv);
452 if (cw_bat->battery_changed)
453 power_supply_changed(cw_bat->rk_bat);
454 cw_bat->battery_changed = false;
456 queue_delayed_work(cw_bat->battery_workqueue,
457 &cw_bat->battery_delay_work,
458 msecs_to_jiffies(cw_bat->poll_interval_ms));
461 static bool cw_battery_valid_time_to_empty(struct cw_battery *cw_bat)
463 return cw_bat->time_to_empty > 0 &&
464 cw_bat->time_to_empty < CW2015_MASK_SOC &&
465 cw_bat->status == POWER_SUPPLY_STATUS_DISCHARGING;
472 struct cw_battery *cw_bat;
474 cw_bat = power_supply_get_drvdata(psy);
477 val->intval = cw_bat->soc;
481 val->intval = cw_bat->status;
485 val->intval = !!cw_bat->voltage_mv;
489 val->intval = cw_bat->voltage_mv * 1000;
493 if (cw_battery_valid_time_to_empty(cw_bat))
494 val->intval = cw_bat->time_to_empty * 60;
504 val->intval = cw_bat->charge_count;
509 if (cw_bat->battery->charge_full_design_uah > 0)
510 val->intval = cw_bat->battery->charge_full_design_uah;
516 val->intval = cw_bat->battery->charge_full_design_uah;
517 val->intval = val->intval * cw_bat->soc / 100;
521 if (cw_battery_valid_time_to_empty(cw_bat) &&
522 cw_bat->battery->charge_full_design_uah > 0) {
524 val->intval = cw_bat->battery->charge_full_design_uah;
525 val->intval = val->intval * cw_bat->soc / 100;
528 val->intval = 60 * val->intval / cw_bat->time_to_empty;
563 static int cw2015_parse_properties(struct cw_battery *cw_bat)
565 struct device *dev = cw_bat->dev;
571 dev_warn(cw_bat->dev,
574 dev_err(cw_bat->dev, "battery-profile must be %d bytes\n",
578 cw_bat->bat_profile = devm_kzalloc(dev, length, GFP_KERNEL);
579 if (!cw_bat->bat_profile)
584 cw_bat->bat_profile,
591 &cw_bat->poll_interval_ms);
593 dev_dbg(cw_bat->dev, "Using default poll interval\n");
594 cw_bat->poll_interval_ms = CW2015_DEFAULT_POLL_INTERVAL_MS;
646 struct cw_battery *cw_bat;
649 cw_bat = devm_kzalloc(&client->dev, sizeof(*cw_bat), GFP_KERNEL);
650 if (!cw_bat)
653 i2c_set_clientdata(client, cw_bat);
654 cw_bat->dev = &client->dev;
655 cw_bat->soc = 1;
657 ret = cw2015_parse_properties(cw_bat);
659 dev_err(cw_bat->dev, "Failed to parse cw2015 properties\n");
663 cw_bat->regmap = devm_regmap_init_i2c(client, &cw2015_regmap_config);
664 if (IS_ERR(cw_bat->regmap)) {
665 dev_err(cw_bat->dev, "Failed to allocate regmap: %ld\n",
666 PTR_ERR(cw_bat->regmap));
667 return PTR_ERR(cw_bat->regmap);
670 ret = cw_init(cw_bat);
672 dev_err(cw_bat->dev, "Init failed: %d\n", ret);
676 psy_cfg.drv_data = cw_bat;
677 psy_cfg.fwnode = dev_fwnode(cw_bat->dev);
679 cw_bat->rk_bat = devm_power_supply_register(&client->dev,
682 if (IS_ERR(cw_bat->rk_bat)) {
684 dev_err_probe(&client->dev, PTR_ERR(cw_bat->rk_bat),
686 return PTR_ERR(cw_bat->rk_bat);
689 ret = power_supply_get_battery_info(cw_bat->rk_bat, &cw_bat->battery);
692 cw_bat->battery = devm_kzalloc(&client->dev,
693 sizeof(*cw_bat->battery),
695 if (!cw_bat->battery)
697 dev_warn(cw_bat->dev,
701 cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery");
702 if (!cw_bat->battery_workqueue)
706 &cw_bat->battery_delay_work, cw_bat_work);
707 queue_delayed_work(cw_bat->battery_workqueue,
708 &cw_bat->battery_delay_work, msecs_to_jiffies(10));
715 struct cw_battery *cw_bat = i2c_get_clientdata(client);
717 cancel_delayed_work_sync(&cw_bat->battery_delay_work);
724 struct cw_battery *cw_bat = i2c_get_clientdata(client);
726 queue_delayed_work(cw_bat->battery_workqueue,
727 &cw_bat->battery_delay_work, 0);