i8042-x86ia64io.h 25 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097
  1. #ifndef _I8042_X86IA64IO_H
  2. #define _I8042_X86IA64IO_H
  3. /*
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU General Public License version 2 as published by
  6. * the Free Software Foundation.
  7. */
  8. #ifdef CONFIG_X86
  9. #include <asm/x86_init.h>
  10. #endif
  11. /*
  12. * Names.
  13. */
  14. #define I8042_KBD_PHYS_DESC "isa0060/serio0"
  15. #define I8042_AUX_PHYS_DESC "isa0060/serio1"
  16. #define I8042_MUX_PHYS_DESC "isa0060/serio%d"
  17. /*
  18. * IRQs.
  19. */
  20. #if defined(__ia64__)
  21. # define I8042_MAP_IRQ(x) isa_irq_to_vector((x))
  22. #else
  23. # define I8042_MAP_IRQ(x) (x)
  24. #endif
  25. #define I8042_KBD_IRQ i8042_kbd_irq
  26. #define I8042_AUX_IRQ i8042_aux_irq
  27. static int i8042_kbd_irq;
  28. static int i8042_aux_irq;
  29. /*
  30. * Register numbers.
  31. */
  32. #define I8042_COMMAND_REG i8042_command_reg
  33. #define I8042_STATUS_REG i8042_command_reg
  34. #define I8042_DATA_REG i8042_data_reg
  35. static int i8042_command_reg = 0x64;
  36. static int i8042_data_reg = 0x60;
  37. static inline int i8042_read_data(void)
  38. {
  39. return inb(I8042_DATA_REG);
  40. }
  41. static inline int i8042_read_status(void)
  42. {
  43. return inb(I8042_STATUS_REG);
  44. }
  45. static inline void i8042_write_data(int val)
  46. {
  47. outb(val, I8042_DATA_REG);
  48. }
  49. static inline void i8042_write_command(int val)
  50. {
  51. outb(val, I8042_COMMAND_REG);
  52. }
  53. #ifdef CONFIG_X86
  54. #include <linux/dmi.h>
  55. static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
  56. {
  57. /*
  58. * Arima-Rioworks HDAMB -
  59. * AUX LOOP command does not raise AUX IRQ
  60. */
  61. .matches = {
  62. DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),
  63. DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),
  64. DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),
  65. },
  66. },
  67. {
  68. /* ASUS G1S */
  69. .matches = {
  70. DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
  71. DMI_MATCH(DMI_BOARD_NAME, "G1S"),
  72. DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
  73. },
  74. },
  75. {
  76. /* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */
  77. .matches = {
  78. DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
  79. DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"),
  80. DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"),
  81. },
  82. },
  83. {
  84. .matches = {
  85. DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
  86. DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"),
  87. },
  88. },
  89. {
  90. .matches = {
  91. DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
  92. DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
  93. DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),
  94. },
  95. },
  96. {
  97. .matches = {
  98. DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
  99. DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
  100. DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
  101. },
  102. },
  103. {
  104. /* OQO Model 01 */
  105. .matches = {
  106. DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
  107. DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
  108. DMI_MATCH(DMI_PRODUCT_VERSION, "00"),
  109. },
  110. },
  111. {
  112. /* ULI EV4873 - AUX LOOP does not work properly */
  113. .matches = {
  114. DMI_MATCH(DMI_SYS_VENDOR, "ULI"),
  115. DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"),
  116. DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
  117. },
  118. },
  119. {
  120. /* Microsoft Virtual Machine */
  121. .matches = {
  122. DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
  123. DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
  124. DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
  125. },
  126. },
  127. {
  128. /* Medion MAM 2070 */
  129. .matches = {
  130. DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
  131. DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),
  132. DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
  133. },
  134. },
  135. {
  136. /* Medion Akoya E7225 */
  137. .matches = {
  138. DMI_MATCH(DMI_SYS_VENDOR, "Medion"),
  139. DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"),
  140. DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"),
  141. },
  142. },
  143. {
  144. /* Blue FB5601 */
  145. .matches = {
  146. DMI_MATCH(DMI_SYS_VENDOR, "blue"),
  147. DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
  148. DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
  149. },
  150. },
  151. {
  152. /* Gigabyte M912 */
  153. .matches = {
  154. DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  155. DMI_MATCH(DMI_PRODUCT_NAME, "M912"),
  156. DMI_MATCH(DMI_PRODUCT_VERSION, "01"),
  157. },
  158. },
  159. {
  160. /* Gigabyte M1022M netbook */
  161. .matches = {
  162. DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."),
  163. DMI_MATCH(DMI_BOARD_NAME, "M1022E"),
  164. DMI_MATCH(DMI_BOARD_VERSION, "1.02"),
  165. },
  166. },
  167. {
  168. /* Gigabyte Spring Peak - defines wrong chassis type */
  169. .matches = {
  170. DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  171. DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"),
  172. },
  173. },
  174. {
  175. /* Gigabyte T1005 - defines wrong chassis type ("Other") */
  176. .matches = {
  177. DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  178. DMI_MATCH(DMI_PRODUCT_NAME, "T1005"),
  179. },
  180. },
  181. {
  182. /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */
  183. .matches = {
  184. DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  185. DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"),
  186. },
  187. },
  188. {
  189. .matches = {
  190. DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  191. DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),
  192. DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"),
  193. },
  194. },
  195. { }
  196. };
  197. /*
  198. * Some Fujitsu notebooks are having trouble with touchpads if
  199. * active multiplexing mode is activated. Luckily they don't have
  200. * external PS/2 ports so we can safely disable it.
  201. * ... apparently some Toshibas don't like MUX mode either and
  202. * die horrible death on reboot.
  203. */
  204. static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
  205. {
  206. /* Fujitsu Lifebook P7010/P7010D */
  207. .matches = {
  208. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  209. DMI_MATCH(DMI_PRODUCT_NAME, "P7010"),
  210. },
  211. },
  212. {
  213. /* Fujitsu Lifebook P7010 */
  214. .matches = {
  215. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  216. DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"),
  217. },
  218. },
  219. {
  220. /* Fujitsu Lifebook P5020D */
  221. .matches = {
  222. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  223. DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"),
  224. },
  225. },
  226. {
  227. /* Fujitsu Lifebook S2000 */
  228. .matches = {
  229. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  230. DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),
  231. },
  232. },
  233. {
  234. /* Fujitsu Lifebook S6230 */
  235. .matches = {
  236. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  237. DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
  238. },
  239. },
  240. {
  241. /* Fujitsu T70H */
  242. .matches = {
  243. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  244. DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
  245. },
  246. },
  247. {
  248. /* Fujitsu-Siemens Lifebook T3010 */
  249. .matches = {
  250. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  251. DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
  252. },
  253. },
  254. {
  255. /* Fujitsu-Siemens Lifebook E4010 */
  256. .matches = {
  257. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  258. DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),
  259. },
  260. },
  261. {
  262. /* Fujitsu-Siemens Amilo Pro 2010 */
  263. .matches = {
  264. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  265. DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),
  266. },
  267. },
  268. {
  269. /* Fujitsu-Siemens Amilo Pro 2030 */
  270. .matches = {
  271. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  272. DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
  273. },
  274. },
  275. {
  276. /*
  277. * No data is coming from the touchscreen unless KBC
  278. * is in legacy mode.
  279. */
  280. /* Panasonic CF-29 */
  281. .matches = {
  282. DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
  283. DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"),
  284. },
  285. },
  286. {
  287. /*
  288. * HP Pavilion DV4017EA -
  289. * errors on MUX ports are reported without raising AUXDATA
  290. * causing "spurious NAK" messages.
  291. */
  292. .matches = {
  293. DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  294. DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),
  295. },
  296. },
  297. {
  298. /*
  299. * HP Pavilion ZT1000 -
  300. * like DV4017EA does not raise AUXERR for errors on MUX ports.
  301. */
  302. .matches = {
  303. DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  304. DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
  305. DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
  306. },
  307. },
  308. {
  309. /*
  310. * HP Pavilion DV4270ca -
  311. * like DV4017EA does not raise AUXERR for errors on MUX ports.
  312. */
  313. .matches = {
  314. DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  315. DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"),
  316. },
  317. },
  318. {
  319. .matches = {
  320. DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  321. DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
  322. },
  323. },
  324. {
  325. .matches = {
  326. DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  327. DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"),
  328. },
  329. },
  330. {
  331. .matches = {
  332. DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  333. DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"),
  334. },
  335. },
  336. {
  337. .matches = {
  338. DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),
  339. DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),
  340. },
  341. },
  342. {
  343. /* Sharp Actius MM20 */
  344. .matches = {
  345. DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),
  346. DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"),
  347. },
  348. },
  349. {
  350. /* Sony Vaio FS-115b */
  351. .matches = {
  352. DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
  353. DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"),
  354. },
  355. },
  356. {
  357. /*
  358. * Sony Vaio FZ-240E -
  359. * reset and GET ID commands issued via KBD port are
  360. * sometimes being delivered to AUX3.
  361. */
  362. .matches = {
  363. DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
  364. DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"),
  365. },
  366. },
  367. {
  368. /*
  369. * Most (all?) VAIOs do not have external PS/2 ports nor
  370. * they implement active multiplexing properly, and
  371. * MUX discovery usually messes up keyboard/touchpad.
  372. */
  373. .matches = {
  374. DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
  375. DMI_MATCH(DMI_BOARD_NAME, "VAIO"),
  376. },
  377. },
  378. {
  379. /* Amoi M636/A737 */
  380. .matches = {
  381. DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."),
  382. DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),
  383. },
  384. },
  385. {
  386. /* Lenovo 3000 n100 */
  387. .matches = {
  388. DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
  389. DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),
  390. },
  391. },
  392. {
  393. .matches = {
  394. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  395. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
  396. },
  397. },
  398. {
  399. /* Acer Aspire 5710 */
  400. .matches = {
  401. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  402. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"),
  403. },
  404. },
  405. {
  406. /* Acer Aspire 7738 */
  407. .matches = {
  408. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  409. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"),
  410. },
  411. },
  412. {
  413. /* Gericom Bellagio */
  414. .matches = {
  415. DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
  416. DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
  417. },
  418. },
  419. {
  420. /* IBM 2656 */
  421. .matches = {
  422. DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
  423. DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
  424. },
  425. },
  426. {
  427. /* Dell XPS M1530 */
  428. .matches = {
  429. DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  430. DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
  431. },
  432. },
  433. {
  434. /* Compal HEL80I */
  435. .matches = {
  436. DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
  437. DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
  438. },
  439. },
  440. {
  441. /* Dell Vostro 1510 */
  442. .matches = {
  443. DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  444. DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"),
  445. },
  446. },
  447. {
  448. /* Acer Aspire 5536 */
  449. .matches = {
  450. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  451. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"),
  452. DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),
  453. },
  454. },
  455. {
  456. /* Dell Vostro V13 */
  457. .matches = {
  458. DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  459. DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
  460. },
  461. },
  462. {
  463. /* Newer HP Pavilion dv4 models */
  464. .matches = {
  465. DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  466. DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
  467. },
  468. },
  469. {
  470. /* Asus X450LCP */
  471. .matches = {
  472. DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
  473. DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"),
  474. },
  475. },
  476. {
  477. /* Avatar AVIU-145A6 */
  478. .matches = {
  479. DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
  480. DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
  481. },
  482. },
  483. { }
  484. };
  485. static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
  486. {
  487. /* MSI Wind U-100 */
  488. .matches = {
  489. DMI_MATCH(DMI_BOARD_NAME, "U-100"),
  490. DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
  491. },
  492. },
  493. {
  494. /* LG Electronics X110 */
  495. .matches = {
  496. DMI_MATCH(DMI_BOARD_NAME, "X110"),
  497. DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."),
  498. },
  499. },
  500. {
  501. /* Acer Aspire One 150 */
  502. .matches = {
  503. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  504. DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),
  505. },
  506. },
  507. {
  508. /* Advent 4211 */
  509. .matches = {
  510. DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"),
  511. DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"),
  512. },
  513. },
  514. {
  515. /* Medion Akoya Mini E1210 */
  516. .matches = {
  517. DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
  518. DMI_MATCH(DMI_PRODUCT_NAME, "E1210"),
  519. },
  520. },
  521. {
  522. /* Medion Akoya E1222 */
  523. .matches = {
  524. DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
  525. DMI_MATCH(DMI_PRODUCT_NAME, "E122X"),
  526. },
  527. },
  528. {
  529. /* Mivvy M310 */
  530. .matches = {
  531. DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"),
  532. DMI_MATCH(DMI_PRODUCT_NAME, "N10"),
  533. },
  534. },
  535. {
  536. /* Dell Vostro 1320 */
  537. .matches = {
  538. DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  539. DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"),
  540. },
  541. },
  542. {
  543. /* Dell Vostro 1520 */
  544. .matches = {
  545. DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  546. DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"),
  547. },
  548. },
  549. {
  550. /* Dell Vostro 1720 */
  551. .matches = {
  552. DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  553. DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"),
  554. },
  555. },
  556. {
  557. /* Lenovo Ideapad U455 */
  558. .matches = {
  559. DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
  560. DMI_MATCH(DMI_PRODUCT_NAME, "20046"),
  561. },
  562. },
  563. { }
  564. };
  565. #ifdef CONFIG_PNP
  566. static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = {
  567. {
  568. /* Intel MBO Desktop D845PESV */
  569. .matches = {
  570. DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
  571. DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
  572. },
  573. },
  574. {
  575. /* MSI Wind U-100 */
  576. .matches = {
  577. DMI_MATCH(DMI_BOARD_NAME, "U-100"),
  578. DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
  579. },
  580. },
  581. { }
  582. };
  583. static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = {
  584. {
  585. .matches = {
  586. DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
  587. },
  588. },
  589. {
  590. .matches = {
  591. DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */
  592. },
  593. },
  594. {
  595. .matches = {
  596. DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
  597. },
  598. },
  599. {
  600. .matches = {
  601. DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */
  602. },
  603. },
  604. { }
  605. };
  606. #endif
  607. static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
  608. {
  609. /* Dell Vostro V13 */
  610. .matches = {
  611. DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  612. DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
  613. },
  614. },
  615. {
  616. /* Newer HP Pavilion dv4 models */
  617. .matches = {
  618. DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  619. DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
  620. },
  621. },
  622. {
  623. /* Fujitsu A544 laptop */
  624. /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */
  625. .matches = {
  626. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  627. DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"),
  628. },
  629. },
  630. {
  631. /* Fujitsu AH544 laptop */
  632. /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
  633. .matches = {
  634. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  635. DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
  636. },
  637. },
  638. {
  639. /* Fujitsu U574 laptop */
  640. /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
  641. .matches = {
  642. DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  643. DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
  644. },
  645. },
  646. { }
  647. };
  648. /*
  649. * Some Wistron based laptops need us to explicitly enable the 'Dritek
  650. * keyboard extension' to make their extra keys start generating scancodes.
  651. * Originally, this was just confined to older laptops, but a few Acer laptops
  652. * have turned up in 2007 that also need this again.
  653. */
  654. static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = {
  655. {
  656. /* Acer Aspire 5100 */
  657. .matches = {
  658. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  659. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
  660. },
  661. },
  662. {
  663. /* Acer Aspire 5610 */
  664. .matches = {
  665. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  666. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
  667. },
  668. },
  669. {
  670. /* Acer Aspire 5630 */
  671. .matches = {
  672. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  673. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"),
  674. },
  675. },
  676. {
  677. /* Acer Aspire 5650 */
  678. .matches = {
  679. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  680. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"),
  681. },
  682. },
  683. {
  684. /* Acer Aspire 5680 */
  685. .matches = {
  686. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  687. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"),
  688. },
  689. },
  690. {
  691. /* Acer Aspire 5720 */
  692. .matches = {
  693. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  694. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
  695. },
  696. },
  697. {
  698. /* Acer Aspire 9110 */
  699. .matches = {
  700. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  701. DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"),
  702. },
  703. },
  704. {
  705. /* Acer TravelMate 660 */
  706. .matches = {
  707. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  708. DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"),
  709. },
  710. },
  711. {
  712. /* Acer TravelMate 2490 */
  713. .matches = {
  714. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  715. DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),
  716. },
  717. },
  718. {
  719. /* Acer TravelMate 4280 */
  720. .matches = {
  721. DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  722. DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"),
  723. },
  724. },
  725. { }
  726. };
  727. /*
  728. * Some laptops need keyboard reset before probing for the trackpad to get
  729. * it detected, initialised & finally work.
  730. */
  731. static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = {
  732. {
  733. /* Gigabyte P35 v2 - Elantech touchpad */
  734. .matches = {
  735. DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  736. DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"),
  737. },
  738. },
  739. {
  740. /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */
  741. .matches = {
  742. DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  743. DMI_MATCH(DMI_PRODUCT_NAME, "X3"),
  744. },
  745. },
  746. {
  747. /* Gigabyte P34 - Elantech touchpad */
  748. .matches = {
  749. DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  750. DMI_MATCH(DMI_PRODUCT_NAME, "P34"),
  751. },
  752. },
  753. { }
  754. };
  755. #endif /* CONFIG_X86 */
  756. #ifdef CONFIG_PNP
  757. #include <linux/pnp.h>
  758. static bool i8042_pnp_kbd_registered;
  759. static unsigned int i8042_pnp_kbd_devices;
  760. static bool i8042_pnp_aux_registered;
  761. static unsigned int i8042_pnp_aux_devices;
  762. static int i8042_pnp_command_reg;
  763. static int i8042_pnp_data_reg;
  764. static int i8042_pnp_kbd_irq;
  765. static int i8042_pnp_aux_irq;
  766. static char i8042_pnp_kbd_name[32];
  767. static char i8042_pnp_aux_name[32];
  768. static void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size)
  769. {
  770. strlcpy(dst, "PNP:", dst_size);
  771. while (id) {
  772. strlcat(dst, " ", dst_size);
  773. strlcat(dst, id->id, dst_size);
  774. id = id->next;
  775. }
  776. }
  777. static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
  778. {
  779. if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
  780. i8042_pnp_data_reg = pnp_port_start(dev,0);
  781. if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
  782. i8042_pnp_command_reg = pnp_port_start(dev, 1);
  783. if (pnp_irq_valid(dev,0))
  784. i8042_pnp_kbd_irq = pnp_irq(dev, 0);
  785. strlcpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name));
  786. if (strlen(pnp_dev_name(dev))) {
  787. strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name));
  788. strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name));
  789. }
  790. i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id,
  791. sizeof(i8042_kbd_firmware_id));
  792. /* Keyboard ports are always supposed to be wakeup-enabled */
  793. device_set_wakeup_enable(&dev->dev, true);
  794. i8042_pnp_kbd_devices++;
  795. return 0;
  796. }
  797. static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
  798. {
  799. if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
  800. i8042_pnp_data_reg = pnp_port_start(dev,0);
  801. if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
  802. i8042_pnp_command_reg = pnp_port_start(dev, 1);
  803. if (pnp_irq_valid(dev, 0))
  804. i8042_pnp_aux_irq = pnp_irq(dev, 0);
  805. strlcpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name));
  806. if (strlen(pnp_dev_name(dev))) {
  807. strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name));
  808. strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name));
  809. }
  810. i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id,
  811. sizeof(i8042_aux_firmware_id));
  812. i8042_pnp_aux_devices++;
  813. return 0;
  814. }
  815. static struct pnp_device_id pnp_kbd_devids[] = {
  816. { .id = "PNP0300", .driver_data = 0 },
  817. { .id = "PNP0301", .driver_data = 0 },
  818. { .id = "PNP0302", .driver_data = 0 },
  819. { .id = "PNP0303", .driver_data = 0 },
  820. { .id = "PNP0304", .driver_data = 0 },
  821. { .id = "PNP0305", .driver_data = 0 },
  822. { .id = "PNP0306", .driver_data = 0 },
  823. { .id = "PNP0309", .driver_data = 0 },
  824. { .id = "PNP030a", .driver_data = 0 },
  825. { .id = "PNP030b", .driver_data = 0 },
  826. { .id = "PNP0320", .driver_data = 0 },
  827. { .id = "PNP0343", .driver_data = 0 },
  828. { .id = "PNP0344", .driver_data = 0 },
  829. { .id = "PNP0345", .driver_data = 0 },
  830. { .id = "CPQA0D7", .driver_data = 0 },
  831. { .id = "", },
  832. };
  833. MODULE_DEVICE_TABLE(pnp, pnp_kbd_devids);
  834. static struct pnp_driver i8042_pnp_kbd_driver = {
  835. .name = "i8042 kbd",
  836. .id_table = pnp_kbd_devids,
  837. .probe = i8042_pnp_kbd_probe,
  838. };
  839. static struct pnp_device_id pnp_aux_devids[] = {
  840. { .id = "AUI0200", .driver_data = 0 },
  841. { .id = "FJC6000", .driver_data = 0 },
  842. { .id = "FJC6001", .driver_data = 0 },
  843. { .id = "PNP0f03", .driver_data = 0 },
  844. { .id = "PNP0f0b", .driver_data = 0 },
  845. { .id = "PNP0f0e", .driver_data = 0 },
  846. { .id = "PNP0f12", .driver_data = 0 },
  847. { .id = "PNP0f13", .driver_data = 0 },
  848. { .id = "PNP0f19", .driver_data = 0 },
  849. { .id = "PNP0f1c", .driver_data = 0 },
  850. { .id = "SYN0801", .driver_data = 0 },
  851. { .id = "", },
  852. };
  853. MODULE_DEVICE_TABLE(pnp, pnp_aux_devids);
  854. static struct pnp_driver i8042_pnp_aux_driver = {
  855. .name = "i8042 aux",
  856. .id_table = pnp_aux_devids,
  857. .probe = i8042_pnp_aux_probe,
  858. };
  859. static void i8042_pnp_exit(void)
  860. {
  861. if (i8042_pnp_kbd_registered) {
  862. i8042_pnp_kbd_registered = false;
  863. pnp_unregister_driver(&i8042_pnp_kbd_driver);
  864. }
  865. if (i8042_pnp_aux_registered) {
  866. i8042_pnp_aux_registered = false;
  867. pnp_unregister_driver(&i8042_pnp_aux_driver);
  868. }
  869. }
  870. static int __init i8042_pnp_init(void)
  871. {
  872. char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 };
  873. bool pnp_data_busted = false;
  874. int err;
  875. #ifdef CONFIG_X86
  876. if (dmi_check_system(i8042_dmi_nopnp_table))
  877. i8042_nopnp = true;
  878. #endif
  879. if (i8042_nopnp) {
  880. pr_info("PNP detection disabled\n");
  881. return 0;
  882. }
  883. err = pnp_register_driver(&i8042_pnp_kbd_driver);
  884. if (!err)
  885. i8042_pnp_kbd_registered = true;
  886. err = pnp_register_driver(&i8042_pnp_aux_driver);
  887. if (!err)
  888. i8042_pnp_aux_registered = true;
  889. if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) {
  890. i8042_pnp_exit();
  891. #if defined(__ia64__)
  892. return -ENODEV;
  893. #else
  894. pr_info("PNP: No PS/2 controller found. Probing ports directly.\n");
  895. return 0;
  896. #endif
  897. }
  898. if (i8042_pnp_kbd_devices)
  899. snprintf(kbd_irq_str, sizeof(kbd_irq_str),
  900. "%d", i8042_pnp_kbd_irq);
  901. if (i8042_pnp_aux_devices)
  902. snprintf(aux_irq_str, sizeof(aux_irq_str),
  903. "%d", i8042_pnp_aux_irq);
  904. pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n",
  905. i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
  906. i8042_pnp_aux_name,
  907. i8042_pnp_data_reg, i8042_pnp_command_reg,
  908. kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
  909. aux_irq_str);
  910. #if defined(__ia64__)
  911. if (!i8042_pnp_kbd_devices)
  912. i8042_nokbd = true;
  913. if (!i8042_pnp_aux_devices)
  914. i8042_noaux = true;
  915. #endif
  916. if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) &&
  917. i8042_pnp_data_reg != i8042_data_reg) ||
  918. !i8042_pnp_data_reg) {
  919. pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n",
  920. i8042_pnp_data_reg, i8042_data_reg);
  921. i8042_pnp_data_reg = i8042_data_reg;
  922. pnp_data_busted = true;
  923. }
  924. if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) &&
  925. i8042_pnp_command_reg != i8042_command_reg) ||
  926. !i8042_pnp_command_reg) {
  927. pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n",
  928. i8042_pnp_command_reg, i8042_command_reg);
  929. i8042_pnp_command_reg = i8042_command_reg;
  930. pnp_data_busted = true;
  931. }
  932. if (!i8042_nokbd && !i8042_pnp_kbd_irq) {
  933. pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n",
  934. i8042_kbd_irq);
  935. i8042_pnp_kbd_irq = i8042_kbd_irq;
  936. pnp_data_busted = true;
  937. }
  938. if (!i8042_noaux && !i8042_pnp_aux_irq) {
  939. if (!pnp_data_busted && i8042_pnp_kbd_irq) {
  940. pr_warn("PNP: PS/2 appears to have AUX port disabled, "
  941. "if this is incorrect please boot with i8042.nopnp\n");
  942. i8042_noaux = true;
  943. } else {
  944. pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n",
  945. i8042_aux_irq);
  946. i8042_pnp_aux_irq = i8042_aux_irq;
  947. }
  948. }
  949. i8042_data_reg = i8042_pnp_data_reg;
  950. i8042_command_reg = i8042_pnp_command_reg;
  951. i8042_kbd_irq = i8042_pnp_kbd_irq;
  952. i8042_aux_irq = i8042_pnp_aux_irq;
  953. #ifdef CONFIG_X86
  954. i8042_bypass_aux_irq_test = !pnp_data_busted &&
  955. dmi_check_system(i8042_dmi_laptop_table);
  956. #endif
  957. return 0;
  958. }
  959. #else
  960. static inline int i8042_pnp_init(void) { return 0; }
  961. static inline void i8042_pnp_exit(void) { }
  962. #endif
  963. static int __init i8042_platform_init(void)
  964. {
  965. int retval;
  966. #ifdef CONFIG_X86
  967. u8 a20_on = 0xdf;
  968. /* Just return if pre-detection shows no i8042 controller exist */
  969. if (!x86_platform.i8042_detect())
  970. return -ENODEV;
  971. #endif
  972. /*
  973. * On ix86 platforms touching the i8042 data register region can do really
  974. * bad things. Because of this the region is always reserved on ix86 boxes.
  975. *
  976. * if (!request_region(I8042_DATA_REG, 16, "i8042"))
  977. * return -EBUSY;
  978. */
  979. i8042_kbd_irq = I8042_MAP_IRQ(1);
  980. i8042_aux_irq = I8042_MAP_IRQ(12);
  981. retval = i8042_pnp_init();
  982. if (retval)
  983. return retval;
  984. #if defined(__ia64__)
  985. i8042_reset = true;
  986. #endif
  987. #ifdef CONFIG_X86
  988. if (dmi_check_system(i8042_dmi_reset_table))
  989. i8042_reset = true;
  990. if (dmi_check_system(i8042_dmi_noloop_table))
  991. i8042_noloop = true;
  992. if (dmi_check_system(i8042_dmi_nomux_table))
  993. i8042_nomux = true;
  994. if (dmi_check_system(i8042_dmi_notimeout_table))
  995. i8042_notimeout = true;
  996. if (dmi_check_system(i8042_dmi_dritek_table))
  997. i8042_dritek = true;
  998. if (dmi_check_system(i8042_dmi_kbdreset_table))
  999. i8042_kbdreset = true;
  1000. /*
  1001. * A20 was already enabled during early kernel init. But some buggy
  1002. * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to
  1003. * resume from S3. So we do it here and hope that nothing breaks.
  1004. */
  1005. i8042_command(&a20_on, 0x10d1);
  1006. i8042_command(NULL, 0x00ff); /* Null command for SMM firmware */
  1007. #endif /* CONFIG_X86 */
  1008. return retval;
  1009. }
  1010. static inline void i8042_platform_exit(void)
  1011. {
  1012. i8042_pnp_exit();
  1013. }
  1014. #endif /* _I8042_X86IA64IO_H */