diff mbox series

HID: input: Reduce object size by minimizing repeated calls

Message ID c7048f814c000d5581cc5fda7c4e88361a56adc3.camel@perches.com (mailing list archive)
State New, archived
Delegated to: Jiri Kosina
Headers show
Series HID: input: Reduce object size by minimizing repeated calls | expand

Commit Message

Joe Perches May 10, 2022, 6:56 a.m. UTC
Reduce object size by using an automatic for various repeated calls
to map_abs, map_key_clear, and map_led in switch/case statements.

$ size drivers/hid/hid-input.o* (defconfig x86-64)
   text	   data	    bss	    dec	    hex	filename
  22042	     88	      0	  22130	   5672	drivers/hid/hid-input.o.new
  27589	     88	      0	  27677	   6c1d	drivers/hid/hid-input.o.old

Signed-off-by: Joe Perches <joe@perches.com>
---
 drivers/hid/hid-input.c | 522 ++++++++++++++++++++++++++----------------------
 1 file changed, 278 insertions(+), 244 deletions(-)

Comments

Joe Perches May 18, 2022, 8:26 p.m. UTC | #1
On Mon, 2022-05-09 at 23:56 -0700, Joe Perches wrote:
> Reduce object size by using an automatic for various repeated calls
> to map_abs, map_key_clear, and map_led in switch/case statements.

ping?

