2  *  Acorn RiscPC mouse driver for Linux/ARM
 
   4  *  Copyright (c) 2000-2002 Vojtech Pavlik
 
   5  *  Copyright (C) 1996-2002 Russell King
 
  10  * This program is free software; you can redistribute it and/or modify it
 
  11  * under the terms of the GNU General Public License version 2 as published by
 
  12  * the Free Software Foundation.
 
  14  * This handles the Acorn RiscPCs mouse.  We basically have a couple of
 
  15  * hardware registers that track the sensor count for the X-Y movement and
 
  16  * another register holding the button state.  On every VSYNC interrupt we read
 
  17  * the complete state and then work out if something has changed.
 
  20 #include <linux/module.h>
 
  21 #include <linux/sched.h>
 
  22 #include <linux/ptrace.h>
 
  23 #include <linux/interrupt.h>
 
  24 #include <linux/init.h>
 
  25 #include <linux/input.h>
 
  27 #include <asm/hardware.h>
 
  30 #include <asm/hardware/iomd.h>
 
  32 MODULE_AUTHOR("Vojtech Pavlik, Russell King");
 
  33 MODULE_DESCRIPTION("Acorn RiscPC mouse driver");
 
  34 MODULE_LICENSE("GPL");
 
  36 static short rpcmouse_lastx, rpcmouse_lasty;
 
  38 static struct input_dev rpcmouse_dev = {
 
  39         .evbit  = { BIT(EV_KEY) | BIT(EV_REL) },
 
  40         .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) },
 
  41         .relbit = { BIT(REL_X) | BIT(REL_Y) },
 
  42         .name   = "Acorn RiscPC Mouse",
 
  43         .phys   = "rpcmouse/input0",
 
  52 static irqreturn_t rpcmouse_irq(int irq, void *dev_id, struct pt_regs *regs)
 
  54         struct input_dev *dev = dev_id;
 
  55         short x, y, dx, dy, b;
 
  57         x = (short) iomd_readl(IOMD_MOUSEX);
 
  58         y = (short) iomd_readl(IOMD_MOUSEY);
 
  59         b = (short) (__raw_readl(0xe0310000) ^ 0x70);
 
  61         dx = x - rpcmouse_lastx;
 
  62         dy = y - rpcmouse_lasty;
 
  67         input_regs(dev, regs);
 
  69         input_report_rel(dev, REL_X, dx);
 
  70         input_report_rel(dev, REL_Y, -dy);
 
  72         input_report_key(dev, BTN_LEFT,   b & 0x40);
 
  73         input_report_key(dev, BTN_MIDDLE, b & 0x20);
 
  74         input_report_key(dev, BTN_RIGHT,  b & 0x10);
 
  81 static int __init rpcmouse_init(void)
 
  83         init_input_dev(&rpcmouse_dev);
 
  85         rpcmouse_lastx = (short) iomd_readl(IOMD_MOUSEX);
 
  86         rpcmouse_lasty = (short) iomd_readl(IOMD_MOUSEY);
 
  88         if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, SA_SHIRQ, "rpcmouse", &rpcmouse_dev)) {
 
  89                 printk(KERN_ERR "rpcmouse: unable to allocate VSYNC interrupt\n");
 
  93         input_register_device(&rpcmouse_dev);
 
  95         printk(KERN_INFO "input: Acorn RiscPC mouse\n");
 
 100 static void __exit rpcmouse_exit(void)
 
 102         input_unregister_device(&rpcmouse_dev);
 
 103         free_irq(IRQ_VSYNCPULSE, &rpcmouse_dev);
 
 106 module_init(rpcmouse_init);
 
 107 module_exit(rpcmouse_exit);