Skip to content

Commit

Permalink
serial: bfin_sport_uart: only enable SPORT TX if data is to be sent
Browse files Browse the repository at this point in the history
Rather than always turn on the SPORT TX interrupt, only do it when we've
actually queued up data for transmission.  This avoids useless interrupt
processing.

Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Sonic Zhang authored and Greg Kroah-Hartman committed May 21, 2010
1 parent 60bd940 commit 9356c46
Showing 1 changed file with 21 additions and 9 deletions.
30 changes: 21 additions & 9 deletions drivers/serial/bfin_sport_uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ struct sport_uart_port {
#endif
};

static void sport_uart_tx_chars(struct sport_uart_port *up);
static int sport_uart_tx_chars(struct sport_uart_port *up);
static void sport_stop_tx(struct uart_port *port);

static inline void tx_one_byte(struct sport_uart_port *up, unsigned int value)
Expand Down Expand Up @@ -307,18 +307,24 @@ static int sport_startup(struct uart_port *port)
return ret;
}

static void sport_uart_tx_chars(struct sport_uart_port *up)
/*
* sport_uart_tx_chars
*
* ret 1 means need to enable sport.
* ret 0 means do nothing.
*/
static int sport_uart_tx_chars(struct sport_uart_port *up)
{
struct circ_buf *xmit = &up->port.state->xmit;

if (SPORT_GET_STAT(up) & TXF)
return;
return 0;

if (up->port.x_char) {
tx_one_byte(up, up->port.x_char);
up->port.icount.tx++;
up->port.x_char = 0;
return;
return 1;
}

if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
Expand All @@ -329,7 +335,7 @@ static void sport_uart_tx_chars(struct sport_uart_port *up)
*/
if (SPORT_GET_STAT(up) & TXHRE)
sport_stop_tx(&up->port);
return;
return 0;
}

while(!(SPORT_GET_STAT(up) & TXF) && !uart_circ_empty(xmit)) {
Expand All @@ -340,6 +346,8 @@ static void sport_uart_tx_chars(struct sport_uart_port *up)

if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
uart_write_wakeup(&up->port);

return 1;
}

static unsigned int sport_tx_empty(struct uart_port *port)
Expand All @@ -361,6 +369,9 @@ static void sport_stop_tx(struct uart_port *port)

pr_debug("%s enter\n", __func__);

if (!(SPORT_GET_TCR1(up) & TSPEN))
return;

/* Although the hold register is empty, last byte is still in shift
* register and not sent out yet. So, put a dummy data into TX FIFO.
* Then, sport tx stops when last byte is shift out and the dummy
Expand All @@ -383,11 +394,12 @@ static void sport_start_tx(struct uart_port *port)
pr_debug("%s enter\n", __func__);

/* Write data into SPORT FIFO before enable SPROT to transmit */
sport_uart_tx_chars(up);
if (sport_uart_tx_chars(up)) {
/* Enable transmit, then an interrupt will generated */
SPORT_PUT_TCR1(up, (SPORT_GET_TCR1(up) | TSPEN));
SSYNC();
}

/* Enable transmit, then an interrupt will generated */
SPORT_PUT_TCR1(up, (SPORT_GET_TCR1(up) | TSPEN));
SSYNC();
pr_debug("%s exit\n", __func__);
}

Expand Down

0 comments on commit 9356c46

Please sign in to comment.