Re: [PATCH 1/3] picolcd: driver for PicoLCD HID device
From: Oliver Neukum <oliver@neukum.org>
Date: 2010-02-24 18:28:17
Also in:
linux-input, lkml
Am Mittwoch, 24. Februar 2010 17:00:49 schrieb Bruno Prémont:
+static int picolcd_raw_event(struct hid_device *hdev,
+ struct hid_report *report, u8 *raw_data, int size)
+{
+ struct picolcd_data *data = hid_get_drvdata(hdev);
+ char hexdata[25];
+ int i;
+
+ if (data = NULL)
+ return 1;
+
+ for (i = 0; i < sizeof(hexdata) / 2; i++)
+ sprintf(hexdata+2*i, "%02hhx", raw_data[i]);
+ if (size >= sizeof(hexdata)/2) {
+ hexdata[sizeof(hexdata)-4] = '.';
+ hexdata[sizeof(hexdata)-3] = '.';
+ hexdata[sizeof(hexdata)-2] = '.';
+ hexdata[sizeof(hexdata)-1] = '\0';
+ } else
+ hexdata[size*2] = '\0';
+
+ switch (report->id) {
+ case REPORT_KEYPAD:
+ if (size = 3 && raw_data[0] = 0x11 && data->input_keys) {
+ return picolcd_raw_keypad(hdev, report, raw_data+1, size-1);
+ } else {
+ dbg_hid(PICOLCD_NAME " unsupported key event (%d bytes): 0x%s\n", size, hexdata);
+ break;
+ }
+ break;
+ case REPORT_VERSION:
+ if (size = 3)
+ dev_info(&hdev->dev, "Firmware version is %hd.%hd\n", raw_data[1], raw_data[2]);
+
+ spin_lock(&data->lock);If I recall correctly raw_event is called in interrupt. As you take a spinlock here, the lock in code not called in interrupt must disable interrupts, or you may deadlock. Regards Oliver