> 
> $ size drivers/hid/hid-input.o* (defconfig x86-64)
>    text	   data	    bss	    dec	    hex	filename
>   22042	     88	      0	  22130	   5672	drivers/hid/hid-input.o.new
>   27589	     88	      0	  27677	   6c1d	drivers/hid/hid-input.o.old
> 
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
>  drivers/hid/hid-input.c | 522 ++++++++++++++++++++++++++----------------------
>  1 file changed, 278 insertions(+), 244 deletions(-)
> 
> diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
> index c6b27aab90414..21d67866efb06 100644
> --- a/drivers/hid/hid-input.c
> +++ b/drivers/hid/hid-input.c
> @@ -743,37 +743,44 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
>  		map_key(code);
>  		break;
>  
> -	case HID_UP_SIMULATION:
> +	case HID_UP_SIMULATION: {
> +		int abs;
> +
>  		switch (usage->hid & 0xffff) {
> -		case 0xba: map_abs(ABS_RUDDER);   break;
> -		case 0xbb: map_abs(ABS_THROTTLE); break;
> -		case 0xc4: map_abs(ABS_GAS);      break;
> -		case 0xc5: map_abs(ABS_BRAKE);    break;
> -		case 0xc8: map_abs(ABS_WHEEL);    break;
> +		case 0xba: abs = ABS_RUDDER;	break;
> +		case 0xbb: abs = ABS_THROTTLE;	break;
> +		case 0xc4: abs = ABS_GAS;	break;
> +		case 0xc5: abs = ABS_BRAKE;	break;
> +		case 0xc8: abs = ABS_WHEEL;	break;
>  		default:   goto ignore;
>  		}
> +		map_abs(abs);
>  		break;
> +	}
>  
>  	case HID_UP_GENDESK:
>  		if ((usage->hid & 0xf0) == 0x80) {	/* SystemControl */
> +			int key;
> +
>  			switch (usage->hid & 0xf) {
> -			case 0x1: map_key_clear(KEY_POWER);  break;
> -			case 0x2: map_key_clear(KEY_SLEEP);  break;
> -			case 0x3: map_key_clear(KEY_WAKEUP); break;
> -			case 0x4: map_key_clear(KEY_CONTEXT_MENU); break;
> -			case 0x5: map_key_clear(KEY_MENU); break;
> -			case 0x6: map_key_clear(KEY_PROG1); break;
> -			case 0x7: map_key_clear(KEY_HELP); break;
> -			case 0x8: map_key_clear(KEY_EXIT); break;
> -			case 0x9: map_key_clear(KEY_SELECT); break;
> -			case 0xa: map_key_clear(KEY_RIGHT); break;
> -			case 0xb: map_key_clear(KEY_LEFT); break;
> -			case 0xc: map_key_clear(KEY_UP); break;
> -			case 0xd: map_key_clear(KEY_DOWN); break;
> -			case 0xe: map_key_clear(KEY_POWER2); break;
> -			case 0xf: map_key_clear(KEY_RESTART); break;
> +			case 0x1: key = KEY_POWER;	break;
> +			case 0x2: key = KEY_SLEEP;	break;
> +			case 0x3: key = KEY_WAKEUP;	break;
> +			case 0x4: key = KEY_CONTEXT_MENU; break;
> +			case 0x5: key = KEY_MENU;	break;
> +			case 0x6: key = KEY_PROG1;	break;
> +			case 0x7: key = KEY_HELP;	break;
> +			case 0x8: key = KEY_EXIT;	break;
> +			case 0x9: key = KEY_SELECT;	break;
> +			case 0xa: key = KEY_RIGHT;	break;
> +			case 0xb: key = KEY_LEFT;	break;
> +			case 0xc: key = KEY_UP;		break;
> +			case 0xd: key = KEY_DOWN;	break;
> +			case 0xe: key = KEY_POWER2;	break;
> +			case 0xf: key = KEY_RESTART;	break;
>  			default: goto unknown;
>  			}
> +			map_key_clear(key);
>  			break;
>  		}
>  
> @@ -859,23 +866,27 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
>  
>  		break;
>  
> -	case HID_UP_LED:
> -		switch (usage->hid & 0xffff) {		      /* HID-Value:                   */
> -		case 0x01:  map_led (LED_NUML);     break;    /*   "Num Lock"                 */
> -		case 0x02:  map_led (LED_CAPSL);    break;    /*   "Caps Lock"                */
> -		case 0x03:  map_led (LED_SCROLLL);  break;    /*   "Scroll Lock"              */
> -		case 0x04:  map_led (LED_COMPOSE);  break;    /*   "Compose"                  */
> -		case 0x05:  map_led (LED_KANA);     break;    /*   "Kana"                     */
> -		case 0x27:  map_led (LED_SLEEP);    break;    /*   "Stand-By"                 */
> -		case 0x4c:  map_led (LED_SUSPEND);  break;    /*   "System Suspend"           */
> -		case 0x09:  map_led (LED_MUTE);     break;    /*   "Mute"                     */
> -		case 0x4b:  map_led (LED_MISC);     break;    /*   "Generic Indicator"        */
> -		case 0x19:  map_led (LED_MAIL);     break;    /*   "Message Waiting"          */
> -		case 0x4d:  map_led (LED_CHARGING); break;    /*   "External Power Connected" */
> +	case HID_UP_LED: {
> +		int led;
> +
> +		switch (usage->hid & 0xffff) {		/* HID-Value: */
> +		case 0x01:  led = LED_NUML;	break;	/* Num Lock */
> +		case 0x02:  led = LED_CAPSL;	break;	/* Caps Lock */
> +		case 0x03:  led = LED_SCROLLL;	break;	/* Scroll Lock */
> +		case 0x04:  led = LED_COMPOSE;	break;	/* Compose */
> +		case 0x05:  led = LED_KANA;	break;	/* Kana */
> +		case 0x27:  led = LED_SLEEP;	break;	/* Stand-By */
> +		case 0x4c:  led = LED_SUSPEND;	break;	/* System Suspend */
> +		case 0x09:  led = LED_MUTE;	break;	/* Mute */
> +		case 0x4b:  led = LED_MISC;	break;	/* Generic Indicator */
> +		case 0x19:  led = LED_MAIL;	break;	/* Message Waiting */
> +		case 0x4d:  led = LED_CHARGING;	break;	/* External Power Connected */
>  
>  		default: goto ignore;
>  		}
> +		map_led(led);
>  		break;
> +	}
>  
>  	case HID_UP_DIGITIZER:
>  		if ((field->application & 0xff) == 0x01) /* Digitizer */
> @@ -976,218 +987,233 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
>  		}
>  		break;
>  
> -	case HID_UP_TELEPHONY:
> +	case HID_UP_TELEPHONY: {
> +		int key;
> +
>  		switch (usage->hid & HID_USAGE) {
> -		case 0x2f: map_key_clear(KEY_MICMUTE);		break;
> -		case 0xb0: map_key_clear(KEY_NUMERIC_0);	break;
> -		case 0xb1: map_key_clear(KEY_NUMERIC_1);	break;
> -		case 0xb2: map_key_clear(KEY_NUMERIC_2);	break;
> -		case 0xb3: map_key_clear(KEY_NUMERIC_3);	break;
> -		case 0xb4: map_key_clear(KEY_NUMERIC_4);	break;
> -		case 0xb5: map_key_clear(KEY_NUMERIC_5);	break;
> -		case 0xb6: map_key_clear(KEY_NUMERIC_6);	break;
> -		case 0xb7: map_key_clear(KEY_NUMERIC_7);	break;
> -		case 0xb8: map_key_clear(KEY_NUMERIC_8);	break;
> -		case 0xb9: map_key_clear(KEY_NUMERIC_9);	break;
> -		case 0xba: map_key_clear(KEY_NUMERIC_STAR);	break;
> -		case 0xbb: map_key_clear(KEY_NUMERIC_POUND);	break;
> -		case 0xbc: map_key_clear(KEY_NUMERIC_A);	break;
> -		case 0xbd: map_key_clear(KEY_NUMERIC_B);	break;
> -		case 0xbe: map_key_clear(KEY_NUMERIC_C);	break;
> -		case 0xbf: map_key_clear(KEY_NUMERIC_D);	break;
> +		case 0x2f: key = KEY_MICMUTE;		break;
> +		case 0xb0: key = KEY_NUMERIC_0;		break;
> +		case 0xb1: key = KEY_NUMERIC_1;		break;
> +		case 0xb2: key = KEY_NUMERIC_2;		break;
> +		case 0xb3: key = KEY_NUMERIC_3;		break;
> +		case 0xb4: key = KEY_NUMERIC_4;		break;
> +		case 0xb5: key = KEY_NUMERIC_5;		break;
> +		case 0xb6: key = KEY_NUMERIC_6;		break;
> +		case 0xb7: key = KEY_NUMERIC_7;		break;
> +		case 0xb8: key = KEY_NUMERIC_8;		break;
> +		case 0xb9: key = KEY_NUMERIC_9;		break;
> +		case 0xba: key = KEY_NUMERIC_STAR;	break;
> +		case 0xbb: key = KEY_NUMERIC_POUND;	break;
> +		case 0xbc: key = KEY_NUMERIC_A;		break;
> +		case 0xbd: key = KEY_NUMERIC_B;		break;
> +		case 0xbe: key = KEY_NUMERIC_C;		break;
> +		case 0xbf: key = KEY_NUMERIC_D;		break;
>  		default: goto ignore;
>  		}
> +		map_key_clear(key);
>  		break;
> +	}
> +
> +	case HID_UP_CONSUMER: {	/* USB HUT v1.12, pages 75-84 */
> +		int key;
> +		bool clear = true;
>  
> -	case HID_UP_CONSUMER:	/* USB HUT v1.12, pages 75-84 */
>  		switch (usage->hid & HID_USAGE) {
>  		case 0x000: goto ignore;
> -		case 0x030: map_key_clear(KEY_POWER);		break;
> -		case 0x031: map_key_clear(KEY_RESTART);		break;
> -		case 0x032: map_key_clear(KEY_SLEEP);		break;
> -		case 0x034: map_key_clear(KEY_SLEEP);		break;
> -		case 0x035: map_key_clear(KEY_KBDILLUMTOGGLE);	break;
> -		case 0x036: map_key_clear(BTN_MISC);		break;
> -
> -		case 0x040: map_key_clear(KEY_MENU);		break; /* Menu */
> -		case 0x041: map_key_clear(KEY_SELECT);		break; /* Menu Pick */
> -		case 0x042: map_key_clear(KEY_UP);		break; /* Menu Up */
> -		case 0x043: map_key_clear(KEY_DOWN);		break; /* Menu Down */
> -		case 0x044: map_key_clear(KEY_LEFT);		break; /* Menu Left */
> -		case 0x045: map_key_clear(KEY_RIGHT);		break; /* Menu Right */
> -		case 0x046: map_key_clear(KEY_ESC);		break; /* Menu Escape */
> -		case 0x047: map_key_clear(KEY_KPPLUS);		break; /* Menu Value Increase */
> -		case 0x048: map_key_clear(KEY_KPMINUS);		break; /* Menu Value Decrease */
> -
> -		case 0x060: map_key_clear(KEY_INFO);		break; /* Data On Screen */
> -		case 0x061: map_key_clear(KEY_SUBTITLE);	break; /* Closed Caption */
> -		case 0x063: map_key_clear(KEY_VCR);		break; /* VCR/TV */
> -		case 0x065: map_key_clear(KEY_CAMERA);		break; /* Snapshot */
> -		case 0x069: map_key_clear(KEY_RED);		break;
> -		case 0x06a: map_key_clear(KEY_GREEN);		break;
> -		case 0x06b: map_key_clear(KEY_BLUE);		break;
> -		case 0x06c: map_key_clear(KEY_YELLOW);		break;
> -		case 0x06d: map_key_clear(KEY_ASPECT_RATIO);	break;
> -
> -		case 0x06f: map_key_clear(KEY_BRIGHTNESSUP);		break;
> -		case 0x070: map_key_clear(KEY_BRIGHTNESSDOWN);		break;
> -		case 0x072: map_key_clear(KEY_BRIGHTNESS_TOGGLE);	break;
> -		case 0x073: map_key_clear(KEY_BRIGHTNESS_MIN);		break;
> -		case 0x074: map_key_clear(KEY_BRIGHTNESS_MAX);		break;
> -		case 0x075: map_key_clear(KEY_BRIGHTNESS_AUTO);		break;
> -
> -		case 0x079: map_key_clear(KEY_KBDILLUMUP);	break;
> -		case 0x07a: map_key_clear(KEY_KBDILLUMDOWN);	break;
> -		case 0x07c: map_key_clear(KEY_KBDILLUMTOGGLE);	break;
> -
> -		case 0x082: map_key_clear(KEY_VIDEO_NEXT);	break;
> -		case 0x083: map_key_clear(KEY_LAST);		break;
> -		case 0x084: map_key_clear(KEY_ENTER);		break;
> -		case 0x088: map_key_clear(KEY_PC);		break;
> -		case 0x089: map_key_clear(KEY_TV);		break;
> -		case 0x08a: map_key_clear(KEY_WWW);		break;
> -		case 0x08b: map_key_clear(KEY_DVD);		break;
> -		case 0x08c: map_key_clear(KEY_PHONE);		break;
> -		case 0x08d: map_key_clear(KEY_PROGRAM);		break;
> -		case 0x08e: map_key_clear(KEY_VIDEOPHONE);	break;
> -		case 0x08f: map_key_clear(KEY_GAMES);		break;
> -		case 0x090: map_key_clear(KEY_MEMO);		break;
> -		case 0x091: map_key_clear(KEY_CD);		break;
> -		case 0x092: map_key_clear(KEY_VCR);		break;
> -		case 0x093: map_key_clear(KEY_TUNER);		break;
> -		case 0x094: map_key_clear(KEY_EXIT);		break;
> -		case 0x095: map_key_clear(KEY_HELP);		break;
> -		case 0x096: map_key_clear(KEY_TAPE);		break;
> -		case 0x097: map_key_clear(KEY_TV2);		break;
> -		case 0x098: map_key_clear(KEY_SAT);		break;
> -		case 0x09a: map_key_clear(KEY_PVR);		break;
> -
> -		case 0x09c: map_key_clear(KEY_CHANNELUP);	break;
> -		case 0x09d: map_key_clear(KEY_CHANNELDOWN);	break;
> -		case 0x0a0: map_key_clear(KEY_VCR2);		break;
> -
> -		case 0x0b0: map_key_clear(KEY_PLAY);		break;
> -		case 0x0b1: map_key_clear(KEY_PAUSE);		break;
> -		case 0x0b2: map_key_clear(KEY_RECORD);		break;
> -		case 0x0b3: map_key_clear(KEY_FASTFORWARD);	break;
> -		case 0x0b4: map_key_clear(KEY_REWIND);		break;
> -		case 0x0b5: map_key_clear(KEY_NEXTSONG);	break;
> -		case 0x0b6: map_key_clear(KEY_PREVIOUSSONG);	break;
> -		case 0x0b7: map_key_clear(KEY_STOPCD);		break;
> -		case 0x0b8: map_key_clear(KEY_EJECTCD);		break;
> -		case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT);	break;
> -		case 0x0b9: map_key_clear(KEY_SHUFFLE);		break;
> -		case 0x0bf: map_key_clear(KEY_SLOW);		break;
> -
> -		case 0x0cd: map_key_clear(KEY_PLAYPAUSE);	break;
> -		case 0x0cf: map_key_clear(KEY_VOICECOMMAND);	break;
> -
> -		case 0x0d8: map_key_clear(KEY_DICTATE);		break;
> -		case 0x0d9: map_key_clear(KEY_EMOJI_PICKER);	break;
> -
> -		case 0x0e0: map_abs_clear(ABS_VOLUME);		break;
> -		case 0x0e2: map_key_clear(KEY_MUTE);		break;
> -		case 0x0e5: map_key_clear(KEY_BASSBOOST);	break;
> -		case 0x0e9: map_key_clear(KEY_VOLUMEUP);	break;
> -		case 0x0ea: map_key_clear(KEY_VOLUMEDOWN);	break;
> -		case 0x0f5: map_key_clear(KEY_SLOW);		break;
> -
> -		case 0x181: map_key_clear(KEY_BUTTONCONFIG);	break;
> -		case 0x182: map_key_clear(KEY_BOOKMARKS);	break;
> -		case 0x183: map_key_clear(KEY_CONFIG);		break;
> -		case 0x184: map_key_clear(KEY_WORDPROCESSOR);	break;
> -		case 0x185: map_key_clear(KEY_EDITOR);		break;
> -		case 0x186: map_key_clear(KEY_SPREADSHEET);	break;
> -		case 0x187: map_key_clear(KEY_GRAPHICSEDITOR);	break;
> -		case 0x188: map_key_clear(KEY_PRESENTATION);	break;
> -		case 0x189: map_key_clear(KEY_DATABASE);	break;
> -		case 0x18a: map_key_clear(KEY_MAIL);		break;
> -		case 0x18b: map_key_clear(KEY_NEWS);		break;
> -		case 0x18c: map_key_clear(KEY_VOICEMAIL);	break;
> -		case 0x18d: map_key_clear(KEY_ADDRESSBOOK);	break;
> -		case 0x18e: map_key_clear(KEY_CALENDAR);	break;
> -		case 0x18f: map_key_clear(KEY_TASKMANAGER);	break;
> -		case 0x190: map_key_clear(KEY_JOURNAL);		break;
> -		case 0x191: map_key_clear(KEY_FINANCE);		break;
> -		case 0x192: map_key_clear(KEY_CALC);		break;
> -		case 0x193: map_key_clear(KEY_PLAYER);		break;
> -		case 0x194: map_key_clear(KEY_FILE);		break;
> -		case 0x196: map_key_clear(KEY_WWW);		break;
> -		case 0x199: map_key_clear(KEY_CHAT);		break;
> -		case 0x19c: map_key_clear(KEY_LOGOFF);		break;
> -		case 0x19e: map_key_clear(KEY_COFFEE);		break;
> -		case 0x19f: map_key_clear(KEY_CONTROLPANEL);		break;
> -		case 0x1a2: map_key_clear(KEY_APPSELECT);		break;
> -		case 0x1a3: map_key_clear(KEY_NEXT);		break;
> -		case 0x1a4: map_key_clear(KEY_PREVIOUS);	break;
> -		case 0x1a6: map_key_clear(KEY_HELP);		break;
> -		case 0x1a7: map_key_clear(KEY_DOCUMENTS);	break;
> -		case 0x1ab: map_key_clear(KEY_SPELLCHECK);	break;
> -		case 0x1ae: map_key_clear(KEY_KEYBOARD);	break;
> -		case 0x1b1: map_key_clear(KEY_SCREENSAVER);		break;
> -		case 0x1b4: map_key_clear(KEY_FILE);		break;
> -		case 0x1b6: map_key_clear(KEY_IMAGES);		break;
> -		case 0x1b7: map_key_clear(KEY_AUDIO);		break;
> -		case 0x1b8: map_key_clear(KEY_VIDEO);		break;
> -		case 0x1bc: map_key_clear(KEY_MESSENGER);	break;
> -		case 0x1bd: map_key_clear(KEY_INFO);		break;
> -		case 0x1cb: map_key_clear(KEY_ASSISTANT);	break;
> -		case 0x201: map_key_clear(KEY_NEW);		break;
> -		case 0x202: map_key_clear(KEY_OPEN);		break;
> -		case 0x203: map_key_clear(KEY_CLOSE);		break;
> -		case 0x204: map_key_clear(KEY_EXIT);		break;
> -		case 0x207: map_key_clear(KEY_SAVE);		break;
> -		case 0x208: map_key_clear(KEY_PRINT);		break;
> -		case 0x209: map_key_clear(KEY_PROPS);		break;
> -		case 0x21a: map_key_clear(KEY_UNDO);		break;
> -		case 0x21b: map_key_clear(KEY_COPY);		break;
> -		case 0x21c: map_key_clear(KEY_CUT);		break;
> -		case 0x21d: map_key_clear(KEY_PASTE);		break;
> -		case 0x21f: map_key_clear(KEY_FIND);		break;
> -		case 0x221: map_key_clear(KEY_SEARCH);		break;
> -		case 0x222: map_key_clear(KEY_GOTO);		break;
> -		case 0x223: map_key_clear(KEY_HOMEPAGE);	break;
> -		case 0x224: map_key_clear(KEY_BACK);		break;
> -		case 0x225: map_key_clear(KEY_FORWARD);		break;
> -		case 0x226: map_key_clear(KEY_STOP);		break;
> -		case 0x227: map_key_clear(KEY_REFRESH);		break;
> -		case 0x22a: map_key_clear(KEY_BOOKMARKS);	break;
> -		case 0x22d: map_key_clear(KEY_ZOOMIN);		break;
> -		case 0x22e: map_key_clear(KEY_ZOOMOUT);		break;
> -		case 0x22f: map_key_clear(KEY_ZOOMRESET);	break;
> -		case 0x232: map_key_clear(KEY_FULL_SCREEN);	break;
> -		case 0x233: map_key_clear(KEY_SCROLLUP);	break;
> -		case 0x234: map_key_clear(KEY_SCROLLDOWN);	break;
> +		case 0x030: key = KEY_POWER;		break;
> +		case 0x031: key = KEY_RESTART;		break;
> +		case 0x032: key = KEY_SLEEP;		break;
> +		case 0x034: key = KEY_SLEEP;		break;
> +		case 0x035: key = KEY_KBDILLUMTOGGLE;	break;
> +		case 0x036: key = BTN_MISC;		break;
> +
> +		case 0x040: key = KEY_MENU;		break; /* Menu */
> +		case 0x041: key = KEY_SELECT;		break; /* Menu Pick */
> +		case 0x042: key = KEY_UP;		break; /* Menu Up */
> +		case 0x043: key = KEY_DOWN;		break; /* Menu Down */
> +		case 0x044: key = KEY_LEFT;		break; /* Menu Left */
> +		case 0x045: key = KEY_RIGHT;		break; /* Menu Right */
> +		case 0x046: key = KEY_ESC;		break; /* Menu Escape */
> +		case 0x047: key = KEY_KPPLUS;		break; /* Menu Value Increase */
> +		case 0x048: key = KEY_KPMINUS;		break; /* Menu Value Decrease */
> +
> +		case 0x060: key = KEY_INFO;		break; /* Data On Screen */
> +		case 0x061: key = KEY_SUBTITLE;		break; /* Closed Caption */
> +		case 0x063: key = KEY_VCR;		break; /* VCR/TV */
> +		case 0x065: key = KEY_CAMERA;		break; /* Snapshot */
> +		case 0x069: key = KEY_RED;		break;
> +		case 0x06a: key = KEY_GREEN;		break;
> +		case 0x06b: key = KEY_BLUE;		break;
> +		case 0x06c: key = KEY_YELLOW;		break;
> +		case 0x06d: key = KEY_ASPECT_RATIO;	break;
> +
> +		case 0x06f: key = KEY_BRIGHTNESSUP;		break;
> +		case 0x070: key = KEY_BRIGHTNESSDOWN;		break;
> +		case 0x072: key = KEY_BRIGHTNESS_TOGGLE;	break;
> +		case 0x073: key = KEY_BRIGHTNESS_MIN;		break;
> +		case 0x074: key = KEY_BRIGHTNESS_MAX;		break;
> +		case 0x075: key = KEY_BRIGHTNESS_AUTO;		break;
> +
> +		case 0x079: key = KEY_KBDILLUMUP;	break;
> +		case 0x07a: key = KEY_KBDILLUMDOWN;	break;
> +		case 0x07c: key = KEY_KBDILLUMTOGGLE;	break;
> +
> +		case 0x082: key = KEY_VIDEO_NEXT;	break;
> +		case 0x083: key = KEY_LAST;		break;
> +		case 0x084: key = KEY_ENTER;		break;
> +		case 0x088: key = KEY_PC;		break;
> +		case 0x089: key = KEY_TV;		break;
> +		case 0x08a: key = KEY_WWW;		break;
> +		case 0x08b: key = KEY_DVD;		break;
> +		case 0x08c: key = KEY_PHONE;		break;
> +		case 0x08d: key = KEY_PROGRAM;		break;
> +		case 0x08e: key = KEY_VIDEOPHONE;	break;
> +		case 0x08f: key = KEY_GAMES;		break;
> +		case 0x090: key = KEY_MEMO;		break;
> +		case 0x091: key = KEY_CD;		break;
> +		case 0x092: key = KEY_VCR;		break;
> +		case 0x093: key = KEY_TUNER;		break;
> +		case 0x094: key = KEY_EXIT;		break;
> +		case 0x095: key = KEY_HELP;		break;
> +		case 0x096: key = KEY_TAPE;		break;
> +		case 0x097: key = KEY_TV2;		break;
> +		case 0x098: key = KEY_SAT;		break;
> +		case 0x09a: key = KEY_PVR;		break;
> +
> +		case 0x09c: key = KEY_CHANNELUP;	break;
> +		case 0x09d: key = KEY_CHANNELDOWN;	break;
> +		case 0x0a0: key = KEY_VCR2;		break;
> +
> +		case 0x0b0: key = KEY_PLAY;		break;
> +		case 0x0b1: key = KEY_PAUSE;		break;
> +		case 0x0b2: key = KEY_RECORD;		break;
> +		case 0x0b3: key = KEY_FASTFORWARD;	break;
> +		case 0x0b4: key = KEY_REWIND;		break;
> +		case 0x0b5: key = KEY_NEXTSONG;		break;
> +		case 0x0b6: key = KEY_PREVIOUSSONG;	break;
> +		case 0x0b7: key = KEY_STOPCD;		break;
> +		case 0x0b8: key = KEY_EJECTCD;		break;
> +		case 0x0bc: key = KEY_MEDIA_REPEAT;	break;
> +		case 0x0b9: key = KEY_SHUFFLE;		break;
> +		case 0x0bf: key = KEY_SLOW;		break;
> +
> +		case 0x0cd: key = KEY_PLAYPAUSE;	break;
> +		case 0x0cf: key = KEY_VOICECOMMAND;	break;
> +
> +		case 0x0d8: key = KEY_DICTATE;		break;
> +		case 0x0d9: key = KEY_EMOJI_PICKER;	break;
> +
> +		case 0x0e0:
> +			map_abs_clear(ABS_VOLUME);
> +			clear = false;
> +			break;
> +		case 0x0e2: key = KEY_MUTE;		break;
> +		case 0x0e5: key = KEY_BASSBOOST;	break;
> +		case 0x0e9: key = KEY_VOLUMEUP;		break;
> +		case 0x0ea: key = KEY_VOLUMEDOWN;	break;
> +		case 0x0f5: key = KEY_SLOW;		break;
> +
> +		case 0x181: key = KEY_BUTTONCONFIG;	break;
> +		case 0x182: key = KEY_BOOKMARKS;	break;
> +		case 0x183: key = KEY_CONFIG;		break;
> +		case 0x184: key = KEY_WORDPROCESSOR;	break;
> +		case 0x185: key = KEY_EDITOR;		break;
> +		case 0x186: key = KEY_SPREADSHEET;	break;
> +		case 0x187: key = KEY_GRAPHICSEDITOR;	break;
> +		case 0x188: key = KEY_PRESENTATION;	break;
> +		case 0x189: key = KEY_DATABASE;		break;
> +		case 0x18a: key = KEY_MAIL;		break;
> +		case 0x18b: key = KEY_NEWS;		break;
> +		case 0x18c: key = KEY_VOICEMAIL;	break;
> +		case 0x18d: key = KEY_ADDRESSBOOK;	break;
> +		case 0x18e: key = KEY_CALENDAR;		break;
> +		case 0x18f: key = KEY_TASKMANAGER;	break;
> +		case 0x190: key = KEY_JOURNAL;		break;
> +		case 0x191: key = KEY_FINANCE;		break;
> +		case 0x192: key = KEY_CALC;		break;
> +		case 0x193: key = KEY_PLAYER;		break;
> +		case 0x194: key = KEY_FILE;		break;
> +		case 0x196: key = KEY_WWW;		break;
> +		case 0x199: key = KEY_CHAT;		break;
> +		case 0x19c: key = KEY_LOGOFF;		break;
> +		case 0x19e: key = KEY_COFFEE;		break;
> +		case 0x19f: key = KEY_CONTROLPANEL;	break;
> +		case 0x1a2: key = KEY_APPSELECT;	break;
> +		case 0x1a3: key = KEY_NEXT;		break;
> +		case 0x1a4: key = KEY_PREVIOUS;		break;
> +		case 0x1a6: key = KEY_HELP;		break;
> +		case 0x1a7: key = KEY_DOCUMENTS;	break;
> +		case 0x1ab: key = KEY_SPELLCHECK;	break;
> +		case 0x1ae: key = KEY_KEYBOARD;		break;
> +		case 0x1b1: key = KEY_SCREENSAVER;	break;
> +		case 0x1b4: key = KEY_FILE;		break;
> +		case 0x1b6: key = KEY_IMAGES;		break;
> +		case 0x1b7: key = KEY_AUDIO;		break;
> +		case 0x1b8: key = KEY_VIDEO;		break;
> +		case 0x1bc: key = KEY_MESSENGER;	break;
> +		case 0x1bd: key = KEY_INFO;		break;
> +		case 0x1cb: key = KEY_ASSISTANT;	break;
> +		case 0x201: key = KEY_NEW;		break;
> +		case 0x202: key = KEY_OPEN;		break;
> +		case 0x203: key = KEY_CLOSE;		break;
> +		case 0x204: key = KEY_EXIT;		break;
> +		case 0x207: key = KEY_SAVE;		break;
> +		case 0x208: key = KEY_PRINT;		break;
> +		case 0x209: key = KEY_PROPS;		break;
> +		case 0x21a: key = KEY_UNDO;		break;
> +		case 0x21b: key = KEY_COPY;		break;
> +		case 0x21c: key = KEY_CUT;		break;
> +		case 0x21d: key = KEY_PASTE;		break;
> +		case 0x21f: key = KEY_FIND;		break;
> +		case 0x221: key = KEY_SEARCH;		break;
> +		case 0x222: key = KEY_GOTO;		break;
> +		case 0x223: key = KEY_HOMEPAGE;		break;
> +		case 0x224: key = KEY_BACK;		break;
> +		case 0x225: key = KEY_FORWARD;		break;
> +		case 0x226: key = KEY_STOP;		break;
> +		case 0x227: key = KEY_REFRESH;		break;
> +		case 0x22a: key = KEY_BOOKMARKS;	break;
> +		case 0x22d: key = KEY_ZOOMIN;		break;
> +		case 0x22e: key = KEY_ZOOMOUT;		break;
> +		case 0x22f: key = KEY_ZOOMRESET;	break;
> +		case 0x232: key = KEY_FULL_SCREEN;	break;
> +		case 0x233: key = KEY_SCROLLUP;		break;
> +		case 0x234: key = KEY_SCROLLDOWN;	break;
>  		case 0x238: /* AC Pan */
>  			set_bit(REL_HWHEEL, input->relbit);
>  			map_rel(REL_HWHEEL_HI_RES);
> +			clear = false;
>  			break;
> -		case 0x23d: map_key_clear(KEY_EDIT);		break;
> -		case 0x25f: map_key_clear(KEY_CANCEL);		break;
> -		case 0x269: map_key_clear(KEY_INSERT);		break;
> -		case 0x26a: map_key_clear(KEY_DELETE);		break;
> -		case 0x279: map_key_clear(KEY_REDO);		break;
> +		case 0x23d: key = KEY_EDIT;		break;
> +		case 0x25f: key = KEY_CANCEL;		break;
> +		case 0x269: key = KEY_INSERT;		break;
> +		case 0x26a: key = KEY_DELETE;		break;
> +		case 0x279: key = KEY_REDO;		break;
>  
> -		case 0x289: map_key_clear(KEY_REPLY);		break;
> -		case 0x28b: map_key_clear(KEY_FORWARDMAIL);	break;
> -		case 0x28c: map_key_clear(KEY_SEND);		break;
> +		case 0x289: key = KEY_REPLY;		break;
> +		case 0x28b: key = KEY_FORWARDMAIL;	break;
> +		case 0x28c: key = KEY_SEND;		break;
>  
> -		case 0x29d: map_key_clear(KEY_KBD_LAYOUT_NEXT);	break;
> +		case 0x29d: key = KEY_KBD_LAYOUT_NEXT;	break;
>  
> -		case 0x2a2: map_key_clear(KEY_ALL_APPLICATIONS);	break;
> +		case 0x2a2: key = KEY_ALL_APPLICATIONS;	break;
>  
> -		case 0x2c7: map_key_clear(KEY_KBDINPUTASSIST_PREV);		break;
> -		case 0x2c8: map_key_clear(KEY_KBDINPUTASSIST_NEXT);		break;
> -		case 0x2c9: map_key_clear(KEY_KBDINPUTASSIST_PREVGROUP);		break;
> -		case 0x2ca: map_key_clear(KEY_KBDINPUTASSIST_NEXTGROUP);		break;
> -		case 0x2cb: map_key_clear(KEY_KBDINPUTASSIST_ACCEPT);	break;
> -		case 0x2cc: map_key_clear(KEY_KBDINPUTASSIST_CANCEL);	break;
> +		case 0x2c7: key = KEY_KBDINPUTASSIST_PREV;		break;
> +		case 0x2c8: key = KEY_KBDINPUTASSIST_NEXT;		break;
> +		case 0x2c9: key = KEY_KBDINPUTASSIST_PREVGROUP;		break;
> +		case 0x2ca: key = KEY_KBDINPUTASSIST_NEXTGROUP;		break;
> +		case 0x2cb: key = KEY_KBDINPUTASSIST_ACCEPT;		break;
> +		case 0x2cc: key = KEY_KBDINPUTASSIST_CANCEL;		break;
>  
> -		case 0x29f: map_key_clear(KEY_SCALE);		break;
> +		case 0x29f: key = KEY_SCALE;		break;
>  
> -		default: map_key_clear(KEY_UNKNOWN);
> +		default: key = KEY_UNKNOWN;		break;
>  		}
> +
> +		if (clear)
> +			map_key_clear(key);
>  		break;
> +	}
>  
>  	case HID_UP_GENDEVCTRLS:
>  		switch (usage->hid) {
> @@ -1207,34 +1233,42 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
>  		}
>  		goto unknown;
>  
> -	case HID_UP_HPVENDOR:	/* Reported on a Dutch layout HP5308 */
> +	case HID_UP_HPVENDOR: {	/* Reported on a Dutch layout HP5308 */
> +		int key;
> +
>  		set_bit(EV_REP, input->evbit);
>  		switch (usage->hid & HID_USAGE) {
> -		case 0x021: map_key_clear(KEY_PRINT);           break;
> -		case 0x070: map_key_clear(KEY_HP);		break;
> -		case 0x071: map_key_clear(KEY_CAMERA);		break;
> -		case 0x072: map_key_clear(KEY_SOUND);		break;
> -		case 0x073: map_key_clear(KEY_QUESTION);	break;
> -		case 0x080: map_key_clear(KEY_EMAIL);		break;
> -		case 0x081: map_key_clear(KEY_CHAT);		break;
> -		case 0x082: map_key_clear(KEY_SEARCH);		break;
> -		case 0x083: map_key_clear(KEY_CONNECT);	        break;
> -		case 0x084: map_key_clear(KEY_FINANCE);		break;
> -		case 0x085: map_key_clear(KEY_SPORT);		break;
> -		case 0x086: map_key_clear(KEY_SHOP);	        break;
> +		case 0x021: key = KEY_PRINT;		break;
> +		case 0x070: key = KEY_HP;		break;
> +		case 0x071: key = KEY_CAMERA;		break;
> +		case 0x072: key = KEY_SOUND;		break;
> +		case 0x073: key = KEY_QUESTION;		break;
> +		case 0x080: key = KEY_EMAIL;		break;
> +		case 0x081: key = KEY_CHAT;		break;
> +		case 0x082: key = KEY_SEARCH;		break;
> +		case 0x083: key = KEY_CONNECT;	        break;
> +		case 0x084: key = KEY_FINANCE;		break;
> +		case 0x085: key = KEY_SPORT;		break;
> +		case 0x086: key = KEY_SHOP;	        break;
>  		default:    goto ignore;
>  		}
> +		map_key_clear(key);
>  		break;
> +	}
> +
> +	case HID_UP_HPVENDOR2: {
> +		int key;
>  
> -	case HID_UP_HPVENDOR2:
>  		set_bit(EV_REP, input->evbit);
>  		switch (usage->hid & HID_USAGE) {
> -		case 0x001: map_key_clear(KEY_MICMUTE);		break;
> -		case 0x003: map_key_clear(KEY_BRIGHTNESSDOWN);	break;
> -		case 0x004: map_key_clear(KEY_BRIGHTNESSUP);	break;
> +		case 0x001: key = KEY_MICMUTE;		break;
> +		case 0x003: key = KEY_BRIGHTNESSDOWN;	break;
> +		case 0x004: key = KEY_BRIGHTNESSUP;	break;
>  		default:    goto ignore;
>  		}
> +		map_key_clear(key);
>  		break;
> +	}
>  
>  	case HID_UP_MSVENDOR:
>  		goto ignore;
>
Joe Perches Oct. 28, 2022, 3:11 p.m. UTC | #2
On Wed, 2022-05-18 at 13:26 -0700, Joe Perches wrote:
> On Mon, 2022-05-09 at 23:56 -0700, Joe Perches wrote:
> > Reduce object size by using an automatic for various repeated calls
> > to map_abs, map_key_clear, and map_led in switch/case statements.
> 
> ping?

