diff options
Diffstat (limited to 'drivers/mfd/ucb1x00-ts.c')
| -rw-r--r-- | drivers/mfd/ucb1x00-ts.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c index a260f83bcb02..585cded3d365 100644 --- a/drivers/mfd/ucb1x00-ts.c +++ b/drivers/mfd/ucb1x00-ts.c | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | 40 | ||
| 41 | 41 | ||
| 42 | struct ucb1x00_ts { | 42 | struct ucb1x00_ts { |
| 43 | struct input_dev idev; | 43 | struct input_dev *idev; |
| 44 | struct ucb1x00 *ucb; | 44 | struct ucb1x00 *ucb; |
| 45 | 45 | ||
| 46 | wait_queue_head_t irq_wait; | 46 | wait_queue_head_t irq_wait; |
| @@ -56,16 +56,16 @@ static int adcsync; | |||
| 56 | 56 | ||
| 57 | static inline void ucb1x00_ts_evt_add(struct ucb1x00_ts *ts, u16 pressure, u16 x, u16 y) | 57 | static inline void ucb1x00_ts_evt_add(struct ucb1x00_ts *ts, u16 pressure, u16 x, u16 y) |
| 58 | { | 58 | { |
| 59 | input_report_abs(&ts->idev, ABS_X, x); | 59 | input_report_abs(ts->idev, ABS_X, x); |
| 60 | input_report_abs(&ts->idev, ABS_Y, y); | 60 | input_report_abs(ts->idev, ABS_Y, y); |
| 61 | input_report_abs(&ts->idev, ABS_PRESSURE, pressure); | 61 | input_report_abs(ts->idev, ABS_PRESSURE, pressure); |
| 62 | input_sync(&ts->idev); | 62 | input_sync(ts->idev); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts) | 65 | static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts) |
| 66 | { | 66 | { |
| 67 | input_report_abs(&ts->idev, ABS_PRESSURE, 0); | 67 | input_report_abs(ts->idev, ABS_PRESSURE, 0); |
| 68 | input_sync(&ts->idev); | 68 | input_sync(ts->idev); |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | /* | 71 | /* |
| @@ -341,26 +341,30 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev) | |||
| 341 | { | 341 | { |
| 342 | struct ucb1x00_ts *ts; | 342 | struct ucb1x00_ts *ts; |
| 343 | 343 | ||
| 344 | ts = kmalloc(sizeof(struct ucb1x00_ts), GFP_KERNEL); | 344 | ts = kzalloc(sizeof(struct ucb1x00_ts), GFP_KERNEL); |
| 345 | if (!ts) | 345 | if (!ts) |
| 346 | return -ENOMEM; | 346 | return -ENOMEM; |
| 347 | 347 | ||
| 348 | memset(ts, 0, sizeof(struct ucb1x00_ts)); | 348 | ts->idev = input_allocate_device(); |
| 349 | if (!ts->idev) { | ||
| 350 | kfree(ts); | ||
| 351 | return -ENOMEM; | ||
| 352 | } | ||
| 349 | 353 | ||
| 350 | ts->ucb = dev->ucb; | 354 | ts->ucb = dev->ucb; |
| 351 | ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; | 355 | ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; |
| 352 | 356 | ||
| 353 | ts->idev.name = "Touchscreen panel"; | 357 | ts->idev->name = "Touchscreen panel"; |
| 354 | ts->idev.id.product = ts->ucb->id; | 358 | ts->idev->id.product = ts->ucb->id; |
| 355 | ts->idev.open = ucb1x00_ts_open; | 359 | ts->idev->open = ucb1x00_ts_open; |
| 356 | ts->idev.close = ucb1x00_ts_close; | 360 | ts->idev->close = ucb1x00_ts_close; |
| 357 | 361 | ||
| 358 | __set_bit(EV_ABS, ts->idev.evbit); | 362 | __set_bit(EV_ABS, ts->idev->evbit); |
| 359 | __set_bit(ABS_X, ts->idev.absbit); | 363 | __set_bit(ABS_X, ts->idev->absbit); |
| 360 | __set_bit(ABS_Y, ts->idev.absbit); | 364 | __set_bit(ABS_Y, ts->idev->absbit); |
| 361 | __set_bit(ABS_PRESSURE, ts->idev.absbit); | 365 | __set_bit(ABS_PRESSURE, ts->idev->absbit); |
| 362 | 366 | ||
| 363 | input_register_device(&ts->idev); | 367 | input_register_device(ts->idev); |
| 364 | 368 | ||
| 365 | dev->priv = ts; | 369 | dev->priv = ts; |
| 366 | 370 | ||
| @@ -370,7 +374,8 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev) | |||
| 370 | static void ucb1x00_ts_remove(struct ucb1x00_dev *dev) | 374 | static void ucb1x00_ts_remove(struct ucb1x00_dev *dev) |
| 371 | { | 375 | { |
| 372 | struct ucb1x00_ts *ts = dev->priv; | 376 | struct ucb1x00_ts *ts = dev->priv; |
| 373 | input_unregister_device(&ts->idev); | 377 | |
| 378 | input_unregister_device(ts->idev); | ||
| 374 | kfree(ts); | 379 | kfree(ts); |
| 375 | } | 380 | } |
| 376 | 381 | ||
