diff options
Diffstat (limited to 'drivers/hid/hid-input.c')
| -rw-r--r-- | drivers/hid/hid-input.c | 22 | 
1 files changed, 16 insertions, 6 deletions
| diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 236bccd37760..18f5e28d475c 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c @@ -435,7 +435,8 @@ static int hidinput_get_battery_property(struct power_supply *psy,  	return ret;  } -static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type, struct hid_field *field) +static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type, +				  struct hid_field *field, bool is_percentage)  {  	struct power_supply_desc *psy_desc;  	struct power_supply_config psy_cfg = { .drv_data = dev, }; @@ -475,7 +476,7 @@ static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type,  	min = field->logical_minimum;  	max = field->logical_maximum; -	if (quirks & HID_BATTERY_QUIRK_PERCENT) { +	if (is_percentage || (quirks & HID_BATTERY_QUIRK_PERCENT)) {  		min = 0;  		max = 100;  	} @@ -552,7 +553,7 @@ static void hidinput_update_battery(struct hid_device *dev, int value)  }  #else  /* !CONFIG_HID_BATTERY_STRENGTH */  static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type, -				  struct hid_field *field) +				  struct hid_field *field, bool is_percentage)  {  	return 0;  } @@ -806,7 +807,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  			break;  		case 0x3b: /* Battery Strength */ -			hidinput_setup_battery(device, HID_INPUT_REPORT, field); +			hidinput_setup_battery(device, HID_INPUT_REPORT, field, false);  			usage->type = EV_PWR;  			return; @@ -1068,7 +1069,16 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  	case HID_UP_GENDEVCTRLS:  		switch (usage->hid) {  		case HID_DC_BATTERYSTRENGTH: -			hidinput_setup_battery(device, HID_INPUT_REPORT, field); +			hidinput_setup_battery(device, HID_INPUT_REPORT, field, false); +			usage->type = EV_PWR; +			return; +		} +		goto unknown; + +	case HID_UP_BATTERY: +		switch (usage->hid) { +		case HID_BAT_ABSOLUTESTATEOFCHARGE: +			hidinput_setup_battery(device, HID_INPUT_REPORT, field, true);  			usage->type = EV_PWR;  			return;  		} @@ -1672,7 +1682,7 @@ static void report_features(struct hid_device *hid)  				/* Verify if Battery Strength feature is available */  				if (usage->hid == HID_DC_BATTERYSTRENGTH)  					hidinput_setup_battery(hid, HID_FEATURE_REPORT, -							       rep->field[i]); +							       rep->field[i], false);  				if (drv->feature_mapping)  					drv->feature_mapping(hid, rep->field[i], usage); | 
