Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * drivers/macintosh/adbhid.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * ADB HID driver for Power Macintosh computers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  * Adapted from drivers/macintosh/mac_keyb.c by Franz Sirl.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  * drivers/macintosh/mac_keyb.c was Copyright (C) 1996 Paul Mackerras
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  * with considerable contributions from Ben Herrenschmidt and others.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  * Copyright (C) 2000 Franz Sirl.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)  * Adapted to ADB changes and support for more devices by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)  * Benjamin Herrenschmidt. Adapted from code in MkLinux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15)  * and reworked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16)  * 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17)  * Supported devices:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19)  * - Standard 1 button mouse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20)  * - All standard Apple Extended protocol (handler ID 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21)  * - mouseman and trackman mice & trackballs 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22)  * - PowerBook Trackpad (default setup: enable tapping)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23)  * - MicroSpeed mouse & trackball (needs testing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24)  * - CH Products Trackball Pro (needs testing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25)  * - Contour Design (Contour Mouse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26)  * - Hunter digital (NoHandsMouse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27)  * - Kensignton TurboMouse 5 (needs testing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28)  * - Mouse Systems A3 mice and trackballs <aidan@kublai.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29)  * - MacAlly 2-buttons mouse (needs testing) <pochini@denise.shiny.it>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31)  * To do:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33)  * Improve Kensington support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34)  * Split mouse/kbd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35)  * Move to syfs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #include <linux/notifier.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) #include <linux/adb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) #include <linux/cuda.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #include <linux/pmu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) #include <asm/machdep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) #ifdef CONFIG_PPC_PMAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) #include <asm/backlight.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) #include <asm/pmac_feature.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) MODULE_AUTHOR("Franz Sirl <Franz.Sirl-kernel@lauterbach.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) static int restore_capslock_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) module_param(restore_capslock_events, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) MODULE_PARM_DESC(restore_capslock_events,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	"Produce keypress events for capslock on both keyup and keydown.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) #define KEYB_KEYREG	0	/* register # for key up/down data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) #define KEYB_LEDREG	2	/* register # for leds on ADB keyboard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) #define MOUSE_DATAREG	0	/* reg# for movement/button codes from mouse */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) static int adb_message_handler(struct notifier_block *, unsigned long, void *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) static struct notifier_block adbhid_adb_notifier = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	.notifier_call	= adb_message_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) /* Some special keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) #define ADB_KEY_DEL		0x33
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) #define ADB_KEY_CMD		0x37
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) #define ADB_KEY_CAPSLOCK	0x39
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) #define ADB_KEY_FN		0x3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) #define ADB_KEY_FWDEL		0x75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) #define ADB_KEY_POWER_OLD	0x7e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) #define ADB_KEY_POWER		0x7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) static const u16 adb_to_linux_keycodes[128] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 	/* 0x00 */ KEY_A, 		/*  30 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	/* 0x01 */ KEY_S, 		/*  31 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	/* 0x02 */ KEY_D,		/*  32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 	/* 0x03 */ KEY_F,		/*  33 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	/* 0x04 */ KEY_H,		/*  35 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	/* 0x05 */ KEY_G,		/*  34 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 	/* 0x06 */ KEY_Z,		/*  44 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 	/* 0x07 */ KEY_X,		/*  45 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	/* 0x08 */ KEY_C,		/*  46 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	/* 0x09 */ KEY_V,		/*  47 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 	/* 0x0a */ KEY_102ND,		/*  86 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 	/* 0x0b */ KEY_B,		/*  48 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 	/* 0x0c */ KEY_Q,		/*  16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 	/* 0x0d */ KEY_W,		/*  17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	/* 0x0e */ KEY_E,		/*  18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	/* 0x0f */ KEY_R,		/*  19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	/* 0x10 */ KEY_Y,		/*  21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 	/* 0x11 */ KEY_T,		/*  20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 	/* 0x12 */ KEY_1,		/*   2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 	/* 0x13 */ KEY_2,		/*   3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 	/* 0x14 */ KEY_3,		/*   4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 	/* 0x15 */ KEY_4,		/*   5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 	/* 0x16 */ KEY_6,		/*   7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 	/* 0x17 */ KEY_5,		/*   6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	/* 0x18 */ KEY_EQUAL,		/*  13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 	/* 0x19 */ KEY_9,		/*  10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	/* 0x1a */ KEY_7,		/*   8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	/* 0x1b */ KEY_MINUS,		/*  12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 	/* 0x1c */ KEY_8,		/*   9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 	/* 0x1d */ KEY_0,		/*  11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 	/* 0x1e */ KEY_RIGHTBRACE,	/*  27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 	/* 0x1f */ KEY_O,		/*  24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 	/* 0x20 */ KEY_U,		/*  22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	/* 0x21 */ KEY_LEFTBRACE,	/*  26 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 	/* 0x22 */ KEY_I,		/*  23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 	/* 0x23 */ KEY_P,		/*  25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 	/* 0x24 */ KEY_ENTER,		/*  28 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	/* 0x25 */ KEY_L,		/*  38 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 	/* 0x26 */ KEY_J,		/*  36 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	/* 0x27 */ KEY_APOSTROPHE,	/*  40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 	/* 0x28 */ KEY_K,		/*  37 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 	/* 0x29 */ KEY_SEMICOLON,	/*  39 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 	/* 0x2a */ KEY_BACKSLASH,	/*  43 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 	/* 0x2b */ KEY_COMMA,		/*  51 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	/* 0x2c */ KEY_SLASH,		/*  53 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	/* 0x2d */ KEY_N,		/*  49 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 	/* 0x2e */ KEY_M,		/*  50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	/* 0x2f */ KEY_DOT,		/*  52 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	/* 0x30 */ KEY_TAB,		/*  15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 	/* 0x31 */ KEY_SPACE,		/*  57 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	/* 0x32 */ KEY_GRAVE,		/*  41 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	/* 0x33 */ KEY_BACKSPACE,	/*  14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	/* 0x34 */ KEY_KPENTER,		/*  96 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	/* 0x35 */ KEY_ESC,		/*   1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	/* 0x36 */ KEY_LEFTCTRL,	/*  29 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	/* 0x37 */ KEY_LEFTMETA,	/* 125 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	/* 0x38 */ KEY_LEFTSHIFT,	/*  42 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 	/* 0x39 */ KEY_CAPSLOCK,	/*  58 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 	/* 0x3a */ KEY_LEFTALT,		/*  56 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 	/* 0x3b */ KEY_LEFT,		/* 105 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 	/* 0x3c */ KEY_RIGHT,		/* 106 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 	/* 0x3d */ KEY_DOWN,		/* 108 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	/* 0x3e */ KEY_UP,		/* 103 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 	/* 0x3f */ KEY_FN,		/* 0x1d0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 	/* 0x40 */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	/* 0x41 */ KEY_KPDOT,		/*  83 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 	/* 0x42 */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 	/* 0x43 */ KEY_KPASTERISK,	/*  55 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	/* 0x44 */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	/* 0x45 */ KEY_KPPLUS,		/*  78 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	/* 0x46 */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 	/* 0x47 */ KEY_NUMLOCK,		/*  69 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	/* 0x48 */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 	/* 0x49 */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	/* 0x4a */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	/* 0x4b */ KEY_KPSLASH,		/*  98 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	/* 0x4c */ KEY_KPENTER,		/*  96 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	/* 0x4d */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	/* 0x4e */ KEY_KPMINUS,		/*  74 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	/* 0x4f */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	/* 0x50 */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 	/* 0x51 */ KEY_KPEQUAL,		/* 117 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	/* 0x52 */ KEY_KP0,		/*  82 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	/* 0x53 */ KEY_KP1,		/*  79 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	/* 0x54 */ KEY_KP2,		/*  80 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	/* 0x55 */ KEY_KP3,		/*  81 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	/* 0x56 */ KEY_KP4,		/*  75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 	/* 0x57 */ KEY_KP5,		/*  76 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	/* 0x58 */ KEY_KP6,		/*  77 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 	/* 0x59 */ KEY_KP7,		/*  71 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 	/* 0x5a */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	/* 0x5b */ KEY_KP8,		/*  72 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	/* 0x5c */ KEY_KP9,		/*  73 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	/* 0x5d */ KEY_YEN,		/* 124 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	/* 0x5e */ KEY_RO,		/*  89 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	/* 0x5f */ KEY_KPCOMMA,		/* 121 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 	/* 0x60 */ KEY_F5,		/*  63 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	/* 0x61 */ KEY_F6,		/*  64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	/* 0x62 */ KEY_F7,		/*  65 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	/* 0x63 */ KEY_F3,		/*  61 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 	/* 0x64 */ KEY_F8,		/*  66 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	/* 0x65 */ KEY_F9,		/*  67 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 	/* 0x66 */ KEY_HANJA,		/* 123 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	/* 0x67 */ KEY_F11,		/*  87 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	/* 0x68 */ KEY_HANGEUL,		/* 122 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	/* 0x69 */ KEY_SYSRQ,		/*  99 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	/* 0x6a */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	/* 0x6b */ KEY_SCROLLLOCK,	/*  70 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 	/* 0x6c */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	/* 0x6d */ KEY_F10,		/*  68 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	/* 0x6e */ KEY_COMPOSE,		/* 127 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 	/* 0x6f */ KEY_F12,		/*  88 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	/* 0x70 */ 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	/* 0x71 */ KEY_PAUSE,		/* 119 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	/* 0x72 */ KEY_INSERT,		/* 110 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	/* 0x73 */ KEY_HOME,		/* 102 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 	/* 0x74 */ KEY_PAGEUP,		/* 104 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 	/* 0x75 */ KEY_DELETE,		/* 111 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	/* 0x76 */ KEY_F4,		/*  62 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	/* 0x77 */ KEY_END,		/* 107 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	/* 0x78 */ KEY_F2,		/*  60 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	/* 0x79 */ KEY_PAGEDOWN,	/* 109 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	/* 0x7a */ KEY_F1,		/*  59 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	/* 0x7b */ KEY_RIGHTSHIFT,	/*  54 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	/* 0x7c */ KEY_RIGHTALT,	/* 100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	/* 0x7d */ KEY_RIGHTCTRL,	/*  97 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	/* 0x7e */ KEY_RIGHTMETA,	/* 126 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	/* 0x7f */ KEY_POWER,		/* 116 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) struct adbhid {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 	struct input_dev *input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 	int id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 	int default_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	int original_handler_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	int current_handler_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 	int mouse_kind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 	u16 *keycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 	char name[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 	char phys[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) #define FLAG_FN_KEY_PRESSED		0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) #define FLAG_POWER_FROM_FN		0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) #define FLAG_EMU_FWDEL_DOWN		0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) #define FLAG_CAPSLOCK_TRANSLATE		0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) #define FLAG_CAPSLOCK_DOWN		0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) #define FLAG_CAPSLOCK_IGNORE_NEXT	0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) #define FLAG_POWER_KEY_PRESSED		0x00000040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) static struct adbhid *adbhid[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) static void adbhid_probe(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) static void adbhid_input_keycode(int, int, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) static void init_trackpad(int id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) static void init_trackball(int id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) static void init_turbomouse(int id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) static void init_microspeed(int id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) static void init_ms_a3(int id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) static struct adb_ids keyboard_ids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) static struct adb_ids mouse_ids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) static struct adb_ids buttons_ids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) /* Kind of keyboard, see Apple technote 1152  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) #define ADB_KEYBOARD_UNKNOWN	0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) #define ADB_KEYBOARD_ANSI	0x0100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) #define ADB_KEYBOARD_ISO	0x0200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) #define ADB_KEYBOARD_JIS	0x0300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) /* Kind of mouse  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) #define ADBMOUSE_STANDARD_100	0	/* Standard 100cpi mouse (handler 1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) #define ADBMOUSE_STANDARD_200	1	/* Standard 200cpi mouse (handler 2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) #define ADBMOUSE_EXTENDED	2	/* Apple Extended mouse (handler 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) #define ADBMOUSE_TRACKBALL	3	/* TrackBall (handler 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) #define ADBMOUSE_TRACKPAD       4	/* Apple's PowerBook trackpad (handler 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) #define ADBMOUSE_TURBOMOUSE5    5	/* Turbomouse 5 (previously req. mousehack) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) #define ADBMOUSE_MICROSPEED	6	/* Microspeed mouse (&trackball ?), MacPoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) #define ADBMOUSE_TRACKBALLPRO	7	/* Trackball Pro (special buttons) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) #define ADBMOUSE_MS_A3		8	/* Mouse systems A3 trackball (handler 3) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) #define ADBMOUSE_MACALLY2	9	/* MacAlly 2-button mouse */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) adbhid_keyboard_input(unsigned char *data, int nb, int apoll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	int id = (data[0] >> 4) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 	if (!adbhid[id]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 		pr_err("ADB HID on ID %d not yet registered, packet %#02x, %#02x, %#02x, %#02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 		       id, data[0], data[1], data[2], data[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	/* first check this is from register 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 	if (nb != 3 || (data[0] & 3) != KEYB_KEYREG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 		return;		/* ignore it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	adbhid_input_keycode(id, data[1], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	if (!(data[2] == 0xff || (data[2] == 0x7f && data[1] == 0x7f)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 		adbhid_input_keycode(id, data[2], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) adbhid_input_keycode(int id, int scancode, int repeat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	struct adbhid *ahid = adbhid[id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	int keycode, up_flag, key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	keycode = scancode & 0x7f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	up_flag = scancode & 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	if (restore_capslock_events) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 		if (keycode == ADB_KEY_CAPSLOCK && !up_flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 			/* Key pressed, turning on the CapsLock LED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 			 * The next 0xff will be interpreted as a release. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 			if (ahid->flags & FLAG_CAPSLOCK_IGNORE_NEXT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 				/* Throw away this key event if it happens
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 				 * just after resume. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 				ahid->flags &= ~FLAG_CAPSLOCK_IGNORE_NEXT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 				return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 				ahid->flags |= FLAG_CAPSLOCK_TRANSLATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 					| FLAG_CAPSLOCK_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 		} else if (scancode == 0xff &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 			   !(ahid->flags & FLAG_POWER_KEY_PRESSED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 			/* Scancode 0xff usually signifies that the capslock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 			 * key was either pressed or released, or that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 			 * power button was released. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 			if (ahid->flags & FLAG_CAPSLOCK_TRANSLATE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 				keycode = ADB_KEY_CAPSLOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 				if (ahid->flags & FLAG_CAPSLOCK_DOWN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 					/* Key released */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 					up_flag = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 					ahid->flags &= ~FLAG_CAPSLOCK_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 				} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 					/* Key pressed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 					up_flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 					ahid->flags &= ~FLAG_CAPSLOCK_TRANSLATE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 				pr_info("Spurious caps lock event (scancode 0xff).\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	switch (keycode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	case ADB_KEY_CAPSLOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 		if (!restore_capslock_events) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 			/* Generate down/up events for CapsLock every time. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 			input_report_key(ahid->input, KEY_CAPSLOCK, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 			input_sync(ahid->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 			input_report_key(ahid->input, KEY_CAPSLOCK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 			input_sync(ahid->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) #ifdef CONFIG_PPC_PMAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	case ADB_KEY_POWER_OLD: /* Power key on PBook 3400 needs remapping */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 		switch(pmac_call_feature(PMAC_FTR_GET_MB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 			NULL, PMAC_MB_INFO_MODEL, 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 		case PMAC_TYPE_COMET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 		case PMAC_TYPE_HOOPER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 		case PMAC_TYPE_KANGA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 			keycode = ADB_KEY_POWER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	case ADB_KEY_POWER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 		/* Keep track of the power key state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 		if (up_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 			ahid->flags &= ~FLAG_POWER_KEY_PRESSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 			ahid->flags |= FLAG_POWER_KEY_PRESSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 		/* Fn + Command will produce a bogus "power" keycode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 		if (ahid->flags & FLAG_FN_KEY_PRESSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 			keycode = ADB_KEY_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 			if (up_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 				ahid->flags &= ~FLAG_POWER_FROM_FN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 				ahid->flags |= FLAG_POWER_FROM_FN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 		} else if (ahid->flags & FLAG_POWER_FROM_FN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 			keycode = ADB_KEY_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 			ahid->flags &= ~FLAG_POWER_FROM_FN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 	case ADB_KEY_FN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 		/* Keep track of the Fn key state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 		if (up_flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 			ahid->flags &= ~FLAG_FN_KEY_PRESSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 			/* Emulate Fn+delete = forward delete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 			if (ahid->flags & FLAG_EMU_FWDEL_DOWN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 				ahid->flags &= ~FLAG_EMU_FWDEL_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 				keycode = ADB_KEY_FWDEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 			ahid->flags |= FLAG_FN_KEY_PRESSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 	case ADB_KEY_DEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 		/* Emulate Fn+delete = forward delete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 		if (ahid->flags & FLAG_FN_KEY_PRESSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 			keycode = ADB_KEY_FWDEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 			if (up_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 				ahid->flags &= ~FLAG_EMU_FWDEL_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 				ahid->flags |= FLAG_EMU_FWDEL_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) #endif /* CONFIG_PPC_PMAC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 	key = adbhid[id]->keycode[keycode];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	if (key) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 		input_report_key(adbhid[id]->input, key, !up_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 		input_sync(adbhid[id]->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 		pr_info("Unhandled ADB key (scancode %#02x) %s.\n", keycode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 			up_flag ? "released" : "pressed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) adbhid_mouse_input(unsigned char *data, int nb, int autopoll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	int id = (data[0] >> 4) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 	if (!adbhid[id]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 		pr_err("ADB HID on ID %d not yet registered\n", id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414)   /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415)     Handler 1 -- 100cpi original Apple mouse protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416)     Handler 2 -- 200cpi original Apple mouse protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418)     For Apple's standard one-button mouse protocol the data array will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419)     contain the following values:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421)                 BITS    COMMENTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422)     data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423)     data[1] = bxxx xxxx First button and x-axis motion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424)     data[2] = byyy yyyy Second button and y-axis motion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426)     Handler 4 -- Apple Extended mouse protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428)     For Apple's 3-button mouse protocol the data array will contain the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429)     following values:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 		BITS    COMMENTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432)     data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433)     data[1] = bxxx xxxx Left button and x-axis motion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434)     data[2] = byyy yyyy Second button and y-axis motion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435)     data[3] = byyy bxxx Third button and fourth button.  Y is additional
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	      high bits of y-axis motion.  XY is additional
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 	      high bits of x-axis motion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439)     MacAlly 2-button mouse protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441)     For MacAlly 2-button mouse protocol the data array will contain the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442)     following values:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 		BITS    COMMENTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445)     data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446)     data[1] = bxxx xxxx Left button and x-axis motion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447)     data[2] = byyy yyyy Right button and y-axis motion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448)     data[3] = ???? ???? unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449)     data[4] = ???? ???? unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451)   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	/* If it's a trackpad, we alias the second button to the first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	   NOTE: Apple sends an ADB flush command to the trackpad when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	         the first (the real) button is released. We could do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 		 this here using async flush requests.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	switch (adbhid[id]->mouse_kind)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	    case ADBMOUSE_TRACKPAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 		data[1] = (data[1] & 0x7f) | ((data[1] & data[2]) & 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 		data[2] = data[2] | 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	    case ADBMOUSE_MICROSPEED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 		data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 		data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 		data[3] = (data[3] & 0x77) | ((data[3] & 0x04) << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 			| (data[3] & 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 	    case ADBMOUSE_TRACKBALLPRO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 		data[1] = (data[1] & 0x7f) | (((data[3] & 0x04) << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 			& ((data[3] & 0x08) << 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 		data[2] = (data[2] & 0x7f) | ((data[3] & 0x01) << 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 		data[3] = (data[3] & 0x77) | ((data[3] & 0x02) << 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	    case ADBMOUSE_MS_A3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 		data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 		data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 		data[3] = ((data[3] & 0x04) << 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481)             case ADBMOUSE_MACALLY2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 		data[3] = (data[2] & 0x80) ? 0x80 : 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 		data[2] |= 0x80;  /* Right button is mapped as button 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 		nb=4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485)                 break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	input_report_key(adbhid[id]->input, BTN_LEFT,   !((data[1] >> 7) & 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 		input_report_key(adbhid[id]->input, BTN_RIGHT,  !((data[3] >> 7) & 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	input_report_rel(adbhid[id]->input, REL_X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 			 ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	input_report_rel(adbhid[id]->input, REL_Y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 			 ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	input_sync(adbhid[id]->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) adbhid_buttons_input(unsigned char *data, int nb, int autopoll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 	int id = (data[0] >> 4) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	if (!adbhid[id]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 		pr_err("ADB HID on ID %d not yet registered\n", id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 	switch (adbhid[id]->original_handler_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	case 0x02: /* Adjustable keyboard button device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	  {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 		int down = (data[1] == (data[1] & 0xf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 		switch (data[1] & 0x0f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 		case 0x0:	/* microphone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 			input_report_key(adbhid[id]->input, KEY_SOUND, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 		case 0x1:	/* mute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 			input_report_key(adbhid[id]->input, KEY_MUTE, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 		case 0x2:	/* volume decrease */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 			input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 		case 0x3:	/* volume increase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 			input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 			pr_info("Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 				data[0], data[1], data[2], data[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	  }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	  break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	case 0x1f: /* Powerbook button device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 	  {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 		int down = (data[1] == (data[1] & 0xf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 		 * XXX: Where is the contrast control for the passive?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 		 *  -- Cort
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 		switch (data[1] & 0x0f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 		case 0x8:	/* mute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 			input_report_key(adbhid[id]->input, KEY_MUTE, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 		case 0x7:	/* volume decrease */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 			input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 		case 0x6:	/* volume increase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 			input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 		case 0xb:	/* eject */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 			input_report_key(adbhid[id]->input, KEY_EJECTCD, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 		case 0xa:	/* brightness decrease */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) #ifdef CONFIG_PMAC_BACKLIGHT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 			if (down)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 				pmac_backlight_key_down();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 			input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		case 0x9:	/* brightness increase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) #ifdef CONFIG_PMAC_BACKLIGHT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 			if (down)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 				pmac_backlight_key_up();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 			input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 		case 0xc:	/* videomode switch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 			input_report_key(adbhid[id]->input, KEY_SWITCHVIDEOMODE, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 		case 0xd:	/* keyboard illumination toggle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 			input_report_key(adbhid[id]->input, KEY_KBDILLUMTOGGLE, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 		case 0xe:	/* keyboard illumination decrease */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 			input_report_key(adbhid[id]->input, KEY_KBDILLUMDOWN, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 		case 0xf:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 			switch (data[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 			case 0x8f:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 			case 0x0f:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 				/* keyboard illumination increase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 				input_report_key(adbhid[id]->input, KEY_KBDILLUMUP, down);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 			case 0x7f:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 			case 0xff:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 				/* keypad overlay toogle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 				pr_info("Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 					data[0], data[1], data[2], data[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 			pr_info("Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 				data[0], data[1], data[2], data[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	  }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 	  break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	input_sync(adbhid[id]->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) static struct adb_request led_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) static int leds_pending[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) static int leds_req_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) static int pending_devs[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) static int pending_led_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) static int pending_led_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) static DEFINE_SPINLOCK(leds_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) static void leds_done(struct adb_request *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	int leds = 0, device = 0, pending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	spin_lock_irqsave(&leds_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	if (pending_led_start != pending_led_end) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 		device = pending_devs[pending_led_start];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 		leds = leds_pending[device] & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 		leds_pending[device] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 		pending_led_start++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 		pending_led_start = (pending_led_start < 16) ? pending_led_start : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 		pending = leds_req_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 		leds_req_pending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	spin_unlock_irqrestore(&leds_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	if (pending)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 		adb_request(&led_request, leds_done, 0, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 			    ADB_WRITEREG(device, KEYB_LEDREG), 0xff, ~leds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) static void real_leds(unsigned char leds, int device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 	spin_lock_irqsave(&leds_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	if (!leds_req_pending) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 		leds_req_pending = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 		spin_unlock_irqrestore(&leds_lock, flags);	       
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		adb_request(&led_request, leds_done, 0, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 			    ADB_WRITEREG(device, KEYB_LEDREG), 0xff, ~leds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 		if (!(leds_pending[device] & 0x100)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 			pending_devs[pending_led_end] = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 			pending_led_end++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 			pending_led_end = (pending_led_end < 16) ? pending_led_end : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 		leds_pending[device] = leds | 0x100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	spin_unlock_irqrestore(&leds_lock, flags);	       
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681)  * Event callback from the input module. Events that change the state of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682)  * the hardware are processed here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	struct adbhid *adbhid = input_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	unsigned char leds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 	case EV_LED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 		leds =  (test_bit(LED_SCROLLL, dev->led) ? 4 : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 			(test_bit(LED_NUML,    dev->led) ? 1 : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 			(test_bit(LED_CAPSL,   dev->led) ? 2 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 		real_leds(leds, adbhid->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) adbhid_kbd_capslock_remember(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	struct adbhid *ahid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	for (i = 1; i < 16; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 		ahid = adbhid[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 		if (ahid && ahid->id == ADB_KEYBOARD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 			if (ahid->flags & FLAG_CAPSLOCK_TRANSLATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 				ahid->flags |= FLAG_CAPSLOCK_IGNORE_NEXT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) adb_message_handler(struct notifier_block *this, unsigned long code, void *x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	switch (code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 	case ADB_MSG_PRE_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	case ADB_MSG_POWERDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 		/* Stop the repeat timer. Autopoll is already off at this point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 			int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 			for (i = 1; i < 16; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 				if (adbhid[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 					del_timer_sync(&adbhid[i]->input->timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 		/* Stop pending led requests */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 		while (leds_req_pending)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 			adb_poll();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 		/* After resume, and if the capslock LED is on, the PMU will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 		 * send a "capslock down" key event. This confuses the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 		 * restore_capslock_events logic. Remember if the capslock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 		 * LED was on before suspend so the unwanted key event can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 		 * be ignored after resume. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 		if (restore_capslock_events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 			adbhid_kbd_capslock_remember();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	case ADB_MSG_POST_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 		adbhid_probe();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) adbhid_input_register(int id, int default_id, int original_handler_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 		      int current_handler_id, int mouse_kind)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 	struct adbhid *hid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 	struct input_dev *input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 	char *keyboard_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	if (adbhid[id]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 		pr_err("Trying to reregister ADB HID on ID %d\n", id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 		return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 	adbhid[id] = hid = kzalloc(sizeof(struct adbhid), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 	input_dev = input_allocate_device();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 	if (!hid || !input_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 		err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	sprintf(hid->phys, "adb%d:%d.%02x/input", id, default_id, original_handler_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 	hid->input = input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 	hid->id = default_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 	hid->original_handler_id = original_handler_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	hid->current_handler_id = current_handler_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	hid->mouse_kind = mouse_kind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 	hid->flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 	input_set_drvdata(input_dev, hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	input_dev->name = hid->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 	input_dev->phys = hid->phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 	input_dev->id.bustype = BUS_ADB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 	input_dev->id.vendor = 0x0001;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 	input_dev->id.product = (id << 12) | (default_id << 8) | original_handler_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 	input_dev->id.version = 0x0100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 	switch (default_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 	case ADB_KEYBOARD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 		hid->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 		if (!hid->keycode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 			err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 			goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 		sprintf(hid->name, "ADB keyboard");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 		memcpy(hid->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 		switch (original_handler_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 			keyboard_type = "<unknown>";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 			input_dev->id.version = ADB_KEYBOARD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 		case 0x01: case 0x02: case 0x03: case 0x06: case 0x08:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 		case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 		case 0xC0: case 0xC3: case 0xC6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 			keyboard_type = "ANSI";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 			input_dev->id.version = ADB_KEYBOARD_ANSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 		case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 		case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 		case 0xC4: case 0xC7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 			keyboard_type = "ISO, swapping keys";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 			input_dev->id.version = ADB_KEYBOARD_ISO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 			i = hid->keycode[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 			hid->keycode[10] = hid->keycode[50];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 			hid->keycode[50] = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 		case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 		case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 			keyboard_type = "JIS";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 			input_dev->id.version = ADB_KEYBOARD_JIS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		pr_info("Detected ADB keyboard, type %s.\n", keyboard_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 		for (i = 0; i < 128; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 			if (hid->keycode[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 				set_bit(hid->keycode[i], input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 		input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_LED) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 			BIT_MASK(EV_REP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 		input_dev->ledbit[0] = BIT_MASK(LED_SCROLLL) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 			BIT_MASK(LED_CAPSL) | BIT_MASK(LED_NUML);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 		input_dev->event = adbhid_kbd_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 		input_dev->keycodemax = KEY_FN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 		input_dev->keycodesize = sizeof(hid->keycode[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 	case ADB_MOUSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 		sprintf(hid->name, "ADB mouse");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 		input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 		input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 			BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 		input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 	case ADB_MISC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 		switch (original_handler_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 		case 0x02: /* Adjustable keyboard button device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 			sprintf(hid->name, "ADB adjustable keyboard buttons");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 			input_dev->evbit[0] = BIT_MASK(EV_KEY) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 				BIT_MASK(EV_REP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 			set_bit(KEY_SOUND, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 			set_bit(KEY_MUTE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 			set_bit(KEY_VOLUMEUP, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 			set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 		case 0x1f: /* Powerbook button device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 			sprintf(hid->name, "ADB Powerbook buttons");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 			input_dev->evbit[0] = BIT_MASK(EV_KEY) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 				BIT_MASK(EV_REP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 			set_bit(KEY_MUTE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 			set_bit(KEY_VOLUMEUP, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 			set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 			set_bit(KEY_BRIGHTNESSUP, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 			set_bit(KEY_BRIGHTNESSDOWN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 			set_bit(KEY_EJECTCD, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 			set_bit(KEY_SWITCHVIDEOMODE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 			set_bit(KEY_KBDILLUMTOGGLE, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 			set_bit(KEY_KBDILLUMDOWN, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 			set_bit(KEY_KBDILLUMUP, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 		if (hid->name[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 		pr_info("Trying to register unknown ADB device to input layer.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 		err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	input_dev->keycode = hid->keycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	err = input_register_device(input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	if (default_id == ADB_KEYBOARD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 		/* HACK WARNING!! This should go away as soon there is an utility
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 		 * to control that for event devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 		input_dev->rep[REP_DELAY] = 500;   /* input layer default: 250 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 		input_dev->rep[REP_PERIOD] = 66; /* input layer default: 33 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908)  fail:	input_free_device(input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 	if (hid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 		kfree(hid->keycode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 		kfree(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 	adbhid[id] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) static void adbhid_input_unregister(int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 	input_unregister_device(adbhid[id]->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 	kfree(adbhid[id]->keycode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 	kfree(adbhid[id]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 	adbhid[id] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) static u16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) adbhid_input_reregister(int id, int default_id, int org_handler_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 			int cur_handler_id, int mk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	if (adbhid[id]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 		if (adbhid[id]->input->id.product !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 		    ((id << 12)|(default_id << 8)|org_handler_id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 			adbhid_input_unregister(id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 			adbhid_input_register(id, default_id, org_handler_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 					      cur_handler_id, mk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 		adbhid_input_register(id, default_id, org_handler_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 				      cur_handler_id, mk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 	return 1<<id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) adbhid_input_devcleanup(u16 exist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	for(i=1; i<16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 		if (adbhid[i] && !(exist&(1<<i)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 			adbhid_input_unregister(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) adbhid_probe(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 	struct adb_request req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 	int i, default_id, org_handler_id, cur_handler_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	u16 reg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 	adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	for (i = 0; i < keyboard_ids.nids; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 		int id = keyboard_ids.id[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 		adb_get_infos(id, &default_id, &org_handler_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 		/* turn off all leds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 		adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 			    ADB_WRITEREG(id, KEYB_LEDREG), 0xff, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 		/* Enable full feature set of the keyboard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 		   ->get it to send separate codes for left and right shift,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 		   control, option keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) #if 0		/* handler 5 doesn't send separate codes for R modifiers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 		if (!adb_try_handler_change(id, 5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 		adb_try_handler_change(id, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 		adb_get_infos(id, &default_id, &cur_handler_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 		printk(KERN_DEBUG "ADB keyboard at %d has handler 0x%X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 		       id, cur_handler_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 		reg |= adbhid_input_reregister(id, default_id, org_handler_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 					       cur_handler_id, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	for (i = 0; i < buttons_ids.nids; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 		int id = buttons_ids.id[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 		adb_get_infos(id, &default_id, &org_handler_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 		reg |= adbhid_input_reregister(id, default_id, org_handler_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 					       org_handler_id, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	/* Try to switch all mice to handler 4, or 2 for three-button
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 	   mode and full resolution. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 	for (i = 0; i < mouse_ids.nids; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 		int id = mouse_ids.id[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 		int mouse_kind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 		char *desc = "standard";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 		adb_get_infos(id, &default_id, &org_handler_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 		if (adb_try_handler_change(id, 4)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 			mouse_kind = ADBMOUSE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 		else if (adb_try_handler_change(id, 0x2F)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 			mouse_kind = ADBMOUSE_MICROSPEED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 		else if (adb_try_handler_change(id, 0x42)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 			mouse_kind = ADBMOUSE_TRACKBALLPRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 		else if (adb_try_handler_change(id, 0x66)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 			mouse_kind = ADBMOUSE_MICROSPEED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 		else if (adb_try_handler_change(id, 0x5F)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 			mouse_kind = ADBMOUSE_MICROSPEED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 		else if (adb_try_handler_change(id, 3)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 			mouse_kind = ADBMOUSE_MS_A3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 		else if (adb_try_handler_change(id, 2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 			mouse_kind = ADBMOUSE_STANDARD_200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 			mouse_kind = ADBMOUSE_STANDARD_100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 		if ((mouse_kind == ADBMOUSE_TRACKBALLPRO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 		    || (mouse_kind == ADBMOUSE_MICROSPEED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 			desc = "Microspeed/MacPoint or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 			init_microspeed(id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 		} else if (mouse_kind == ADBMOUSE_MS_A3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 			desc = "Mouse Systems A3 Mouse or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 			init_ms_a3(id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 		} else if (mouse_kind ==  ADBMOUSE_EXTENDED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 			desc = "extended";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 			 * Register 1 is usually used for device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 			 * identification.  Here, we try to identify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 			 * a known device and call the appropriate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 			 * init function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 			adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 				    ADB_READREG(id, 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 			if ((req.reply_len) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 			    (req.reply[1] == 0x9a) && ((req.reply[2] == 0x21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 			    	|| (req.reply[2] == 0x20))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 				mouse_kind = ADBMOUSE_TRACKBALL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 				desc = "trackman/mouseman";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 				init_trackball(id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 			else if ((req.reply_len >= 4) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 			    (req.reply[1] == 0x74) && (req.reply[2] == 0x70) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 			    (req.reply[3] == 0x61) && (req.reply[4] == 0x64)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 				mouse_kind = ADBMOUSE_TRACKPAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 				desc = "trackpad";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 				init_trackpad(id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 			else if ((req.reply_len >= 4) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 			    (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 			    (req.reply[3] == 0x4c) && (req.reply[4] == 0x31)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 				mouse_kind = ADBMOUSE_TURBOMOUSE5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 				desc = "TurboMouse 5";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 				init_turbomouse(id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 			else if ((req.reply_len == 9) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 			    (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 			    (req.reply[3] == 0x49) && (req.reply[4] == 0x54)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 				if (adb_try_handler_change(id, 0x42)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 					mouse_kind = ADBMOUSE_MACALLY2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 					desc = "MacAlly 2-button";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 		adb_get_infos(id, &default_id, &cur_handler_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 		printk(KERN_DEBUG "ADB mouse (%s) at %d has handler 0x%X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 		       desc, id, cur_handler_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 		reg |= adbhid_input_reregister(id, default_id, org_handler_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 					       cur_handler_id, mouse_kind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	adbhid_input_devcleanup(reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) static void 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) init_trackpad(int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	struct adb_request req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	unsigned char r1_buffer[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 	adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 		    ADB_READREG(id,1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 	if (req.reply_len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 		pr_err("%s: bad length for reg. 1\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 	    memcpy(r1_buffer, &req.reply[1], 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	    adb_request(&req, NULL, ADBREQ_SYNC, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	        ADB_WRITEREG(id,1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	            r1_buffer[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	            r1_buffer[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	            r1_buffer[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	            r1_buffer[3],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	            r1_buffer[4],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	            r1_buffer[5],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	            0x0d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	            r1_buffer[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112)             adb_request(&req, NULL, ADBREQ_SYNC, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 	        ADB_WRITEREG(id,2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 	    	    0x99,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	    	    0x94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	    	    0x19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	    	    0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 	    	    0xb2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	    	    0x8a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 	    	    0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 	    	    0x50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 	    adb_request(&req, NULL, ADBREQ_SYNC, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	        ADB_WRITEREG(id,1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	            r1_buffer[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 	            r1_buffer[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 	            r1_buffer[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 	            r1_buffer[3],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 	            r1_buffer[4],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 	            r1_buffer[5],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	            0x03, /*r1_buffer[6],*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	            r1_buffer[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	    /* Without this flush, the trackpad may be locked up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	    adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) static void 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) init_trackball(int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	struct adb_request req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	ADB_WRITEREG(id,1), 00,0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 	ADB_WRITEREG(id,1), 01,0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 	ADB_WRITEREG(id,1), 02,0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 	ADB_WRITEREG(id,1), 03,0x38);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 	ADB_WRITEREG(id,1), 00,0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	ADB_WRITEREG(id,1), 01,0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	ADB_WRITEREG(id,1), 02,0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	ADB_WRITEREG(id,1), 03,0x38);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) init_turbomouse(int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 	struct adb_request req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 	adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 	adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	adb_request(&req, NULL, ADBREQ_SYNC, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	ADB_WRITEREG(3,2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	    0xe7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 	    0x8c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	    0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 	    0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	    0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	    0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 	    0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 	    0x94);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 	adb_request(&req, NULL, ADBREQ_SYNC, 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 	ADB_WRITEREG(3,2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 	    0xa5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 	    0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 	    0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 	    0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 	    0x69,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 	    0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 	    0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	    0x27);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) init_microspeed(int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	struct adb_request req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 	/* This will initialize mice using the Microspeed, MacPoint and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 	   other compatible firmware. Bit 12 enables extended protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 	   
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	   Register 1 Listen (4 Bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)             0 -  3     Button is mouse (set also for double clicking!!!)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)             4 -  7     Button is locking (affects change speed also)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)             8 - 11     Button changes speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)            12          1 = Extended mouse mode, 0 = normal mouse mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)            13 - 15     unused 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)            16 - 23     normal speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220)            24 - 31     changed speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)        Register 1 talk holds version and product identification information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)        Register 1 Talk (4 Bytes):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)             0 -  7     Product code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)             8 - 23     undefined, reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)            24 - 31     Version number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)         
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)        Speed 0 is max. 1 to 255 set speed in increments of 1/256 of max.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 	adb_request(&req, NULL, ADBREQ_SYNC, 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 	ADB_WRITEREG(id,1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 	    0x20,	/* alt speed = 0x20 (rather slow) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 	    0x00,	/* norm speed = 0x00 (fastest) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	    0x10,	/* extended protocol, no speed change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	    0x07);	/* all buttons enabled as mouse buttons, no locking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 	adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) init_ms_a3(int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	struct adb_request req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	adb_request(&req, NULL, ADBREQ_SYNC, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	ADB_WRITEREG(id, 0x2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	    0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	    0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)  	adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) static int __init adbhid_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) #ifndef CONFIG_MAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 	if (!machine_is(chrp) && !machine_is(powermac))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	led_request.complete = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	adbhid_probe();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	blocking_notifier_chain_register(&adb_client_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 			&adbhid_adb_notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) static void __exit adbhid_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) module_init(adbhid_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) module_exit(adbhid_exit);