summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart/uart_cpu.h
diff options
context:
space:
mode:
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