From: James S. <jsi...@us...> - 2002-02-28 00:09:15
|
Update of /cvsroot/linuxconsole/ruby/linux/drivers/input/serio In directory usw-pr-cvs1:/tmp/cvs-serv16174 Modified Files: sun8042.c Log Message: Cleanup of sparc platform. The hardware is the same as ix86 expect we use the prom to get info about th i8042 chipset(s). Index: sun8042.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/serio/sun8042.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- sun8042.c 23 Jan 2002 06:23:02 -0000 1.10 +++ sun8042.c 28 Feb 2002 00:09:11 -0000 1.11 @@ -54,87 +54,6 @@ unsigned char pckbd_read_mask = KBD_STAT_OBF; -#define pcikbd_inb(x) inb(x) -#define pcikbd_outb(v,x) outb(v,x) - -static inline void kb_wait(void) -{ - unsigned long start = jiffies; - - do { - if(!(pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG) & KBD_STAT_IBF)) - return; - } while (jiffies - start < KBC_TIMEOUT); -} - -static void -pcikbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - unsigned char status; - - kbd_pt_regs = regs; - status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG); - do { - unsigned char scancode; - - if(status & pckbd_read_mask & KBD_STAT_MOUSE_OBF) - break; - scancode = pcikbd_inb(pcikbd_iobase + KBD_DATA_REG); - if((status & KBD_STAT_OBF) && do_acknowledge(scancode)) - handle_scancode(scancode, !(scancode & 0x80)); - status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG); - } while(status & KBD_STAT_OBF); - tasklet_schedule(&keyboard_tasklet); -} - -static int send_data(unsigned char data) -{ - int retries = 3; - unsigned long start; - - do { - kb_wait(); - acknowledge = resend = 0; - reply_expected = 1; - pcikbd_outb(data, pcikbd_iobase + KBD_DATA_REG); - start = jiffies; - do { - if(acknowledge) - return 1; - if(jiffies - start >= KBD_TIMEOUT) - return 0; - } while(!resend); - } while(retries-- > 0); - return 0; -} - -static int __init pcikbd_wait_for_input(void) -{ - int status, data; - unsigned long start = jiffies; - - do { - status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG); - if(!(status & KBD_STAT_OBF)) - continue; - data = pcikbd_inb(pcikbd_iobase + KBD_DATA_REG); - if(status & (KBD_STAT_GTO | KBD_STAT_PERR)) - continue; - return (data & 0xff); - } while(jiffies - start < KBD_INIT_TIMEOUT); - return -1; -} - -static void __init pcikbd_write(int address, int data) -{ - int status; - - do { - status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG); - } while (status & KBD_STAT_IBF); - pcikbd_outb(data, pcikbd_iobase + address); -} - #ifdef __sparc_v9__ static unsigned long pcibeep_iobase = 0; @@ -298,195 +217,6 @@ if(msg) printk("8042: keyboard init failure [%s]\n", msg); -} - -#define pcimouse_inb(x) inb(x) -#define pcimouse_outb(v,x) outb(v,x) - -/* - * PS/2 Aux Device - */ - -#define AUX_INTS_OFF (KBD_MODE_KCC | KBD_MODE_DISABLE_MOUSE | \ - KBD_MODE_SYS | KBD_MODE_KBD_INT) - -#define AUX_INTS_ON (KBD_MODE_KCC | KBD_MODE_SYS | \ - KBD_MODE_MOUSE_INT | KBD_MODE_KBD_INT) - -#define MAX_RETRIES 60 /* some aux operations take long time*/ - -/* - * Status polling - */ - -static int poll_aux_status(void) -{ - int retries=0; - - while ((pcimouse_inb(pcimouse_iobase + KBD_STATUS_REG) & - (KBD_STAT_IBF | KBD_STAT_OBF)) && retries < MAX_RETRIES) { - if ((pcimouse_inb(pcimouse_iobase + KBD_STATUS_REG) & AUX_STAT_OBF) - == AUX_STAT_OBF) - pcimouse_inb(pcimouse_iobase + KBD_DATA_REG); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout((5*HZ + 99) / 100); - retries++; - } - return (retries < MAX_RETRIES); -} - -/* - * Write to aux device - */ - -static void aux_write_dev(int val) -{ - poll_aux_status(); - pcimouse_outb(KBD_CCMD_WRITE_MOUSE, pcimouse_iobase + KBD_CNTL_REG);/* Write magic cookie */ - poll_aux_status(); - pcimouse_outb(val, pcimouse_iobase + KBD_DATA_REG); /* Write data */ - udelay(1); -} - -/* - * Write to device & handle returned ack - */ - -static int __init aux_write_ack(int val) -{ - aux_write_dev(val); - poll_aux_status(); - - if ((pcimouse_inb(pcimouse_iobase + KBD_STATUS_REG) & AUX_STAT_OBF) == AUX_STAT_OBF) - return (pcimouse_inb(pcimouse_iobase + KBD_DATA_REG)); - return 0; -} - -/* - * Write aux device command - */ - -static void aux_write_cmd(int val) -{ - poll_aux_status(); - pcimouse_outb(KBD_CCMD_WRITE_MODE, pcimouse_iobase + KBD_CNTL_REG); - poll_aux_status(); - pcimouse_outb(val, pcimouse_iobase + KBD_DATA_REG); -} - -/* - * Interrupt from the auxiliary device: a character - * is waiting in the keyboard/aux controller. - */ - -void pcimouse_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - int head = queue->head; - int maxhead = (queue->tail-1) & (AUX_BUF_SIZE-1); - - if ((pcimouse_inb(pcimouse_iobase + KBD_STATUS_REG) & AUX_STAT_OBF) != AUX_STAT_OBF) - return; - - queue->buf[head] = pcimouse_inb(pcimouse_iobase + KBD_DATA_REG); - if (head != maxhead) { - head++; - head &= AUX_BUF_SIZE-1; - } - queue->head = head; - aux_ready = 1; - if (queue->fasync) - kill_fasync(queue->fasync, SIGIO, POLL_IN); - wake_up_interruptible(&queue->proc_list); -} - -static int aux_release(struct inode * inode, struct file * file) -{ - aux_fasync(-1, file, 0); - if (--aux_count) - return 0; - aux_start_atomic(); - - /* Disable controller ints */ - aux_write_cmd(AUX_INTS_OFF); - poll_aux_status(); - - /* Disable Aux device */ - pcimouse_outb(KBD_CCMD_MOUSE_DISABLE, pcimouse_iobase + KBD_CNTL_REG); - poll_aux_status(); - aux_end_atomic(); - - MOD_DEC_USE_COUNT; - return 0; -} - -/* - * Install interrupt handler. - * Enable auxiliary device. - */ - -static int aux_open(struct inode * inode, struct file * file) -{ - if (!aux_present) - return -ENODEV; - - aux_start_atomic(); - if (aux_count++) { - aux_end_atomic(); - return 0; - } - if (!poll_aux_status()) { /* FIXME: Race condition */ - aux_count--; - aux_end_atomic(); - return -EBUSY; - } - queue->head = queue->tail = 0; /* Flush input queue */ - - MOD_INC_USE_COUNT; - - poll_aux_status(); - pcimouse_outb(KBD_CCMD_MOUSE_ENABLE, pcimouse_iobase+KBD_CNTL_REG); /* Enable Aux */ - aux_write_dev(AUX_ENABLE_DEV); /* Enable aux device */ - aux_write_cmd(AUX_INTS_ON); /* Enable controller ints */ - poll_aux_status(); - aux_end_atomic(); - - aux_ready = 0; - return 0; -} - -/* - * Write to the aux device. - */ - -static ssize_t aux_write(struct file * file, const char * buffer, - size_t count, loff_t *ppos) -{ - ssize_t retval = 0; - - if (count) { - ssize_t written = 0; - - aux_start_atomic(); - do { - char c; - if (!poll_aux_status()) - break; - pcimouse_outb(KBD_CCMD_WRITE_MOUSE, pcimouse_iobase + KBD_CNTL_REG); - if (!poll_aux_status()) - break; - get_user(c, buffer++); - pcimouse_outb(c, pcimouse_iobase + KBD_DATA_REG); - written++; - } while (--count); - aux_end_atomic(); - retval = -EIO; - if (written) { - retval = written; - file->f_dentry->d_inode->i_mtime = CURRENT_TIME; - } - } - - return retval; } int __init pcimouse_init(void) |