]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/devkbd.c
archacpi: make *acpi=1 the default
[plan9front.git] / sys / src / 9 / pc / devkbd.c
index 9ce1a48959ea0e4995f5c5309edef8f2fb2931cd..5aeaded1f21b2d30a9f9b3b6857928958bff5d36 100644 (file)
@@ -152,30 +152,13 @@ i8042auxcmd(int cmd)
        iunlock(&i8042lock);
 
        if(c != 0xFA){
-               print("i8042: %2.2ux returned to the %2.2ux command (pc=%#p)\n", c, cmd, getcallerpc(&cmd));
+               print("i8042: %2.2ux returned to the %2.2ux command (pc=%#p)\n",
+                       c, cmd, getcallerpc(&cmd));
                return -1;
        }
        return 0;
 }
 
-int
-i8042auxcmds(uchar *cmd, int ncmd)
-{
-       int i;
-
-       ilock(&i8042lock);
-       for(i=0; i<ncmd; i++){
-               if(outready() < 0)
-                       break;
-               outb(Cmd, 0xD4);
-               if(outready() < 0)
-                       break;
-               outb(Data, cmd[i]);
-       }
-       iunlock(&i8042lock);
-       return i;
-}
-
 /*
  * set keyboard's leds for lock states (scroll, numeric, caps).
  *
@@ -251,13 +234,14 @@ i8042intr(Ureg*, void*)
 void
 i8042auxenable(void (*putc)(int, int))
 {
-       char *err = "i8042: aux init failed\n";
+       static char err[] = "i8042: aux init failed\n";
+
+       ilock(&i8042lock);
 
        /* enable kbd/aux xfers and interrupts */
        ccc &= ~Cauxdis;
        ccc |= Cauxint;
 
-       ilock(&i8042lock);
        if(outready() < 0)
                print(err);
        outb(Cmd, 0x60);                        /* write control register */
@@ -274,9 +258,33 @@ i8042auxenable(void (*putc)(int, int))
        }
        auxputc = putc;
        intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux");
+
        iunlock(&i8042lock);
 }
 
+static void
+kbdpoll(void)
+{
+       if(nokbd || qlen(kbd.q) > 0)
+               return;
+       i8042intr(0, 0);
+}
+
+static void
+kbdshutdown(void)
+{
+       if(nokbd)
+               return;
+       /* disable kbd and aux xfers and interrupts */
+       ccc &= ~(Ckbdint|Cauxint);
+       ccc |= (Cauxdis|Ckbddis);
+       outready();
+       outb(Cmd, 0x60);
+       outready();
+       outb(Data, ccc);
+       outready();
+}
+
 static Chan *
 kbdattach(char *spec)
 {
@@ -324,20 +332,22 @@ kbdclose(Chan *c)
 static Block*
 kbdbread(Chan *c, long n, ulong off)
 {
-       if(c->qid.path == Qscancode)
+       if(c->qid.path == Qscancode){
+               kbdpoll();
                return qbread(kbd.q, n);
-       else
-               return devbread(c, n, off);
+       }
+       return devbread(c, n, off);
 }
 
 static long
 kbdread(Chan *c, void *a, long n, vlong)
 {
-       if(c->qid.path == Qscancode)
+       if(c->qid.path == Qscancode){
+               kbdpoll();
                return qread(kbd.q, a, n);
+       }
        if(c->qid.path == Qdir)
                return devdirread(c, a, n, kbdtab, nelem(kbdtab), devgen);
-
        error(Egreg);
        return 0;
 }
@@ -361,60 +371,17 @@ kbdwrite(Chan *c, void *a, long n, vlong)
        return n;
 }
 
-Dev kbddevtab = {
-       L'b',
-       "kbd",
-
-       devreset,
-       devinit,
-       devshutdown,
-       kbdattach,
-       kbdwalk,
-       kbdstat,
-       kbdopen,
-       devcreate,
-       kbdclose,
-       kbdread,
-       kbdbread,
-       kbdwrite,
-       devbwrite,
-       devremove,
-       devwstat,
-};
-
-
-static char *initfailed = "i8042: kbdinit failed\n";
-
-static int
-outbyte(int port, int c)
+static void
+kbdreset(void)
 {
-       outb(port, c);
-       if(outready() < 0) {
-               print(initfailed);
-               return -1;
-       }
-       return 0;
-}
+       static char initfailed[] = "i8042: kbd init failed\n";
+       int c, try;
 
-void
-kbdenable(void)
-{
        kbd.q = qopen(1024, Qcoalesce, 0, 0);
        if(kbd.q == nil)
-               panic("kbdenable");
+               panic("kbdreset");
        qnoblock(kbd.q, 1);
 
-       ioalloc(Data, 1, 0, "kbd");
-       ioalloc(Cmd, 1, 0, "kbd");
-
-       intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd");
-}
-
-void
-kbdinit(void)
-{
-       int c, try;
-
        /* wait for a quiescent controller */
        try = 1000;
        while(try-- > 0 && (c = inb(Status)) & (Outbusy | Inready)) {
@@ -430,7 +397,7 @@ kbdinit(void)
        /* get current controller command byte */
        outb(Cmd, 0x20);
        if(inready() < 0){
-               print("i8042: kbdinit can't read ccc\n");
+               print("i8042: can't read ccc\n");
                ccc = 0;
        } else
                ccc = inb(Data);
@@ -438,14 +405,44 @@ kbdinit(void)
        /* enable kbd xfers and interrupts */
        ccc &= ~Ckbddis;
        ccc |= Csf | Ckbdint | Cscs1;
+
+       /* disable ps2 mouse */
+       ccc &= ~Cauxint;
+       ccc |= Cauxdis;
+
        if(outready() < 0) {
                print(initfailed);
                return;
        }
+       outb(Cmd, 0x60);
+       outready();
+       outb(Data, ccc);
+       outready();
 
        nokbd = 0;
-
-       /* disable mouse */
-       if (outbyte(Cmd, 0x60) < 0 || outbyte(Data, ccc) < 0)
-               print("i8042: kbdinit mouse disable failed\n");
+       ioalloc(Cmd, 1, 0, "i8042.cs");
+       ioalloc(Data, 1, 0, "i8042.data");
+       intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd");
 }
+
+Dev kbddevtab = {
+       L'b',
+       "kbd",
+
+       kbdreset,
+       devinit,
+       kbdshutdown,
+       kbdattach,
+       kbdwalk,
+       kbdstat,
+       kbdopen,
+       devcreate,
+       kbdclose,
+       kbdread,
+       kbdbread,
+       kbdwrite,
+       devbwrite,
+       devremove,
+       devwstat,
+};
+