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

Commit 229695e5 authored by Jiri Kosina's avatar Jiri Kosina Committed by Greg Kroah-Hartman
Browse files

[PATCH] Generic HID layer - API



- fixed generic API (added neccessary EXPORT_SYMBOL, fixed hid.h to provide correct
  prototypes)
- extended hid_device with open/close/event function pointers to driver-specific
  functions
- added driver specific driver_data to hid_device

Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent dde5845a
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
/*
 *  USB HID support for Linux
 *  HID support for Linux
 *
 *  Copyright (c) 1999 Andreas Gal
 *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
@@ -31,8 +31,6 @@
#undef DEBUG
#undef DEBUG_DATA

#include <linux/usb.h>

#include <linux/hid.h>
#include <linux/hiddev.h>

@@ -538,7 +536,7 @@ static void hid_free_report(struct hid_report *report)
 * Free a device structure, all reports, and all fields.
 */

static void hid_free_device(struct hid_device *device)
void hid_free_device(struct hid_device *device)
{
	unsigned i,j;

@@ -555,6 +553,7 @@ static void hid_free_device(struct hid_device *device)
	kfree(device->rdesc);
	kfree(device);
}
EXPORT_SYMBOL_GPL(hid_free_device);

/*
 * Fetch a report description item from the data stream. We support long
@@ -629,7 +628,7 @@ static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item)
 * enumerated, fields are attached to these reports.
 */

static struct hid_device *hid_parse_report(__u8 *start, unsigned size)
struct hid_device *hid_parse_report(__u8 *start, unsigned size)
{
	struct hid_device *device;
	struct hid_parser *parser;
@@ -719,6 +718,7 @@ static struct hid_device *hid_parse_report(__u8 *start, unsigned size)
	kfree(parser);
	return NULL;
}
EXPORT_SYMBOL_GPL(hid_parse_report);

/*
 * Convert a signed n-bit integer to signed 32-bit integer. Common
@@ -829,7 +829,7 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field, s
 * reporting to the layer).
 */

static void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data, int interrupt)
void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data, int interrupt)
{
	unsigned n;
	unsigned count = field->report_count;
@@ -875,7 +875,7 @@ static void hid_input_field(struct hid_device *hid, struct hid_field *field, __u
exit:
	kfree(value);
}

EXPORT_SYMBOL_GPL(hid_input_field);

/*
 * Output the field into the report.
@@ -900,7 +900,7 @@ static void hid_output_field(struct hid_field *field, __u8 *data)
 * Create a report.
 */

static void hid_output_report(struct hid_report *report, __u8 *data)
void hid_output_report(struct hid_report *report, __u8 *data)
{
	unsigned n;

@@ -910,6 +910,7 @@ static void hid_output_report(struct hid_report *report, __u8 *data)
	for (n = 0; n < report->maxfield; n++)
		hid_output_field(report->field[n], data);
}
EXPORT_SYMBOL_GPL(hid_output_report);

/*
 * Set a field value. The report this field belongs to has to be
@@ -937,4 +938,5 @@ int hid_set_field(struct hid_field *field, unsigned offset, __s32 value)
	field->value[offset] = value;
	return 0;
}
EXPORT_SYMBOL_GPL(hid_set_field);
+13 −6
Original line number Diff line number Diff line
@@ -727,8 +727,9 @@ void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
	list_for_each_entry(hidinput, &hid->inputs, list)
		input_sync(hidinput->input);
}
EXPORT_SYMBOL_GPL(hidinput_report_event);

static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field)
int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field)
{
	struct hid_report *report;
	int i, j;
@@ -743,6 +744,7 @@ static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsign
	}
	return -1;
}
EXPORT_SYMBOL_GPL(hidinput_find_field);

/*
 * Register the input device; print a message.
@@ -752,7 +754,6 @@ static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsign

int hidinput_connect(struct hid_device *hid)
{
	struct usb_device *dev = hid->dev;
	struct hid_report *report;
	struct hid_input *hidinput = NULL;
	struct input_dev *input_dev;
@@ -786,14 +787,17 @@ int hidinput_connect(struct hid_device *hid)
				}

				input_dev->private = hid;
				input_dev->event = hidinput_input_event;
				input_dev->open = hidinput_open;
				input_dev->close = hidinput_close;
				input_dev->event = hid->hidinput_input_event;
				input_dev->open = hid->hidinput_open;
				input_dev->close = hid->hidinput_close;

				input_dev->name = hid->name;
				input_dev->phys = hid->phys;
				input_dev->uniq = hid->uniq;
				usb_to_input_id(dev, &input_dev->id);
				input_dev->id.bustype = hid->bus;
				input_dev->id.vendor  = hid->vendor;
				input_dev->id.product = hid->product;
				input_dev->id.version = hid->version;
				input_dev->cdev.dev = &hid->intf->dev;

				hidinput->input = input_dev;
@@ -827,6 +831,7 @@ int hidinput_connect(struct hid_device *hid)

	return 0;
}
EXPORT_SYMBOL_GPL(hidinput_connect);

void hidinput_disconnect(struct hid_device *hid)
{
@@ -838,3 +843,5 @@ void hidinput_disconnect(struct hid_device *hid)
		kfree(hidinput);
	}
}
EXPORT_SYMBOL_GPL(hidinput_disconnect);
+8 −1
Original line number Diff line number Diff line
@@ -497,7 +497,7 @@ void hid_submit_report(struct hid_device *hid, struct hid_report *report, unsign
	spin_unlock_irqrestore(&hid->ctrllock, flags);
}

static int hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
static int usb_hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{
	struct hid_device *hid = dev->private;
	struct hid_field *field;
@@ -1231,6 +1231,10 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
			 le16_to_cpu(dev->descriptor.idVendor),
			 le16_to_cpu(dev->descriptor.idProduct));

	hid->bus = BUS_USB;
	hid->vendor = dev->descriptor.idVendor;
	hid->product = dev->descriptor.idProduct;

	usb_make_path(dev, hid->phys, sizeof(hid->phys));
	strlcat(hid->phys, "/input", sizeof(hid->phys));
	len = strlen(hid->phys);
@@ -1250,6 +1254,9 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
	hid->urbctrl->setup_dma = hid->cr_dma;
	hid->urbctrl->transfer_dma = hid->ctrlbuf_dma;
	hid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
	hid->hidinput_input_event = usb_hidinput_input_event;
	hid->hidinput_open = hidinput_open;
	hid->hidinput_close = hidinput_close;

	return hid;

+2 −0
Original line number Diff line number Diff line
@@ -79,3 +79,5 @@ int hid_ff_init(struct hid_device* hid)

	return init->init(hid);
}
EXPORT_SYMBOL_GPL(hid_ff_init);
+1 −1
Original line number Diff line number Diff line
@@ -197,7 +197,7 @@ void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,

	hiddev_send_event(hid, &uref);
}

EXPORT_SYMBOL_GPL(hiddev_hid_event);

void hiddev_report_event(struct hid_device *hid, struct hid_report *report)
{
Loading