Lines Matching +full:additional +full:- +full:devs

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * HID driver for Asus notebook built-in keyboard.
12 * This module based on hid-ortek by
29 #include <linux/platform_data/x86/asus-wmi.h>
35 #include "hid-ids.h"
200 struct input_dev *input = drvdat->input; in asus_report_contact_down()
204 y = drvdat->tp->max_y - ((data[0] & CONTACT_Y_MSB_MASK) << 8 | data[2]); in asus_report_contact_down()
209 if (drvdat->tp->contact_size < 5) in asus_report_contact_down()
227 struct input_mt *mt = drvdat->input->mt; in asus_report_tool_width()
231 if (drvdat->tp->contact_size < 5) in asus_report_tool_width()
235 oldid = mt->trkid; in asus_report_tool_width()
237 for (i = 0; i < mt->num_slots; ++i) { in asus_report_tool_width()
238 struct input_mt_slot *ps = &mt->slots[i]; in asus_report_tool_width()
243 if ((id - oldid) & TRKID_SGN) { in asus_report_tool_width()
250 input_report_abs(drvdat->input, ABS_TOOL_WIDTH, in asus_report_tool_width()
260 if (size != drvdat->tp->report_size) in asus_report_input()
263 for (i = 0; i < drvdat->tp->max_contacts; i++) { in asus_report_input()
266 if (drvdat->tp->contact_size >= 5) in asus_report_input()
270 input_mt_slot(drvdat->input, i); in asus_report_input()
271 input_mt_report_slot_state(drvdat->input, toolType, down); in asus_report_input()
275 contactData += drvdat->tp->contact_size; in asus_report_input()
279 input_report_key(drvdat->input, BTN_LEFT, data[1] & BTN_LEFT_MASK); in asus_report_input()
282 input_mt_sync_frame(drvdat->input); in asus_report_input()
283 input_sync(drvdat->input); in asus_report_input()
294 if (!drvdat->tp && in asus_e1239t_event()
296 input_report_key(drvdat->input, KEY_MUTE, 1); in asus_e1239t_event()
297 input_sync(drvdat->input); in asus_e1239t_event()
298 input_report_key(drvdat->input, KEY_MUTE, 0); in asus_e1239t_event()
299 input_sync(drvdat->input); in asus_e1239t_event()
304 if (drvdat->tp_kbd_input && in asus_e1239t_event()
306 input_report_key(drvdat->tp_kbd_input, KEY_F21, 1); in asus_e1239t_event()
307 input_sync(drvdat->tp_kbd_input); in asus_e1239t_event()
308 input_report_key(drvdat->tp_kbd_input, KEY_F21, 0); in asus_e1239t_event()
309 input_sync(drvdat->tp_kbd_input); in asus_e1239t_event()
319 if ((usage->hid & HID_USAGE_PAGE) == 0xff310000 && in asus_event()
320 (usage->hid & HID_USAGE) != 0x00 && in asus_event()
321 (usage->hid & HID_USAGE) != 0xff && !usage->type) { in asus_event()
323 usage->hid & HID_USAGE); in asus_event()
334 if (drvdata->battery && data[0] == BATTERY_REPORT_ID) in asus_raw_event()
337 if (drvdata->tp && data[0] == INPUT_REPORT_ID) in asus_raw_event()
340 if (drvdata->quirks & QUIRK_MEDION_E1239T) in asus_raw_event()
347 if (report->id == FEATURE_KBD_LED_REPORT_ID1 || report->id == FEATURE_KBD_LED_REPORT_ID2) in asus_raw_event()
348 return -1; in asus_raw_event()
349 if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { in asus_raw_event()
355 return -1; in asus_raw_event()
359 if (drvdata->quirks & QUIRK_ROG_CLAYMORE_II_KEYBOARD) { in asus_raw_event()
366 return -1; in asus_raw_event()
380 return -ENOMEM; in asus_kbd_set_report()
423 return -ENOMEM; in asus_kbd_get_functions()
464 spin_lock_irqsave(&led->lock, flags); in asus_schedule_work()
465 if (!led->removed) in asus_schedule_work()
466 schedule_work(&led->work); in asus_schedule_work()
467 spin_unlock_irqrestore(&led->lock, flags); in asus_schedule_work()
477 spin_lock_irqsave(&led->lock, flags); in asus_kbd_backlight_set()
478 led->brightness = brightness; in asus_kbd_backlight_set()
479 spin_unlock_irqrestore(&led->lock, flags); in asus_kbd_backlight_set()
491 spin_lock_irqsave(&led->lock, flags); in asus_kbd_backlight_get()
492 brightness = led->brightness; in asus_kbd_backlight_get()
493 spin_unlock_irqrestore(&led->lock, flags); in asus_kbd_backlight_get()
505 spin_lock_irqsave(&led->lock, flags); in asus_kbd_backlight_work()
506 buf[4] = led->brightness; in asus_kbd_backlight_work()
507 spin_unlock_irqrestore(&led->lock, flags); in asus_kbd_backlight_work()
509 ret = asus_kbd_set_report(led->hdev, buf, sizeof(buf)); in asus_kbd_backlight_work()
511 hid_err(led->hdev, "Asus failed to set keyboard backlight: %d\n", ret); in asus_kbd_backlight_work()
514 /* WMI-based keyboard backlight LED control (via asus-wmi driver) takes
515 * precedence. We only activate HID-based backlight control when the
527 if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && in asus_kbd_wmi_led_control_present()
546 * string, and there may be additional bytes after the version string such as
563 return -EINVAL; in mcu_parse_version_string()
570 return -EINVAL; in mcu_parse_version_string()
582 return -ENOMEM; in mcu_request_version()
641 if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { in asus_kbd_register_leds()
662 if (drvdata->quirks & QUIRK_ROG_ALLY_XPAD) { in asus_kbd_register_leds()
663 intf = to_usb_interface(hdev->dev.parent); in asus_kbd_register_leds()
666 le16_to_cpu(udev->descriptor.idProduct)); in asus_kbd_register_leds()
682 return -ENODEV; in asus_kbd_register_leds()
685 drvdata->kbd_backlight = devm_kzalloc(&hdev->dev, in asus_kbd_register_leds()
688 if (!drvdata->kbd_backlight) in asus_kbd_register_leds()
689 return -ENOMEM; in asus_kbd_register_leds()
691 drvdata->kbd_backlight->removed = false; in asus_kbd_register_leds()
692 drvdata->kbd_backlight->brightness = 0; in asus_kbd_register_leds()
693 drvdata->kbd_backlight->hdev = hdev; in asus_kbd_register_leds()
694 drvdata->kbd_backlight->cdev.name = "asus::kbd_backlight"; in asus_kbd_register_leds()
695 drvdata->kbd_backlight->cdev.max_brightness = 3; in asus_kbd_register_leds()
696 drvdata->kbd_backlight->cdev.brightness_set = asus_kbd_backlight_set; in asus_kbd_register_leds()
697 drvdata->kbd_backlight->cdev.brightness_get = asus_kbd_backlight_get; in asus_kbd_register_leds()
698 INIT_WORK(&drvdata->kbd_backlight->work, asus_kbd_backlight_work); in asus_kbd_register_leds()
699 spin_lock_init(&drvdata->kbd_backlight->lock); in asus_kbd_register_leds()
701 ret = devm_led_classdev_register(&hdev->dev, &drvdata->kbd_backlight->cdev); in asus_kbd_register_leds()
704 devm_kfree(&hdev->dev, drvdata->kbd_backlight); in asus_kbd_register_leds()
728 drvdata->battery_capacity = ((int)lvl * 100) / (int)BATTERY_LEVEL_MAX; in asus_parse_battery()
742 drvdata->battery_stat = val; in asus_parse_battery()
750 if ((drvdata->battery_in_query == false) && in asus_report_battery()
752 power_supply_changed(drvdata->battery); in asus_report_battery()
764 return -ENOMEM; in asus_battery_query()
766 drvdata->battery_in_query = true; in asus_battery_query()
767 ret = hid_hw_raw_request(drvdata->hdev, BATTERY_REPORT_ID, in asus_battery_query()
770 drvdata->battery_in_query = false; in asus_battery_query()
774 ret = -ENODATA; in asus_battery_query()
801 if (time_before(drvdata->battery_next_query, jiffies)) { in asus_battery_get_property()
802 drvdata->battery_next_query = in asus_battery_get_property()
809 val->intval = drvdata->battery_stat; in asus_battery_get_property()
811 val->intval = drvdata->battery_capacity; in asus_battery_get_property()
814 val->intval = 1; in asus_battery_get_property()
817 val->intval = POWER_SUPPLY_SCOPE_DEVICE; in asus_battery_get_property()
820 val->strval = drvdata->hdev->name; in asus_battery_get_property()
823 ret = -EINVAL; in asus_battery_get_property()
836 drvdata->battery_capacity = 0; in asus_battery_probe()
837 drvdata->battery_stat = POWER_SUPPLY_STATUS_UNKNOWN; in asus_battery_probe()
838 drvdata->battery_in_query = false; in asus_battery_probe()
840 drvdata->battery_desc.properties = asus_battery_props; in asus_battery_probe()
841 drvdata->battery_desc.num_properties = ARRAY_SIZE(asus_battery_props); in asus_battery_probe()
842 drvdata->battery_desc.get_property = asus_battery_get_property; in asus_battery_probe()
843 drvdata->battery_desc.type = POWER_SUPPLY_TYPE_BATTERY; in asus_battery_probe()
844 drvdata->battery_desc.use_for_apm = 0; in asus_battery_probe()
845 drvdata->battery_desc.name = devm_kasprintf(&hdev->dev, GFP_KERNEL, in asus_battery_probe()
846 "asus-keyboard-%s-battery", in asus_battery_probe()
847 strlen(hdev->uniq) ? in asus_battery_probe()
848 hdev->uniq : dev_name(&hdev->dev)); in asus_battery_probe()
849 if (!drvdata->battery_desc.name) in asus_battery_probe()
850 return -ENOMEM; in asus_battery_probe()
852 drvdata->battery_next_query = jiffies; in asus_battery_probe()
854 drvdata->battery = devm_power_supply_register(&hdev->dev, in asus_battery_probe()
855 &(drvdata->battery_desc), &pscfg); in asus_battery_probe()
856 if (IS_ERR(drvdata->battery)) { in asus_battery_probe()
857 ret = PTR_ERR(drvdata->battery); in asus_battery_probe()
858 drvdata->battery = NULL; in asus_battery_probe()
863 power_supply_powers(drvdata->battery, &hdev->dev); in asus_battery_probe()
870 struct input_dev *input = hi->input; in asus_input_configured()
874 if (drvdata->quirks & QUIRK_T100CHI && in asus_input_configured()
875 hi->report->id != T100CHI_MOUSE_REPORT_ID) in asus_input_configured()
879 if (drvdata->tp && (drvdata->quirks & QUIRK_MEDION_E1239T)) { in asus_input_configured()
880 switch (hi->report->id) { in asus_input_configured()
883 input->name = "Asus Touchpad Keys"; in asus_input_configured()
884 drvdata->tp_kbd_input = input; in asus_input_configured()
893 if (drvdata->tp) { in asus_input_configured()
897 drvdata->tp->max_x, 0, 0); in asus_input_configured()
899 drvdata->tp->max_y, 0, 0); in asus_input_configured()
900 input_abs_set_res(input, ABS_MT_POSITION_X, drvdata->tp->res_x); in asus_input_configured()
901 input_abs_set_res(input, ABS_MT_POSITION_Y, drvdata->tp->res_y); in asus_input_configured()
903 if (drvdata->tp->contact_size >= 5) { in asus_input_configured()
912 __set_bit(BTN_LEFT, input->keybit); in asus_input_configured()
913 __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); in asus_input_configured()
915 ret = input_mt_init_slots(input, drvdata->tp->max_contacts, in asus_input_configured()
924 drvdata->input = input; in asus_input_configured()
926 if (drvdata->enable_backlight && in asus_input_configured()
943 if (drvdata->quirks & QUIRK_SKIP_INPUT_MAPPING) { in asus_input_mapping()
947 return -1; in asus_input_mapping()
952 * This avoids a bunch of non-functional hid_input devices getting in asus_input_mapping()
955 if ((drvdata->quirks & (QUIRK_T100CHI | QUIRK_T90CHI)) && in asus_input_mapping()
956 (field->application == (HID_UP_GENDESK | 0x0080) || in asus_input_mapping()
957 field->application == HID_GD_MOUSE || in asus_input_mapping()
958 usage->hid == (HID_UP_GENDEVCTRLS | 0x0024) || in asus_input_mapping()
959 usage->hid == (HID_UP_GENDEVCTRLS | 0x0025) || in asus_input_mapping()
960 usage->hid == (HID_UP_GENDEVCTRLS | 0x0026))) in asus_input_mapping()
961 return -1; in asus_input_mapping()
963 /* ASUS-specific keyboard hotkeys and led backlight */ in asus_input_mapping()
964 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_ASUSVENDOR) { in asus_input_mapping()
965 switch (usage->hid & HID_USAGE) { in asus_input_mapping()
991 case 0x4b: asus_map_key_clear(KEY_F14); break; /* Arrows/Pg-Up/Dn toggle */ in asus_input_mapping()
994 case 0xa7: asus_map_key_clear(KEY_F17); break; /* ROG Ally ROG long-press */ in asus_input_mapping()
995 case 0xa8: asus_map_key_clear(KEY_F18); break; /* ROG Ally ROG long-press-release */ in asus_input_mapping()
1000 return -1; in asus_input_mapping()
1009 if (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT) in asus_input_mapping()
1010 drvdata->enable_backlight = true; in asus_input_mapping()
1012 set_bit(EV_REP, hi->input->evbit); in asus_input_mapping()
1016 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR) { in asus_input_mapping()
1017 switch (usage->hid & HID_USAGE) { in asus_input_mapping()
1039 set_bit(EV_REP, hi->input->evbit); in asus_input_mapping()
1043 if (drvdata->quirks & QUIRK_NO_CONSUMER_USAGES && in asus_input_mapping()
1044 (usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER) { in asus_input_mapping()
1045 switch (usage->hid & HID_USAGE) { in asus_input_mapping()
1054 return -1; in asus_input_mapping()
1062 if ((drvdata->quirks & QUIRK_MEDION_E1239T) && in asus_input_mapping()
1063 usage->hid == (HID_UP_CONSUMER | 0xe2)) { in asus_input_mapping()
1064 input_set_capability(hi->input, EV_KEY, KEY_MUTE); in asus_input_mapping()
1065 return -1; in asus_input_mapping()
1080 ret = -ENOMEM; in asus_start_multitouch()
1102 if (drvdata->kbd_backlight) { in asus_resume()
1104 drvdata->kbd_backlight->cdev.brightness }; in asus_resume()
1120 if (drvdata->tp) in asus_reset_resume()
1131 drvdata = devm_kzalloc(&hdev->dev, sizeof(*drvdata), GFP_KERNEL); in asus_probe()
1134 return -ENOMEM; in asus_probe()
1139 drvdata->quirks = id->driver_data; in asus_probe()
1145 if (strstr(hdev->name, "T90CHI")) { in asus_probe()
1146 drvdata->quirks &= ~QUIRK_T100CHI; in asus_probe()
1147 drvdata->quirks |= QUIRK_T90CHI; in asus_probe()
1150 if (drvdata->quirks & QUIRK_IS_MULTITOUCH) in asus_probe()
1151 drvdata->tp = &asus_i2c_tp; in asus_probe()
1153 if ((drvdata->quirks & QUIRK_T100_KEYBOARD) && hid_is_usb(hdev)) { in asus_probe()
1154 struct usb_interface *intf = to_usb_interface(hdev->dev.parent); in asus_probe()
1156 if (intf->altsetting->desc.bInterfaceNumber == T100_TPAD_INTF) { in asus_probe()
1157 drvdata->quirks = QUIRK_SKIP_INPUT_MAPPING; in asus_probe()
1159 * The T100HA uses the same USB-ids as the T100TAF and in asus_probe()
1160 * the T200TA uses the same USB-ids as the T100TA, while in asus_probe()
1164 drvdata->tp = &asus_t100ha_tp; in asus_probe()
1166 drvdata->tp = &asus_t200ta_tp; in asus_probe()
1168 drvdata->tp = &asus_t100ta_tp; in asus_probe()
1172 if (drvdata->quirks & QUIRK_T100CHI) { in asus_probe()
1177 hdev->quirks |= HID_QUIRK_MULTI_INPUT; in asus_probe()
1178 drvdata->tp = &asus_t100chi_tp; in asus_probe()
1181 if ((drvdata->quirks & QUIRK_MEDION_E1239T) && hid_is_usb(hdev)) { in asus_probe()
1183 to_usb_interface(hdev->dev.parent)->altsetting; in asus_probe()
1185 if (alt->desc.bInterfaceNumber == MEDION_E1239T_TPAD_INTF) { in asus_probe()
1186 /* For separate input-devs for tp and tp toggle key */ in asus_probe()
1187 hdev->quirks |= HID_QUIRK_MULTI_INPUT; in asus_probe()
1188 drvdata->quirks |= QUIRK_SKIP_INPUT_MAPPING; in asus_probe()
1189 drvdata->tp = &medion_e1239t_tp; in asus_probe()
1193 if (drvdata->quirks & QUIRK_NO_INIT_REPORTS) in asus_probe()
1194 hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; in asus_probe()
1196 drvdata->hdev = hdev; in asus_probe()
1198 if (drvdata->quirks & (QUIRK_T100CHI | QUIRK_T90CHI)) { in asus_probe()
1223 * leaving drvdata->input pointing to freed memory. in asus_probe()
1225 if (!drvdata->input || !(hdev->claimed & HID_CLAIMED_INPUT)) { in asus_probe()
1227 ret = -ENOMEM; in asus_probe()
1231 if (drvdata->tp) { in asus_probe()
1232 drvdata->input->name = "Asus TouchPad"; in asus_probe()
1234 drvdata->input->name = "Asus Keyboard"; in asus_probe()
1237 if (drvdata->tp) { in asus_probe()
1254 if (drvdata->kbd_backlight) { in asus_remove()
1255 spin_lock_irqsave(&drvdata->kbd_backlight->lock, flags); in asus_remove()
1256 drvdata->kbd_backlight->removed = true; in asus_remove()
1257 spin_unlock_irqrestore(&drvdata->kbd_backlight->lock, flags); in asus_remove()
1259 cancel_work_sync(&drvdata->kbd_backlight->work); in asus_remove()
1275 if (drvdata->quirks & QUIRK_FIX_NOTEBOOK_REPORT && in asus_report_fixup()
1281 if (drvdata->quirks & QUIRK_T100_KEYBOARD && in asus_report_fixup()
1288 if (drvdata->quirks & (QUIRK_T100CHI | QUIRK_T90CHI)) { in asus_report_fixup()
1292 if (drvdata->quirks & QUIRK_T100CHI) { in asus_report_fixup()
1314 drvdata->quirks & QUIRK_T100CHI ? in asus_report_fixup()
1325 if (drvdata->quirks & QUIRK_G752_KEYBOARD && in asus_report_fixup()
1331 new_rdesc = devm_kzalloc(&hdev->dev, new_size, GFP_KERNEL); in asus_report_fixup()
1341 memcpy(new_rdesc + 61 + sizeof(asus_g752_fixed_rdesc), rdesc + 61, *rsize - 61); in asus_report_fixup()
1347 if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && in asus_report_fixup()
1350 hid_info(hdev, "Fixing up Asus N-KEY keyb report descriptor\n"); in asus_report_fixup()
1354 /* match many more n-key devices */ in asus_report_fixup()
1355 if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && *rsize > 15) { in asus_report_fixup()
1356 for (int i = 0; i < *rsize - 15; i++) { in asus_report_fixup()
1360 hid_info(hdev, "Fixing up Asus N-Key report descriptor\n"); in asus_report_fixup()
1417 * part, while letting hid-multitouch.c handle the touchpad.