* [PATCH 0/2] HID: samsung: Object code size reduction and neatening
@ 2024-01-31 20:21 Joe Perches
2024-01-31 20:21 ` [PATCH 1/2] HID: samsung: Reduce code size Joe Perches
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Joe Perches @ 2024-01-31 20:21 UTC (permalink / raw)
To: linux-input
Cc: Sandeep C S, Junwan Cho, Jitender Sajwan, Jiri Kosina,
Benjamin Tissoires, linux-kernel
Reduce object size and neatening
Joe Perches (2):
HID: samsung: Reduce code size
HID: samsung: Object size reduction and neatening
drivers/hid/hid-samsung.c | 652 +++++++++++++++++---------------------
1 file changed, 283 insertions(+), 369 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] HID: samsung: Reduce code size
2024-01-31 20:21 [PATCH 0/2] HID: samsung: Object code size reduction and neatening Joe Perches
@ 2024-01-31 20:21 ` Joe Perches
2024-01-31 20:21 ` [PATCH 2/2] HID: samsung: Object size reduction and neatening Joe Perches
2024-02-12 18:09 ` [PATCH 0/2] HID: samsung: Object code " Joe Perches
2 siblings, 0 replies; 5+ messages in thread
From: Joe Perches @ 2024-01-31 20:21 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires
Cc: Sandeep C S, Junwan Cho, Jitender Sajwan, linux-input, linux-kernel
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@perches.com>
---
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
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] HID: samsung: Object size reduction and neatening
2024-01-31 20:21 [PATCH 0/2] HID: samsung: Object code size reduction and neatening Joe Perches
2024-01-31 20:21 ` [PATCH 1/2] HID: samsung: Reduce code size Joe Perches
@ 2024-01-31 20:21 ` Joe Perches
2024-02-12 18:09 ` [PATCH 0/2] HID: samsung: Object code " Joe Perches
2 siblings, 0 replies; 5+ messages in thread
From: Joe Perches @ 2024-01-31 20:21 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires
Cc: Sandeep C S, Junwan Cho, Jitender Sajwan, linux-input, linux-kernel
Use a switch/case in samsung_input_mapping to reduce object size.
$ size drivers/hid/hid-samsung.o*
text data bss dec hex filename
2842 432 0 3274 cca drivers/hid/hid-samsung.o.new
3203 440 0 3643 e3b drivers/hid/hid-samsung.o.old
Miscellaneous style neatening:
o Use unsigned int instead of unsigned
o Alignment to open parenthesis
o Line wrapping
Signed-off-by: Joe Perches <joe@perches.com>
---
drivers/hid/hid-samsung.c | 166 +++++++++++++++++++++-----------------
1 file changed, 94 insertions(+), 72 deletions(-)
diff --git a/drivers/hid/hid-samsung.c b/drivers/hid/hid-samsung.c
index d701dd3a914e7..63c18b9b8279f 100644
--- a/drivers/hid/hid-samsung.c
+++ b/drivers/hid/hid-samsung.c
@@ -49,31 +49,35 @@
* Report #3 has an array field with logical range 0..1 instead of 1..3.
*/
static inline void samsung_irda_dev_trace(struct hid_device *hdev,
- unsigned int rsize)
+ unsigned int rsize)
{
hid_info(hdev, "fixing up Samsung IrDA %d byte report descriptor\n",
rsize);
}
static __u8 *samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int *rsize)
+ unsigned int *rsize)
{
- if (*rsize == 184 && !memcmp(&rdesc[175], "\x25\x40\x75\x30\x95\x01", 6) &&
- rdesc[182] == 0x40) {
+ if (*rsize == 184 &&
+ !memcmp(&rdesc[175], "\x25\x40\x75\x30\x95\x01", 6) &&
+ rdesc[182] == 0x40) {
samsung_irda_dev_trace(hdev, 184);
rdesc[176] = 0xff;
rdesc[178] = 0x08;
rdesc[180] = 0x06;
rdesc[182] = 0x42;
- } else if (*rsize == 203 && !memcmp(&rdesc[192], "\x15\x00\x25\x12", 4)) {
+ } else if (*rsize == 203 &&
+ !memcmp(&rdesc[192], "\x15\x00\x25\x12", 4)) {
samsung_irda_dev_trace(hdev, 203);
rdesc[193] = 0x01;
rdesc[195] = 0x0f;
- } else if (*rsize == 135 && !memcmp(&rdesc[124], "\x15\x00\x25\x11", 4)) {
+ } else if (*rsize == 135 &&
+ !memcmp(&rdesc[124], "\x15\x00\x25\x11", 4)) {
samsung_irda_dev_trace(hdev, 135);
rdesc[125] = 0x01;
rdesc[127] = 0x0e;
- } else if (*rsize == 171 && !memcmp(&rdesc[160], "\x15\x00\x25\x01", 4)) {
+ } else if (*rsize == 171 &&
+ !memcmp(&rdesc[160], "\x15\x00\x25\x01", 4)) {
samsung_irda_dev_trace(hdev, 171);
rdesc[161] = 0x01;
rdesc[163] = 0x03;
@@ -82,19 +86,21 @@ static __u8 *samsung_irda_report_fixup(struct hid_device *hdev, __u8 *rdesc,
}
struct key_clear_map {
- unsigned use;
+ unsigned int 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,
- unsigned long **bit, int *max)
+ struct hid_input *hi,
+ struct hid_field *field,
+ struct hid_usage *usage,
+ unsigned long **bit, int *max)
{
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
int i;
- unsigned use;
- unsigned up = usage->hid & HID_USAGE_PAGE;
+ unsigned int use;
+ unsigned int up = usage->hid & HID_USAGE_PAGE;
static const struct key_clear_map kcm[] = {
{ 0x183, KEY_MEDIA },
{ 0x195, KEY_EMAIL },
@@ -129,12 +135,14 @@ static int samsung_kbd_mouse_input_mapping(struct hid_device *hdev,
}
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)
+ 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;
+ unsigned int use;
+ unsigned int up = usage->hid & HID_USAGE_PAGE;
if (!(up == HID_UP_CONSUMER || up == HID_UP_KEYBOARD))
return 0;
@@ -193,12 +201,14 @@ static int samsung_kbd_input_mapping(struct hid_device *hdev,
}
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)
+ 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;
+ unsigned int use;
+ unsigned int up = usage->hid & HID_USAGE_PAGE;
if (!(up == HID_UP_BUTTON || up == HID_UP_CONSUMER))
return 0;
@@ -258,12 +268,14 @@ static int samsung_gamepad_input_mapping(struct hid_device *hdev,
}
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)
+ 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;
+ unsigned int use;
+ unsigned int up = usage->hid & HID_USAGE_PAGE;
static const struct key_clear_map kcm[] = {
{ 0x301, 254 },
};
@@ -271,7 +283,8 @@ static int samsung_actionmouse_input_mapping(struct hid_device *hdev,
use = usage->hid & HID_USAGE;
dbg_hid("samsung wireless actionmouse input mapping event [0x%x], [0x%x], %ld, %ld, [0x%x]\n",
- use, usage->hid & HID_USAGE, hi->input->evbit[0], hi->input->absbit[0],
+ use, usage->hid & HID_USAGE,
+ hi->input->evbit[0], hi->input->absbit[0],
up);
if (!(up == HID_UP_CONSUMER || up == HID_UP_BUTTON))
@@ -288,12 +301,14 @@ static int samsung_actionmouse_input_mapping(struct hid_device *hdev,
}
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)
+ 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;
+ unsigned int use;
+ unsigned int up = usage->hid & HID_USAGE_PAGE;
if (!(up == HID_UP_CONSUMER || up == HID_UP_KEYBOARD))
return 0;
@@ -362,43 +377,46 @@ static int samsung_universal_kbd_input_mapping(struct hid_device *hdev,
}
static __u8 *samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc,
- unsigned int *rsize)
+ unsigned int *rsize)
{
- if (hdev->product == USB_DEVICE_ID_SAMSUNG_IR_REMOTE && hid_is_usb(hdev))
+ if (hdev->product == USB_DEVICE_ID_SAMSUNG_IR_REMOTE &&
+ hid_is_usb(hdev))
rdesc = samsung_irda_report_fixup(hdev, rdesc, rsize);
return rdesc;
}
-static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi,
- struct hid_field *field, struct hid_usage *usage,
- unsigned long **bit, int *max)
+static int samsung_input_mapping(struct hid_device *hdev,
+ struct hid_input *hi,
+ struct hid_field *field,
+ struct hid_usage *usage,
+ unsigned long **bit, int *max)
{
- int ret = 0;
-
- if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE && hid_is_usb(hdev))
- ret = samsung_kbd_mouse_input_mapping(hdev,
- hi, field, usage, bit, max);
- else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD)
- ret = samsung_kbd_input_mapping(hdev,
- hi, field, usage, bit, max);
- else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD)
- ret = samsung_gamepad_input_mapping(hdev,
- hi, field, usage, bit, max);
- else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE)
- ret = samsung_actionmouse_input_mapping(hdev,
- hi, field, usage, bit, max);
- else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD)
- ret = samsung_universal_kbd_input_mapping(hdev,
- hi, field, usage, bit, max);
- else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD)
- ret = samsung_universal_kbd_input_mapping(hdev,
- hi, field, usage, bit, max);
-
- return ret;
+ switch (hdev->product) {
+ case USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE:
+ if (hid_is_usb(hdev))
+ return samsung_kbd_mouse_input_mapping(hdev, hi, field,
+ usage, bit, max);
+ break;
+ case USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD:
+ return samsung_kbd_input_mapping(hdev, hi, field,
+ usage, bit, max);
+ case USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD:
+ return samsung_gamepad_input_mapping(hdev, hi, field,
+ usage, bit, max);
+ case USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE:
+ return samsung_actionmouse_input_mapping(hdev, hi, field,
+ usage, bit, max);
+ case USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD:
+ case USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD:
+ return samsung_universal_kbd_input_mapping(hdev, hi, field,
+ usage, bit, max);
+ }
+
+ return 0;
}
static int samsung_probe(struct hid_device *hdev,
- const struct hid_device_id *id)
+ const struct hid_device_id *id)
{
int ret;
unsigned int cmask = HID_CONNECT_DEFAULT;
@@ -406,14 +424,13 @@ static int samsung_probe(struct hid_device *hdev,
ret = hid_parse(hdev);
if (ret) {
hid_err(hdev, "parse failed\n");
- goto err_free;
+ return ret;
}
if (hdev->product == USB_DEVICE_ID_SAMSUNG_IR_REMOTE) {
- if (!hid_is_usb(hdev)) {
- ret = -EINVAL;
- goto err_free;
- }
+ if (!hid_is_usb(hdev))
+ return -EINVAL;
+
if (hdev->rsize == 184) {
/* disable hidinput, force hiddev */
cmask = (cmask & ~HID_CONNECT_HIDINPUT) |
@@ -424,22 +441,27 @@ static int samsung_probe(struct hid_device *hdev,
ret = hid_hw_start(hdev, cmask);
if (ret) {
hid_err(hdev, "hw start failed\n");
- goto err_free;
+ return ret;
}
return 0;
-err_free:
- return ret;
}
static const struct hid_device_id samsung_devices[] = {
- { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
- { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
- { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD) },
- { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD) },
- { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE) },
- { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD) },
- { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG,
+ USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG,
+ USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS,
+ USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS,
+ USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS,
+ USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS,
+ USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS,
+ USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD) },
{ }
};
MODULE_DEVICE_TABLE(hid, samsung_devices);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 0/2] HID: samsung: Object code size reduction and neatening
2024-01-31 20:21 [PATCH 0/2] HID: samsung: Object code size reduction and neatening Joe Perches
2024-01-31 20:21 ` [PATCH 1/2] HID: samsung: Reduce code size Joe Perches
2024-01-31 20:21 ` [PATCH 2/2] HID: samsung: Object size reduction and neatening Joe Perches
@ 2024-02-12 18:09 ` Joe Perches
2024-03-09 7:02 ` Joe Perches
2 siblings, 1 reply; 5+ messages in thread
From: Joe Perches @ 2024-02-12 18:09 UTC (permalink / raw)
To: linux-input
Cc: Sandeep C S, Junwan Cho, Jitender Sajwan, Jiri Kosina,
Benjamin Tissoires, linux-kernel
On Wed, 2024-01-31 at 12:21 -0800, Joe Perches wrote:
> Reduce object size and neatening
>
> Joe Perches (2):
> HID: samsung: Reduce code size
> HID: samsung: Object size reduction and neatening
>
> drivers/hid/hid-samsung.c | 652 +++++++++++++++++---------------------
> 1 file changed, 283 insertions(+), 369 deletions(-)
Any comment from the samsung folk on these?
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 0/2] HID: samsung: Object code size reduction and neatening
2024-02-12 18:09 ` [PATCH 0/2] HID: samsung: Object code " Joe Perches
@ 2024-03-09 7:02 ` Joe Perches
0 siblings, 0 replies; 5+ messages in thread
From: Joe Perches @ 2024-03-09 7:02 UTC (permalink / raw)
To: linux-input
Cc: Sandeep C S, Junwan Cho, Jitender Sajwan, Jiri Kosina,
Benjamin Tissoires, linux-kernel
On Mon, 2024-02-12 at 10:09 -0800, Joe Perches wrote:
> On Wed, 2024-01-31 at 12:21 -0800, Joe Perches wrote:
> > Reduce object size and neatening
> >
> > Joe Perches (2):
> > HID: samsung: Reduce code size
> > HID: samsung: Object size reduction and neatening
> >
> > drivers/hid/hid-samsung.c | 652 +++++++++++++++++---------------------
> > 1 file changed, 283 insertions(+), 369 deletions(-)
>
> Any comment from the samsung folk on these?
Ping?
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-03-09 7:02 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-31 20:21 [PATCH 0/2] HID: samsung: Object code size reduction and neatening Joe Perches
2024-01-31 20:21 ` [PATCH 1/2] HID: samsung: Reduce code size Joe Perches
2024-01-31 20:21 ` [PATCH 2/2] HID: samsung: Object size reduction and neatening Joe Perches
2024-02-12 18:09 ` [PATCH 0/2] HID: samsung: Object code " Joe Perches
2024-03-09 7:02 ` Joe Perches
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).