Remove samsung_kbd_mouse_map_key_clear macro and uses to reduce overall code size by ~8kb. $ size drivers/hid/hid-samsung.o* text data bss dec hex filename 3203 440 0 3643 e3b drivers/hid/hid-samsung.o.new 11286 448 0 11734 2dd6 drivers/hid/hid-samsung.o.old Consolidate multiple '&' uses. Create and use static const struct and for loops instead of multiple calls with hidden arguments of samsung_kbd_mouse_map_key_clear macro. Signed-off-by: Joe Perches <joe@xxxxxxxxxxx> --- drivers/hid/hid-samsung.c | 512 +++++++++++++++----------------------- 1 file changed, 202 insertions(+), 310 deletions(-) diff --git a/drivers/hid/hid-samsung.c b/drivers/hid/hid-samsung.c index 08fb25b8459af..d701dd3a914e7 100644 --- a/drivers/hid/hid-samsung.c +++ b/drivers/hid/hid-samsung.c @@ -81,8 +81,10 @@ static __u8 *samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc, return rdesc; } -#define samsung_kbd_mouse_map_key_clear(c) \ - hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c)) +struct key_clear_map { + unsigned use; + __u16 kb; +}; static int samsung_kbd_mouse_input_mapping(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, @@ -90,143 +92,101 @@ static int samsung_kbd_mouse_input_mapping(struct hid_device *hdev, { struct usb_interface *intf = to_usb_interface(hdev->dev.parent); unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber; - - if (ifnum != 1 || HID_UP_CONSUMER != (usage->hid & HID_USAGE_PAGE)) + int i; + unsigned use; + unsigned up = usage->hid & HID_USAGE_PAGE; + static const struct key_clear_map kcm[] = { + { 0x183, KEY_MEDIA }, + { 0x195, KEY_EMAIL }, + { 0x196, KEY_CALC }, + { 0x197, KEY_COMPUTER }, + { 0x22b, KEY_SEARCH }, + { 0x22c, KEY_WWW }, + { 0x22d, KEY_BACK }, + { 0x22e, KEY_FORWARD }, + { 0x22f, KEY_FAVORITES }, + { 0x230, KEY_REFRESH }, + { 0x231, KEY_STOP }, + }; + + if (ifnum != 1 || HID_UP_CONSUMER != up) return 0; + use = usage->hid & HID_USAGE; + dbg_hid("samsung wireless keyboard/mouse input mapping event [0x%x]\n", - usage->hid & HID_USAGE); - - switch (usage->hid & HID_USAGE) { - /* report 2 */ - case 0x183: - samsung_kbd_mouse_map_key_clear(KEY_MEDIA); - break; - case 0x195: - samsung_kbd_mouse_map_key_clear(KEY_EMAIL); - break; - case 0x196: - samsung_kbd_mouse_map_key_clear(KEY_CALC); - break; - case 0x197: - samsung_kbd_mouse_map_key_clear(KEY_COMPUTER); - break; - case 0x22b: - samsung_kbd_mouse_map_key_clear(KEY_SEARCH); - break; - case 0x22c: - samsung_kbd_mouse_map_key_clear(KEY_WWW); - break; - case 0x22d: - samsung_kbd_mouse_map_key_clear(KEY_BACK); - break; - case 0x22e: - samsung_kbd_mouse_map_key_clear(KEY_FORWARD); - break; - case 0x22f: - samsung_kbd_mouse_map_key_clear(KEY_FAVORITES); - break; - case 0x230: - samsung_kbd_mouse_map_key_clear(KEY_REFRESH); - break; - case 0x231: - samsung_kbd_mouse_map_key_clear(KEY_STOP); - break; - default: - return 0; + use); + + for (i = 0; i < ARRAY_SIZE(kcm); i++) { + if (use == kcm[i].use) { + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, + kcm[i].kb); + return 1; + } } - return 1; + return 0; } static int samsung_kbd_input_mapping(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) { - if (!(HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE) || - HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE))) + int i; + unsigned use; + unsigned up = usage->hid & HID_USAGE_PAGE; + + if (!(up == HID_UP_CONSUMER || up == HID_UP_KEYBOARD)) return 0; - dbg_hid("samsung wireless keyboard input mapping event [0x%x]\n", - usage->hid & HID_USAGE); + use = usage->hid & HID_USAGE; + + dbg_hid("samsung wireless keyboard input mapping event [0x%x]\n", use); + + if (up == HID_UP_KEYBOARD) { + static const struct key_clear_map kcm[] = { + { 0x32, KEY_BACKSLASH }, + { 0x64, KEY_102ND }, + { 0x87, KEY_RO }, + }; - if (HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE)) { set_bit(EV_REP, hi->input->evbit); - switch (usage->hid & HID_USAGE) { - case 0x32: - samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH); - break; - case 0x64: - samsung_kbd_mouse_map_key_clear(KEY_102ND); - break; - /* Only for BR keyboard */ - case 0x87: - samsung_kbd_mouse_map_key_clear(KEY_RO); - break; - default: - return 0; + for (i = 0; i < ARRAY_SIZE(kcm); i++) { + if (use == kcm[i].use) { + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, + kcm[i].kb); + return 1; + } } + return 0; } - if (HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE)) { - switch (usage->hid & HID_USAGE) { - /* report 2 */ - /* MENU */ - case 0x040: - samsung_kbd_mouse_map_key_clear(KEY_MENU); - break; - case 0x18a: - samsung_kbd_mouse_map_key_clear(KEY_MAIL); - break; - case 0x196: - samsung_kbd_mouse_map_key_clear(KEY_WWW); - break; - case 0x19e: - samsung_kbd_mouse_map_key_clear(KEY_SCREENLOCK); - break; - case 0x221: - samsung_kbd_mouse_map_key_clear(KEY_SEARCH); - break; - case 0x223: - samsung_kbd_mouse_map_key_clear(KEY_HOMEPAGE); - break; - /* Smtart Voice Key */ - case 0x300: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY13); - break; - /* RECENTAPPS */ - case 0x301: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY1); - break; - /* APPLICATION */ - case 0x302: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY2); - break; - /* Voice search */ - case 0x305: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY4); - break; - /* QPANEL on/off */ - case 0x306: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY5); - break; - /* SIP on/off */ - case 0x307: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY3); - break; - /* LANG */ - case 0x308: - samsung_kbd_mouse_map_key_clear(KEY_LANGUAGE); - break; - case 0x30a: - samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN); - break; - case 0x30b: - samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP); - break; - default: - return 0; + if (up == HID_UP_CONSUMER) { + static const struct key_clear_map kcm[] = { + { 0x040, KEY_MENU }, /* MENU */ + { 0x18a, KEY_MAIL }, + { 0x196, KEY_WWW }, + { 0x19e, KEY_SCREENLOCK }, + { 0x221, KEY_SEARCH }, + { 0x223, KEY_HOMEPAGE }, + { 0x300, BTN_TRIGGER_HAPPY13 }, /* Smtart Voice Key */ + { 0x301, BTN_TRIGGER_HAPPY1 }, /* RECENTAPPS */ + { 0x302, BTN_TRIGGER_HAPPY2 }, /* APPLICATION */ + { 0x305, BTN_TRIGGER_HAPPY4 }, /* Voice search */ + { 0x306, BTN_TRIGGER_HAPPY5 }, /* QPANEL on/off */ + { 0x307, BTN_TRIGGER_HAPPY3 }, /* SIP on/off */ + { 0x308, KEY_LANGUAGE }, /* LANG */ + { 0x30a, KEY_BRIGHTNESSDOWN }, + { 0x30b, KEY_BRIGHTNESSUP }, + }; + for (i = 0; i < ARRAY_SIZE(kcm); i++) { + if (use == kcm[i].use) { + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, + kcm[i].kb); + return 1; + } } + return 0; } return 1; @@ -236,88 +196,62 @@ static int samsung_gamepad_input_mapping(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) { - if (!(HID_UP_BUTTON == (usage->hid & HID_USAGE_PAGE) || - HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE))) + int i; + unsigned use; + unsigned up = usage->hid & HID_USAGE_PAGE; + + if (!(up == HID_UP_BUTTON || up == HID_UP_CONSUMER)) return 0; + use = usage->hid & HID_USAGE; + dbg_hid("samsung wireless gamepad input mapping event [0x%x], %ld, %ld, [0x%x]\n", - usage->hid & HID_USAGE, hi->input->evbit[0], hi->input->absbit[0], usage->hid & HID_USAGE_PAGE); - - if (HID_UP_BUTTON == (usage->hid & HID_USAGE_PAGE)) { - switch (usage->hid & HID_USAGE) { - case 0x01: - samsung_kbd_mouse_map_key_clear(BTN_A); - break; - case 0x02: - samsung_kbd_mouse_map_key_clear(BTN_B); - break; - case 0x03: - samsung_kbd_mouse_map_key_clear(BTN_C); - break; - case 0x04: - samsung_kbd_mouse_map_key_clear(BTN_X); - break; - case 0x05: - samsung_kbd_mouse_map_key_clear(BTN_Y); - break; - case 0x06: - samsung_kbd_mouse_map_key_clear(BTN_Z); - break; - case 0x07: - samsung_kbd_mouse_map_key_clear(BTN_TL); - break; - case 0x08: - samsung_kbd_mouse_map_key_clear(BTN_TR); - break; - case 0x09: - samsung_kbd_mouse_map_key_clear(BTN_TL2); - break; - case 0x0a: - samsung_kbd_mouse_map_key_clear(BTN_TR2); - break; - case 0x0b: - samsung_kbd_mouse_map_key_clear(BTN_SELECT); - break; - case 0x0c: - samsung_kbd_mouse_map_key_clear(BTN_START); - break; - case 0x0d: - samsung_kbd_mouse_map_key_clear(BTN_MODE); - break; - case 0x0e: - samsung_kbd_mouse_map_key_clear(BTN_THUMBL); - break; - case 0x0f: - samsung_kbd_mouse_map_key_clear(BTN_THUMBR); - break; - case 0x10: - samsung_kbd_mouse_map_key_clear(0x13f); - break; - default: - return 0; + use, hi->input->evbit[0], hi->input->absbit[0], up); + + if (up == HID_UP_BUTTON) { + static const struct key_clear_map kcm[] = { + { 0x01, BTN_A }, + { 0x02, BTN_B }, + { 0x03, BTN_C }, + { 0x04, BTN_X }, + { 0x05, BTN_Y }, + { 0x06, BTN_Z }, + { 0x07, BTN_TL }, + { 0x08, BTN_TR }, + { 0x09, BTN_TL2 }, + { 0x0a, BTN_TR2 }, + { 0x0b, BTN_SELECT }, + { 0x0c, BTN_START }, + { 0x0d, BTN_MODE }, + { 0x0e, BTN_THUMBL }, + { 0x0f, BTN_THUMBR }, + { 0x10, 0x13f }, + }; + for (i = 0; i < ARRAY_SIZE(kcm); i++) { + if (use == kcm[i].use) { + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, + kcm[i].kb); + return 1; + } } + return 0; } - if (HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE)) { - switch (usage->hid & HID_USAGE) { - case 0x040: - samsung_kbd_mouse_map_key_clear(KEY_MENU); - break; - case 0x223: - samsung_kbd_mouse_map_key_clear(KEY_HOMEPAGE); - break; - case 0x224: - samsung_kbd_mouse_map_key_clear(KEY_BACK); - break; - - /* Screen Capture */ - case 0x303: - samsung_kbd_mouse_map_key_clear(KEY_SYSRQ); - break; - - default: - return 0; + if (up == HID_UP_CONSUMER) { + static const struct key_clear_map kcm[] = { + { 0x040, KEY_MENU }, + { 0x223, KEY_HOMEPAGE }, + { 0x224, KEY_BACK }, + { 0x303, KEY_SYSRQ }, /* Screen Capture */ + }; + for (i = 0; i < ARRAY_SIZE(kcm); i++) { + if (use == kcm[i].use) { + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, + kcm[i].kb); + return 1; + } } + return 0; } return 1; @@ -327,22 +261,29 @@ static int samsung_actionmouse_input_mapping(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) { + int i; + unsigned use; + unsigned up = usage->hid & HID_USAGE_PAGE; + static const struct key_clear_map kcm[] = { + { 0x301, 254 }, + }; + + use = usage->hid & HID_USAGE; dbg_hid("samsung wireless actionmouse input mapping event [0x%x], [0x%x], %ld, %ld, [0x%x]\n", - usage->hid, usage->hid & HID_USAGE, hi->input->evbit[0], hi->input->absbit[0], - usage->hid & HID_USAGE_PAGE); + use, usage->hid & HID_USAGE, hi->input->evbit[0], hi->input->absbit[0], + up); - if (((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER) && ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON)) + if (!(up == HID_UP_CONSUMER || up == HID_UP_BUTTON)) return 0; - switch (usage->hid & HID_USAGE) { - case 0x301: - samsung_kbd_mouse_map_key_clear(254); - break; - default: - return 0; + for (i = 0; i < ARRAY_SIZE(kcm); i++) { + if (use == kcm[i].use) { + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, + kcm[i].kb); + return 1; + } } - return 1; } @@ -350,120 +291,71 @@ static int samsung_universal_kbd_input_mapping(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) { - if (!(HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE) || - HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE))) + int i; + unsigned use; + unsigned up = usage->hid & HID_USAGE_PAGE; + + if (!(up == HID_UP_CONSUMER || up == HID_UP_KEYBOARD)) return 0; - dbg_hid("samsung wireless keyboard input mapping event [0x%x]\n", - usage->hid & HID_USAGE); + use = usage->hid & HID_USAGE; + + dbg_hid("samsung wireless keyboard input mapping event [0x%x]\n", use); + + if (up == HID_UP_KEYBOARD) { + static const struct key_clear_map kcm[] = { + { 0x32, KEY_BACKSLASH }, + { 0x64, KEY_102ND }, + { 0x87, KEY_RO }, /* Only for BR keyboard */ + }; - if (HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE)) { set_bit(EV_REP, hi->input->evbit); - switch (usage->hid & HID_USAGE) { - case 0x32: - samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH); - break; - case 0x64: - samsung_kbd_mouse_map_key_clear(KEY_102ND); - break; - /* Only for BR keyboard */ - case 0x87: - samsung_kbd_mouse_map_key_clear(KEY_RO); - break; - default: - return 0; + for (i = 0; i < ARRAY_SIZE(kcm); i++) { + if (use == kcm[i].use) { + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, + kcm[i].kb); + return 1; + } } + return 0; } - if (HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE)) { - switch (usage->hid & HID_USAGE) { + if (up == HID_UP_CONSUMER) { /* report 2 */ - /* MENU */ - case 0x040: - samsung_kbd_mouse_map_key_clear(KEY_MENU); - break; - case 0x18a: - samsung_kbd_mouse_map_key_clear(KEY_MAIL); - break; - case 0x196: - samsung_kbd_mouse_map_key_clear(KEY_WWW); - break; - case 0x19e: - samsung_kbd_mouse_map_key_clear(KEY_SCREENLOCK); - break; - case 0x221: - samsung_kbd_mouse_map_key_clear(KEY_SEARCH); - break; - case 0x223: - samsung_kbd_mouse_map_key_clear(KEY_HOMEPAGE); - break; - /* RECENTAPPS */ - case 0x301: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY1); - break; - /* APPLICATION */ - case 0x302: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY2); - break; - /* Voice search */ - case 0x305: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY4); - break; - /* QPANEL on/off */ - case 0x306: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY5); - break; - /* SIP on/off */ - case 0x307: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY3); - break; - /* LANG */ - case 0x308: - samsung_kbd_mouse_map_key_clear(KEY_LANGUAGE); - break; - case 0x30a: - samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN); - break; - case 0x070: - samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN); - break; - case 0x30b: - samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP); - break; - case 0x06f: - samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP); - break; - /* S-Finder */ - case 0x304: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY7); - break; - /* Screen Capture */ - case 0x303: - samsung_kbd_mouse_map_key_clear(KEY_SYSRQ); - break; - /* Multi Window */ - case 0x309: - samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY9); - break; - /* HotKey App 1 */ - case 0x071: - samsung_kbd_mouse_map_key_clear(0x2f5); - break; - /* HotKey App 2 */ - case 0x072: - samsung_kbd_mouse_map_key_clear(0x2f6); - break; - /* HotKey App 3 */ - case 0x073: - samsung_kbd_mouse_map_key_clear(0x2f7); - break; - /* Dex */ - case 0x06e: - samsung_kbd_mouse_map_key_clear(0x2bd); - break; - default: - return 0; + static const struct key_clear_map kcm[] = { + { 0x040, KEY_MENU }, /* MENU */ + { 0x18a, KEY_MAIL }, + { 0x196, KEY_WWW }, + { 0x19e, KEY_SCREENLOCK }, + { 0x221, KEY_SEARCH }, + { 0x223, KEY_HOMEPAGE }, + { 0x301, BTN_TRIGGER_HAPPY1 }, /* RECENTAPPS */ + { 0x302, BTN_TRIGGER_HAPPY2 }, /* APPLICATION */ + { 0x305, BTN_TRIGGER_HAPPY4 }, /* Voice search */ + { 0x306, BTN_TRIGGER_HAPPY5 }, /* QPANEL on/off */ + { 0x307, BTN_TRIGGER_HAPPY3 }, /* SIP on/off */ + { 0x308, KEY_LANGUAGE }, /* LANG */ + { 0x30a, KEY_BRIGHTNESSDOWN }, + { 0x070, KEY_BRIGHTNESSDOWN }, + { 0x30b, KEY_BRIGHTNESSUP }, + { 0x06f, KEY_BRIGHTNESSUP }, + { 0x304, BTN_TRIGGER_HAPPY7 }, /* S-Finder */ + { 0x303, KEY_SYSRQ }, /* Screen Capture */ + { 0x309, BTN_TRIGGER_HAPPY9 }, /* Multi Window */ + { 0x071, 0x2f5 }, /* HotKey App 1 */ + { 0x072, 0x2f6 }, /* HotKey App 2 */ + { 0x073, 0x2f7 }, /* HotKey App 3 */ + { 0x06e, 0x2bd }, /* Dex */ + }; + + for (i = 0; i < ARRAY_SIZE(kcm); i++) { + if (use == kcm[i].use) { + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, + kcm[i].kb); + return 1; + } } + return 0; } return 1; -- 2.43.0