Second ping.

IMO: It's a non-trivial amount.  An entire page of code.

> > $ size drivers/hid/hid-input.o* (defconfig x86-64)
> >    text	   data	    bss	    dec	    hex	filename
> >   22042	     88	      0	  22130	   5672	drivers/hid/hid-input.o.new
> >   27589	     88	      0	  27677	   6c1d	drivers/hid/hid-input.o.old
> > 
> > Signed-off-by: Joe Perches <joe@perches.com>
> > ---
> >  drivers/hid/hid-input.c | 522 ++++++++++++++++++++++++++----------------------
> >  1 file changed, 278 insertions(+), 244 deletions(-)
> > 
> > diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
> > index c6b27aab90414..21d67866efb06 100644
> > --- a/drivers/hid/hid-input.c
> > +++ b/drivers/hid/hid-input.c
> > @@ -743,37 +743,44 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
> >  		map_key(code);
> >  		break;
> >  
> > -	case HID_UP_SIMULATION:
> > +	case HID_UP_SIMULATION: {
> > +		int abs;
> > +
> >  		switch (usage->hid & 0xffff) {
> > -		case 0xba: map_abs(ABS_RUDDER);   break;
> > -		case 0xbb: map_abs(ABS_THROTTLE); break;
> > -		case 0xc4: map_abs(ABS_GAS);      break;
> > -		case 0xc5: map_abs(ABS_BRAKE);    break;
> > -		case 0xc8: map_abs(ABS_WHEEL);    break;
> > +		case 0xba: abs = ABS_RUDDER;	break;
> > +		case 0xbb: abs = ABS_THROTTLE;	break;
> > +		case 0xc4: abs = ABS_GAS;	break;
> > +		case 0xc5: abs = ABS_BRAKE;	break;
> > +		case 0xc8: abs = ABS_WHEEL;	break;
> >  		default:   goto ignore;
> >  		}
> > +		map_abs(abs);
> >  		break;
> > +	}
> >  
> >  	case HID_UP_GENDESK:
> >  		if ((usage->hid & 0xf0) == 0x80) {	/* SystemControl */
> > +			int key;
> > +
> >  			switch (usage->hid & 0xf) {
> > -			case 0x1: map_key_clear(KEY_POWER);  break;
> > -			case 0x2: map_key_clear(KEY_SLEEP);  break;
> > -			case 0x3: map_key_clear(KEY_WAKEUP); break;
> > -			case 0x4: map_key_clear(KEY_CONTEXT_MENU); break;
> > -			case 0x5: map_key_clear(KEY_MENU); break;
> > -			case 0x6: map_key_clear(KEY_PROG1); break;
> > -			case 0x7: map_key_clear(KEY_HELP); break;
> > -			case 0x8: map_key_clear(KEY_EXIT); break;
> > -			case 0x9: map_key_clear(KEY_SELECT); break;
> > -			case 0xa: map_key_clear(KEY_RIGHT); break;
> > -			case 0xb: map_key_clear(KEY_LEFT); break;
> > -			case 0xc: map_key_clear(KEY_UP); break;
> > -			case 0xd: map_key_clear(KEY_DOWN); break;
> > -			case 0xe: map_key_clear(KEY_POWER2); break;
> > -			case 0xf: map_key_clear(KEY_RESTART); break;
> > +			case 0x1: key = KEY_POWER;	break;
> > +			case 0x2: key = KEY_SLEEP;	break;
> > +			case 0x3: key = KEY_WAKEUP;	break;
> > +			case 0x4: key = KEY_CONTEXT_MENU; break;
> > +			case 0x5: key = KEY_MENU;	break;
> > +			case 0x6: key = KEY_PROG1;	break;
> > +			case 0x7: key = KEY_HELP;	break;
> > +			case 0x8: key = KEY_EXIT;	break;
> > +			case 0x9: key = KEY_SELECT;	break;
> > +			case 0xa: key = KEY_RIGHT;	break;
> > +			case 0xb: key = KEY_LEFT;	break;
> > +			case 0xc: key = KEY_UP;		break;
> > +			case 0xd: key = KEY_DOWN;	break;
> > +			case 0xe: key = KEY_POWER2;	break;
> > +			case 0xf: key = KEY_RESTART;	break;
> >  			default: goto unknown;
> >  			}
> > +			map_key_clear(key);
> >  			break;
> >  		}
> >  
> > @@ -859,23 +866,27 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
> >  
> >  		break;
> >  
> > -	case HID_UP_LED:
> > -		switch (usage->hid & 0xffff) {		      /* HID-Value:                   */
> > -		case 0x01:  map_led (LED_NUML);     break;    /*   "Num Lock"                 */
> > -		case 0x02:  map_led (LED_CAPSL);    break;    /*   "Caps Lock"                */
> > -		case 0x03:  map_led (LED_SCROLLL);  break;    /*   "Scroll Lock"              */
> > -		case 0x04:  map_led (LED_COMPOSE);  break;    /*   "Compose"                  */
> > -		case 0x05:  map_led (LED_KANA);     break;    /*   "Kana"                     */
> > -		case 0x27:  map_led (LED_SLEEP);    break;    /*   "Stand-By"                 */
> > -		case 0x4c:  map_led (LED_SUSPEND);  break;    /*   "System Suspend"           */
> > -		case 0x09:  map_led (LED_MUTE);     break;    /*   "Mute"                     */
> > -		case 0x4b:  map_led (LED_MISC);     break;    /*   "Generic Indicator"        */
> > -		case 0x19:  map_led (LED_MAIL);     break;    /*   "Message Waiting"          */
> > -		case 0x4d:  map_led (LED_CHARGING); break;    /*   "External Power Connected" */
> > +	case HID_UP_LED: {
> > +		int led;
> > +
> > +		switch (usage->hid & 0xffff) {		/* HID-Value: */
> > +		case 0x01:  led = LED_NUML;	break;	/* Num Lock */
> > +		case 0x02:  led = LED_CAPSL;	break;	/* Caps Lock */
> > +		case 0x03:  led = LED_SCROLLL;	break;	/* Scroll Lock */
> > +		case 0x04:  led = LED_COMPOSE;	break;	/* Compose */
> > +		case 0x05:  led = LED_KANA;	break;	/* Kana */
> > +		case 0x27:  led = LED_SLEEP;	break;	/* Stand-By */
> > +		case 0x4c:  led = LED_SUSPEND;	break;	/* System Suspend */
> > +		case 0x09:  led = LED_MUTE;	break;	/* Mute */
> > +		case 0x4b:  led = LED_MISC;	break;	/* Generic Indicator */
> > +		case 0x19:  led = LED_MAIL;	break;	/* Message Waiting */
> > +		case 0x4d:  led = LED_CHARGING;	break;	/* External Power Connected */
> >  
> >  		default: goto ignore;
> >  		}
> > +		map_led(led);
> >  		break;
> > +	}
> >  
> >  	case HID_UP_DIGITIZER:
> >  		if ((field->application & 0xff) == 0x01) /* Digitizer */
> > @@ -976,218 +987,233 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
> >  		}
> >  		break;
> >  
> > -	case HID_UP_TELEPHONY:
> > +	case HID_UP_TELEPHONY: {
> > +		int key;
> > +
> >  		switch (usage->hid & HID_USAGE) {
> > -		case 0x2f: map_key_clear(KEY_MICMUTE);		break;
> > -		case 0xb0: map_key_clear(KEY_NUMERIC_0);	break;
> > -		case 0xb1: map_key_clear(KEY_NUMERIC_1);	break;
> > -		case 0xb2: map_key_clear(KEY_NUMERIC_2);	break;
> > -		case 0xb3: map_key_clear(KEY_NUMERIC_3);	break;
> > -		case 0xb4: map_key_clear(KEY_NUMERIC_4);	break;
> > -		case 0xb5: map_key_clear(KEY_NUMERIC_5);	break;
> > -		case 0xb6: map_key_clear(KEY_NUMERIC_6);	break;
> > -		case 0xb7: map_key_clear(KEY_NUMERIC_7);	break;
> > -		case 0xb8: map_key_clear(KEY_NUMERIC_8);	break;
> > -		case 0xb9: map_key_clear(KEY_NUMERIC_9);	break;
> > -		case 0xba: map_key_clear(KEY_NUMERIC_STAR);	break;
> > -		case 0xbb: map_key_clear(KEY_NUMERIC_POUND);	break;
> > -		case 0xbc: map_key_clear(KEY_NUMERIC_A);	break;
> > -		case 0xbd: map_key_clear(KEY_NUMERIC_B);	break;
> > -		case 0xbe: map_key_clear(KEY_NUMERIC_C);	break;
> > -		case 0xbf: map_key_clear(KEY_NUMERIC_D);	break;
> > +		case 0x2f: key = KEY_MICMUTE;		break;
> > +		case 0xb0: key = KEY_NUMERIC_0;		break;
> > +		case 0xb1: key = KEY_NUMERIC_1;		break;
> > +		case 0xb2: key = KEY_NUMERIC_2;		break;
> > +		case 0xb3: key = KEY_NUMERIC_3;		break;
> > +		case 0xb4: key = KEY_NUMERIC_4;		break;
> > +		case 0xb5: key = KEY_NUMERIC_5;		break;
> > +		case 0xb6: key = KEY_NUMERIC_6;		break;
> > +		case 0xb7: key = KEY_NUMERIC_7;		break;
> > +		case 0xb8: key = KEY_NUMERIC_8;		break;
> > +		case 0xb9: key = KEY_NUMERIC_9;		break;
> > +		case 0xba: key = KEY_NUMERIC_STAR;	break;
> > +		case 0xbb: key = KEY_NUMERIC_POUND;	break;
> > +		case 0xbc: key = KEY_NUMERIC_A;		break;
> > +		case 0xbd: key = KEY_NUMERIC_B;		break;
> > +		case 0xbe: key = KEY_NUMERIC_C;		break;
> > +		case 0xbf: key = KEY_NUMERIC_D;		break;
> >  		default: goto ignore;
> >  		}
> > +		map_key_clear(key);
> >  		break;
> > +	}
> > +
> > +	case HID_UP_CONSUMER: {	/* USB HUT v1.12, pages 75-84 */
> > +		int key;
> > +		bool clear = true;
> >  
> > -	case HID_UP_CONSUMER:	/* USB HUT v1.12, pages 75-84 */
> >  		switch (usage->hid & HID_USAGE) {
> >  		case 0x000: goto ignore;
> > -		case 0x030: map_key_clear(KEY_POWER);		break;
> > -		case 0x031: map_key_clear(KEY_RESTART);		break;
> > -		case 0x032: map_key_clear(KEY_SLEEP);		break;
> > -		case 0x034: map_key_clear(KEY_SLEEP);		break;
> > -		case 0x035: map_key_clear(KEY_KBDILLUMTOGGLE);	break;
> > -		case 0x036: map_key_clear(BTN_MISC);		break;
> > -
> > -		case 0x040: map_key_clear(KEY_MENU);		break; /* Menu */
> > -		case 0x041: map_key_clear(KEY_SELECT);		break; /* Menu Pick */
> > -		case 0x042: map_key_clear(KEY_UP);		break; /* Menu Up */
> > -		case 0x043: map_key_clear(KEY_DOWN);		break; /* Menu Down */
> > -		case 0x044: map_key_clear(KEY_LEFT);		break; /* Menu Left */
> > -		case 0x045: map_key_clear(KEY_RIGHT);		break; /* Menu Right */
> > -		case 0x046: map_key_clear(KEY_ESC);		break; /* Menu Escape */
> > -		case 0x047: map_key_clear(KEY_KPPLUS);		break; /* Menu Value Increase */
> > -		case 0x048: map_key_clear(KEY_KPMINUS);		break; /* Menu Value Decrease */
> > -
> > -		case 0x060: map_key_clear(KEY_INFO);		break; /* Data On Screen */
> > -		case 0x061: map_key_clear(KEY_SUBTITLE);	break; /* Closed Caption */
> > -		case 0x063: map_key_clear(KEY_VCR);		break; /* VCR/TV */
> > -		case 0x065: map_key_clear(KEY_CAMERA);		break; /* Snapshot */
> > -		case 0x069: map_key_clear(KEY_RED);		break;
> > -		case 0x06a: map_key_clear(KEY_GREEN);		break;
> > -		case 0x06b: map_key_clear(KEY_BLUE);		break;
> > -		case 0x06c: map_key_clear(KEY_YELLOW);		break;
> > -		case 0x06d: map_key_clear(KEY_ASPECT_RATIO);	break;
> > -
> > -		case 0x06f: map_key_clear(KEY_BRIGHTNESSUP);		break;
> > -		case 0x070: map_key_clear(KEY_BRIGHTNESSDOWN);		break;
> > -		case 0x072: map_key_clear(KEY_BRIGHTNESS_TOGGLE);	break;
> > -		case 0x073: map_key_clear(KEY_BRIGHTNESS_MIN);		break;
> > -		case 0x074: map_key_clear(KEY_BRIGHTNESS_MAX);		break;
> > -		case 0x075: map_key_clear(KEY_BRIGHTNESS_AUTO);		break;
> > -
> > -		case 0x079: map_key_clear(KEY_KBDILLUMUP);	break;
> > -		case 0x07a: map_key_clear(KEY_KBDILLUMDOWN);	break;
> > -		case 0x07c: map_key_clear(KEY_KBDILLUMTOGGLE);	break;
> > -
> > -		case 0x082: map_key_clear(KEY_VIDEO_NEXT);	break;
> > -		case 0x083: map_key_clear(KEY_LAST);		break;
> > -		case 0x084: map_key_clear(KEY_ENTER);		break;
> > -		case 0x088: map_key_clear(KEY_PC);		break;
> > -		case 0x089: map_key_clear(KEY_TV);		break;
> > -		case 0x08a: map_key_clear(KEY_WWW);		break;
> > -		case 0x08b: map_key_clear(KEY_DVD);		break;
> > -		case 0x08c: map_key_clear(KEY_PHONE);		break;
> > -		case 0x08d: map_key_clear(KEY_PROGRAM);		break;
> > -		case 0x08e: map_key_clear(KEY_VIDEOPHONE);	break;
> > -		case 0x08f: map_key_clear(KEY_GAMES);		break;
> > -		case 0x090: map_key_clear(KEY_MEMO);		break;
> > -		case 0x091: map_key_clear(KEY_CD);		break;
> > -		case 0x092: map_key_clear(KEY_VCR);		break;
> > -		case 0x093: map_key_clear(KEY_TUNER);		break;
> > -		case 0x094: map_key_clear(KEY_EXIT);		break;
> > -		case 0x095: map_key_clear(KEY_HELP);		break;
> > -		case 0x096: map_key_clear(KEY_TAPE);		break;
> > -		case 0x097: map_key_clear(KEY_TV2);		break;
> > -		case 0x098: map_key_clear(KEY_SAT);		break;
> > -		case 0x09a: map_key_clear(KEY_PVR);		break;
> > -
> > -		case 0x09c: map_key_clear(KEY_CHANNELUP);	break;
> > -		case 0x09d: map_key_clear(KEY_CHANNELDOWN);	break;
> > -		case 0x0a0: map_key_clear(KEY_VCR2);		break;
> > -
> > -		case 0x0b0: map_key_clear(KEY_PLAY);		break;
> > -		case 0x0b1: map_key_clear(KEY_PAUSE);		break;
> > -		case 0x0b2: map_key_clear(KEY_RECORD);		break;
> > -		case 0x0b3: map_key_clear(KEY_FASTFORWARD);	break;
> > -		case 0x0b4: map_key_clear(KEY_REWIND);		break;
> > -		case 0x0b5: map_key_clear(KEY_NEXTSONG);	break;
> > -		case 0x0b6: map_key_clear(KEY_PREVIOUSSONG);	break;
> > -		case 0x0b7: map_key_clear(KEY_STOPCD);		break;
> > -		case 0x0b8: map_key_clear(KEY_EJECTCD);		break;
> > -		case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT);	break;
> > -		case 0x0b9: map_key_clear(KEY_SHUFFLE);		break;
> > -		case 0x0bf: map_key_clear(KEY_SLOW);		break;
> > -
> > -		case 0x0cd: map_key_clear(KEY_PLAYPAUSE);	break;
> > -		case 0x0cf: map_key_clear(KEY_VOICECOMMAND);	break;
> > -
> > -		case 0x0d8: map_key_clear(KEY_DICTATE);		break;
> > -		case 0x0d9: map_key_clear(KEY_EMOJI_PICKER);	break;
> > -
> > -		case 0x0e0: map_abs_clear(ABS_VOLUME);		break;
> > -		case 0x0e2: map_key_clear(KEY_MUTE);		break;
> > -		case 0x0e5: map_key_clear(KEY_BASSBOOST);	break;
> > -		case 0x0e9: map_key_clear(KEY_VOLUMEUP);	break;
> > -		case 0x0ea: map_key_clear(KEY_VOLUMEDOWN);	break;
> > -		case 0x0f5: map_key_clear(KEY_SLOW);		break;
> > -
> > -		case 0x181: map_key_clear(KEY_BUTTONCONFIG);	break;
> > -		case 0x182: map_key_clear(KEY_BOOKMARKS);	break;
> > -		case 0x183: map_key_clear(KEY_CONFIG);		break;
> > -		case 0x184: map_key_clear(KEY_WORDPROCESSOR);	break;
> > -		case 0x185: map_key_clear(KEY_EDITOR);		break;
> > -		case 0x186: map_key_clear(KEY_SPREADSHEET);	break;
> > -		case 0x187: map_key_clear(KEY_GRAPHICSEDITOR);	break;
> > -		case 0x188: map_key_clear(KEY_PRESENTATION);	break;
> > -		case 0x189: map_key_clear(KEY_DATABASE);	break;
> > -		case 0x18a: map_key_clear(KEY_MAIL);		break;
> > -		case 0x18b: map_key_clear(KEY_NEWS);		break;
> > -		case 0x18c: map_key_clear(KEY_VOICEMAIL);	break;
> > -		case 0x18d: map_key_clear(KEY_ADDRESSBOOK);	break;
> > -		case 0x18e: map_key_clear(KEY_CALENDAR);	break;
> > -		case 0x18f: map_key_clear(KEY_TASKMANAGER);	break;
> > -		case 0x190: map_key_clear(KEY_JOURNAL);		break;
> > -		case 0x191: map_key_clear(KEY_FINANCE);		break;
> > -		case 0x192: map_key_clear(KEY_CALC);		break;
> > -		case 0x193: map_key_clear(KEY_PLAYER);		break;
> > -		case 0x194: map_key_clear(KEY_FILE);		break;
> > -		case 0x196: map_key_clear(KEY_WWW);		break;
> > -		case 0x199: map_key_clear(KEY_CHAT);		break;
> > -		case 0x19c: map_key_clear(KEY_LOGOFF);		break;
> > -		case 0x19e: map_key_clear(KEY_COFFEE);		break;
> > -		case 0x19f: map_key_clear(KEY_CONTROLPANEL);		break;
> > -		case 0x1a2: map_key_clear(KEY_APPSELECT);		break;
> > -		case 0x1a3: map_key_clear(KEY_NEXT);		break;
> > -		case 0x1a4: map_key_clear(KEY_PREVIOUS);	break;
> > -		case 0x1a6: map_key_clear(KEY_HELP);		break;
> > -		case 0x1a7: map_key_clear(KEY_DOCUMENTS);	break;
> > -		case 0x1ab: map_key_clear(KEY_SPELLCHECK);	break;
> > -		case 0x1ae: map_key_clear(KEY_KEYBOARD);	break;
> > -		case 0x1b1: map_key_clear(KEY_SCREENSAVER);		break;
> > -		case 0x1b4: map_key_clear(KEY_FILE);		break;
> > -		case 0x1b6: map_key_clear(KEY_IMAGES);		break;
> > -		case 0x1b7: map_key_clear(KEY_AUDIO);		break;
> > -		case 0x1b8: map_key_clear(KEY_VIDEO);		break;
> > -		case 0x1bc: map_key_clear(KEY_MESSENGER);	break;
> > -		case 0x1bd: map_key_clear(KEY_INFO);		break;
> > -		case 0x1cb: map_key_clear(KEY_ASSISTANT);	break;
> > -		case 0x201: map_key_clear(KEY_NEW);		break;
> > -		case 0x202: map_key_clear(KEY_OPEN);		break;
> > -		case 0x203: map_key_clear(KEY_CLOSE);		break;
> > -		case 0x204: map_key_clear(KEY_EXIT);		break;
> > -		case 0x207: map_key_clear(KEY_SAVE);		break;
> > -		case 0x208: map_key_clear(KEY_PRINT);		break;
> > -		case 0x209: map_key_clear(KEY_PROPS);		break;
> > -		case 0x21a: map_key_clear(KEY_UNDO);		break;
> > -		case 0x21b: map_key_clear(KEY_COPY);		break;
> > -		case 0x21c: map_key_clear(KEY_CUT);		break;
> > -		case 0x21d: map_key_clear(KEY_PASTE);		break;
> > -		case 0x21f: map_key_clear(KEY_FIND);		break;
> > -		case 0x221: map_key_clear(KEY_SEARCH);		break;
> > -		case 0x222: map_key_clear(KEY_GOTO);		break;
> > -		case 0x223: map_key_clear(KEY_HOMEPAGE);	break;
> > -		case 0x224: map_key_clear(KEY_BACK);		break;
> > -		case 0x225: map_key_clear(KEY_FORWARD);		break;
> > -		case 0x226: map_key_clear(KEY_STOP);		break;
> > -		case 0x227: map_key_clear(KEY_REFRESH);		break;
> > -		case 0x22a: map_key_clear(KEY_BOOKMARKS);	break;
> > -		case 0x22d: map_key_clear(KEY_ZOOMIN);		break;
> > -		case 0x22e: map_key_clear(KEY_ZOOMOUT);		break;
> > -		case 0x22f: map_key_clear(KEY_ZOOMRESET);	break;
> > -		case 0x232: map_key_clear(KEY_FULL_SCREEN);	break;
> > -		case 0x233: map_key_clear(KEY_SCROLLUP);	break;
> > -		case 0x234: map_key_clear(KEY_SCROLLDOWN);	break;
> > +		case 0x030: key = KEY_POWER;		break;
> > +		case 0x031: key = KEY_RESTART;		break;
> > +		case 0x032: key = KEY_SLEEP;		break;
> > +		case 0x034: key = KEY_SLEEP;		break;
> > +		case 0x035: key = KEY_KBDILLUMTOGGLE;	break;
> > +		case 0x036: key = BTN_MISC;		break;
> > +
> > +		case 0x040: key = KEY_MENU;		break; /* Menu */
> > +		case 0x041: key = KEY_SELECT;		break; /* Menu Pick */
> > +		case 0x042: key = KEY_UP;		break; /* Menu Up */
> > +		case 0x043: key = KEY_DOWN;		break; /* Menu Down */
> > +		case 0x044: key = KEY_LEFT;		break; /* Menu Left */
> > +		case 0x045: key = KEY_RIGHT;		break; /* Menu Right */
> > +		case 0x046: key = KEY_ESC;		break; /* Menu Escape */
> > +		case 0x047: key = KEY_KPPLUS;		break; /* Menu Value Increase */
> > +		case 0x048: key = KEY_KPMINUS;		break; /* Menu Value Decrease */
> > +
> > +		case 0x060: key = KEY_INFO;		break; /* Data On Screen */
> > +		case 0x061: key = KEY_SUBTITLE;		break; /* Closed Caption */
> > +		case 0x063: key = KEY_VCR;		break; /* VCR/TV */
> > +		case 0x065: key = KEY_CAMERA;		break; /* Snapshot */
> > +		case 0x069: key = KEY_RED;		break;
> > +		case 0x06a: key = KEY_GREEN;		break;
> > +		case 0x06b: key = KEY_BLUE;		break;
> > +		case 0x06c: key = KEY_YELLOW;		break;
> > +		case 0x06d: key = KEY_ASPECT_RATIO;	break;
> > +
> > +		case 0x06f: key = KEY_BRIGHTNESSUP;		break;
> > +		case 0x070: key = KEY_BRIGHTNESSDOWN;		break;
> > +		case 0x072: key = KEY_BRIGHTNESS_TOGGLE;	break;
> > +		case 0x073: key = KEY_BRIGHTNESS_MIN;		break;
> > +		case 0x074: key = KEY_BRIGHTNESS_MAX;		break;
> > +		case 0x075: key = KEY_BRIGHTNESS_AUTO;		break;
> > +
> > +		case 0x079: key = KEY_KBDILLUMUP;	break;
> > +		case 0x07a: key = KEY_KBDILLUMDOWN;	break;
> > +		case 0x07c: key = KEY_KBDILLUMTOGGLE;	break;
> > +
> > +		case 0x082: key = KEY_VIDEO_NEXT;	break;
> > +		case 0x083: key = KEY_LAST;		break;
> > +		case 0x084: key = KEY_ENTER;		break;
> > +		case 0x088: key = KEY_PC;		break;
> > +		case 0x089: key = KEY_TV;		break;
> > +		case 0x08a: key = KEY_WWW;		break;
> > +		case 0x08b: key = KEY_DVD;		break;
> > +		case 0x08c: key = KEY_PHONE;		break;
> > +		case 0x08d: key = KEY_PROGRAM;		break;
> > +		case 0x08e: key = KEY_VIDEOPHONE;	break;
> > +		case 0x08f: key = KEY_GAMES;		break;
> > +		case 0x090: key = KEY_MEMO;		break;
> > +		case 0x091: key = KEY_CD;		break;
> > +		case 0x092: key = KEY_VCR;		break;
> > +		case 0x093: key = KEY_TUNER;		break;
> > +		case 0x094: key = KEY_EXIT;		break;
> > +		case 0x095: key = KEY_HELP;		break;
> > +		case 0x096: key = KEY_TAPE;		break;
> > +		case 0x097: key = KEY_TV2;		break;
> > +		case 0x098: key = KEY_SAT;		break;
> > +		case 0x09a: key = KEY_PVR;		break;
> > +
> > +		case 0x09c: key = KEY_CHANNELUP;	break;
> > +		case 0x09d: key = KEY_CHANNELDOWN;	break;
> > +		case 0x0a0: key = KEY_VCR2;		break;
> > +
> > +		case 0x0b0: key = KEY_PLAY;		break;
> > +		case 0x0b1: key = KEY_PAUSE;		break;
> > +		case 0x0b2: key = KEY_RECORD;		break;
> > +		case 0x0b3: key = KEY_FASTFORWARD;	break;
> > +		case 0x0b4: key = KEY_REWIND;		break;
> > +		case 0x0b5: key = KEY_NEXTSONG;		break;
> > +		case 0x0b6: key = KEY_PREVIOUSSONG;	break;
> > +		case 0x0b7: key = KEY_STOPCD;		break;
> > +		case 0x0b8: key = KEY_EJECTCD;		break;
> > +		case 0x0bc: key = KEY_MEDIA_REPEAT;	break;
> > +		case 0x0b9: key = KEY_SHUFFLE;		break;
> > +		case 0x0bf: key = KEY_SLOW;		break;
> > +
> > +		case 0x0cd: key = KEY_PLAYPAUSE;	break;
> > +		case 0x0cf: key = KEY_VOICECOMMAND;	break;
> > +
> > +		case 0x0d8: key = KEY_DICTATE;		break;
> > +		case 0x0d9: key = KEY_EMOJI_PICKER;	break;
> > +
> > +		case 0x0e0:
> > +			map_abs_clear(ABS_VOLUME);
> > +			clear = false;
> > +			break;
> > +		case 0x0e2: key = KEY_MUTE;		break;
> > +		case 0x0e5: key = KEY_BASSBOOST;	break;
> > +		case 0x0e9: key = KEY_VOLUMEUP;		break;
> > +		case 0x0ea: key = KEY_VOLUMEDOWN;	break;
> > +		case 0x0f5: key = KEY_SLOW;		break;
> > +
> > +		case 0x181: key = KEY_BUTTONCONFIG;	break;
> > +		case 0x182: key = KEY_BOOKMARKS;	break;
> > +		case 0x183: key = KEY_CONFIG;		break;
> > +		case 0x184: key = KEY_WORDPROCESSOR;	break;
> > +		case 0x185: key = KEY_EDITOR;		break;
> > +		case 0x186: key = KEY_SPREADSHEET;	break;
> > +		case 0x187: key = KEY_GRAPHICSEDITOR;	break;
> > +		case 0x188: key = KEY_PRESENTATION;	break;
> > +		case 0x189: key = KEY_DATABASE;		break;
> > +		case 0x18a: key = KEY_MAIL;		break;
> > +		case 0x18b: key = KEY_NEWS;		break;
> > +		case 0x18c: key = KEY_VOICEMAIL;	break;
> > +		case 0x18d: key = KEY_ADDRESSBOOK;	break;
> > +		case 0x18e: key = KEY_CALENDAR;		break;
> > +		case 0x18f: key = KEY_TASKMANAGER;	break;
> > +		case 0x190: key = KEY_JOURNAL;		break;
> > +		case 0x191: key = KEY_FINANCE;		break;
> > +		case 0x192: key = KEY_CALC;		break;
> > +		case 0x193: key = KEY_PLAYER;		break;
> > +		case 0x194: key = KEY_FILE;		break;
> > +		case 0x196: key = KEY_WWW;		break;
> > +		case 0x199: key = KEY_CHAT;		break;
> > +		case 0x19c: key = KEY_LOGOFF;		break;
> > +		case 0x19e: key = KEY_COFFEE;		break;
> > +		case 0x19f: key = KEY_CONTROLPANEL;	break;
> > +		case 0x1a2: key = KEY_APPSELECT;	break;
> > +		case 0x1a3: key = KEY_NEXT;		break;
> > +		case 0x1a4: key = KEY_PREVIOUS;		break;
> > +		case 0x1a6: key = KEY_HELP;		break;
> > +		case 0x1a7: key = KEY_DOCUMENTS;	break;
> > +		case 0x1ab: key = KEY_SPELLCHECK;	break;
> > +		case 0x1ae: key = KEY_KEYBOARD;		break;
> > +		case 0x1b1: key = KEY_SCREENSAVER;	break;
> > +		case 0x1b4: key = KEY_FILE;		break;
> > +		case 0x1b6: key = KEY_IMAGES;		break;
> > +		case 0x1b7: key = KEY_AUDIO;		break;
> > +		case 0x1b8: key = KEY_VIDEO;		break;
> > +		case 0x1bc: key = KEY_MESSENGER;	break;
> > +		case 0x1bd: key = KEY_INFO;		break;
> > +		case 0x1cb: key = KEY_ASSISTANT;	break;
> > +		case 0x201: key = KEY_NEW;		break;
> > +		case 0x202: key = KEY_OPEN;		break;
> > +		case 0x203: key = KEY_CLOSE;		break;
> > +		case 0x204: key = KEY_EXIT;		break;
> > +		case 0x207: key = KEY_SAVE;		break;
> > +		case 0x208: key = KEY_PRINT;		break;
> > +		case 0x209: key = KEY_PROPS;		break;
> > +		case 0x21a: key = KEY_UNDO;		break;
> > +		case 0x21b: key = KEY_COPY;		break;
> > +		case 0x21c: key = KEY_CUT;		break;
> > +		case 0x21d: key = KEY_PASTE;		break;
> > +		case 0x21f: key = KEY_FIND;		break;
> > +		case 0x221: key = KEY_SEARCH;		break;
> > +		case 0x222: key = KEY_GOTO;		break;
> > +		case 0x223: key = KEY_HOMEPAGE;		break;
> > +		case 0x224: key = KEY_BACK;		break;
> > +		case 0x225: key = KEY_FORWARD;		break;
> > +		case 0x226: key = KEY_STOP;		break;
> > +		case 0x227: key = KEY_REFRESH;		break;
> > +		case 0x22a: key = KEY_BOOKMARKS;	break;
> > +		case 0x22d: key = KEY_ZOOMIN;		break;
> > +		case 0x22e: key = KEY_ZOOMOUT;		break;
> > +		case 0x22f: key = KEY_ZOOMRESET;	break;
> > +		case 0x232: key = KEY_FULL_SCREEN;	break;
> > +		case 0x233: key = KEY_SCROLLUP;		break;
> > +		case 0x234: key = KEY_SCROLLDOWN;	break;
> >  		case 0x238: /* AC Pan */
> >  			set_bit(REL_HWHEEL, input->relbit);
> >  			map_rel(REL_HWHEEL_HI_RES);
> > +			clear = false;
> >  			break;
> > -		case 0x23d: map_key_clear(KEY_EDIT);		break;
> > -		case 0x25f: map_key_clear(KEY_CANCEL);		break;
> > -		case 0x269: map_key_clear(KEY_INSERT);		break;
> > -		case 0x26a: map_key_clear(KEY_DELETE);		break;
> > -		case 0x279: map_key_clear(KEY_REDO);		break;
> > +		case 0x23d: key = KEY_EDIT;		break;
> > +		case 0x25f: key = KEY_CANCEL;		break;
> > +		case 0x269: key = KEY_INSERT;		break;
> > +		case 0x26a: key = KEY_DELETE;		break;
> > +		case 0x279: key = KEY_REDO;		break;
> >  
> > -		case 0x289: map_key_clear(KEY_REPLY);		break;
> > -		case 0x28b: map_key_clear(KEY_FORWARDMAIL);	break;
> > -		case 0x28c: map_key_clear(KEY_SEND);		break;
> > +		case 0x289: key = KEY_REPLY;		break;
> > +		case 0x28b: key = KEY_FORWARDMAIL;	break;
> > +		case 0x28c: key = KEY_SEND;		break;
> >  
> > -		case 0x29d: map_key_clear(KEY_KBD_LAYOUT_NEXT);	break;
> > +		case 0x29d: key = KEY_KBD_LAYOUT_NEXT;	break;
> >  
> > -		case 0x2a2: map_key_clear(KEY_ALL_APPLICATIONS);	break;
> > +		case 0x2a2: key = KEY_ALL_APPLICATIONS;	break;
> >  
> > -		case 0x2c7: map_key_clear(KEY_KBDINPUTASSIST_PREV);		break;
> > -		case 0x2c8: map_key_clear(KEY_KBDINPUTASSIST_NEXT);		break;
> > -		case 0x2c9: map_key_clear(KEY_KBDINPUTASSIST_PREVGROUP);		break;
> > -		case 0x2ca: map_key_clear(KEY_KBDINPUTASSIST_NEXTGROUP);		break;
> > -		case 0x2cb: map_key_clear(KEY_KBDINPUTASSIST_ACCEPT);	break;
> > -		case 0x2cc: map_key_clear(KEY_KBDINPUTASSIST_CANCEL);	break;
> > +		case 0x2c7: key = KEY_KBDINPUTASSIST_PREV;		break;
> > +		case 0x2c8: key = KEY_KBDINPUTASSIST_NEXT;		break;
> > +		case 0x2c9: key = KEY_KBDINPUTASSIST_PREVGROUP;		break;
> > +		case 0x2ca: key = KEY_KBDINPUTASSIST_NEXTGROUP;		break;
> > +		case 0x2cb: key = KEY_KBDINPUTASSIST_ACCEPT;		break;
> > +		case 0x2cc: key = KEY_KBDINPUTASSIST_CANCEL;		break;
> >  
> > -		case 0x29f: map_key_clear(KEY_SCALE);		break;
> > +		case 0x29f: key = KEY_SCALE;		break;
> >  
> > -		default: map_key_clear(KEY_UNKNOWN);
> > +		default: key = KEY_UNKNOWN;		break;
> >  		}
> > +
> > +		if (clear)
> > +			map_key_clear(key);
> >  		break;
> > +	}
> >  
> >  	case HID_UP_GENDEVCTRLS:
> >  		switch (usage->hid) {
> > @@ -1207,34 +1233,42 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
> >  		}
> >  		goto unknown;
> >  
> > -	case HID_UP_HPVENDOR:	/* Reported on a Dutch layout HP5308 */
> > +	case HID_UP_HPVENDOR: {	/* Reported on a Dutch layout HP5308 */
> > +		int key;
> > +
> >  		set_bit(EV_REP, input->evbit);
> >  		switch (usage->hid & HID_USAGE) {
> > -		case 0x021: map_key_clear(KEY_PRINT);           break;
> > -		case 0x070: map_key_clear(KEY_HP);		break;
> > -		case 0x071: map_key_clear(KEY_CAMERA);		break;
> > -		case 0x072: map_key_clear(KEY_SOUND);		break;
> > -		case 0x073: map_key_clear(KEY_QUESTION);	break;
> > -		case 0x080: map_key_clear(KEY_EMAIL);		break;
> > -		case 0x081: map_key_clear(KEY_CHAT);		break;
> > -		case 0x082: map_key_clear(KEY_SEARCH);		break;
> > -		case 0x083: map_key_clear(KEY_CONNECT);	        break;
> > -		case 0x084: map_key_clear(KEY_FINANCE);		break;
> > -		case 0x085: map_key_clear(KEY_SPORT);		break;
> > -		case 0x086: map_key_clear(KEY_SHOP);	        break;
> > +		case 0x021: key = KEY_PRINT;		break;
> > +		case 0x070: key = KEY_HP;		break;
> > +		case 0x071: key = KEY_CAMERA;		break;
> > +		case 0x072: key = KEY_SOUND;		break;
> > +		case 0x073: key = KEY_QUESTION;		break;
> > +		case 0x080: key = KEY_EMAIL;		break;
> > +		case 0x081: key = KEY_CHAT;		break;
> > +		case 0x082: key = KEY_SEARCH;		break;
> > +		case 0x083: key = KEY_CONNECT;	        break;
> > +		case 0x084: key = KEY_FINANCE;		break;
> > +		case 0x085: key = KEY_SPORT;		break;
> > +		case 0x086: key = KEY_SHOP;	        break;
> >  		default:    goto ignore;
> >  		}
> > +		map_key_clear(key);
> >  		break;
> > +	}
> > +
> > +	case HID_UP_HPVENDOR2: {
> > +		int key;
> >  
> > -	case HID_UP_HPVENDOR2:
> >  		set_bit(EV_REP, input->evbit);
> >  		switch (usage->hid & HID_USAGE) {
> > -		case 0x001: map_key_clear(KEY_MICMUTE);		break;
> > -		case 0x003: map_key_clear(KEY_BRIGHTNESSDOWN);	break;
> > -		case 0x004: map_key_clear(KEY_BRIGHTNESSUP);	break;
> > +		case 0x001: key = KEY_MICMUTE;		break;
> > +		case 0x003: key = KEY_BRIGHTNESSDOWN;	break;
> > +		case 0x004: key = KEY_BRIGHTNESSUP;	break;
> >  		default:    goto ignore;
> >  		}
> > +		map_key_clear(key);
> >  		break;
> > +	}
> >  
> >  	case HID_UP_MSVENDOR:
> >  		goto ignore;
> > 
> 
>
diff mbox series

