Commit f635bd11 authored by Henrik Rydberg's avatar Henrik Rydberg Committed by Jiri Kosina

HID: Do not create input devices for feature reports

When the multi input quirk is set, there is a new input device
created for every feature report. Since the idea is to present
features per hid device, not per input device, revert back to
the original report loop and change the feature_mapping() callback
to not take the input device as argument.
Signed-off-by: default avatarHenrik Rydberg <rydberg@euromail.se>
Tested-by: default avatarBenjamin Tissoires <benjmain.tissoires@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 97e1efbb
...@@ -290,14 +290,6 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel ...@@ -290,14 +290,6 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
goto ignore; goto ignore;
} }
if (field->report_type == HID_FEATURE_REPORT) {
if (device->driver->feature_mapping) {
device->driver->feature_mapping(device, hidinput, field,
usage);
}
goto ignore;
}
if (device->driver->input_mapping) { if (device->driver->input_mapping) {
int ret = device->driver->input_mapping(device, hidinput, field, int ret = device->driver->input_mapping(device, hidinput, field,
usage, &bit, &max); usage, &bit, &max);
...@@ -835,6 +827,24 @@ static void hidinput_close(struct input_dev *dev) ...@@ -835,6 +827,24 @@ static void hidinput_close(struct input_dev *dev)
hid_hw_close(hid); hid_hw_close(hid);
} }
static void report_features(struct hid_device *hid)
{
struct hid_driver *drv = hid->driver;
struct hid_report_enum *rep_enum;
struct hid_report *rep;
int i, j;
if (!drv->feature_mapping)
return;
rep_enum = &hid->report_enum[HID_FEATURE_REPORT];
list_for_each_entry(rep, &rep_enum->report_list, list)
for (i = 0; i < rep->maxfield; i++)
for (j = 0; j < rep->field[i]->maxusage; j++)
drv->feature_mapping(hid, rep->field[i],
rep->field[i]->usage + j);
}
/* /*
* Register the input device; print a message. * Register the input device; print a message.
* Configure the input layer interface * Configure the input layer interface
...@@ -863,7 +873,9 @@ int hidinput_connect(struct hid_device *hid, unsigned int force) ...@@ -863,7 +873,9 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
return -1; return -1;
} }
for (k = HID_INPUT_REPORT; k <= HID_FEATURE_REPORT; k++) { report_features(hid);
for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) {
if (k == HID_OUTPUT_REPORT && if (k == HID_OUTPUT_REPORT &&
hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS) hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS)
continue; continue;
......
...@@ -122,7 +122,7 @@ struct mt_class mt_classes[] = { ...@@ -122,7 +122,7 @@ struct mt_class mt_classes[] = {
{ } { }
}; };
static void mt_feature_mapping(struct hid_device *hdev, struct hid_input *hi, static void mt_feature_mapping(struct hid_device *hdev,
struct hid_field *field, struct hid_usage *usage) struct hid_field *field, struct hid_usage *usage)
{ {
if (usage->hid == HID_DG_INPUTMODE) { if (usage->hid == HID_DG_INPUTMODE) {
......
...@@ -638,7 +638,7 @@ struct hid_driver { ...@@ -638,7 +638,7 @@ struct hid_driver {
struct hid_input *hidinput, struct hid_field *field, struct hid_input *hidinput, struct hid_field *field,
struct hid_usage *usage, unsigned long **bit, int *max); struct hid_usage *usage, unsigned long **bit, int *max);
void (*feature_mapping)(struct hid_device *hdev, void (*feature_mapping)(struct hid_device *hdev,
struct hid_input *hidinput, struct hid_field *field, struct hid_field *field,
struct hid_usage *usage); struct hid_usage *usage);
#ifdef CONFIG_PM #ifdef CONFIG_PM
int (*suspend)(struct hid_device *hdev, pm_message_t message); int (*suspend)(struct hid_device *hdev, pm_message_t message);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment