aboutsummaryrefslogtreecommitdiff
path: root/sys/arm/samsung/exynos/chrome_kb.c
diff options
context:
space:
mode:
authorRuslan Bukin <br@FreeBSD.org>2014-05-28 06:15:45 +0000
committerRuslan Bukin <br@FreeBSD.org>2014-05-28 06:15:45 +0000
commit3863e61d2e9ab2a4c79815c970b85390d7f1b05f (patch)
treeb5d3739b4b41005cb9f106a369d0ad1f733f027b /sys/arm/samsung/exynos/chrome_kb.c
parent2b34a832b959ceb73f52d412c3daa4cd15503da1 (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.c23
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);