Subject: [PATCH] [acpi battery] Add sysfs interface Signed-off-by: Patrick Mochel --- drivers/acpi/drivers/battery/sysfs.c | 235 ++++++++++++++++++++++++++++++++++ 1 files changed, 234 insertions(+), 1 deletions(-) applies-to: fed166aa460fa956aad73a92964149798cd47653 1b2d2cea9fc73bde2143933808ba70276fbedb88 diff --git a/drivers/acpi/drivers/battery/sysfs.c b/drivers/acpi/drivers/battery/sysfs.c index 494e297..0d50441 100644 --- a/drivers/acpi/drivers/battery/sysfs.c +++ b/drivers/acpi/drivers/battery/sysfs.c @@ -9,4 +9,237 @@ #include #include "battery.h" -acpi_driver_sysfs_none(battery); + + +static ssize_t present_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%d\n", ab->b_present ? 1 : 0); +} + + +static ssize_t units_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%s\n", ab->b_bif->power_unit ? "mA" : "mW"); +} + + +static ssize_t design_capacity_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%u\n", (u32)ab->b_bif->design_capacity); +} + + +static ssize_t last_full_capacity_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%u\n", (u32)ab->b_bif->last_full_capacity); +} + + +static ssize_t battery_technology_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + const char * tech; + + if (ab->b_bif->battery_technology == 0) + tech = "non-rechargeable"; + else if (ab->b_bif->battery_technology == 1) + tech = "rechargeable"; + else + tech = "unknown"; + + return sprintf(buf, "%s\n", tech); +} + +static ssize_t design_voltage_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%u\n", (u32)ab->b_bif->design_voltage); +} + +static ssize_t design_capacity_warning_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%u\n", (u32)ab->b_bif->design_capacity_warning); +} + +static ssize_t design_capacity_low_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%u\n", (u32)ab->b_bif->design_capacity_low); +} + +static ssize_t capacity_granularity1_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%u\n", (u32)ab->b_bif->battery_capacity_granularity_1); +} + +static ssize_t capacity_granularity2_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%u\n", (u32)ab->b_bif->battery_capacity_granularity_2); +} + +static ssize_t model_number_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%s\n", ab->b_bif->model_number); +} + +static ssize_t serial_number_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%s\n", ab->b_bif->serial_number); +} + +static ssize_t battery_type_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%s\n", ab->b_bif->battery_type); +} + +static ssize_t oem_info_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%s\n", ab->b_bif->oem_info); +} + +static ssize_t capacity_state_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + struct acpi_bst * bst; + ssize_t ret; + + ret = battery_get_status(ab, &bst); + if (!ret) { + ret = sprintf(buf, "%s\n", + bst->state & 0x4 ? "critical" : "ok"); + kfree(bst); + } + return ret; +} + +static ssize_t charging_state_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + struct acpi_bst * bst; + const char * state; + ssize_t ret; + + ret = battery_get_status(ab, &bst); + if (!ret) { + if (bst->state & 0x01) { + if (bst->state & 0x02) { + dbg("Battery is charging AND discharging!"); + state = "charging/discharging"; + } else + state = "discharging"; + } else if (bst->state & 0x02) + state = "charging"; + else + state = "charged"; + + ret = sprintf(buf, "%s\n", state); + kfree(bst); + } + return ret; +} + +static ssize_t present_rate_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + struct acpi_bst * bst; + ssize_t ret; + + ret = battery_get_status(ab, &bst); + if (!ret) { + ret = sprintf(buf, "%u\n", (u32)bst->present_rate); + kfree(bst); + } + return ret; +} + +static ssize_t remaining_capacity_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + struct acpi_bst * bst; + ssize_t ret; + + ret = battery_get_status(ab, &bst); + if (!ret) { + ret = sprintf(buf, "%u\n", (u32)bst->remaining_capacity); + kfree(bst); + } + return ret; +} + +static ssize_t present_voltage_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + struct acpi_bst * bst; + ssize_t ret; + + ret = battery_get_status(ab, &bst); + if (!ret) { + ret = sprintf(buf, "%u\n", (u32)bst->present_voltage); + kfree(bst); + } + return ret; +} + + +static ssize_t alarm_show(struct acpi_dev * ad, char * buf) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + return sprintf(buf, "%u\n", ab->b_have_alarm ? ab->b_alarm : 0); +} + +static ssize_t alarm_store(struct acpi_dev * ad, const char * buf, size_t len) +{ + struct acpi_battery * ab = dev_get_drvdata(&ad->dev); + u32 val; + char * end; + + if (ab->b_have_alarm) { + val = simple_strtol(buf, &end, 0); + if (*end != '\0') { + int ret = battery_set_alarm(ab, val); + return ret == 0 ? len : ret; + } else + return -EINVAL; + } + return 0; +} + + +static struct acpi_dev_attr battery_attrs[] = { + acpi_dev_attr_ro(present), + acpi_dev_attr_ro(units), + acpi_dev_attr_ro(design_capacity), + acpi_dev_attr_ro(last_full_capacity), + acpi_dev_attr_ro(battery_technology), + acpi_dev_attr_ro(design_voltage), + acpi_dev_attr_ro(design_capacity_warning), + acpi_dev_attr_ro(design_capacity_low), + acpi_dev_attr_ro(capacity_granularity1), + acpi_dev_attr_ro(capacity_granularity2), + acpi_dev_attr_ro(model_number), + acpi_dev_attr_ro(serial_number), + acpi_dev_attr_ro(battery_type), + acpi_dev_attr_ro(oem_info), + + acpi_dev_attr_ro(capacity_state), + acpi_dev_attr_ro(charging_state), + acpi_dev_attr_ro(present_rate), + acpi_dev_attr_ro(remaining_capacity), + acpi_dev_attr_ro(present_voltage), + + acpi_dev_attr_rw(alarm), +}; + + +acpi_driver_sysfs(battery); --- 0.99.9.GIT