From: Peter Korsgaard >> Ok, I can add a wmb(); between. Andrew> wmb() won't make that `0' hit the device. It'll take a Andrew> readb() to accomplish that. Ah yes, the following tiny patch does that: Signed-off-by: Peter Korsgaard Cc: Olof Johansson Cc: Russell King Cc: Alan Cox Signed-off-by: Andrew Morton --- drivers/serial/uartlite.c | 1 + 1 files changed, 1 insertion(+) diff -puN drivers/serial/uartlite.c~serial-uartlite-driver-fix drivers/serial/uartlite.c --- a/drivers/serial/uartlite.c~serial-uartlite-driver-fix +++ a/drivers/serial/uartlite.c @@ -210,6 +210,7 @@ static int ulite_startup(struct uart_por static void ulite_shutdown(struct uart_port *port) { writeb(0, port->membase + ULITE_CONTROL); + readb(port->membase + ULITE_CONTROL); /* dummy */ free_irq(port->irq, port); } _