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

Commit 127278ce authored by Dmitry Torokhov's avatar Dmitry Torokhov
Browse files

Input: joysticks - handle errors when registering input devices



Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 52c1f570
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -521,11 +521,19 @@ static int adi_connect(struct gameport *gameport, struct gameport_driver *drv)
	for (i = 0; i < 2; i++)
		if (port->adi[i].length > 0) {
			adi_init_center(port->adi + i);
			input_register_device(port->adi[i].dev);
			err = input_register_device(port->adi[i].dev);
			if (err)
				goto fail3;
		}

	return 0;

 fail3: while (--i >= 0) {
		if (port->adi[i].length > 0) {
			input_unregister_device(port->adi[i].dev);
			port->adi[i].dev = NULL;
		}
	}
 fail2:	for (i = 0; i < 2; i++)
		if (port->adi[i].dev)
			input_free_device(port->adi[i].dev);
+5 −1
Original line number Diff line number Diff line
@@ -147,7 +147,11 @@ static int __init amijoy_init(void)
			amijoy_dev[i]->absmax[ABS_X + j] = 1;
		}

		input_register_device(amijoy_dev[i]);
		err = input_register_device(amijoy_dev[i]);
		if (err) {
			input_free_device(amijoy_dev[i]);
			goto fail;
		}
	}
	return 0;

+8 −2
Original line number Diff line number Diff line
@@ -434,6 +434,7 @@ static int analog_init_device(struct analog_port *port, struct analog *analog, i
{
	struct input_dev *input_dev;
	int i, j, t, v, w, x, y, z;
	int error;

	analog_name(analog);
	snprintf(analog->phys, sizeof(analog->phys),
@@ -505,7 +506,11 @@ static int analog_init_device(struct analog_port *port, struct analog *analog, i

	analog_decode(analog, port->axes, port->initial, port->buttons);

	input_register_device(analog->dev);
	error = input_register_device(analog->dev);
	if (error) {
		input_free_device(analog->dev);
		return error;
	}

	return 0;
}
@@ -668,6 +673,7 @@ static int analog_connect(struct gameport *gameport, struct gameport_driver *drv
	return 0;

 fail3: while (--i >= 0)
		if (port->analog[i].mask)
			input_unregister_device(port->analog[i].dev);
 fail2:	gameport_close(gameport);
 fail1:	gameport_set_drvdata(gameport, NULL);
+5 −2
Original line number Diff line number Diff line
@@ -223,12 +223,15 @@ static int cobra_connect(struct gameport *gameport, struct gameport_driver *drv)
		for (j = 0; cobra_btn[j]; j++)
			set_bit(cobra_btn[j], input_dev->keybit);

		input_register_device(cobra->dev[i]);
		err = input_register_device(cobra->dev[i]);
		if (err)
			goto fail4;
	}

	return 0;

 fail3:	for (i = 0; i < 2; i++)
 fail4:	input_free_device(cobra->dev[i]);
 fail3:	while (--i >= 0)
		if (cobra->dev[i])
			input_unregister_device(cobra->dev[i]);
 fail2:	gameport_close(gameport);
+3 −1
Original line number Diff line number Diff line
@@ -341,7 +341,9 @@ static int gf2k_connect(struct gameport *gameport, struct gameport_driver *drv)
		input_dev->absflat[gf2k_abs[i]] = (i < 2) ? 24 : 0;
	}

	input_register_device(gf2k->dev);
	err = input_register_device(gf2k->dev);
	if (err)
		goto fail2;

	return 0;

Loading