summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart/uart_cpu.h
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2007-01-18 22:01:19 +0000
committermarius <marius@FreeBSD.org>2007-01-18 22:01:19 +0000
commit545a381d5f5917c12078fc06b779fab7711c053e (patch)
tree9d40efb79e6c86a1071e9763b706b391d9e9c487 /sys/dev/uart/uart_cpu.h
parent6f6da4e54a1b02d5dd2237063607a3b22d39e819 (diff)
downloadFreeBSD-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.h18
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);
}
OpenPOWER on IntegriCloud