Lines Matching refs:di

255 static int ds2760_battery_read_status(struct ds2760_device_info *di)
259 if (di->update_time && time_before(jiffies, di->update_time +
265 if (di->update_time == 0) {
273 ret = w1_ds2760_read(di->dev, di->raw + start, start, count);
275 dev_warn(di->dev, "call to w1_ds2760_read failed (0x%p)\n",
276 di->dev);
280 di->update_time = jiffies;
284 di->voltage_raw = (di->raw[DS2760_VOLTAGE_MSB] << 3) |
285 (di->raw[DS2760_VOLTAGE_LSB] >> 5);
286 di->voltage_uV = di->voltage_raw * 4880;
290 di->current_raw =
291 (((signed char)di->raw[DS2760_CURRENT_MSB]) << 5) |
292 (di->raw[DS2760_CURRENT_LSB] >> 3);
293 di->current_uA = di->current_raw * 625;
296 di->accum_current_raw =
297 (((signed char)di->raw[DS2760_CURRENT_ACCUM_MSB]) << 8) |
298 di->raw[DS2760_CURRENT_ACCUM_LSB];
299 di->accum_current_uAh = di->accum_current_raw * 250;
304 di->temp_raw = (((signed char)di->raw[DS2760_TEMP_MSB]) << 3) |
305 (di->raw[DS2760_TEMP_LSB] >> 5);
306 di->temp_C = di->temp_raw + (di->temp_raw / 4);
310 if (di->raw[DS2760_RATED_CAPACITY] < ARRAY_SIZE(rated_capacities))
311 di->rated_capacity = rated_capacities[
312 (unsigned int)di->raw[DS2760_RATED_CAPACITY]];
314 di->rated_capacity = di->raw[DS2760_RATED_CAPACITY] * 10;
316 di->rated_capacity *= 1000; /* convert to µAh */
319 di->full_active_uAh = di->raw[DS2760_ACTIVE_FULL] << 8 |
320 di->raw[DS2760_ACTIVE_FULL + 1];
325 if (di->full_active_uAh == 0)
326 di->full_active_uAh = di->rated_capacity / 1000L;
328 scale[0] = di->full_active_uAh;
330 scale[i] = scale[i - 1] + di->raw[DS2760_ACTIVE_FULL + 1 + i];
332 di->full_active_uAh = battery_interpolate(scale, di->temp_C / 10);
333 di->full_active_uAh *= 1000; /* convert to µAh */
336 scale[4] = di->raw[DS2760_ACTIVE_EMPTY + 4];
338 scale[i] = scale[i + 1] + di->raw[DS2760_ACTIVE_EMPTY + i];
340 di->empty_uAh = battery_interpolate(scale, di->temp_C / 10);
341 di->empty_uAh *= 1000; /* convert to µAh */
343 if (di->full_active_uAh == di->empty_uAh)
344 di->rem_capacity = 0;
348 di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) /
349 (di->full_active_uAh - di->empty_uAh);
351 if (di->rem_capacity < 0)
352 di->rem_capacity = 0;
353 if (di->rem_capacity > 100)
354 di->rem_capacity = 100;
356 if (di->current_uA < -100L)
357 di->life_sec = -((di->accum_current_uAh - di->empty_uAh) * 36L)
358 / (di->current_uA / 100L);
360 di->life_sec = 0;
365 static void ds2760_battery_set_current_accum(struct ds2760_device_info *di,
377 if (w1_ds2760_write(di->dev, acr, DS2760_CURRENT_ACCUM_MSB, 2) < 2)
378 dev_warn(di->dev, "ACR write failed\n");
381 static void ds2760_battery_update_status(struct ds2760_device_info *di)
383 int old_charge_status = di->charge_status;
385 ds2760_battery_read_status(di);
387 if (di->charge_status == POWER_SUPPLY_STATUS_UNKNOWN)
388 di->full_counter = 0;
390 if (power_supply_am_i_supplied(di->bat)) {
391 if (di->current_uA > 10000) {
392 di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
393 di->full_counter = 0;
394 } else if (di->current_uA < -5000) {
395 if (di->charge_status != POWER_SUPPLY_STATUS_NOT_CHARGING)
396 dev_notice(di->dev, "not enough power to "
398 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
399 di->full_counter = 0;
400 } else if (di->current_uA < 10000 &&
401 di->charge_status != POWER_SUPPLY_STATUS_FULL) {
407 di->full_counter++;
409 if (di->full_counter < 2) {
410 di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
412 di->charge_status = POWER_SUPPLY_STATUS_FULL;
413 ds2760_battery_set_current_accum(di,
414 di->full_active_uAh);
418 di->charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
419 di->full_counter = 0;
422 if (di->charge_status != old_charge_status)
423 power_supply_changed(di->bat);
426 static void ds2760_battery_write_status(struct ds2760_device_info *di,
429 if (status == di->raw[DS2760_STATUS_REG])
432 w1_ds2760_write(di->dev, &status, DS2760_STATUS_WRITE_REG, 1);
433 w1_ds2760_store_eeprom(di->dev, DS2760_EEPROM_BLOCK1);
434 w1_ds2760_recall_eeprom(di->dev, DS2760_EEPROM_BLOCK1);
437 static void ds2760_battery_write_rated_capacity(struct ds2760_device_info *di,
440 if (rated_capacity == di->raw[DS2760_RATED_CAPACITY])
443 w1_ds2760_write(di->dev, &rated_capacity, DS2760_RATED_CAPACITY, 1);
444 w1_ds2760_store_eeprom(di->dev, DS2760_EEPROM_BLOCK1);
445 w1_ds2760_recall_eeprom(di->dev, DS2760_EEPROM_BLOCK1);
448 static void ds2760_battery_write_active_full(struct ds2760_device_info *di,
456 if (tmp[0] == di->raw[DS2760_ACTIVE_FULL] &&
457 tmp[1] == di->raw[DS2760_ACTIVE_FULL + 1])
460 w1_ds2760_write(di->dev, tmp, DS2760_ACTIVE_FULL, sizeof(tmp));
461 w1_ds2760_store_eeprom(di->dev, DS2760_EEPROM_BLOCK0);
462 w1_ds2760_recall_eeprom(di->dev, DS2760_EEPROM_BLOCK0);
464 /* Write to the di->raw[] buffer directly - the DS2760_ACTIVE_FULL
466 di->raw[DS2760_ACTIVE_FULL] = tmp[0];
467 di->raw[DS2760_ACTIVE_FULL + 1] = tmp[1];
472 struct ds2760_device_info *di = container_of(work,
476 dev_dbg(di->dev, "%s\n", __func__);
478 ds2760_battery_update_status(di);
479 queue_delayed_work(di->monitor_wqueue, &di->monitor_work, interval);
484 struct ds2760_device_info *di = power_supply_get_drvdata(psy);
486 dev_dbg(di->dev, "%s\n", __func__);
488 mod_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ/10);
495 struct ds2760_device_info *di = container_of(work,
498 dev_dbg(di->dev, "%s\n", __func__);
500 ds2760_battery_read_status(di);
510 if (!power_supply_am_i_supplied(di->bat))
513 bias = (signed char) di->current_raw +
514 (signed char) di->raw[DS2760_CURRENT_OFFSET_BIAS];
516 dev_dbg(di->dev, "%s: bias = %d\n", __func__, bias);
518 w1_ds2760_write(di->dev, &bias, DS2760_CURRENT_OFFSET_BIAS, 1);
519 w1_ds2760_store_eeprom(di->dev, DS2760_EEPROM_BLOCK1);
520 w1_ds2760_recall_eeprom(di->dev, DS2760_EEPROM_BLOCK1);
522 /* Write to the di->raw[] buffer directly - the CURRENT_OFFSET_BIAS
524 di->raw[DS2760_CURRENT_OFFSET_BIAS] = bias;
529 struct ds2760_device_info *di = power_supply_get_drvdata(psy);
533 mod_delayed_work(di->monitor_wqueue, &di->set_charged_work, HZ * 20);
540 struct ds2760_device_info *di = power_supply_get_drvdata(psy);
544 val->intval = di->charge_status;
550 ds2760_battery_read_status(di);
554 val->intval = di->voltage_uV;
557 val->intval = di->current_uA;
560 val->intval = di->rated_capacity;
563 val->intval = di->full_active_uAh;
566 val->intval = di->empty_uAh;
569 val->intval = di->accum_current_uAh;
572 val->intval = di->temp_C;
575 val->intval = di->life_sec;
578 val->intval = di->rem_capacity;
591 struct ds2760_device_info *di = power_supply_get_drvdata(psy);
596 ds2760_battery_write_active_full(di, val->intval / 1000L);
601 ds2760_battery_set_current_accum(di, val->intval);
643 struct ds2760_device_info *di =
649 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
655 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
656 power_supply_changed(di->bat);
657 mod_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ);
672 struct ds2760_device_info *di;
678 di = devm_kzalloc(dev, sizeof(*di), GFP_KERNEL);
679 if (!di) {
686 di->dev = dev;
687 di->bat_desc.name = name;
688 di->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY;
689 di->bat_desc.properties = ds2760_battery_props;
690 di->bat_desc.num_properties = ARRAY_SIZE(ds2760_battery_props);
691 di->bat_desc.get_property = ds2760_battery_get_property;
692 di->bat_desc.set_property = ds2760_battery_set_property;
693 di->bat_desc.property_is_writeable =
695 di->bat_desc.set_charged = ds2760_battery_set_charged;
696 di->bat_desc.external_power_changed =
699 psy_cfg.drv_data = di;
719 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
721 sl->family_data = di;
724 ds2760_battery_read_status(di);
725 status = di->raw[DS2760_STATUS_REG];
731 ds2760_battery_write_status(di, status);
735 ds2760_battery_write_rated_capacity(di, rated_capacity);
740 ds2760_battery_set_current_accum(di, current_accum);
742 di->bat = power_supply_register(dev, &di->bat_desc, &psy_cfg);
743 if (IS_ERR(di->bat)) {
744 dev_err(di->dev, "failed to register battery\n");
745 retval = PTR_ERR(di->bat);
749 INIT_DELAYED_WORK(&di->monitor_work, ds2760_battery_work);
750 INIT_DELAYED_WORK(&di->set_charged_work,
752 di->monitor_wqueue = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM);
753 if (!di->monitor_wqueue) {
757 queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ * 1);
759 di->pm_notifier.notifier_call = ds2760_pm_notifier;
760 register_pm_notifier(&di->pm_notifier);
765 power_supply_unregister(di->bat);
774 struct ds2760_device_info *di = sl->family_data;
776 unregister_pm_notifier(&di->pm_notifier);
777 cancel_delayed_work_sync(&di->monitor_work);
778 cancel_delayed_work_sync(&di->set_charged_work);
779 destroy_workqueue(di->monitor_wqueue);
780 power_supply_unregister(di->bat);