diff options
Diffstat (limited to 'sys/dev/atkbdc/atkbd.c')
-rw-r--r-- | sys/dev/atkbdc/atkbd.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c index 199fcb1..0d2b44b 100644 --- a/sys/dev/atkbdc/atkbd.c +++ b/sys/dev/atkbdc/atkbd.c @@ -62,7 +62,20 @@ __FBSDID("$FreeBSD$"); #include <dev/atkbdc/atkbdreg.h> #include <dev/atkbdc/atkbdcreg.h> -static timeout_t atkbd_timeout; +typedef struct atkbd_state { + KBDC kbdc; /* keyboard controller */ + int ks_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */ + int ks_flags; /* flags */ +#define COMPOSE (1 << 0) + int ks_polling; + int ks_state; /* shift/lock key state */ + int ks_accents; /* accent key index (> 0) */ + u_int ks_composed_char; /* composed char code (> 0) */ + u_char ks_prefix; /* AT scan code prefix */ + struct callout ks_timer; +} atkbd_state_t; + +static void atkbd_timeout(void *arg); static void atkbd_shutdown_final(void *v); int @@ -88,6 +101,7 @@ int atkbd_attach_unit(device_t dev, keyboard_t **kbd, int irq, int flags) { keyboard_switch_t *sw; + atkbd_state_t *state; int args[2]; int error; int unit; @@ -120,6 +134,8 @@ atkbd_attach_unit(device_t dev, keyboard_t **kbd, int irq, int flags) * This is a kludge to compensate for lost keyboard interrupts. * A similar code used to be in syscons. See below. XXX */ + state = (atkbd_state_t *)(*kbd)->kb_data; + callout_init(&state->ks_timer, 0); atkbd_timeout(*kbd); if (bootverbose) @@ -134,6 +150,7 @@ atkbd_attach_unit(device_t dev, keyboard_t **kbd, int irq, int flags) static void atkbd_timeout(void *arg) { + atkbd_state_t *state; keyboard_t *kbd; int s; @@ -175,25 +192,14 @@ atkbd_timeout(void *arg) kbdd_intr(kbd, NULL); } splx(s); - timeout(atkbd_timeout, arg, hz/10); + state = (atkbd_state_t *)kbd->kb_data; + callout_reset(&state->ks_timer, hz / 10, atkbd_timeout, arg); } /* LOW-LEVEL */ #define ATKBD_DEFAULT 0 -typedef struct atkbd_state { - KBDC kbdc; /* keyboard controller */ - int ks_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */ - int ks_flags; /* flags */ -#define COMPOSE (1 << 0) - int ks_polling; - int ks_state; /* shift/lock key state */ - int ks_accents; /* accent key index (> 0) */ - u_int ks_composed_char; /* composed char code (> 0) */ - u_char ks_prefix; /* AT scan code prefix */ -} atkbd_state_t; - /* keyboard driver declaration */ static int atkbd_configure(int flags); static kbd_probe_t atkbd_probe; @@ -470,7 +476,10 @@ bad: static int atkbd_term(keyboard_t *kbd) { + atkbd_state_t *state = (atkbd_state_t *)kbd->kb_data; + kbd_unregister(kbd); + callout_drain(&state->ks_timer); return 0; } |