static int nvec_ps2_notifier(struct notifier_block *nb, unsigned long event_type, void *data) { int i; unsigned char *msg = (unsigned char *)data; switch (event_type) { case NVEC_PS2_EVT: serio_interrupt(ps2_dev.ser_dev, msg[2], 0); return NOTIFY_STOP; case NVEC_PS2: if (msg[2] == 1) for(i = 0; i < (msg[1] - 2); i++) serio_interrupt(ps2_dev.ser_dev, msg[i+4], 0); else if (msg[1] != 2) /* !ack */ { ; for(i = 0; i <= (msg[1]+1); i++) ; ; } return NOTIFY_STOP; } return NOTIFY_DONE; }
static int nvec_ps2_notifier(struct notifier_block *nb, unsigned long event_type, void *data) { int i; unsigned char *msg = (unsigned char *)data; switch (event_type) { case NVEC_PS2_EVT: for (i = 0; i < msg[1]; i++) serio_interrupt(ps2_dev.ser_dev, msg[2 + i], 0); NVEC_PHD("ps/2 mouse event: ", &msg[2], msg[1]); return NOTIFY_STOP; case NVEC_PS2: if (msg[2] == 1) { for (i = 0; i < (msg[1] - 2); i++) serio_interrupt(ps2_dev.ser_dev, msg[i + 4], 0); NVEC_PHD("ps/2 mouse reply: ", &msg[4], msg[1] - 2); } else if (msg[1] != 2) /* !ack */ NVEC_PHD("unhandled mouse event: ", msg, msg[1] + 2); return NOTIFY_STOP; } return NOTIFY_DONE; }
static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { struct serport *serport = (struct serport*) tty->disc_data; unsigned long flags; unsigned int ch_flags = 0; int i; spin_lock_irqsave(&serport->lock, flags); if (!test_bit(SERPORT_ACTIVE, &serport->flags)) goto out; for (i = 0; i < count; i++) { if (fp) { switch (fp[i]) { case TTY_FRAME: ch_flags = SERIO_FRAME; break; case TTY_PARITY: ch_flags = SERIO_PARITY; break; default: ch_flags = 0; break; } } serio_interrupt(serport->serio, cp[i], ch_flags); } out: spin_unlock_irqrestore(&serport->lock, flags); }
static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { struct serport *serport = (struct serport*) tty->disc_data; int i; for (i = 0; i < count; i++) serio_interrupt(&serport->serio, cp[i], 0, NULL); }
static irqreturn_t pcips2_interrupt(int irq, void *devid) { struct pcips2_data *ps2if = devid; unsigned char status, scancode; int handled = 0; do { unsigned int flag; status = inb(ps2if->base + PS2_STATUS); if (!(status & PS2_STAT_RXFULL)) break; handled = 1; scancode = inb(ps2if->base + PS2_DATA); if (status == 0xff && scancode == 0xff) break; flag = (status & PS2_STAT_PARITY) ? 0 : SERIO_PARITY; if (hweight8(scancode) & 1) flag ^= SERIO_PARITY; serio_interrupt(ps2if->io, scancode, flag); } while (1); return IRQ_RETVAL(handled); }
/* * Read all bytes waiting in the PS2 port. There should be * at the most one, but we loop for safety. If there was a * framing error, we have to manually clear the status. */ static irqreturn_t ps2_rxint(int irq, void *dev_id) { struct ps2if *ps2if = dev_id; unsigned int scancode, flag, status; status = sa1111_readl(ps2if->base + SA1111_PS2STAT); while (status & PS2STAT_RXF) { if (status & PS2STAT_STP) sa1111_writel(PS2STAT_STP, ps2if->base + SA1111_PS2STAT); flag = (status & PS2STAT_STP ? SERIO_FRAME : 0) | (status & PS2STAT_RXP ? 0 : SERIO_PARITY); scancode = sa1111_readl(ps2if->base + SA1111_PS2DATA) & 0xff; if (hweight8(scancode) & 1) flag ^= SERIO_PARITY; serio_interrupt(ps2if->io, scancode, flag); status = sa1111_readl(ps2if->base + SA1111_PS2STAT); } return IRQ_HANDLED; }
static void arc_ps2_check_rx(struct arc_ps2_data *arc_ps2, struct arc_ps2_port *port) { unsigned int timeout = 1000; unsigned int flag, status; unsigned char data; do { status = ioread32(port->status_addr); if (!(status & PS2_STAT_RX_VAL)) return; data = ioread32(port->data_addr) & 0xff; flag = 0; arc_ps2->total_int++; if (status & PS2_STAT_RX_FRM_ERR) { arc_ps2->frame_error++; flag |= SERIO_PARITY; } else if (status & PS2_STAT_RX_BUF_OVER) { arc_ps2->buf_overflow++; flag |= SERIO_FRAME; } serio_interrupt(port->io, data, flag); } while (--timeout); dev_err(&port->io->dev, "PS/2 hardware stuck\n"); }
static irqreturn_t q40kbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) { if (Q40_IRQ_KEYB_MASK & master_inb(INTERRUPT_REG)) serio_interrupt(&q40kbd_port, master_inb(KEYCODE_REG), 0, regs); master_outb(-1, KEYBOARD_UNLOCK_REG); return IRQ_HANDLED; }
static irqreturn_t milkbd_rx(int irq, void *dev_id) { struct serio *port = dev_id; unsigned int byte; int handled = IRQ_NONE; byte = readl(PS2_DATA_REG); serio_interrupt(port, byte, 0); handled = IRQ_HANDLED; return handled; }
/* * Read all bytes waiting in the PS2 port. There should be * at the most one, but we loop for safety. If there was a * framing error, we have to manually clear the status. */ static irqreturn_t ps2_rxint(int irq, void *dev_id) { struct ps2if *ps2if = dev_id; unsigned int status; int handled = IRQ_NONE; while ((status = inl(ps2if->base)) & 0xffff0000) { serio_interrupt(ps2if->io, status & 0xff, 0); handled = IRQ_HANDLED; } return handled; }
static irqreturn_t maceps2_interrupt(int irq, void *dev_id) { struct serio *dev = dev_id; struct mace_ps2port *port = ((struct maceps2_data *)dev->port_data)->port; unsigned long byte; if (port->status & PS2_STATUS_RX_FULL) { byte = port->rx; serio_interrupt(dev, byte & 0xff, 0); } return IRQ_HANDLED; }
static irqreturn_t rpckbd_rx(int irq, void *dev_id, struct pt_regs *regs) { struct serio *port = dev_id; unsigned int byte; int handled = IRQ_NONE; while (iomd_readb(IOMD_KCTRL) & (1 << 5)) { byte = iomd_readb(IOMD_KARTRX); serio_interrupt(port, byte, 0, regs); handled = IRQ_HANDLED; } return handled; }
static irqreturn_t amba_kmi_int(int irq, void *dev_id) { struct amba_kmi_port *kmi = dev_id; unsigned int status = readb(KMIIR); int handled = IRQ_NONE; while (status & KMIIR_RXINTR) { serio_interrupt(kmi->io, readb(KMIDATA), 0); status = readb(KMIIR); handled = IRQ_HANDLED; } return handled; }
static irqreturn_t q40kbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned long flags; spin_lock_irqsave(&q40kbd_lock, flags); if (Q40_IRQ_KEYB_MASK & master_inb(INTERRUPT_REG)) serio_interrupt(q40kbd_port, master_inb(KEYCODE_REG), 0, regs); master_outb(-1, KEYBOARD_UNLOCK_REG); spin_unlock_irqrestore(&q40kbd_lock, flags); return IRQ_HANDLED; }
static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { struct serport *serport = (struct serport*) tty->disc_data; unsigned long flags; int i; spin_lock_irqsave(&serport->lock, flags); if (!test_bit(SERPORT_ACTIVE, &serport->flags)) goto out; for (i = 0; i < count; i++) serio_interrupt(serport->serio, cp[i], 0); out: spin_unlock_irqrestore(&serport->lock, flags); }
static ssize_t kbde_write(struct file *file, const char *buf, size_t length, loff_t *ppos) { int err; int retval = 0; unsigned char scancode = 0; //printk("kbde module write() called\n"); err = access_ok(VERIFY_READ, buf, length); if (err == 0) return -EFAULT; for (retval = 0; retval < length; retval++) { get_user(scancode, (char*)buf++); //printk("SYMBOL = %x\n", (unsigned int)scancode); serio_interrupt(kbde_port, scancode, 0); } return retval; }
static irqreturn_t apbps2_isr(int irq, void *dev_id) { struct apbps2_priv *priv = dev_id; unsigned long status, data, rxflags; irqreturn_t ret = IRQ_NONE; while ((status = ioread32be(&priv->regs->status)) & APBPS2_STATUS_DR) { data = ioread32be(&priv->regs->data); rxflags = (status & APBPS2_STATUS_PE) ? SERIO_PARITY : 0; rxflags |= (status & APBPS2_STATUS_FE) ? SERIO_FRAME : 0; /* clear error bits? */ if (rxflags) iowrite32be(0, &priv->regs->status); serio_interrupt(priv->io, data, rxflags); ret = IRQ_HANDLED; } return ret; }
static void sxps2_handler(void *CallbackRef, u32 Event, unsigned int EventData) { struct xps2data *drvdata = (struct xps2data *)CallbackRef; u8 c; switch (Event) { case XPS2_EVENT_RECV_OVF: printk(KERN_ERR "%s: receive overrun error.\n", drvdata->serio.name); case XPS2_EVENT_RECV_ERROR: drvdata->dfl |= SERIO_PARITY; break; case XPS2_EVENT_SENT_NOACK: case XPS2_EVENT_TIMEOUT: drvdata->dfl |= SERIO_TIMEOUT; break; case XPS2_EVENT_RECV_DATA: if (EventData > 0) { if (EventData != 1) { printk(KERN_ERR "%s: wrong rcvd byte count (%d).\n", drvdata->serio.name, EventData); } c = drvdata->rxb; XPs2_Recv(&drvdata->ps2, &drvdata->rxb, 1); serio_interrupt(&drvdata->serio, c, drvdata->dfl, NULL); drvdata->dfl = 0; } break; case XPS2_EVENT_SENT_DATA: break; default: printk(KERN_ERR "%s: unrecognized event %u.\n", drvdata->serio.name, Event); } }
static irqreturn_t xps2_interrupt(int irq, void *dev_id) { struct xps2data *drvdata = dev_id; u32 intr_sr; u8 c; int status; /* Get the PS/2 interrupts and clear them */ intr_sr = in_be32(drvdata->base_address + XPS2_IPISR_OFFSET); out_be32(drvdata->base_address + XPS2_IPISR_OFFSET, intr_sr); /* Check which interrupt is active */ if (intr_sr & XPS2_IPIXR_RX_OVF) dev_warn(drvdata->dev, "receive overrun error\n"); if (intr_sr & XPS2_IPIXR_RX_ERR) drvdata->flags |= SERIO_PARITY; if (intr_sr & (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_WDT_TOUT)) drvdata->flags |= SERIO_TIMEOUT; if (intr_sr & XPS2_IPIXR_RX_FULL) { status = xps2_recv(drvdata, &c); /* Error, if a byte is not received */ if (status) { dev_err(drvdata->dev, "wrong rcvd byte count (%d)\n", status); } else { serio_interrupt(drvdata->serio, c, drvdata->flags); drvdata->flags = 0; } } return IRQ_HANDLED; }
static irqreturn_t psif_interrupt(int irq, void *_ptr) { struct psif *psif = _ptr; int retval = IRQ_NONE; unsigned int io_flags = 0; unsigned long status; status = psif_readl(psif, SR); if (status & PSIF_BIT(RXRDY)) { unsigned char val = (unsigned char) psif_readl(psif, RHR); if (status & PSIF_BIT(PARITY)) io_flags |= SERIO_PARITY; if (status & PSIF_BIT(OVRUN)) dev_err(&psif->pdev->dev, "overrun read error\n"); serio_interrupt(psif->io, val, io_flags); retval = IRQ_HANDLED; } return retval; }
static irqreturn_t xps2_interrupt(int irq, void *dev_id) { struct xps2data *drvdata = dev_id; u32 intr_sr; u8 c; int status; intr_sr = in_be32(drvdata->base_address + XPS2_IPISR_OFFSET); out_be32(drvdata->base_address + XPS2_IPISR_OFFSET, intr_sr); if (intr_sr & XPS2_IPIXR_RX_OVF) dev_warn(drvdata->serio.dev.parent, "receive overrun error\n"); if (intr_sr & XPS2_IPIXR_RX_ERR) drvdata->flags |= SERIO_PARITY; if (intr_sr & (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_WDT_TOUT)) drvdata->flags |= SERIO_TIMEOUT; if (intr_sr & XPS2_IPIXR_RX_FULL) { status = xps2_recv(drvdata, &c); if (status) { dev_err(drvdata->serio.dev.parent, "wrong rcvd byte count (%d)\n", status); } else { serio_interrupt(&drvdata->serio, c, drvdata->flags); drvdata->flags = 0; } } return IRQ_HANDLED; }
static ssize_t userio_char_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { struct userio_device *userio = file->private_data; struct userio_cmd cmd; int error; if (count != sizeof(cmd)) { dev_warn(userio_misc.this_device, "Invalid payload size\n"); return -EINVAL; } if (copy_from_user(&cmd, buffer, sizeof(cmd))) return -EFAULT; error = mutex_lock_interruptible(&userio->mutex); if (error) return error; switch (cmd.type) { case USERIO_CMD_REGISTER: if (!userio->serio->id.type) { dev_warn(userio_misc.this_device, "No port type given on /dev/userio\n"); error = -EINVAL; goto out; } if (userio->running) { dev_warn(userio_misc.this_device, "Begin command sent, but we're already running\n"); error = -EBUSY; goto out; } userio->running = true; serio_register_port(userio->serio); break; case USERIO_CMD_SET_PORT_TYPE: if (userio->running) { dev_warn(userio_misc.this_device, "Can't change port type on an already running userio instance\n"); error = -EBUSY; goto out; } userio->serio->id.type = cmd.data; break; case USERIO_CMD_SEND_INTERRUPT: if (!userio->running) { dev_warn(userio_misc.this_device, "The device must be registered before sending interrupts\n"); error = -ENODEV; goto out; } serio_interrupt(userio->serio, cmd.data, 0); break; default: error = -EOPNOTSUPP; goto out; } out: mutex_unlock(&userio->mutex); return error ?: count; }
static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs) { return serio_interrupt(ct82c710_port, inb(CT82C710_DATA), 0, regs); }
static void hv_kbd_on_receive(struct hv_device *hv_dev, struct synth_kbd_msg *msg, u32 msg_length) { struct hv_kbd_dev *kbd_dev = hv_get_drvdata(hv_dev); struct synth_kbd_keystroke *ks_msg; unsigned long flags; u32 msg_type = __le32_to_cpu(msg->header.type); u32 info; u16 scan_code; switch (msg_type) { case SYNTH_KBD_PROTOCOL_RESPONSE: /* * Validate the information provided by the host. * If the host is giving us a bogus packet, * drop the packet (hoping the problem * goes away). */ if (msg_length < sizeof(struct synth_kbd_protocol_response)) { dev_err(&hv_dev->device, "Illegal protocol response packet (len: %d)\n", msg_length); break; } memcpy(&kbd_dev->protocol_resp, msg, sizeof(struct synth_kbd_protocol_response)); complete(&kbd_dev->wait_event); break; case SYNTH_KBD_EVENT: /* * Validate the information provided by the host. * If the host is giving us a bogus packet, * drop the packet (hoping the problem * goes away). */ if (msg_length < sizeof(struct synth_kbd_keystroke)) { dev_err(&hv_dev->device, "Illegal keyboard event packet (len: %d)\n", msg_length); break; } ks_msg = (struct synth_kbd_keystroke *)msg; info = __le32_to_cpu(ks_msg->info); /* * Inject the information through the serio interrupt. */ spin_lock_irqsave(&kbd_dev->lock, flags); if (kbd_dev->started) { if (info & IS_E0) serio_interrupt(kbd_dev->hv_serio, XTKBD_EMUL0, 0); if (info & IS_E1) serio_interrupt(kbd_dev->hv_serio, XTKBD_EMUL1, 0); scan_code = __le16_to_cpu(ks_msg->make_code); if (info & IS_BREAK) scan_code |= XTKBD_RELEASE; serio_interrupt(kbd_dev->hv_serio, scan_code, 0); } spin_unlock_irqrestore(&kbd_dev->lock, flags); /* * Only trigger a wakeup on key down, otherwise * "echo freeze > /sys/power/state" can't really enter the * state because the Enter-UP can trigger a wakeup at once. */ if (!(info & IS_BREAK)) pm_wakeup_event(&hv_dev->device, 0); break; default: dev_err(&hv_dev->device, "unhandled message type %d\n", msg_type); } }
static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id) { return serio_interrupt(ct82c710_port, inb(CT82C710_DATA), 0); }