diff options
author | Mattia Dongili <malattia@linux.it> | 2012-06-11 07:18:31 +0900 |
---|---|---|
committer | Matthew Garrett <mjg@redhat.com> | 2012-06-26 14:43:11 -0400 |
commit | 15aa5c75468a103cdee1a0e0ec26aad979bf71a5 (patch) | |
tree | 235696aa4f301a8ae6adf827a86357541927d8cc /drivers | |
parent | bb384b5295323ed58260aeaff22d8bbe32988396 (diff) | |
download | op-kernel-dev-15aa5c75468a103cdee1a0e0ec26aad979bf71a5.zip op-kernel-dev-15aa5c75468a103cdee1a0e0ec26aad979bf71a5.tar.gz |
sony-laptop: store battery care limits on batteries
Some models offer the option to store the limits on the battery
(firmware?).
Signed-off-by: Mattia Dongili <malattia@linux.it>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/platform/x86/sony-laptop.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index 4f42e56..f045e3e 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c @@ -1916,32 +1916,33 @@ static ssize_t sony_nc_battery_care_limit_store(struct device *dev, * bits 4,5: store the limit into the EC * bits 6,7: store the limit into the battery */ + cmd = 0; - /* - * handle 0x0115 should allow storing on battery too; - * handle 0x0136 same as 0x0115 + health status; - * handle 0x013f, same as 0x0136 but no storing on the battery - * - * Store only inside the EC for now, regardless the handle number - */ - if (value == 0) - /* disable limits */ - cmd = 0x0; + if (value > 0) { + if (value <= 50) + cmd = 0x20; - else if (value <= 50) - cmd = 0x21; + else if (value <= 80) + cmd = 0x10; - else if (value <= 80) - cmd = 0x11; + else if (value <= 100) + cmd = 0x30; + + else + return -EINVAL; - else if (value <= 100) - cmd = 0x31; + /* + * handle 0x0115 should allow storing on battery too; + * handle 0x0136 same as 0x0115 + health status; + * handle 0x013f, same as 0x0136 but no storing on the battery + */ + if (bcare_ctl->handle != 0x013f) + cmd = cmd | (cmd << 2); - else - return -EINVAL; + cmd = (cmd | 0x1) << 0x10; + } - if (sony_call_snc_handle(bcare_ctl->handle, (cmd << 0x10) | 0x0100, - &result)) + if (sony_call_snc_handle(bcare_ctl->handle, cmd | 0x0100, &result)) return -EIO; return count; |