diff options
author | marius <marius@FreeBSD.org> | 2007-01-18 22:01:19 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2007-01-18 22:01:19 +0000 |
commit | 545a381d5f5917c12078fc06b779fab7711c053e (patch) | |
tree | 9d40efb79e6c86a1071e9763b706b391d9e9c487 /sys/dev/uart/uart_cpu.h | |
parent | 6f6da4e54a1b02d5dd2237063607a3b22d39e819 (diff) | |
download | FreeBSD-src-545a381d5f5917c12078fc06b779fab7711c053e.zip FreeBSD-src-545a381d5f5917c12078fc06b779fab7711c053e.tar.gz |
- Add a uart_rxready() and corresponding device-specific implementations
that can be used to check whether receive data is ready, i.e. whether
the subsequent call of uart_poll() should return a char, and unlike
uart_poll() doesn't actually receive data.
- Remove the device-specific implementations of uart_poll() and implement
uart_poll() in terms of uart_getc() and the newly added uart_rxready()
in order to minimize code duplication.
- In sunkbd(4) take advantage of uart_rxready() and use it to implement
the polled mode part of sunkbd_check() so we don't need to buffer a
potentially read char in the softc.
- Fix some mis-indentation in sunkbd_read_char().
Discussed with: marcel
Diffstat (limited to 'sys/dev/uart/uart_cpu.h')
-rw-r--r-- | sys/dev/uart/uart_cpu.h | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/dev/uart/uart_cpu.h b/sys/dev/uart/uart_cpu.h index a3f0dcb..b41ed50 100644 --- a/sys/dev/uart/uart_cpu.h +++ b/sys/dev/uart/uart_cpu.h @@ -41,7 +41,7 @@ struct uart_ops { void (*init)(struct uart_bas *, int, int, int, int); void (*term)(struct uart_bas *); void (*putc)(struct uart_bas *, int); - int (*poll)(struct uart_bas *); + int (*rxready)(struct uart_bas *); int (*getc)(struct uart_bas *, struct mtx *); }; @@ -137,12 +137,26 @@ uart_putc(struct uart_devinfo *di, int c) } static __inline int +uart_rxready(struct uart_devinfo *di) +{ + int res; + + uart_lock(di->hwmtx); + res = di->ops.rxready(&di->bas); + uart_unlock(di->hwmtx); + return (res); +} + +static __inline int uart_poll(struct uart_devinfo *di) { int res; uart_lock(di->hwmtx); - res = di->ops.poll(&di->bas); + if (di->ops.rxready(&di->bas)) + res = di->ops.getc(&di->bas, NULL); + else + res = -1; uart_unlock(di->hwmtx); return (res); } |