hid-input/battery: deal with both FEATURE and INPUT report batteries
authorJeremy Fitzhardinge <jeremy@goop.org>
Fri, 2 Dec 2011 19:18:45 +0000 (11:18 -0800)
committerJeremy Fitzhardinge <jeremy@goop.org>
Sun, 8 Jan 2012 07:30:37 +0000 (18:30 +1100)
Some devices seem to report batteries as FEATUREs, others as INPUTs.

Signed-off-by: Jeremy Fitzhardinge <jeremy@goop.org>
drivers/hid/hid-input.c
include/linux/hid.h

index 69dec476883a032b81f09ecf47c1f821b5fd1f81..f5c3efcdcb02c7f0bb904dcacc70355a0df16205 100644 (file)
@@ -312,7 +312,6 @@ static int hidinput_get_battery_property(struct power_supply *psy,
        int ret = 0;
        int ret_rep;
        __u8 buf[2] = {};
-       unsigned char report_number = dev->battery_report_id;
 
        switch (prop) {
        case POWER_SUPPLY_PROP_PRESENT:
@@ -321,8 +320,9 @@ static int hidinput_get_battery_property(struct power_supply *psy,
                break;
 
        case POWER_SUPPLY_PROP_CAPACITY:
-               ret_rep = dev->hid_get_raw_report(dev, report_number,
-                                                 buf, sizeof(buf), HID_FEATURE_REPORT);
+               ret_rep = dev->hid_get_raw_report(dev, dev->battery_report_id,
+                                                 buf, sizeof(buf),
+                                                 dev->battery_report_type);
                if (ret_rep != 2) {
                        ret = -EINVAL;
                        break;
@@ -351,7 +351,9 @@ static int hidinput_get_battery_property(struct power_supply *psy,
        return ret;
 }
 
-static void hidinput_setup_battery(struct hid_device *dev, unsigned id, s32 min, s32 max)
+static void hidinput_setup_battery(struct hid_device *dev,
+                                  unsigned report_type, unsigned report_id,
+                                  s32 min, s32 max)
 {
        struct power_supply *battery = &dev->battery;
        int ret;
@@ -379,7 +381,8 @@ static void hidinput_setup_battery(struct hid_device *dev, unsigned id, s32 min,
 
        dev->battery_min = min;
        dev->battery_max = max;
-       dev->battery_report_id = id;
+       dev->battery_report_type = report_type;
+       dev->battery_report_id = report_id;
 
        ret = power_supply_register(&dev->dev, battery);
        if (ret != 0) {
@@ -399,7 +402,9 @@ static void hidinput_cleanup_battery(struct hid_device *dev)
        dev->battery.name = NULL;
 }
 #else  /* !CONFIG_HID_BATTERY_STRENGTH */
-static void hidinput_setup_battery(struct hid_device *dev, unsigned id, s32 min, s32 max)
+static void hidinput_setup_battery(struct hid_device *dev,
+                                  unsigned report_type, unsigned report_id,
+                                  s32 min, s32 max)
 {
 }
 
@@ -769,6 +774,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
        case HID_UP_GENDEVCTRLS:
                if ((usage->hid & HID_USAGE) == 0x20) { /* Battery Strength */
                        hidinput_setup_battery(device,
+                                              HID_INPUT_REPORT,
                                               field->report->id,
                                               field->logical_minimum,
                                               field->logical_maximum);
@@ -1052,7 +1058,7 @@ static void report_features(struct hid_device *hid)
                                if (((rep->field[i]->usage + j)->hid & HID_USAGE_PAGE) == HID_UP_GENDEVCTRLS &&
                                        ((rep->field[i]->usage + j)->hid & HID_USAGE) == 0x20) {
                                        hidinput_setup_battery(hid,
-                                                              rep->id,
+                                                              HID_FEATURE_REPORT, rep->id,
                                                               rep->field[i]->logical_minimum,
                                                               rep->field[i]->logical_maximum);
                                }
index fa772c86fa2c34bcafc31fde8b72548d31cb79df..9351d3d1d0899798aaf7c10d98fa3cf6be62121f 100644 (file)
@@ -496,6 +496,7 @@ struct hid_device {                                                 /* device report descriptor */
        __s32 battery_min;
        __s32 battery_max;
        __s32 battery_val;
+       __s32 battery_report_type;
        __s32 battery_report_id;
 #endif