Lines Matching refs:di
254 static int ds2760_battery_read_status(struct ds2760_device_info *di) in ds2760_battery_read_status() argument
258 if (di->update_time && time_before(jiffies, di->update_time + in ds2760_battery_read_status()
264 if (di->update_time == 0) { in ds2760_battery_read_status()
272 ret = w1_ds2760_read(di->dev, di->raw + start, start, count); in ds2760_battery_read_status()
274 dev_warn(di->dev, "call to w1_ds2760_read failed (0x%p)\n", in ds2760_battery_read_status()
275 di->dev); in ds2760_battery_read_status()
279 di->update_time = jiffies; in ds2760_battery_read_status()
283 di->voltage_raw = (di->raw[DS2760_VOLTAGE_MSB] << 3) | in ds2760_battery_read_status()
284 (di->raw[DS2760_VOLTAGE_LSB] >> 5); in ds2760_battery_read_status()
285 di->voltage_uV = di->voltage_raw * 4880; in ds2760_battery_read_status()
289 di->current_raw = in ds2760_battery_read_status()
290 (((signed char)di->raw[DS2760_CURRENT_MSB]) << 5) | in ds2760_battery_read_status()
291 (di->raw[DS2760_CURRENT_LSB] >> 3); in ds2760_battery_read_status()
292 di->current_uA = di->current_raw * 625; in ds2760_battery_read_status()
295 di->accum_current_raw = in ds2760_battery_read_status()
296 (((signed char)di->raw[DS2760_CURRENT_ACCUM_MSB]) << 8) | in ds2760_battery_read_status()
297 di->raw[DS2760_CURRENT_ACCUM_LSB]; in ds2760_battery_read_status()
298 di->accum_current_uAh = di->accum_current_raw * 250; in ds2760_battery_read_status()
303 di->temp_raw = (((signed char)di->raw[DS2760_TEMP_MSB]) << 3) | in ds2760_battery_read_status()
304 (di->raw[DS2760_TEMP_LSB] >> 5); in ds2760_battery_read_status()
305 di->temp_C = di->temp_raw + (di->temp_raw / 4); in ds2760_battery_read_status()
309 if (di->raw[DS2760_RATED_CAPACITY] < ARRAY_SIZE(rated_capacities)) in ds2760_battery_read_status()
310 di->rated_capacity = rated_capacities[ in ds2760_battery_read_status()
311 (unsigned int)di->raw[DS2760_RATED_CAPACITY]]; in ds2760_battery_read_status()
313 di->rated_capacity = di->raw[DS2760_RATED_CAPACITY] * 10; in ds2760_battery_read_status()
315 di->rated_capacity *= 1000; /* convert to µAh */ in ds2760_battery_read_status()
318 di->full_active_uAh = di->raw[DS2760_ACTIVE_FULL] << 8 | in ds2760_battery_read_status()
319 di->raw[DS2760_ACTIVE_FULL + 1]; in ds2760_battery_read_status()
324 if (di->full_active_uAh == 0) in ds2760_battery_read_status()
325 di->full_active_uAh = di->rated_capacity / 1000L; in ds2760_battery_read_status()
327 scale[0] = di->full_active_uAh; in ds2760_battery_read_status()
329 scale[i] = scale[i - 1] + di->raw[DS2760_ACTIVE_FULL + 1 + i]; in ds2760_battery_read_status()
331 di->full_active_uAh = battery_interpolate(scale, di->temp_C / 10); in ds2760_battery_read_status()
332 di->full_active_uAh *= 1000; /* convert to µAh */ in ds2760_battery_read_status()
335 scale[4] = di->raw[DS2760_ACTIVE_EMPTY + 4]; in ds2760_battery_read_status()
337 scale[i] = scale[i + 1] + di->raw[DS2760_ACTIVE_EMPTY + i]; in ds2760_battery_read_status()
339 di->empty_uAh = battery_interpolate(scale, di->temp_C / 10); in ds2760_battery_read_status()
340 di->empty_uAh *= 1000; /* convert to µAh */ in ds2760_battery_read_status()
342 if (di->full_active_uAh == di->empty_uAh) in ds2760_battery_read_status()
343 di->rem_capacity = 0; in ds2760_battery_read_status()
347 di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) / in ds2760_battery_read_status()
348 (di->full_active_uAh - di->empty_uAh); in ds2760_battery_read_status()
350 if (di->rem_capacity < 0) in ds2760_battery_read_status()
351 di->rem_capacity = 0; in ds2760_battery_read_status()
352 if (di->rem_capacity > 100) in ds2760_battery_read_status()
353 di->rem_capacity = 100; in ds2760_battery_read_status()
355 if (di->current_uA < -100L) in ds2760_battery_read_status()
356 di->life_sec = -((di->accum_current_uAh - di->empty_uAh) * 36L) in ds2760_battery_read_status()
357 / (di->current_uA / 100L); in ds2760_battery_read_status()
359 di->life_sec = 0; in ds2760_battery_read_status()
364 static void ds2760_battery_set_current_accum(struct ds2760_device_info *di, in ds2760_battery_set_current_accum() argument
376 if (w1_ds2760_write(di->dev, acr, DS2760_CURRENT_ACCUM_MSB, 2) < 2) in ds2760_battery_set_current_accum()
377 dev_warn(di->dev, "ACR write failed\n"); in ds2760_battery_set_current_accum()
380 static void ds2760_battery_update_status(struct ds2760_device_info *di) in ds2760_battery_update_status() argument
382 int old_charge_status = di->charge_status; in ds2760_battery_update_status()
384 ds2760_battery_read_status(di); in ds2760_battery_update_status()
386 if (di->charge_status == POWER_SUPPLY_STATUS_UNKNOWN) in ds2760_battery_update_status()
387 di->full_counter = 0; in ds2760_battery_update_status()
389 if (power_supply_am_i_supplied(di->bat)) { in ds2760_battery_update_status()
390 if (di->current_uA > 10000) { in ds2760_battery_update_status()
391 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; in ds2760_battery_update_status()
392 di->full_counter = 0; in ds2760_battery_update_status()
393 } else if (di->current_uA < -5000) { in ds2760_battery_update_status()
394 if (di->charge_status != POWER_SUPPLY_STATUS_NOT_CHARGING) in ds2760_battery_update_status()
395 dev_notice(di->dev, "not enough power to " in ds2760_battery_update_status()
397 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING; in ds2760_battery_update_status()
398 di->full_counter = 0; in ds2760_battery_update_status()
399 } else if (di->current_uA < 10000 && in ds2760_battery_update_status()
400 di->charge_status != POWER_SUPPLY_STATUS_FULL) { in ds2760_battery_update_status()
406 di->full_counter++; in ds2760_battery_update_status()
408 if (di->full_counter < 2) { in ds2760_battery_update_status()
409 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; in ds2760_battery_update_status()
411 di->charge_status = POWER_SUPPLY_STATUS_FULL; in ds2760_battery_update_status()
412 ds2760_battery_set_current_accum(di, in ds2760_battery_update_status()
413 di->full_active_uAh); in ds2760_battery_update_status()
417 di->charge_status = POWER_SUPPLY_STATUS_DISCHARGING; in ds2760_battery_update_status()
418 di->full_counter = 0; in ds2760_battery_update_status()
421 if (di->charge_status != old_charge_status) in ds2760_battery_update_status()
422 power_supply_changed(di->bat); in ds2760_battery_update_status()
425 static void ds2760_battery_write_status(struct ds2760_device_info *di, in ds2760_battery_write_status() argument
428 if (status == di->raw[DS2760_STATUS_REG]) in ds2760_battery_write_status()
431 w1_ds2760_write(di->dev, &status, DS2760_STATUS_WRITE_REG, 1); in ds2760_battery_write_status()
432 w1_ds2760_store_eeprom(di->dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_write_status()
433 w1_ds2760_recall_eeprom(di->dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_write_status()
436 static void ds2760_battery_write_rated_capacity(struct ds2760_device_info *di, in ds2760_battery_write_rated_capacity() argument
439 if (rated_capacity == di->raw[DS2760_RATED_CAPACITY]) in ds2760_battery_write_rated_capacity()
442 w1_ds2760_write(di->dev, &rated_capacity, DS2760_RATED_CAPACITY, 1); in ds2760_battery_write_rated_capacity()
443 w1_ds2760_store_eeprom(di->dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_write_rated_capacity()
444 w1_ds2760_recall_eeprom(di->dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_write_rated_capacity()
447 static void ds2760_battery_write_active_full(struct ds2760_device_info *di, in ds2760_battery_write_active_full() argument
455 if (tmp[0] == di->raw[DS2760_ACTIVE_FULL] && in ds2760_battery_write_active_full()
456 tmp[1] == di->raw[DS2760_ACTIVE_FULL + 1]) in ds2760_battery_write_active_full()
459 w1_ds2760_write(di->dev, tmp, DS2760_ACTIVE_FULL, sizeof(tmp)); in ds2760_battery_write_active_full()
460 w1_ds2760_store_eeprom(di->dev, DS2760_EEPROM_BLOCK0); in ds2760_battery_write_active_full()
461 w1_ds2760_recall_eeprom(di->dev, DS2760_EEPROM_BLOCK0); in ds2760_battery_write_active_full()
465 di->raw[DS2760_ACTIVE_FULL] = tmp[0]; in ds2760_battery_write_active_full()
466 di->raw[DS2760_ACTIVE_FULL + 1] = tmp[1]; in ds2760_battery_write_active_full()
471 struct ds2760_device_info *di = container_of(work, in ds2760_battery_work() local
475 dev_dbg(di->dev, "%s\n", __func__); in ds2760_battery_work()
477 ds2760_battery_update_status(di); in ds2760_battery_work()
478 queue_delayed_work(di->monitor_wqueue, &di->monitor_work, interval); in ds2760_battery_work()
483 struct ds2760_device_info *di = power_supply_get_drvdata(psy); in ds2760_battery_external_power_changed() local
485 dev_dbg(di->dev, "%s\n", __func__); in ds2760_battery_external_power_changed()
487 mod_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ/10); in ds2760_battery_external_power_changed()
495 struct ds2760_device_info *di = power_supply_get_drvdata(psy); in ds2760_battery_get_property() local
499 val->intval = di->charge_status; in ds2760_battery_get_property()
505 ds2760_battery_read_status(di); in ds2760_battery_get_property()
509 val->intval = di->voltage_uV; in ds2760_battery_get_property()
512 val->intval = di->current_uA; in ds2760_battery_get_property()
515 val->intval = di->rated_capacity; in ds2760_battery_get_property()
518 val->intval = di->full_active_uAh; in ds2760_battery_get_property()
521 val->intval = di->empty_uAh; in ds2760_battery_get_property()
524 val->intval = di->accum_current_uAh; in ds2760_battery_get_property()
527 val->intval = di->temp_C; in ds2760_battery_get_property()
530 val->intval = di->life_sec; in ds2760_battery_get_property()
533 val->intval = di->rem_capacity; in ds2760_battery_get_property()
546 struct ds2760_device_info *di = power_supply_get_drvdata(psy); in ds2760_battery_set_property() local
551 ds2760_battery_write_active_full(di, val->intval / 1000L); in ds2760_battery_set_property()
556 ds2760_battery_set_current_accum(di, val->intval); in ds2760_battery_set_property()
598 struct ds2760_device_info *di = in ds2760_pm_notifier() local
604 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN; in ds2760_pm_notifier()
610 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN; in ds2760_pm_notifier()
611 power_supply_changed(di->bat); in ds2760_pm_notifier()
612 mod_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ); in ds2760_pm_notifier()
627 struct ds2760_device_info *di; in w1_ds2760_add_slave() local
633 di = devm_kzalloc(dev, sizeof(*di), GFP_KERNEL); in w1_ds2760_add_slave()
634 if (!di) { in w1_ds2760_add_slave()
641 di->dev = dev; in w1_ds2760_add_slave()
642 di->bat_desc.name = name; in w1_ds2760_add_slave()
643 di->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY; in w1_ds2760_add_slave()
644 di->bat_desc.properties = ds2760_battery_props; in w1_ds2760_add_slave()
645 di->bat_desc.num_properties = ARRAY_SIZE(ds2760_battery_props); in w1_ds2760_add_slave()
646 di->bat_desc.get_property = ds2760_battery_get_property; in w1_ds2760_add_slave()
647 di->bat_desc.set_property = ds2760_battery_set_property; in w1_ds2760_add_slave()
648 di->bat_desc.property_is_writeable = in w1_ds2760_add_slave()
650 di->bat_desc.external_power_changed = in w1_ds2760_add_slave()
653 psy_cfg.drv_data = di; in w1_ds2760_add_slave()
672 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN; in w1_ds2760_add_slave()
674 sl->family_data = di; in w1_ds2760_add_slave()
677 ds2760_battery_read_status(di); in w1_ds2760_add_slave()
678 status = di->raw[DS2760_STATUS_REG]; in w1_ds2760_add_slave()
684 ds2760_battery_write_status(di, status); in w1_ds2760_add_slave()
688 ds2760_battery_write_rated_capacity(di, rated_capacity); in w1_ds2760_add_slave()
693 ds2760_battery_set_current_accum(di, current_accum); in w1_ds2760_add_slave()
695 di->bat = devm_power_supply_register(dev, &di->bat_desc, &psy_cfg); in w1_ds2760_add_slave()
696 if (IS_ERR(di->bat)) { in w1_ds2760_add_slave()
697 dev_err(di->dev, "failed to register battery\n"); in w1_ds2760_add_slave()
698 retval = PTR_ERR(di->bat); in w1_ds2760_add_slave()
702 INIT_DELAYED_WORK(&di->monitor_work, ds2760_battery_work); in w1_ds2760_add_slave()
703 di->monitor_wqueue = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM); in w1_ds2760_add_slave()
704 if (!di->monitor_wqueue) { in w1_ds2760_add_slave()
708 queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ * 1); in w1_ds2760_add_slave()
710 di->pm_notifier.notifier_call = ds2760_pm_notifier; in w1_ds2760_add_slave()
711 register_pm_notifier(&di->pm_notifier); in w1_ds2760_add_slave()
724 struct ds2760_device_info *di = sl->family_data; in w1_ds2760_remove_slave() local
726 unregister_pm_notifier(&di->pm_notifier); in w1_ds2760_remove_slave()
727 cancel_delayed_work_sync(&di->monitor_work); in w1_ds2760_remove_slave()
728 destroy_workqueue(di->monitor_wqueue); in w1_ds2760_remove_slave()