diff options
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/olpc_battery.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/power/olpc_battery.c b/drivers/power/olpc_battery.c index 3a589df09376..602bbd008f78 100644 --- a/drivers/power/olpc_battery.c +++ b/drivers/power/olpc_battery.c | |||
@@ -10,7 +10,9 @@ | |||
10 | 10 | ||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/types.h> | ||
13 | #include <linux/err.h> | 14 | #include <linux/err.h> |
15 | #include <linux/device.h> | ||
14 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
15 | #include <linux/power_supply.h> | 17 | #include <linux/power_supply.h> |
16 | #include <linux/jiffies.h> | 18 | #include <linux/jiffies.h> |
@@ -379,6 +381,29 @@ static struct bin_attribute olpc_bat_eeprom = { | |||
379 | .read = olpc_bat_eeprom_read, | 381 | .read = olpc_bat_eeprom_read, |
380 | }; | 382 | }; |
381 | 383 | ||
384 | /* Allow userspace to see the specific error value pulled from the EC */ | ||
385 | |||
386 | static ssize_t olpc_bat_error_read(struct device *dev, | ||
387 | struct device_attribute *attr, char *buf) | ||
388 | { | ||
389 | uint8_t ec_byte; | ||
390 | ssize_t ret; | ||
391 | |||
392 | ret = olpc_ec_cmd(EC_BAT_ERRCODE, NULL, 0, &ec_byte, 1); | ||
393 | if (ret < 0) | ||
394 | return ret; | ||
395 | |||
396 | return sprintf(buf, "%d\n", ec_byte); | ||
397 | } | ||
398 | |||
399 | static struct device_attribute olpc_bat_error = { | ||
400 | .attr = { | ||
401 | .name = "error", | ||
402 | .mode = S_IRUGO, | ||
403 | }, | ||
404 | .show = olpc_bat_error_read, | ||
405 | }; | ||
406 | |||
382 | /********************************************************************* | 407 | /********************************************************************* |
383 | * Initialisation | 408 | * Initialisation |
384 | *********************************************************************/ | 409 | *********************************************************************/ |
@@ -442,8 +467,14 @@ static int __init olpc_bat_init(void) | |||
442 | if (ret) | 467 | if (ret) |
443 | goto eeprom_failed; | 468 | goto eeprom_failed; |
444 | 469 | ||
470 | ret = device_create_file(olpc_bat.dev, &olpc_bat_error); | ||
471 | if (ret) | ||
472 | goto error_failed; | ||
473 | |||
445 | goto success; | 474 | goto success; |
446 | 475 | ||
476 | error_failed: | ||
477 | device_remove_bin_file(olpc_bat.dev, &olpc_bat_eeprom); | ||
447 | eeprom_failed: | 478 | eeprom_failed: |
448 | power_supply_unregister(&olpc_bat); | 479 | power_supply_unregister(&olpc_bat); |
449 | battery_failed: | 480 | battery_failed: |
@@ -456,6 +487,7 @@ success: | |||
456 | 487 | ||
457 | static void __exit olpc_bat_exit(void) | 488 | static void __exit olpc_bat_exit(void) |
458 | { | 489 | { |
490 | device_remove_file(olpc_bat.dev, &olpc_bat_error); | ||
459 | device_remove_bin_file(olpc_bat.dev, &olpc_bat_eeprom); | 491 | device_remove_bin_file(olpc_bat.dev, &olpc_bat_eeprom); |
460 | power_supply_unregister(&olpc_bat); | 492 | power_supply_unregister(&olpc_bat); |
461 | power_supply_unregister(&olpc_ac); | 493 | power_supply_unregister(&olpc_ac); |