From: Vojtech P. <vo...@us...> - 2001-12-10 17:01:47
|
Update of /cvsroot/linuxconsole/ruby/linux/drivers/input In directory usw-pr-cvs1:/tmp/cvs-serv28578 Modified Files: analog.c guillemot.c hid-core.c joydev.c Log Message: Analog: use correct locking when accessing the pit timer Guillemot: longer timeouts, print failed reads Hid-core: fixes Joydev: fixes Index: analog.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/analog.c,v retrieving revision 1.66 retrieving revision 1.67 diff -u -d -r1.66 -r1.67 --- analog.c 2001/10/18 20:52:48 1.66 +++ analog.c 2001/12/10 17:01:44 1.67 @@ -138,9 +138,23 @@ #ifdef __i386__ #define TSC_PRESENT (test_bit(X86_FEATURE_TSC, &boot_cpu_data.x86_capability)) -#define GET_TIME(x) do { if (TSC_PRESENT) rdtscl(x); else { outb(0, 0x43); x = inb(0x40); x |= inb(0x40) << 8; } } while (0) +#define GET_TIME(x) do { if (TSC_PRESENT) rdtscl(x); else x = get_time_pit(); } while (0) #define DELTA(x,y) (TSC_PRESENT?((y)-(x)):((x)-(y)+((x)<(y)?1193180L/HZ:0))) #define TIME_NAME (TSC_PRESENT?"TSC":"PIT") +static unsigned int get_time_pit(void) +{ + extern spinlock_t i8253_lock; + unsigned long flags; + unsigned int count; + + spin_lock_irqsave(&i8253_lock, flags); + outb_p(0x00, 0x43); + count = inb_p(0x40); + count |= inb_p(0x40) << 8; + spin_unlock_irqrestore(&i8253_lock, flags); + + return count; +} #elif __x86_64__ #define GET_TIME(x) rdtscl(x) #define DELTA(x,y) ((y)-(x)) @@ -501,7 +515,8 @@ printk(" [%s timer, %d %sHz clock, %d ns res]\n", TIME_NAME, port->speed > 10000 ? (port->speed + 800) / 1000 : port->speed, port->speed > 10000 ? "M" : "k", - port->speed > 10000 ? (port->loop * 1000) / (port->speed / 1000) : (port->loop * 1000000) / port->speed); + port->speed > 10000 ? (port->loop * 1000) / (port->speed / 1000) + : (port->loop * 1000000) / port->speed); } /* Index: guillemot.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/guillemot.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- guillemot.c 2001/09/25 10:12:07 1.8 +++ guillemot.c 2001/12/10 17:01:44 1.9 @@ -40,8 +40,8 @@ MODULE_DESCRIPTION("Guillemot Digital joystick driver"); MODULE_LICENSE("GPL"); -#define GUILLEMOT_MAX_START 400 /* 400 us */ -#define GUILLEMOT_MAX_STROBE 40 /* 40 us */ +#define GUILLEMOT_MAX_START 600 /* 600 us */ +#define GUILLEMOT_MAX_STROBE 60 /* 60 us */ #define GUILLEMOT_MAX_LENGTH 17 /* 17 bytes */ #define GUILLEMOT_REFRESH_TIME HZ/50 /* 20 ms */ @@ -259,6 +259,7 @@ static void guillemot_disconnect(struct gameport *gameport) { struct guillemot *guillemot = gameport->private; + printk(KERN_INFO "guillemot.c: Failed %d reads out of %d on %s\n", guillemot->reads, guillemot->bads, guillemot->phys); input_unregister_device(&guillemot->dev); gameport_close(gameport); kfree(guillemot); Index: hid-core.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/hid-core.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- hid-core.c 2001/11/07 19:02:56 1.33 +++ hid-core.c 2001/12/10 17:01:44 1.34 @@ -204,6 +204,7 @@ return -1; } +#if 0 /* Old code, could be right in some way, but generates superfluous fields */ if (HID_MAIN_ITEM_VARIABLE & ~flags) { /* ARRAY */ if (parser->global.logical_maximum <= parser->global.logical_minimum) { dbg("logical range invalid %d %d", parser->global.logical_minimum, parser->global.logical_maximum); @@ -214,7 +215,16 @@ } else { /* VARIABLE */ usages = parser->global.report_count; } +#else + if (parser->global.logical_maximum <= parser->global.logical_minimum) { + dbg("logical range invalid %d %d", parser->global.logical_minimum, parser->global.logical_maximum); + return -1; + } + usages = parser->local.usage_index; + dbg("add_field: usage_index: %d, report_count: %d", parser->global.report_count, parser->local.usage_index); +#endif + offset = report->size; report->size += parser->global.report_size * parser->global.report_count; @@ -1062,7 +1072,9 @@ if (len > hid->urb.transfer_buffer_length) { hid->urb.transfer_buffer_length = len < 32 ? len : 32; } - usb_set_idle(hid->dev, hid->ifnum, 0, report->id); +#if 0 + usb_set_idle(hid->dev, hid->ifnum, 0, report->id); /*** FIXME mixing sync & async ***/ +#endif hid_submit_report(hid, report, USB_DIR_IN); list = list->next; } @@ -1229,6 +1241,12 @@ if (!hiddev_connect(hid)) hid->claimed |= HID_CLAIMED_HIDDEV; #endif + + if (!hid->claimed) { + hid_free_device(hid); + return NULL; + } + printk(KERN_INFO); if (hid->claimed & HID_CLAIMED_INPUT) @@ -1240,7 +1258,7 @@ c = "Device"; for (i = 0; i < hid->maxapplication; i++) - if (IS_INPUT_APPLICATION(hid->application[i])) { + if ((hid->application[i] & 0xffff) < ARRAY_SIZE(hid_types)) { c = hid_types[hid->application[i] & 0xffff]; break; } Index: joydev.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/joydev.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- joydev.c 2001/10/17 10:38:13 1.34 +++ joydev.c 2001/12/10 17:01:44 1.35 @@ -412,7 +412,7 @@ static struct input_handle *joydev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id) { struct joydev *joydev; - int i, j, minor; + int i, j, t, minor; if (test_bit(BTN_TOUCH, dev->keybit)) return NULL; @@ -470,8 +470,10 @@ joydev->corr[i].prec = dev->absfuzz[j]; joydev->corr[i].coef[0] = (dev->absmax[j] + dev->absmin[j]) / 2 - dev->absflat[j]; joydev->corr[i].coef[1] = (dev->absmax[j] + dev->absmin[j]) / 2 + dev->absflat[j]; - joydev->corr[i].coef[2] = (1 << 29) / ((dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j]); - joydev->corr[i].coef[3] = (1 << 29) / ((dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j]); + if (!(t = ((dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j])) + continue; + joydev->corr[i].coef[2] = (1 << 29) / t; + joydev->corr[i].coef[3] = (1 << 29) / t; joydev->abs[i] = joydev_correct(dev->abs[j], joydev->corr + i); } |