From 9fa7fc275c4022d57910bf2838a0150d2e66e17c Mon Sep 17 00:00:00 2001 From: Shanker Donthineni Date: Thu, 9 Jun 2016 12:33:20 -0500 Subject: [PATCH] drivers/pl011: Use combination of UARTRIS and UARTMSC instead of UARTMIS The Masked interrupt status register (UARTMIS) is not described in ARM SBSA 2.x document. Anding of two registers UARTMSC and UARTRIS values gives the same information as register UARTMIS. UARTRIS, UARTMSC and UARTMIS definitions are found in PrimeCell UART PL011 (Revision: r1p4). - 3.3.10 Interrupt mask set/clear register, UARTIMSC - 3.3.11 Raw interrupt status register, UARTRIS - 3.3.12 Masked interrupt status register, UARTMIS This change is necessary for driver to be SBSA compliant v2.x without affecting the current driver functionality. Signed-off-by: Shanker Donthineni Reviewed-by: Julien Grall Signed-off-by: Stefano Stabellini --- xen/drivers/char/pl011.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/xen/drivers/char/pl011.c b/xen/drivers/char/pl011.c index 6a3c21bcb1..664dda6d13 100644 --- a/xen/drivers/char/pl011.c +++ b/xen/drivers/char/pl011.c @@ -53,11 +53,17 @@ static struct pl011 { #define pl011_read(uart, off) readl((uart)->regs + (off)) #define pl011_write(uart, off,val) writel((val), (uart)->regs + (off)) +static unsigned int pl011_intr_status(struct pl011 *uart) +{ + /* UARTMIS is not documented in SBSA v2.x, so use UARTRIS/UARTIMSC. */ + return (pl011_read(uart, RIS) & pl011_read(uart, IMSC)); +} + static void pl011_interrupt(int irq, void *data, struct cpu_user_regs *regs) { struct serial_port *port = data; struct pl011 *uart = port->uart; - unsigned int status = pl011_read(uart, MIS); + unsigned int status = pl011_intr_status(uart); if ( status ) { @@ -76,7 +82,7 @@ static void pl011_interrupt(int irq, void *data, struct cpu_user_regs *regs) if ( status & (TXI) ) serial_tx_interrupt(port, regs); - status = pl011_read(uart, MIS); + status = pl011_intr_status(uart); } while (status != 0); } } -- 2.39.5