Lines Matching refs:battery

152 static inline int acpi_battery_present(struct acpi_battery *battery)  in acpi_battery_present()  argument
154 return battery->device->status.battery_present; in acpi_battery_present()
157 static int acpi_battery_technology(struct acpi_battery *battery) in acpi_battery_technology() argument
159 if (!strcasecmp("NiCd", battery->type)) in acpi_battery_technology()
161 if (!strcasecmp("NiMH", battery->type)) in acpi_battery_technology()
163 if (!strcasecmp("LION", battery->type)) in acpi_battery_technology()
165 if (!strncasecmp("LI-ION", battery->type, 6)) in acpi_battery_technology()
167 if (!strcasecmp("LiP", battery->type)) in acpi_battery_technology()
172 static int acpi_battery_get_state(struct acpi_battery *battery);
174 static int acpi_battery_is_charged(struct acpi_battery *battery) in acpi_battery_is_charged() argument
177 if (battery->state != 0) in acpi_battery_is_charged()
181 if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN || in acpi_battery_is_charged()
182 battery->capacity_now == 0) in acpi_battery_is_charged()
186 if (battery->full_charge_capacity == battery->capacity_now) in acpi_battery_is_charged()
190 if (battery->design_capacity == battery->capacity_now) in acpi_battery_is_charged()
202 struct acpi_battery *battery = to_acpi_battery(psy); in acpi_battery_get_property() local
204 if (acpi_battery_present(battery)) { in acpi_battery_get_property()
206 acpi_battery_get_state(battery); in acpi_battery_get_property()
211 if (battery->state & ACPI_BATTERY_STATE_DISCHARGING) in acpi_battery_get_property()
213 else if (battery->state & ACPI_BATTERY_STATE_CHARGING) in acpi_battery_get_property()
215 else if (acpi_battery_is_charged(battery)) in acpi_battery_get_property()
221 val->intval = acpi_battery_present(battery); in acpi_battery_get_property()
224 val->intval = acpi_battery_technology(battery); in acpi_battery_get_property()
227 val->intval = battery->cycle_count; in acpi_battery_get_property()
230 if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
233 val->intval = battery->design_voltage * 1000; in acpi_battery_get_property()
236 if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
239 val->intval = battery->voltage_now * 1000; in acpi_battery_get_property()
243 if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
246 val->intval = battery->rate_now * 1000; in acpi_battery_get_property()
250 if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
253 val->intval = battery->design_capacity * 1000; in acpi_battery_get_property()
257 if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
260 val->intval = battery->full_charge_capacity * 1000; in acpi_battery_get_property()
264 if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_get_property()
267 val->intval = battery->capacity_now * 1000; in acpi_battery_get_property()
270 if (battery->capacity_now && battery->full_charge_capacity) in acpi_battery_get_property()
271 val->intval = battery->capacity_now * 100/ in acpi_battery_get_property()
272 battery->full_charge_capacity; in acpi_battery_get_property()
277 if (battery->state & ACPI_BATTERY_STATE_CRITICAL) in acpi_battery_get_property()
279 else if (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) && in acpi_battery_get_property()
280 (battery->capacity_now <= battery->alarm)) in acpi_battery_get_property()
282 else if (acpi_battery_is_charged(battery)) in acpi_battery_get_property()
288 val->strval = battery->model_number; in acpi_battery_get_property()
291 val->strval = battery->oem_info; in acpi_battery_get_property()
294 val->strval = battery->serial_number; in acpi_battery_get_property()
392 static int extract_package(struct acpi_battery *battery, in extract_package() argument
405 u8 *ptr = (u8 *)battery + offsets[i].offset; in extract_package()
416 int *x = (int *)((u8 *)battery + offsets[i].offset); in extract_package()
424 static int acpi_battery_get_status(struct acpi_battery *battery) in acpi_battery_get_status() argument
426 if (acpi_bus_get_status(battery->device)) { in acpi_battery_get_status()
433 static int acpi_battery_get_info(struct acpi_battery *battery) in acpi_battery_get_info() argument
437 char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags) ? in acpi_battery_get_info()
442 if (!acpi_battery_present(battery)) in acpi_battery_get_info()
444 mutex_lock(&battery->lock); in acpi_battery_get_info()
445 status = acpi_evaluate_object(battery->device->handle, name, in acpi_battery_get_info()
447 mutex_unlock(&battery->lock); in acpi_battery_get_info()
455 result = extract_package(battery, buffer.pointer, in acpi_battery_get_info()
458 else if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags)) in acpi_battery_get_info()
459 result = extract_package(battery, buffer.pointer, in acpi_battery_get_info()
463 result = extract_package(battery, buffer.pointer, in acpi_battery_get_info()
466 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) in acpi_battery_get_info()
467 battery->full_charge_capacity = battery->design_capacity; in acpi_battery_get_info()
468 if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && in acpi_battery_get_info()
469 battery->power_unit && battery->design_voltage) { in acpi_battery_get_info()
470 battery->design_capacity = battery->design_capacity * in acpi_battery_get_info()
471 10000 / battery->design_voltage; in acpi_battery_get_info()
472 battery->full_charge_capacity = battery->full_charge_capacity * in acpi_battery_get_info()
473 10000 / battery->design_voltage; in acpi_battery_get_info()
474 battery->design_capacity_warning = in acpi_battery_get_info()
475 battery->design_capacity_warning * in acpi_battery_get_info()
476 10000 / battery->design_voltage; in acpi_battery_get_info()
486 static int acpi_battery_get_state(struct acpi_battery *battery) in acpi_battery_get_state() argument
492 if (!acpi_battery_present(battery)) in acpi_battery_get_state()
495 if (battery->update_time && in acpi_battery_get_state()
496 time_before(jiffies, battery->update_time + in acpi_battery_get_state()
500 mutex_lock(&battery->lock); in acpi_battery_get_state()
501 status = acpi_evaluate_object(battery->device->handle, "_BST", in acpi_battery_get_state()
503 mutex_unlock(&battery->lock); in acpi_battery_get_state()
510 result = extract_package(battery, buffer.pointer, in acpi_battery_get_state()
512 battery->update_time = jiffies; in acpi_battery_get_state()
519 if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA && in acpi_battery_get_state()
520 battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN && in acpi_battery_get_state()
521 (s16)(battery->rate_now) < 0) { in acpi_battery_get_state()
522 battery->rate_now = abs((s16)battery->rate_now); in acpi_battery_get_state()
527 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) in acpi_battery_get_state()
528 && battery->capacity_now >= 0 && battery->capacity_now <= 100) in acpi_battery_get_state()
529 battery->capacity_now = (battery->capacity_now * in acpi_battery_get_state()
530 battery->full_charge_capacity) / 100; in acpi_battery_get_state()
531 if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && in acpi_battery_get_state()
532 battery->power_unit && battery->design_voltage) { in acpi_battery_get_state()
533 battery->capacity_now = battery->capacity_now * in acpi_battery_get_state()
534 10000 / battery->design_voltage; in acpi_battery_get_state()
539 static int acpi_battery_set_alarm(struct acpi_battery *battery) in acpi_battery_set_alarm() argument
543 if (!acpi_battery_present(battery) || in acpi_battery_set_alarm()
544 !test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags)) in acpi_battery_set_alarm()
547 mutex_lock(&battery->lock); in acpi_battery_set_alarm()
548 status = acpi_execute_simple_method(battery->device->handle, "_BTP", in acpi_battery_set_alarm()
549 battery->alarm); in acpi_battery_set_alarm()
550 mutex_unlock(&battery->lock); in acpi_battery_set_alarm()
555 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Alarm set to %d\n", battery->alarm)); in acpi_battery_set_alarm()
559 static int acpi_battery_init_alarm(struct acpi_battery *battery) in acpi_battery_init_alarm() argument
562 if (!acpi_has_method(battery->device->handle, "_BTP")) { in acpi_battery_init_alarm()
563 clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags); in acpi_battery_init_alarm()
566 set_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags); in acpi_battery_init_alarm()
567 if (!battery->alarm) in acpi_battery_init_alarm()
568 battery->alarm = battery->design_capacity_warning; in acpi_battery_init_alarm()
569 return acpi_battery_set_alarm(battery); in acpi_battery_init_alarm()
576 struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); in acpi_battery_alarm_show() local
577 return sprintf(buf, "%d\n", battery->alarm * 1000); in acpi_battery_alarm_show()
585 struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); in acpi_battery_alarm_store() local
587 battery->alarm = x/1000; in acpi_battery_alarm_store()
588 if (acpi_battery_present(battery)) in acpi_battery_alarm_store()
589 acpi_battery_set_alarm(battery); in acpi_battery_alarm_store()
599 static int sysfs_add_battery(struct acpi_battery *battery) in sysfs_add_battery() argument
601 struct power_supply_config psy_cfg = { .drv_data = battery, }; in sysfs_add_battery()
603 if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) { in sysfs_add_battery()
604 battery->bat_desc.properties = charge_battery_props; in sysfs_add_battery()
605 battery->bat_desc.num_properties = in sysfs_add_battery()
608 battery->bat_desc.properties = energy_battery_props; in sysfs_add_battery()
609 battery->bat_desc.num_properties = in sysfs_add_battery()
613 battery->bat_desc.name = acpi_device_bid(battery->device); in sysfs_add_battery()
614 battery->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY; in sysfs_add_battery()
615 battery->bat_desc.get_property = acpi_battery_get_property; in sysfs_add_battery()
617 battery->bat = power_supply_register_no_ws(&battery->device->dev, in sysfs_add_battery()
618 &battery->bat_desc, &psy_cfg); in sysfs_add_battery()
620 if (IS_ERR(battery->bat)) { in sysfs_add_battery()
621 int result = PTR_ERR(battery->bat); in sysfs_add_battery()
623 battery->bat = NULL; in sysfs_add_battery()
626 return device_create_file(&battery->bat->dev, &alarm_attr); in sysfs_add_battery()
629 static void sysfs_remove_battery(struct acpi_battery *battery) in sysfs_remove_battery() argument
631 mutex_lock(&battery->sysfs_lock); in sysfs_remove_battery()
632 if (!battery->bat) { in sysfs_remove_battery()
633 mutex_unlock(&battery->sysfs_lock); in sysfs_remove_battery()
637 device_remove_file(&battery->bat->dev, &alarm_attr); in sysfs_remove_battery()
638 power_supply_unregister(battery->bat); in sysfs_remove_battery()
639 battery->bat = NULL; in sysfs_remove_battery()
640 mutex_unlock(&battery->sysfs_lock); in sysfs_remove_battery()
645 struct acpi_battery *battery = (struct acpi_battery *)private; in find_battery() local
653 if (battery->design_capacity * battery->design_voltage / 1000 in find_battery()
655 battery->design_capacity * 10 == dmi_capacity) in find_battery()
657 &battery->flags); in find_battery()
673 static void acpi_battery_quirks(struct acpi_battery *battery) in acpi_battery_quirks() argument
675 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) in acpi_battery_quirks()
678 if (battery->full_charge_capacity == 100 && in acpi_battery_quirks()
679 battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN && in acpi_battery_quirks()
680 battery->capacity_now >= 0 && battery->capacity_now <= 100) { in acpi_battery_quirks()
681 set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags); in acpi_battery_quirks()
682 battery->full_charge_capacity = battery->design_capacity; in acpi_battery_quirks()
683 battery->capacity_now = (battery->capacity_now * in acpi_battery_quirks()
684 battery->full_charge_capacity) / 100; in acpi_battery_quirks()
687 if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags)) in acpi_battery_quirks()
690 if (battery->power_unit && dmi_name_in_vendors("LENOVO")) { in acpi_battery_quirks()
694 dmi_walk(find_battery, battery); in acpi_battery_quirks()
696 &battery->flags) && in acpi_battery_quirks()
697 battery->design_voltage) { in acpi_battery_quirks()
698 battery->design_capacity = in acpi_battery_quirks()
699 battery->design_capacity * in acpi_battery_quirks()
700 10000 / battery->design_voltage; in acpi_battery_quirks()
701 battery->full_charge_capacity = in acpi_battery_quirks()
702 battery->full_charge_capacity * in acpi_battery_quirks()
703 10000 / battery->design_voltage; in acpi_battery_quirks()
704 battery->design_capacity_warning = in acpi_battery_quirks()
705 battery->design_capacity_warning * in acpi_battery_quirks()
706 10000 / battery->design_voltage; in acpi_battery_quirks()
707 battery->capacity_now = battery->capacity_now * in acpi_battery_quirks()
708 10000 / battery->design_voltage; in acpi_battery_quirks()
714 static int acpi_battery_update(struct acpi_battery *battery, bool resume) in acpi_battery_update() argument
716 int result, old_present = acpi_battery_present(battery); in acpi_battery_update()
717 result = acpi_battery_get_status(battery); in acpi_battery_update()
720 if (!acpi_battery_present(battery)) { in acpi_battery_update()
721 sysfs_remove_battery(battery); in acpi_battery_update()
722 battery->update_time = 0; in acpi_battery_update()
729 if (!battery->update_time || in acpi_battery_update()
730 old_present != acpi_battery_present(battery)) { in acpi_battery_update()
731 result = acpi_battery_get_info(battery); in acpi_battery_update()
734 acpi_battery_init_alarm(battery); in acpi_battery_update()
736 if (!battery->bat) { in acpi_battery_update()
737 result = sysfs_add_battery(battery); in acpi_battery_update()
741 result = acpi_battery_get_state(battery); in acpi_battery_update()
744 acpi_battery_quirks(battery); in acpi_battery_update()
750 if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) || in acpi_battery_update()
751 (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) && in acpi_battery_update()
752 (battery->capacity_now <= battery->alarm))) in acpi_battery_update()
753 pm_wakeup_event(&battery->device->dev, 0); in acpi_battery_update()
758 static void acpi_battery_refresh(struct acpi_battery *battery) in acpi_battery_refresh() argument
762 if (!battery->bat) in acpi_battery_refresh()
765 power_unit = battery->power_unit; in acpi_battery_refresh()
767 acpi_battery_get_info(battery); in acpi_battery_refresh()
769 if (power_unit == battery->power_unit) in acpi_battery_refresh()
773 sysfs_remove_battery(battery); in acpi_battery_refresh()
774 sysfs_add_battery(battery); in acpi_battery_refresh()
784 static const char *acpi_battery_units(const struct acpi_battery *battery) in acpi_battery_units() argument
786 return (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) ? in acpi_battery_units()
792 struct acpi_battery *battery = seq->private; in acpi_battery_print_info() local
798 acpi_battery_present(battery) ? "yes" : "no"); in acpi_battery_print_info()
799 if (!acpi_battery_present(battery)) in acpi_battery_print_info()
801 if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_info()
805 battery->design_capacity, in acpi_battery_print_info()
806 acpi_battery_units(battery)); in acpi_battery_print_info()
808 if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_info()
812 battery->full_charge_capacity, in acpi_battery_print_info()
813 acpi_battery_units(battery)); in acpi_battery_print_info()
816 (!battery->technology)?"non-":""); in acpi_battery_print_info()
818 if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_info()
822 battery->design_voltage); in acpi_battery_print_info()
824 battery->design_capacity_warning, in acpi_battery_print_info()
825 acpi_battery_units(battery)); in acpi_battery_print_info()
827 battery->design_capacity_low, in acpi_battery_print_info()
828 acpi_battery_units(battery)); in acpi_battery_print_info()
829 seq_printf(seq, "cycle count: %i\n", battery->cycle_count); in acpi_battery_print_info()
831 battery->capacity_granularity_1, in acpi_battery_print_info()
832 acpi_battery_units(battery)); in acpi_battery_print_info()
834 battery->capacity_granularity_2, in acpi_battery_print_info()
835 acpi_battery_units(battery)); in acpi_battery_print_info()
836 seq_printf(seq, "model number: %s\n", battery->model_number); in acpi_battery_print_info()
837 seq_printf(seq, "serial number: %s\n", battery->serial_number); in acpi_battery_print_info()
838 seq_printf(seq, "battery type: %s\n", battery->type); in acpi_battery_print_info()
839 seq_printf(seq, "OEM info: %s\n", battery->oem_info); in acpi_battery_print_info()
848 struct acpi_battery *battery = seq->private; in acpi_battery_print_state() local
854 acpi_battery_present(battery) ? "yes" : "no"); in acpi_battery_print_state()
855 if (!acpi_battery_present(battery)) in acpi_battery_print_state()
859 (battery->state & 0x04) ? "critical" : "ok"); in acpi_battery_print_state()
860 if ((battery->state & 0x01) && (battery->state & 0x02)) in acpi_battery_print_state()
863 else if (battery->state & 0x01) in acpi_battery_print_state()
865 else if (battery->state & 0x02) in acpi_battery_print_state()
870 if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_state()
874 battery->rate_now, acpi_battery_units(battery)); in acpi_battery_print_state()
876 if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_state()
880 battery->capacity_now, acpi_battery_units(battery)); in acpi_battery_print_state()
881 if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN) in acpi_battery_print_state()
885 battery->voltage_now); in acpi_battery_print_state()
895 struct acpi_battery *battery = seq->private; in acpi_battery_print_alarm() local
900 if (!acpi_battery_present(battery)) { in acpi_battery_print_alarm()
905 if (!battery->alarm) in acpi_battery_print_alarm()
908 seq_printf(seq, "%u %sh\n", battery->alarm, in acpi_battery_print_alarm()
909 acpi_battery_units(battery)); in acpi_battery_print_alarm()
923 struct acpi_battery *battery = m->private; in acpi_battery_write_alarm() local
925 if (!battery || (count > sizeof(alarm_string) - 1)) in acpi_battery_write_alarm()
927 if (!acpi_battery_present(battery)) { in acpi_battery_write_alarm()
936 if (kstrtoint(alarm_string, 0, &battery->alarm)) { in acpi_battery_write_alarm()
940 result = acpi_battery_set_alarm(battery); in acpi_battery_write_alarm()
957 struct acpi_battery *battery = seq->private; in acpi_battery_read() local
958 int result = acpi_battery_update(battery, false); in acpi_battery_read()
1065 struct acpi_battery *battery = acpi_driver_data(device); in acpi_battery_notify() local
1068 if (!battery) in acpi_battery_notify()
1070 old = battery->bat; in acpi_battery_notify()
1080 acpi_battery_refresh(battery); in acpi_battery_notify()
1081 acpi_battery_update(battery, false); in acpi_battery_notify()
1084 acpi_battery_present(battery)); in acpi_battery_notify()
1085 acpi_notifier_call_chain(device, event, acpi_battery_present(battery)); in acpi_battery_notify()
1087 if (old && battery->bat) in acpi_battery_notify()
1088 power_supply_changed(battery->bat); in acpi_battery_notify()
1094 struct acpi_battery *battery = container_of(nb, struct acpi_battery, in battery_notify() local
1101 if (!acpi_battery_present(battery)) in battery_notify()
1104 if (!battery->bat) { in battery_notify()
1105 result = acpi_battery_get_info(battery); in battery_notify()
1109 result = sysfs_add_battery(battery); in battery_notify()
1113 acpi_battery_refresh(battery); in battery_notify()
1115 acpi_battery_init_alarm(battery); in battery_notify()
1116 acpi_battery_get_state(battery); in battery_notify()
1165 static int acpi_battery_update_retry(struct acpi_battery *battery) in acpi_battery_update_retry() argument
1170 ret = acpi_battery_update(battery, false); in acpi_battery_update_retry()
1182 struct acpi_battery *battery = NULL; in acpi_battery_add() local
1190 battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL); in acpi_battery_add()
1191 if (!battery) in acpi_battery_add()
1193 battery->device = device; in acpi_battery_add()
1196 device->driver_data = battery; in acpi_battery_add()
1197 mutex_init(&battery->lock); in acpi_battery_add()
1198 mutex_init(&battery->sysfs_lock); in acpi_battery_add()
1199 if (acpi_has_method(battery->device->handle, "_BIX")) in acpi_battery_add()
1200 set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); in acpi_battery_add()
1202 result = acpi_battery_update_retry(battery); in acpi_battery_add()
1220 battery->pm_nb.notifier_call = battery_notify; in acpi_battery_add()
1221 register_pm_notifier(&battery->pm_nb); in acpi_battery_add()
1228 sysfs_remove_battery(battery); in acpi_battery_add()
1229 mutex_destroy(&battery->lock); in acpi_battery_add()
1230 mutex_destroy(&battery->sysfs_lock); in acpi_battery_add()
1231 kfree(battery); in acpi_battery_add()
1237 struct acpi_battery *battery = NULL; in acpi_battery_remove() local
1242 battery = acpi_driver_data(device); in acpi_battery_remove()
1243 unregister_pm_notifier(&battery->pm_nb); in acpi_battery_remove()
1247 sysfs_remove_battery(battery); in acpi_battery_remove()
1248 mutex_destroy(&battery->lock); in acpi_battery_remove()
1249 mutex_destroy(&battery->sysfs_lock); in acpi_battery_remove()
1250 kfree(battery); in acpi_battery_remove()
1258 struct acpi_battery *battery; in acpi_battery_resume() local
1263 battery = acpi_driver_data(to_acpi_device(dev)); in acpi_battery_resume()
1264 if (!battery) in acpi_battery_resume()
1267 battery->update_time = 0; in acpi_battery_resume()
1268 acpi_battery_update(battery, true); in acpi_battery_resume()