lkml.org 
[lkml]   [2013]   [Nov]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/4] thinkpad_acpi: battery: Add force_discharge_ac_break attribute
    Date
    Tells the EC to stop a forceful discharging if the AC is disconnected. First
    needs force_discharge set to 1 to be able to work. Actual functionality is
    untested, as that attribute is not supported on an X230.

    Signed-off-by: Julian Andres Klode <jak@jak-linux.org>
    ---
    Documentation/laptops/thinkpad-acpi.txt | 4 +++
    drivers/platform/x86/thinkpad_acpi.c | 50 ++++++++++++++++++++++++++++++++-
    2 files changed, 53 insertions(+), 1 deletion(-)

    diff --git a/Documentation/laptops/thinkpad-acpi.txt b/Documentation/laptops/thinkpad-acpi.txt
    index 72882bb..8ec1898 100644
    --- a/Documentation/laptops/thinkpad-acpi.txt
    +++ b/Documentation/laptops/thinkpad-acpi.txt
    @@ -1374,6 +1374,10 @@ battery sysfs attribute: force_discharge

    Force discharging (0 or 1)

    +battery sysfs attribute: force_discharge_ac_break
    +
    + Break the discharging when the AC disconnects (0 or 1)
    +
    Multiple Commands, Module Parameters
    ------------------------------------

    diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
    index 67ce469..6b0521a 100644
    --- a/drivers/platform/x86/thinkpad_acpi.c
    +++ b/drivers/platform/x86/thinkpad_acpi.c
    @@ -8358,7 +8358,7 @@ static struct ibm_struct fan_driver_data = {

    /* Modify battery_init() if you modify them */
    #define BATTERY_MAX_COUNT 3
    -#define BATTERY_MAX_ATTRS 3
    +#define BATTERY_MAX_ATTRS 4

    static struct battery {
    char name[3 + 1 + 1];
    @@ -8477,6 +8477,47 @@ static ssize_t battery_force_discharge_store(struct device *dev,
    return count;
    }

    +static ssize_t battery_force_discharge_ac_break_show(struct device *dev,
    + struct device_attribute *attr,
    + char *buf)
    +{
    + int bat = battery_attribute_get_battery(attr);
    + int value;
    +
    + if (!hkey_handle || !acpi_evalf(hkey_handle, &value, "BDSG",
    + "dd", bat))
    + return -EIO;
    +
    + return snprintf(buf, PAGE_SIZE, "%d\n", (value >> 1) & 0x1);
    +}
    +
    +static ssize_t battery_force_discharge_ac_break_store(struct device *dev,
    + struct device_attribute *attr,
    + const char *buf, size_t count)
    +{
    + int bat = battery_attribute_get_battery(attr);
    + int res = -EINVAL;
    + unsigned long value;
    +
    + res = kstrtoul(buf, 0, &value);
    + if (res || value > 1)
    + return res ? res : -EINVAL;
    +
    + if (!hkey_handle || !acpi_evalf(hkey_handle, &res, "BDSG", "dd", bat))
    + return -EIO;
    +
    + /* Move into the right position */
    + value <<= 1;
    + /* Keep the forcedness state */
    + value |= (res) & 0x1;
    + /* Set the battery */
    + value |= (bat << 8);
    + if (!hkey_handle || !acpi_evalf(hkey_handle, &res, "BDSS",
    + "dd", (int) value) || res < 0)
    + return -EIO;
    + return count;
    +}
    +
    static int __init battery_init(struct ibm_init_struct *iibm)
    {
    int res;
    @@ -8529,6 +8570,13 @@ static int __init battery_init(struct ibm_init_struct *iibm)
    battery_force_discharge_store),
    .var = (void *) (unsigned long) (i + 1)
    };
    + batteries[i].attributes[j++] = (struct dev_ext_attribute) {
    + .attr = __ATTR(force_discharge_ac_break,
    + S_IWUSR | S_IRUGO,
    + battery_force_discharge_ac_break_show,
    + battery_force_discharge_ac_break_store),
    + .var = (void *) (unsigned long) (i + 1)
    + };

    strncpy(batteries[i].name, "BAT", 3);
    batteries[i].name[3] = '0' + i;
    --
    1.8.4.2


    \
     
     \ /
      Last update: 2013-11-11 15:21    [W:2.395 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site