Lines Matching refs:battery

155 static inline int acpi_battery_present(struct acpi_battery *battery)  in acpi_battery_present()  argument
157 return battery->device->status.battery_present; in acpi_battery_present()
160 static int acpi_battery_technology(struct acpi_battery *battery) in acpi_battery_technology() argument
162 if (!strcasecmp("NiCd", battery->type)) in acpi_battery_technology()
164 if (!strcasecmp("NiMH", battery->type)) in acpi_battery_technology()
166 if (!strcasecmp("LION", battery->type)) in acpi_battery_technology()
168 if (!strncasecmp("LI-ION", battery->type, 6)) in acpi_battery_technology()
170 if (!strcasecmp("LiP", battery->type)) in acpi_battery_technology()
175 static int acpi_battery_get_state(struct acpi_battery *battery);
177 static int acpi_battery_is_charged(struct acpi_battery *battery) in acpi_battery_is_charged() argument
180 if (battery->state != 0) in acpi_battery_is_charged()
184 if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN || in acpi_battery_is_charged()
185 battery->capacity_now == 0) in acpi_battery_is_charged()
189 if (battery->full_charge_capacity == battery->capacity_now) in acpi_battery_is_charged()
193 if (battery->design_capacity == battery->capacity_now) in acpi_battery_is_charged()
205 struct acpi_battery *battery = to_acpi_battery(psy); in acpi_battery_get_property() local
207 if (acpi_battery_present(battery)) { in acpi_battery_get_property()
209 acpi_battery_get_state(battery); in acpi_battery_get_property()
214 if (battery->state & ACPI_BATTERY_STATE_DISCHARGING) in acpi_battery_get_property()
216 else if (battery->state & ACPI_BATTERY_STATE_CHARGING) in acpi_battery_get_property()
218 else if (acpi_battery_is_charged(battery)) in acpi_battery_get_property()
224 val->intval = acpi_battery_present(battery); in acpi_battery_get_property()
227 val->intval = acpi_battery_technology(battery); in acpi_battery_get_property()
230 val->intval = battery->cycle_count; in acpi_battery_get_property()
233 if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
236 val->intval = battery->design_voltage * 1000; in acpi_battery_get_property()
239 if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
242 val->intval = battery->voltage_now * 1000; in acpi_battery_get_property()
246 if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
249 val->intval = battery->rate_now * 1000; in acpi_battery_get_property()
253 if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
256 val->intval = battery->design_capacity * 1000; in acpi_battery_get_property()
260 if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
263 val->intval = battery->full_charge_capacity * 1000; in acpi_battery_get_property()
267 if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
270 val->intval = battery->capacity_now * 1000; in acpi_battery_get_property()
273 if (battery->capacity_now && battery->full_charge_capacity) in acpi_battery_get_property()
274 val->intval = battery->capacity_now * 100/ in acpi_battery_get_property()
275 battery->full_charge_capacity; in acpi_battery_get_property()
280 if (battery->state & ACPI_BATTERY_STATE_CRITICAL) in acpi_battery_get_property()
282 else if (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) && in acpi_battery_get_property()
283 (battery->capacity_now <= battery->alarm)) in acpi_battery_get_property()
285 else if (acpi_battery_is_charged(battery)) in acpi_battery_get_property()
291 val->strval = battery->model_number; in acpi_battery_get_property()
294 val->strval = battery->oem_info; in acpi_battery_get_property()
297 val->strval = battery->serial_number; in acpi_battery_get_property()
342 inline char *acpi_battery_units(struct acpi_battery *battery) in acpi_battery_units() argument
344 return (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) ? in acpi_battery_units()
403 static int extract_package(struct acpi_battery *battery, in extract_package() argument
416 u8 *ptr = (u8 *)battery + offsets[i].offset; in extract_package()
427 int *x = (int *)((u8 *)battery + offsets[i].offset); in extract_package()
435 static int acpi_battery_get_status(struct acpi_battery *battery) in acpi_battery_get_status() argument
437 if (acpi_bus_get_status(battery->device)) { in acpi_battery_get_status()
444 static int acpi_battery_get_info(struct acpi_battery *battery) in acpi_battery_get_info() argument
448 char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags) ? in acpi_battery_get_info()
453 if (!acpi_battery_present(battery)) in acpi_battery_get_info()
455 mutex_lock(&battery->lock); in acpi_battery_get_info()
456 status = acpi_evaluate_object(battery->device->handle, name, in acpi_battery_get_info()
458 mutex_unlock(&battery->lock); in acpi_battery_get_info()
466 result = extract_package(battery, buffer.pointer, in acpi_battery_get_info()
469 else if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags)) in acpi_battery_get_info()
470 result = extract_package(battery, buffer.pointer, in acpi_battery_get_info()
474 result = extract_package(battery, buffer.pointer, in acpi_battery_get_info()
477 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) in acpi_battery_get_info()
478 battery->full_charge_capacity = battery->design_capacity; in acpi_battery_get_info()
479 if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && in acpi_battery_get_info()
480 battery->power_unit && battery->design_voltage) { in acpi_battery_get_info()
481 battery->design_capacity = battery->design_capacity * in acpi_battery_get_info()
482 10000 / battery->design_voltage; in acpi_battery_get_info()
483 battery->full_charge_capacity = battery->full_charge_capacity * in acpi_battery_get_info()
484 10000 / battery->design_voltage; in acpi_battery_get_info()
485 battery->design_capacity_warning = in acpi_battery_get_info()
486 battery->design_capacity_warning * in acpi_battery_get_info()
487 10000 / battery->design_voltage; in acpi_battery_get_info()
497 static int acpi_battery_get_state(struct acpi_battery *battery) in acpi_battery_get_state() argument
503 if (!acpi_battery_present(battery)) in acpi_battery_get_state()
506 if (battery->update_time && in acpi_battery_get_state()
507 time_before(jiffies, battery->update_time + in acpi_battery_get_state()
511 mutex_lock(&battery->lock); in acpi_battery_get_state()
512 status = acpi_evaluate_object(battery->device->handle, "_BST", in acpi_battery_get_state()
514 mutex_unlock(&battery->lock); in acpi_battery_get_state()
521 result = extract_package(battery, buffer.pointer, in acpi_battery_get_state()
523 battery->update_time = jiffies; in acpi_battery_get_state()
530 if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA && in acpi_battery_get_state()
531 battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN && in acpi_battery_get_state()
532 (s16)(battery->rate_now) < 0) { in acpi_battery_get_state()
533 battery->rate_now = abs((s16)battery->rate_now); in acpi_battery_get_state()
538 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) in acpi_battery_get_state()
539 && battery->capacity_now >= 0 && battery->capacity_now <= 100) in acpi_battery_get_state()
540 battery->capacity_now = (battery->capacity_now * in acpi_battery_get_state()
541 battery->full_charge_capacity) / 100; in acpi_battery_get_state()
542 if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && in acpi_battery_get_state()
543 battery->power_unit && battery->design_voltage) { in acpi_battery_get_state()
544 battery->capacity_now = battery->capacity_now * in acpi_battery_get_state()
545 10000 / battery->design_voltage; in acpi_battery_get_state()
550 static int acpi_battery_set_alarm(struct acpi_battery *battery) in acpi_battery_set_alarm() argument
554 if (!acpi_battery_present(battery) || in acpi_battery_set_alarm()
555 !test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags)) in acpi_battery_set_alarm()
558 mutex_lock(&battery->lock); in acpi_battery_set_alarm()
559 status = acpi_execute_simple_method(battery->device->handle, "_BTP", in acpi_battery_set_alarm()
560 battery->alarm); in acpi_battery_set_alarm()
561 mutex_unlock(&battery->lock); in acpi_battery_set_alarm()
566 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Alarm set to %d\n", battery->alarm)); in acpi_battery_set_alarm()
570 static int acpi_battery_init_alarm(struct acpi_battery *battery) in acpi_battery_init_alarm() argument
573 if (!acpi_has_method(battery->device->handle, "_BTP")) { in acpi_battery_init_alarm()
574 clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags); in acpi_battery_init_alarm()
577 set_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags); in acpi_battery_init_alarm()
578 if (!battery->alarm) in acpi_battery_init_alarm()
579 battery->alarm = battery->design_capacity_warning; in acpi_battery_init_alarm()
580 return acpi_battery_set_alarm(battery); in acpi_battery_init_alarm()
587 struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); in acpi_battery_alarm_show() local
588 return sprintf(buf, "%d\n", battery->alarm * 1000); in acpi_battery_alarm_show()
596 struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); in acpi_battery_alarm_store() local
598 battery->alarm = x/1000; in acpi_battery_alarm_store()
599 if (acpi_battery_present(battery)) in acpi_battery_alarm_store()
600 acpi_battery_set_alarm(battery); in acpi_battery_alarm_store()
610 static int sysfs_add_battery(struct acpi_battery *battery) in sysfs_add_battery() argument
612 struct power_supply_config psy_cfg = { .drv_data = battery, }; in sysfs_add_battery()
614 if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) { in sysfs_add_battery()
615 battery->bat_desc.properties = charge_battery_props; in sysfs_add_battery()
616 battery->bat_desc.num_properties = in sysfs_add_battery()
619 battery->bat_desc.properties = energy_battery_props; in sysfs_add_battery()
620 battery->bat_desc.num_properties = in sysfs_add_battery()
624 battery->bat_desc.name = acpi_device_bid(battery->device); in sysfs_add_battery()
625 battery->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY; in sysfs_add_battery()
626 battery->bat_desc.get_property = acpi_battery_get_property; in sysfs_add_battery()
628 battery->bat = power_supply_register_no_ws(&battery->device->dev, in sysfs_add_battery()
629 &battery->bat_desc, &psy_cfg); in sysfs_add_battery()
631 if (IS_ERR(battery->bat)) { in sysfs_add_battery()
632 int result = PTR_ERR(battery->bat); in sysfs_add_battery()
634 battery->bat = NULL; in sysfs_add_battery()
637 return device_create_file(&battery->bat->dev, &alarm_attr); in sysfs_add_battery()
640 static void sysfs_remove_battery(struct acpi_battery *battery) in sysfs_remove_battery() argument
642 mutex_lock(&battery->sysfs_lock); in sysfs_remove_battery()
643 if (!battery->bat) { in sysfs_remove_battery()
644 mutex_unlock(&battery->sysfs_lock); in sysfs_remove_battery()
648 device_remove_file(&battery->bat->dev, &alarm_attr); in sysfs_remove_battery()
649 power_supply_unregister(battery->bat); in sysfs_remove_battery()
650 battery->bat = NULL; in sysfs_remove_battery()
651 mutex_unlock(&battery->sysfs_lock); in sysfs_remove_battery()
656 struct acpi_battery *battery = (struct acpi_battery *)private; in find_battery() local
664 if (battery->design_capacity * battery->design_voltage / 1000 in find_battery()
666 battery->design_capacity * 10 == dmi_capacity) in find_battery()
668 &battery->flags); in find_battery()
684 static void acpi_battery_quirks(struct acpi_battery *battery) in acpi_battery_quirks() argument
686 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) in acpi_battery_quirks()
689 if (battery->full_charge_capacity == 100 && in acpi_battery_quirks()
690 battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN && in acpi_battery_quirks()
691 battery->capacity_now >= 0 && battery->capacity_now <= 100) { in acpi_battery_quirks()
692 set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags); in acpi_battery_quirks()
693 battery->full_charge_capacity = battery->design_capacity; in acpi_battery_quirks()
694 battery->capacity_now = (battery->capacity_now * in acpi_battery_quirks()
695 battery->full_charge_capacity) / 100; in acpi_battery_quirks()
698 if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags)) in acpi_battery_quirks()
701 if (battery->power_unit && dmi_name_in_vendors("LENOVO")) { in acpi_battery_quirks()
705 dmi_walk(find_battery, battery); in acpi_battery_quirks()
707 &battery->flags) && in acpi_battery_quirks()
708 battery->design_voltage) { in acpi_battery_quirks()
709 battery->design_capacity = in acpi_battery_quirks()
710 battery->design_capacity * in acpi_battery_quirks()
711 10000 / battery->design_voltage; in acpi_battery_quirks()
712 battery->full_charge_capacity = in acpi_battery_quirks()
713 battery->full_charge_capacity * in acpi_battery_quirks()
714 10000 / battery->design_voltage; in acpi_battery_quirks()
715 battery->design_capacity_warning = in acpi_battery_quirks()
716 battery->design_capacity_warning * in acpi_battery_quirks()
717 10000 / battery->design_voltage; in acpi_battery_quirks()
718 battery->capacity_now = battery->capacity_now * in acpi_battery_quirks()
719 10000 / battery->design_voltage; in acpi_battery_quirks()
725 static int acpi_battery_update(struct acpi_battery *battery, bool resume) in acpi_battery_update() argument
727 int result, old_present = acpi_battery_present(battery); in acpi_battery_update()
728 result = acpi_battery_get_status(battery); in acpi_battery_update()
731 if (!acpi_battery_present(battery)) { in acpi_battery_update()
732 sysfs_remove_battery(battery); in acpi_battery_update()
733 battery->update_time = 0; in acpi_battery_update()
740 if (!battery->update_time || in acpi_battery_update()
741 old_present != acpi_battery_present(battery)) { in acpi_battery_update()
742 result = acpi_battery_get_info(battery); in acpi_battery_update()
745 acpi_battery_init_alarm(battery); in acpi_battery_update()
747 if (!battery->bat) { in acpi_battery_update()
748 result = sysfs_add_battery(battery); in acpi_battery_update()
752 result = acpi_battery_get_state(battery); in acpi_battery_update()
755 acpi_battery_quirks(battery); in acpi_battery_update()
761 if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) || in acpi_battery_update()
762 (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) && in acpi_battery_update()
763 (battery->capacity_now <= battery->alarm))) in acpi_battery_update()
764 pm_wakeup_event(&battery->device->dev, 0); in acpi_battery_update()
769 static void acpi_battery_refresh(struct acpi_battery *battery) in acpi_battery_refresh() argument
773 if (!battery->bat) in acpi_battery_refresh()
776 power_unit = battery->power_unit; in acpi_battery_refresh()
778 acpi_battery_get_info(battery); in acpi_battery_refresh()
780 if (power_unit == battery->power_unit) in acpi_battery_refresh()
784 sysfs_remove_battery(battery); in acpi_battery_refresh()
785 sysfs_add_battery(battery); in acpi_battery_refresh()
797 struct acpi_battery *battery = seq->private; in acpi_battery_print_info() local
803 acpi_battery_present(battery) ? "yes" : "no"); in acpi_battery_print_info()
804 if (!acpi_battery_present(battery)) in acpi_battery_print_info()
806 if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_info()
810 battery->design_capacity, in acpi_battery_print_info()
811 acpi_battery_units(battery)); in acpi_battery_print_info()
813 if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_info()
817 battery->full_charge_capacity, in acpi_battery_print_info()
818 acpi_battery_units(battery)); in acpi_battery_print_info()
821 (!battery->technology)?"non-":""); in acpi_battery_print_info()
823 if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_info()
827 battery->design_voltage); in acpi_battery_print_info()
829 battery->design_capacity_warning, in acpi_battery_print_info()
830 acpi_battery_units(battery)); in acpi_battery_print_info()
832 battery->design_capacity_low, in acpi_battery_print_info()
833 acpi_battery_units(battery)); in acpi_battery_print_info()
834 seq_printf(seq, "cycle count: %i\n", battery->cycle_count); in acpi_battery_print_info()
836 battery->capacity_granularity_1, in acpi_battery_print_info()
837 acpi_battery_units(battery)); in acpi_battery_print_info()
839 battery->capacity_granularity_2, in acpi_battery_print_info()
840 acpi_battery_units(battery)); in acpi_battery_print_info()
841 seq_printf(seq, "model number: %s\n", battery->model_number); in acpi_battery_print_info()
842 seq_printf(seq, "serial number: %s\n", battery->serial_number); in acpi_battery_print_info()
843 seq_printf(seq, "battery type: %s\n", battery->type); in acpi_battery_print_info()
844 seq_printf(seq, "OEM info: %s\n", battery->oem_info); in acpi_battery_print_info()
853 struct acpi_battery *battery = seq->private; in acpi_battery_print_state() local
859 acpi_battery_present(battery) ? "yes" : "no"); in acpi_battery_print_state()
860 if (!acpi_battery_present(battery)) in acpi_battery_print_state()
864 (battery->state & 0x04) ? "critical" : "ok"); in acpi_battery_print_state()
865 if ((battery->state & 0x01) && (battery->state & 0x02)) in acpi_battery_print_state()
868 else if (battery->state & 0x01) in acpi_battery_print_state()
870 else if (battery->state & 0x02) in acpi_battery_print_state()
875 if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_state()
879 battery->rate_now, acpi_battery_units(battery)); in acpi_battery_print_state()
881 if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_state()
885 battery->capacity_now, acpi_battery_units(battery)); in acpi_battery_print_state()
886 if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_state()
890 battery->voltage_now); in acpi_battery_print_state()
900 struct acpi_battery *battery = seq->private; in acpi_battery_print_alarm() local
905 if (!acpi_battery_present(battery)) { in acpi_battery_print_alarm()
910 if (!battery->alarm) in acpi_battery_print_alarm()
913 seq_printf(seq, "%u %sh\n", battery->alarm, in acpi_battery_print_alarm()
914 acpi_battery_units(battery)); in acpi_battery_print_alarm()
928 struct acpi_battery *battery = m->private; in acpi_battery_write_alarm() local
930 if (!battery || (count > sizeof(alarm_string) - 1)) in acpi_battery_write_alarm()
932 if (!acpi_battery_present(battery)) { in acpi_battery_write_alarm()
941 if (kstrtoint(alarm_string, 0, &battery->alarm)) { in acpi_battery_write_alarm()
945 result = acpi_battery_set_alarm(battery); in acpi_battery_write_alarm()
962 struct acpi_battery *battery = seq->private; in acpi_battery_read() local
963 int result = acpi_battery_update(battery, false); in acpi_battery_read()
1070 struct acpi_battery *battery = acpi_driver_data(device); in acpi_battery_notify() local
1073 if (!battery) in acpi_battery_notify()
1075 old = battery->bat; in acpi_battery_notify()
1085 acpi_battery_refresh(battery); in acpi_battery_notify()
1086 acpi_battery_update(battery, false); in acpi_battery_notify()
1089 acpi_battery_present(battery)); in acpi_battery_notify()
1090 acpi_notifier_call_chain(device, event, acpi_battery_present(battery)); in acpi_battery_notify()
1092 if (old && battery->bat) in acpi_battery_notify()
1093 power_supply_changed(battery->bat); in acpi_battery_notify()
1099 struct acpi_battery *battery = container_of(nb, struct acpi_battery, in battery_notify() local
1106 if (!acpi_battery_present(battery)) in battery_notify()
1109 if (!battery->bat) { in battery_notify()
1110 result = acpi_battery_get_info(battery); in battery_notify()
1114 result = sysfs_add_battery(battery); in battery_notify()
1118 acpi_battery_refresh(battery); in battery_notify()
1120 acpi_battery_init_alarm(battery); in battery_notify()
1121 acpi_battery_get_state(battery); in battery_notify()
1168 static int acpi_battery_update_retry(struct acpi_battery *battery) in acpi_battery_update_retry() argument
1173 ret = acpi_battery_update(battery, false); in acpi_battery_update_retry()
1185 struct acpi_battery *battery = NULL; in acpi_battery_add() local
1193 battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL); in acpi_battery_add()
1194 if (!battery) in acpi_battery_add()
1196 battery->device = device; in acpi_battery_add()
1199 device->driver_data = battery; in acpi_battery_add()
1200 mutex_init(&battery->lock); in acpi_battery_add()
1201 mutex_init(&battery->sysfs_lock); in acpi_battery_add()
1202 if (acpi_has_method(battery->device->handle, "_BIX")) in acpi_battery_add()
1203 set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); in acpi_battery_add()
1205 result = acpi_battery_update_retry(battery); in acpi_battery_add()
1223 battery->pm_nb.notifier_call = battery_notify; in acpi_battery_add()
1224 register_pm_notifier(&battery->pm_nb); in acpi_battery_add()
1231 sysfs_remove_battery(battery); in acpi_battery_add()
1232 mutex_destroy(&battery->lock); in acpi_battery_add()
1233 mutex_destroy(&battery->sysfs_lock); in acpi_battery_add()
1234 kfree(battery); in acpi_battery_add()
1240 struct acpi_battery *battery = NULL; in acpi_battery_remove() local
1245 battery = acpi_driver_data(device); in acpi_battery_remove()
1246 unregister_pm_notifier(&battery->pm_nb); in acpi_battery_remove()
1250 sysfs_remove_battery(battery); in acpi_battery_remove()
1251 mutex_destroy(&battery->lock); in acpi_battery_remove()
1252 mutex_destroy(&battery->sysfs_lock); in acpi_battery_remove()
1253 kfree(battery); in acpi_battery_remove()
1261 struct acpi_battery *battery; in acpi_battery_resume() local
1266 battery = acpi_driver_data(to_acpi_device(dev)); in acpi_battery_resume()
1267 if (!battery) in acpi_battery_resume()
1270 battery->update_time = 0; in acpi_battery_resume()
1271 acpi_battery_update(battery, true); in acpi_battery_resume()