diff options
Diffstat (limited to 'drivers/input/mouse/logibm.c')
| -rw-r--r-- | drivers/input/mouse/logibm.c | 88 |
1 files changed, 45 insertions, 43 deletions
diff --git a/drivers/input/mouse/logibm.c b/drivers/input/mouse/logibm.c index 8b5243167227..9c7ce38806d7 100644 --- a/drivers/input/mouse/logibm.c +++ b/drivers/input/mouse/logibm.c | |||
| @@ -77,39 +77,7 @@ MODULE_PARM_DESC(irq, "IRQ number (5=default)"); | |||
| 77 | 77 | ||
| 78 | __obsolete_setup("logibm_irq="); | 78 | __obsolete_setup("logibm_irq="); |
| 79 | 79 | ||
| 80 | static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs); | 80 | static struct input_dev *logibm_dev; |
| 81 | |||
| 82 | static int logibm_open(struct input_dev *dev) | ||
| 83 | { | ||
| 84 | if (request_irq(logibm_irq, logibm_interrupt, 0, "logibm", NULL)) { | ||
| 85 | printk(KERN_ERR "logibm.c: Can't allocate irq %d\n", logibm_irq); | ||
| 86 | return -EBUSY; | ||
| 87 | } | ||
| 88 | outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); | ||
| 89 | return 0; | ||
| 90 | } | ||
| 91 | |||
| 92 | static void logibm_close(struct input_dev *dev) | ||
| 93 | { | ||
| 94 | outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); | ||
| 95 | free_irq(logibm_irq, NULL); | ||
| 96 | } | ||
| 97 | |||
| 98 | static struct input_dev logibm_dev = { | ||
| 99 | .evbit = { BIT(EV_KEY) | BIT(EV_REL) }, | ||
| 100 | .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) }, | ||
| 101 | .relbit = { BIT(REL_X) | BIT(REL_Y) }, | ||
| 102 | .open = logibm_open, | ||
| 103 | .close = logibm_close, | ||
| 104 | .name = "Logitech bus mouse", | ||
| 105 | .phys = "isa023c/input0", | ||
| 106 | .id = { | ||
| 107 | .bustype = BUS_ISA, | ||
| 108 | .vendor = 0x0003, | ||
| 109 | .product = 0x0001, | ||
| 110 | .version = 0x0100, | ||
| 111 | }, | ||
| 112 | }; | ||
| 113 | 81 | ||
| 114 | static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 82 | static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
| 115 | { | 83 | { |
| @@ -127,18 +95,34 @@ static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
| 127 | dy |= (buttons & 0xf) << 4; | 95 | dy |= (buttons & 0xf) << 4; |
| 128 | buttons = ~buttons >> 5; | 96 | buttons = ~buttons >> 5; |
| 129 | 97 | ||
| 130 | input_regs(&logibm_dev, regs); | 98 | input_regs(logibm_dev, regs); |
| 131 | input_report_rel(&logibm_dev, REL_X, dx); | 99 | input_report_rel(logibm_dev, REL_X, dx); |
| 132 | input_report_rel(&logibm_dev, REL_Y, dy); | 100 | input_report_rel(logibm_dev, REL_Y, dy); |
| 133 | input_report_key(&logibm_dev, BTN_RIGHT, buttons & 1); | 101 | input_report_key(logibm_dev, BTN_RIGHT, buttons & 1); |
| 134 | input_report_key(&logibm_dev, BTN_MIDDLE, buttons & 2); | 102 | input_report_key(logibm_dev, BTN_MIDDLE, buttons & 2); |
| 135 | input_report_key(&logibm_dev, BTN_LEFT, buttons & 4); | 103 | input_report_key(logibm_dev, BTN_LEFT, buttons & 4); |
| 136 | input_sync(&logibm_dev); | 104 | input_sync(logibm_dev); |
| 137 | 105 | ||
| 138 | outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); | 106 | outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); |
| 139 | return IRQ_HANDLED; | 107 | return IRQ_HANDLED; |
| 140 | } | 108 | } |
| 141 | 109 | ||
| 110 | static int logibm_open(struct input_dev *dev) | ||
| 111 | { | ||
| 112 | if (request_irq(logibm_irq, logibm_interrupt, 0, "logibm", NULL)) { | ||
| 113 | printk(KERN_ERR "logibm.c: Can't allocate irq %d\n", logibm_irq); | ||
| 114 | return -EBUSY; | ||
| 115 | } | ||
| 116 | outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); | ||
| 117 | return 0; | ||
| 118 | } | ||
| 119 | |||
| 120 | static void logibm_close(struct input_dev *dev) | ||
| 121 | { | ||
| 122 | outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); | ||
| 123 | free_irq(logibm_irq, NULL); | ||
| 124 | } | ||
| 125 | |||
| 142 | static int __init logibm_init(void) | 126 | static int __init logibm_init(void) |
| 143 | { | 127 | { |
| 144 | if (!request_region(LOGIBM_BASE, LOGIBM_EXTENT, "logibm")) { | 128 | if (!request_region(LOGIBM_BASE, LOGIBM_EXTENT, "logibm")) { |
| @@ -159,16 +143,34 @@ static int __init logibm_init(void) | |||
| 159 | outb(LOGIBM_DEFAULT_MODE, LOGIBM_CONFIG_PORT); | 143 | outb(LOGIBM_DEFAULT_MODE, LOGIBM_CONFIG_PORT); |
| 160 | outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); | 144 | outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); |
| 161 | 145 | ||
| 162 | input_register_device(&logibm_dev); | 146 | if (!(logibm_dev = input_allocate_device())) { |
| 147 | printk(KERN_ERR "logibm.c: Not enough memory for input device\n"); | ||
| 148 | release_region(LOGIBM_BASE, LOGIBM_EXTENT); | ||
| 149 | return -ENOMEM; | ||
| 150 | } | ||
| 151 | |||
| 152 | logibm_dev->name = "Logitech bus mouse"; | ||
| 153 | logibm_dev->phys = "isa023c/input0"; | ||
| 154 | logibm_dev->id.bustype = BUS_ISA; | ||
| 155 | logibm_dev->id.vendor = 0x0003; | ||
| 156 | logibm_dev->id.product = 0x0001; | ||
| 157 | logibm_dev->id.version = 0x0100; | ||
| 158 | |||
| 159 | logibm_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
| 160 | logibm_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
| 161 | logibm_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); | ||
| 162 | |||
| 163 | logibm_dev->open = logibm_open; | ||
| 164 | logibm_dev->close = logibm_close; | ||
| 163 | 165 | ||
| 164 | printk(KERN_INFO "input: Logitech bus mouse at %#x irq %d\n", LOGIBM_BASE, logibm_irq); | 166 | input_register_device(logibm_dev); |
| 165 | 167 | ||
| 166 | return 0; | 168 | return 0; |
| 167 | } | 169 | } |
| 168 | 170 | ||
| 169 | static void __exit logibm_exit(void) | 171 | static void __exit logibm_exit(void) |
| 170 | { | 172 | { |
| 171 | input_unregister_device(&logibm_dev); | 173 | input_unregister_device(logibm_dev); |
| 172 | release_region(LOGIBM_BASE, LOGIBM_EXTENT); | 174 | release_region(LOGIBM_BASE, LOGIBM_EXTENT); |
| 173 | } | 175 | } |
| 174 | 176 | ||
