Commit b07b4783 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Mauro Carvalho Chehab
Browse files

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



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

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent ff67c614
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -746,6 +746,7 @@ static void cinergyt2_query_rc (struct work_struct *work)
				dprintk(1, "rc_input_event=%d Up\n", cinergyt2->rc_input_event);
				input_report_key(cinergyt2->rc_input_dev,
						 cinergyt2->rc_input_event, 0);
				input_sync(cinergyt2->rc_input_dev);
				cinergyt2->rc_input_event = KEY_MAX;
			}
			cinergyt2->rc_last_code = ~0;
@@ -783,6 +784,7 @@ static void cinergyt2_query_rc (struct work_struct *work)
			dprintk(1, "rc_input_event=%d\n", cinergyt2->rc_input_event);
			input_report_key(cinergyt2->rc_input_dev,
					 cinergyt2->rc_input_event, 1);
			input_sync(cinergyt2->rc_input_dev);
			cinergyt2->rc_last_code = rc_events[n].value;
		}
	}
@@ -798,8 +800,9 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
{
	struct input_dev *input_dev;
	int i;
	int err;

	cinergyt2->rc_input_dev = input_dev = input_allocate_device();
	input_dev = input_allocate_device();
	if (!input_dev)
		return -ENOMEM;

@@ -817,7 +820,13 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
	input_dev->keycodesize = 0;
	input_dev->keycodemax = 0;

	input_register_device(cinergyt2->rc_input_dev);
	err = input_register_device(input_dev);
	if (err) {
		input_free_device(input_dev);
		return err;
	}

	cinergyt2->rc_input_dev = input_dev;
	schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);

	return 0;
+23 −14
Original line number Diff line number Diff line
@@ -90,7 +90,9 @@ schedule:

int dvb_usb_remote_init(struct dvb_usb_device *d)
{
	struct input_dev *input_dev;
	int i;
	int err;

	if (d->props.rc_key_map == NULL ||
		d->props.rc_query == NULL ||
@@ -100,23 +102,24 @@ int dvb_usb_remote_init(struct dvb_usb_device *d)
	usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
	strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));

	d->rc_input_dev = input_allocate_device();
	if (!d->rc_input_dev)
	input_dev = input_allocate_device();
	if (!input_dev)
		return -ENOMEM;

	d->rc_input_dev->evbit[0] = BIT(EV_KEY);
	d->rc_input_dev->keycodesize = sizeof(unsigned char);
	d->rc_input_dev->keycodemax = KEY_MAX;
	d->rc_input_dev->name = "IR-receiver inside an USB DVB receiver";
	d->rc_input_dev->phys = d->rc_phys;
	usb_to_input_id(d->udev, &d->rc_input_dev->id);
	d->rc_input_dev->cdev.dev = &d->udev->dev;
	input_dev->evbit[0] = BIT(EV_KEY);
	input_dev->keycodesize = sizeof(unsigned char);
	input_dev->keycodemax = KEY_MAX;
	input_dev->name = "IR-receiver inside an USB DVB receiver";
	input_dev->phys = d->rc_phys;
	usb_to_input_id(d->udev, &input_dev->id);
	input_dev->cdev.dev = &d->udev->dev;

	/* set the bits for the keys */
	deb_rc("key map size: %d\n", d->props.rc_key_map_size);
	for (i = 0; i < d->props.rc_key_map_size; i++) {
		deb_rc("setting bit for event %d item %d\n",d->props.rc_key_map[i].event, i);
		set_bit(d->props.rc_key_map[i].event, d->rc_input_dev->keybit);
		deb_rc("setting bit for event %d item %d\n",
			d->props.rc_key_map[i].event, i);
		set_bit(d->props.rc_key_map[i].event, input_dev->keybit);
	}

	/* Start the remote-control polling. */
@@ -124,10 +127,16 @@ int dvb_usb_remote_init(struct dvb_usb_device *d)
		d->props.rc_interval = 100; /* default */

	/* setting these two values to non-zero, we have to manage key repeats */
	d->rc_input_dev->rep[REP_PERIOD] = d->props.rc_interval;
	d->rc_input_dev->rep[REP_DELAY]  = d->props.rc_interval + 150;
	input_dev->rep[REP_PERIOD] = d->props.rc_interval;
	input_dev->rep[REP_DELAY]  = d->props.rc_interval + 150;

	input_register_device(d->rc_input_dev);
	err = input_register_device(input_dev);
	if (err) {
		input_free_device(input_dev);
		return err;
	}

	d->rc_input_dev = input_dev;

	INIT_DELAYED_WORK(&d->rc_query_work, dvb_usb_read_remote_control);

+17 −8
Original line number Diff line number Diff line
@@ -48,7 +48,8 @@ static void av7110_emit_keyup(unsigned long data)
	if (!data || !test_bit(data, input_dev->key))
		return;

	input_event(input_dev, EV_KEY, data, !!0);
	input_report_key(input_dev, data, 0);
	input_sync(input_dev);
}


@@ -115,14 +116,17 @@ static void av7110_emit_key(unsigned long parm)
		del_timer(&keyup_timer);
		if (keyup_timer.data != keycode || new_toggle != old_toggle) {
			delay_timer_finished = 0;
			input_event(input_dev, EV_KEY, keyup_timer.data, !!0);
			input_event(input_dev, EV_KEY, keycode, !0);
		} else
			if (delay_timer_finished)
			input_event(input_dev, EV_KEY, keyup_timer.data, 0);
			input_event(input_dev, EV_KEY, keycode, 1);
			input_sync(input_dev);
		} else if (delay_timer_finished) {
			input_event(input_dev, EV_KEY, keycode, 2);
			input_sync(input_dev);
		}
	} else {
		delay_timer_finished = 0;
		input_event(input_dev, EV_KEY, keycode, !0);
		input_event(input_dev, EV_KEY, keycode, 1);
		input_sync(input_dev);
	}

	keyup_timer.expires = jiffies + UP_TIMEOUT;
