From: "Joël Soete" <jso@europay.com>
To: marteaut@esiee.fr, rhirst@linuxcare.com, willy@debian.org
Cc: parisc-linux@lists.parisc-linux.org, debian-hppa@lists.debian.org
Subject: [parisc-linux] Thomas Marteau kbd patch adapted.(2)
Date: Wed, 5 Sep 2001 15:30:03 +0200 [thread overview]
Message-ID: <OFF20A0000.EE7BF1AA-ONC1256ABE.00498F17@LocalDomain> (raw)
Sorry for previous unreadable patch text.
Here is what I hope to be clearer.
--- hp_psaux.c.orig Tue Aug 28 12:02:32 2001
+++ hp_psaux.c Wed Sep 5 10:51:44 2001
@@ -43,6 +43,7 @@
/* HP specific LASI PS/2 keyboard and psaux constants */
#define AUX_REPLY_ACK 0xFA /* Command byte ACK. */
+#define AUX_RESEND 0xFE /* Sent by the keyb. Asking for resending the
last command. */
#define AUX_RECONNECT 0xAA /* scancode when ps2 device is plugged (back)
in */
#define LASI_PSAUX_OFFSET 0x0100 /* offset from keyboard to psaux port */
@@ -71,8 +72,7 @@
#define LASI_STAT_CLKSHD 0x80
static unsigned long lasikbd_hpa;
-static unsigned long lasips2_hpa;
-
+static int cmd_status;
static inline u8 read_input(unsigned long hpa)
{
@@ -106,9 +106,10 @@
}
}
+#if 0
if (wait)
printk(KERN_DEBUG "Lasi PS/2 wait %d\n", wait);
-
+#endif
gsc_writeb(val, hpa+LASI_XMTDATA);
return 1;
@@ -123,14 +124,28 @@
static void lasikbd_leds(unsigned char leds)
{
- write_output(KBD_CMD_SET_LEDS, lasikbd_hpa);
- write_output(leds, lasikbd_hpa);
- write_output(KBD_CMD_ENABLE, lasikbd_hpa);
+ cmd_status=2;
+ while (cmd_status!=0) {
+ write_output(KBD_CMD_SET_LEDS, lasikbd_hpa);
+ mdelay(5);
+ }
+
+ cmd_status=2;
+ while (cmd_status!=0) {
+ write_output(leds, lasikbd_hpa);
+ mdelay(5);
+ }
+
+ cmd_status=2;
+ while (cmd_status!=0) {
+ write_output(KBD_CMD_ENABLE, lasikbd_hpa);
+ mdelay(5);
+ }
}
#if 0
/* this might become useful again at some point. not now -prumpf */
-int lasi_ps2_test(void *hpa)
+int lasi_ps2_test(unsigned long hpa)
{
u8 control,c;
int i, ret = 0;
@@ -155,10 +170,56 @@
}
#endif
-static int __init lasi_ps2_reset(unsigned long hpa, int id)
+static int init_keyb(unsigned long hpa)
+{
+ int fail;
+ u8 data=0;
+
+
+ do {
+ while ((read_status(hpa) & LASI_STAT_TBNE));
+ gsc_writeb(KBD_CMD_SET_LEDS, hpa+LASI_XMTDATA);
+
+ while (!(read_status(hpa) & LASI_STAT_RBNE));
+
+ while ((read_status(hpa) & LASI_STAT_RBNE))
data=read_input(hpa);
+ }while(data!=AUX_REPLY_ACK);
+
+ fail=0;
+
+ do {
+ while ((read_status(hpa) & LASI_STAT_TBNE));
+ gsc_writeb(0x00, hpa+LASI_XMTDATA);
+
+ while (!(read_status(hpa) & LASI_STAT_RBNE));
+
+ while ((read_status(hpa) & LASI_STAT_RBNE)) {
+ data=read_input(hpa);
+ fail++;
+ if(fail==10) break;
+ }
+ }while(data!=AUX_REPLY_ACK);
+
+ fail=0;
+ do {
+ while ((read_status(hpa) & LASI_STAT_TBNE));
+ gsc_writeb(KBD_CMD_ENABLE, hpa+LASI_XMTDATA);
+
+ while (!(read_status(hpa) & LASI_STAT_RBNE));
+ while ((read_status(hpa) & LASI_STAT_RBNE)) {
+ data=read_input(hpa);
+ fail++;
+ if(fail==10) break;
+ }
+
+ }while(data!=AUX_REPLY_ACK);
+
+ return 1;
+}
+
+static void __init lasi_ps2_reset(unsigned long hpa)
{
u8 control;
- int ret = 1;
/* reset the interface */
gsc_writeb(0xff, hpa+LASI_RESET);
@@ -167,22 +228,6 @@
/* enable it */
control = read_control(hpa);
write_control(control | LASI_CTRL_ENBL, hpa);
-
- /* initializes the leds at the default state */
- if (id==0) {
- write_output(KBD_CMD_SET_LEDS, hpa);
- write_output(0, hpa);
- ret = write_output(KBD_CMD_ENABLE, hpa);
- }
-
- return ret;
-}
-
-static int inited;
-
-static void lasi_ps2_init_hw(void)
-{
- ++inited;
}
@@ -363,7 +408,7 @@
lock_kernel();
fasync_aux(-1, file, 0);
if (--aux_count) {
- unlock_kernel();
+ unlock_kernel();
return 0;
}
unlock_kernel();
@@ -399,62 +444,60 @@
id = gsc_readb(hpa+LASI_ID) & 0x0f;
if (id==1)
- hpa -= LASI_PSAUX_OFFSET;
- lasikbd_hpa = hpa;
-
+ hpa -= LASI_PSAUX_OFFSET;
status_keyb = read_status(hpa);
status_mouse = read_status(hpa+LASI_PSAUX_OFFSET);
while ((status_keyb|status_mouse) & LASI_STAT_RBNE){
- while (status_keyb & LASI_STAT_RBNE) {
+ while (status_keyb & LASI_STAT_RBNE) {
- scancode = read_input(hpa);
+ scancode = read_input(hpa);
- /* XXX don't know if this is a valid fix, but filtering
- * 0xfa avoids 'unknown scancode' errors on, eg, capslock
- * on some keyboards.
- */
- if (inited && scancode != 0xfa)
- handle_at_scancode(scancode);
+ /* XXX don't know if this is a valid fix, but filtering
+ * 0xfa avoids 'unknown scancode' errors on, eg, capslock
+ * on some keyboards.
+ */
+
+ if (scancode == AUX_REPLY_ACK)
+ cmd_status=0;
+
+ else if (scancode == AUX_RESEND)
+ cmd_status=1;
+ else
+ handle_at_scancode(scancode);
- status_keyb =read_status(hpa);
- }
+ status_keyb =read_status(hpa);
+ }
#ifdef CONFIG_PSMOUSE
- while (status_mouse & LASI_STAT_RBNE) {
- scancode = read_input(hpa+LASI_PSAUX_OFFSET);
- handle_mouse_scancode(scancode);
- status_mouse = read_status(hpa+LASI_PSAUX_OFFSET);
- }
- status_mouse = read_status(hpa+LASI_PSAUX_OFFSET);
+ while (status_mouse & LASI_STAT_RBNE) {
+ scancode = read_input(hpa+LASI_PSAUX_OFFSET);
+ handle_mouse_scancode(scancode);
+ status_mouse = read_status(hpa+LASI_PSAUX_OFFSET);
+ }
+ status_mouse = read_status(hpa+LASI_PSAUX_OFFSET);
#endif /* CONFIG_PSMOUSE */
- status_keyb = read_status(hpa);
+ status_keyb = read_status(hpa);
}
tasklet_schedule(&keyboard_tasklet);
return (status_keyb|status_mouse);
}
-
-
-
extern struct pt_regs *kbd_pt_regs;
static void lasikbd_interrupt(int irq, void *dev, struct pt_regs *regs)
{
- lasips2_hpa = (unsigned long) dev; /* save "hpa" for lasikbd_leds() */
kbd_pt_regs = regs;
- handle_lasikbd_event(lasips2_hpa);
+ handle_lasikbd_event(dev);
}
-
extern int pckbd_translate(unsigned char, unsigned char *, char);
static struct kbd_ops gsc_ps2_kbd_ops = {
translate: pckbd_translate,
- init_hw: lasi_ps2_init_hw,
leds: lasikbd_leds,
#ifdef CONFIG_MAGIC_SYSRQ
sysrq_key: 0x54,
@@ -468,7 +511,7 @@
unsigned long hpa = dev->hpa;
unsigned int irq;
char *name;
- int device_found;
+ int device_found=0;
u8 id;
id = gsc_readb(hpa+LASI_ID) & 0x0f;
@@ -488,20 +531,10 @@
}
/* reset the PS/2 port */
- device_found = lasi_ps2_reset(hpa,id);
-
- /* allocate the irq and memory region for that device */
- if (!(irq = busdevice_alloc_irq(dev)))
- return -ENODEV;
-
- if (request_irq(irq, lasikbd_interrupt, 0, name, (void *)hpa))
- return -ENODEV;
-
- if (!request_mem_region(hpa, LASI_STATUS + 4, name))
- return -ENODEV;
-
+ lasi_ps2_reset(hpa);
switch (id) {
case 0:
+ device_found = init_keyb(hpa);
register_kbd_ops(&gsc_ps2_kbd_ops);
break;
case 1:
@@ -527,6 +560,17 @@
#endif
} /* of case */
+ /* allocate the irq and memory region for that device */
+ if (!(irq = busdevice_alloc_irq(dev)))
+ return -ENODEV;
+
+ if (request_irq(irq, lasikbd_interrupt, 0, name, (void *)hpa))
+ return -ENODEV;
+
+ if (!request_mem_region((unsigned long)hpa, LASI_STATUS + 4, name))
+ return -ENODEV;
+
+
printk(KERN_INFO "PS/2 %s port at 0x%08lx (irq %d) found, "
"%sdevice attached.\n",
name, hpa, irq, device_found ? "":"no ");
**********************************************************************
This e-mail and any attachments to it may contain confidential information which is strictly intended for the use of the authorised recipient. If you have received this e-mail in error, please delete it and notify the sender by replying to this e-mail.
Thank you for your co-operation.
**********************************************************************
next reply other threads:[~2001-09-05 13:26 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-09-05 13:30 Joël Soete [this message]
2001-09-05 13:54 ` [parisc-linux] Re: Thomas Marteau kbd patch adapted.(2) Matthew Wilcox
2001-09-05 14:30 ` Richard Hirst
2001-09-05 16:57 ` marteau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=OFF20A0000.EE7BF1AA-ONC1256ABE.00498F17@LocalDomain \
--to=jso@europay.com \
--cc=debian-hppa@lists.debian.org \
--cc=marteaut@esiee.fr \
--cc=parisc-linux@lists.parisc-linux.org \
--cc=rhirst@linuxcare.com \
--cc=willy@debian.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.