psmouse-base.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  1. /*
  2. * PS/2 mouse driver
  3. *
  4. * Copyright (c) 1999-2002 Vojtech Pavlik
  5. * Copyright (c) 2003-2004 Dmitry Torokhov
  6. */
  7. /*
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License version 2 as published by
  10. * the Free Software Foundation.
  11. */
  12. #include <linux/delay.h>
  13. #include <linux/module.h>
  14. #include <linux/moduleparam.h>
  15. #include <linux/slab.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/input.h>
  18. #include <linux/serio.h>
  19. #include <linux/init.h>
  20. #include <linux/libps2.h>
  21. #include "psmouse.h"
  22. #include "synaptics.h"
  23. #include "logips2pp.h"
  24. #include "alps.h"
  25. #define DRIVER_DESC "PS/2 mouse driver"
  26. MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
  27. MODULE_DESCRIPTION(DRIVER_DESC);
  28. MODULE_LICENSE("GPL");
  29. static unsigned int psmouse_max_proto = -1U;
  30. static int psmouse_set_maxproto(const char *val, struct kernel_param *kp);
  31. static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp);
  32. static char *psmouse_proto_abbrev[] = { NULL, "bare", NULL, NULL, NULL, "imps", "exps", NULL, NULL, NULL };
  33. #define param_check_proto_abbrev(name, p) __param_check(name, p, unsigned int)
  34. #define param_set_proto_abbrev psmouse_set_maxproto
  35. #define param_get_proto_abbrev psmouse_get_maxproto
  36. module_param_named(proto, psmouse_max_proto, proto_abbrev, 0644);
  37. MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps, any). Useful for KVM switches.");
  38. static unsigned int psmouse_resolution = 200;
  39. module_param_named(resolution, psmouse_resolution, uint, 0644);
  40. MODULE_PARM_DESC(resolution, "Resolution, in dpi.");
  41. static unsigned int psmouse_rate = 100;
  42. module_param_named(rate, psmouse_rate, uint, 0644);
  43. MODULE_PARM_DESC(rate, "Report rate, in reports per second.");
  44. static unsigned int psmouse_smartscroll = 1;
  45. module_param_named(smartscroll, psmouse_smartscroll, bool, 0644);
  46. MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
  47. static unsigned int psmouse_resetafter;
  48. module_param_named(resetafter, psmouse_resetafter, uint, 0644);
  49. MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");
  50. PSMOUSE_DEFINE_ATTR(rate);
  51. PSMOUSE_DEFINE_ATTR(resolution);
  52. PSMOUSE_DEFINE_ATTR(resetafter);
  53. __obsolete_setup("psmouse_noext");
  54. __obsolete_setup("psmouse_resolution=");
  55. __obsolete_setup("psmouse_smartscroll=");
  56. __obsolete_setup("psmouse_resetafter=");
  57. __obsolete_setup("psmouse_rate=");
  58. static char *psmouse_protocols[] = { "None", "PS/2", "PS2++", "ThinkPS/2", "GenPS/2", "ImPS/2", "ImExPS/2", "SynPS/2", "AlpsPS/2" };
  59. /*
  60. * psmouse_process_byte() analyzes the PS/2 data stream and reports
  61. * relevant events to the input module once full packet has arrived.
  62. */
  63. static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
  64. {
  65. struct input_dev *dev = &psmouse->dev;
  66. unsigned char *packet = psmouse->packet;
  67. if (psmouse->pktcnt < psmouse->pktsize)
  68. return PSMOUSE_GOOD_DATA;
  69. /*
  70. * Full packet accumulated, process it
  71. */
  72. input_regs(dev, regs);
  73. /*
  74. * Scroll wheel on IntelliMice, scroll buttons on NetMice
  75. */
  76. if (psmouse->type == PSMOUSE_IMPS || psmouse->type == PSMOUSE_GENPS)
  77. input_report_rel(dev, REL_WHEEL, -(signed char) packet[3]);
  78. /*
  79. * Scroll wheel and buttons on IntelliMouse Explorer
  80. */
  81. if (psmouse->type == PSMOUSE_IMEX) {
  82. input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 8) - (int) (packet[3] & 7));
  83. input_report_key(dev, BTN_SIDE, (packet[3] >> 4) & 1);
  84. input_report_key(dev, BTN_EXTRA, (packet[3] >> 5) & 1);
  85. }
  86. /*
  87. * Extra buttons on Genius NewNet 3D
  88. */
  89. if (psmouse->type == PSMOUSE_GENPS) {
  90. input_report_key(dev, BTN_SIDE, (packet[0] >> 6) & 1);
  91. input_report_key(dev, BTN_EXTRA, (packet[0] >> 7) & 1);
  92. }
  93. /*
  94. * Extra button on ThinkingMouse
  95. */
  96. if (psmouse->type == PSMOUSE_THINKPS) {
  97. input_report_key(dev, BTN_EXTRA, (packet[0] >> 3) & 1);
  98. /* Without this bit of weirdness moving up gives wildly high Y changes. */
  99. packet[1] |= (packet[0] & 0x40) << 1;
  100. }
  101. /*
  102. * Generic PS/2 Mouse
  103. */
  104. input_report_key(dev, BTN_LEFT, packet[0] & 1);
  105. input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1);
  106. input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1);
  107. input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0);
  108. input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0);
  109. input_sync(dev);
  110. return PSMOUSE_FULL_PACKET;
  111. }
  112. /*
  113. * psmouse_interrupt() handles incoming characters, either gathering them into
  114. * packets or passing them to the command routine as command output.
  115. */
  116. static irqreturn_t psmouse_interrupt(struct serio *serio,
  117. unsigned char data, unsigned int flags, struct pt_regs *regs)
  118. {
  119. struct psmouse *psmouse = serio_get_drvdata(serio);
  120. psmouse_ret_t rc;
  121. if (psmouse->state == PSMOUSE_IGNORE)
  122. goto out;
  123. if (flags & (SERIO_PARITY|SERIO_TIMEOUT)) {
  124. if (psmouse->state == PSMOUSE_ACTIVATED)
  125. printk(KERN_WARNING "psmouse.c: bad data from KBC -%s%s\n",
  126. flags & SERIO_TIMEOUT ? " timeout" : "",
  127. flags & SERIO_PARITY ? " bad parity" : "");
  128. ps2_cmd_aborted(&psmouse->ps2dev);
  129. goto out;
  130. }
  131. if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_ACK))
  132. if (ps2_handle_ack(&psmouse->ps2dev, data))
  133. goto out;
  134. if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_CMD))
  135. if (ps2_handle_response(&psmouse->ps2dev, data))
  136. goto out;
  137. if (psmouse->state == PSMOUSE_INITIALIZING)
  138. goto out;
  139. if (psmouse->state == PSMOUSE_ACTIVATED &&
  140. psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
  141. printk(KERN_WARNING "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",
  142. psmouse->name, psmouse->phys, psmouse->pktcnt);
  143. psmouse->pktcnt = 0;
  144. }
  145. psmouse->last = jiffies;
  146. psmouse->packet[psmouse->pktcnt++] = data;
  147. if (psmouse->packet[0] == PSMOUSE_RET_BAT) {
  148. if (psmouse->pktcnt == 1)
  149. goto out;
  150. if (psmouse->pktcnt == 2) {
  151. if (psmouse->packet[1] == PSMOUSE_RET_ID) {
  152. psmouse->state = PSMOUSE_IGNORE;
  153. serio_reconnect(serio);
  154. goto out;
  155. }
  156. if (psmouse->type == PSMOUSE_SYNAPTICS) {
  157. /* neither 0xAA nor 0x00 are valid first bytes
  158. * for a packet in absolute mode
  159. */
  160. psmouse->pktcnt = 0;
  161. goto out;
  162. }
  163. }
  164. }
  165. rc = psmouse->protocol_handler(psmouse, regs);
  166. switch (rc) {
  167. case PSMOUSE_BAD_DATA:
  168. printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n",
  169. psmouse->name, psmouse->phys, psmouse->pktcnt);
  170. psmouse->pktcnt = 0;
  171. if (++psmouse->out_of_sync == psmouse->resetafter) {
  172. psmouse->state = PSMOUSE_IGNORE;
  173. printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n");
  174. serio_reconnect(psmouse->ps2dev.serio);
  175. }
  176. break;
  177. case PSMOUSE_FULL_PACKET:
  178. psmouse->pktcnt = 0;
  179. if (psmouse->out_of_sync) {
  180. psmouse->out_of_sync = 0;
  181. printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n",
  182. psmouse->name, psmouse->phys);
  183. }
  184. break;
  185. case PSMOUSE_GOOD_DATA:
  186. break;
  187. }
  188. out:
  189. return IRQ_HANDLED;
  190. }
  191. /*
  192. * psmouse_sliced_command() sends an extended PS/2 command to the mouse
  193. * using sliced syntax, understood by advanced devices, such as Logitech
  194. * or Synaptics touchpads. The command is encoded as:
  195. * 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu
  196. * is the command.
  197. */
  198. int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command)
  199. {
  200. int i;
  201. if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11))
  202. return -1;
  203. for (i = 6; i >= 0; i -= 2) {
  204. unsigned char d = (command >> i) & 3;
  205. if (ps2_command(&psmouse->ps2dev, &d, PSMOUSE_CMD_SETRES))
  206. return -1;
  207. }
  208. return 0;
  209. }
  210. /*
  211. * psmouse_reset() resets the mouse into power-on state.
  212. */
  213. int psmouse_reset(struct psmouse *psmouse)
  214. {
  215. unsigned char param[2];
  216. if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_RESET_BAT))
  217. return -1;
  218. if (param[0] != PSMOUSE_RET_BAT && param[1] != PSMOUSE_RET_ID)
  219. return -1;
  220. return 0;
  221. }
  222. /*
  223. * Genius NetMouse magic init.
  224. */
  225. static int genius_detect(struct psmouse *psmouse, int set_properties)
  226. {
  227. struct ps2dev *ps2dev = &psmouse->ps2dev;
  228. unsigned char param[4];
  229. param[0] = 3;
  230. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
  231. ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
  232. ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
  233. ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
  234. ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);
  235. if (param[0] != 0x00 || param[1] != 0x33 || param[2] != 0x55)
  236. return -1;
  237. if (set_properties) {
  238. set_bit(BTN_EXTRA, psmouse->dev.keybit);
  239. set_bit(BTN_SIDE, psmouse->dev.keybit);
  240. set_bit(REL_WHEEL, psmouse->dev.relbit);
  241. psmouse->vendor = "Genius";
  242. psmouse->name = "Wheel Mouse";
  243. psmouse->pktsize = 4;
  244. }
  245. return 0;
  246. }
  247. /*
  248. * IntelliMouse magic init.
  249. */
  250. static int intellimouse_detect(struct psmouse *psmouse, int set_properties)
  251. {
  252. struct ps2dev *ps2dev = &psmouse->ps2dev;
  253. unsigned char param[2];
  254. param[0] = 200;
  255. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
  256. param[0] = 100;
  257. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
  258. param[0] = 80;
  259. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
  260. ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
  261. if (param[0] != 3)
  262. return -1;
  263. if (set_properties) {
  264. set_bit(REL_WHEEL, psmouse->dev.relbit);
  265. if (!psmouse->vendor) psmouse->vendor = "Generic";
  266. if (!psmouse->name) psmouse->name = "Wheel Mouse";
  267. psmouse->pktsize = 4;
  268. }
  269. return 0;
  270. }
  271. /*
  272. * Try IntelliMouse/Explorer magic init.
  273. */
  274. static int im_explorer_detect(struct psmouse *psmouse, int set_properties)
  275. {
  276. struct ps2dev *ps2dev = &psmouse->ps2dev;
  277. unsigned char param[2];
  278. intellimouse_detect(psmouse, 0);
  279. param[0] = 200;
  280. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
  281. param[0] = 200;
  282. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
  283. param[0] = 80;
  284. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
  285. ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
  286. if (param[0] != 4)
  287. return -1;
  288. if (set_properties) {
  289. set_bit(REL_WHEEL, psmouse->dev.relbit);
  290. set_bit(BTN_SIDE, psmouse->dev.keybit);
  291. set_bit(BTN_EXTRA, psmouse->dev.keybit);
  292. if (!psmouse->vendor) psmouse->vendor = "Generic";
  293. if (!psmouse->name) psmouse->name = "Explorer Mouse";
  294. psmouse->pktsize = 4;
  295. }
  296. return 0;
  297. }
  298. /*
  299. * Kensington ThinkingMouse / ExpertMouse magic init.
  300. */
  301. static int thinking_detect(struct psmouse *psmouse, int set_properties)
  302. {
  303. struct ps2dev *ps2dev = &psmouse->ps2dev;
  304. unsigned char param[2];
  305. unsigned char seq[] = { 20, 60, 40, 20, 20, 60, 40, 20, 20, 0 };
  306. int i;
  307. param[0] = 10;
  308. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
  309. param[0] = 0;
  310. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
  311. for (i = 0; seq[i]; i++)
  312. ps2_command(ps2dev, seq + i, PSMOUSE_CMD_SETRATE);
  313. ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
  314. if (param[0] != 2)
  315. return -1;
  316. if (set_properties) {
  317. set_bit(BTN_EXTRA, psmouse->dev.keybit);
  318. psmouse->vendor = "Kensington";
  319. psmouse->name = "ThinkingMouse";
  320. }
  321. return 0;
  322. }
  323. /*
  324. * Bare PS/2 protocol "detection". Always succeeds.
  325. */
  326. static int ps2bare_detect(struct psmouse *psmouse, int set_properties)
  327. {
  328. if (!psmouse->vendor) psmouse->vendor = "Generic";
  329. if (!psmouse->name) psmouse->name = "Mouse";
  330. return 0;
  331. }
  332. /*
  333. * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
  334. * the mouse may have.
  335. */
  336. static int psmouse_extensions(struct psmouse *psmouse,
  337. unsigned int max_proto, int set_properties)
  338. {
  339. int synaptics_hardware = 0;
  340. /*
  341. * Try Kensington ThinkingMouse (we try first, because synaptics probe
  342. * upsets the thinkingmouse).
  343. */
  344. if (max_proto > PSMOUSE_IMEX && thinking_detect(psmouse, set_properties) == 0)
  345. return PSMOUSE_THINKPS;
  346. /*
  347. * Try Synaptics TouchPad
  348. */
  349. if (max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse, set_properties) == 0) {
  350. synaptics_hardware = 1;
  351. if (max_proto > PSMOUSE_IMEX) {
  352. if (!set_properties || synaptics_init(psmouse) == 0)
  353. return PSMOUSE_SYNAPTICS;
  354. /*
  355. * Some Synaptics touchpads can emulate extended protocols (like IMPS/2).
  356. * Unfortunately Logitech/Genius probes confuse some firmware versions so
  357. * we'll have to skip them.
  358. */
  359. max_proto = PSMOUSE_IMEX;
  360. }
  361. /*
  362. * Make sure that touchpad is in relative mode, gestures (taps) are enabled
  363. */
  364. synaptics_reset(psmouse);
  365. }
  366. /*
  367. * Try ALPS TouchPad
  368. */
  369. if (max_proto > PSMOUSE_IMEX) {
  370. ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
  371. if (alps_detect(psmouse, set_properties) == 0) {
  372. if (!set_properties || alps_init(psmouse) == 0)
  373. return PSMOUSE_ALPS;
  374. /*
  375. * Init failed, try basic relative protocols
  376. */
  377. max_proto = PSMOUSE_IMEX;
  378. }
  379. }
  380. if (max_proto > PSMOUSE_IMEX && genius_detect(psmouse, set_properties) == 0)
  381. return PSMOUSE_GENPS;
  382. if (max_proto > PSMOUSE_IMEX && ps2pp_init(psmouse, set_properties) == 0)
  383. return PSMOUSE_PS2PP;
  384. /*
  385. * Reset to defaults in case the device got confused by extended
  386. * protocol probes.
  387. */
  388. ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
  389. if (max_proto >= PSMOUSE_IMEX && im_explorer_detect(psmouse, set_properties) == 0)
  390. return PSMOUSE_IMEX;
  391. if (max_proto >= PSMOUSE_IMPS && intellimouse_detect(psmouse, set_properties) == 0)
  392. return PSMOUSE_IMPS;
  393. /*
  394. * Okay, all failed, we have a standard mouse here. The number of the buttons
  395. * is still a question, though. We assume 3.
  396. */
  397. ps2bare_detect(psmouse, set_properties);
  398. if (synaptics_hardware) {
  399. /*
  400. * We detected Synaptics hardware but it did not respond to IMPS/2 probes.
  401. * We need to reset the touchpad because if there is a track point on the
  402. * pass through port it could get disabled while probing for protocol
  403. * extensions.
  404. */
  405. psmouse_reset(psmouse);
  406. ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS);
  407. }
  408. return PSMOUSE_PS2;
  409. }
  410. /*
  411. * psmouse_probe() probes for a PS/2 mouse.
  412. */
  413. static int psmouse_probe(struct psmouse *psmouse)
  414. {
  415. struct ps2dev *ps2dev = &psmouse->ps2dev;
  416. unsigned char param[2];
  417. /*
  418. * First, we check if it's a mouse. It should send 0x00 or 0x03
  419. * in case of an IntelliMouse in 4-byte mode or 0x04 for IM Explorer.
  420. * Sunrex K8561 IR Keyboard/Mouse reports 0xff on second and subsequent
  421. * ID queries, probably due to a firmware bug.
  422. */
  423. param[0] = 0xa5;
  424. if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETID))
  425. return -1;
  426. if (param[0] != 0x00 && param[0] != 0x03 &&
  427. param[0] != 0x04 && param[0] != 0xff)
  428. return -1;
  429. /*
  430. * Then we reset and disable the mouse so that it doesn't generate events.
  431. */
  432. if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_DIS))
  433. printk(KERN_WARNING "psmouse.c: Failed to reset mouse on %s\n", ps2dev->serio->phys);
  434. return 0;
  435. }
  436. /*
  437. * Here we set the mouse resolution.
  438. */
  439. void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution)
  440. {
  441. unsigned char params[] = { 0, 1, 2, 2, 3 };
  442. if (resolution == 0 || resolution > 200)
  443. resolution = 200;
  444. ps2_command(&psmouse->ps2dev, &params[resolution / 50], PSMOUSE_CMD_SETRES);
  445. psmouse->resolution = 25 << params[resolution / 50];
  446. }
  447. /*
  448. * Here we set the mouse report rate.
  449. */
  450. static void psmouse_set_rate(struct psmouse *psmouse, unsigned int rate)
  451. {
  452. unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10, 0 };
  453. int i = 0;
  454. while (rates[i] > rate) i++;
  455. ps2_command(&psmouse->ps2dev, &rates[i], PSMOUSE_CMD_SETRATE);
  456. psmouse->rate = rates[i];
  457. }
  458. /*
  459. * psmouse_initialize() initializes the mouse to a sane state.
  460. */
  461. static void psmouse_initialize(struct psmouse *psmouse)
  462. {
  463. /*
  464. * We set the mouse into streaming mode.
  465. */
  466. ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSTREAM);
  467. /*
  468. * We set the mouse report rate, resolution and scaling.
  469. */
  470. if (psmouse_max_proto != PSMOUSE_PS2) {
  471. psmouse->set_rate(psmouse, psmouse->rate);
  472. psmouse->set_resolution(psmouse, psmouse->resolution);
  473. ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
  474. }
  475. }
  476. /*
  477. * psmouse_set_state() sets new psmouse state and resets all flags and
  478. * counters while holding serio lock so fighting with interrupt handler
  479. * is not a concern.
  480. */
  481. static void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state)
  482. {
  483. serio_pause_rx(psmouse->ps2dev.serio);
  484. psmouse->state = new_state;
  485. psmouse->pktcnt = psmouse->out_of_sync = 0;
  486. psmouse->ps2dev.flags = 0;
  487. serio_continue_rx(psmouse->ps2dev.serio);
  488. }
  489. /*
  490. * psmouse_activate() enables the mouse so that we get motion reports from it.
  491. */
  492. static void psmouse_activate(struct psmouse *psmouse)
  493. {
  494. if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE))
  495. printk(KERN_WARNING "psmouse.c: Failed to enable mouse on %s\n",
  496. psmouse->ps2dev.serio->phys);
  497. psmouse_set_state(psmouse, PSMOUSE_ACTIVATED);
  498. }
  499. /*
  500. * psmouse_deactivate() puts the mouse into poll mode so that we don't get motion
  501. * reports from it unless we explicitely request it.
  502. */
  503. static void psmouse_deactivate(struct psmouse *psmouse)
  504. {
  505. if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE))
  506. printk(KERN_WARNING "psmouse.c: Failed to deactivate mouse on %s\n",
  507. psmouse->ps2dev.serio->phys);
  508. psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
  509. }
  510. /*
  511. * psmouse_cleanup() resets the mouse into power-on state.
  512. */
  513. static void psmouse_cleanup(struct serio *serio)
  514. {
  515. struct psmouse *psmouse = serio_get_drvdata(serio);
  516. psmouse_reset(psmouse);
  517. }
  518. /*
  519. * psmouse_disconnect() closes and frees.
  520. */
  521. static void psmouse_disconnect(struct serio *serio)
  522. {
  523. struct psmouse *psmouse, *parent;
  524. device_remove_file(&serio->dev, &psmouse_attr_rate);
  525. device_remove_file(&serio->dev, &psmouse_attr_resolution);
  526. device_remove_file(&serio->dev, &psmouse_attr_resetafter);
  527. psmouse = serio_get_drvdata(serio);
  528. psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
  529. if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
  530. parent = serio_get_drvdata(serio->parent);
  531. if (parent->pt_deactivate)
  532. parent->pt_deactivate(parent);
  533. }
  534. if (psmouse->disconnect)
  535. psmouse->disconnect(psmouse);
  536. psmouse_set_state(psmouse, PSMOUSE_IGNORE);
  537. input_unregister_device(&psmouse->dev);
  538. serio_close(serio);
  539. serio_set_drvdata(serio, NULL);
  540. kfree(psmouse);
  541. }
  542. /*
  543. * psmouse_connect() is a callback from the serio module when
  544. * an unhandled serio port is found.
  545. */
  546. static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
  547. {
  548. struct psmouse *psmouse, *parent = NULL;
  549. int retval;
  550. /*
  551. * If this is a pass-through port deactivate parent so the device
  552. * connected to this port can be successfully identified
  553. */
  554. if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
  555. parent = serio_get_drvdata(serio->parent);
  556. psmouse_deactivate(parent);
  557. }
  558. if (!(psmouse = kmalloc(sizeof(struct psmouse), GFP_KERNEL))) {
  559. retval = -ENOMEM;
  560. goto out;
  561. }
  562. memset(psmouse, 0, sizeof(struct psmouse));
  563. ps2_init(&psmouse->ps2dev, serio);
  564. sprintf(psmouse->phys, "%s/input0", serio->phys);
  565. psmouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
  566. psmouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
  567. psmouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
  568. psmouse->dev.private = psmouse;
  569. psmouse->dev.dev = &serio->dev;
  570. psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
  571. serio_set_drvdata(serio, psmouse);
  572. retval = serio_open(serio, drv);
  573. if (retval) {
  574. serio_set_drvdata(serio, NULL);
  575. kfree(psmouse);
  576. goto out;
  577. }
  578. if (psmouse_probe(psmouse) < 0) {
  579. serio_close(serio);
  580. serio_set_drvdata(serio, NULL);
  581. kfree(psmouse);
  582. retval = -ENODEV;
  583. goto out;
  584. }
  585. psmouse->rate = psmouse_rate;
  586. psmouse->resolution = psmouse_resolution;
  587. psmouse->resetafter = psmouse_resetafter;
  588. psmouse->smartscroll = psmouse_smartscroll;
  589. psmouse->set_rate = psmouse_set_rate;
  590. psmouse->set_resolution = psmouse_set_resolution;
  591. psmouse->protocol_handler = psmouse_process_byte;
  592. psmouse->pktsize = 3;
  593. psmouse->type = psmouse_extensions(psmouse, psmouse_max_proto, 1);
  594. sprintf(psmouse->devname, "%s %s %s",
  595. psmouse_protocols[psmouse->type], psmouse->vendor, psmouse->name);
  596. psmouse->dev.name = psmouse->devname;
  597. psmouse->dev.phys = psmouse->phys;
  598. psmouse->dev.id.bustype = BUS_I8042;
  599. psmouse->dev.id.vendor = 0x0002;
  600. psmouse->dev.id.product = psmouse->type;
  601. psmouse->dev.id.version = psmouse->model;
  602. input_register_device(&psmouse->dev);
  603. printk(KERN_INFO "input: %s on %s\n", psmouse->devname, serio->phys);
  604. psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
  605. psmouse_initialize(psmouse);
  606. if (parent && parent->pt_activate)
  607. parent->pt_activate(parent);
  608. device_create_file(&serio->dev, &psmouse_attr_rate);
  609. device_create_file(&serio->dev, &psmouse_attr_resolution);
  610. device_create_file(&serio->dev, &psmouse_attr_resetafter);
  611. psmouse_activate(psmouse);
  612. retval = 0;
  613. out:
  614. /* If this is a pass-through port the parent awaits to be activated */
  615. if (parent)
  616. psmouse_activate(parent);
  617. return retval;
  618. }
  619. static int psmouse_reconnect(struct serio *serio)
  620. {
  621. struct psmouse *psmouse = serio_get_drvdata(serio);
  622. struct psmouse *parent = NULL;
  623. struct serio_driver *drv = serio->drv;
  624. int rc = -1;
  625. if (!drv || !psmouse) {
  626. printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");
  627. return -1;
  628. }
  629. if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
  630. parent = serio_get_drvdata(serio->parent);
  631. psmouse_deactivate(parent);
  632. }
  633. psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
  634. if (psmouse->reconnect) {
  635. if (psmouse->reconnect(psmouse))
  636. goto out;
  637. } else if (psmouse_probe(psmouse) < 0 ||
  638. psmouse->type != psmouse_extensions(psmouse, psmouse_max_proto, 0))
  639. goto out;
  640. /* ok, the device type (and capabilities) match the old one,
  641. * we can continue using it, complete intialization
  642. */
  643. psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
  644. psmouse_initialize(psmouse);
  645. if (parent && parent->pt_activate)
  646. parent->pt_activate(parent);
  647. psmouse_activate(psmouse);
  648. rc = 0;
  649. out:
  650. /* If this is a pass-through port the parent waits to be activated */
  651. if (parent)
  652. psmouse_activate(parent);
  653. return rc;
  654. }
  655. static struct serio_device_id psmouse_serio_ids[] = {
  656. {
  657. .type = SERIO_8042,
  658. .proto = SERIO_ANY,
  659. .id = SERIO_ANY,
  660. .extra = SERIO_ANY,
  661. },
  662. {
  663. .type = SERIO_PS_PSTHRU,
  664. .proto = SERIO_ANY,
  665. .id = SERIO_ANY,
  666. .extra = SERIO_ANY,
  667. },
  668. { 0 }
  669. };
  670. MODULE_DEVICE_TABLE(serio, psmouse_serio_ids);
  671. static struct serio_driver psmouse_drv = {
  672. .driver = {
  673. .name = "psmouse",
  674. },
  675. .description = DRIVER_DESC,
  676. .id_table = psmouse_serio_ids,
  677. .interrupt = psmouse_interrupt,
  678. .connect = psmouse_connect,
  679. .reconnect = psmouse_reconnect,
  680. .disconnect = psmouse_disconnect,
  681. .cleanup = psmouse_cleanup,
  682. };
  683. ssize_t psmouse_attr_show_helper(struct device *dev, char *buf,
  684. ssize_t (*handler)(struct psmouse *, char *))
  685. {
  686. struct serio *serio = to_serio_port(dev);
  687. int retval;
  688. retval = serio_pin_driver(serio);
  689. if (retval)
  690. return retval;
  691. if (serio->drv != &psmouse_drv) {
  692. retval = -ENODEV;
  693. goto out;
  694. }
  695. retval = handler(serio_get_drvdata(serio), buf);
  696. out:
  697. serio_unpin_driver(serio);
  698. return retval;
  699. }
  700. ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t count,
  701. ssize_t (*handler)(struct psmouse *, const char *, size_t))
  702. {
  703. struct serio *serio = to_serio_port(dev);
  704. struct psmouse *psmouse = serio_get_drvdata(serio);
  705. struct psmouse *parent = NULL;
  706. int retval;
  707. retval = serio_pin_driver(serio);
  708. if (retval)
  709. return retval;
  710. if (serio->drv != &psmouse_drv) {
  711. retval = -ENODEV;
  712. goto out;
  713. }
  714. if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
  715. parent = serio_get_drvdata(serio->parent);
  716. psmouse_deactivate(parent);
  717. }
  718. psmouse_deactivate(psmouse);
  719. retval = handler(psmouse, buf, count);
  720. psmouse_activate(psmouse);
  721. if (parent)
  722. psmouse_activate(parent);
  723. out:
  724. serio_unpin_driver(serio);
  725. return retval;
  726. }
  727. static ssize_t psmouse_attr_show_rate(struct psmouse *psmouse, char *buf)
  728. {
  729. return sprintf(buf, "%d\n", psmouse->rate);
  730. }
  731. static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, const char *buf, size_t count)
  732. {
  733. unsigned long value;
  734. char *rest;
  735. value = simple_strtoul(buf, &rest, 10);
  736. if (*rest)
  737. return -EINVAL;
  738. psmouse->set_rate(psmouse, value);
  739. return count;
  740. }
  741. static ssize_t psmouse_attr_show_resolution(struct psmouse *psmouse, char *buf)
  742. {
  743. return sprintf(buf, "%d\n", psmouse->resolution);
  744. }
  745. static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, const char *buf, size_t count)
  746. {
  747. unsigned long value;
  748. char *rest;
  749. value = simple_strtoul(buf, &rest, 10);
  750. if (*rest)
  751. return -EINVAL;
  752. psmouse->set_resolution(psmouse, value);
  753. return count;
  754. }
  755. static ssize_t psmouse_attr_show_resetafter(struct psmouse *psmouse, char *buf)
  756. {
  757. return sprintf(buf, "%d\n", psmouse->resetafter);
  758. }
  759. static ssize_t psmouse_attr_set_resetafter(struct psmouse *psmouse, const char *buf, size_t count)
  760. {
  761. unsigned long value;
  762. char *rest;
  763. value = simple_strtoul(buf, &rest, 10);
  764. if (*rest)
  765. return -EINVAL;
  766. psmouse->resetafter = value;
  767. return count;
  768. }
  769. static int psmouse_set_maxproto(const char *val, struct kernel_param *kp)
  770. {
  771. int i;
  772. if (!val)
  773. return -EINVAL;
  774. if (!strncmp(val, "any", 3)) {
  775. *((unsigned int *)kp->arg) = -1U;
  776. return 0;
  777. }
  778. for (i = 0; i < ARRAY_SIZE(psmouse_proto_abbrev); i++) {
  779. if (!psmouse_proto_abbrev[i])
  780. continue;
  781. if (!strncmp(val, psmouse_proto_abbrev[i], strlen(psmouse_proto_abbrev[i]))) {
  782. *((unsigned int *)kp->arg) = i;
  783. return 0;
  784. }
  785. }
  786. return -EINVAL; \
  787. }
  788. static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp)
  789. {
  790. return sprintf(buffer, "%s\n",
  791. psmouse_max_proto < ARRAY_SIZE(psmouse_proto_abbrev) ?
  792. psmouse_proto_abbrev[psmouse_max_proto] : "any");
  793. }
  794. static int __init psmouse_init(void)
  795. {
  796. serio_register_driver(&psmouse_drv);
  797. return 0;
  798. }
  799. static void __exit psmouse_exit(void)
  800. {
  801. serio_unregister_driver(&psmouse_drv);
  802. }
  803. module_init(psmouse_init);
  804. module_exit(psmouse_exit);