Merge branch 'master' into for-4.20/upstream-fixes
Pull in a merge commit that brought in 3b692c55e5
("HID: asus: only
support backlight when it's not driven by WMI") so that fixup could be
applied on top of it.
This commit is contained in:
@@ -149,6 +149,7 @@ config HID_APPLEIR
|
||||
config HID_ASUS
|
||||
tristate "Asus"
|
||||
depends on LEDS_CLASS
|
||||
depends on ASUS_WMI || ASUS_WMI=n
|
||||
---help---
|
||||
Support for Asus notebook built-in keyboard and touchpad via i2c, and
|
||||
the Asus Republic of Gamers laptop keyboard special keys.
|
||||
@@ -188,7 +189,6 @@ config HID_BIGBEN_FF
|
||||
depends on NEW_LEDS
|
||||
depends on LEDS_CLASS
|
||||
select INPUT_FF_MEMLESS
|
||||
default !EXPERT
|
||||
help
|
||||
Support for the "Kid-friendly Wired Controller" PS3OFMINIPAD
|
||||
gamepad made by BigBen Interactive, originally sold as a PS3
|
||||
|
@@ -29,6 +29,7 @@
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/hid.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/x86/asus-wmi.h>
|
||||
#include <linux/input/mt.h>
|
||||
#include <linux/usb.h> /* For to_usb_interface for T100 touchpad intf check */
|
||||
|
||||
@@ -349,6 +350,24 @@ static void asus_kbd_backlight_work(struct work_struct *work)
|
||||
hid_err(led->hdev, "Asus failed to set keyboard backlight: %d\n", ret);
|
||||
}
|
||||
|
||||
/* WMI-based keyboard backlight LED control (via asus-wmi driver) takes
|
||||
* precedence. We only activate HID-based backlight control when the
|
||||
* WMI control is not available.
|
||||
*/
|
||||
static bool asus_kbd_wmi_led_control_present(struct hid_device *hdev)
|
||||
{
|
||||
u32 value;
|
||||
int ret;
|
||||
|
||||
ret = asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS2,
|
||||
ASUS_WMI_DEVID_KBD_BACKLIGHT, 0, &value);
|
||||
hid_dbg(hdev, "WMI backlight check: rc %d value %x", ret, value);
|
||||
if (ret)
|
||||
return false;
|
||||
|
||||
return !!(value & ASUS_WMI_DSTS_PRESENCE_BIT);
|
||||
}
|
||||
|
||||
static int asus_kbd_register_leds(struct hid_device *hdev)
|
||||
{
|
||||
struct asus_drvdata *drvdata = hid_get_drvdata(hdev);
|
||||
@@ -436,7 +455,9 @@ static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi)
|
||||
|
||||
drvdata->input = input;
|
||||
|
||||
if (drvdata->enable_backlight && asus_kbd_register_leds(hdev))
|
||||
if (drvdata->enable_backlight &&
|
||||
!asus_kbd_wmi_led_control_present(hdev) &&
|
||||
asus_kbd_register_leds(hdev))
|
||||
hid_warn(hdev, "Failed to initialize backlight.\n");
|
||||
|
||||
return 0;
|
||||
|
@@ -1855,31 +1855,30 @@ EXPORT_SYMBOL_GPL(hidinput_disconnect);
|
||||
void hid_scroll_counter_handle_scroll(struct hid_scroll_counter *counter,
|
||||
int hi_res_value)
|
||||
{
|
||||
int low_res_scroll_amount;
|
||||
/* Some wheels will rest 7/8ths of a notch from the previous notch
|
||||
* after slow movement, so we want the threshold for low-res events to
|
||||
* be in the middle of the notches (e.g. after 4/8ths) as opposed to on
|
||||
* the notches themselves (8/8ths).
|
||||
*/
|
||||
int threshold = counter->resolution_multiplier / 2;
|
||||
int low_res_value, remainder, multiplier;
|
||||
|
||||
input_report_rel(counter->dev, REL_WHEEL_HI_RES,
|
||||
hi_res_value * counter->microns_per_hi_res_unit);
|
||||
|
||||
counter->remainder += hi_res_value;
|
||||
if (abs(counter->remainder) >= threshold) {
|
||||
/* Add (or subtract) 1 because we want to trigger when the wheel
|
||||
* is half-way to the next notch (i.e. scroll 1 notch after a
|
||||
* 1/2 notch movement, 2 notches after a 1 1/2 notch movement,
|
||||
* etc.).
|
||||
*/
|
||||
low_res_scroll_amount =
|
||||
counter->remainder / counter->resolution_multiplier
|
||||
+ (hi_res_value > 0 ? 1 : -1);
|
||||
input_report_rel(counter->dev, REL_WHEEL,
|
||||
low_res_scroll_amount);
|
||||
counter->remainder -=
|
||||
low_res_scroll_amount * counter->resolution_multiplier;
|
||||
}
|
||||
/*
|
||||
* Update the low-res remainder with the high-res value,
|
||||
* but reset if the direction has changed.
|
||||
*/
|
||||
remainder = counter->remainder;
|
||||
if ((remainder ^ hi_res_value) < 0)
|
||||
remainder = 0;
|
||||
remainder += hi_res_value;
|
||||
|
||||
/*
|
||||
* Then just use the resolution multiplier to see if
|
||||
* we should send a low-res (aka regular wheel) event.
|
||||
*/
|
||||
multiplier = counter->resolution_multiplier;
|
||||
low_res_value = remainder / multiplier;
|
||||
remainder -= low_res_value * multiplier;
|
||||
counter->remainder = remainder;
|
||||
|
||||
if (low_res_value)
|
||||
input_report_rel(counter->dev, REL_WHEEL, low_res_value);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_scroll_counter_handle_scroll);
|
||||
|
@@ -45,7 +45,7 @@ int picolcd_raw_cir(struct picolcd_data *data,
|
||||
{
|
||||
unsigned long flags;
|
||||
int i, w, sz;
|
||||
DEFINE_IR_RAW_EVENT(rawir);
|
||||
struct ir_raw_event rawir = {};
|
||||
|
||||
/* ignore if rc_dev is NULL or status is shunned */
|
||||
spin_lock_irqsave(&data->lock, flags);
|
||||
@@ -67,7 +67,6 @@ int picolcd_raw_cir(struct picolcd_data *data,
|
||||
*/
|
||||
sz = size > 0 ? min((int)raw_data[0], size-1) : 0;
|
||||
for (i = 0; i+1 < sz; i += 2) {
|
||||
init_ir_raw_event(&rawir);
|
||||
w = (raw_data[i] << 8) | (raw_data[i+1]);
|
||||
rawir.pulse = !!(w & 0x8000);
|
||||
rawir.duration = US_TO_NS(rawir.pulse ? (65536 - w) : w);
|
||||
|
@@ -345,7 +345,8 @@ static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] = {
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "FlexBook edge11 - M-FBE11"),
|
||||
},
|
||||
.driver_data = (void *)&sipodev_desc
|
||||
}
|
||||
},
|
||||
{ } /* Terminate list */
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user