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