diff options
Diffstat (limited to 'drivers/hid/hid-input.c')
| -rw-r--r-- | drivers/hid/hid-input.c | 24 | 
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 6836a856c243..930652c25120 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c @@ -387,7 +387,8 @@ static int hidinput_get_battery_property(struct power_supply *psy,  		break;  	case POWER_SUPPLY_PROP_CAPACITY: -		if (dev->battery_report_type == HID_FEATURE_REPORT) { +		if (dev->battery_status != HID_BATTERY_REPORTED && +		    !dev->battery_avoid_query) {  			value = hidinput_query_battery_capacity(dev);  			if (value < 0)  				return value; @@ -403,17 +404,17 @@ static int hidinput_get_battery_property(struct power_supply *psy,  		break;  	case POWER_SUPPLY_PROP_STATUS: -		if (!dev->battery_reported && -		    dev->battery_report_type == HID_FEATURE_REPORT) { +		if (dev->battery_status != HID_BATTERY_REPORTED && +		    !dev->battery_avoid_query) {  			value = hidinput_query_battery_capacity(dev);  			if (value < 0)  				return value;  			dev->battery_capacity = value; -			dev->battery_reported = true; +			dev->battery_status = HID_BATTERY_QUERIED;  		} -		if (!dev->battery_reported) +		if (dev->battery_status == HID_BATTERY_UNKNOWN)  			val->intval = POWER_SUPPLY_STATUS_UNKNOWN;  		else if (dev->battery_capacity == 100)  			val->intval = POWER_SUPPLY_STATUS_FULL; @@ -486,6 +487,14 @@ static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type,  	dev->battery_report_type = report_type;  	dev->battery_report_id = field->report->id; +	/* +	 * Stylus is normally not connected to the device and thus we +	 * can't query the device and get meaningful battery strength. +	 * We have to wait for the device to report it on its own. +	 */ +	dev->battery_avoid_query = report_type == HID_INPUT_REPORT && +				   field->physical == HID_DG_STYLUS; +  	dev->battery = power_supply_register(&dev->dev, psy_desc, &psy_cfg);  	if (IS_ERR(dev->battery)) {  		error = PTR_ERR(dev->battery); @@ -530,9 +539,10 @@ static void hidinput_update_battery(struct hid_device *dev, int value)  	capacity = hidinput_scale_battery_capacity(dev, value); -	if (!dev->battery_reported || capacity != dev->battery_capacity) { +	if (dev->battery_status != HID_BATTERY_REPORTED || +	    capacity != dev->battery_capacity) {  		dev->battery_capacity = capacity; -		dev->battery_reported = true; +		dev->battery_status = HID_BATTERY_REPORTED;  		power_supply_changed(dev->battery);  	}  }  |