Skip to content

Commit 2b92b79

Browse files
antheasij-intel
authored andcommitted
HID: asus: move vendor initialization to probe
ROG NKEY devices have multiple HID endpoints, around 3-4. One of those endpoints has a usage page of 0xff31, and is the one that emits keyboard shortcuts and controls RGB/backlight. Currently, this driver places the usage page check under asus_input_mapping and then inits backlight in asus_input_configured which is unnecessarily complicated and prevents probe from performing customizations on the vendor endpoint. Simplify the logic by introducing an is_vendor variable into probe that checks for usage page 0xff31. Then, use this variable to move backlight initialization into probe instead of asus_input_configured, and remove the backlight check from asus_input_mapping. Acked-by: Benjamin Tissoires <bentiss@kernel.org> Reviewed-by: Denis Benato <benato.denis96@gmail.com> Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev> Link: https://patch.msgid.link/20260122075044.5070-6-lkml@antheas.dev Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
1 parent e82ae34 commit 2b92b79

1 file changed

Lines changed: 18 additions & 17 deletions

File tree

drivers/hid/hid-asus.c

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad");
4848
#define T100CHI_MOUSE_REPORT_ID 0x06
4949
#define FEATURE_REPORT_ID 0x0d
5050
#define INPUT_REPORT_ID 0x5d
51+
#define HID_USAGE_PAGE_VENDOR 0xff310000
5152
#define FEATURE_KBD_REPORT_ID 0x5a
5253
#define FEATURE_KBD_REPORT_SIZE 64
5354
#define FEATURE_KBD_LED_REPORT_ID1 0x5d
@@ -127,7 +128,6 @@ struct asus_drvdata {
127128
struct input_dev *tp_kbd_input;
128129
struct asus_kbd_leds *kbd_backlight;
129130
const struct asus_touchpad_info *tp;
130-
bool enable_backlight;
131131
struct power_supply *battery;
132132
struct power_supply_desc battery_desc;
133133
int battery_capacity;
@@ -318,7 +318,7 @@ static int asus_e1239t_event(struct asus_drvdata *drvdat, u8 *data, int size)
318318
static int asus_event(struct hid_device *hdev, struct hid_field *field,
319319
struct hid_usage *usage, __s32 value)
320320
{
321-
if ((usage->hid & HID_USAGE_PAGE) == 0xff310000 &&
321+
if ((usage->hid & HID_USAGE_PAGE) == HID_USAGE_PAGE_VENDOR &&
322322
(usage->hid & HID_USAGE) != 0x00 &&
323323
(usage->hid & HID_USAGE) != 0xff && !usage->type) {
324324
hid_warn(hdev, "Unmapped Asus vendor usagepage code 0x%02x\n",
@@ -938,11 +938,6 @@ static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi)
938938

939939
drvdata->input = input;
940940

941-
if (drvdata->enable_backlight &&
942-
!asus_kbd_wmi_led_control_present(hdev) &&
943-
asus_kbd_register_leds(hdev))
944-
hid_warn(hdev, "Failed to initialize backlight.\n");
945-
946941
return 0;
947942
}
948943

@@ -1015,15 +1010,6 @@ static int asus_input_mapping(struct hid_device *hdev,
10151010
return -1;
10161011
}
10171012

1018-
/*
1019-
* Check and enable backlight only on devices with UsagePage ==
1020-
* 0xff31 to avoid initializing the keyboard firmware multiple
1021-
* times on devices with multiple HID descriptors but same
1022-
* PID/VID.
1023-
*/
1024-
if (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT)
1025-
drvdata->enable_backlight = true;
1026-
10271013
set_bit(EV_REP, hi->input->evbit);
10281014
return 1;
10291015
}
@@ -1140,8 +1126,11 @@ static int __maybe_unused asus_reset_resume(struct hid_device *hdev)
11401126

11411127
static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id)
11421128
{
1143-
int ret;
1129+
struct hid_report_enum *rep_enum;
11441130
struct asus_drvdata *drvdata;
1131+
struct hid_report *rep;
1132+
bool is_vendor = false;
1133+
int ret;
11451134

11461135
drvdata = devm_kzalloc(&hdev->dev, sizeof(*drvdata), GFP_KERNEL);
11471136
if (drvdata == NULL) {
@@ -1225,12 +1214,24 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id)
12251214
return ret;
12261215
}
12271216

1217+
/* Check for vendor for RGB init and handle generic devices properly. */
1218+
rep_enum = &hdev->report_enum[HID_INPUT_REPORT];
1219+
list_for_each_entry(rep, &rep_enum->report_list, list) {
1220+
if ((rep->application & HID_USAGE_PAGE) == HID_USAGE_PAGE_VENDOR)
1221+
is_vendor = true;
1222+
}
1223+
12281224
ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
12291225
if (ret) {
12301226
hid_err(hdev, "Asus hw start failed: %d\n", ret);
12311227
return ret;
12321228
}
12331229

1230+
if (is_vendor && (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT) &&
1231+
!asus_kbd_wmi_led_control_present(hdev) &&
1232+
asus_kbd_register_leds(hdev))
1233+
hid_warn(hdev, "Failed to initialize backlight.\n");
1234+
12341235
/*
12351236
* Check that input registration succeeded. Checking that
12361237
* HID_CLAIMED_INPUT is set prevents a UAF when all input devices

0 commit comments

Comments
 (0)