Module Name: src Committed By: nonaka Date: Sat Mar 30 08:35:06 UTC 2013
Modified Files: src/sys/arch/zaurus/dev: zkbd.c Log Message: Apply patch from steleto, arranged by me. - Avoid chattering for SL-C7x0/860 - Add more stuck keys. To generate a diff of this commit: cvs rdiff -u -r1.17 -r1.18 src/sys/arch/zaurus/dev/zkbd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/zaurus/dev/zkbd.c diff -u src/sys/arch/zaurus/dev/zkbd.c:1.17 src/sys/arch/zaurus/dev/zkbd.c:1.18 --- src/sys/arch/zaurus/dev/zkbd.c:1.17 Sat Oct 27 17:18:14 2012 +++ src/sys/arch/zaurus/dev/zkbd.c Sat Mar 30 08:35:06 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: zkbd.c,v 1.17 2012/10/27 17:18:14 chs Exp $ */ +/* $NetBSD: zkbd.c,v 1.18 2013/03/30 08:35:06 nonaka Exp $ */ /* $OpenBSD: zaurus_kbd.c,v 1.28 2005/12/21 20:36:03 deraadt Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: zkbd.c,v 1.17 2012/10/27 17:18:14 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: zkbd.c,v 1.18 2013/03/30 08:35:06 nonaka Exp $"); #include "opt_wsdisplay_compat.h" #if 0 /* XXX */ @@ -75,6 +75,14 @@ static const int gpio_strobe_pins_c3000[ 114 }; +static const int stuck_keys_c3000[] = { + 1, 7, 15, 22, 23, 31, 39, 47, + 53, 55, 60, 63, 66, 67, 69, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 82, 85, 86, 87, 90, 91, 92, 94, + 95 +}; + static const int gpio_sense_pins_c860[] = { 58, 59, @@ -101,11 +109,11 @@ static const int gpio_strobe_pins_c860[] 77 }; -static const int stuck_keys[] = { - 7, - 15, - 23, - 31 +static const int stuck_keys_c860[] = { + 0, 1, 47, 53, 55, 60, 63, 66, + 67, 69, 71, 72, 73, 74, 76, 77, + 78, 79, 80, 81, 82, 83, 85, 86, + 87, 88, 89, 90, 91, 92, 94, 95 }; #define REP_DELAY1 400 @@ -158,7 +166,8 @@ static void zkbd_attach(device_t, device CFATTACH_DECL_NEW(zkbd, sizeof(struct zkbd_softc), zkbd_match, zkbd_attach, NULL, NULL); -static int zkbd_irq(void *v); +static int zkbd_irq_c3000(void *v); +static int zkbd_irq_c860(void *v); static void zkbd_poll(void *v); static int zkbd_on(void *v); static int zkbd_sync(void *v); @@ -238,8 +247,8 @@ zkbd_attach(device_t parent, device_t se sc->sc_strobe_array = gpio_strobe_pins_c3000; sc->sc_nsense = __arraycount(gpio_sense_pins_c3000); sc->sc_nstrobe = __arraycount(gpio_strobe_pins_c3000); - sc->sc_stuck_keys = stuck_keys; - sc->sc_nstuck = __arraycount(stuck_keys); + sc->sc_stuck_keys = stuck_keys_c3000; + sc->sc_nstuck = __arraycount(stuck_keys_c3000); sc->sc_maxkbdcol = 10; sc->sc_onkey_pin = 95; sc->sc_sync_pin = 16; @@ -254,8 +263,8 @@ zkbd_attach(device_t parent, device_t se sc->sc_strobe_array = gpio_strobe_pins_c860; sc->sc_nsense = __arraycount(gpio_sense_pins_c860); sc->sc_nstrobe = __arraycount(gpio_strobe_pins_c860); - sc->sc_stuck_keys = NULL; - sc->sc_nstuck = 0; + sc->sc_stuck_keys = stuck_keys_c860; + sc->sc_nstuck = __arraycount(stuck_keys_c860); sc->sc_maxkbdcol = 0; sc->sc_onkey_pin = -1; sc->sc_sync_pin = -1; @@ -296,8 +305,13 @@ zkbd_attach(device_t parent, device_t se if (pin == -1) continue; pxa2x0_gpio_set_function(pin, GPIO_IN); - pxa2x0_gpio_intr_establish(pin, IST_EDGE_BOTH, IPL_TTY, - zkbd_irq, sc); + if (ZAURUS_ISC1000 || ZAURUS_ISC3000) { + pxa2x0_gpio_intr_establish(pin, IST_EDGE_BOTH, + IPL_TTY, zkbd_irq_c3000, sc); + } else if (ZAURUS_ISC860) { + pxa2x0_gpio_intr_establish(pin, IST_EDGE_RISING, + IPL_TTY, zkbd_irq_c860, sc); + } } if (sc->sc_onkey_pin >= 0) @@ -346,7 +360,7 @@ zkbd_rawrepeat(void *v) /* XXX are some not in the array? */ /* handle keypress interrupt */ static int -zkbd_irq(void *v) +zkbd_irq_c3000(void *v) { zkbd_poll(v); @@ -354,6 +368,19 @@ zkbd_irq(void *v) return 1; } +/* Avoid chattering only for SL-C7x0/860 */ +static int +zkbd_irq_c860(void *v) +{ + struct zkbd_softc *sc = (struct zkbd_softc *)v; + + if (!callout_pending(&sc->sc_roll_to)) { + zkbd_poll(v); + } + + return 1; +} + static void zkbd_poll(void *v) {