Patch

diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index c6b27aab90414..21d67866efb06 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -743,37 +743,44 @@  static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
 		map_key(code);
 		break;
 
-	case HID_UP_SIMULATION:
+	case HID_UP_SIMULATION: {
+		int abs;
+
 		switch (usage->hid & 0xffff) {
-		case 0xba: map_abs(ABS_RUDDER);   break;
-		case 0xbb: map_abs(ABS_THROTTLE); break;
-		case 0xc4: map_abs(ABS_GAS);      break;
-		case 0xc5: map_abs(ABS_BRAKE);    break;
-		case 0xc8: map_abs(ABS_WHEEL);    break;
+		case 0xba: abs = ABS_RUDDER;	break;
+		case 0xbb: abs = ABS_THROTTLE;	break;
+		case 0xc4: abs = ABS_GAS;	break;
+		case 0xc5: abs = ABS_BRAKE;	break;
+		case 0xc8: abs = ABS_WHEEL;	break;
 		default:   goto ignore;
 		}
+		map_abs(abs);
 		break;
+	}
 
 	case HID_UP_GENDESK:
 		if ((usage->hid & 0xf0) == 0x80) {	/* SystemControl */
+			int key;
+
 			switch (usage->hid & 0xf) {
-			case 0x1: map_key_clear(KEY_POWER);  break;
-			case 0x2: map_key_clear(KEY_SLEEP);  break;
-			case 0x3: map_key_clear(KEY_WAKEUP); break;
-			case 0x4: map_key_clear(KEY_CONTEXT_MENU); break;
-			case 0x5: map_key_clear(KEY_MENU); break;
-			case 0x6: map_key_clear(KEY_PROG1); break;
-			case 0x7: map_key_clear(KEY_HELP); break;
-			case 0x8: map_key_clear(KEY_EXIT); break;
-			case 0x9: map_key_clear(KEY_SELECT); break;
-			case 0xa: map_key_clear(KEY_RIGHT); break;
-			case 0xb: map_key_clear(KEY_LEFT); break;
-			case 0xc: map_key_clear(KEY_UP); break;
-			case 0xd: map_key_clear(KEY_DOWN); break;
-			case 0xe: map_key_clear(KEY_POWER2); break;
-			case 0xf: map_key_clear(KEY_RESTART); break;
+			case 0x1: key = KEY_POWER;	break;
+			case 0x2: key = KEY_SLEEP;	break;
+			case 0x3: key = KEY_WAKEUP;	break;
+			case 0x4: key = KEY_CONTEXT_MENU; break;
+			case 0x5: key = KEY_MENU;	break;
+			case 0x6: key = KEY_PROG1;	break;
+			case 0x7: key = KEY_HELP;	break;
+			case 0x8: key = KEY_EXIT;	break;
+			case 0x9: key = KEY_SELECT;	break;
+			case 0xa: key = KEY_RIGHT;	break;
+			case 0xb: key = KEY_LEFT;	break;
+			case 0xc: key = KEY_UP;		break;
+			case 0xd: key = KEY_DOWN;	break;
+			case 0xe: key = KEY_POWER2;	break;
+			case 0xf: key = KEY_RESTART;	break;
 			default: goto unknown;
 			}
+			map_key_clear(key);
 			break;
 		}
 
