serial: sh-sci: Reorder the SCxTDR write after the TDxE clear.

Under qemu there is a race between the TDxE read-and-clear and the SCxTDR
write. While on hardware it can be gauranteed that the read-and-clear
will happen prior to the character being written out, no such assumption
can be made under emulation. As this path happens with IRQs off and the
hardware itself doesn't care about the ordering, move the SCxTDR write
until after the read-and-clear.

Signed-off-by: Vladimir Prus <vladimir@codesourcery.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>

+2 -2
+1 -1
arch/sh/kernel/early_printk.c
··· 85 while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE)) 86 ; 87 88 - sci_out(&scif_port, SCxTDR, c); 89 sci_in(&scif_port, SCxSR); 90 sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40)); 91 92 while ((sci_in(&scif_port, SCxSR) & 0x40) == 0) 93 ;
··· 85 while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE)) 86 ; 87 88 sci_in(&scif_port, SCxSR); 89 sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40)); 90 + sci_out(&scif_port, SCxTDR, c); 91 92 while ((sci_in(&scif_port, SCxSR) & 0x40) == 0) 93 ;
+1 -1
drivers/serial/sh-sci.c
··· 144 status = sci_in(port, SCxSR); 145 } while (!(status & SCxSR_TDxE(port))); 146 147 - sci_out(port, SCxTDR, c); 148 sci_in(port, SCxSR); /* Dummy read */ 149 sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port)); 150 151 spin_unlock_irqrestore(&port->lock, flags); 152 }
··· 144 status = sci_in(port, SCxSR); 145 } while (!(status & SCxSR_TDxE(port))); 146 147 sci_in(port, SCxSR); /* Dummy read */ 148 sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port)); 149 + sci_out(port, SCxTDR, c); 150 151 spin_unlock_irqrestore(&port->lock, flags); 152 }