|
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);
}
|