@@ -859,23 +866,27 @@  static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
 
 		break;
 
-	case HID_UP_LED:
-		switch (usage->hid & 0xffff) {		      /* HID-Value:                   */
-		case 0x01:  map_led (LED_NUML);     break;    /*   "Num Lock"                 */
-		case 0x02:  map_led (LED_CAPSL);    break;    /*   "Caps Lock"                */
-		case 0x03:  map_led (LED_SCROLLL);  break;    /*   "Scroll Lock"              */
-		case 0x04:  map_led (LED_COMPOSE);  break;    /*   "Compose"                  */
-		case 0x05:  map_led (LED_KANA);     break;    /*   "Kana"                     */
-		case 0x27:  map_led (LED_SLEEP);    break;    /*   "Stand-By"                 */
-		case 0x4c:  map_led (LED_SUSPEND);  break;    /*   "System Suspend"           */
-		case 0x09:  map_led (LED_MUTE);     break;    /*   "Mute"                     */
-		case 0x4b:  map_led (LED_MISC);     break;    /*   "Generic Indicator"        */
-		case 0x19:  map_led (LED_MAIL);     break;    /*   "Message Waiting"          */
-		case 0x4d:  map_led (LED_CHARGING); break;    /*   "External Power Connected" */
+	case HID_UP_LED: {
+		int led;
+
+		switch (usage->hid & 0xffff) {		/* HID-Value: */
+		case 0x01:  led = LED_NUML;	break;	/* Num Lock */
+		case 0x02:  led = LED_CAPSL;	break;	/* Caps Lock */
+		case 0x03:  led = LED_SCROLLL;	break;	/* Scroll Lock */
+		case 0x04:  led = LED_COMPOSE;	break;	/* Compose */
+		case 0x05:  led = LED_KANA;	break;	/* Kana */
+		case 0x27:  led = LED_SLEEP;	break;	/* Stand-By */
+		case 0x4c:  led = LED_SUSPEND;	break;	/* System Suspend */
+		case 0x09:  led = LED_MUTE;	break;	/* Mute */
+		case 0x4b:  led = LED_MISC;	break;	/* Generic Indicator */
+		case 0x19:  led = LED_MAIL;	break;	/* Message Waiting */
+		case 0x4d:  led = LED_CHARGING;	break;	/* External Power Connected */
 
 		default: goto ignore;
 		}
+		map_led(led);
 		break;
+	}
 
 	case HID_UP_DIGITIZER:
 		if ((field->application & 0xff) == 0x01) /* Digitizer */
@@ -976,218 +987,233 @@  static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
 		}
 		break;
 
