Skip to content

Commit

Permalink
MN10300: fix debug polling in ttySM driver
Browse files Browse the repository at this point in the history
The debug polling interface for the SoC serial ports did not work in the case
where the serial ports were not also used as a console. In that case, the
uart driver startup function will not be called so tx and rx would not be
enabled in the hardware control register. Also, vdma interrupts would not be
enabled which the poll_get_char function relied on. This patch makes sure that
the rx and tx enables are set as a consequence of the uart set_termios call
which is the only initialization done for the debug polling interface. Also,
the poll_get_char now handles the case where vdma interrupts are not enabled.

Signed-off-by: Mark Salter <[email protected]>
Signed-off-by: David Howells <[email protected]>
  • Loading branch information
mosalter authored and dhowells committed Dec 12, 2012
1 parent 97a70b1 commit 0369c36
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions arch/mn10300/kernel/mn10300-serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -1374,7 +1374,8 @@ static void mn10300_serial_change_speed(struct mn10300_serial_port *port,
if ((new->c_cflag & CREAD) == 0)
port->uart.ignore_status_mask |= (1 << TTY_NORMAL);

scxctr |= *port->_control & (SC01CTR_TXE | SC01CTR_RXE | SC01CTR_BKE);
scxctr |= SC01CTR_TXE | SC01CTR_RXE;
scxctr |= *port->_control & SC01CTR_BKE;
*port->_control = scxctr;

spin_unlock_irqrestore(&port->uart.lock, flags);
Expand Down Expand Up @@ -1720,19 +1721,29 @@ static int mn10300_serial_poll_get_char(struct uart_port *_port)

_enter("%s", port->name);

do {
/* pull chars out of the hat */
ix = ACCESS_ONCE(port->rx_outp);
if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0)
return NO_POLL_CHAR;
if (mn10300_serial_int_tbl[port->rx_irq].port != NULL) {
do {
/* pull chars out of the hat */
ix = ACCESS_ONCE(port->rx_outp);
if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0)
return NO_POLL_CHAR;

smp_read_barrier_depends();
ch = port->rx_buffer[ix++];
st = port->rx_buffer[ix++];
smp_mb();
port->rx_outp = ix & (MNSC_BUFFER_SIZE - 1);
smp_read_barrier_depends();
ch = port->rx_buffer[ix++];
st = port->rx_buffer[ix++];
smp_mb();
port->rx_outp = ix & (MNSC_BUFFER_SIZE - 1);

} while (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF));
} while (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF));
} else {
do {
st = *port->_status;
if (st & (SC01STR_FEF | SC01STR_PEF | SC01STR_OEF))
continue;
} while (!(st & SC01STR_RBF));

ch = *port->_rxb;
}

return ch;
}
Expand Down

0 comments on commit 0369c36

Please sign in to comment.