/*
- * $Id: atkbd.c,v 1.31 2002/01/27 01:48:54 vojtech Exp $
+ * $Id: atkbd.c,v 1.33 2002/02/12 09:34:34 vojtech Exp $
*
* Copyright (c) 1999-2001 Vojtech Pavlik
*/
#include <linux/init.h>
#include <linux/input.h>
#include <linux/serio.h>
-#include <linux/tqueue.h>
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
MODULE_DESCRIPTION("AT and PS/2 keyboard driver");
static int atkbd_sendbyte(struct atkbd *atkbd, unsigned char byte)
{
- int timeout = 1000; /* 10 msec */
+ int timeout = 10000; /* 100 msec */
atkbd->ack = 0;
#ifdef ATKBD_DEBUG
static int atkbd_command(struct atkbd *atkbd, unsigned char *param, int command)
{
- int timeout = 10000; /* 100 msec */
+ int timeout = 50000; /* 500 msec */
int send = (command >> 12) & 0xf;
int receive = (command >> 8) & 0xf;
int i;
struct atkbd *atkbd = dev->private;
char param[2];
+ if (!atkbd->serio->write)
+ return -1;
+
switch (type) {
case EV_LED:
memset(atkbd, 0, sizeof(struct atkbd));
- atkbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
- atkbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
+ if (serio->write) {
+ atkbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
+ atkbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
+ } else atkbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
atkbd->serio = serio;
return;
}
- if (atkbd_probe(atkbd)) {
- serio_close(serio);
- kfree(atkbd);
- return;
+ if (serio->write) {
+
+ if (atkbd_probe(atkbd)) {
+ serio_close(serio);
+ kfree(atkbd);
+ return;
+ }
+
+ atkbd->set = atkbd_set_3(atkbd);
+
+ } else {
+ atkbd->set = 2;
+ atkbd->id = 0xab00;
}
-
- atkbd->set = atkbd_set_3(atkbd);
if (atkbd->set == 4) {
atkbd->dev.ledbit[0] |= BIT(LED_COMPOSE) | BIT(LED_SUSPEND) | BIT(LED_SLEEP) | BIT(LED_MUTE);
printk(KERN_INFO "input: %s on %s\n", atkbd->name, serio->phys);
- atkbd_initialize(atkbd);
+ if (serio->write)
+ atkbd_initialize(atkbd);
}