-	case HID_UP_TELEPHONY:
+	case HID_UP_TELEPHONY: {
+		int key;
+
 		switch (usage->hid & HID_USAGE) {
-		case 0x2f: map_key_clear(KEY_MICMUTE);		break;
-		case 0xb0: map_key_clear(KEY_NUMERIC_0);	break;
-		case 0xb1: map_key_clear(KEY_NUMERIC_1);	break;
-		case 0xb2: map_key_clear(KEY_NUMERIC_2);	break;
-		case 0xb3: map_key_clear(KEY_NUMERIC_3);	break;
-		case 0xb4: map_key_clear(KEY_NUMERIC_4);	break;
-		case 0xb5: map_key_clear(KEY_NUMERIC_5);	break;
-		case 0xb6: map_key_clear(KEY_NUMERIC_6);	break;
-		case 0xb7: map_key_clear(KEY_NUMERIC_7);	break;
-		case 0xb8: map_key_clear(KEY_NUMERIC_8);	break;
-		case 0xb9: map_key_clear(KEY_NUMERIC_9);	break;
-		case 0xba: map_key_clear(KEY_NUMERIC_STAR);	break;
-		case 0xbb: map_key_clear(KEY_NUMERIC_POUND);	break;
-		case 0xbc: map_key_clear(KEY_NUMERIC_A);	break;
-		case 0xbd: map_key_clear(KEY_NUMERIC_B);	break;
-		case 0xbe: map_key_clear(KEY_NUMERIC_C);	break;
-		case 0xbf: map_key_clear(KEY_NUMERIC_D);	break;
+		case 0x2f: key = KEY_MICMUTE;		break;
+		case 0xb0: key = KEY_NUMERIC_0;		break;
+		case 0xb1: key = KEY_NUMERIC_1;		break;
+		case 0xb2: key = KEY_NUMERIC_2;		break;
+		case 0xb3: key = KEY_NUMERIC_3;		break;
+		case 0xb4: key = KEY_NUMERIC_4;		break;
+		case 0xb5: key = KEY_NUMERIC_5;		break;
+		case 0xb6: key = KEY_NUMERIC_6;		break;
+		case 0xb7: key = KEY_NUMERIC_7;		break;
+		case 0xb8: key = KEY_NUMERIC_8;		break;
+		case 0xb9: key = KEY_NUMERIC_9;		break;
+		case 0xba: key = KEY_NUMERIC_STAR;	break;
+		case 0xbb: key = KEY_NUMERIC_POUND;	break;
+		case 0xbc: key = KEY_NUMERIC_A;		break;
+		case 0xbd: key = KEY_NUMERIC_B;		break;
+		case 0xbe: key = KEY_NUMERIC_C;		break;
+		case 0xbf: key = KEY_NUMERIC_D;		break;
 		default: goto ignore;
 		}
+		map_key_clear(key);
 		break;
+	}
+
+	case HID_UP_CONSUMER: {	/* USB HUT v1.12, pages 75-84 */
+		int key;
+		bool clear = true;
 
-	case HID_UP_CONSUMER:	/* USB HUT v1.12, pages 75-84 */
 		switch (usage->hid & HID_USAGE) {
 		case 0x000: goto ignore;
-		case 0x030: map_key_clear(KEY_POWER);		break;
-		case 0x031: map_key_clear(KEY_RESTART);		break;
-		case 0x032: map_key_clear(KEY_SLEEP);		break;
-		case 0x034: map_key_clear(KEY_SLEEP);		break;
-		case 0x035: map_key_clear(KEY_KBDILLUMTOGGLE);	break;
-		case 0x036: map_key_clear(BTN_MISC);		break;
-
-		case 0x040: map_key_clear(KEY_MENU);		break; /* Menu */
-		case 0x041: map_key_clear(KEY_SELECT);		break; /* Menu Pick */
-		case 0x042: map_key_clear(KEY_UP);		break; /* Menu Up */
-		case 0x043: map_key_clear(KEY_DOWN);		break; /* Menu Down */
-		case 0x044: map_key_clear(KEY_LEFT);		break; /* Menu Left */
-		case 0x045: map_key_clear(KEY_RIGHT);		break; /* Menu Right */
-		case 0x046: map_key_clear(KEY_ESC);		break; /* Menu Escape */
-		case 0x047: map_key_clear(KEY_KPPLUS);		break; /* Menu Value Increase */
-		case 0x048: map_key_clear(KEY_KPMINUS);		break; /* Menu Value Decrease */
-
-		case 0x060: map_key_clear(KEY_INFO);		break; /* Data On Screen */
-		case 0x061: map_key_clear(KEY_SUBTITLE);	break; /* Closed Caption */
-		case 0x063: map_key_clear(KEY_VCR);		break; /* VCR/TV */
-		case 0x065: map_key_clear(KEY_CAMERA);		break; /* Snapshot */
-		case 0x069: map_key_clear(KEY_RED);		break;
-		case 0x06a: map_key_clear(KEY_GREEN);		break;
-		case 0x06b: map_key_clear(KEY_BLUE);		break;
-		case 0x06c: map_key_clear(KEY_YELLOW);		break;
-		case 0x06d: map_key_clear(KEY_ASPECT_RATIO);	break;
-
-		case 0x06f: map_key_clear(KEY_BRIGHTNESSUP);		break;
-		case 0x070: map_key_clear(KEY_BRIGHTNESSDOWN);		break;
-		case 0x072: map_key_clear(KEY_BRIGHTNESS_TOGGLE);	break;
-		case 0x073: map_key_clear(KEY_BRIGHTNESS_MIN);		break;
-		case 0x074: map_key_clear(KEY_BRIGHTNESS_MAX);		break;
-		case 0x075: map_key_clear(KEY_BRIGHTNESS_AUTO);		break;
-
-		case 0x079: map_key_clear(KEY_KBDILLUMUP);	break;
-		case 0x07a: map_key_clear(KEY_KBDILLUMDOWN);	break;
-		case 0x07c: map_key_clear(KEY_KBDILLUMTOGGLE);	break;
-
-		case 0x082: map_key_clear(KEY_VIDEO_NEXT);	break;
-		case 0x083: map_key_clear(KEY_LAST);		break;
-		case 0x084: map_key_clear(KEY_ENTER);		break;
-		case 0x088: map_key_clear(KEY_PC);		break;
-		case 0x089: map_key_clear(KEY_TV);		break;
-		case 0x08a: map_key_clear(KEY_WWW);		break;
-		case 0x08b: map_key_clear(KEY_DVD);		break;
-		case 0x08c: map_key_clear(KEY_PHONE);		break;
-		case 0x08d: map_key_clear(KEY_PROGRAM);		break;
-		case 0x08e: map_key_clear(KEY_VIDEOPHONE);	break;
-		case 0x08f: map_key_clear(KEY_GAMES);		break;
-		case 0x090: map_key_clear(KEY_MEMO);		break;
-		case 0x091: map_key_clear(KEY_CD);		break;
-		case 0x092: map_key_clear(KEY_VCR);		break;
-		case 0x093: map_key_clear(KEY_TUNER);		break;
-		case 0x094: map_key_clear(KEY_EXIT);		break;
-		case 0x095: map_key_clear(KEY_HELP);		break;
-		case 0x096: map_key_clear(KEY_TAPE);		break;
-		case 0x097: map_key_clear(KEY_TV2);		break;
-		case 0x098: map_key_clear(KEY_SAT);		break;
-		case 0x09a: map_key_clear(KEY_PVR);		break;
-
-		case 0x09c: map_key_clear(KEY_CHANNELUP);	break;
-		case 0x09d: map_key_clear(KEY_CHANNELDOWN);	break;
-		case 0x0a0: map_key_clear(KEY_VCR2);		break;
-
-		case 0x0b0: map_key_clear(KEY_PLAY);		break;
-		case 0x0b1: map_key_clear(KEY_PAUSE);		break;
-		case 0x0b2: map_key_clear(KEY_RECORD);		break;
-		case 0x0b3: map_key_clear(KEY_FASTFORWARD);	break;
-		case 0x0b4: map_key_clear(KEY_REWIND);		break;
-		case 0x0b5: map_key_clear(KEY_NEXTSONG);	break;
-		case 0x0b6: map_key_clear(KEY_PREVIOUSSONG);	break;
-		case 0x0b7: map_key_clear(KEY_STOPCD);		break;
-		case 0x0b8: map_key_clear(KEY_EJECTCD);		break;
-		case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT);	break;
-		case 0x0b9: map_key_clear(KEY_SHUFFLE);		break;
-		case 0x0bf: map_key_clear(KEY_SLOW);		break;
-
-		case 0x0cd: map_key_clear(KEY_PLAYPAUSE);	break;
-		case 0x0cf: map_key_clear(KEY_VOICECOMMAND);	break;
-
-		case 0x0d8: map_key_clear(KEY_DICTATE);		break;
-		case 0x0d9: map_key_clear(KEY_EMOJI_PICKER);	break;
-
-		case 0x0e0: map_abs_clear(ABS_VOLUME);		break;
-		case 0x0e2: map_key_clear(KEY_MUTE);		break;
-		case 0x0e5: map_key_clear(KEY_BASSBOOST);	break;
-		case 0x0e9: map_key_clear(KEY_VOLUMEUP);	break;
-		case 0x0ea: map_key_clear(KEY_VOLUMEDOWN);	break;
-		case 0x0f5: map_key_clear(KEY_SLOW);		break;
-
-		case 0x181: map_key_clear(KEY_BUTTONCONFIG);	break;
-		case 0x182: map_key_clear(KEY_BOOKMARKS);	break;
-		case 0x183: map_key_clear(KEY_CONFIG);		break;
-		case 0x184: map_key_clear(KEY_WORDPROCESSOR);	break;
-		case 0x185: map_key_clear(KEY_EDITOR);		break;
-		case 0x186: map_key_clear(KEY_SPREADSHEET);	break;
-		case 0x187: map_key_clear(KEY_GRAPHICSEDITOR);	break;
-		case 0x188: map_key_clear(KEY_PRESENTATION);	break;
-		case 0x189: map_key_clear(KEY_DATABASE);	break;
-		case 0x18a: map_key_clear(KEY_MAIL);		break;
-		case 0x18b: map_key_clear(KEY_NEWS);		break;
-		case 0x18c: map_key_clear(KEY_VOICEMAIL);	break;
-		case 0x18d: map_key_clear(KEY_ADDRESSBOOK);	break;
-		case 0x18e: map_key_clear(KEY_CALENDAR);	break;
-		case 0x18f: map_key_clear(KEY_TASKMANAGER);	break;
-		case 0x190: map_key_clear(KEY_JOURNAL);		break;
-		case 0x191: map_key_clear(KEY_FINANCE);		break;
-		case 0x192: map_key_clear(KEY_CALC);		break;
-		case 0x193: map_key_clear(KEY_PLAYER);		break;
-		case 0x194: map_key_clear(KEY_FILE);		break;
-		case 0x196: map_key_clear(KEY_WWW);		break;
-		case 0x199: map_key_clear(KEY_CHAT);		break;
-		case 0x19c: map_key_clear(KEY_LOGOFF);		break;
-		case 0x19e: map_key_clear(KEY_COFFEE);		break;
-		case 0x19f: map_key_clear(KEY_CONTROLPANEL);		break;
-		case 0x1a2: map_key_clear(KEY_APPSELECT);		break;
-		case 0x1a3: map_key_clear(KEY_NEXT);		break;
-		case 0x1a4: map_key_clear(KEY_PREVIOUS);	break;
-		case 0x1a6: map_key_clear(KEY_HELP);		break;
-		case 0x1a7: map_key_clear(KEY_DOCUMENTS);	break;
-		case 0x1ab: map_key_clear(KEY_SPELLCHECK);	break;
-		case 0x1ae: map_key_clear(KEY_KEYBOARD);	break;
-		case 0x1b1: map_key_clear(KEY_SCREENSAVER);		break;
-		case 0x1b4: map_key_clear(KEY_FILE);		break;
-		case 0x1b6: map_key_clear(KEY_IMAGES);		break;
-		case 0x1b7: map_key_clear(KEY_AUDIO);		break;
-		case 0x1b8: map_key_clear(KEY_VIDEO);		break;
-		case 0x1bc: map_key_clear(KEY_MESSENGER);	break;
-		case 0x1bd: map_key_clear(KEY_INFO);		break;
-		case 0x1cb: map_key_clear(KEY_ASSISTANT);	break;
-		case 0x201: map_key_clear(KEY_NEW);		break;
-		case 0x202: map_key_clear(KEY_OPEN);		break;
-		case 0x203: map_key_clear(KEY_CLOSE);		break;
-		case 0x204: map_key_clear(KEY_EXIT);		break;
-		case 0x207: map_key_clear(KEY_SAVE);		break;
-		case 0x208: map_key_clear(KEY_PRINT);		break;
-		case 0x209: map_key_clear(KEY_PROPS);		break;
-		case 0x21a: map_key_clear(KEY_UNDO);		break;
-		case 0x21b: map_key_clear(KEY_COPY);		break;
-		case 0x21c: map_key_clear(KEY_CUT);		break;
-		case 0x21d: map_key_clear(KEY_PASTE);		break;
-		case 0x21f: map_key_clear(KEY_FIND);		break;
-		case 0x221: map_key_clear(KEY_SEARCH);		break;
-		case 0x222: map_key_clear(KEY_GOTO);		break;
-		case 0x223: map_key_clear(KEY_HOMEPAGE);	break;
-		case 0x224: map_key_clear(KEY_BACK);		break;
-		case 0x225: map_key_clear(KEY_FORWARD);		break;
-		case 0x226: map_key_clear(KEY_STOP);		break;
-		case 0x227: map_key_clear(KEY_REFRESH);		break;
-		case 0x22a: map_key_clear(KEY_BOOKMARKS);	break;
-		case 0x22d: map_key_clear(KEY_ZOOMIN);		break;
-		case 0x22e: map_key_clear(KEY_ZOOMOUT);		break;
-		case 0x22f: map_key_clear(KEY_ZOOMRESET);	break;
-		case 0x232: map_key_clear(KEY_FULL_SCREEN);	break;
-		case 0x233: map_key_clear(KEY_SCROLLUP);	break;
-		case 0x234: map_key_clear(KEY_SCROLLDOWN);	break;
+		case 0x030: key = KEY_POWER;		break;
+		case 0x031: key = KEY_RESTART;		break;
+		case 0x032: key = KEY_SLEEP;		break;
+		case 0x034: key = KEY_SLEEP;		break;
+		case 0x035: key = KEY_KBDILLUMTOGGLE;	break;
+		case 0x036: key = BTN_MISC;		break;
+
+		case 0x040: key = KEY_MENU;		break; /* Menu */
+		case 0x041: key = KEY_SELECT;		break; /* Menu Pick */
+		case 0x042: key = KEY_UP;		break; /* Menu Up */
+		case 0x043: key = KEY_DOWN;		break; /* Menu Down */
+		case 0x044: key = KEY_LEFT;		break; /* Menu Left */
+		case 0x045: key = KEY_RIGHT;		break; /* Menu Right */
+		case 0x046: key = KEY_ESC;		break; /* Menu Escape */
+		case 0x047: key = KEY_KPPLUS;		break; /* Menu Value Increase */
+		case 0x048: key = KEY_KPMINUS;		break; /* Menu Value Decrease */
+
+		case 0x060: key = KEY_INFO;		break; /* Data On Screen */
+		case 0x061: key = KEY_SUBTITLE;		break; /* Closed Caption */
+		case 0x063: key = KEY_VCR;		break; /* VCR/TV */
+		case 0x065: key = KEY_CAMERA;		break; /* Snapshot */
+		case 0x069: key = KEY_RED;		break;
+		case 0x06a: key = KEY_GREEN;		break;
+		case 0x06b: key = KEY_BLUE;		break;
+		case 0x06c: key = KEY_YELLOW;		break;
+		case 0x06d: key = KEY_ASPECT_RATIO;	break;
+
+		case 0x06f: key = KEY_BRIGHTNESSUP;		break;
+		case 0x070: key = KEY_BRIGHTNESSDOWN;		break;
+		case 0x072: key = KEY_BRIGHTNESS_TOGGLE;	break;
+		case 0x073: key = KEY_BRIGHTNESS_MIN;		break;
+		case 0x074: key = KEY_BRIGHTNESS_MAX;		break;
+		case 0x075: key = KEY_BRIGHTNESS_AUTO;		break;
+
+		case 0x079: key = KEY_KBDILLUMUP;	break;
+		case 0x07a: key = KEY_KBDILLUMDOWN;	break;
+		case 0x07c: key = KEY_KBDILLUMTOGGLE;	break;
+
+		case 0x082: key = KEY_VIDEO_NEXT;	break;
+		case 0x083: key = KEY_LAST;		break;
+		case 0x084: key = KEY_ENTER;		break;
+		case 0x088: key = KEY_PC;		break;
+		case 0x089: key = KEY_TV;		break;
+		case 0x08a: key = KEY_WWW;		break;
+		case 0x08b: key = KEY_DVD;		break;
+		case 0x08c: key = KEY_PHONE;		break;
+		case 0x08d: key = KEY_PROGRAM;		break;
+		case 0x08e: key = KEY_VIDEOPHONE;	break;
+		case 0x08f: key = KEY_GAMES;		break;
+		case 0x090: key = KEY_MEMO;		break;
+		case 0x091: key = KEY_CD;		break;
+		case 0x092: key = KEY_VCR;		break;
+		case 0x093: key = KEY_TUNER;		break;
+		case 0x094: key = KEY_EXIT;		break;
+		case 0x095: key = KEY_HELP;		break;
+		case 0x096: key = KEY_TAPE;		break;
+		case 0x097: key = KEY_TV2;		break;
+		case 0x098: key = KEY_SAT;		break;
+		case 0x09a: key = KEY_PVR;		break;
+
+		case 0x09c: key = KEY_CHANNELUP;	break;
+		case 0x09d: key = KEY_CHANNELDOWN;	break;
+		case 0x0a0: key = KEY_VCR2;		break;
+
+		case 0x0b0: key = KEY_PLAY;		break;
+		case 0x0b1: key = KEY_PAUSE;		break;
+		case 0x0b2: key = KEY_RECORD;		break;
+		case 0x0b3: key = KEY_FASTFORWARD;	break;
+		case 0x0b4: key = KEY_REWIND;		break;
+		case 0x0b5: key = KEY_NEXTSONG;		break;
+		case 0x0b6: key = KEY_PREVIOUSSONG;	break;
+		case 0x0b7: key = KEY_STOPCD;		break;
+		case 0x0b8: key = KEY_EJECTCD;		break;
+		case 0x0bc: key = KEY_MEDIA_REPEAT;	break;
+		case 0x0b9: key = KEY_SHUFFLE;		break;
+		case 0x0bf: key = KEY_SLOW;		break;
+
+		case 0x0cd: key = KEY_PLAYPAUSE;	break;
+		case 0x0cf: key = KEY_VOICECOMMAND;	break;
+
+		case 0x0d8: key = KEY_DICTATE;		break;
+		case 0x0d9: key = KEY_EMOJI_PICKER;	break;
+
+		case 0x0e0:
+			map_abs_clear(ABS_VOLUME);
+			clear = false;
+			break;
+		case 0x0e2: key = KEY_MUTE;		break;
+		case 0x0e5: key = KEY_BASSBOOST;	break;
+		case 0x0e9: key = KEY_VOLUMEUP;		break;
+		case 0x0ea: key = KEY_VOLUMEDOWN;	break;
+		case 0x0f5: key = KEY_SLOW;		break;
+
+		case 0x181: key = KEY_BUTTONCONFIG;	break;
+		case 0x182: key = KEY_BOOKMARKS;	break;
+		case 0x183: key = KEY_CONFIG;		break;
+		case 0x184: key = KEY_WORDPROCESSOR;	break;
+		case 0x185: key = KEY_EDITOR;		break;
+		case 0x186: key = KEY_SPREADSHEET;	break;
+		case 0x187: key = KEY_GRAPHICSEDITOR;	break;
+		case 0x188: key = KEY_PRESENTATION;	break;
+		case 0x189: key = KEY_DATABASE;		break;
+		case 0x18a: key = KEY_MAIL;		break;
+		case 0x18b: key = KEY_NEWS;		break;
+		case 0x18c: key = KEY_VOICEMAIL;	break;
+		case 0x18d: key = KEY_ADDRESSBOOK;	break;
+		case 0x18e: key = KEY_CALENDAR;		break;
+		case 0x18f: key = KEY_TASKMANAGER;	break;
+		case 0x190: key = KEY_JOURNAL;		break;
+		case 0x191: key = KEY_FINANCE;		break;
+		case 0x192: key = KEY_CALC;		break;
+		case 0x193: key = KEY_PLAYER;		break;
+		case 0x194: key = KEY_FILE;		break;
+		case 0x196: key = KEY_WWW;		break;
+		case 0x199: key = KEY_CHAT;		break;
+		case 0x19c: key = KEY_LOGOFF;		break;
+		case 0x19e: key = KEY_COFFEE;		break;
+		case 0x19f: key = KEY_CONTROLPANEL;	break;
+		case 0x1a2: key = KEY_APPSELECT;	break;
+		case 0x1a3: key = KEY_NEXT;		break;
+		case 0x1a4: key = KEY_PREVIOUS;		break;
+		case 0x1a6: key = KEY_HELP;		break;
+		case 0x1a7: key = KEY_DOCUMENTS;	break;
+		case 0x1ab: key = KEY_SPELLCHECK;	break;
+		case 0x1ae: key = KEY_KEYBOARD;		break;
+		case 0x1b1: key = KEY_SCREENSAVER;	break;
+		case 0x1b4: key = KEY_FILE;		break;
+		case 0x1b6: key = KEY_IMAGES;		break;
+		case 0x1b7: key = KEY_AUDIO;		break;
+		case 0x1b8: key = KEY_VIDEO;		break;
+		case 0x1bc: key = KEY_MESSENGER;	break;
+		case 0x1bd: key = KEY_INFO;		break;
+		case 0x1cb: key = KEY_ASSISTANT;	break;
+		case 0x201: key = KEY_NEW;		break;
+		case 0x202: key = KEY_OPEN;		break;
+		case 0x203: key = KEY_CLOSE;		break;
+		case 0x204: key = KEY_EXIT;		break;
+		case 0x207: key = KEY_SAVE;		break;
+		case 0x208: key = KEY_PRINT;		break;
+		case 0x209: key = KEY_PROPS;		break;
+		case 0x21a: key = KEY_UNDO;		break;
+		case 0x21b: key = KEY_COPY;		break;
+		case 0x21c: key = KEY_CUT;		break;
+		case 0x21d: key = KEY_PASTE;		break;
+		case 0x21f: key = KEY_FIND;		break;
+		case 0x221: key = KEY_SEARCH;		break;
+		case 0x222: key = KEY_GOTO;		break;
+		case 0x223: key = KEY_HOMEPAGE;		break;
+		case 0x224: key = KEY_BACK;		break;
+		case 0x225: key = KEY_FORWARD;		break;
+		case 0x226: key = KEY_STOP;		break;
+		case 0x227: key = KEY_REFRESH;		break;
+		case 0x22a: key = KEY_BOOKMARKS;	break;
+		case 0x22d: key = KEY_ZOOMIN;		break;
+		case 0x22e: key = KEY_ZOOMOUT;		break;
+		case 0x22f: key = KEY_ZOOMRESET;	break;
+		case 0x232: key = KEY_FULL_SCREEN;	break;
+		case 0x233: key = KEY_SCROLLUP;		break;
+		case 0x234: key = KEY_SCROLLDOWN;	break;
 		case 0x238: /* AC Pan */
 			set_bit(REL_HWHEEL, input->relbit);
 			map_rel(REL_HWHEEL_HI_RES);
+			clear = false;
 			break;
-		case 0x23d: map_key_clear(KEY_EDIT);		break;
-		case 0x25f: map_key_clear(KEY_CANCEL);		break;
-		case 0x269: map_key_clear(KEY_INSERT);		break;
-		case 0x26a: map_key_clear(KEY_DELETE);		break;
-		case 0x279: map_key_clear(KEY_REDO);		break;
+		case 0x23d: key = KEY_EDIT;		break;
+		case 0x25f: key = KEY_CANCEL;		break;
+		case 0x269: key = KEY_INSERT;		break;
+		case 0x26a: key = KEY_DELETE;		break;
+		case 0x279: key = KEY_REDO;		break;
 
-		case 0x289: map_key_clear(KEY_REPLY);		break;
-		case 0x28b: map_key_clear(KEY_FORWARDMAIL);	break;
-		case 0x28c: map_key_clear(KEY_SEND);		break;
+		case 0x289: key = KEY_REPLY;		break;
+		case 0x28b: key = KEY_FORWARDMAIL;	break;
+		case 0x28c: key = KEY_SEND;		break;
 
-		case 0x29d: map_key_clear(KEY_KBD_LAYOUT_NEXT);	break;
+		case 0x29d: key = KEY_KBD_LAYOUT_NEXT;	break;
 
-		case 0x2a2: map_key_clear(KEY_ALL_APPLICATIONS);	break;
+		case 0x2a2: key = KEY_ALL_APPLICATIONS;	break;
 
-		case 0x2c7: map_key_clear(KEY_KBDINPUTASSIST_PREV);		break;
-		case 0x2c8: map_key_clear(KEY_KBDINPUTASSIST_NEXT);		break;
-		case 0x2c9: map_key_clear(KEY_KBDINPUTASSIST_PREVGROUP);		break;
-		case 0x2ca: map_key_clear(KEY_KBDINPUTASSIST_NEXTGROUP);		break;
-		case 0x2cb: map_key_clear(KEY_KBDINPUTASSIST_ACCEPT);	break;
-		case 0x2cc: map_key_clear(KEY_KBDINPUTASSIST_CANCEL);	break;
+		case 0x2c7: key = KEY_KBDINPUTASSIST_PREV;		break;
+		case 0x2c8: key = KEY_KBDINPUTASSIST_NEXT;		break;
+		case 0x2c9: key = KEY_KBDINPUTASSIST_PREVGROUP;		break;
+		case 0x2ca: key = KEY_KBDINPUTASSIST_NEXTGROUP;		break;
+		case 0x2cb: key = KEY_KBDINPUTASSIST_ACCEPT;		break;
+		case 0x2cc: key = KEY_KBDINPUTASSIST_CANCEL;		break;
 
-		case 0x29f: map_key_clear(KEY_SCALE);		break;
+		case 0x29f: key = KEY_SCALE;		break;
 
-		default: map_key_clear(KEY_UNKNOWN);
+		default: key = KEY_UNKNOWN;		break;
 		}
