static int pckbd_rate(struct kbd_repeat *rep) { if (rep == NULL) return -EINVAL; else{ unsigned char r=parse_kbd_rate(rep); struct kbd_repeat old_rep; memcpy(&old_rep,&kbdrate,sizeof(struct kbd_repeat)); if (write_kbd_rate(r)){ memcpy(&kbdrate,rep,sizeof(struct kbd_repeat)); memcpy(rep,&old_rep,sizeof(struct kbd_repeat)); return 0; } } return -EIO; }
static int lk201_kbd_rate(struct kbd_repeat *rep) { if (rep == NULL) return -EINVAL; parse_kbd_rate(rep); if (write_kbd_rate(rep)) { memcpy(rep, &kbdrate, sizeof(struct kbd_repeat)); return -EIO; } memcpy(&kbdrate, rep, sizeof(struct kbd_repeat)); return 0; }
static void ctrl_break(void) { extern int stop_a_enabled; unsigned long timeout; int status, data; int mode; if (!stop_a_enabled) return; pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE); if(pcikbd_wait_for_input() != KBD_REPLY_ACK) printk("Prom Enter: Disable keyboard: no ACK\n"); /* Save current mode register settings */ pcikbd_write(KBD_CNTL_REG, KBD_CCMD_READ_MODE); if ((mode = pcikbd_wait_for_input()) == -1) printk("Prom Enter: Read Mode: no ACK\n"); /* Disable PC scancode translation */ pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE); pcikbd_write(KBD_DATA_REG, mode & ~(KBD_MODE_KCC)); pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE); if (pcikbd_wait_for_input() != KBD_REPLY_ACK) printk("Prom Enter: Enable Keyboard: no ACK\n"); /* Drop into OBP. * Note that we must flush the user windows * first before giving up control. */ flush_user_windows(); prom_cmdline(); /* Read prom's key up event (use short timeout) */ do { timeout = 10; do { mdelay(1); 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; break; } while (--timeout > 0); } while (timeout > 0); /* Reenable PC scancode translation */ pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE); if(pcikbd_wait_for_input() != KBD_REPLY_ACK) printk("Prom Leave: Disable keyboard: no ACK\n"); pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE); pcikbd_write(KBD_DATA_REG, mode); pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE); if (pcikbd_wait_for_input() != KBD_REPLY_ACK) printk("Prom Leave: Enable Keyboard: no ACK\n"); /* Reset keyboard rate */ write_kbd_rate(parse_kbd_rate(&kbdrate)); }