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 | ||