+
+		if (clear)
+			map_key_clear(key);
 		break;
+	}
 
 	case HID_UP_GENDEVCTRLS:
 		switch (usage->hid) {
@@ -1207,34 +1233,42 @@  static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
 		}
 		goto unknown;
 
-	case HID_UP_HPVENDOR:	/* Reported on a Dutch layout HP5308 */
+	case HID_UP_HPVENDOR: {	/* Reported on a Dutch layout HP5308 */
+		int key;
+
 		set_bit(EV_REP, input->evbit);
 		switch (usage->hid & HID_USAGE) {
-		case 0x021: map_key_clear(KEY_PRINT);           break;
-		case 0x070: map_key_clear(KEY_HP);		break;
-		case 0x071: map_key_clear(KEY_CAMERA);		break;
-		case 0x072: map_key_clear(KEY_SOUND);		break;
-		case 0x073: map_key_clear(KEY_QUESTION);	break;
-		case 0x080: map_key_clear(KEY_EMAIL);		break;
-		case 0x081: map_key_clear(KEY_CHAT);		break;
-		case 0x082: map_key_clear(KEY_SEARCH);		break;
-		case 0x083: map_key_clear(KEY_CONNECT);	        break;
-		case 0x084: map_key_clear(KEY_FINANCE);		break;
-		case 0x085: map_key_clear(KEY_SPORT);		break;
-		case 0x086: map_key_clear(KEY_SHOP);	        break;
+		case 0x021: key = KEY_PRINT;		break;
+		case 0x070: key = KEY_HP;		break;
+		case 0x071: key = KEY_CAMERA;		break;
+		case 0x072: key = KEY_SOUND;		break;
+		case 0x073: key = KEY_QUESTION;		break;
+		case 0x080: key = KEY_EMAIL;		break;
+		case 0x081: key = KEY_CHAT;		break;
+		case 0x082: key = KEY_SEARCH;		break;
+		case 0x083: key = KEY_CONNECT;	        break;
+		case 0x084: key = KEY_FINANCE;		break;
+		case 0x085: key = KEY_SPORT;		break;
+		case 0x086: key = KEY_SHOP;	        break;
 		default:    goto ignore;
 		}
+		map_key_clear(key);
 		break;
+	}
+
+	case HID_UP_HPVENDOR2: {
+		int key;
 
-	case HID_UP_HPVENDOR2:
 		set_bit(EV_REP, input->evbit);
 		switch (usage->hid & HID_USAGE) {
-		case 0x001: map_key_clear(KEY_MICMUTE);		break;
-		case 0x003: map_key_clear(KEY_BRIGHTNESSDOWN);	break;
-		case 0x004: map_key_clear(KEY_BRIGHTNESSUP);	break;
+		case 0x001: key = KEY_MICMUTE;		break;
+		case 0x003: key = KEY_BRIGHTNESSDOWN;	break;
+		case 0x004: key = KEY_BRIGHTNESSUP;	break;
 		default:    goto ignore;
 		}
+		map_key_clear(key);
 		break;
+	}
 
 	case HID_UP_MSVENDOR:
 		goto ignore;