summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arm/at91/uart_dev_at91usart.c16
-rw-r--r--sys/dev/uart/uart_cpu.h23
-rw-r--r--sys/dev/uart/uart_tty.c4
3 files changed, 43 insertions, 0 deletions
diff --git a/sys/arm/at91/uart_dev_at91usart.c b/sys/arm/at91/uart_dev_at91usart.c
index 9bc4dbf..43655b6 100644
--- a/sys/arm/at91/uart_dev_at91usart.c
+++ b/sys/arm/at91/uart_dev_at91usart.c
@@ -219,6 +219,20 @@ at91_usart_param(struct uart_bas *bas, int baudrate, int databits,
return (0);
}
+static void
+at91_usart_grab(struct uart_bas *bas)
+{
+
+ WR4(bas, USART_IDR, USART_CSR_RXRDY);
+}
+
+static void
+at91_usart_ungrab(struct uart_bas *bas)
+{
+
+ WR4(bas, USART_IER, USART_CSR_RXRDY);
+}
+
static struct uart_ops at91_usart_ops = {
.probe = at91_usart_probe,
.init = at91_usart_init,
@@ -226,6 +240,8 @@ static struct uart_ops at91_usart_ops = {
.putc = at91_usart_putc,
.rxready = at91_usart_rxready,
.getc = at91_usart_getc,
+ .grab = at91_usart_grab,
+ .ungrab = at91_usart_ungrab,
};
static int
diff --git a/sys/dev/uart/uart_cpu.h b/sys/dev/uart/uart_cpu.h
index db64d49..99ced1a 100644
--- a/sys/dev/uart/uart_cpu.h
+++ b/sys/dev/uart/uart_cpu.h
@@ -43,6 +43,8 @@ struct uart_ops {
void (*putc)(struct uart_bas *, int);
int (*rxready)(struct uart_bas *);
int (*getc)(struct uart_bas *, struct mtx *);
+ void (*grab)(struct uart_bas *);
+ void (*ungrab)(struct uart_bas *);
};
extern bus_space_tag_t uart_bus_space_io;
@@ -135,6 +137,27 @@ uart_putc(struct uart_devinfo *di, int c)
uart_unlock(di->hwmtx);
}
+static __inline void
+uart_grab(struct uart_devinfo *di)
+{
+
+ uart_lock(di->hwmtx);
+ if (di->ops->grab)
+ di->ops->grab(&di->bas);
+ uart_unlock(di->hwmtx);
+}
+
+static __inline void
+uart_ungrab(struct uart_devinfo *di)
+{
+
+ uart_lock(di->hwmtx);
+ if (di->ops->ungrab)
+ di->ops->ungrab(&di->bas);
+ uart_unlock(di->hwmtx);
+}
+
+
static __inline int
uart_rxready(struct uart_devinfo *di)
{
diff --git a/sys/dev/uart/uart_tty.c b/sys/dev/uart/uart_tty.c
index 97ee08d..56f879b 100644
--- a/sys/dev/uart/uart_tty.c
+++ b/sys/dev/uart/uart_tty.c
@@ -112,11 +112,15 @@ uart_cnterm(struct consdev *cp)
static void
uart_cngrab(struct consdev *cp)
{
+
+ uart_grab(cp->cn_arg);
}
static void
uart_cnungrab(struct consdev *cp)
{
+
+ uart_ungrab(cp->cn_arg);
}
static void
OpenPOWER on IntegriCloud