aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-04-24 12:33:34 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-24 12:33:34 -0400
commit346ad4b7fe392571f19314f153db9151dbc1d82b (patch)
tree2d4085338c9044bca2f6472893da60387db3c96f /drivers/serial
parent845199f194306dbd69ca42d3b40a5125cdb50b89 (diff)
parent2dc63a84b2db23b9680646aff93917211613bf1a (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/blackfin-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/blackfin-2.6: (85 commits) Blackfin char driver for Blackfin on-chip OTP memory (v3) Blackfin Serial Driver: fix bug - use mod_timer to replace only add_timer. Blackfin Serial Driver: the uart break anomaly has been given its own number, so switch to it Blackfin Serial Driver: use BFIN_UART_NR_PORTS to help SIR driver in uart port. Blackfin Serial Driver: Fix bug - kernel hangs when accessing uart 0 on bf537 when booting u-boot and linux on uart 1 Blackfin Serial Driver: punt unused lsr variable Blackfin Serial Driver: Enable IR function when user application (irattach /dev/ttyBFx -s) call TIOCSETD ioctl with line discipline N_IRDA [Blackfin] arch: add include/boot .gitignore files [Blackfin] arch: Functional power management support: Add support for cpu frequency scaling [Blackfin] arch: Functional power management support: Remove broken cpu frequency scaling drivers [Blackfin] arch: Equalize include files: Add PLL_DIV Masks [Blackfin] arch: Add a warning about the value of CLKIN. [Blackfin] arch: take DDR DEVWD into consideration as well for BF548 [Blackfin] arch: Remove the circular buffering mechanism for exceptions [Blackfin] arch: lose unnecessary dependency on CONFIG_BFIN_ICACHE for MPU [Blackfin] arch: fix bug - before assign new channel to the map register, need clear the bits first. [Blackfin] arch: add Blackfin on-chip SIR IrDA driver support [Blackfin] arch: BF54x memsizes are in mbits, not mbytes [Blackfin] arch: try to remove condition that causes double fault, by checking current before it gets dereferenced [Blackfin] arch: Update anomaly list. ...
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/bfin_5xx.c56
1 files changed, 37 insertions, 19 deletions
diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c
index 46bb47f37b9a..5f55534a290b 100644
--- a/drivers/serial/bfin_5xx.c
+++ b/drivers/serial/bfin_5xx.c
@@ -151,7 +151,8 @@ void kgdb_put_debug_char(int chr)
151{ 151{
152 struct bfin_serial_port *uart; 152 struct bfin_serial_port *uart;
153 153
154 if (CONFIG_KGDB_UART_PORT<0 || CONFIG_KGDB_UART_PORT>=NR_PORTS) 154 if (CONFIG_KGDB_UART_PORT < 0
155 || CONFIG_KGDB_UART_PORT >= BFIN_UART_NR_PORTS)
155 uart = &bfin_serial_ports[0]; 156 uart = &bfin_serial_ports[0];
156 else 157 else
157 uart = &bfin_serial_ports[CONFIG_KGDB_UART_PORT]; 158 uart = &bfin_serial_ports[CONFIG_KGDB_UART_PORT];
@@ -173,7 +174,8 @@ int kgdb_get_debug_char(void)
173 struct bfin_serial_port *uart; 174 struct bfin_serial_port *uart;
174 unsigned char chr; 175 unsigned char chr;
175 176
176 if (CONFIG_KGDB_UART_PORT<0 || CONFIG_KGDB_UART_PORT>=NR_PORTS) 177 if (CONFIG_KGDB_UART_PORT < 0
178 || CONFIG_KGDB_UART_PORT >= BFIN_UART_NR_PORTS)
177 uart = &bfin_serial_ports[0]; 179 uart = &bfin_serial_ports[0];
178 else 180 else
179 uart = &bfin_serial_ports[CONFIG_KGDB_UART_PORT]; 181 uart = &bfin_serial_ports[CONFIG_KGDB_UART_PORT];
@@ -192,7 +194,7 @@ int kgdb_get_debug_char(void)
192} 194}
193#endif 195#endif
194 196
195#if ANOMALY_05000230 && defined(CONFIG_SERIAL_BFIN_PIO) 197#if ANOMALY_05000363 && defined(CONFIG_SERIAL_BFIN_PIO)
196# define UART_GET_ANOMALY_THRESHOLD(uart) ((uart)->anomaly_threshold) 198# define UART_GET_ANOMALY_THRESHOLD(uart) ((uart)->anomaly_threshold)
197# define UART_SET_ANOMALY_THRESHOLD(uart, v) ((uart)->anomaly_threshold = (v)) 199# define UART_SET_ANOMALY_THRESHOLD(uart, v) ((uart)->anomaly_threshold = (v))
198#else 200#else
@@ -237,7 +239,7 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
237 } 239 }
238#endif 240#endif
239 241
240 if (ANOMALY_05000230) { 242 if (ANOMALY_05000363) {
241 /* The BF533 (and BF561) family of processors have a nice anomaly 243 /* The BF533 (and BF561) family of processors have a nice anomaly
242 * where they continuously generate characters for a "single" break. 244 * where they continuously generate characters for a "single" break.
243 * We have to basically ignore this flood until the "next" valid 245 * We have to basically ignore this flood until the "next" valid
@@ -249,9 +251,6 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
249 * timeout was picked as it must absolutely be larger than 1 251 * timeout was picked as it must absolutely be larger than 1
250 * character time +/- some percent. So 1.5 sounds good. All other 252 * character time +/- some percent. So 1.5 sounds good. All other
251 * Blackfin families operate properly. Woo. 253 * Blackfin families operate properly. Woo.
252 * Note: While Anomaly 05000230 does not directly address this,
253 * the changes that went in for it also fixed this issue.
254 * That anomaly was fixed in 0.5+ silicon. I like bunnies.
255 */ 254 */
256 if (anomaly_start.tv_sec) { 255 if (anomaly_start.tv_sec) {
257 struct timeval curr; 256 struct timeval curr;
@@ -285,7 +284,7 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
285 } 284 }
286 285
287 if (status & BI) { 286 if (status & BI) {
288 if (ANOMALY_05000230) 287 if (ANOMALY_05000363)
289 if (bfin_revid() < 5) 288 if (bfin_revid() < 5)
290 do_gettimeofday(&anomaly_start); 289 do_gettimeofday(&anomaly_start);
291 uart->port.icount.brk++; 290 uart->port.icount.brk++;
@@ -507,8 +506,7 @@ void bfin_serial_rx_dma_timeout(struct bfin_serial_port *uart)
507 uart->rx_dma_buf.tail = uart->rx_dma_buf.head; 506 uart->rx_dma_buf.tail = uart->rx_dma_buf.head;
508 } 507 }
509 508
510 uart->rx_dma_timer.expires = jiffies + DMA_RX_FLUSH_JIFFIES; 509 mod_timer(&(uart->rx_dma_timer), jiffies + DMA_RX_FLUSH_JIFFIES);
511 add_timer(&(uart->rx_dma_timer));
512} 510}
513 511
514static irqreturn_t bfin_serial_dma_tx_int(int irq, void *dev_id) 512static irqreturn_t bfin_serial_dma_tx_int(int irq, void *dev_id)
@@ -551,9 +549,7 @@ static irqreturn_t bfin_serial_dma_rx_int(int irq, void *dev_id)
551 clear_dma_irqstat(uart->rx_dma_channel); 549 clear_dma_irqstat(uart->rx_dma_channel);
552 spin_unlock(&uart->port.lock); 550 spin_unlock(&uart->port.lock);
553 551
554 del_timer(&(uart->rx_dma_timer)); 552 mod_timer(&(uart->rx_dma_timer), jiffies);
555 uart->rx_dma_timer.expires = jiffies;
556 add_timer(&(uart->rx_dma_timer));
557 553
558 return IRQ_HANDLED; 554 return IRQ_HANDLED;
559} 555}
@@ -749,7 +745,7 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios,
749 struct bfin_serial_port *uart = (struct bfin_serial_port *)port; 745 struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
750 unsigned long flags; 746 unsigned long flags;
751 unsigned int baud, quot; 747 unsigned int baud, quot;
752 unsigned short val, ier, lsr, lcr = 0; 748 unsigned short val, ier, lcr = 0;
753 749
754 switch (termios->c_cflag & CSIZE) { 750 switch (termios->c_cflag & CSIZE) {
755 case CS8: 751 case CS8:
@@ -806,10 +802,6 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios,
806 802
807 UART_SET_ANOMALY_THRESHOLD(uart, USEC_PER_SEC / baud * 15); 803 UART_SET_ANOMALY_THRESHOLD(uart, USEC_PER_SEC / baud * 15);
808 804
809 do {
810 lsr = UART_GET_LSR(uart);
811 } while (!(lsr & TEMT));
812
813 /* Disable UART */ 805 /* Disable UART */
814 ier = UART_GET_IER(uart); 806 ier = UART_GET_IER(uart);
815#ifdef CONFIG_BF54x 807#ifdef CONFIG_BF54x
@@ -900,6 +892,31 @@ bfin_serial_verify_port(struct uart_port *port, struct serial_struct *ser)
900 return 0; 892 return 0;
901} 893}
902 894
895/*
896 * Enable the IrDA function if tty->ldisc.num is N_IRDA.
897 * In other cases, disable IrDA function.
898 */
899static void bfin_set_ldisc(struct tty_struct *tty)
900{
901 int line = tty->index;
902 unsigned short val;
903
904 if (line >= tty->driver->num)
905 return;
906
907 switch (tty->ldisc.num) {
908 case N_IRDA:
909 val = UART_GET_GCTL(&bfin_serial_ports[line]);
910 val |= (IREN | RPOLC);
911 UART_PUT_GCTL(&bfin_serial_ports[line], val);
912 break;
913 default:
914 val = UART_GET_GCTL(&bfin_serial_ports[line]);
915 val &= ~(IREN | RPOLC);
916 UART_PUT_GCTL(&bfin_serial_ports[line], val);
917 }
918}
919
903static struct uart_ops bfin_serial_pops = { 920static struct uart_ops bfin_serial_pops = {
904 .tx_empty = bfin_serial_tx_empty, 921 .tx_empty = bfin_serial_tx_empty,
905 .set_mctrl = bfin_serial_set_mctrl, 922 .set_mctrl = bfin_serial_set_mctrl,
@@ -1172,7 +1189,7 @@ static struct uart_driver bfin_serial_reg = {
1172 .dev_name = BFIN_SERIAL_NAME, 1189 .dev_name = BFIN_SERIAL_NAME,
1173 .major = BFIN_SERIAL_MAJOR, 1190 .major = BFIN_SERIAL_MAJOR,
1174 .minor = BFIN_SERIAL_MINOR, 1191 .minor = BFIN_SERIAL_MINOR,
1175 .nr = NR_PORTS, 1192 .nr = BFIN_UART_NR_PORTS,
1176 .cons = BFIN_SERIAL_CONSOLE, 1193 .cons = BFIN_SERIAL_CONSOLE,
1177}; 1194};
1178 1195
@@ -1261,6 +1278,7 @@ static int __init bfin_serial_init(void)
1261 1278
1262 ret = uart_register_driver(&bfin_serial_reg); 1279 ret = uart_register_driver(&bfin_serial_reg);
1263 if (ret == 0) { 1280 if (ret == 0) {
1281 bfin_serial_reg.tty_driver->set_ldisc = bfin_set_ldisc;
1264 ret = platform_driver_register(&bfin_serial_driver); 1282 ret = platform_driver_register(&bfin_serial_driver);
1265 if (ret) { 1283 if (ret) {
1266 pr_debug("uart register failed\n"); 1284 pr_debug("uart register failed\n");