diff options
author | Ruslan Bukin <br@FreeBSD.org> | 2014-05-28 06:15:45 +0000 |
---|---|---|
committer | Ruslan Bukin <br@FreeBSD.org> | 2014-05-28 06:15:45 +0000 |
commit | 3863e61d2e9ab2a4c79815c970b85390d7f1b05f (patch) | |
tree | b5d3739b4b41005cb9f106a369d0ad1f733f027b /sys/arm/samsung/exynos/chrome_kb.c | |
parent | 2b34a832b959ceb73f52d412c3daa4cd15503da1 (diff) |
Add simple polling mechanism that works for KDB.
Submitted by: Maxim Ignatenko <gelraen.ua@gmail.com>
Notes
Notes:
svn path=/head/; revision=266787
Diffstat (limited to 'sys/arm/samsung/exynos/chrome_kb.c')
-rw-r--r-- | sys/arm/samsung/exynos/chrome_kb.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/sys/arm/samsung/exynos/chrome_kb.c b/sys/arm/samsung/exynos/chrome_kb.c index 1ce028117c8d..4b3d20298ebe 100644 --- a/sys/arm/samsung/exynos/chrome_kb.c +++ b/sys/arm/samsung/exynos/chrome_kb.c @@ -131,6 +131,7 @@ struct ckb_softc { int rows; int cols; device_t dev; + device_t gpio_dev; struct thread *sc_poll_thread; uint8_t *scan_local; @@ -331,6 +332,7 @@ ckb_read_char_locked(keyboard_t *kbd, int wait) uint16_t key; int oldbit; int newbit; + int status; sc = kbd->kb_data; @@ -347,7 +349,20 @@ ckb_read_char_locked(keyboard_t *kbd, int wait) }; if (sc->sc_flags & CKB_FLAG_POLLING) { - /* TODO */ + for (;;) { + GPIO_PIN_GET(sc->gpio_dev, KB_GPIO_INT, &status); + if (status == 0) { + if (ec_command(EC_CMD_MKBP_STATE, sc->scan, sc->cols, + sc->scan, sc->cols)) { + return (NOKEY); + } + break; + } + if (!wait) { + return (NOKEY); + } + DELAY(1000); + } }; for (i = 0; i < sc->cols; i++) { @@ -710,6 +725,12 @@ chrome_kb_attach(device_t dev) if ((error = parse_dts(sc)) != 0) return error; + sc->gpio_dev = devclass_get_device(devclass_find("gpio"), 0); + if (sc->gpio_dev == NULL) { + device_printf(sc->dev, "Can't find gpio device.\n"); + return (ENXIO); + } + #if 0 device_printf(sc->dev, "Keyboard matrix [%dx%d]\n", sc->cols, sc->rows); |