pcikbd.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:33k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: pcikbd.c,v 1.61 2001/08/18 09:40:46 davem Exp $
  2.  * pcikbd.c: Ultra/AX PC keyboard support.
  3.  *
  4.  * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
  5.  * JavaStation support by Pete A. Zaitcev.
  6.  *
  7.  * This code is mainly put together from various places in
  8.  * drivers/char, please refer to these sources for credits
  9.  * to the original authors.
  10.  */
  11. #include <linux/config.h>
  12. #include <linux/module.h>
  13. #include <linux/kernel.h>
  14. #include <linux/sched.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/ioport.h>
  17. #include <linux/poll.h>
  18. #include <linux/slab.h>
  19. #include <linux/errno.h>
  20. #include <linux/random.h>
  21. #include <linux/miscdevice.h>
  22. #include <linux/kbd_ll.h>
  23. #include <linux/kbd_kern.h>
  24. #include <linux/vt_kern.h>
  25. #include <linux/delay.h>
  26. #include <linux/spinlock.h>
  27. #include <linux/smp_lock.h>
  28. #include <linux/init.h>
  29. #include <asm/ebus.h>
  30. #if (defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)) && defined(CONFIG_SPARC64)
  31. #include <asm/isa.h>
  32. #endif
  33. #include <asm/oplib.h>
  34. #include <asm/irq.h>
  35. #include <asm/io.h>
  36. #include <asm/uaccess.h>
  37. /*
  38.  * Different platforms provide different permutations of names.
  39.  * AXi - kb_ps2, kdmouse.
  40.  * MrCoffee - keyboard, mouse.
  41.  * Espresso - keyboard, kdmouse.
  42.  */
  43. #define PCI_KB_NAME1 "kb_ps2"
  44. #define PCI_KB_NAME2 "keyboard"
  45. #define PCI_MS_NAME1 "kdmouse"
  46. #define PCI_MS_NAME2 "mouse"
  47. #include "pcikbd.h"
  48. #include "sunserial.h"
  49. #ifndef __sparc_v9__
  50. static int pcikbd_mrcoffee = 0;
  51. #else
  52. #define pcikbd_mrcoffee 0
  53. extern void (*prom_keyboard)(void);
  54. #endif
  55. static unsigned long pcikbd_iobase = 0;
  56. static unsigned int pcikbd_irq = 0;
  57. /* used only by send_data - set by keyboard_interrupt */
  58. static volatile unsigned char reply_expected = 0;
  59. static volatile unsigned char acknowledge = 0;
  60. static volatile unsigned char resend = 0;
  61. static spinlock_t pcikbd_lock = SPIN_LOCK_UNLOCKED;
  62. static void pcikbd_write(int address, int data);
  63. static int pcikbd_wait_for_input(void);
  64. unsigned char pckbd_read_mask = KBD_STAT_OBF;
  65. extern int pcikbd_init(void);
  66. extern void pci_compute_shiftstate(void);
  67. extern int pci_setkeycode(unsigned int, unsigned int);
  68. extern int pci_getkeycode(unsigned int);
  69. extern void pci_setledstate(struct kbd_struct *, unsigned int);
  70. extern unsigned char pci_getledstate(void);
  71. #define pcikbd_inb(x)     inb(x)
  72. #define pcikbd_outb(v,x)  outb(v,x)
  73. /* Wait for keyboard controller input buffer to drain.
  74.  * Must be invoked under the pcikbd_lock.
  75.  */
  76. static void kb_wait(void)
  77. {
  78. unsigned long timeout = 250;
  79. do {
  80. if(!(pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG) & KBD_STAT_IBF))
  81. return;
  82. mdelay(1);
  83. } while (--timeout);
  84. }
  85. /*
  86.  * Translation of escaped scancodes to keycodes.
  87.  * This is now user-settable.
  88.  * The keycodes 1-88,96-111,119 are fairly standard, and
  89.  * should probably not be changed - changing might confuse X.
  90.  * X also interprets scancode 0x5d (KEY_Begin).
  91.  *
  92.  * For 1-88 keycode equals scancode.
  93.  */
  94. #define E0_KPENTER 96
  95. #define E0_RCTRL   97
  96. #define E0_KPSLASH 98
  97. #define E0_PRSCR   99
  98. #define E0_RALT    100
  99. #define E0_BREAK   101  /* (control-pause) */
  100. #define E0_HOME    102
  101. #define E0_UP      103
  102. #define E0_PGUP    104
  103. #define E0_LEFT    105
  104. #define E0_RIGHT   106
  105. #define E0_END     107
  106. #define E0_DOWN    108
  107. #define E0_PGDN    109
  108. #define E0_INS     110
  109. #define E0_DEL     111
  110. #define E1_PAUSE   119
  111. /*
  112.  * The keycodes below are randomly located in 89-95,112-118,120-127.
  113.  * They could be thrown away (and all occurrences below replaced by 0),
  114.  * but that would force many users to use the `setkeycodes' utility, where
  115.  * they needed not before. It does not matter that there are duplicates, as
  116.  * long as no duplication occurs for any single keyboard.
  117.  */
  118. #define SC_LIM 89
  119. #define FOCUS_PF1 85           /* actual code! */
  120. #define FOCUS_PF2 89
  121. #define FOCUS_PF3 90
  122. #define FOCUS_PF4 91
  123. #define FOCUS_PF5 92
  124. #define FOCUS_PF6 93
  125. #define FOCUS_PF7 94
  126. #define FOCUS_PF8 95
  127. #define FOCUS_PF9 120
  128. #define FOCUS_PF10 121
  129. #define FOCUS_PF11 122
  130. #define FOCUS_PF12 123
  131. #define JAP_86     124
  132. /* tfj@olivia.ping.dk:
  133.  * The four keys are located over the numeric keypad, and are
  134.  * labelled A1-A4. It's an rc930 keyboard, from
  135.  * Regnecentralen/RC International, Now ICL.
  136.  * Scancodes: 59, 5a, 5b, 5c.
  137.  */
  138. #define RGN1 124
  139. #define RGN2 125
  140. #define RGN3 126
  141. #define RGN4 127
  142. static unsigned char high_keys[128 - SC_LIM] = {
  143.   RGN1, RGN2, RGN3, RGN4, 0, 0, 0,                   /* 0x59-0x5f */
  144.   0, 0, 0, 0, 0, 0, 0, 0,                            /* 0x60-0x67 */
  145.   0, 0, 0, 0, 0, FOCUS_PF11, 0, FOCUS_PF12,          /* 0x68-0x6f */
  146.   0, 0, 0, FOCUS_PF2, FOCUS_PF9, 0, 0, FOCUS_PF3,    /* 0x70-0x77 */
  147.   FOCUS_PF4, FOCUS_PF5, FOCUS_PF6, FOCUS_PF7,        /* 0x78-0x7b */
  148.   FOCUS_PF8, JAP_86, FOCUS_PF10, 0                   /* 0x7c-0x7f */
  149. };
  150. /* BTC */
  151. #define E0_MACRO   112
  152. /* LK450 */
  153. #define E0_F13     113
  154. #define E0_F14     114
  155. #define E0_HELP    115
  156. #define E0_DO      116
  157. #define E0_F17     117
  158. #define E0_KPMINPLUS 118
  159. /*
  160.  * My OmniKey generates e0 4c for  the "OMNI" key and the
  161.  * right alt key does nada. [kkoller@nyx10.cs.du.edu]
  162.  */
  163. #define E0_OK 124
  164. /*
  165.  * New microsoft keyboard is rumoured to have
  166.  * e0 5b (left window button), e0 5c (right window button),
  167.  * e0 5d (menu button). [or: LBANNER, RBANNER, RMENU]
  168.  * [or: Windows_L, Windows_R, TaskMan]
  169.  */
  170. #define E0_MSLW 125
  171. #define E0_MSRW 126
  172. #define E0_MSTM 127
  173. static unsigned char e0_keys[128] = {
  174.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x00-0x07 */
  175.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x08-0x0f */
  176.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x10-0x17 */
  177.   0, 0, 0, 0, E0_KPENTER, E0_RCTRL, 0, 0,       /* 0x18-0x1f */
  178.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x20-0x27 */
  179.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x28-0x2f */
  180.   0, 0, 0, 0, 0, E0_KPSLASH, 0, E0_PRSCR,       /* 0x30-0x37 */
  181.   E0_RALT, 0, 0, 0, 0, E0_F13, E0_F14, E0_HELP,       /* 0x38-0x3f */
  182.   E0_DO, E0_F17, 0, 0, 0, 0, E0_BREAK, E0_HOME,       /* 0x40-0x47 */
  183.   E0_UP, E0_PGUP, 0, E0_LEFT, E0_OK, E0_RIGHT, E0_KPMINPLUS, E0_END,/* 0x48-0x4f */
  184.   E0_DOWN, E0_PGDN, E0_INS, E0_DEL, 0, 0, 0, 0,       /* 0x50-0x57 */
  185.   0, 0, 0, E0_MSLW, E0_MSRW, E0_MSTM, 0, 0,       /* 0x58-0x5f */
  186.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x60-0x67 */
  187.   0, 0, 0, 0, 0, 0, 0, E0_MACRO,       /* 0x68-0x6f */
  188.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x70-0x77 */
  189.   0, 0, 0, 0, 0, 0, 0, 0       /* 0x78-0x7f */
  190. };
  191. /* Simple translation table for the SysRq keys */
  192. #ifdef CONFIG_MAGIC_SYSRQ
  193. unsigned char pcikbd_sysrq_xlate[128] =
  194. "00331234567890-=177t" /* 0x00 - 0x0f */
  195. "qwertyuiop[]r00as" /* 0x10 - 0x1f */
  196. "dfghjkl;'`00\zxcv" /* 0x20 - 0x2f */
  197. "bnm,./00*00 00201202203204205" /* 0x30 - 0x3f */
  198. "2062072102112120000789-456+1" /* 0x40 - 0x4f */
  199. "230177000021321400000000000000000000" /* 0x50 - 0x5f */
  200. "r00/"; /* 0x60 - 0x6f */
  201. #endif
  202. #define DEFAULT_KEYB_REP_DELAY 250
  203. #define DEFAULT_KEYB_REP_RATE 30 /* cps */
  204. static struct kbd_repeat kbdrate = {
  205. DEFAULT_KEYB_REP_DELAY,
  206. DEFAULT_KEYB_REP_RATE
  207. };
  208. static unsigned char parse_kbd_rate(struct kbd_repeat *r);
  209. static int write_kbd_rate(unsigned char r);
  210. int pcikbd_setkeycode(unsigned int scancode, unsigned int keycode)
  211. {
  212. if(scancode < SC_LIM || scancode > 255 || keycode > 127)
  213. return -EINVAL;
  214. if(scancode < 128)
  215. high_keys[scancode - SC_LIM] = keycode;
  216. else
  217. e0_keys[scancode - 128] = keycode;
  218. return 0;
  219. }
  220. int pcikbd_getkeycode(unsigned int scancode)
  221. {
  222. return
  223. (scancode < SC_LIM || scancode > 255) ? -EINVAL :
  224. (scancode < 128) ? high_keys[scancode - SC_LIM] :
  225. e0_keys[scancode - 128];
  226. }
  227. static int do_acknowledge(unsigned char scancode)
  228. {
  229. if(reply_expected) {
  230. if(scancode == KBD_REPLY_ACK) {
  231. acknowledge = 1;
  232. reply_expected = 0;
  233. return 0;
  234. } else if(scancode == KBD_REPLY_RESEND) {
  235. resend = 1;
  236. reply_expected = 0;
  237. return 0;
  238. }
  239. }
  240. return 1;
  241. }
  242. #ifdef __sparc_v9__
  243. static void pcikbd_enter_prom(void)
  244. {
  245. pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE);
  246. if(pcikbd_wait_for_input() != KBD_REPLY_ACK)
  247. printk("Prom Enter: Disable keyboard: no ACKn");
  248. /* Disable PC scancode translation */
  249. pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE);
  250. pcikbd_write(KBD_DATA_REG, KBD_MODE_SYS);
  251. pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE);
  252. if (pcikbd_wait_for_input() != KBD_REPLY_ACK)
  253. printk("Prom Enter: Enable Keyboard: no ACKn");
  254. }
  255. #endif
  256. static void ctrl_break(void)
  257. {
  258. extern int stop_a_enabled;
  259. unsigned long timeout;
  260. int status, data;
  261. int mode;
  262. if (!stop_a_enabled)
  263. return;
  264. pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE);
  265. if(pcikbd_wait_for_input() != KBD_REPLY_ACK)
  266. printk("Prom Enter: Disable keyboard: no ACKn");
  267. /* Save current mode register settings */
  268. pcikbd_write(KBD_CNTL_REG, KBD_CCMD_READ_MODE);
  269. if ((mode = pcikbd_wait_for_input()) == -1)
  270. printk("Prom Enter: Read Mode: no ACKn");
  271. /* Disable PC scancode translation */
  272. pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE);
  273. pcikbd_write(KBD_DATA_REG, mode & ~(KBD_MODE_KCC));
  274. pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE);
  275. if (pcikbd_wait_for_input() != KBD_REPLY_ACK)
  276. printk("Prom Enter: Enable Keyboard: no ACKn");
  277. /* Drop into OBP.
  278.  * Note that we must flush the user windows
  279.  * first before giving up control.
  280.  */
  281.         flush_user_windows();
  282. prom_cmdline();
  283. /* Read prom's key up event (use short timeout) */
  284. do {
  285. timeout = 10;
  286. do {
  287. mdelay(1);
  288. status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG);
  289. if (!(status & KBD_STAT_OBF))
  290. continue;
  291. data = pcikbd_inb(pcikbd_iobase + KBD_DATA_REG);
  292. if (status & (KBD_STAT_GTO | KBD_STAT_PERR))
  293. continue;
  294. break;
  295. } while (--timeout > 0);
  296. } while (timeout > 0);
  297. /* Reenable PC scancode translation */
  298. pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE);
  299. if(pcikbd_wait_for_input() != KBD_REPLY_ACK)
  300. printk("Prom Leave: Disable keyboard: no ACKn");
  301. pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE);
  302. pcikbd_write(KBD_DATA_REG, mode);
  303. pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE);
  304. if (pcikbd_wait_for_input() != KBD_REPLY_ACK)
  305. printk("Prom Leave: Enable Keyboard: no ACKn");
  306. /* Reset keyboard rate */
  307. write_kbd_rate(parse_kbd_rate(&kbdrate));
  308. }
  309. int pcikbd_translate(unsigned char scancode, unsigned char *keycode,
  310.      char raw_mode)
  311. {
  312. static int prev_scancode = 0;
  313. int down = scancode & 0x80 ? 0 : 1;
  314. if (scancode == 0xe0 || scancode == 0xe1) {
  315. prev_scancode = scancode;
  316. return 0;
  317. }
  318. if (scancode == 0x00 || scancode == 0xff) {
  319. prev_scancode = 0;
  320. return 0;
  321. }
  322. scancode &= 0x7f;
  323. if(prev_scancode) {
  324. if(prev_scancode != 0xe0) {
  325. if(prev_scancode == 0xe1 && scancode == 0x1d) {
  326. prev_scancode = 0x100;
  327. return 0;
  328. } else if(prev_scancode == 0x100 && scancode == 0x45) {
  329. *keycode = E1_PAUSE;
  330. prev_scancode = 0;
  331. } else {
  332. prev_scancode = 0;
  333. return 0;
  334. }
  335. } else {
  336. prev_scancode = 0;
  337. if(scancode == 0x2a || scancode == 0x36)
  338. return 0;
  339. if(e0_keys[scancode])
  340. *keycode = e0_keys[scancode];
  341. else
  342. return 0;
  343. }
  344. } else if(scancode >= SC_LIM) {
  345. *keycode = high_keys[scancode - SC_LIM];
  346. if(!*keycode)
  347. return 0;
  348. } else
  349. *keycode = scancode;
  350. if (*keycode == E0_BREAK) {
  351. if (down)
  352. return 0;
  353. /* Handle ctrl-break event */
  354. ctrl_break();
  355. /* Send ctrl up event to the keyboard driver */
  356. *keycode = 0x1d;
  357. }
  358. return 1;
  359. }
  360. char pcikbd_unexpected_up(unsigned char keycode)
  361. {
  362. if(keycode >= SC_LIM || keycode == 85)
  363. return 0;
  364. else
  365. return 0200;
  366. }
  367. static void
  368. pcikbd_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  369. {
  370. unsigned long flags;
  371. unsigned char status;
  372. spin_lock_irqsave(&pcikbd_lock, flags);
  373. kbd_pt_regs = regs;
  374. status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG);
  375. do {
  376. unsigned char scancode;
  377. if(status & pckbd_read_mask & KBD_STAT_MOUSE_OBF)
  378. break;
  379. scancode = pcikbd_inb(pcikbd_iobase + KBD_DATA_REG);
  380. if((status & KBD_STAT_OBF) && do_acknowledge(scancode))
  381. handle_scancode(scancode, !(scancode & 0x80));
  382. status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG);
  383. } while(status & KBD_STAT_OBF);
  384. tasklet_schedule(&keyboard_tasklet);
  385. spin_unlock_irqrestore(&pcikbd_lock, flags);
  386. }
  387. static int send_data(unsigned char data)
  388. {
  389. int retries = 3;
  390. unsigned long flags;
  391. do {
  392. unsigned long timeout = 1000;
  393. spin_lock_irqsave(&pcikbd_lock, flags);
  394. kb_wait();
  395. acknowledge = 0;
  396. resend = 0;
  397. reply_expected = 1;
  398. pcikbd_outb(data, pcikbd_iobase + KBD_DATA_REG);
  399. spin_unlock_irqrestore(&pcikbd_lock, flags);
  400. do {
  401. if (acknowledge)
  402. return 1;
  403. if (resend)
  404. break;
  405. mdelay(1);
  406. } while (--timeout);
  407. if (timeout == 0)
  408. break;
  409. } while (retries-- > 0);
  410. return 0;
  411. }
  412. void pcikbd_leds(unsigned char leds)
  413. {
  414. if (!pcikbd_iobase)
  415. return;
  416. if (!send_data(KBD_CMD_SET_LEDS) || !send_data(leds))
  417. send_data(KBD_CMD_ENABLE);
  418. }
  419. static unsigned char parse_kbd_rate(struct kbd_repeat *r)
  420. {
  421. static struct r2v {
  422. int rate;
  423. unsigned char val;
  424. } kbd_rates[]={ { 5,  0x14 },
  425. { 7,  0x10 },
  426. { 10, 0x0c },
  427. { 15, 0x08 },
  428. { 20, 0x04 },
  429. { 25, 0x02 },
  430. { 30, 0x00 } };
  431. static struct d2v {
  432. int delay;
  433. unsigned char val;
  434. } kbd_delays[]={ { 250,  0 },
  435.  { 500,  1 },
  436.  { 750,  2 },
  437.  { 1000, 3 } };
  438. int rate = 0, delay = 0;
  439. if (r != NULL) {
  440. int i, new_rate = 30, new_delay = 250;
  441. if (r->rate <= 0)
  442. r->rate = kbdrate.rate;
  443. if (r->delay <= 0)
  444. r->delay = kbdrate.delay;
  445. for (i = 0; i < sizeof(kbd_rates) / sizeof(struct r2v); i++) {
  446. if (kbd_rates[i].rate == r->rate) {
  447. new_rate = kbd_rates[i].rate;
  448. rate = kbd_rates[i].val;
  449. break;
  450. }
  451. }
  452. for (i=0; i < sizeof(kbd_delays) / sizeof(struct d2v); i++) {
  453. if (kbd_delays[i].delay == r->delay) {
  454. new_delay = kbd_delays[i].delay;
  455. delay = kbd_delays[i].val;
  456. break;
  457. }
  458. }
  459. r->rate = new_rate;
  460. r->delay = new_delay;
  461. }
  462. return (delay << 5) | rate;
  463. }
  464. static int write_kbd_rate(unsigned char r)
  465. {
  466. if (!send_data(KBD_CMD_SET_RATE) || !send_data(r)) {
  467. /* re-enable kbd if any errors */
  468. send_data(KBD_CMD_ENABLE);
  469. return 0;
  470. }
  471. return 1;
  472. }
  473. static int pcikbd_rate(struct kbd_repeat *rep)
  474. {
  475. unsigned char r;
  476. struct kbd_repeat old_rep;
  477. if (rep == NULL)
  478. return -EINVAL;
  479. r = parse_kbd_rate(rep);
  480. memcpy(&old_rep, &kbdrate, sizeof(struct kbd_repeat));
  481. if (write_kbd_rate(r)) {
  482. memcpy(&kbdrate,rep,sizeof(struct kbd_repeat));
  483. memcpy(rep,&old_rep,sizeof(struct kbd_repeat));
  484. return 0;
  485. }
  486. return -EIO;
  487. }
  488. static int pcikbd_wait_for_input(void)
  489. {
  490. int status, data;
  491. unsigned long timeout = 1000;
  492. do {
  493. mdelay(1);
  494. status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG);
  495. if (!(status & KBD_STAT_OBF))
  496. continue;
  497. data = pcikbd_inb(pcikbd_iobase + KBD_DATA_REG);
  498. if (status & (KBD_STAT_GTO | KBD_STAT_PERR))
  499. continue;
  500. return (data & 0xff);
  501. } while (--timeout > 0);
  502. return -1;
  503. }
  504. static void pcikbd_write(int address, int data)
  505. {
  506. int status;
  507. do {
  508. status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG);
  509. } while (status & KBD_STAT_IBF);
  510. pcikbd_outb(data, pcikbd_iobase + address);
  511. }
  512. #ifdef __sparc_v9__
  513. static unsigned long pcibeep_iobase = 0;
  514. /* Timer routine to turn off the beep after the interval expires. */
  515. static void pcikbd_kd_nosound(unsigned long __unused)
  516. {
  517. if (pcibeep_iobase & 0x2UL)
  518. outb(0, pcibeep_iobase);
  519. else
  520. outl(0, pcibeep_iobase);
  521. }
  522. /*
  523.  * Initiate a keyboard beep. If the frequency is zero, then we stop
  524.  * the beep. Any other frequency will start a monotone beep. The beep
  525.  * will be stopped by a timer after "ticks" jiffies. If ticks is 0,
  526.  * then we do not start a timer.
  527.  */
  528. static void pcikbd_kd_mksound(unsigned int hz, unsigned int ticks)
  529. {
  530. unsigned long flags;
  531. static struct timer_list sound_timer = { function: pcikbd_kd_nosound };
  532. save_flags(flags); cli();
  533. del_timer(&sound_timer);
  534. if (hz) {
  535. if (pcibeep_iobase & 0x2UL)
  536. outb(1, pcibeep_iobase);
  537. else
  538. outl(1, pcibeep_iobase);
  539. if (ticks) {
  540. sound_timer.expires = jiffies + ticks;
  541. add_timer(&sound_timer);
  542. }
  543. } else {
  544. if (pcibeep_iobase & 0x2UL)
  545. outb(0, pcibeep_iobase);
  546. else
  547. outl(0, pcibeep_iobase);
  548. }
  549. restore_flags(flags);
  550. }
  551. #if (defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)) && defined(CONFIG_SPARC64)
  552. static void isa_kd_nosound(unsigned long __unused)
  553. {
  554. /* disable counter 2 */
  555. outb(inb(pcibeep_iobase + 0x61)&0xFC, pcibeep_iobase + 0x61);
  556. return;
  557. }
  558. static void isa_kd_mksound(unsigned int hz, unsigned int ticks)
  559. {
  560. static struct timer_list sound_timer = { function: isa_kd_nosound };
  561. unsigned int count = 0;
  562. unsigned long flags;
  563. if (hz > 20 && hz < 32767)
  564. count = 1193180 / hz;
  565. save_flags(flags);
  566. cli();
  567. del_timer(&sound_timer);
  568. if (count) {
  569. /* enable counter 2 */
  570. outb(inb(pcibeep_iobase + 0x61)|3, pcibeep_iobase + 0x61);
  571. /* set command for counter 2, 2 byte write */
  572. outb(0xB6, pcibeep_iobase + 0x43);
  573. /* select desired HZ */
  574. outb(count & 0xff, pcibeep_iobase + 0x42);
  575. outb((count >> 8) & 0xff, pcibeep_iobase + 0x42);
  576. if (ticks) {
  577. sound_timer.expires = jiffies+ticks;
  578. add_timer(&sound_timer);
  579. }
  580. } else
  581. isa_kd_nosound(0);
  582. restore_flags(flags);
  583. return;
  584. }
  585. #endif
  586. #endif
  587. static void nop_kd_mksound(unsigned int hz, unsigned int ticks)
  588. {
  589. }
  590. extern void (*kd_mksound)(unsigned int hz, unsigned int ticks);
  591. static char * __init do_pcikbd_init_hw(void)
  592. {
  593. while(pcikbd_wait_for_input() != -1)
  594. ;
  595. pcikbd_write(KBD_CNTL_REG, KBD_CCMD_SELF_TEST);
  596. if(pcikbd_wait_for_input() != 0x55)
  597. return "Keyboard failed self test";
  598. pcikbd_write(KBD_CNTL_REG, KBD_CCMD_KBD_TEST);
  599. if(pcikbd_wait_for_input() != 0x00)
  600. return "Keyboard interface failed self test";
  601. pcikbd_write(KBD_CNTL_REG, KBD_CCMD_KBD_ENABLE);
  602. pcikbd_write(KBD_DATA_REG, KBD_CMD_RESET);
  603. if(pcikbd_wait_for_input() != KBD_REPLY_ACK)
  604. return "Keyboard reset failed, no ACK";
  605. if(pcikbd_wait_for_input() != KBD_REPLY_POR)
  606. return "Keyboard reset failed, no ACK";
  607. pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE);
  608. if(pcikbd_wait_for_input() != KBD_REPLY_ACK)
  609. return "Disable keyboard: no ACK";
  610. pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE);
  611. pcikbd_write(KBD_DATA_REG,
  612.      (KBD_MODE_KBD_INT | KBD_MODE_SYS |
  613.       KBD_MODE_DISABLE_MOUSE | KBD_MODE_KCC));
  614. pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE);
  615. if(pcikbd_wait_for_input() != KBD_REPLY_ACK)
  616. return "Enable keyboard: no ACK";
  617. write_kbd_rate(parse_kbd_rate(&kbdrate));
  618. return NULL; /* success */
  619. }
  620. void __init pcikbd_init_hw(void)
  621. {
  622. struct linux_ebus *ebus;
  623. struct linux_ebus_device *edev;
  624. struct linux_ebus_child *child;
  625. char *msg;
  626. if (pcikbd_mrcoffee) {
  627. if ((pcikbd_iobase = (unsigned long) ioremap(0x71300060, 8)) == 0) {
  628. prom_printf("pcikbd_init_hw: cannot mapn");
  629. return;
  630. }
  631. pcikbd_irq = 13 | 0x20;
  632. if (request_irq(pcikbd_irq, &pcikbd_interrupt,
  633. SA_SHIRQ, "keyboard", (void *)pcikbd_iobase)) {
  634. printk("8042: cannot register IRQ %xn", pcikbd_irq);
  635. return;
  636. }
  637. printk("8042(kbd): iobase[%x] irq[%x]n",
  638.     (unsigned)pcikbd_iobase, pcikbd_irq);
  639. } else {
  640. for_each_ebus(ebus) {
  641. for_each_ebusdev(edev, ebus) {
  642. if(!strcmp(edev->prom_name, "8042")) {
  643. for_each_edevchild(edev, child) {
  644.                                                 if (strcmp(child->prom_name, PCI_KB_NAME1) == 0 ||
  645.     strcmp(child->prom_name, PCI_KB_NAME2) == 0)
  646. goto found;
  647. }
  648. }
  649. }
  650. }
  651. #if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)
  652. /* We are being called for the sake of USB keyboard
  653.  * state initialization.  So we should check for beeper
  654.  * device in this case.
  655.  */
  656. edev = 0;
  657. for_each_ebus(ebus) {
  658. for_each_ebusdev(edev, ebus) {
  659. if (!strcmp(edev->prom_name, "beep")) {
  660. pcibeep_iobase = edev->resource[0].start;
  661. kd_mksound = pcikbd_kd_mksound;
  662. printk("8042(speaker): iobase[%016lx]n", pcibeep_iobase);
  663. return;
  664. }
  665. }
  666. }
  667. #ifdef CONFIG_SPARC64
  668. /* Maybe we have one inside the ALI southbridge? */
  669. {
  670. struct isa_bridge *isa_br;
  671. struct isa_device *isa_dev;
  672. for_each_isa(isa_br) {
  673. for_each_isadev(isa_dev, isa_br) {
  674. /* This is a hack, the 'dma' device node has
  675.  * the base of the I/O port space for that PBM
  676.  * as it's resource, so we use that. -DaveM
  677.  */
  678. if (!strcmp(isa_dev->prom_name, "dma")) {
  679. pcibeep_iobase = isa_dev->resource.start;
  680. kd_mksound = isa_kd_mksound;
  681. printk("isa(speaker): iobase[%016lx:%016lx]n",
  682.        pcibeep_iobase + 0x42,
  683.        pcibeep_iobase + 0x61);
  684. return;
  685. }
  686. }
  687. }
  688. }
  689. #endif
  690. /* No beeper found, ok complain. */
  691. #endif
  692. printk("pcikbd_init_hw: no 8042 foundn");
  693. return;
  694. found:
  695. pcikbd_iobase = child->resource[0].start;
  696. pcikbd_irq = child->irqs[0];
  697. if (request_irq(pcikbd_irq, &pcikbd_interrupt,
  698. SA_SHIRQ, "keyboard", (void *)pcikbd_iobase)) {
  699. printk("8042: cannot register IRQ %sn",
  700.        __irq_itoa(pcikbd_irq));
  701. return;
  702. }
  703. printk("8042(kbd) at 0x%lx (irq %s)n", pcikbd_iobase,
  704.        __irq_itoa(pcikbd_irq));
  705. }
  706. kd_mksound = nop_kd_mksound;
  707. kbd_rate = pcikbd_rate;
  708. #ifdef __sparc_v9__
  709. edev = 0;
  710. for_each_ebus(ebus) {
  711. for_each_ebusdev(edev, ebus) {
  712. if(!strcmp(edev->prom_name, "beeper"))
  713. goto ebus_done;
  714. }
  715. }
  716. ebus_done:
  717. /*
  718.  * XXX: my 3.1.3 PROM does not give me the beeper node for the audio
  719.  *      auxio register, though I know it is there... (ecd)
  720.  *
  721.  * JavaStations appear not to have beeper. --zaitcev
  722.  */
  723. if (!edev)
  724. pcibeep_iobase = (pcikbd_iobase & ~(0xffffff)) | 0x722000;
  725. else
  726. pcibeep_iobase = edev->resource[0].start;
  727. kd_mksound = pcikbd_kd_mksound;
  728. printk("8042(speaker): iobase[%016lx]%sn", pcibeep_iobase,
  729.        edev ? "" : " (forced)");
  730. prom_keyboard = pcikbd_enter_prom;
  731. #endif
  732. disable_irq(pcikbd_irq);
  733. msg = do_pcikbd_init_hw();
  734. enable_irq(pcikbd_irq);
  735. if(msg)
  736. printk("8042: keyboard init failure [%s]n", msg);
  737. }
  738. /*
  739.  * Here begins the Mouse Driver.
  740.  */
  741. static unsigned long pcimouse_iobase = 0;
  742. static unsigned int pcimouse_irq;
  743. #define AUX_BUF_SIZE 2048
  744. struct aux_queue {
  745. unsigned long head;
  746. unsigned long tail;
  747. wait_queue_head_t proc_list;
  748. struct fasync_struct *fasync;
  749. unsigned char buf[AUX_BUF_SIZE];
  750. };
  751. static struct aux_queue *queue;
  752. static int aux_count = 0;
  753. static int aux_present = 0;
  754. #define pcimouse_inb(x)     inb(x)
  755. #define pcimouse_outb(v,x)  outb(v,x)
  756. /*
  757.  * Shared subroutines
  758.  */
  759. static unsigned int get_from_queue(void)
  760. {
  761. unsigned int result;
  762. unsigned long flags;
  763. spin_lock_irqsave(&pcikbd_lock, flags);
  764. result = queue->buf[queue->tail];
  765. queue->tail = (queue->tail + 1) & (AUX_BUF_SIZE-1);
  766. spin_unlock_irqrestore(&pcikbd_lock, flags);
  767. return result;
  768. }
  769. static inline int queue_empty(void)
  770. {
  771. return queue->head == queue->tail;
  772. }
  773. static int aux_fasync(int fd, struct file *filp, int on)
  774. {
  775. int retval;
  776. retval = fasync_helper(fd, filp, on, &queue->fasync);
  777. if (retval < 0)
  778. return retval;
  779. return 0;
  780. }
  781. /*
  782.  * PS/2 Aux Device
  783.  */
  784. #define AUX_INTS_OFF (KBD_MODE_KCC | KBD_MODE_DISABLE_MOUSE | 
  785.  KBD_MODE_SYS | KBD_MODE_KBD_INT)
  786. #define AUX_INTS_ON (KBD_MODE_KCC | KBD_MODE_SYS | 
  787.  KBD_MODE_MOUSE_INT | KBD_MODE_KBD_INT)
  788. #define MAX_RETRIES 60 /* some aux operations take long time*/
  789. /*
  790.  * Status polling
  791.  */
  792. static int poll_aux_status(void)
  793. {
  794. int retries = 0;
  795. while ((pcimouse_inb(pcimouse_iobase + KBD_STATUS_REG) &
  796. (KBD_STAT_IBF | KBD_STAT_OBF)) && retries < MAX_RETRIES) {
  797.   if ((pcimouse_inb(pcimouse_iobase + KBD_STATUS_REG) & AUX_STAT_OBF)
  798.     == AUX_STAT_OBF)
  799. pcimouse_inb(pcimouse_iobase + KBD_DATA_REG);
  800. mdelay(5);
  801. retries++;
  802. }
  803. return (retries < MAX_RETRIES);
  804. }
  805. /*
  806.  * Write to aux device
  807.  */
  808. static void aux_write_dev(int val)
  809. {
  810. poll_aux_status();
  811. pcimouse_outb(KBD_CCMD_WRITE_MOUSE, pcimouse_iobase + KBD_CNTL_REG);/* Write magic cookie */
  812. poll_aux_status();
  813. pcimouse_outb(val, pcimouse_iobase + KBD_DATA_REG);  /* Write data */
  814. udelay(1);
  815. }
  816. /*
  817.  * Write to device & handle returned ack
  818.  */
  819. static int __init aux_write_ack(int val)
  820. {
  821. aux_write_dev(val);
  822. poll_aux_status();
  823. if ((pcimouse_inb(pcimouse_iobase + KBD_STATUS_REG) & AUX_STAT_OBF) == AUX_STAT_OBF)
  824. return (pcimouse_inb(pcimouse_iobase + KBD_DATA_REG));
  825. return 0;
  826. }
  827. /*
  828.  * Write aux device command
  829.  */
  830. static void aux_write_cmd(int val)
  831. {
  832. poll_aux_status();
  833. pcimouse_outb(KBD_CCMD_WRITE_MODE, pcimouse_iobase + KBD_CNTL_REG);
  834. poll_aux_status();
  835. pcimouse_outb(val, pcimouse_iobase + KBD_DATA_REG);
  836. }
  837. /*
  838.  * Interrupt from the auxiliary device: a character
  839.  * is waiting in the keyboard/aux controller.
  840.  */
  841. void pcimouse_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  842. {
  843. unsigned long flags;
  844. int head, maxhead;
  845. unsigned char val;
  846. spin_lock_irqsave(&pcikbd_lock, flags);
  847. head = queue->head;
  848. maxhead = (queue->tail - 1) & (AUX_BUF_SIZE - 1);
  849. if ((pcimouse_inb(pcimouse_iobase + KBD_STATUS_REG) & AUX_STAT_OBF) !=
  850.     AUX_STAT_OBF) {
  851. spin_unlock_irqrestore(&pcikbd_lock, flags);
  852. return;
  853. }
  854. val = pcimouse_inb(pcimouse_iobase + KBD_DATA_REG);
  855. queue->buf[head] = val;
  856. add_mouse_randomness(val);
  857. if (head != maxhead) {
  858. head++;
  859. head &= AUX_BUF_SIZE - 1;
  860. }
  861. queue->head = head;
  862. spin_unlock_irqrestore(&pcikbd_lock, flags);
  863. kill_fasync(&queue->fasync, SIGIO, POLL_IN);
  864. wake_up_interruptible(&queue->proc_list);
  865. }
  866. static int aux_release(struct inode * inode, struct file * file)
  867. {
  868. unsigned long flags;
  869. aux_fasync(-1, file, 0);
  870. spin_lock_irqsave(&pcikbd_lock, flags);
  871. if (--aux_count)
  872. goto out;
  873. /* Disable controller ints */
  874. aux_write_cmd(AUX_INTS_OFF);
  875. poll_aux_status();
  876. /* Disable Aux device */
  877. pcimouse_outb(KBD_CCMD_MOUSE_DISABLE, pcimouse_iobase + KBD_CNTL_REG);
  878. poll_aux_status();
  879. out:
  880. spin_unlock_irqrestore(&pcikbd_lock, flags);
  881. return 0;
  882. }
  883. /*
  884.  * Install interrupt handler.
  885.  * Enable auxiliary device.
  886.  */
  887. static int aux_open(struct inode * inode, struct file * file)
  888. {
  889. unsigned long flags;
  890. if (!aux_present)
  891. return -ENODEV;
  892. spin_lock_irqsave(&pcikbd_lock, flags);
  893. if (aux_count++) {
  894. spin_unlock_irqrestore(&pcikbd_lock, flags);
  895. return 0;
  896. }
  897. if (!poll_aux_status()) {
  898. aux_count--;
  899. spin_unlock_irqrestore(&pcikbd_lock, flags);
  900. return -EBUSY;
  901. }
  902. queue->head = queue->tail = 0; /* Flush input queue */
  903. poll_aux_status();
  904. pcimouse_outb(KBD_CCMD_MOUSE_ENABLE, pcimouse_iobase+KBD_CNTL_REG);    /* Enable Aux */
  905. aux_write_dev(AUX_ENABLE_DEV);     /* Enable aux device */
  906. aux_write_cmd(AUX_INTS_ON);     /* Enable controller ints */
  907. poll_aux_status();
  908. spin_unlock_irqrestore(&pcikbd_lock, flags);
  909. return 0;
  910. }
  911. /*
  912.  * Write to the aux device.
  913.  */
  914. static ssize_t aux_write(struct file * file, const char * buffer,
  915.  size_t count, loff_t *ppos)
  916. {
  917. ssize_t retval = 0;
  918. unsigned long flags;
  919. if (count) {
  920. ssize_t written = 0;
  921. spin_lock_irqsave(&pcikbd_lock, flags);
  922. do {
  923. char c;
  924. spin_unlock_irqrestore(&pcikbd_lock, flags);
  925. get_user(c, buffer++);
  926. spin_lock_irqsave(&pcikbd_lock, flags);
  927. if (!poll_aux_status())
  928. break;
  929. pcimouse_outb(KBD_CCMD_WRITE_MOUSE,
  930.       pcimouse_iobase + KBD_CNTL_REG);
  931. if (!poll_aux_status())
  932. break;
  933. pcimouse_outb(c, pcimouse_iobase + KBD_DATA_REG);
  934. written++;
  935. } while (--count);
  936. spin_unlock_irqrestore(&pcikbd_lock, flags);
  937. retval = -EIO;
  938. if (written) {
  939. retval = written;
  940. file->f_dentry->d_inode->i_mtime = CURRENT_TIME;
  941. }
  942. }
  943. return retval;
  944. }
  945. /*
  946.  * Generic part continues...
  947.  */
  948. /*
  949.  * Put bytes from input queue to buffer.
  950.  */
  951. static ssize_t aux_read(struct file * file, char * buffer,
  952.         size_t count, loff_t *ppos)
  953. {
  954. DECLARE_WAITQUEUE(wait, current);
  955. ssize_t i = count;
  956. unsigned char c;
  957. if (queue_empty()) {
  958. if (file->f_flags & O_NONBLOCK)
  959. return -EAGAIN;
  960. add_wait_queue(&queue->proc_list, &wait);
  961. repeat:
  962. set_current_state(TASK_INTERRUPTIBLE);
  963. if (queue_empty() && !signal_pending(current)) {
  964. schedule();
  965. goto repeat;
  966. }
  967. current->state = TASK_RUNNING;
  968. remove_wait_queue(&queue->proc_list, &wait);
  969. }
  970. while (i > 0 && !queue_empty()) {
  971. c = get_from_queue();
  972. put_user(c, buffer++);
  973. i--;
  974. }
  975. if (count-i) {
  976. file->f_dentry->d_inode->i_atime = CURRENT_TIME;
  977. return count-i;
  978. }
  979. if (signal_pending(current))
  980. return -ERESTARTSYS;
  981. return 0;
  982. }
  983. static unsigned int aux_poll(struct file *file, poll_table * wait)
  984. {
  985. poll_wait(file, &queue->proc_list, wait);
  986. if (!queue_empty())
  987. return POLLIN | POLLRDNORM;
  988. return 0;
  989. }
  990. struct file_operations psaux_fops = {
  991. owner: THIS_MODULE,
  992. read: aux_read,
  993. write: aux_write,
  994. poll: aux_poll,
  995. open: aux_open,
  996. release: aux_release,
  997. fasync: aux_fasync,
  998. };
  999. static int aux_no_open(struct inode *inode, struct file *file)
  1000. {
  1001. return -ENODEV;
  1002. }
  1003. struct file_operations psaux_no_fops = {
  1004. owner: THIS_MODULE,
  1005. open: aux_no_open,
  1006. };
  1007. static struct miscdevice psaux_mouse = {
  1008. PSMOUSE_MINOR, "ps2aux", &psaux_fops
  1009. };
  1010. static struct miscdevice psaux_no_mouse = {
  1011. PSMOUSE_MINOR, "ps2aux", &psaux_no_fops
  1012. };
  1013. int __init pcimouse_init(void)
  1014. {
  1015. struct linux_ebus *ebus;
  1016. struct linux_ebus_device *edev;
  1017. struct linux_ebus_child *child;
  1018. if (pcikbd_mrcoffee) {
  1019. if ((pcimouse_iobase = pcikbd_iobase) == 0) {
  1020. printk("pcimouse_init: no 8042 givenn");
  1021. goto do_enodev;
  1022. }
  1023. pcimouse_irq = pcikbd_irq;
  1024. } else {
  1025. for_each_ebus(ebus) {
  1026. for_each_ebusdev(edev, ebus) {
  1027. if(!strcmp(edev->prom_name, "8042")) {
  1028. for_each_edevchild(edev, child) {
  1029. if (strcmp(child->prom_name, PCI_MS_NAME1) == 0 ||
  1030.     strcmp(child->prom_name, PCI_MS_NAME2) == 0)
  1031. goto found;
  1032. }
  1033. }
  1034. }
  1035. }
  1036. printk("pcimouse_init: no 8042 foundn");
  1037. goto do_enodev;
  1038. found:
  1039. pcimouse_iobase = child->resource[0].start;
  1040. pcimouse_irq = child->irqs[0];
  1041. }
  1042. queue = (struct aux_queue *) kmalloc(sizeof(*queue), GFP_KERNEL);
  1043. if (!queue) {
  1044. printk("pcimouse_init: kmalloc(aux_queue) failed.n");
  1045. return -ENOMEM;
  1046. }
  1047. memset(queue, 0, sizeof(*queue));
  1048. init_waitqueue_head(&queue->proc_list);
  1049. if (request_irq(pcimouse_irq, &pcimouse_interrupt,
  1050.         SA_SHIRQ, "mouse", (void *)pcimouse_iobase)) {
  1051. printk("8042: Cannot register IRQ %sn",
  1052.        __irq_itoa(pcimouse_irq));
  1053. goto do_enodev;
  1054. }
  1055. printk("8042(mouse) at %lx (irq %s)n", pcimouse_iobase,
  1056.        __irq_itoa(pcimouse_irq));
  1057. printk("8042: PS/2 auxiliary pointing device detected.n");
  1058. aux_present = 1;
  1059. pckbd_read_mask = AUX_STAT_OBF;
  1060. misc_register(&psaux_mouse);
  1061. spin_lock_irq(&pcikbd_lock);
  1062. pcimouse_outb(KBD_CCMD_MOUSE_ENABLE, pcimouse_iobase + KBD_CNTL_REG);
  1063. aux_write_ack(AUX_RESET);
  1064. aux_write_ack(AUX_SET_SAMPLE);
  1065. aux_write_ack(100);
  1066. aux_write_ack(AUX_SET_RES);
  1067. aux_write_ack(3);
  1068. aux_write_ack(AUX_SET_SCALE21);
  1069. poll_aux_status();
  1070. pcimouse_outb(KBD_CCMD_MOUSE_DISABLE, pcimouse_iobase + KBD_CNTL_REG);
  1071. poll_aux_status();
  1072. pcimouse_outb(KBD_CCMD_WRITE_MODE, pcimouse_iobase + KBD_CNTL_REG);
  1073. poll_aux_status();
  1074. pcimouse_outb(AUX_INTS_OFF, pcimouse_iobase + KBD_DATA_REG);
  1075. poll_aux_status();
  1076. spin_unlock_irq(&pcikbd_lock);
  1077. return 0;
  1078. do_enodev:
  1079. misc_register(&psaux_no_mouse);
  1080. return -ENODEV;
  1081. }
  1082. int __init pcimouse_no_init(void)
  1083. {
  1084. misc_register(&psaux_no_mouse);
  1085. return -ENODEV;
  1086. }
  1087. int __init ps2kbd_probe(void)
  1088. {
  1089. int pnode, enode, node, dnode, xnode;
  1090. int kbnode = 0, msnode = 0, bnode = 0;
  1091. int devices = 0;
  1092. char prop[128];
  1093. int len;
  1094. #ifndef __sparc_v9__
  1095. /*
  1096.  * MrCoffee has hardware but has no PROM nodes whatsoever.
  1097.  */
  1098. len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop));
  1099. if (len < 0) {
  1100. printk("ps2kbd_probe: no name of root noden");
  1101. goto do_enodev;
  1102. }
  1103. if (strncmp(prop, "SUNW,JavaStation-1", len) == 0) {
  1104. pcikbd_mrcoffee = 1; /* Brain damage detected */
  1105. goto found;
  1106. }
  1107. #endif
  1108. /*
  1109.  * Get the nodes for keyboard and mouse from aliases on normal systems.
  1110.  */
  1111.         node = prom_getchild(prom_root_node);
  1112. node = prom_searchsiblings(node, "aliases");
  1113. if (!node)
  1114. goto do_enodev;
  1115. len = prom_getproperty(node, "keyboard", prop, sizeof(prop));
  1116. if (len > 0) {
  1117. prop[len] = 0;
  1118. kbnode = prom_finddevice(prop);
  1119. }
  1120. if (!kbnode)
  1121. goto do_enodev;
  1122. len = prom_getproperty(node, "mouse", prop, sizeof(prop));
  1123. if (len > 0) {
  1124. prop[len] = 0;
  1125. msnode = prom_finddevice(prop);
  1126. }
  1127. if (!msnode)
  1128. goto do_enodev;
  1129. /*
  1130.  * Find matching EBus nodes...
  1131.  */
  1132.         node = prom_getchild(prom_root_node);
  1133. pnode = prom_searchsiblings(node, "pci");
  1134. /*
  1135.  * Check for SUNW,sabre on Ultra5/10/AXi.
  1136.  */
  1137. len = prom_getproperty(pnode, "model", prop, sizeof(prop));
  1138. if ((len > 0) && !strncmp(prop, "SUNW,sabre", len)) {
  1139. pnode = prom_getchild(pnode);
  1140. pnode = prom_searchsiblings(pnode, "pci");
  1141. }
  1142. /*
  1143.  * For each PCI bus...
  1144.  */
  1145. while (pnode) {
  1146. enode = prom_getchild(pnode);
  1147. enode = prom_searchsiblings(enode, "ebus");
  1148. /*
  1149.  * For each EBus on this PCI...
  1150.  */
  1151. while (enode) {
  1152. node = prom_getchild(enode);
  1153. bnode = prom_searchsiblings(node, "beeper");
  1154. node = prom_getchild(enode);
  1155. node = prom_searchsiblings(node, "8042");
  1156. /*
  1157.  * For each '8042' on this EBus...
  1158.  */
  1159. while (node) {
  1160. dnode = prom_getchild(node);
  1161. /*
  1162.  * Does it match?
  1163.  */
  1164. if ((xnode = prom_searchsiblings(dnode, PCI_KB_NAME1)) == kbnode) {
  1165. ++devices;
  1166. } else if ((xnode = prom_searchsiblings(dnode, PCI_KB_NAME2)) == kbnode) {
  1167. ++devices;
  1168. }
  1169. if ((xnode = prom_searchsiblings(dnode, PCI_MS_NAME1)) == msnode) {
  1170. ++devices;
  1171. } else if ((xnode = prom_searchsiblings(dnode, PCI_MS_NAME2)) == msnode) {
  1172. ++devices;
  1173. }
  1174. /*
  1175.  * Found everything we need?
  1176.  */
  1177. if (devices == 2)
  1178. goto found;
  1179. node = prom_getsibling(node);
  1180. node = prom_searchsiblings(node, "8042");
  1181. }
  1182. enode = prom_getsibling(enode);
  1183. enode = prom_searchsiblings(enode, "ebus");
  1184. }
  1185. pnode = prom_getsibling(pnode);
  1186. pnode = prom_searchsiblings(pnode, "pci");
  1187. }
  1188. do_enodev:
  1189. sunkbd_setinitfunc(pcimouse_no_init);
  1190. return -ENODEV;
  1191. found:
  1192.         sunkbd_setinitfunc(pcimouse_init);
  1193.         sunkbd_setinitfunc(pcikbd_init);
  1194. kbd_ops.compute_shiftstate = pci_compute_shiftstate;
  1195. kbd_ops.setledstate = pci_setledstate;
  1196. kbd_ops.getledstate = pci_getledstate;
  1197. kbd_ops.setkeycode = pci_setkeycode;
  1198. kbd_ops.getkeycode = pci_getkeycode;
  1199. return 0;
  1200. }