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

Commit b2c68a2f authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Jiri Kosina
Browse files

HID: hid-input: allow input_configured callback return errors



When configuring input device via input_configured callback we may
encounter errors (for example input_mt_init_slots() may fail). Instead
of continuing with half-initialized input device let's allow driver
indicate failures.

Signed-off-by: default avatarJaikumar Ganesh <jaikumarg@android.com>
Signed-off-by: default avatarArve Hjønnevåg <arve@android.com>
Reviewed-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Reviewed-by: default avatarDavid Herrmann <dh.herrmann@gmail.com>
Acked-by: default avatarNikolai Kondrashov <Nikolai.Kondrashov@redhat.com>
Acked-by: default avatarAndrew Duggan <aduggan@synaptics.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 06780727
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -256,7 +256,7 @@ static int appleir_raw_event(struct hid_device *hid, struct hid_report *report,
	return 0;
}

static void appleir_input_configured(struct hid_device *hid,
static int appleir_input_configured(struct hid_device *hid,
		struct hid_input *hidinput)
{
	struct input_dev *input_dev = hidinput->input;
@@ -275,6 +275,8 @@ static void appleir_input_configured(struct hid_device *hid,
	for (i = 0; i < ARRAY_SIZE(appleir_key_table); i++)
		set_bit(appleir->keymap[i], input_dev->keybit);
	clear_bit(KEY_RESERVED, input_dev->keybit);

	return 0;
}

static int appleir_input_mapping(struct hid_device *hid,
+3 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ static bool use_fw_quirk = true;
module_param(use_fw_quirk, bool, S_IRUGO);
MODULE_PARM_DESC(use_fw_quirk, "Do periodic pokes for broken M firmwares (default = true)");

static void elo_input_configured(struct hid_device *hdev,
static int elo_input_configured(struct hid_device *hdev,
		struct hid_input *hidinput)
{
	struct input_dev *input = hidinput->input;
@@ -45,6 +45,8 @@ static void elo_input_configured(struct hid_device *hdev,
	set_bit(BTN_TOUCH, input->keybit);
	set_bit(ABS_PRESSURE, input->absbit);
	input_set_abs_params(input, ABS_PRESSURE, 0, 256, 0, 0);

	return 0;
}

static void elo_process_data(struct input_dev *input, const u8 *data, int size)
+6 −4
Original line number Diff line number Diff line
@@ -1510,8 +1510,9 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
				 * UGCI) cram a lot of unrelated inputs into the
				 * same interface. */
				hidinput->report = report;
				if (drv->input_configured)
					drv->input_configured(hid, hidinput);
				if (drv->input_configured &&
				    drv->input_configured(hid, hidinput))
					goto out_cleanup;
				if (input_register_device(hidinput->input))
					goto out_cleanup;
				hidinput = NULL;
@@ -1532,8 +1533,9 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
	}

	if (hidinput) {
		if (drv->input_configured)
			drv->input_configured(hid, hidinput);
		if (drv->input_configured &&
		    drv->input_configured(hid, hidinput))
			goto out_cleanup;
		if (input_register_device(hidinput->input))
			goto out_cleanup;
	}
+3 −1
Original line number Diff line number Diff line
@@ -848,7 +848,7 @@ static void lenovo_remove(struct hid_device *hdev)
	hid_hw_stop(hdev);
}

static void lenovo_input_configured(struct hid_device *hdev,
static int lenovo_input_configured(struct hid_device *hdev,
		struct hid_input *hi)
{
	switch (hdev->product) {
@@ -863,6 +863,8 @@ static void lenovo_input_configured(struct hid_device *hdev,
			}
			break;
	}

	return 0;
}


+3 −1
Original line number Diff line number Diff line
@@ -1160,13 +1160,15 @@ static void hidpp_populate_input(struct hidpp_device *hidpp,
		m560_populate_input(hidpp, input, origin_is_hid_core);
}

static void hidpp_input_configured(struct hid_device *hdev,
static int hidpp_input_configured(struct hid_device *hdev,
				struct hid_input *hidinput)
{
	struct hidpp_device *hidpp = hid_get_drvdata(hdev);
	struct input_dev *input = hidinput->input;

	hidpp_populate_input(hidpp, input, true);

	return 0;
}

static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
Loading