Title: [4096] branches/2007R1: Fix bug[#3824] Apply PM change on SVN trunk to 2007R1 branch.
Revision
4096
Author
sonicz
Date
2008-01-13 21:16:45 -0600 (Sun, 13 Jan 2008)

Log Message

Fix bug[#3824] Apply PM change on SVN trunk to 2007R1 branch.

Diffstat

 drivers/serial/bfin_5xx.c                         |   38 ++++++++++++----------
 include/asm-blackfin/mach-bf533/bfin_serial_5xx.h |    1 
 include/asm-blackfin/mach-bf537/bfin_serial_5xx.h |    1 
 include/asm-blackfin/mach-bf561/bfin_serial_5xx.h |    1 
 4 files changed, 24 insertions(+), 17 deletions(-)

Modified Paths

Diff

Modified: branches/2007R1/drivers/serial/bfin_5xx.c (4095 => 4096)


--- branches/2007R1/drivers/serial/bfin_5xx.c	2008-01-14 00:15:45 UTC (rev 4095)
+++ branches/2007R1/drivers/serial/bfin_5xx.c	2008-01-14 03:16:45 UTC (rev 4096)
@@ -87,6 +87,9 @@
 {
 	struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
 
+	while (!(UART_GET_LSR(uart) & TEMT))
+		continue;
+
 #ifdef CONFIG_SERIAL_BFIN_DMA
 	disable_dma(uart->tx_dma_channel);
 #else
@@ -203,6 +206,8 @@
 #endif
 
 	status = UART_GET_LSR(uart);
+	UART_CLEAR_LSR(uart);
+
  	ch = UART_GET_CHAR(uart);
  	uart->port.icount.rx++;
 
@@ -319,7 +324,6 @@
 		UART_PUT_CHAR(uart, uart->port.x_char);
 		uart->port.icount.tx++;
 		uart->port.x_char = 0;
-		return;
 	}
 	/*
 	 * Check the modem control lines before
@@ -360,10 +364,9 @@
 static irqreturn_t bfin_serial_tx_int(int irq, void *dev_id)
 {
 	struct bfin_serial_port *uart = dev_id;
-	unsigned short status;
 
 	spin_lock(&uart->port.lock);
-	while ((UART_GET_IIR(uart) & IIR_STATUS) == IIR_TX_READY)
+	if (UART_GET_LSR(uart) & THRE)
 		bfin_serial_tx_chars(uart);
 	spin_unlock(&uart->port.lock);
 	return IRQ_HANDLED;
@@ -390,12 +393,16 @@
 
 	uart->tx_done = 0;
 
+	if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) {
+		bfin_serial_stop_tx(&uart->port);
+		uart->tx_done = 1;
+		return;
+	}
+
 	if (uart->port.x_char) {
 		UART_PUT_CHAR(uart, uart->port.x_char);
 		uart->port.icount.tx++;
 		uart->port.x_char = 0;
-		uart->tx_done = 1;
-		return;
 	}
 	/*
 	 * Check the modem control lines before
@@ -403,12 +410,6 @@
 	 */
 	bfin_serial_mctrl_check(uart);
 
-	if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) {
-		bfin_serial_stop_tx(&uart->port);
-		uart->tx_done = 1;
-		return;
-	}
-
 	spin_lock_irqsave(&uart->port.lock, flags);
 	uart->tx_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE);
 	if (uart->tx_count > (UART_XMIT_SIZE - xmit->tail))
@@ -424,6 +425,10 @@
 	set_dma_x_count(uart->tx_dma_channel, uart->tx_count);
 	set_dma_x_modify(uart->tx_dma_channel, 1);
 	enable_dma(uart->tx_dma_channel);
+
+	xmit->tail = (xmit->tail + uart->tx_count) & (UART_XMIT_SIZE - 1);
+	uart->port.icount.tx += uart->tx_count;
+
 	ier = UART_GET_IER(uart);
 	ier |= ETBEI;
 	UART_PUT_IER(uart, ier);
@@ -436,6 +441,8 @@
 	int i, flg, status;
 
 	status = UART_GET_LSR(uart);