@@ -211,6 +215,7 @@ static void ir_handler(struct av7110 *av7110, u32 ircom)
int __devinit av7110_ir_init(struct av7110 *av7110)
{
	static struct proc_dir_entry *e;
	int err;

	if (av_cnt >= sizeof av_list/sizeof av_list[0])
		return -ENOSPC;
@@ -231,7 +236,11 @@ int __devinit av7110_ir_init(struct av7110 *av7110)
		set_bit(EV_KEY, input_dev->evbit);
		set_bit(EV_REP, input_dev->evbit);
		input_register_keys();
		input_register_device(input_dev);
		err = input_register_device(input_dev);
		if (err) {
			input_free_device(input_dev);
			return err;
		}
		input_dev->timer.function = input_repeat_key;

		e = create_proc_entry("av7110_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL);
+25 −17
Original line number Diff line number Diff line
@@ -143,15 +143,15 @@ static void msp430_ir_debounce(unsigned long data)
	struct input_dev *dev = (struct input_dev *) data;

	if (dev->rep[0] == 0 || dev->rep[0] == ~0) {
		input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
		return;
	}

		input_event(dev, EV_KEY, key_map[dev->repeat_key], 0);
	} else {
		dev->rep[0] = 0;
		dev->timer.expires = jiffies + HZ * 350 / 1000;
		add_timer(&dev->timer);
		input_event(dev, EV_KEY, key_map[dev->repeat_key], 2);	/* REPEAT */
	}
	input_sync(dev);
}

static void msp430_ir_interrupt(unsigned long data)
{
@@ -169,7 +169,7 @@ static void msp430_ir_interrupt(unsigned long data)
				return;
			}
			del_timer(&dev->timer);
			input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
			input_event(dev, EV_KEY, key_map[dev->repeat_key], 0);
		}

		if (!key_map[code]) {
@@ -177,15 +177,14 @@ static void msp430_ir_interrupt(unsigned long data)
			return;
		}

		input_event(dev, EV_KEY, key_map[code], 1);
		input_sync(dev);

		/* initialize debounce and repeat */
		dev->repeat_key = code;
		/* Zenith remote _always_ sends 2 sequences */
		dev->rep[0] = ~0;
		/* 350 milliseconds */
		dev->timer.expires = jiffies + HZ * 350 / 1000;
		/* MAKE */
		input_event(dev, EV_KEY, key_map[code], !0);
		add_timer(&dev->timer);
		mod_timer(&dev->timer, jiffies + msecs_to_jiffies(350));
	}
}

@@ -194,8 +193,9 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
	struct saa7146_dev *saa = budget_ci->budget.dev;
	struct input_dev *input_dev;
	int i;
	int err;

	budget_ci->input_dev = input_dev = input_allocate_device();
	input_dev = input_allocate_device();
	if (!input_dev)
		return -ENOMEM;

@@ -208,10 +208,16 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
		if (key_map[i])
			set_bit(key_map[i], input_dev->keybit);

	input_register_device(budget_ci->input_dev);
	err = input_register_device(input_dev);
	if (err) {
		input_free_device(input_dev);
		return err;
	}

	input_dev->timer.function = msp430_ir_debounce;

	budget_ci->input_dev = input_dev;

	saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_06);
	saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI);

@@ -226,8 +232,10 @@ static void msp430_ir_deinit(struct budget_ci *budget_ci)
	saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_06);
	saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);

	if (del_timer(&dev->timer))
		input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
	if (del_timer(&dev->timer)) {
		input_event(dev, EV_KEY, key_map[dev->repeat_key], 0);
		input_sync(dev);
	}

	input_unregister_device(dev);
}
+9 −2
Original line number Diff line number Diff line
@@ -238,6 +238,7 @@ static void ttusb_dec_handle_irq( struct urb *urb)
		 * for now lets report each signal as a key down and up*/
		dprintk("%s:rc signal:%d\n", __FUNCTION__, buffer[4]);
		input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 1);
		input_sync(dec->rc_input_dev);
		input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 0);
		input_sync(dec->rc_input_dev);
	}
@@ -1187,11 +1188,12 @@ static int ttusb_init_rc( struct ttusb_dec *dec)
	struct input_dev *input_dev;
	u8 b[] = { 0x00, 0x01 };
	int i;
	int err;

	usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys));
	strlcpy(dec->rc_phys, "/input0", sizeof(dec->rc_phys));

	dec->rc_input_dev = input_dev = input_allocate_device();
	input_dev = input_allocate_device();
	if (!input_dev)
		return -ENOMEM;

@@ -1205,8 +1207,13 @@ static int ttusb_init_rc( struct ttusb_dec *dec)
	for (i = 0; i < ARRAY_SIZE(rc_keys); i++)
		  set_bit(rc_keys[i], input_dev->keybit);

	input_register_device(input_dev);
	err = input_register_device(input_dev);
	if (err) {
		input_free_device(input_dev);
		return err;
	}

	dec->rc_input_dev = input_dev;
	if (usb_submit_urb(dec->irq_urb, GFP_KERNEL))
		printk("%s: usb_submit_urb failed\n",__FUNCTION__);
	/* enable irq pipe */
Loading