diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-11-29 06:19:59 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-12-05 15:42:21 -0500 |
commit | 055cd55601f948675006ca90362fc2bfaae90a86 (patch) | |
tree | a878c55c30b0ae30334f3523d8dd67940d32a7f3 /drivers/media | |
parent | 0278155c84af42d78785731263b69fb49f945ea7 (diff) |
V4L/DVB (13537): ir: Prepare the code for dynamic keycode table allocation
Currently, the IR table is initialized by calling ir_input_init(). However,
this function doesn't return any error code, nor has a function to be called
when de-initializing the IR's.
Change the return argment to integer and make sure that each driver will
handle the error code. Also adds a function to free any resources that may
be allocating there: ir_input_free().
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/common/ir-functions.c | 12 | ||||
-rw-r--r-- | drivers/media/dvb/dm1105/dm1105.c | 10 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/budget-ci.c | 14 | ||||
-rw-r--r-- | drivers/media/video/bt8xx/bttv-input.c | 7 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-input.c | 8 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-input.c | 7 | ||||
-rw-r--r-- | drivers/media/video/cx88/cx88-input.c | 7 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-input.c | 8 | ||||
-rw-r--r-- | drivers/media/video/ir-kbd-i2c.c | 7 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-input.c | 7 |
10 files changed, 74 insertions, 13 deletions
diff --git a/drivers/media/common/ir-functions.c b/drivers/media/common/ir-functions.c index 29885c2893d..b31bd27da37 100644 --- a/drivers/media/common/ir-functions.c +++ b/drivers/media/common/ir-functions.c | |||
@@ -54,11 +54,13 @@ static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir) | |||
54 | 54 | ||
55 | /* -------------------------------------------------------------------------- */ | 55 | /* -------------------------------------------------------------------------- */ |
56 | 56 | ||
57 | void ir_input_init(struct input_dev *dev, struct ir_input_state *ir, | 57 | int ir_input_init(struct input_dev *dev, struct ir_input_state *ir, |
58 | int ir_type, struct ir_scancode_table *ir_codes) | 58 | int ir_type, struct ir_scancode_table *ir_codes) |
59 | { | 59 | { |
60 | ir->ir_type = ir_type; | 60 | ir->ir_type = ir_type; |
61 | 61 | ||
62 | /* FIXME: Add the proper code to dynamically allocate IR table */ | ||
63 | |||
62 | ir_set_keycode_table(dev, ir_codes); | 64 | ir_set_keycode_table(dev, ir_codes); |
63 | 65 | ||
64 | clear_bit(0, dev->keybit); | 66 | clear_bit(0, dev->keybit); |
@@ -66,9 +68,17 @@ void ir_input_init(struct input_dev *dev, struct ir_input_state *ir, | |||
66 | set_bit(EV_KEY, dev->evbit); | 68 | set_bit(EV_KEY, dev->evbit); |
67 | if (repeat) | 69 | if (repeat) |
68 | set_bit(EV_REP, dev->evbit); | 70 | set_bit(EV_REP, dev->evbit); |
71 | |||
72 | return 0; | ||
69 | } | 73 | } |
70 | EXPORT_SYMBOL_GPL(ir_input_init); | 74 | EXPORT_SYMBOL_GPL(ir_input_init); |
71 | 75 | ||
76 | void ir_input_free(struct input_dev *input_dev) | ||
77 | { | ||
78 | /* FIXME: Add the proper code to free allocated resources */ | ||
79 | } | ||
80 | EXPORT_SYMBOL_GPL(ir_input_free); | ||
81 | |||
72 | void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir) | 82 | void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir) |
73 | { | 83 | { |
74 | if (ir->keypressed) { | 84 | if (ir->keypressed) { |
diff --git a/drivers/media/dvb/dm1105/dm1105.c b/drivers/media/dvb/dm1105/dm1105.c index 4c28632f94c..53e3f2a7d31 100644 --- a/drivers/media/dvb/dm1105/dm1105.c +++ b/drivers/media/dvb/dm1105/dm1105.c | |||
@@ -589,7 +589,12 @@ int __devinit dm1105_ir_init(struct dm1105dvb *dm1105) | |||
589 | snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys), | 589 | snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys), |
590 | "pci-%s/ir0", pci_name(dm1105->pdev)); | 590 | "pci-%s/ir0", pci_name(dm1105->pdev)); |
591 | 591 | ||
592 | ir_input_init(input_dev, &dm1105->ir.ir, ir_type, ir_codes); | 592 | err = ir_input_init(input_dev, &dm1105->ir.ir, ir_type, ir_codes); |
593 | if (err < 0) { | ||
594 | input_free_device(input_dev); | ||
595 | return err; | ||
596 | } | ||
597 | |||
593 | input_dev->name = "DVB on-card IR receiver"; | 598 | input_dev->name = "DVB on-card IR receiver"; |
594 | input_dev->phys = dm1105->ir.input_phys; | 599 | input_dev->phys = dm1105->ir.input_phys; |
595 | input_dev->id.bustype = BUS_PCI; | 600 | input_dev->id.bustype = BUS_PCI; |
@@ -608,6 +613,7 @@ int __devinit dm1105_ir_init(struct dm1105dvb *dm1105) | |||
608 | 613 | ||
609 | err = input_register_device(input_dev); | 614 | err = input_register_device(input_dev); |
610 | if (err) { | 615 | if (err) { |
616 | ir_input_free(input_dev); | ||
611 | input_free_device(input_dev); | 617 | input_free_device(input_dev); |
612 | return err; | 618 | return err; |
613 | } | 619 | } |
@@ -617,8 +623,8 @@ int __devinit dm1105_ir_init(struct dm1105dvb *dm1105) | |||
617 | 623 | ||
618 | void __devexit dm1105_ir_exit(struct dm1105dvb *dm1105) | 624 | void __devexit dm1105_ir_exit(struct dm1105dvb *dm1105) |
619 | { | 625 | { |
626 | ir_input_free(dm1105->ir.input_dev); | ||
620 | input_unregister_device(dm1105->ir.input_dev); | 627 | input_unregister_device(dm1105->ir.input_dev); |
621 | |||
622 | } | 628 | } |
623 | 629 | ||
624 | static int __devinit dm1105dvb_hw_init(struct dm1105dvb *dm1105dvb) | 630 | static int __devinit dm1105dvb_hw_init(struct dm1105dvb *dm1105dvb) |
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index adc4b954e5a..7d193ebc0ae 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c | |||
@@ -224,8 +224,10 @@ static int msp430_ir_init(struct budget_ci *budget_ci) | |||
224 | case 0x1011: | 224 | case 0x1011: |
225 | case 0x1012: | 225 | case 0x1012: |
226 | /* The hauppauge keymap is a superset of these remotes */ | 226 | /* The hauppauge keymap is a superset of these remotes */ |
227 | ir_input_init(input_dev, &budget_ci->ir.state, | 227 | error = ir_input_init(input_dev, &budget_ci->ir.state, |
228 | IR_TYPE_RC5, &ir_codes_hauppauge_new_table); | 228 | IR_TYPE_RC5, &ir_codes_hauppauge_new_table); |
229 | if (error < 0) | ||
230 | goto out2; | ||
229 | 231 | ||
230 | if (rc5_device < 0) | 232 | if (rc5_device < 0) |
231 | budget_ci->ir.rc5_device = 0x1f; | 233 | budget_ci->ir.rc5_device = 0x1f; |
@@ -236,8 +238,10 @@ static int msp430_ir_init(struct budget_ci *budget_ci) | |||
236 | case 0x1017: | 238 | case 0x1017: |
237 | case 0x101a: | 239 | case 0x101a: |
238 | /* for the Technotrend 1500 bundled remote */ | 240 | /* for the Technotrend 1500 bundled remote */ |
239 | ir_input_init(input_dev, &budget_ci->ir.state, | 241 | error = ir_input_init(input_dev, &budget_ci->ir.state, |
240 | IR_TYPE_RC5, &ir_codes_tt_1500_table); | 242 | IR_TYPE_RC5, &ir_codes_tt_1500_table); |
243 | if (error < 0) | ||
244 | goto out2; | ||
241 | 245 | ||
242 | if (rc5_device < 0) | 246 | if (rc5_device < 0) |
243 | budget_ci->ir.rc5_device = IR_DEVICE_ANY; | 247 | budget_ci->ir.rc5_device = IR_DEVICE_ANY; |
@@ -246,8 +250,10 @@ static int msp430_ir_init(struct budget_ci *budget_ci) | |||
246 | break; | 250 | break; |
247 | default: | 251 | default: |
248 | /* unknown remote */ | 252 | /* unknown remote */ |
249 | ir_input_init(input_dev, &budget_ci->ir.state, | 253 | error = ir_input_init(input_dev, &budget_ci->ir.state, |
250 | IR_TYPE_RC5, &ir_codes_budget_ci_old_table); | 254 | IR_TYPE_RC5, &ir_codes_budget_ci_old_table); |
255 | if (error < 0) | ||
256 | goto out2; | ||
251 | 257 | ||
252 | if (rc5_device < 0) | 258 | if (rc5_device < 0) |
253 | budget_ci->ir.rc5_device = IR_DEVICE_ANY; | 259 | budget_ci->ir.rc5_device = IR_DEVICE_ANY; |
@@ -280,6 +286,7 @@ static int msp430_ir_init(struct budget_ci *budget_ci) | |||
280 | return 0; | 286 | return 0; |
281 | 287 | ||
282 | out2: | 288 | out2: |
289 | ir_input_free(input_dev); | ||
283 | input_free_device(input_dev); | 290 | input_free_device(input_dev); |
284 | out1: | 291 | out1: |
285 | return error; | 292 | return error; |
@@ -297,6 +304,7 @@ static void msp430_ir_deinit(struct budget_ci *budget_ci) | |||
297 | del_timer_sync(&dev->timer); | 304 | del_timer_sync(&dev->timer); |
298 | ir_input_nokey(dev, &budget_ci->ir.state); | 305 | ir_input_nokey(dev, &budget_ci->ir.state); |
299 | 306 | ||
307 | ir_input_free(dev); | ||
300 | input_unregister_device(dev); | 308 | input_unregister_device(dev); |
301 | } | 309 | } |
302 | 310 | ||
diff --git a/drivers/media/video/bt8xx/bttv-input.c b/drivers/media/video/bt8xx/bttv-input.c index 62408ccf34c..84a957e52c4 100644 --- a/drivers/media/video/bt8xx/bttv-input.c +++ b/drivers/media/video/bt8xx/bttv-input.c | |||
@@ -368,7 +368,10 @@ int bttv_input_init(struct bttv *btv) | |||
368 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", | 368 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", |
369 | pci_name(btv->c.pci)); | 369 | pci_name(btv->c.pci)); |
370 | 370 | ||
371 | ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); | 371 | err = ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); |
372 | if (err < 0) | ||
373 | goto err_out_free; | ||
374 | |||
372 | input_dev->name = ir->name; | 375 | input_dev->name = ir->name; |
373 | input_dev->phys = ir->phys; | 376 | input_dev->phys = ir->phys; |
374 | input_dev->id.bustype = BUS_PCI; | 377 | input_dev->id.bustype = BUS_PCI; |
@@ -400,6 +403,7 @@ int bttv_input_init(struct bttv *btv) | |||
400 | bttv_ir_stop(btv); | 403 | bttv_ir_stop(btv); |
401 | btv->remote = NULL; | 404 | btv->remote = NULL; |
402 | err_out_free: | 405 | err_out_free: |
406 | ir_input_free(input_dev); | ||
403 | input_free_device(input_dev); | 407 | input_free_device(input_dev); |
404 | kfree(ir); | 408 | kfree(ir); |
405 | return err; | 409 | return err; |
@@ -411,6 +415,7 @@ void bttv_input_fini(struct bttv *btv) | |||
411 | return; | 415 | return; |
412 | 416 | ||
413 | bttv_ir_stop(btv); | 417 | bttv_ir_stop(btv); |
418 | ir_input_free(btv->remote->dev); | ||
414 | input_unregister_device(btv->remote->dev); | 419 | input_unregister_device(btv->remote->dev); |
415 | kfree(btv->remote); | 420 | kfree(btv->remote); |
416 | btv->remote = NULL; | 421 | btv->remote = NULL; |
diff --git a/drivers/media/video/cx231xx/cx231xx-input.c b/drivers/media/video/cx231xx/cx231xx-input.c index 58dd39bc678..cd135f01b9c 100644 --- a/drivers/media/video/cx231xx/cx231xx-input.c +++ b/drivers/media/video/cx231xx/cx231xx-input.c | |||
@@ -197,7 +197,11 @@ int cx231xx_ir_init(struct cx231xx *dev) | |||
197 | usb_make_path(dev->udev, ir->phys, sizeof(ir->phys)); | 197 | usb_make_path(dev->udev, ir->phys, sizeof(ir->phys)); |
198 | strlcat(ir->phys, "/input0", sizeof(ir->phys)); | 198 | strlcat(ir->phys, "/input0", sizeof(ir->phys)); |
199 | 199 | ||
200 | ir_input_init(input_dev, &ir->ir, IR_TYPE_OTHER, dev->board.ir_codes); | 200 | err = ir_input_init(input_dev, &ir->ir, IR_TYPE_OTHER, |
201 | dev->board.ir_codes); | ||
202 | if (err < 0) | ||
203 | goto err_out_free; | ||
204 | |||
201 | input_dev->name = ir->name; | 205 | input_dev->name = ir->name; |
202 | input_dev->phys = ir->phys; | 206 | input_dev->phys = ir->phys; |
203 | input_dev->id.bustype = BUS_USB; | 207 | input_dev->id.bustype = BUS_USB; |
@@ -222,6 +226,7 @@ err_out_stop: | |||
222 | cx231xx_ir_stop(ir); | 226 | cx231xx_ir_stop(ir); |
223 | dev->ir = NULL; | 227 | dev->ir = NULL; |
224 | err_out_free: | 228 | err_out_free: |
229 | ir_input_free(input_dev); | ||
225 | input_free_device(input_dev); | 230 | input_free_device(input_dev); |
226 | kfree(ir); | 231 | kfree(ir); |
227 | return err; | 232 | return err; |
@@ -236,6 +241,7 @@ int cx231xx_ir_fini(struct cx231xx *dev) | |||
236 | return 0; | 241 | return 0; |
237 | 242 | ||
238 | cx231xx_ir_stop(ir); | 243 | cx231xx_ir_stop(ir); |
244 | ir_input_free(ir->input); | ||
239 | input_unregister_device(ir->input); | 245 | input_unregister_device(ir->input); |
240 | kfree(ir); | 246 | kfree(ir); |
241 | 247 | ||
diff --git a/drivers/media/video/cx23885/cx23885-input.c b/drivers/media/video/cx23885/cx23885-input.c index fea882d1fbc..469e083dd5f 100644 --- a/drivers/media/video/cx23885/cx23885-input.c +++ b/drivers/media/video/cx23885/cx23885-input.c | |||
@@ -377,7 +377,10 @@ int cx23885_input_init(struct cx23885_dev *dev) | |||
377 | cx23885_boards[dev->board].name); | 377 | cx23885_boards[dev->board].name); |
378 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(dev->pci)); | 378 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(dev->pci)); |
379 | 379 | ||
380 | ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); | 380 | ret = ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); |
381 | if (ret < 0) | ||
382 | goto err_out_free; | ||
383 | |||
381 | input_dev->name = ir->name; | 384 | input_dev->name = ir->name; |
382 | input_dev->phys = ir->phys; | 385 | input_dev->phys = ir->phys; |
383 | input_dev->id.bustype = BUS_PCI; | 386 | input_dev->id.bustype = BUS_PCI; |
@@ -404,6 +407,7 @@ err_out_stop: | |||
404 | cx23885_input_ir_stop(dev); | 407 | cx23885_input_ir_stop(dev); |
405 | dev->ir_input = NULL; | 408 | dev->ir_input = NULL; |
406 | err_out_free: | 409 | err_out_free: |
410 | ir_input_free(input_dev); | ||
407 | input_free_device(input_dev); | 411 | input_free_device(input_dev); |
408 | kfree(ir); | 412 | kfree(ir); |
409 | return ret; | 413 | return ret; |
@@ -416,6 +420,7 @@ void cx23885_input_fini(struct cx23885_dev *dev) | |||
416 | 420 | ||
417 | if (dev->ir_input == NULL) | 421 | if (dev->ir_input == NULL) |
418 | return; | 422 | return; |
423 | ir_input_free(dev->ir_input->dev); | ||
419 | input_unregister_device(dev->ir_input->dev); | 424 | input_unregister_device(dev->ir_input->dev); |
420 | kfree(dev->ir_input); | 425 | kfree(dev->ir_input); |
421 | dev->ir_input = NULL; | 426 | dev->ir_input = NULL; |
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c index 7b2066415d7..92b8cdf9fb8 100644 --- a/drivers/media/video/cx88/cx88-input.c +++ b/drivers/media/video/cx88/cx88-input.c | |||
@@ -360,7 +360,10 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) | |||
360 | snprintf(ir->name, sizeof(ir->name), "cx88 IR (%s)", core->board.name); | 360 | snprintf(ir->name, sizeof(ir->name), "cx88 IR (%s)", core->board.name); |
361 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(pci)); | 361 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(pci)); |
362 | 362 | ||
363 | ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); | 363 | err = ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); |
364 | if (err < 0) | ||
365 | goto err_out_free; | ||
366 | |||
364 | input_dev->name = ir->name; | 367 | input_dev->name = ir->name; |
365 | input_dev->phys = ir->phys; | 368 | input_dev->phys = ir->phys; |
366 | input_dev->id.bustype = BUS_PCI; | 369 | input_dev->id.bustype = BUS_PCI; |
@@ -390,6 +393,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) | |||
390 | cx88_ir_stop(core, ir); | 393 | cx88_ir_stop(core, ir); |
391 | core->ir = NULL; | 394 | core->ir = NULL; |
392 | err_out_free: | 395 | err_out_free: |
396 | ir_input_free(input_dev); | ||
393 | input_free_device(input_dev); | 397 | input_free_device(input_dev); |
394 | kfree(ir); | 398 | kfree(ir); |
395 | return err; | 399 | return err; |
@@ -404,6 +408,7 @@ int cx88_ir_fini(struct cx88_core *core) | |||
404 | return 0; | 408 | return 0; |
405 | 409 | ||
406 | cx88_ir_stop(core, ir); | 410 | cx88_ir_stop(core, ir); |
411 | ir_input_free(ir->input); | ||
407 | input_unregister_device(ir->input); | 412 | input_unregister_device(ir->input); |
408 | kfree(ir); | 413 | kfree(ir); |
409 | 414 | ||
diff --git a/drivers/media/video/em28xx/em28xx-input.c b/drivers/media/video/em28xx/em28xx-input.c index 5550de9c669..d96ec7c09dc 100644 --- a/drivers/media/video/em28xx/em28xx-input.c +++ b/drivers/media/video/em28xx/em28xx-input.c | |||
@@ -367,7 +367,11 @@ int em28xx_ir_init(struct em28xx *dev) | |||
367 | usb_make_path(dev->udev, ir->phys, sizeof(ir->phys)); | 367 | usb_make_path(dev->udev, ir->phys, sizeof(ir->phys)); |
368 | strlcat(ir->phys, "/input0", sizeof(ir->phys)); | 368 | strlcat(ir->phys, "/input0", sizeof(ir->phys)); |
369 | 369 | ||
370 | ir_input_init(input_dev, &ir->ir, IR_TYPE_OTHER, dev->board.ir_codes); | 370 | err = ir_input_init(input_dev, &ir->ir, IR_TYPE_OTHER, |
371 | dev->board.ir_codes); | ||
372 | if (err < 0) | ||
373 | goto err_out_free; | ||
374 | |||
371 | input_dev->name = ir->name; | 375 | input_dev->name = ir->name; |
372 | input_dev->phys = ir->phys; | 376 | input_dev->phys = ir->phys; |
373 | input_dev->id.bustype = BUS_USB; | 377 | input_dev->id.bustype = BUS_USB; |
@@ -392,6 +396,7 @@ int em28xx_ir_init(struct em28xx *dev) | |||
392 | em28xx_ir_stop(ir); | 396 | em28xx_ir_stop(ir); |
393 | dev->ir = NULL; | 397 | dev->ir = NULL; |
394 | err_out_free: | 398 | err_out_free: |
399 | ir_input_free(input_dev); | ||
395 | input_free_device(input_dev); | 400 | input_free_device(input_dev); |
396 | kfree(ir); | 401 | kfree(ir); |
397 | return err; | 402 | return err; |
@@ -406,6 +411,7 @@ int em28xx_ir_fini(struct em28xx *dev) | |||
406 | return 0; | 411 | return 0; |
407 | 412 | ||
408 | em28xx_ir_stop(ir); | 413 | em28xx_ir_stop(ir); |
414 | ir_input_free(ir->input); | ||
409 | input_unregister_device(ir->input); | 415 | input_unregister_device(ir->input); |
410 | kfree(ir); | 416 | kfree(ir); |
411 | 417 | ||
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c index 9c6d0ae58b1..64360d26b32 100644 --- a/drivers/media/video/ir-kbd-i2c.c +++ b/drivers/media/video/ir-kbd-i2c.c | |||
@@ -437,7 +437,10 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
437 | dev_name(&client->dev)); | 437 | dev_name(&client->dev)); |
438 | 438 | ||
439 | /* init + register input device */ | 439 | /* init + register input device */ |
440 | ir_input_init(input_dev, &ir->ir, ir_type, ir->ir_codes); | 440 | err = ir_input_init(input_dev, &ir->ir, ir_type, ir->ir_codes); |
441 | if (err < 0) | ||
442 | goto err_out_free; | ||
443 | |||
441 | input_dev->id.bustype = BUS_I2C; | 444 | input_dev->id.bustype = BUS_I2C; |
442 | input_dev->name = ir->name; | 445 | input_dev->name = ir->name; |
443 | input_dev->phys = ir->phys; | 446 | input_dev->phys = ir->phys; |
@@ -456,6 +459,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
456 | return 0; | 459 | return 0; |
457 | 460 | ||
458 | err_out_free: | 461 | err_out_free: |
462 | ir_input_free(input_dev); | ||
459 | input_free_device(input_dev); | 463 | input_free_device(input_dev); |
460 | kfree(ir); | 464 | kfree(ir); |
461 | return err; | 465 | return err; |
@@ -469,6 +473,7 @@ static int ir_remove(struct i2c_client *client) | |||
469 | cancel_delayed_work_sync(&ir->work); | 473 | cancel_delayed_work_sync(&ir->work); |
470 | 474 | ||
471 | /* unregister device */ | 475 | /* unregister device */ |
476 | ir_input_free(ir->input); | ||
472 | input_unregister_device(ir->input); | 477 | input_unregister_device(ir->input); |
473 | 478 | ||
474 | /* free memory */ | 479 | /* free memory */ |
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c index 439f3d54d00..744918b1cd4 100644 --- a/drivers/media/video/saa7134/saa7134-input.c +++ b/drivers/media/video/saa7134/saa7134-input.c | |||
@@ -652,7 +652,10 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
652 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", | 652 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", |
653 | pci_name(dev->pci)); | 653 | pci_name(dev->pci)); |
654 | 654 | ||
655 | ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); | 655 | err = ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); |
656 | if (err < 0) | ||
657 | goto err_out_free; | ||
658 | |||
656 | input_dev->name = ir->name; | 659 | input_dev->name = ir->name; |
657 | input_dev->phys = ir->phys; | 660 | input_dev->phys = ir->phys; |
658 | input_dev->id.bustype = BUS_PCI; | 661 | input_dev->id.bustype = BUS_PCI; |
@@ -683,6 +686,7 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
683 | saa7134_ir_stop(dev); | 686 | saa7134_ir_stop(dev); |
684 | dev->remote = NULL; | 687 | dev->remote = NULL; |
685 | err_out_free: | 688 | err_out_free: |
689 | ir_input_free(input_dev); | ||
686 | input_free_device(input_dev); | 690 | input_free_device(input_dev); |
687 | kfree(ir); | 691 | kfree(ir); |
688 | return err; | 692 | return err; |
@@ -694,6 +698,7 @@ void saa7134_input_fini(struct saa7134_dev *dev) | |||
694 | return; | 698 | return; |
695 | 699 | ||
696 | saa7134_ir_stop(dev); | 700 | saa7134_ir_stop(dev); |
701 | ir_input_free(dev->remote->dev); | ||
697 | input_unregister_device(dev->remote->dev); | 702 | input_unregister_device(dev->remote->dev); |
698 | kfree(dev->remote); | 703 | kfree(dev->remote); |
699 | dev->remote = NULL; | 704 | dev->remote = NULL; |