Skip to content

Commit

Permalink
Merge branches 'upstream', 'upstream-fixes' and 'debugfs' into for-linus
Browse files Browse the repository at this point in the history
  • Loading branch information
Jiri Kosina committed Sep 13, 2009
3 parents affbb8c + 42960a1 + a809dda commit 8123e8f
Show file tree
Hide file tree
Showing 9 changed files with 455 additions and 153 deletions.
15 changes: 0 additions & 15 deletions drivers/hid/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,6 @@ config HID

If unsure, say Y.

config HID_DEBUG
bool "HID debugging support"
default y
depends on HID
---help---
This option lets the HID layer output diagnostics about its internal
state, resolve HID usages, dump HID fields, etc. Individual HID drivers
use this debugging facility to output information about individual HID
devices, etc.

This feature is useful for those who are either debugging the HID parser
or any HID hardware device.

If unsure, say Y.

config HIDRAW
bool "/dev/hidraw raw HID device support"
depends on HID
Expand Down
5 changes: 4 additions & 1 deletion drivers/hid/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
#
hid-objs := hid-core.o hid-input.o

ifdef CONFIG_DEBUG_FS
hid-objs += hid-debug.o
endif

obj-$(CONFIG_HID) += hid.o

hid-$(CONFIG_HID_DEBUG) += hid-debug.o
hid-$(CONFIG_HIDRAW) += hidraw.o

hid-logitech-objs := hid-lg.o
Expand Down
56 changes: 43 additions & 13 deletions drivers/hid/hid-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,10 @@
#define DRIVER_DESC "HID core driver"
#define DRIVER_LICENSE "GPL"

#ifdef CONFIG_HID_DEBUG
int hid_debug = 0;
module_param_named(debug, hid_debug, int, 0600);
MODULE_PARM_DESC(debug, "HID debugging (0=off, 1=probing info, 2=continuous data dumping)");
MODULE_PARM_DESC(debug, "toggle HID debugging messages");
EXPORT_SYMBOL_GPL(hid_debug);
#endif

/*
* Register a new report for a device.
Expand Down Expand Up @@ -861,7 +859,7 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field,
struct hid_driver *hdrv = hid->driver;
int ret;

hid_dump_input(usage, value);
hid_dump_input(hid, usage, value);

if (hdrv && hdrv->event && hid_match_usage(hid, usage)) {
ret = hdrv->event(hid, field, usage, value);
Expand Down Expand Up @@ -983,11 +981,10 @@ int hid_set_field(struct hid_field *field, unsigned offset, __s32 value)
{
unsigned size = field->report_size;

hid_dump_input(field->usage + offset, value);
hid_dump_input(field->report->device, field->usage + offset, value);

if (offset >= field->report_count) {
dbg_hid("offset (%d) exceeds report_count (%d)\n", offset, field->report_count);
hid_dump_field(field, 8);
return -1;
}
if (field->logical_minimum < 0) {
Expand Down Expand Up @@ -1078,6 +1075,7 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i
struct hid_report_enum *report_enum;
struct hid_driver *hdrv;
struct hid_report *report;
char *buf;
unsigned int i;
int ret;

Expand All @@ -1091,18 +1089,38 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i
return -1;
}

dbg_hid("report (size %u) (%snumbered)\n", size, report_enum->numbered ? "" : "un");
buf = kmalloc(sizeof(char) * HID_DEBUG_BUFSIZE,
interrupt ? GFP_ATOMIC : GFP_KERNEL);

if (!buf) {
report = hid_get_report(report_enum, data);
goto nomem;
}

snprintf(buf, HID_DEBUG_BUFSIZE - 1,
"\nreport (size %u) (%snumbered)\n", size, report_enum->numbered ? "" : "un");
hid_debug_event(hid, buf);

report = hid_get_report(report_enum, data);
if (!report)
if (!report) {
kfree(buf);
return -1;
}

/* dump the report */
dbg_hid("report %d (size %u) = ", report->id, size);
for (i = 0; i < size; i++)
dbg_hid_line(" %02x", data[i]);
dbg_hid_line("\n");
snprintf(buf, HID_DEBUG_BUFSIZE - 1,
"report %d (size %u) = ", report->id, size);
hid_debug_event(hid, buf);
for (i = 0; i < size; i++) {
snprintf(buf, HID_DEBUG_BUFSIZE - 1,
" %02x", data[i]);
hid_debug_event(hid, buf);
}
hid_debug_event(hid, "\n");

kfree(buf);

nomem:
if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) {
ret = hdrv->raw_event(hid, report, data, size);
if (ret != 0)
Expand Down Expand Up @@ -1323,7 +1341,6 @@ static const struct hid_device_id hid_blacklist[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },

{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
{ }
};
Expand Down Expand Up @@ -1730,6 +1747,8 @@ int hid_add_device(struct hid_device *hdev)
if (!ret)
hdev->status |= HID_STAT_ADDED;

hid_debug_register(hdev, dev_name(&hdev->dev));

return ret;
}
EXPORT_SYMBOL_GPL(hid_add_device);
Expand Down Expand Up @@ -1766,6 +1785,9 @@ struct hid_device *hid_allocate_device(void)
for (i = 0; i < HID_REPORT_TYPES; i++)
INIT_LIST_HEAD(&hdev->report_enum[i].report_list);

init_waitqueue_head(&hdev->debug_wait);
INIT_LIST_HEAD(&hdev->debug_list);

return hdev;
err:
put_device(&hdev->dev);
Expand All @@ -1777,6 +1799,7 @@ static void hid_remove_device(struct hid_device *hdev)
{
if (hdev->status & HID_STAT_ADDED) {
device_del(&hdev->dev);
hid_debug_unregister(hdev);
hdev->status &= ~HID_STAT_ADDED;
}
}
Expand Down Expand Up @@ -1852,6 +1875,10 @@ static int __init hid_init(void)
{
int ret;

if (hid_debug)
printk(KERN_WARNING "HID: hid_debug is now used solely for parser and driver debugging.\n"
"HID: debugfs is now used for inspecting the device (report descriptor, reports)\n");

ret = bus_register(&hid_bus_type);
if (ret) {
printk(KERN_ERR "HID: can't register hid bus\n");
Expand All @@ -1862,6 +1889,8 @@ static int __init hid_init(void)
if (ret)
goto err_bus;

hid_debug_init();

return 0;
err_bus:
bus_unregister(&hid_bus_type);
Expand All @@ -1871,6 +1900,7 @@ static int __init hid_init(void)

static void __exit hid_exit(void)
{
hid_debug_exit();
hidraw_exit();
bus_unregister(&hid_bus_type);
}
Expand Down
Loading

0 comments on commit 8123e8f

Please sign in to comment.