synaptics.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. /*
  2. * Synaptics TouchPad PS/2 mouse driver
  3. *
  4. * 2003 Dmitry Torokhov <dtor@mail.ru>
  5. * Added support for pass-through port. Special thanks to Peter Berg Larsen
  6. * for explaining various Synaptics quirks.
  7. *
  8. * 2003 Peter Osterlund <petero2@telia.com>
  9. * Ported to 2.5 input device infrastructure.
  10. *
  11. * Copyright (C) 2001 Stefan Gmeiner <riddlebox@freesurf.ch>
  12. * start merging tpconfig and gpm code to a xfree-input module
  13. * adding some changes and extensions (ex. 3rd and 4th button)
  14. *
  15. * Copyright (c) 1997 C. Scott Ananian <cananian@alumni.priceton.edu>
  16. * Copyright (c) 1998-2000 Bruce Kalk <kall@compass.com>
  17. * code for the special synaptics commands (from the tpconfig-source)
  18. *
  19. * This program is free software; you can redistribute it and/or modify it
  20. * under the terms of the GNU General Public License version 2 as published by
  21. * the Free Software Foundation.
  22. *
  23. * Trademarks are the property of their respective owners.
  24. */
  25. #include <linux/module.h>
  26. #include <linux/dmi.h>
  27. #include <linux/input/mt.h>
  28. #include <linux/serio.h>
  29. #include <linux/libps2.h>
  30. #include <linux/slab.h>
  31. #include "psmouse.h"
  32. #include "synaptics.h"
  33. /*
  34. * The x/y limits are taken from the Synaptics TouchPad interfacing Guide,
  35. * section 2.3.2, which says that they should be valid regardless of the
  36. * actual size of the sensor.
  37. * Note that newer firmware allows querying device for maximum useable
  38. * coordinates.
  39. */
  40. #define XMIN_NOMINAL 1472
  41. #define XMAX_NOMINAL 5472
  42. #define YMIN_NOMINAL 1408
  43. #define YMAX_NOMINAL 4448
  44. /*****************************************************************************
  45. * Stuff we need even when we do not want native Synaptics support
  46. ****************************************************************************/
  47. /*
  48. * Set the synaptics touchpad mode byte by special commands
  49. */
  50. static int synaptics_mode_cmd(struct psmouse *psmouse, unsigned char mode)
  51. {
  52. unsigned char param[1];
  53. if (psmouse_sliced_command(psmouse, mode))
  54. return -1;
  55. param[0] = SYN_PS_SET_MODE2;
  56. if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_SETRATE))
  57. return -1;
  58. return 0;
  59. }
  60. int synaptics_detect(struct psmouse *psmouse, bool set_properties)
  61. {
  62. struct ps2dev *ps2dev = &psmouse->ps2dev;
  63. unsigned char param[4];
  64. param[0] = 0;
  65. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
  66. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
  67. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
  68. ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
  69. ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);
  70. if (param[1] != 0x47)
  71. return -ENODEV;
  72. if (set_properties) {
  73. psmouse->vendor = "Synaptics";
  74. psmouse->name = "TouchPad";
  75. }
  76. return 0;
  77. }
  78. void synaptics_reset(struct psmouse *psmouse)
  79. {
  80. /* reset touchpad back to relative mode, gestures enabled */
  81. synaptics_mode_cmd(psmouse, 0);
  82. }
  83. #ifdef CONFIG_MOUSE_PS2_SYNAPTICS
  84. /*****************************************************************************
  85. * Synaptics communications functions
  86. ****************************************************************************/
  87. /*
  88. * Send a command to the synpatics touchpad by special commands
  89. */
  90. static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param)
  91. {
  92. if (psmouse_sliced_command(psmouse, c))
  93. return -1;
  94. if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO))
  95. return -1;
  96. return 0;
  97. }
  98. /*
  99. * Read the model-id bytes from the touchpad
  100. * see also SYN_MODEL_* macros
  101. */
  102. static int synaptics_model_id(struct psmouse *psmouse)
  103. {
  104. struct synaptics_data *priv = psmouse->private;
  105. unsigned char mi[3];
  106. if (synaptics_send_cmd(psmouse, SYN_QUE_MODEL, mi))
  107. return -1;
  108. priv->model_id = (mi[0]<<16) | (mi[1]<<8) | mi[2];
  109. return 0;
  110. }
  111. /*
  112. * Read the capability-bits from the touchpad
  113. * see also the SYN_CAP_* macros
  114. */
  115. static int synaptics_capability(struct psmouse *psmouse)
  116. {
  117. struct synaptics_data *priv = psmouse->private;
  118. unsigned char cap[3];
  119. if (synaptics_send_cmd(psmouse, SYN_QUE_CAPABILITIES, cap))
  120. return -1;
  121. priv->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2];
  122. priv->ext_cap = priv->ext_cap_0c = 0;
  123. /*
  124. * Older firmwares had submodel ID fixed to 0x47
  125. */
  126. if (SYN_ID_FULL(priv->identity) < 0x705 &&
  127. SYN_CAP_SUBMODEL_ID(priv->capabilities) != 0x47) {
  128. return -1;
  129. }
  130. /*
  131. * Unless capExtended is set the rest of the flags should be ignored
  132. */
  133. if (!SYN_CAP_EXTENDED(priv->capabilities))
  134. priv->capabilities = 0;
  135. if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 1) {
  136. if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) {
  137. printk(KERN_ERR "Synaptics claims to have extended capabilities,"
  138. " but I'm not able to read them.\n");
  139. } else {
  140. priv->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2];
  141. /*
  142. * if nExtBtn is greater than 8 it should be considered
  143. * invalid and treated as 0
  144. */
  145. if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) > 8)
  146. priv->ext_cap &= 0xff0fff;
  147. }
  148. }
  149. if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 4) {
  150. if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap)) {
  151. printk(KERN_ERR "Synaptics claims to have extended capability 0x0c,"
  152. " but I'm not able to read it.\n");
  153. } else {
  154. priv->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2];
  155. }
  156. }
  157. return 0;
  158. }
  159. /*
  160. * Identify Touchpad
  161. * See also the SYN_ID_* macros
  162. */
  163. static int synaptics_identify(struct psmouse *psmouse)
  164. {
  165. struct synaptics_data *priv = psmouse->private;
  166. unsigned char id[3];
  167. if (synaptics_send_cmd(psmouse, SYN_QUE_IDENTIFY, id))
  168. return -1;
  169. priv->identity = (id[0]<<16) | (id[1]<<8) | id[2];
  170. if (SYN_ID_IS_SYNAPTICS(priv->identity))
  171. return 0;
  172. return -1;
  173. }
  174. /*
  175. * Read touchpad resolution and maximum reported coordinates
  176. * Resolution is left zero if touchpad does not support the query
  177. */
  178. static int synaptics_resolution(struct psmouse *psmouse)
  179. {
  180. struct synaptics_data *priv = psmouse->private;
  181. unsigned char resp[3];
  182. if (SYN_ID_MAJOR(priv->identity) < 4)
  183. return 0;
  184. if (synaptics_send_cmd(psmouse, SYN_QUE_RESOLUTION, resp) == 0) {
  185. if (resp[0] != 0 && (resp[1] & 0x80) && resp[2] != 0) {
  186. priv->x_res = resp[0]; /* x resolution in units/mm */
  187. priv->y_res = resp[2]; /* y resolution in units/mm */
  188. }
  189. }
  190. if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 5 &&
  191. SYN_CAP_MAX_DIMENSIONS(priv->ext_cap_0c)) {
  192. if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MAX_COORDS, resp)) {
  193. printk(KERN_ERR "Synaptics claims to have max coordinates"
  194. " query, but I'm not able to read it.\n");
  195. } else {
  196. priv->x_max = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
  197. priv->y_max = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
  198. }
  199. }
  200. if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 7 &&
  201. SYN_CAP_MIN_DIMENSIONS(priv->ext_cap_0c)) {
  202. if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MIN_COORDS, resp)) {
  203. printk(KERN_ERR "Synaptics claims to have min coordinates"
  204. " query, but I'm not able to read it.\n");
  205. } else {
  206. priv->x_min = (resp[0] << 5) | ((resp[1] & 0x0f) << 1);
  207. priv->y_min = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3);
  208. }
  209. }
  210. return 0;
  211. }
  212. static int synaptics_query_hardware(struct psmouse *psmouse)
  213. {
  214. if (synaptics_identify(psmouse))
  215. return -1;
  216. if (synaptics_model_id(psmouse))
  217. return -1;
  218. if (synaptics_capability(psmouse))
  219. return -1;
  220. if (synaptics_resolution(psmouse))
  221. return -1;
  222. return 0;
  223. }
  224. static int synaptics_set_absolute_mode(struct psmouse *psmouse)
  225. {
  226. struct synaptics_data *priv = psmouse->private;
  227. priv->mode = SYN_BIT_ABSOLUTE_MODE;
  228. if (SYN_ID_MAJOR(priv->identity) >= 4)
  229. priv->mode |= SYN_BIT_DISABLE_GESTURE;
  230. if (SYN_CAP_EXTENDED(priv->capabilities))
  231. priv->mode |= SYN_BIT_W_MODE;
  232. if (synaptics_mode_cmd(psmouse, priv->mode))
  233. return -1;
  234. return 0;
  235. }
  236. static void synaptics_set_rate(struct psmouse *psmouse, unsigned int rate)
  237. {
  238. struct synaptics_data *priv = psmouse->private;
  239. if (rate >= 80) {
  240. priv->mode |= SYN_BIT_HIGH_RATE;
  241. psmouse->rate = 80;
  242. } else {
  243. priv->mode &= ~SYN_BIT_HIGH_RATE;
  244. psmouse->rate = 40;
  245. }
  246. synaptics_mode_cmd(psmouse, priv->mode);
  247. }
  248. static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse)
  249. {
  250. static unsigned char param = 0xc8;
  251. struct synaptics_data *priv = psmouse->private;
  252. if (!SYN_CAP_ADV_GESTURE(priv->ext_cap_0c))
  253. return 0;
  254. if (psmouse_sliced_command(psmouse, SYN_QUE_MODEL))
  255. return -1;
  256. if (ps2_command(&psmouse->ps2dev, &param, PSMOUSE_CMD_SETRATE))
  257. return -1;
  258. /* Advanced gesture mode also sends multi finger data */
  259. priv->capabilities |= BIT(1);
  260. return 0;
  261. }
  262. /*****************************************************************************
  263. * Synaptics pass-through PS/2 port support
  264. ****************************************************************************/
  265. static int synaptics_pt_write(struct serio *serio, unsigned char c)
  266. {
  267. struct psmouse *parent = serio_get_drvdata(serio->parent);
  268. char rate_param = SYN_PS_CLIENT_CMD; /* indicates that we want pass-through port */
  269. if (psmouse_sliced_command(parent, c))
  270. return -1;
  271. if (ps2_command(&parent->ps2dev, &rate_param, PSMOUSE_CMD_SETRATE))
  272. return -1;
  273. return 0;
  274. }
  275. static int synaptics_pt_start(struct serio *serio)
  276. {
  277. struct psmouse *parent = serio_get_drvdata(serio->parent);
  278. struct synaptics_data *priv = parent->private;
  279. serio_pause_rx(parent->ps2dev.serio);
  280. priv->pt_port = serio;
  281. serio_continue_rx(parent->ps2dev.serio);
  282. return 0;
  283. }
  284. static void synaptics_pt_stop(struct serio *serio)
  285. {
  286. struct psmouse *parent = serio_get_drvdata(serio->parent);
  287. struct synaptics_data *priv = parent->private;
  288. serio_pause_rx(parent->ps2dev.serio);
  289. priv->pt_port = NULL;
  290. serio_continue_rx(parent->ps2dev.serio);
  291. }
  292. static int synaptics_is_pt_packet(unsigned char *buf)
  293. {
  294. return (buf[0] & 0xFC) == 0x84 && (buf[3] & 0xCC) == 0xC4;
  295. }
  296. static void synaptics_pass_pt_packet(struct serio *ptport, unsigned char *packet)
  297. {
  298. struct psmouse *child = serio_get_drvdata(ptport);
  299. if (child && child->state == PSMOUSE_ACTIVATED) {
  300. serio_interrupt(ptport, packet[1], 0);
  301. serio_interrupt(ptport, packet[4], 0);
  302. serio_interrupt(ptport, packet[5], 0);
  303. if (child->pktsize == 4)
  304. serio_interrupt(ptport, packet[2], 0);
  305. } else
  306. serio_interrupt(ptport, packet[1], 0);
  307. }
  308. static void synaptics_pt_activate(struct psmouse *psmouse)
  309. {
  310. struct synaptics_data *priv = psmouse->private;
  311. struct psmouse *child = serio_get_drvdata(priv->pt_port);
  312. /* adjust the touchpad to child's choice of protocol */
  313. if (child) {
  314. if (child->pktsize == 4)
  315. priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT;
  316. else
  317. priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT;
  318. if (synaptics_mode_cmd(psmouse, priv->mode))
  319. printk(KERN_INFO "synaptics: failed to switch guest protocol\n");
  320. }
  321. }
  322. static void synaptics_pt_create(struct psmouse *psmouse)
  323. {
  324. struct serio *serio;
  325. serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
  326. if (!serio) {
  327. printk(KERN_ERR "synaptics: not enough memory to allocate pass-through port\n");
  328. return;
  329. }
  330. serio->id.type = SERIO_PS_PSTHRU;
  331. strlcpy(serio->name, "Synaptics pass-through", sizeof(serio->name));
  332. strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->name));
  333. serio->write = synaptics_pt_write;
  334. serio->start = synaptics_pt_start;
  335. serio->stop = synaptics_pt_stop;
  336. serio->parent = psmouse->ps2dev.serio;
  337. psmouse->pt_activate = synaptics_pt_activate;
  338. printk(KERN_INFO "serio: %s port at %s\n", serio->name, psmouse->phys);
  339. serio_register_port(serio);
  340. }
  341. /*****************************************************************************
  342. * Functions to interpret the absolute mode packets
  343. ****************************************************************************/
  344. static int synaptics_parse_hw_state(const unsigned char buf[],
  345. struct synaptics_data *priv,
  346. struct synaptics_hw_state *hw)
  347. {
  348. memset(hw, 0, sizeof(struct synaptics_hw_state));
  349. if (SYN_MODEL_NEWABS(priv->model_id)) {
  350. hw->w = (((buf[0] & 0x30) >> 2) |
  351. ((buf[0] & 0x04) >> 1) |
  352. ((buf[3] & 0x04) >> 2));
  353. hw->left = (buf[0] & 0x01) ? 1 : 0;
  354. hw->right = (buf[0] & 0x02) ? 1 : 0;
  355. if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
  356. /*
  357. * Clickpad's button is transmitted as middle button,
  358. * however, since it is primary button, we will report
  359. * it as BTN_LEFT.
  360. */
  361. hw->left = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
  362. } else if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) {
  363. hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
  364. if (hw->w == 2)
  365. hw->scroll = (signed char)(buf[1]);
  366. }
  367. if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) {
  368. hw->up = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
  369. hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0;
  370. }
  371. if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) && hw->w == 2) {
  372. /* Gesture packet: (x, y, z) at half resolution */
  373. priv->mt.x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1;
  374. priv->mt.y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1;
  375. priv->mt.z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1;
  376. return 1;
  377. }
  378. hw->x = (((buf[3] & 0x10) << 8) |
  379. ((buf[1] & 0x0f) << 8) |
  380. buf[4]);
  381. hw->y = (((buf[3] & 0x20) << 7) |
  382. ((buf[1] & 0xf0) << 4) |
  383. buf[5]);
  384. hw->z = buf[2];
  385. if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) &&
  386. ((buf[0] ^ buf[3]) & 0x02)) {
  387. switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) {
  388. default:
  389. /*
  390. * if nExtBtn is greater than 8 it should be
  391. * considered invalid and treated as 0
  392. */
  393. break;
  394. case 8:
  395. hw->ext_buttons |= ((buf[5] & 0x08)) ? 0x80 : 0;
  396. hw->ext_buttons |= ((buf[4] & 0x08)) ? 0x40 : 0;
  397. case 6:
  398. hw->ext_buttons |= ((buf[5] & 0x04)) ? 0x20 : 0;
  399. hw->ext_buttons |= ((buf[4] & 0x04)) ? 0x10 : 0;
  400. case 4:
  401. hw->ext_buttons |= ((buf[5] & 0x02)) ? 0x08 : 0;
  402. hw->ext_buttons |= ((buf[4] & 0x02)) ? 0x04 : 0;
  403. case 2:
  404. hw->ext_buttons |= ((buf[5] & 0x01)) ? 0x02 : 0;
  405. hw->ext_buttons |= ((buf[4] & 0x01)) ? 0x01 : 0;
  406. }
  407. }
  408. } else {
  409. hw->x = (((buf[1] & 0x1f) << 8) | buf[2]);
  410. hw->y = (((buf[4] & 0x1f) << 8) | buf[5]);
  411. hw->z = (((buf[0] & 0x30) << 2) | (buf[3] & 0x3F));
  412. hw->w = (((buf[1] & 0x80) >> 4) | ((buf[0] & 0x04) >> 1));
  413. hw->left = (buf[0] & 0x01) ? 1 : 0;
  414. hw->right = (buf[0] & 0x02) ? 1 : 0;
  415. }
  416. return 0;
  417. }
  418. static void synaptics_report_semi_mt_slot(struct input_dev *dev, int slot,
  419. bool active, int x, int y)
  420. {
  421. input_mt_slot(dev, slot);
  422. input_mt_report_slot_state(dev, MT_TOOL_FINGER, active);
  423. if (active) {
  424. input_report_abs(dev, ABS_MT_POSITION_X, x);
  425. input_report_abs(dev, ABS_MT_POSITION_Y,
  426. YMAX_NOMINAL + YMIN_NOMINAL - y);
  427. }
  428. }
  429. static void synaptics_report_semi_mt_data(struct input_dev *dev,
  430. const struct synaptics_hw_state *a,
  431. const struct synaptics_hw_state *b,
  432. int num_fingers)
  433. {
  434. if (num_fingers >= 2) {
  435. synaptics_report_semi_mt_slot(dev, 0, true, min(a->x, b->x),
  436. min(a->y, b->y));
  437. synaptics_report_semi_mt_slot(dev, 1, true, max(a->x, b->x),
  438. max(a->y, b->y));
  439. } else if (num_fingers == 1) {
  440. synaptics_report_semi_mt_slot(dev, 0, true, a->x, a->y);
  441. synaptics_report_semi_mt_slot(dev, 1, false, 0, 0);
  442. } else {
  443. synaptics_report_semi_mt_slot(dev, 0, false, 0, 0);
  444. synaptics_report_semi_mt_slot(dev, 1, false, 0, 0);
  445. }
  446. }
  447. /*
  448. * called for each full received packet from the touchpad
  449. */
  450. static void synaptics_process_packet(struct psmouse *psmouse)
  451. {
  452. struct input_dev *dev = psmouse->dev;
  453. struct synaptics_data *priv = psmouse->private;
  454. struct synaptics_hw_state hw;
  455. int num_fingers;
  456. int finger_width;
  457. int i;
  458. if (synaptics_parse_hw_state(psmouse->packet, priv, &hw))
  459. return;
  460. if (hw.scroll) {
  461. priv->scroll += hw.scroll;
  462. while (priv->scroll >= 4) {
  463. input_report_key(dev, BTN_BACK, !hw.down);
  464. input_sync(dev);
  465. input_report_key(dev, BTN_BACK, hw.down);
  466. input_sync(dev);
  467. priv->scroll -= 4;
  468. }
  469. while (priv->scroll <= -4) {
  470. input_report_key(dev, BTN_FORWARD, !hw.up);
  471. input_sync(dev);
  472. input_report_key(dev, BTN_FORWARD, hw.up);
  473. input_sync(dev);
  474. priv->scroll += 4;
  475. }
  476. return;
  477. }
  478. if (hw.z > 0 && hw.x > 1) {
  479. num_fingers = 1;
  480. finger_width = 5;
  481. if (SYN_CAP_EXTENDED(priv->capabilities)) {
  482. switch (hw.w) {
  483. case 0 ... 1:
  484. if (SYN_CAP_MULTIFINGER(priv->capabilities))
  485. num_fingers = hw.w + 2;
  486. break;
  487. case 2:
  488. if (SYN_MODEL_PEN(priv->model_id))
  489. ; /* Nothing, treat a pen as a single finger */
  490. break;
  491. case 4 ... 15:
  492. if (SYN_CAP_PALMDETECT(priv->capabilities))
  493. finger_width = hw.w;
  494. break;
  495. }
  496. }
  497. } else {
  498. num_fingers = 0;
  499. finger_width = 0;
  500. }
  501. if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c))
  502. synaptics_report_semi_mt_data(dev, &hw, &priv->mt, num_fingers);
  503. /* Post events
  504. * BTN_TOUCH has to be first as mousedev relies on it when doing
  505. * absolute -> relative conversion
  506. */
  507. if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1);
  508. if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0);
  509. if (num_fingers > 0) {
  510. input_report_abs(dev, ABS_X, hw.x);
  511. input_report_abs(dev, ABS_Y, YMAX_NOMINAL + YMIN_NOMINAL - hw.y);
  512. }
  513. input_report_abs(dev, ABS_PRESSURE, hw.z);
  514. if (SYN_CAP_PALMDETECT(priv->capabilities))
  515. input_report_abs(dev, ABS_TOOL_WIDTH, finger_width);
  516. input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1);
  517. input_report_key(dev, BTN_LEFT, hw.left);
  518. input_report_key(dev, BTN_RIGHT, hw.right);
  519. if (SYN_CAP_MULTIFINGER(priv->capabilities)) {
  520. input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2);
  521. input_report_key(dev, BTN_TOOL_TRIPLETAP, num_fingers == 3);
  522. }
  523. if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
  524. input_report_key(dev, BTN_MIDDLE, hw.middle);
  525. if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) {
  526. input_report_key(dev, BTN_FORWARD, hw.up);
  527. input_report_key(dev, BTN_BACK, hw.down);
  528. }
  529. for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++)
  530. input_report_key(dev, BTN_0 + i, hw.ext_buttons & (1 << i));
  531. input_sync(dev);
  532. }
  533. static int synaptics_validate_byte(unsigned char packet[], int idx, unsigned char pkt_type)
  534. {
  535. static const unsigned char newabs_mask[] = { 0xC8, 0x00, 0x00, 0xC8, 0x00 };
  536. static const unsigned char newabs_rel_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
  537. static const unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
  538. static const unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
  539. static const unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
  540. if (idx < 0 || idx > 4)
  541. return 0;
  542. switch (pkt_type) {
  543. case SYN_NEWABS:
  544. case SYN_NEWABS_RELAXED:
  545. return (packet[idx] & newabs_rel_mask[idx]) == newabs_rslt[idx];
  546. case SYN_NEWABS_STRICT:
  547. return (packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
  548. case SYN_OLDABS:
  549. return (packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
  550. default:
  551. printk(KERN_ERR "synaptics: unknown packet type %d\n", pkt_type);
  552. return 0;
  553. }
  554. }
  555. static unsigned char synaptics_detect_pkt_type(struct psmouse *psmouse)
  556. {
  557. int i;
  558. for (i = 0; i < 5; i++)
  559. if (!synaptics_validate_byte(psmouse->packet, i, SYN_NEWABS_STRICT)) {
  560. printk(KERN_INFO "synaptics: using relaxed packet validation\n");
  561. return SYN_NEWABS_RELAXED;
  562. }
  563. return SYN_NEWABS_STRICT;
  564. }
  565. static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse)
  566. {
  567. struct synaptics_data *priv = psmouse->private;
  568. if (psmouse->pktcnt >= 6) { /* Full packet received */
  569. if (unlikely(priv->pkt_type == SYN_NEWABS))
  570. priv->pkt_type = synaptics_detect_pkt_type(psmouse);
  571. if (SYN_CAP_PASS_THROUGH(priv->capabilities) &&
  572. synaptics_is_pt_packet(psmouse->packet)) {
  573. if (priv->pt_port)
  574. synaptics_pass_pt_packet(priv->pt_port, psmouse->packet);
  575. } else
  576. synaptics_process_packet(psmouse);
  577. return PSMOUSE_FULL_PACKET;
  578. }
  579. return synaptics_validate_byte(psmouse->packet, psmouse->pktcnt - 1, priv->pkt_type) ?
  580. PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA;
  581. }
  582. /*****************************************************************************
  583. * Driver initialization/cleanup functions
  584. ****************************************************************************/
  585. static void set_input_params(struct input_dev *dev, struct synaptics_data *priv)
  586. {
  587. int i;
  588. int fuzz = SYN_CAP_REDUCED_FILTERING(priv->ext_cap_0c) ?
  589. SYN_REDUCED_FILTER_FUZZ : 0;
  590. __set_bit(INPUT_PROP_POINTER, dev->propbit);
  591. __set_bit(EV_ABS, dev->evbit);
  592. input_set_abs_params(dev, ABS_X,
  593. priv->x_min ?: XMIN_NOMINAL,
  594. priv->x_max ?: XMAX_NOMINAL,
  595. fuzz, 0);
  596. input_set_abs_params(dev, ABS_Y,
  597. priv->y_min ?: YMIN_NOMINAL,
  598. priv->y_max ?: YMAX_NOMINAL,
  599. fuzz, 0);
  600. input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0);
  601. if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c)) {
  602. __set_bit(INPUT_PROP_SEMI_MT, dev->propbit);
  603. input_mt_init_slots(dev, 2);
  604. input_set_abs_params(dev, ABS_MT_POSITION_X,
  605. priv->x_min ?: XMIN_NOMINAL,
  606. priv->x_max ?: XMAX_NOMINAL,
  607. fuzz, 0);
  608. input_set_abs_params(dev, ABS_MT_POSITION_Y,
  609. priv->y_min ?: YMIN_NOMINAL,
  610. priv->y_max ?: YMAX_NOMINAL,
  611. fuzz, 0);
  612. input_abs_set_res(dev, ABS_MT_POSITION_X, priv->x_res);
  613. input_abs_set_res(dev, ABS_MT_POSITION_Y, priv->y_res);
  614. }
  615. if (SYN_CAP_PALMDETECT(priv->capabilities))
  616. input_set_abs_params(dev, ABS_TOOL_WIDTH, 0, 15, 0, 0);
  617. __set_bit(EV_KEY, dev->evbit);
  618. __set_bit(BTN_TOUCH, dev->keybit);
  619. __set_bit(BTN_TOOL_FINGER, dev->keybit);
  620. __set_bit(BTN_LEFT, dev->keybit);
  621. __set_bit(BTN_RIGHT, dev->keybit);
  622. if (SYN_CAP_MULTIFINGER(priv->capabilities)) {
  623. __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit);
  624. __set_bit(BTN_TOOL_TRIPLETAP, dev->keybit);
  625. }
  626. if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities))
  627. __set_bit(BTN_MIDDLE, dev->keybit);
  628. if (SYN_CAP_FOUR_BUTTON(priv->capabilities) ||
  629. SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) {
  630. __set_bit(BTN_FORWARD, dev->keybit);
  631. __set_bit(BTN_BACK, dev->keybit);
  632. }
  633. for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++)
  634. __set_bit(BTN_0 + i, dev->keybit);
  635. __clear_bit(EV_REL, dev->evbit);
  636. __clear_bit(REL_X, dev->relbit);
  637. __clear_bit(REL_Y, dev->relbit);
  638. input_abs_set_res(dev, ABS_X, priv->x_res);
  639. input_abs_set_res(dev, ABS_Y, priv->y_res);
  640. if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
  641. __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
  642. /* Clickpads report only left button */
  643. __clear_bit(BTN_RIGHT, dev->keybit);
  644. __clear_bit(BTN_MIDDLE, dev->keybit);
  645. }
  646. }
  647. static void synaptics_disconnect(struct psmouse *psmouse)
  648. {
  649. synaptics_reset(psmouse);
  650. kfree(psmouse->private);
  651. psmouse->private = NULL;
  652. }
  653. static int synaptics_reconnect(struct psmouse *psmouse)
  654. {
  655. struct synaptics_data *priv = psmouse->private;
  656. struct synaptics_data old_priv = *priv;
  657. int retry = 0;
  658. int error;
  659. do {
  660. psmouse_reset(psmouse);
  661. error = synaptics_detect(psmouse, 0);
  662. } while (error && ++retry < 3);
  663. if (error)
  664. return -1;
  665. if (retry > 1)
  666. printk(KERN_DEBUG "Synaptics reconnected after %d tries\n",
  667. retry);
  668. if (synaptics_query_hardware(psmouse)) {
  669. printk(KERN_ERR "Unable to query Synaptics hardware.\n");
  670. return -1;
  671. }
  672. if (synaptics_set_absolute_mode(psmouse)) {
  673. printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
  674. return -1;
  675. }
  676. if (synaptics_set_advanced_gesture_mode(psmouse)) {
  677. printk(KERN_ERR "Advanced gesture mode reconnect failed.\n");
  678. return -1;
  679. }
  680. if (old_priv.identity != priv->identity ||
  681. old_priv.model_id != priv->model_id ||
  682. old_priv.capabilities != priv->capabilities ||
  683. old_priv.ext_cap != priv->ext_cap) {
  684. printk(KERN_ERR "Synaptics hardware appears to be different: "
  685. "id(%ld-%ld), model(%ld-%ld), caps(%lx-%lx), ext(%lx-%lx).\n",
  686. old_priv.identity, priv->identity,
  687. old_priv.model_id, priv->model_id,
  688. old_priv.capabilities, priv->capabilities,
  689. old_priv.ext_cap, priv->ext_cap);
  690. return -1;
  691. }
  692. return 0;
  693. }
  694. static bool impaired_toshiba_kbc;
  695. static const struct dmi_system_id __initconst toshiba_dmi_table[] = {
  696. #if defined(CONFIG_DMI) && defined(CONFIG_X86)
  697. {
  698. /* Toshiba Satellite */
  699. .matches = {
  700. DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  701. DMI_MATCH(DMI_PRODUCT_NAME, "Satellite"),
  702. },
  703. },
  704. {
  705. /* Toshiba Dynabook */
  706. .matches = {
  707. DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  708. DMI_MATCH(DMI_PRODUCT_NAME, "dynabook"),
  709. },
  710. },
  711. {
  712. /* Toshiba Portege M300 */
  713. .matches = {
  714. DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  715. DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"),
  716. },
  717. },
  718. {
  719. /* Toshiba Portege M300 */
  720. .matches = {
  721. DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  722. DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"),
  723. DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"),
  724. },
  725. },
  726. #endif
  727. { }
  728. };
  729. static bool broken_olpc_ec;
  730. static const struct dmi_system_id __initconst olpc_dmi_table[] = {
  731. #if defined(CONFIG_DMI) && defined(CONFIG_OLPC)
  732. {
  733. /* OLPC XO-1 or XO-1.5 */
  734. .matches = {
  735. DMI_MATCH(DMI_SYS_VENDOR, "OLPC"),
  736. DMI_MATCH(DMI_PRODUCT_NAME, "XO"),
  737. },
  738. },
  739. #endif
  740. { }
  741. };
  742. void __init synaptics_module_init(void)
  743. {
  744. impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
  745. broken_olpc_ec = dmi_check_system(olpc_dmi_table);
  746. }
  747. int synaptics_init(struct psmouse *psmouse)
  748. {
  749. struct synaptics_data *priv;
  750. /*
  751. * The OLPC XO has issues with Synaptics' absolute mode; similarly to
  752. * the HGPK, it quickly degrades and the hardware becomes jumpy and
  753. * overly sensitive. Not only that, but the constant packet spew
  754. * (even at a lowered 40pps rate) overloads the EC such that key
  755. * presses on the keyboard are missed. Given all of that, don't
  756. * even attempt to use Synaptics mode. Relative mode seems to work
  757. * just fine.
  758. */
  759. if (broken_olpc_ec) {
  760. printk(KERN_INFO "synaptics: OLPC XO detected, not enabling Synaptics protocol.\n");
  761. return -ENODEV;
  762. }
  763. psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL);
  764. if (!priv)
  765. return -ENOMEM;
  766. psmouse_reset(psmouse);
  767. if (synaptics_query_hardware(psmouse)) {
  768. printk(KERN_ERR "Unable to query Synaptics hardware.\n");
  769. goto init_fail;
  770. }
  771. if (synaptics_set_absolute_mode(psmouse)) {
  772. printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
  773. goto init_fail;
  774. }
  775. if (synaptics_set_advanced_gesture_mode(psmouse)) {
  776. printk(KERN_ERR "Advanced gesture mode init failed.\n");
  777. goto init_fail;
  778. }
  779. priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
  780. printk(KERN_INFO "Synaptics Touchpad, model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx/%#lx\n",
  781. SYN_ID_MODEL(priv->identity),
  782. SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity),
  783. priv->model_id, priv->capabilities, priv->ext_cap, priv->ext_cap_0c);
  784. set_input_params(psmouse->dev, priv);
  785. /*
  786. * Encode touchpad model so that it can be used to set
  787. * input device->id.version and be visible to userspace.
  788. * Because version is __u16 we have to drop something.
  789. * Hardware info bits seem to be good candidates as they
  790. * are documented to be for Synaptics corp. internal use.
  791. */
  792. psmouse->model = ((priv->model_id & 0x00ff0000) >> 8) |
  793. (priv->model_id & 0x000000ff);
  794. psmouse->protocol_handler = synaptics_process_byte;
  795. psmouse->set_rate = synaptics_set_rate;
  796. psmouse->disconnect = synaptics_disconnect;
  797. psmouse->reconnect = synaptics_reconnect;
  798. psmouse->cleanup = synaptics_reset;
  799. psmouse->pktsize = 6;
  800. /* Synaptics can usually stay in sync without extra help */
  801. psmouse->resync_time = 0;
  802. if (SYN_CAP_PASS_THROUGH(priv->capabilities))
  803. synaptics_pt_create(psmouse);
  804. /*
  805. * Toshiba's KBC seems to have trouble handling data from
  806. * Synaptics at full rate. Switch to a lower rate (roughly
  807. * the same rate as a standard PS/2 mouse).
  808. */
  809. if (psmouse->rate >= 80 && impaired_toshiba_kbc) {
  810. printk(KERN_INFO "synaptics: Toshiba %s detected, limiting rate to 40pps.\n",
  811. dmi_get_system_info(DMI_PRODUCT_NAME));
  812. psmouse->rate = 40;
  813. }
  814. return 0;
  815. init_fail:
  816. kfree(priv);
  817. return -1;
  818. }
  819. bool synaptics_supported(void)
  820. {
  821. return true;
  822. }
  823. #else /* CONFIG_MOUSE_PS2_SYNAPTICS */
  824. void __init synaptics_module_init(void)
  825. {
  826. }
  827. int synaptics_init(struct psmouse *psmouse)
  828. {
  829. return -ENOSYS;
  830. }
  831. bool synaptics_supported(void)
  832. {
  833. return false;
  834. }
  835. #endif /* CONFIG_MOUSE_PS2_SYNAPTICS */