HID: Add an input configured notification callback
A hid device may create several input devices, and a driver may need to prepare or finalize the configuration per input device. Currently, there is no sane way for a driver to know when a device has been configured. This patch adds a callback providing that information. Reviewed-and-tested-by: Benjamin Tissoires <benjamin.tissoires@enac.fr> Tested-by: Ping Cheng <pingc@wacom.com> Acked-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
This commit is contained in:
parent
2273929340
commit
9ebf3d7687
|
@ -1154,6 +1154,7 @@ static void report_features(struct hid_device *hid)
|
||||||
|
|
||||||
int hidinput_connect(struct hid_device *hid, unsigned int force)
|
int hidinput_connect(struct hid_device *hid, unsigned int force)
|
||||||
{
|
{
|
||||||
|
struct hid_driver *drv = hid->driver;
|
||||||
struct hid_report *report;
|
struct hid_report *report;
|
||||||
struct hid_input *hidinput = NULL;
|
struct hid_input *hidinput = NULL;
|
||||||
struct input_dev *input_dev;
|
struct input_dev *input_dev;
|
||||||
|
@ -1228,6 +1229,8 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
|
||||||
* UGCI) cram a lot of unrelated inputs into the
|
* UGCI) cram a lot of unrelated inputs into the
|
||||||
* same interface. */
|
* same interface. */
|
||||||
hidinput->report = report;
|
hidinput->report = report;
|
||||||
|
if (drv->input_configured)
|
||||||
|
drv->input_configured(hid, hidinput);
|
||||||
if (input_register_device(hidinput->input))
|
if (input_register_device(hidinput->input))
|
||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
hidinput = NULL;
|
hidinput = NULL;
|
||||||
|
@ -1235,8 +1238,12 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hidinput && input_register_device(hidinput->input))
|
if (hidinput) {
|
||||||
goto out_cleanup;
|
if (drv->input_configured)
|
||||||
|
drv->input_configured(hid, hidinput);
|
||||||
|
if (input_register_device(hidinput->input))
|
||||||
|
goto out_cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -626,6 +626,7 @@ struct hid_usage_id {
|
||||||
* @report_fixup: called before report descriptor parsing (NULL means nop)
|
* @report_fixup: called before report descriptor parsing (NULL means nop)
|
||||||
* @input_mapping: invoked on input registering before mapping an usage
|
* @input_mapping: invoked on input registering before mapping an usage
|
||||||
* @input_mapped: invoked on input registering after mapping an usage
|
* @input_mapped: invoked on input registering after mapping an usage
|
||||||
|
* @input_configured: invoked just before the device is registered
|
||||||
* @feature_mapping: invoked on feature registering
|
* @feature_mapping: invoked on feature registering
|
||||||
* @suspend: invoked on suspend (NULL means nop)
|
* @suspend: invoked on suspend (NULL means nop)
|
||||||
* @resume: invoked on resume if device was not reset (NULL means nop)
|
* @resume: invoked on resume if device was not reset (NULL means nop)
|
||||||
|
@ -670,6 +671,8 @@ struct hid_driver {
|
||||||
int (*input_mapped)(struct hid_device *hdev,
|
int (*input_mapped)(struct hid_device *hdev,
|
||||||
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 (*input_configured)(struct hid_device *hdev,
|
||||||
|
struct hid_input *hidinput);
|
||||||
void (*feature_mapping)(struct hid_device *hdev,
|
void (*feature_mapping)(struct hid_device *hdev,
|
||||||
struct hid_field *field,
|
struct hid_field *field,
|
||||||
struct hid_usage *usage);
|
struct hid_usage *usage);
|
||||||
|
|
Loading…
Reference in a new issue