diff options
Diffstat (limited to 'drivers/media/video/ir-kbd-i2c.c')
| -rw-r--r-- | drivers/media/video/ir-kbd-i2c.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c index 67105b9804a2..9703d3d351f9 100644 --- a/drivers/media/video/ir-kbd-i2c.c +++ b/drivers/media/video/ir-kbd-i2c.c | |||
| @@ -121,10 +121,9 @@ static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = { | |||
| 121 | 121 | ||
| 122 | }; | 122 | }; |
| 123 | 123 | ||
| 124 | struct IR; | ||
| 125 | struct IR { | 124 | struct IR { |
| 126 | struct i2c_client c; | 125 | struct i2c_client c; |
| 127 | struct input_dev input; | 126 | struct input_dev *input; |
| 128 | struct ir_input_state ir; | 127 | struct ir_input_state ir; |
| 129 | 128 | ||
| 130 | struct work_struct work; | 129 | struct work_struct work; |
| @@ -271,9 +270,9 @@ static void ir_key_poll(struct IR *ir) | |||
| 271 | } | 270 | } |
| 272 | 271 | ||
| 273 | if (0 == rc) { | 272 | if (0 == rc) { |
| 274 | ir_input_nokey(&ir->input,&ir->ir); | 273 | ir_input_nokey(ir->input, &ir->ir); |
| 275 | } else { | 274 | } else { |
| 276 | ir_input_keydown(&ir->input,&ir->ir, ir_key, ir_raw); | 275 | ir_input_keydown(ir->input, &ir->ir, ir_key, ir_raw); |
| 277 | } | 276 | } |
| 278 | } | 277 | } |
| 279 | 278 | ||
| @@ -318,11 +317,18 @@ static int ir_attach(struct i2c_adapter *adap, int addr, | |||
| 318 | char *name; | 317 | char *name; |
| 319 | int ir_type; | 318 | int ir_type; |
| 320 | struct IR *ir; | 319 | struct IR *ir; |
| 320 | struct input_dev *input_dev; | ||
| 321 | 321 | ||
| 322 | if (NULL == (ir = kmalloc(sizeof(struct IR),GFP_KERNEL))) | 322 | ir = kzalloc(sizeof(struct IR), GFP_KERNEL); |
| 323 | input_dev = input_allocate_device(); | ||
| 324 | if (!ir || !input_dev) { | ||
| 325 | kfree(ir); | ||
| 326 | input_free_device(input_dev); | ||
| 323 | return -ENOMEM; | 327 | return -ENOMEM; |
| 324 | memset(ir,0,sizeof(*ir)); | 328 | } |
| 329 | |||
| 325 | ir->c = client_template; | 330 | ir->c = client_template; |
| 331 | ir->input = input_dev; | ||
| 326 | 332 | ||
| 327 | i2c_set_clientdata(&ir->c, ir); | 333 | i2c_set_clientdata(&ir->c, ir); |
| 328 | ir->c.adapter = adap; | 334 | ir->c.adapter = adap; |
| @@ -375,13 +381,12 @@ static int ir_attach(struct i2c_adapter *adap, int addr, | |||
| 375 | ir->c.dev.bus_id); | 381 | ir->c.dev.bus_id); |
| 376 | 382 | ||
| 377 | /* init + register input device */ | 383 | /* init + register input device */ |
| 378 | ir_input_init(&ir->input,&ir->ir,ir_type,ir_codes); | 384 | ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); |
| 379 | ir->input.id.bustype = BUS_I2C; | 385 | input_dev->id.bustype = BUS_I2C; |
| 380 | ir->input.name = ir->c.name; | 386 | input_dev->name = ir->c.name; |
| 381 | ir->input.phys = ir->phys; | 387 | input_dev->phys = ir->phys; |
| 382 | input_register_device(&ir->input); | 388 | |
| 383 | printk(DEVNAME ": %s detected at %s [%s]\n", | 389 | input_register_device(ir->input); |
| 384 | ir->input.name,ir->input.phys,adap->name); | ||
| 385 | 390 | ||
| 386 | /* start polling via eventd */ | 391 | /* start polling via eventd */ |
| 387 | INIT_WORK(&ir->work, ir_work, ir); | 392 | INIT_WORK(&ir->work, ir_work, ir); |
| @@ -402,7 +407,7 @@ static int ir_detach(struct i2c_client *client) | |||
| 402 | flush_scheduled_work(); | 407 | flush_scheduled_work(); |
| 403 | 408 | ||
| 404 | /* unregister devices */ | 409 | /* unregister devices */ |
| 405 | input_unregister_device(&ir->input); | 410 | input_unregister_device(ir->input); |
| 406 | i2c_detach_client(&ir->c); | 411 | i2c_detach_client(&ir->c); |
| 407 | 412 | ||
| 408 | /* free memory */ | 413 | /* free memory */ |
