Lines Matching +full:bat +full:- +full:present

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * sbs.c - ACPI Smart Battery System Driver ($Revision: 2.0 $)
6 * Copyright (c) 2005-2007 Vladimir Lebedev <vladimir.p.lebedev@intel.com>
31 #define ACPI_BATTERY_DIR_NAME "BAT%i"
55 struct power_supply *bat; member
79 u8 present:1; member
105 while (log--) in battery_scale()
112 return battery_scale((battery->spec & 0x0f00) >> 8); in acpi_battery_vscale()
117 return battery_scale((battery->spec & 0xf000) >> 12); in acpi_battery_ipscale()
122 return (battery->mode & 0x8000); in acpi_battery_mode()
138 val->intval = sbs->charger_present; in sbs_get_ac_property()
141 return -EINVAL; in sbs_get_ac_property()
148 if (!strcasecmp("NiCd", battery->device_chemistry)) in acpi_battery_technology()
150 if (!strcasecmp("NiMH", battery->device_chemistry)) in acpi_battery_technology()
152 if (!strcasecmp("LION", battery->device_chemistry)) in acpi_battery_technology()
154 if (!strcasecmp("LiP", battery->device_chemistry)) in acpi_battery_technology()
165 if ((!battery->present) && psp != POWER_SUPPLY_PROP_PRESENT) in acpi_sbs_battery_get_property()
166 return -ENODEV; in acpi_sbs_battery_get_property()
171 if (battery->rate_now < 0) in acpi_sbs_battery_get_property()
172 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in acpi_sbs_battery_get_property()
173 else if (battery->rate_now > 0) in acpi_sbs_battery_get_property()
174 val->intval = POWER_SUPPLY_STATUS_CHARGING; in acpi_sbs_battery_get_property()
176 val->intval = POWER_SUPPLY_STATUS_FULL; in acpi_sbs_battery_get_property()
179 val->intval = battery->present; in acpi_sbs_battery_get_property()
182 val->intval = acpi_battery_technology(battery); in acpi_sbs_battery_get_property()
185 val->intval = battery->cycle_count; in acpi_sbs_battery_get_property()
188 val->intval = battery->design_voltage * in acpi_sbs_battery_get_property()
192 val->intval = battery->voltage_now * in acpi_sbs_battery_get_property()
197 val->intval = abs(battery->rate_now) * in acpi_sbs_battery_get_property()
199 val->intval *= (acpi_battery_mode(battery)) ? in acpi_sbs_battery_get_property()
200 (battery->voltage_now * in acpi_sbs_battery_get_property()
205 val->intval = abs(battery->rate_avg) * in acpi_sbs_battery_get_property()
207 val->intval *= (acpi_battery_mode(battery)) ? in acpi_sbs_battery_get_property()
208 (battery->voltage_now * in acpi_sbs_battery_get_property()
212 val->intval = battery->state_of_charge; in acpi_sbs_battery_get_property()
216 val->intval = battery->design_capacity * in acpi_sbs_battery_get_property()
221 val->intval = battery->full_charge_capacity * in acpi_sbs_battery_get_property()
226 val->intval = battery->capacity_now * in acpi_sbs_battery_get_property()
230 val->intval = battery->temp_now - 2730; // dK -> dC in acpi_sbs_battery_get_property()
233 val->strval = battery->device_name; in acpi_sbs_battery_get_property()
236 val->strval = battery->manufacturer_name; in acpi_sbs_battery_get_property()
239 return -EINVAL; in acpi_sbs_battery_get_property()
286 .name = "sbs-charger",
293 /* --------------------------------------------------------------------------
295 -------------------------------------------------------------------------- */
332 result = acpi_smbus_read(sbs->hc, SMBUS_READ_WORD, ACPI_SBS_MANAGER, in acpi_manager_get_info()
335 sbs->batteries_supported = battery_system_info & 0x000f; in acpi_manager_get_info()
344 result = acpi_smbus_read(battery->sbs->hc, in acpi_battery_get_info()
360 if (battery->update_time && in acpi_battery_get_state()
361 time_before(jiffies, battery->update_time + in acpi_battery_get_state()
365 result = acpi_smbus_read(battery->sbs->hc, in acpi_battery_get_state()
375 battery->update_time = jiffies; in acpi_battery_get_state()
381 return acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, in acpi_battery_get_alarm()
383 (u8 *)&battery->alarm_capacity); in acpi_battery_get_alarm()
388 struct acpi_sbs *sbs = battery->sbs; in acpi_battery_set_alarm()
389 u16 value, sel = 1 << (battery->id + 12); in acpi_battery_set_alarm()
394 if (sbs->manager_present) { in acpi_battery_set_alarm()
395 ret = acpi_smbus_read(sbs->hc, SMBUS_READ_WORD, ACPI_SBS_MANAGER, in acpi_battery_set_alarm()
402 ret = acpi_smbus_write(sbs->hc, SMBUS_WRITE_WORD, in acpi_battery_set_alarm()
409 ret = acpi_smbus_write(sbs->hc, SMBUS_WRITE_WORD, ACPI_SBS_BATTERY, in acpi_battery_set_alarm()
410 0x01, (u8 *)&battery->alarm_capacity, 2); in acpi_battery_set_alarm()
420 result = acpi_smbus_read(sbs->hc, SMBUS_READ_WORD, ACPI_SBS_CHARGER, in acpi_ac_get_present()
435 return -ENODEV; in acpi_ac_get_present()
437 sbs->charger_present = (status >> 15) & 0x1; in acpi_ac_get_present()
447 return sprintf(buf, "%d\n", battery->alarm_capacity * in acpi_battery_alarm_show()
458 battery->alarm_capacity = x / in acpi_battery_alarm_store()
460 if (battery->present) in acpi_battery_alarm_store()
471 /* --------------------------------------------------------------------------
473 -------------------------------------------------------------------------- */
476 int result = 0, saved_present = battery->present; in acpi_battery_read()
479 if (battery->sbs->manager_present) { in acpi_battery_read()
480 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, in acpi_battery_read()
483 battery->present = state & (1 << battery->id); in acpi_battery_read()
485 state |= 1 << (battery->id + 12); in acpi_battery_read()
486 acpi_smbus_write(battery->sbs->hc, SMBUS_WRITE_WORD, in acpi_battery_read()
488 } else if (battery->id == 0) in acpi_battery_read()
489 battery->present = 1; in acpi_battery_read()
491 if (result || !battery->present) in acpi_battery_read()
494 if (saved_present != battery->present) { in acpi_battery_read()
495 battery->update_time = 0; in acpi_battery_read()
498 battery->present = 0; in acpi_battery_read()
504 battery->present = 0; in acpi_battery_read()
511 struct acpi_battery *battery = &sbs->battery[id]; in acpi_battery_add()
515 battery->id = id; in acpi_battery_add()
516 battery->sbs = sbs; in acpi_battery_add()
521 sprintf(battery->name, ACPI_BATTERY_DIR_NAME, id); in acpi_battery_add()
522 battery->bat_desc.name = battery->name; in acpi_battery_add()
523 battery->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY; in acpi_battery_add()
525 battery->bat_desc.properties = sbs_charge_battery_props; in acpi_battery_add()
526 battery->bat_desc.num_properties = in acpi_battery_add()
529 battery->bat_desc.properties = sbs_energy_battery_props; in acpi_battery_add()
530 battery->bat_desc.num_properties = in acpi_battery_add()
533 battery->bat_desc.get_property = acpi_sbs_battery_get_property; in acpi_battery_add()
534 battery->bat = power_supply_register(&sbs->device->dev, in acpi_battery_add()
535 &battery->bat_desc, &psy_cfg); in acpi_battery_add()
536 if (IS_ERR(battery->bat)) { in acpi_battery_add()
537 result = PTR_ERR(battery->bat); in acpi_battery_add()
538 battery->bat = NULL; in acpi_battery_add()
542 result = device_create_file(&battery->bat->dev, &alarm_attr); in acpi_battery_add()
545 battery->have_sysfs_alarm = 1; in acpi_battery_add()
548 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device), in acpi_battery_add()
549 battery->name, battery->present ? "present" : "absent"); in acpi_battery_add()
555 struct acpi_battery *battery = &sbs->battery[id]; in acpi_battery_remove()
557 if (battery->bat) { in acpi_battery_remove()
558 if (battery->have_sysfs_alarm) in acpi_battery_remove()
559 device_remove_file(&battery->bat->dev, &alarm_attr); in acpi_battery_remove()
560 power_supply_unregister(battery->bat); in acpi_battery_remove()
573 sbs->charger_exists = 1; in acpi_charger_add()
574 sbs->charger = power_supply_register(&sbs->device->dev, in acpi_charger_add()
576 if (IS_ERR(sbs->charger)) { in acpi_charger_add()
577 result = PTR_ERR(sbs->charger); in acpi_charger_add()
578 sbs->charger = NULL; in acpi_charger_add()
581 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device), in acpi_charger_add()
582 ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line"); in acpi_charger_add()
589 if (sbs->charger) in acpi_charger_remove()
590 power_supply_unregister(sbs->charger); in acpi_charger_remove()
597 struct acpi_battery *bat; in acpi_sbs_callback() local
598 u8 saved_charger_state = sbs->charger_present; in acpi_sbs_callback()
601 if (sbs->charger_exists) { in acpi_sbs_callback()
603 if (sbs->charger_present != saved_charger_state) in acpi_sbs_callback()
604 kobject_uevent(&sbs->charger->dev.kobj, KOBJ_CHANGE); in acpi_sbs_callback()
607 if (sbs->manager_present) { in acpi_sbs_callback()
609 if (!(sbs->batteries_supported & (1 << id))) in acpi_sbs_callback()
611 bat = &sbs->battery[id]; in acpi_sbs_callback()
612 saved_battery_state = bat->present; in acpi_sbs_callback()
613 acpi_battery_read(bat); in acpi_sbs_callback()
614 if (saved_battery_state == bat->present) in acpi_sbs_callback()
616 kobject_uevent(&bat->bat->dev.kobj, KOBJ_CHANGE); in acpi_sbs_callback()
629 result = -ENOMEM; in acpi_sbs_add()
633 mutex_init(&sbs->lock); in acpi_sbs_add()
635 sbs->hc = acpi_driver_data(acpi_dev_parent(device)); in acpi_sbs_add()
636 sbs->device = device; in acpi_sbs_add()
639 device->driver_data = sbs; in acpi_sbs_add()
642 if (result && result != -ENODEV) in acpi_sbs_add()
650 sbs->manager_present = 1; in acpi_sbs_add()
652 if ((sbs->batteries_supported & (1 << id))) in acpi_sbs_add()
657 if (!sbs->manager_present) in acpi_sbs_add()
660 acpi_smbus_register_callback(sbs->hc, acpi_sbs_callback, sbs); in acpi_sbs_add()
673 return -EINVAL; in acpi_sbs_remove()
676 return -EINVAL; in acpi_sbs_remove()
677 mutex_lock(&sbs->lock); in acpi_sbs_remove()
678 acpi_smbus_unregister_callback(sbs->hc); in acpi_sbs_remove()
682 mutex_unlock(&sbs->lock); in acpi_sbs_remove()
683 mutex_destroy(&sbs->lock); in acpi_sbs_remove()
693 return -EINVAL; in acpi_sbs_resume()
694 sbs = to_acpi_device(dev)->driver_data; in acpi_sbs_resume()