+	UART_CLEAR_LSR(uart);
+
 	uart->port.icount.rx += CIRC_CNT(uart->rx_dma_buf.head, uart->rx_dma_buf.tail, UART_XMIT_SIZE);;
 
 	if (status & BI) {
@@ -477,8 +484,6 @@
 	int x_pos, pos;
 	int flags = 0;
 
-	bfin_serial_dma_tx_chars(uart);
-
 	spin_lock_irqsave(&uart->port.lock, flags);
 	x_pos = DMA_RX_XCOUNT - get_dma_curr_xcount(uart->rx_dma_channel);
 	if (x_pos == DMA_RX_XCOUNT)
@@ -509,15 +514,13 @@
 		ier = UART_GET_IER(uart);
 		ier &= ~ETBEI;
 		UART_PUT_IER(uart, ier);
-		xmit->tail = (xmit->tail+uart->tx_count) &(UART_XMIT_SIZE -1);
-		uart->port.icount.tx+=uart->tx_count;
 
 		if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
 			uart_write_wakeup(&uart->port);
 
-		if (uart_circ_empty(xmit))
-			bfin_serial_stop_tx(&uart->port);
 		uart->tx_done = 1;
+
+		bfin_serial_dma_tx_chars(uart);
 	}
 
 	spin_unlock(&uart->port.lock);
@@ -696,6 +699,7 @@
 	disable_dma(uart->rx_dma_channel);
 	free_dma(uart->rx_dma_channel);
 	del_timer(&(uart->rx_dma_timer));
+	dma_free_coherent(NULL, PAGE_SIZE, uart->rx_dma_buf.buf, 0);
 #else
 #ifdef	CONFIG_KGDB_UART
 	if (uart->port.line != CONFIG_KGDB_UART_PORT)

Modified: branches/2007R1/include/asm-blackfin/mach-bf533/bfin_serial_5xx.h (4095 => 4096)


--- branches/2007R1/include/asm-blackfin/mach-bf533/bfin_serial_5xx.h	2008-01-14 00:15:45 UTC (rev 4095)
+++ branches/2007R1/include/asm-blackfin/mach-bf533/bfin_serial_5xx.h	2008-01-14 03:16:45 UTC (rev 4096)
@@ -31,6 +31,7 @@
 #define UART_PUT_DLH(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_DLH),v)
 #define UART_PUT_LCR(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_LCR),v)
 #define UART_PUT_GCTL(uart,v)   bfin_write16(((uart)->port.membase + OFFSET_GCTL),v)
+#define UART_CLEAR_LSR(uart)    bfin_write16(((uart)->port.membase + OFFSET_LSR), -1)
 
 #ifdef CONFIG_BFIN_UART0_CTSRTS
 # define CONFIG_SERIAL_BFIN_CTSRTS

Modified: branches/2007R1/include/asm-blackfin/mach-bf537/bfin_serial_5xx.h (4095 => 4096)


--- branches/2007R1/include/asm-blackfin/mach-bf537/bfin_serial_5xx.h	2008-01-14 00:15:45 UTC (rev 4095)
+++ branches/2007R1/include/asm-blackfin/mach-bf537/bfin_serial_5xx.h	2008-01-14 03:16:45 UTC (rev 4096)
@@ -31,6 +31,7 @@
 #define UART_PUT_DLH(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_DLH),v)
 #define UART_PUT_LCR(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_LCR),v)
 #define UART_PUT_GCTL(uart,v)   bfin_write16(((uart)->port.membase + OFFSET_GCTL),v)
+#define UART_CLEAR_LSR(uart)    bfin_write16(((uart)->port.membase + OFFSET_LSR), -1)
 
 #if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS)
 # define CONFIG_SERIAL_BFIN_CTSRTS

Modified: branches/2007R1/include/asm-blackfin/mach-bf561/bfin_serial_5xx.h (4095 => 4096)


--- branches/2007R1/include/asm-blackfin/mach-bf561/bfin_serial_5xx.h	2008-01-14 00:15:45 UTC (rev 4095)
+++ branches/2007R1/include/asm-blackfin/mach-bf561/bfin_serial_5xx.h	2008-01-14 03:16:45 UTC (rev 4096)
@@ -31,6 +31,7 @@
 #define UART_PUT_DLH(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_DLH),v)
 #define UART_PUT_LCR(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_LCR),v)
 #define UART_PUT_GCTL(uart,v)   bfin_write16(((uart)->port.membase + OFFSET_GCTL),v)
+#define UART_CLEAR_LSR(uart)    bfin_write16(((uart)->port.membase + OFFSET_LSR), -1)
 
 #ifdef CONFIG_BFIN_UART0_CTSRTS
 # define CONFIG_SERIAL_BFIN_CTSRTS
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to