aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/mouse/hil_ptr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/mouse/hil_ptr.c')
-rw-r--r--drivers/input/mouse/hil_ptr.c90
1 files changed, 47 insertions, 43 deletions
diff --git a/drivers/input/mouse/hil_ptr.c b/drivers/input/mouse/hil_ptr.c
index c2bf2ed07dc6..bfb564fd8fe2 100644
--- a/drivers/input/mouse/hil_ptr.c
+++ b/drivers/input/mouse/hil_ptr.c
@@ -55,7 +55,7 @@ MODULE_LICENSE("Dual BSD/GPL");
55#define HIL_PTR_MAX_LENGTH 16 55#define HIL_PTR_MAX_LENGTH 16
56 56
57struct hil_ptr { 57struct hil_ptr {
58 struct input_dev dev; 58 struct input_dev *dev;
59 struct serio *serio; 59 struct serio *serio;
60 60
61 /* Input buffer and index for packets from HIL bus. */ 61 /* Input buffer and index for packets from HIL bus. */
@@ -79,7 +79,7 @@ struct hil_ptr {
79/* Process a complete packet after transfer from the HIL */ 79/* Process a complete packet after transfer from the HIL */
80static void hil_ptr_process_record(struct hil_ptr *ptr) 80static void hil_ptr_process_record(struct hil_ptr *ptr)
81{ 81{
82 struct input_dev *dev = &ptr->dev; 82 struct input_dev *dev = ptr->dev;
83 hil_packet *data = ptr->data; 83 hil_packet *data = ptr->data;
84 hil_packet p; 84 hil_packet p;
85 int idx, i, cnt, laxis; 85 int idx, i, cnt, laxis;
@@ -148,12 +148,12 @@ static void hil_ptr_process_record(struct hil_ptr *ptr)
148 if (absdev) { 148 if (absdev) {
149 val = lo + (hi<<8); 149 val = lo + (hi<<8);
150#ifdef TABLET_AUTOADJUST 150#ifdef TABLET_AUTOADJUST
151 if (val < ptr->dev.absmin[ABS_X + i]) 151 if (val < dev->absmin[ABS_X + i])
152 ptr->dev.absmin[ABS_X + i] = val; 152 dev->absmin[ABS_X + i] = val;
153 if (val > ptr->dev.absmax[ABS_X + i]) 153 if (val > dev->absmax[ABS_X + i])
154 ptr->dev.absmax[ABS_X + i] = val; 154 dev->absmax[ABS_X + i] = val;
155#endif 155#endif
156 if (i%3) val = ptr->dev.absmax[ABS_X + i] - val; 156 if (i%3) val = dev->absmax[ABS_X + i] - val;
157 input_report_abs(dev, ABS_X + i, val); 157 input_report_abs(dev, ABS_X + i, val);
158 } else { 158 } else {
159 val = (int) (((int8_t)lo) | ((int8_t)hi<<8)); 159 val = (int) (((int8_t)lo) | ((int8_t)hi<<8));
@@ -233,26 +233,29 @@ static void hil_ptr_disconnect(struct serio *serio)
233 return; 233 return;
234 } 234 }
235 235
236 input_unregister_device(&ptr->dev);
237 serio_close(serio); 236 serio_close(serio);
237 input_unregister_device(ptr->dev);
238 kfree(ptr); 238 kfree(ptr);
239} 239}
240 240
241static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver) 241static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
242{ 242{
243 struct hil_ptr *ptr; 243 struct hil_ptr *ptr;
244 char *txt; 244 char *txt;
245 unsigned int i, naxsets, btntype; 245 unsigned int i, naxsets, btntype;
246 uint8_t did, *idd; 246 uint8_t did, *idd;
247 247
248 if (!(ptr = kmalloc(sizeof(struct hil_ptr), GFP_KERNEL))) return -ENOMEM; 248 if (!(ptr = kzalloc(sizeof(struct hil_ptr), GFP_KERNEL)))
249 memset(ptr, 0, sizeof(struct hil_ptr)); 249 return -ENOMEM;
250 250
251 if (serio_open(serio, driver)) goto bail0; 251 ptr->dev = input_allocate_device();
252 if (!ptr->dev) goto bail0;
253 ptr->dev->private = ptr;
254
255 if (serio_open(serio, driver)) goto bail1;
252 256
253 serio_set_drvdata(serio, ptr); 257 serio_set_drvdata(serio, ptr);
254 ptr->serio = serio; 258 ptr->serio = serio;
255 ptr->dev.private = ptr;
256 259
257 init_MUTEX_LOCKED(&(ptr->sem)); 260 init_MUTEX_LOCKED(&(ptr->sem));
258 261
@@ -283,25 +286,24 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
283 286
284 up(&(ptr->sem)); 287 up(&(ptr->sem));
285 288
286 init_input_dev(&ptr->dev);
287 did = ptr->idd[0]; 289 did = ptr->idd[0];
288 idd = ptr->idd + 1; 290 idd = ptr->idd + 1;
289 txt = "unknown"; 291 txt = "unknown";
290 if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) { 292 if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) {
291 ptr->dev.evbit[0] = BIT(EV_REL); 293 ptr->dev->evbit[0] = BIT(EV_REL);
292 txt = "relative"; 294 txt = "relative";
293 } 295 }
294 296
295 if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_ABS) { 297 if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_ABS) {
296 ptr->dev.evbit[0] = BIT(EV_ABS); 298 ptr->dev->evbit[0] = BIT(EV_ABS);
297 txt = "absolute"; 299 txt = "absolute";
298 } 300 }
299 if (!ptr->dev.evbit[0]) { 301 if (!ptr->dev->evbit[0]) {
300 goto bail1; 302 goto bail2;
301 } 303 }
302 304
303 ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd); 305 ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd);
304 if (ptr->nbtn) ptr->dev.evbit[0] |= BIT(EV_KEY); 306 if (ptr->nbtn) ptr->dev->evbit[0] |= BIT(EV_KEY);
305 307
306 naxsets = HIL_IDD_NUM_AXSETS(*idd); 308 naxsets = HIL_IDD_NUM_AXSETS(*idd);
307 ptr->naxes = HIL_IDD_NUM_AXES_PER_SET(*idd); 309 ptr->naxes = HIL_IDD_NUM_AXES_PER_SET(*idd);
@@ -325,7 +327,7 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
325 btntype = BTN_MOUSE; 327 btntype = BTN_MOUSE;
326 328
327 for (i = 0; i < ptr->nbtn; i++) { 329 for (i = 0; i < ptr->nbtn; i++) {
328 set_bit(btntype | i, ptr->dev.keybit); 330 set_bit(btntype | i, ptr->dev->keybit);
329 ptr->btnmap[i] = btntype | i; 331 ptr->btnmap[i] = btntype | i;
330 } 332 }
331 333
@@ -337,50 +339,52 @@ static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
337 339
338 if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) { 340 if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) {
339 for (i = 0; i < ptr->naxes; i++) { 341 for (i = 0; i < ptr->naxes; i++) {
340 set_bit(REL_X + i, ptr->dev.relbit); 342 set_bit(REL_X + i, ptr->dev->relbit);
341 } 343 }
342 for (i = 3; (i < ptr->naxes + 3) && (naxsets > 1); i++) { 344 for (i = 3; (i < ptr->naxes + 3) && (naxsets > 1); i++) {
343 set_bit(REL_X + i, ptr->dev.relbit); 345 set_bit(REL_X + i, ptr->dev->relbit);
344 } 346 }
345 } else { 347 } else {
346 for (i = 0; i < ptr->naxes; i++) { 348 for (i = 0; i < ptr->naxes; i++) {
347 set_bit(ABS_X + i, ptr->dev.absbit); 349 set_bit(ABS_X + i, ptr->dev->absbit);
348 ptr->dev.absmin[ABS_X + i] = 0; 350 ptr->dev->absmin[ABS_X + i] = 0;
349 ptr->dev.absmax[ABS_X + i] = 351 ptr->dev->absmax[ABS_X + i] =
350 HIL_IDD_AXIS_MAX((ptr->idd + 1), i); 352 HIL_IDD_AXIS_MAX((ptr->idd + 1), i);
351 } 353 }
352 for (i = 3; (i < ptr->naxes + 3) && (naxsets > 1); i++) { 354 for (i = 3; (i < ptr->naxes + 3) && (naxsets > 1); i++) {
353 set_bit(ABS_X + i, ptr->dev.absbit); 355 set_bit(ABS_X + i, ptr->dev->absbit);
354 ptr->dev.absmin[ABS_X + i] = 0; 356 ptr->dev->absmin[ABS_X + i] = 0;
355 ptr->dev.absmax[ABS_X + i] = 357 ptr->dev->absmax[ABS_X + i] =
356 HIL_IDD_AXIS_MAX((ptr->idd + 1), (i - 3)); 358 HIL_IDD_AXIS_MAX((ptr->idd + 1), (i - 3));
357 } 359 }
358#ifdef TABLET_AUTOADJUST 360#ifdef TABLET_AUTOADJUST
359 for (i = 0; i < ABS_MAX; i++) { 361 for (i = 0; i < ABS_MAX; i++) {
360 int diff = ptr->dev.absmax[ABS_X + i] / 10; 362 int diff = ptr->dev->absmax[ABS_X + i] / 10;
361 ptr->dev.absmin[ABS_X + i] += diff; 363 ptr->dev->absmin[ABS_X + i] += diff;
362 ptr->dev.absmax[ABS_X + i] -= diff; 364 ptr->dev->absmax[ABS_X + i] -= diff;
363 } 365 }
364#endif 366#endif
365 } 367 }
366 368
367 ptr->dev.name = strlen(ptr->rnm) ? ptr->rnm : HIL_GENERIC_NAME; 369 ptr->dev->name = strlen(ptr->rnm) ? ptr->rnm : HIL_GENERIC_NAME;
368 370
369 ptr->dev.id.bustype = BUS_HIL; 371 ptr->dev->id.bustype = BUS_HIL;
370 ptr->dev.id.vendor = PCI_VENDOR_ID_HP; 372 ptr->dev->id.vendor = PCI_VENDOR_ID_HP;
371 ptr->dev.id.product = 0x0001; /* TODO: get from ptr->rsc */ 373 ptr->dev->id.product = 0x0001; /* TODO: get from ptr->rsc */
372 ptr->dev.id.version = 0x0100; /* TODO: get from ptr->rsc */ 374 ptr->dev->id.version = 0x0100; /* TODO: get from ptr->rsc */
373 ptr->dev.dev = &serio->dev; 375 ptr->dev->dev = &serio->dev;
374 376
375 input_register_device(&ptr->dev); 377 input_register_device(ptr->dev);
376 printk(KERN_INFO "input: %s (%s), ID: %d\n", 378 printk(KERN_INFO "input: %s (%s), ID: %d\n",
377 ptr->dev.name, 379 ptr->dev->name,
378 (btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad", 380 (btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad",
379 did); 381 did);
380 382
381 return 0; 383 return 0;
382 bail1: 384 bail2:
383 serio_close(serio); 385 serio_close(serio);
386 bail1:
387 input_free_device(ptr->dev);
384 bail0: 388 bail0:
385 kfree(ptr); 389 kfree(ptr);
386 serio_set_drvdata(serio, NULL); 390 serio_set_drvdata(serio, NULL);