Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB (4854): Handle errors from input_register_device()

Also sprinkled some input_sync() throughout the code.
Acked-by: Ricardo Cerqueira <v4l@cerqueira.org>
Acked-by: Oliver Endriss <o.endriss@gmx.de>
Acked-by: Andrew de Quincey <adq_dvb@lidskialf.net>

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

authored by

Dmitry Torokhov and committed by
Mauro Carvalho Chehab
b07b4783 ff67c614

+257 -149
+11 -2
drivers/media/dvb/cinergyT2/cinergyT2.c
··· 746 746 dprintk(1, "rc_input_event=%d Up\n", cinergyt2->rc_input_event); 747 747 input_report_key(cinergyt2->rc_input_dev, 748 748 cinergyt2->rc_input_event, 0); 749 + input_sync(cinergyt2->rc_input_dev); 749 750 cinergyt2->rc_input_event = KEY_MAX; 750 751 } 751 752 cinergyt2->rc_last_code = ~0; ··· 784 783 dprintk(1, "rc_input_event=%d\n", cinergyt2->rc_input_event); 785 784 input_report_key(cinergyt2->rc_input_dev, 786 785 cinergyt2->rc_input_event, 1); 786 + input_sync(cinergyt2->rc_input_dev); 787 787 cinergyt2->rc_last_code = rc_events[n].value; 788 788 } 789 789 } ··· 800 798 { 801 799 struct input_dev *input_dev; 802 800 int i; 801 + int err; 803 802 804 - cinergyt2->rc_input_dev = input_dev = input_allocate_device(); 803 + input_dev = input_allocate_device(); 805 804 if (!input_dev) 806 805 return -ENOMEM; 807 806 ··· 820 817 input_dev->keycodesize = 0; 821 818 input_dev->keycodemax = 0; 822 819 823 - input_register_device(cinergyt2->rc_input_dev); 820 + err = input_register_device(input_dev); 821 + if (err) { 822 + input_free_device(input_dev); 823 + return err; 824 + } 825 + 826 + cinergyt2->rc_input_dev = input_dev; 824 827 schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2); 825 828 826 829 return 0;
+23 -14
drivers/media/dvb/dvb-usb/dvb-usb-remote.c
··· 90 90 91 91 int dvb_usb_remote_init(struct dvb_usb_device *d) 92 92 { 93 + struct input_dev *input_dev; 93 94 int i; 95 + int err; 94 96 95 97 if (d->props.rc_key_map == NULL || 96 98 d->props.rc_query == NULL || ··· 102 100 usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys)); 103 101 strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys)); 104 102 105 - d->rc_input_dev = input_allocate_device(); 106 - if (!d->rc_input_dev) 103 + input_dev = input_allocate_device(); 104 + if (!input_dev) 107 105 return -ENOMEM; 108 106 109 - d->rc_input_dev->evbit[0] = BIT(EV_KEY); 110 - d->rc_input_dev->keycodesize = sizeof(unsigned char); 111 - d->rc_input_dev->keycodemax = KEY_MAX; 112 - d->rc_input_dev->name = "IR-receiver inside an USB DVB receiver"; 113 - d->rc_input_dev->phys = d->rc_phys; 114 - usb_to_input_id(d->udev, &d->rc_input_dev->id); 115 - d->rc_input_dev->cdev.dev = &d->udev->dev; 107 + input_dev->evbit[0] = BIT(EV_KEY); 108 + input_dev->keycodesize = sizeof(unsigned char); 109 + input_dev->keycodemax = KEY_MAX; 110 + input_dev->name = "IR-receiver inside an USB DVB receiver"; 111 + input_dev->phys = d->rc_phys; 112 + usb_to_input_id(d->udev, &input_dev->id); 113 + input_dev->cdev.dev = &d->udev->dev; 116 114 117 115 /* set the bits for the keys */ 118 116 deb_rc("key map size: %d\n", d->props.rc_key_map_size); 119 117 for (i = 0; i < d->props.rc_key_map_size; i++) { 120 - deb_rc("setting bit for event %d item %d\n",d->props.rc_key_map[i].event, i); 121 - set_bit(d->props.rc_key_map[i].event, d->rc_input_dev->keybit); 118 + deb_rc("setting bit for event %d item %d\n", 119 + d->props.rc_key_map[i].event, i); 120 + set_bit(d->props.rc_key_map[i].event, input_dev->keybit); 122 121 } 123 122 124 123 /* Start the remote-control polling. */ ··· 127 124 d->props.rc_interval = 100; /* default */ 128 125 129 126 /* setting these two values to non-zero, we have to manage key repeats */ 130 - d->rc_input_dev->rep[REP_PERIOD] = d->props.rc_interval; 131 - d->rc_input_dev->rep[REP_DELAY] = d->props.rc_interval + 150; 127 + input_dev->rep[REP_PERIOD] = d->props.rc_interval; 128 + input_dev->rep[REP_DELAY] = d->props.rc_interval + 150; 132 129 133 - input_register_device(d->rc_input_dev); 130 + err = input_register_device(input_dev); 131 + if (err) { 132 + input_free_device(input_dev); 133 + return err; 134 + } 135 + 136 + d->rc_input_dev = input_dev; 134 137 135 138 INIT_DELAYED_WORK(&d->rc_query_work, dvb_usb_read_remote_control); 136 139
+17 -8
drivers/media/dvb/ttpci/av7110_ir.c
··· 48 48 if (!data || !test_bit(data, input_dev->key)) 49 49 return; 50 50 51 - input_event(input_dev, EV_KEY, data, !!0); 51 + input_report_key(input_dev, data, 0); 52 + input_sync(input_dev); 52 53 } 53 54 54 55 ··· 116 115 del_timer(&keyup_timer); 117 116 if (keyup_timer.data != keycode || new_toggle != old_toggle) { 118 117 delay_timer_finished = 0; 119 - input_event(input_dev, EV_KEY, keyup_timer.data, !!0); 120 - input_event(input_dev, EV_KEY, keycode, !0); 121 - } else 122 - if (delay_timer_finished) 123 - input_event(input_dev, EV_KEY, keycode, 2); 118 + input_event(input_dev, EV_KEY, keyup_timer.data, 0); 119 + input_event(input_dev, EV_KEY, keycode, 1); 120 + input_sync(input_dev); 121 + } else if (delay_timer_finished) { 122 + input_event(input_dev, EV_KEY, keycode, 2); 123 + input_sync(input_dev); 124 + } 124 125 } else { 125 126 delay_timer_finished = 0; 126 - input_event(input_dev, EV_KEY, keycode, !0); 127 + input_event(input_dev, EV_KEY, keycode, 1); 128 + input_sync(input_dev); 127 129 } 128 130 129 131 keyup_timer.expires = jiffies + UP_TIMEOUT; ··· 215 211 int __devinit av7110_ir_init(struct av7110 *av7110) 216 212 { 217 213 static struct proc_dir_entry *e; 214 + int err; 218 215 219 216 if (av_cnt >= sizeof av_list/sizeof av_list[0]) 220 217 return -ENOSPC; ··· 236 231 set_bit(EV_KEY, input_dev->evbit); 237 232 set_bit(EV_REP, input_dev->evbit); 238 233 input_register_keys(); 239 - input_register_device(input_dev); 234 + err = input_register_device(input_dev); 235 + if (err) { 236 + input_free_device(input_dev); 237 + return err; 238 + } 240 239 input_dev->timer.function = input_repeat_key; 241 240 242 241 e = create_proc_entry("av7110_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL);
+25 -17
drivers/media/dvb/ttpci/budget-ci.c
··· 143 143 struct input_dev *dev = (struct input_dev *) data; 144 144 145 145 if (dev->rep[0] == 0 || dev->rep[0] == ~0) { 146 - input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0); 147 - return; 146 + input_event(dev, EV_KEY, key_map[dev->repeat_key], 0); 147 + } else { 148 + dev->rep[0] = 0; 149 + dev->timer.expires = jiffies + HZ * 350 / 1000; 150 + add_timer(&dev->timer); 151 + input_event(dev, EV_KEY, key_map[dev->repeat_key], 2); /* REPEAT */ 148 152 } 149 - 150 - dev->rep[0] = 0; 151 - dev->timer.expires = jiffies + HZ * 350 / 1000; 152 - add_timer(&dev->timer); 153 - input_event(dev, EV_KEY, key_map[dev->repeat_key], 2); /* REPEAT */ 153 + input_sync(dev); 154 154 } 155 155 156 156 static void msp430_ir_interrupt(unsigned long data) ··· 169 169 return; 170 170 } 171 171 del_timer(&dev->timer); 172 - input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0); 172 + input_event(dev, EV_KEY, key_map[dev->repeat_key], 0); 173 173 } 174 174 175 175 if (!key_map[code]) { ··· 177 177 return; 178 178 } 179 179 180 + input_event(dev, EV_KEY, key_map[code], 1); 181 + input_sync(dev); 182 + 180 183 /* initialize debounce and repeat */ 181 184 dev->repeat_key = code; 182 185 /* Zenith remote _always_ sends 2 sequences */ 183 186 dev->rep[0] = ~0; 184 - /* 350 milliseconds */ 185 - dev->timer.expires = jiffies + HZ * 350 / 1000; 186 - /* MAKE */ 187 - input_event(dev, EV_KEY, key_map[code], !0); 188 - add_timer(&dev->timer); 187 + mod_timer(&dev->timer, jiffies + msecs_to_jiffies(350)); 189 188 } 190 189 } 191 190 ··· 193 194 struct saa7146_dev *saa = budget_ci->budget.dev; 194 195 struct input_dev *input_dev; 195 196 int i; 197 + int err; 196 198 197 - budget_ci->input_dev = input_dev = input_allocate_device(); 199 + input_dev = input_allocate_device(); 198 200 if (!input_dev) 199 201 return -ENOMEM; 200 202 ··· 208 208 if (key_map[i]) 209 209 set_bit(key_map[i], input_dev->keybit); 210 210 211 - input_register_device(budget_ci->input_dev); 211 + err = input_register_device(input_dev); 212 + if (err) { 213 + input_free_device(input_dev); 214 + return err; 215 + } 212 216 213 217 input_dev->timer.function = msp430_ir_debounce; 218 + 219 + budget_ci->input_dev = input_dev; 214 220 215 221 saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_06); 216 222 saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI); ··· 232 226 saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_06); 233 227 saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT); 234 228 235 - if (del_timer(&dev->timer)) 236 - input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0); 229 + if (del_timer(&dev->timer)) { 230 + input_event(dev, EV_KEY, key_map[dev->repeat_key], 0); 231 + input_sync(dev); 232 + } 237 233 238 234 input_unregister_device(dev); 239 235 }
+9 -2
drivers/media/dvb/ttusb-dec/ttusb_dec.c
··· 238 238 * for now lets report each signal as a key down and up*/ 239 239 dprintk("%s:rc signal:%d\n", __FUNCTION__, buffer[4]); 240 240 input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 1); 241 + input_sync(dec->rc_input_dev); 241 242 input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 0); 242 243 input_sync(dec->rc_input_dev); 243 244 } ··· 1188 1187 struct input_dev *input_dev; 1189 1188 u8 b[] = { 0x00, 0x01 }; 1190 1189 int i; 1190 + int err; 1191 1191 1192 1192 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys)); 1193 1193 strlcpy(dec->rc_phys, "/input0", sizeof(dec->rc_phys)); 1194 1194 1195 - dec->rc_input_dev = input_dev = input_allocate_device(); 1195 + input_dev = input_allocate_device(); 1196 1196 if (!input_dev) 1197 1197 return -ENOMEM; 1198 1198 ··· 1207 1205 for (i = 0; i < ARRAY_SIZE(rc_keys); i++) 1208 1206 set_bit(rc_keys[i], input_dev->keybit); 1209 1207 1210 - input_register_device(input_dev); 1208 + err = input_register_device(input_dev); 1209 + if (err) { 1210 + input_free_device(input_dev); 1211 + return err; 1212 + } 1211 1213 1214 + dec->rc_input_dev = input_dev; 1212 1215 if (usb_submit_urb(dec->irq_urb, GFP_KERNEL)) 1213 1216 printk("%s: usb_submit_urb failed\n",__FUNCTION__); 1214 1217 /* enable irq pipe */
+57 -44
drivers/media/video/bt8xx/bttv-input.c
··· 259 259 260 260 /* ---------------------------------------------------------------------- */ 261 261 262 + static void bttv_ir_start(struct bttv *btv, struct bttv_ir *ir) 263 + { 264 + if (ir->polling) { 265 + init_timer(&ir->timer); 266 + ir->timer.function = bttv_input_timer; 267 + ir->timer.data = (unsigned long)btv; 268 + ir->timer.expires = jiffies + HZ; 269 + add_timer(&ir->timer); 270 + } else if (ir->rc5_gpio) { 271 + /* set timer_end for code completion */ 272 + init_timer(&ir->timer_end); 273 + ir->timer_end.function = bttv_rc5_timer_end; 274 + ir->timer_end.data = (unsigned long)ir; 275 + 276 + init_timer(&ir->timer_keyup); 277 + ir->timer_keyup.function = bttv_rc5_timer_keyup; 278 + ir->timer_keyup.data = (unsigned long)ir; 279 + } 280 + } 281 + 282 + static void bttv_ir_stop(struct bttv *btv) 283 + { 284 + if (btv->remote->polling) { 285 + del_timer_sync(&btv->remote->timer); 286 + flush_scheduled_work(); 287 + } 288 + 289 + if (btv->remote->rc5_gpio) { 290 + u32 gpio; 291 + 292 + del_timer_sync(&btv->remote->timer_end); 293 + flush_scheduled_work(); 294 + 295 + gpio = bttv_gpio_read(&btv->c); 296 + bttv_gpio_write(&btv->c, gpio & ~(1 << 4)); 297 + } 298 + } 299 + 262 300 int bttv_input_init(struct bttv *btv) 263 301 { 264 302 struct bttv_ir *ir; 265 303 IR_KEYTAB_TYPE *ir_codes = NULL; 266 304 struct input_dev *input_dev; 267 305 int ir_type = IR_TYPE_OTHER; 306 + int err = -ENOMEM; 268 307 269 308 if (!btv->has_remote) 270 309 return -ENODEV; 271 310 272 311 ir = kzalloc(sizeof(*ir),GFP_KERNEL); 273 312 input_dev = input_allocate_device(); 274 - if (!ir || !input_dev) { 275 - kfree(ir); 276 - input_free_device(input_dev); 277 - return -ENOMEM; 278 - } 279 - memset(ir,0,sizeof(*ir)); 313 + if (!ir || !input_dev) 314 + goto err_out_free; 280 315 281 316 /* detect & configure */ 282 317 switch (btv->c.type) { ··· 383 348 break; 384 349 } 385 350 if (NULL == ir_codes) { 386 - dprintk(KERN_INFO "Ooops: IR config error [card=%d]\n",btv->c.type); 387 - kfree(ir); 388 - input_free_device(input_dev); 389 - return -ENODEV; 351 + dprintk(KERN_INFO "Ooops: IR config error [card=%d]\n", btv->c.type); 352 + err = -ENODEV; 353 + goto err_out_free; 390 354 } 391 355 392 356 if (ir->rc5_gpio) { ··· 423 389 input_dev->cdev.dev = &btv->c.pci->dev; 424 390 425 391 btv->remote = ir; 426 - if (ir->polling) { 427 - init_timer(&ir->timer); 428 - ir->timer.function = bttv_input_timer; 429 - ir->timer.data = (unsigned long)btv; 430 - ir->timer.expires = jiffies + HZ; 431 - add_timer(&ir->timer); 432 - } else if (ir->rc5_gpio) { 433 - /* set timer_end for code completion */ 434 - init_timer(&ir->timer_end); 435 - ir->timer_end.function = bttv_rc5_timer_end; 436 - ir->timer_end.data = (unsigned long)ir; 437 - 438 - init_timer(&ir->timer_keyup); 439 - ir->timer_keyup.function = bttv_rc5_timer_keyup; 440 - ir->timer_keyup.data = (unsigned long)ir; 441 - } 392 + bttv_ir_start(btv, ir); 442 393 443 394 /* all done */ 444 - input_register_device(btv->remote->dev); 445 - printk(DEVNAME ": %s detected at %s\n",ir->name,ir->phys); 395 + err = input_register_device(btv->remote->dev); 396 + if (err) 397 + goto err_out_stop; 446 398 447 399 /* the remote isn't as bouncy as a keyboard */ 448 400 ir->dev->rep[REP_DELAY] = repeat_delay; 449 401 ir->dev->rep[REP_PERIOD] = repeat_period; 450 402 451 403 return 0; 404 + 405 + err_out_stop: 406 + bttv_ir_stop(btv); 407 + btv->remote = NULL; 408 + err_out_free: 409 + input_free_device(input_dev); 410 + kfree(ir); 411 + return err; 452 412 } 453 413 454 414 void bttv_input_fini(struct bttv *btv) ··· 450 422 if (btv->remote == NULL) 451 423 return; 452 424 453 - if (btv->remote->polling) { 454 - del_timer_sync(&btv->remote->timer); 455 - flush_scheduled_work(); 456 - } 457 - 458 - 459 - if (btv->remote->rc5_gpio) { 460 - u32 gpio; 461 - 462 - del_timer_sync(&btv->remote->timer_end); 463 - flush_scheduled_work(); 464 - 465 - gpio = bttv_gpio_read(&btv->c); 466 - bttv_gpio_write(&btv->c, gpio & ~(1 << 4)); 467 - } 468 - 425 + bttv_ir_stop(btv); 469 426 input_unregister_device(btv->remote->dev); 470 427 kfree(btv->remote); 471 428 btv->remote = NULL;
+47 -30
drivers/media/video/cx88/cx88-input.c
··· 155 155 mod_timer(&ir->timer, timeout); 156 156 } 157 157 158 + static void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir) 159 + { 160 + if (ir->polling) { 161 + INIT_WORK(&ir->work, cx88_ir_work, ir); 162 + init_timer(&ir->timer); 163 + ir->timer.function = ir_timer; 164 + ir->timer.data = (unsigned long)ir; 165 + schedule_work(&ir->work); 166 + } 167 + if (ir->sampling) { 168 + core->pci_irqmask |= (1 << 18); /* IR_SMP_INT */ 169 + cx_write(MO_DDS_IO, 0xa80a80); /* 4 kHz sample rate */ 170 + cx_write(MO_DDSCFG_IO, 0x5); /* enable */ 171 + } 172 + } 173 + 174 + static void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir) 175 + { 176 + if (ir->sampling) { 177 + cx_write(MO_DDSCFG_IO, 0x0); 178 + core->pci_irqmask &= ~(1 << 18); 179 + } 180 + 181 + if (ir->polling) { 182 + del_timer_sync(&ir->timer); 183 + flush_scheduled_work(); 184 + } 185 + } 186 + 158 187 /* ---------------------------------------------------------------------- */ 159 188 160 189 int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) ··· 192 163 struct input_dev *input_dev; 193 164 IR_KEYTAB_TYPE *ir_codes = NULL; 194 165 int ir_type = IR_TYPE_OTHER; 166 + int err = -ENOMEM; 195 167 196 168 ir = kzalloc(sizeof(*ir), GFP_KERNEL); 197 169 input_dev = input_allocate_device(); 198 - if (!ir || !input_dev) { 199 - kfree(ir); 200 - input_free_device(input_dev); 201 - return -ENOMEM; 202 - } 170 + if (!ir || !input_dev) 171 + goto err_out_free; 203 172 204 173 ir->input = input_dev; 205 174 ··· 307 280 } 308 281 309 282 if (NULL == ir_codes) { 310 - kfree(ir); 311 - input_free_device(input_dev); 312 - return -ENODEV; 283 + err = -ENODEV; 284 + goto err_out_free; 313 285 } 314 286 315 287 /* init input device */ ··· 333 307 ir->core = core; 334 308 core->ir = ir; 335 309 336 - if (ir->polling) { 337 - INIT_WORK(&ir->work, cx88_ir_work); 338 - init_timer(&ir->timer); 339 - ir->timer.function = ir_timer; 340 - ir->timer.data = (unsigned long)ir; 341 - schedule_work(&ir->work); 342 - } 343 - if (ir->sampling) { 344 - core->pci_irqmask |= (1 << 18); /* IR_SMP_INT */ 345 - cx_write(MO_DDS_IO, 0xa80a80); /* 4 kHz sample rate */ 346 - cx_write(MO_DDSCFG_IO, 0x5); /* enable */ 347 - } 310 + cx88_ir_start(core, ir); 348 311 349 312 /* all done */ 350 - input_register_device(ir->input); 313 + err = input_register_device(ir->input); 314 + if (err) 315 + goto err_out_stop; 351 316 352 317 return 0; 318 + 319 + err_out_stop: 320 + cx88_ir_stop(core, ir); 321 + core->ir = NULL; 322 + err_out_free: 323 + input_free_device(input_dev); 324 + kfree(ir); 325 + return err; 353 326 } 354 327 355 328 int cx88_ir_fini(struct cx88_core *core) ··· 359 334 if (NULL == ir) 360 335 return 0; 361 336 362 - if (ir->sampling) { 363 - cx_write(MO_DDSCFG_IO, 0x0); 364 - core->pci_irqmask &= ~(1 << 18); 365 - } 366 - if (ir->polling) { 367 - del_timer(&ir->timer); 368 - flush_scheduled_work(); 369 - } 370 - 337 + cx88_ir_stop(core, ir); 371 338 input_unregister_device(ir->input); 372 339 kfree(ir); 373 340
+26 -17
drivers/media/video/ir-kbd-i2c.c
··· 305 305 int ir_type; 306 306 struct IR_i2c *ir; 307 307 struct input_dev *input_dev; 308 + int err; 308 309 309 310 ir = kzalloc(sizeof(struct IR_i2c),GFP_KERNEL); 310 311 input_dev = input_allocate_device(); 311 312 if (!ir || !input_dev) { 312 - input_free_device(input_dev); 313 - kfree(ir); 314 - return -ENOMEM; 313 + err = -ENOMEM; 314 + goto err_out_free; 315 315 } 316 - memset(ir,0,sizeof(*ir)); 317 316 318 317 ir->c = client_template; 319 318 ir->input = input_dev; ··· 360 361 break; 361 362 default: 362 363 /* shouldn't happen */ 363 - printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr); 364 - kfree(ir); 365 - return -1; 364 + printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n", addr); 365 + err = -ENODEV; 366 + goto err_out_free; 366 367 } 367 368 368 369 /* Sets name */ 369 370 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name); 370 - ir->ir_codes=ir_codes; 371 + ir->ir_codes = ir_codes; 371 372 372 373 /* register i2c device 373 374 * At device register, IR codes may be changed to be 374 375 * board dependent. 375 376 */ 376 - i2c_attach_client(&ir->c); 377 + err = i2c_attach_client(&ir->c); 378 + if (err) 379 + goto err_out_free; 377 380 378 381 /* If IR not supported or disabled, unregisters driver */ 379 382 if (ir->get_key == NULL) { 380 - i2c_detach_client(&ir->c); 381 - kfree(ir); 382 - return -1; 383 + err = -ENODEV; 384 + goto err_out_detach; 383 385 } 384 386 385 387 /* Phys addr can only be set after attaching (for ir->c.dev.bus_id) */ ··· 389 389 ir->c.dev.bus_id); 390 390 391 391 /* init + register input device */ 392 - ir_input_init(input_dev,&ir->ir,ir_type,ir->ir_codes); 392 + ir_input_init(input_dev, &ir->ir, ir_type, ir->ir_codes); 393 393 input_dev->id.bustype = BUS_I2C; 394 394 input_dev->name = ir->c.name; 395 395 input_dev->phys = ir->phys; 396 396 397 - /* register event device */ 398 - input_register_device(ir->input); 397 + err = input_register_device(ir->input); 398 + if (err) 399 + goto err_out_detach; 400 + 399 401 printk(DEVNAME ": %s detected at %s [%s]\n", 400 - ir->input->name,ir->input->phys,adap->name); 402 + ir->input->name, ir->input->phys, adap->name); 401 403 402 404 /* start polling via eventd */ 403 405 INIT_WORK(&ir->work, ir_work); ··· 409 407 schedule_work(&ir->work); 410 408 411 409 return 0; 410 + 411 + err_out_detach: 412 + i2c_detach_client(&ir->c); 413 + err_out_free: 414 + input_free_device(input_dev); 415 + kfree(ir); 416 + return err; 412 417 } 413 418 414 419 static int ir_detach(struct i2c_client *client) ··· 423 414 struct IR_i2c *ir = i2c_get_clientdata(client); 424 415 425 416 /* kill outstanding polls */ 426 - del_timer(&ir->timer); 417 + del_timer_sync(&ir->timer); 427 418 flush_scheduled_work(); 428 419 429 420 /* unregister devices */
+34 -14
drivers/media/video/saa7134/saa7134-input.c
··· 131 131 mod_timer(&ir->timer, timeout); 132 132 } 133 133 134 + static void saa7134_ir_start(struct saa7134_dev *dev, struct saa7134_ir *ir) 135 + { 136 + if (ir->polling) { 137 + init_timer(&ir->timer); 138 + ir->timer.function = saa7134_input_timer; 139 + ir->timer.data = (unsigned long)dev; 140 + ir->timer.expires = jiffies + HZ; 141 + add_timer(&ir->timer); 142 + } 143 + } 144 + 145 + static void saa7134_ir_stop(struct saa7134_dev *dev) 146 + { 147 + if (dev->remote->polling) 148 + del_timer_sync(&dev->remote->timer); 149 + } 150 + 134 151 int saa7134_input_init1(struct saa7134_dev *dev) 135 152 { 136 153 struct saa7134_ir *ir; ··· 158 141 u32 mask_keyup = 0; 159 142 int polling = 0; 160 143 int ir_type = IR_TYPE_OTHER; 144 + int err; 161 145 162 146 if (dev->has_remote != SAA7134_REMOTE_GPIO) 163 147 return -ENODEV; ··· 285 267 ir = kzalloc(sizeof(*ir), GFP_KERNEL); 286 268 input_dev = input_allocate_device(); 287 269 if (!ir || !input_dev) { 288 - kfree(ir); 289 - input_free_device(input_dev); 290 - return -ENOMEM; 270 + err = -ENOMEM; 271 + goto err_out_free; 291 272 } 292 273 293 274 ir->dev = input_dev; ··· 317 300 } 318 301 input_dev->cdev.dev = &dev->pci->dev; 319 302 320 - /* all done */ 321 303 dev->remote = ir; 322 - if (ir->polling) { 323 - init_timer(&ir->timer); 324 - ir->timer.function = saa7134_input_timer; 325 - ir->timer.data = (unsigned long)dev; 326 - ir->timer.expires = jiffies + HZ; 327 - add_timer(&ir->timer); 328 - } 304 + saa7134_ir_start(dev, ir); 329 305 330 - input_register_device(ir->dev); 306 + err = input_register_device(ir->dev); 307 + if (err) 308 + goto err_out_stop; 309 + 331 310 return 0; 311 + 312 + err_out_stop: 313 + saa7134_ir_stop(dev); 314 + dev->remote = NULL; 315 + err_out_free: 316 + input_free_device(input_dev); 317 + kfree(ir); 318 + return err; 332 319 } 333 320 334 321 void saa7134_input_fini(struct saa7134_dev *dev) ··· 340 319 if (NULL == dev->remote) 341 320 return; 342 321 343 - if (dev->remote->polling) 344 - del_timer_sync(&dev->remote->timer); 322 + saa7134_ir_stop(dev); 345 323 input_unregister_device(dev->remote->dev); 346 324 kfree(dev->remote); 347 325 dev->remote = NULL;
+8 -1
drivers/media/video/usbvideo/quickcam_messenger.c
··· 86 86 static void qcm_register_input(struct qcm *cam, struct usb_device *dev) 87 87 { 88 88 struct input_dev *input_dev; 89 + int error; 89 90 90 91 usb_make_path(dev, cam->input_physname, sizeof(cam->input_physname)); 91 92 strncat(cam->input_physname, "/input0", sizeof(cam->input_physname)); ··· 107 106 108 107 input_dev->private = cam; 109 108 110 - input_register_device(cam->input); 109 + error = input_register_device(cam->input); 110 + if (error) { 111 + warn("Failed to register camera's input device, err: %d\n", 112 + error); 113 + input_free_device(cam->input); 114 + cam->input = NULL; 115 + } 111 116 } 112 117 113 118 static void qcm_unregister_input(struct qcm *cam)