Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7df3910 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Greg Kroah-Hartman
Browse files

[PATCH] drivers/media: convert to dynamic input_dev allocation



Input: convert drivers/media to dynamic input_dev allocation

This is required for input_dev sysfs integration

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 76b7cddf
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -252,7 +252,6 @@ void ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
	if (ir_codes)
		memcpy(ir->ir_codes, ir_codes, sizeof(ir->ir_codes));

        init_input_dev(dev);
	dev->keycode     = ir->ir_codes;
	dev->keycodesize = sizeof(IR_KEYTAB_TYPE);
	dev->keycodemax  = IR_KEYTAB_SIZE;
+70 −38
Original line number Diff line number Diff line
@@ -137,7 +137,8 @@ struct cinergyt2 {
	struct urb *stream_urb [STREAM_URB_COUNT];

#ifdef ENABLE_RC
	struct input_dev rc_input_dev;
	struct input_dev *rc_input_dev;
	char phys[64];
	struct work_struct rc_query_work;
	int rc_input_event;
	u32 rc_last_code;
@@ -683,6 +684,7 @@ static struct dvb_device cinergyt2_fe_template = {
};

#ifdef ENABLE_RC

static void cinergyt2_query_rc (void *data)
{
	struct cinergyt2 *cinergyt2 = data;
@@ -703,7 +705,7 @@ static void cinergyt2_query_rc (void *data)
			/* stop key repeat */
			if (cinergyt2->rc_input_event != KEY_MAX) {
				dprintk(1, "rc_input_event=%d Up\n", cinergyt2->rc_input_event);
				input_report_key(&cinergyt2->rc_input_dev,
				input_report_key(cinergyt2->rc_input_dev,
						 cinergyt2->rc_input_event, 0);
				cinergyt2->rc_input_event = KEY_MAX;
			}
@@ -722,7 +724,7 @@ static void cinergyt2_query_rc (void *data)
			/* keyrepeat bit -> just repeat last rc_input_event */
		} else {
			cinergyt2->rc_input_event = KEY_MAX;
			for (i = 0; i < sizeof(rc_keys) / sizeof(rc_keys[0]); i += 3) {
			for (i = 0; i < ARRAY_SIZE(rc_keys); i += 3) {
				if (rc_keys[i + 0] == rc_events[n].type &&
				    rc_keys[i + 1] == le32_to_cpu(rc_events[n].value)) {
					cinergyt2->rc_input_event = rc_keys[i + 2];
@@ -736,11 +738,11 @@ static void cinergyt2_query_rc (void *data)
			    cinergyt2->rc_last_code != ~0) {
				/* emit a key-up so the double event is recognized */
				dprintk(1, "rc_input_event=%d UP\n", cinergyt2->rc_input_event);
				input_report_key(&cinergyt2->rc_input_dev,
				input_report_key(cinergyt2->rc_input_dev,
						 cinergyt2->rc_input_event, 0);
			}
			dprintk(1, "rc_input_event=%d\n", cinergyt2->rc_input_event);
			input_report_key(&cinergyt2->rc_input_dev,
			input_report_key(cinergyt2->rc_input_dev,
					 cinergyt2->rc_input_event, 1);
			cinergyt2->rc_last_code = rc_events[n].value;
		}
@@ -752,7 +754,59 @@ static void cinergyt2_query_rc (void *data)

	up(&cinergyt2->sem);
}
#endif

static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
{
	struct input_dev *input_dev;
	int i;

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

	usb_make_path(cinergyt2->udev, cinergyt2->phys, sizeof(cinergyt2->phys));
	strlcat(cinergyt2->phys, "/input0", sizeof(cinergyt2->phys));
	cinergyt2->rc_input_event = KEY_MAX;
	cinergyt2->rc_last_code = ~0;
	INIT_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc, cinergyt2);

	input_dev->name = DRIVER_NAME " remote control";
	input_dev->phys = cinergyt2->phys;
	input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
	for (i = 0; ARRAY_SIZE(rc_keys); i += 3)
		set_bit(rc_keys[i + 2], input_dev->keybit);
	input_dev->keycodesize = 0;
	input_dev->keycodemax = 0;

	input_register_device(cinergyt2->rc_input_dev);
	schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
}

static void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2)
{
	cancel_delayed_work(&cinergyt2->rc_query_work);
	flush_scheduled_work();
	input_unregister_device(cinergyt2->rc_input_dev);
}

static inline void cinergyt2_suspend_rc(struct cinergyt2 *cinergyt2)
{
	cancel_delayed_work(&cinergyt2->rc_query_work);
}

static inline void cinergyt2_resume_rc(struct cinergyt2 *cinergyt2)
{
	schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
}

#else

static inline int cinergyt2_register_rc(struct cinergyt2 *cinergyt2) { return 0; }
static inline void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2) { }
static inline void cinergyt2_suspend_rc(struct cinergyt2 *cinergyt2) { }
static inline void cinergyt2_resume_rc(struct cinergyt2 *cinergyt2) { }

#endif /* ENABLE_RC */

static void cinergyt2_query (void *data)
{
@@ -789,9 +843,6 @@ static int cinergyt2_probe (struct usb_interface *intf,
{
	struct cinergyt2 *cinergyt2;
	int err;
#ifdef ENABLE_RC
	int i;
#endif

	if (!(cinergyt2 = kmalloc (sizeof(struct cinergyt2), GFP_KERNEL))) {
		dprintk(1, "out of memory?!?\n");
@@ -846,23 +897,10 @@ static int cinergyt2_probe (struct usb_interface *intf,
			    &cinergyt2_fe_template, cinergyt2,
			    DVB_DEVICE_FRONTEND);

#ifdef ENABLE_RC
	cinergyt2->rc_input_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
	cinergyt2->rc_input_dev.keycodesize = 0;
	cinergyt2->rc_input_dev.keycodemax = 0;
	cinergyt2->rc_input_dev.name = DRIVER_NAME " remote control";

	for (i = 0; i < sizeof(rc_keys) / sizeof(rc_keys[0]); i += 3)
		set_bit(rc_keys[i + 2], cinergyt2->rc_input_dev.keybit);

	input_register_device(&cinergyt2->rc_input_dev);

	cinergyt2->rc_input_event = KEY_MAX;
	cinergyt2->rc_last_code = ~0;
	err = cinergyt2_register_rc(cinergyt2);
	if (err)
		goto bailout;

	INIT_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc, cinergyt2);
	schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
#endif
	return 0;

bailout:
@@ -881,11 +919,7 @@ static void cinergyt2_disconnect (struct usb_interface *intf)
	if (down_interruptible(&cinergyt2->sem))
		return;

#ifdef ENABLE_RC
	cancel_delayed_work(&cinergyt2->rc_query_work);
	flush_scheduled_work();
	input_unregister_device(&cinergyt2->rc_input_dev);
#endif
	cinergyt2_unregister_rc(cinergyt2);

	cinergyt2->demux.dmx.close(&cinergyt2->demux.dmx);
	dvb_net_release(&cinergyt2->dvbnet);
@@ -908,9 +942,8 @@ static int cinergyt2_suspend (struct usb_interface *intf, pm_message_t state)

	if (state.event > PM_EVENT_ON) {
		struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
#ifdef ENABLE_RC
		cancel_delayed_work(&cinergyt2->rc_query_work);
#endif

		cinergyt2_suspend_rc(cinergyt2);
		cancel_delayed_work(&cinergyt2->query_work);
		if (cinergyt2->streaming)
			cinergyt2_stop_stream_xfer(cinergyt2);
@@ -938,9 +971,8 @@ static int cinergyt2_resume (struct usb_interface *intf)
		schedule_delayed_work(&cinergyt2->query_work, HZ/2);
	}

#ifdef ENABLE_RC
	schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
#endif
	cinergyt2_resume_rc(cinergyt2);

	up(&cinergyt2->sem);
	return 0;
}
+28 −22
Original line number Diff line number Diff line
@@ -39,9 +39,9 @@ static void dvb_usb_read_remote_control(void *data)
			d->last_event = event;
		case REMOTE_KEY_REPEAT:
			deb_rc("key repeated\n");
			input_event(&d->rc_input_dev, EV_KEY, d->last_event, 1);
			input_event(&d->rc_input_dev, EV_KEY, d->last_event, 0);
			input_sync(&d->rc_input_dev);
			input_event(d->rc_input_dev, EV_KEY, event, 1);
			input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
			input_sync(d->rc_input_dev);
			break;
		default:
			break;
@@ -53,8 +53,8 @@ static void dvb_usb_read_remote_control(void *data)
			deb_rc("NO KEY PRESSED\n");
			if (d->last_state != REMOTE_NO_KEY_PRESSED) {
				deb_rc("releasing event %d\n",d->last_event);
				input_event(&d->rc_input_dev, EV_KEY, d->last_event, 0);
				input_sync(&d->rc_input_dev);
				input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
				input_sync(d->rc_input_dev);
			}
			d->last_state = REMOTE_NO_KEY_PRESSED;
			d->last_event = 0;
@@ -63,8 +63,8 @@ static void dvb_usb_read_remote_control(void *data)
			deb_rc("KEY PRESSED\n");
			deb_rc("pressing event %d\n",event);

			input_event(&d->rc_input_dev, EV_KEY, event, 1);
			input_sync(&d->rc_input_dev);
			input_event(d->rc_input_dev, EV_KEY, event, 1);
			input_sync(d->rc_input_dev);

			d->last_event = event;
			d->last_state = REMOTE_KEY_PRESSED;
@@ -73,8 +73,8 @@ static void dvb_usb_read_remote_control(void *data)
			deb_rc("KEY_REPEAT\n");
			if (d->last_state != REMOTE_NO_KEY_PRESSED) {
				deb_rc("repeating event %d\n",d->last_event);
				input_event(&d->rc_input_dev, EV_KEY, d->last_event, 2);
				input_sync(&d->rc_input_dev);
				input_event(d->rc_input_dev, EV_KEY, d->last_event, 2);
				input_sync(d->rc_input_dev);
				d->last_state = REMOTE_KEY_REPEAT;
			}
		default:
@@ -89,24 +89,30 @@ static void dvb_usb_read_remote_control(void *data)
int dvb_usb_remote_init(struct dvb_usb_device *d)
{
	int i;

	if (d->props.rc_key_map == NULL ||
		d->props.rc_query == NULL ||
		dvb_usb_disable_rc_polling)
		return 0;

	/* Initialise the remote-control structures.*/
	init_input_dev(&d->rc_input_dev);
	usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
	strlcpy(d->rc_phys, "/ir0", sizeof(d->rc_phys));

	d->rc_input_dev = input_allocate_device();
	if (!d->rc_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->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;

	/* 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);
		set_bit(d->props.rc_key_map[i].event, d->rc_input_dev->keybit);
	}

	/* Start the remote-control polling. */
@@ -114,10 +120,10 @@ 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;
	d->rc_input_dev->rep[REP_PERIOD] = d->props.rc_interval;
	d->rc_input_dev->rep[REP_DELAY]  = d->props.rc_interval + 150;

	input_register_device(&d->rc_input_dev);
	input_register_device(d->rc_input_dev);

	INIT_WORK(&d->rc_query_work, dvb_usb_read_remote_control, d);

@@ -134,7 +140,7 @@ int dvb_usb_remote_exit(struct dvb_usb_device *d)
	if (d->state & DVB_USB_STATE_REMOTE) {
		cancel_delayed_work(&d->rc_query_work);
		flush_scheduled_work();
		input_unregister_device(&d->rc_input_dev);
		input_unregister_device(d->rc_input_dev);
	}
	d->state &= ~DVB_USB_STATE_REMOTE;
	return 0;
+2 −1
Original line number Diff line number Diff line
@@ -300,7 +300,8 @@ struct dvb_usb_device {
	int (*fe_init)  (struct dvb_frontend *);

	/* remote control */
	struct input_dev rc_input_dev;
	struct input_dev *rc_input_dev;
	char rc_phys[64];
	struct work_struct rc_query_work;
	u32 last_event;
	int last_state;
+21 −16
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@

static int av_cnt;
static struct av7110 *av_list[4];
static struct input_dev input_dev;
static struct input_dev *input_dev;

static u16 key_map [256] = {
	KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7,
@@ -43,10 +43,10 @@ static u16 key_map [256] = {

static void av7110_emit_keyup(unsigned long data)
{
	if (!data || !test_bit(data, input_dev.key))
	if (!data || !test_bit(data, input_dev->key))
		return;

	input_event(&input_dev, EV_KEY, data, !!0);
	input_event(input_dev, EV_KEY, data, !!0);
}


@@ -112,13 +112,13 @@ static void av7110_emit_key(unsigned long parm)
	if (timer_pending(&keyup_timer)) {
		del_timer(&keyup_timer);
		if (keyup_timer.data != keycode || new_toggle != old_toggle) {
			input_event(&input_dev, EV_KEY, keyup_timer.data, !!0);
			input_event(&input_dev, EV_KEY, keycode, !0);
			input_event(input_dev, EV_KEY, keyup_timer.data, !!0);
			input_event(input_dev, EV_KEY, keycode, !0);
		} else
			input_event(&input_dev, EV_KEY, keycode, 2);
			input_event(input_dev, EV_KEY, keycode, 2);

	} else
		input_event(&input_dev, EV_KEY, keycode, !0);
		input_event(input_dev, EV_KEY, keycode, !0);

	keyup_timer.expires = jiffies + UP_TIMEOUT;
	keyup_timer.data = keycode;
@@ -132,13 +132,13 @@ static void input_register_keys(void)
{
	int i;

	memset(input_dev.keybit, 0, sizeof(input_dev.keybit));
	memset(input_dev->keybit, 0, sizeof(input_dev->keybit));

	for (i = 0; i < sizeof(key_map) / sizeof(key_map[0]); i++) {
	for (i = 0; i < ARRAY_SIZE(key_map); i++) {
		if (key_map[i] > KEY_MAX)
			key_map[i] = 0;
		else if (key_map[i] > KEY_RESERVED)
			set_bit(key_map[i], input_dev.keybit);
			set_bit(key_map[i], input_dev->keybit);
	}
}

@@ -216,12 +216,17 @@ int __init av7110_ir_init(struct av7110 *av7110)
		init_timer(&keyup_timer);
		keyup_timer.data = 0;

		input_dev.name = "DVB on-card IR receiver";
		set_bit(EV_KEY, input_dev.evbit);
		set_bit(EV_REP, input_dev.evbit);
		input_dev = input_allocate_device();
		if (!input_dev)
			return -ENOMEM;

		input_dev->name = "DVB on-card IR receiver";

		set_bit(EV_KEY, input_dev->evbit);
		set_bit(EV_REP, input_dev->evbit);
		input_register_keys();
		input_register_device(&input_dev);
		input_dev.timer.function = input_repeat_key;
		input_register_device(input_dev);
		input_dev->timer.function = input_repeat_key;

		e = create_proc_entry("av7110_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL);
		if (e) {
@@ -256,7 +261,7 @@ void __exit av7110_ir_exit(struct av7110 *av7110)
	if (av_cnt == 1) {
		del_timer_sync(&keyup_timer);
		remove_proc_entry("av7110_ir", NULL);
		input_unregister_device(&input_dev);
		input_unregister_device(input_dev);
	}

	av_cnt--;
Loading