diff options
Diffstat (limited to 'drivers/serial')
36 files changed, 445 insertions, 515 deletions
diff --git a/drivers/serial/21285.c b/drivers/serial/21285.c index 0b10169961eb..aec39fb261ca 100644 --- a/drivers/serial/21285.c +++ b/drivers/serial/21285.c | |||
@@ -58,8 +58,7 @@ static const char serial21285_name[] = "Footbridge UART"; | |||
58 | * int((BAUD_BASE - (baud >> 1)) / baud) | 58 | * int((BAUD_BASE - (baud >> 1)) / baud) |
59 | */ | 59 | */ |
60 | 60 | ||
61 | static void | 61 | static void serial21285_stop_tx(struct uart_port *port) |
62 | serial21285_stop_tx(struct uart_port *port, unsigned int tty_stop) | ||
63 | { | 62 | { |
64 | if (tx_enabled(port)) { | 63 | if (tx_enabled(port)) { |
65 | disable_irq(IRQ_CONTX); | 64 | disable_irq(IRQ_CONTX); |
@@ -67,8 +66,7 @@ serial21285_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
67 | } | 66 | } |
68 | } | 67 | } |
69 | 68 | ||
70 | static void | 69 | static void serial21285_start_tx(struct uart_port *port) |
71 | serial21285_start_tx(struct uart_port *port, unsigned int tty_start) | ||
72 | { | 70 | { |
73 | if (!tx_enabled(port)) { | 71 | if (!tx_enabled(port)) { |
74 | enable_irq(IRQ_CONTX); | 72 | enable_irq(IRQ_CONTX); |
@@ -148,7 +146,7 @@ static irqreturn_t serial21285_tx_chars(int irq, void *dev_id, struct pt_regs *r | |||
148 | goto out; | 146 | goto out; |
149 | } | 147 | } |
150 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 148 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
151 | serial21285_stop_tx(port, 0); | 149 | serial21285_stop_tx(port); |
152 | goto out; | 150 | goto out; |
153 | } | 151 | } |
154 | 152 | ||
@@ -164,7 +162,7 @@ static irqreturn_t serial21285_tx_chars(int irq, void *dev_id, struct pt_regs *r | |||
164 | uart_write_wakeup(port); | 162 | uart_write_wakeup(port); |
165 | 163 | ||
166 | if (uart_circ_empty(xmit)) | 164 | if (uart_circ_empty(xmit)) |
167 | serial21285_stop_tx(port, 0); | 165 | serial21285_stop_tx(port); |
168 | 166 | ||
169 | out: | 167 | out: |
170 | return IRQ_HANDLED; | 168 | return IRQ_HANDLED; |
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 7e8fc7c1d4cc..cedb5f2f35cc 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
@@ -1001,7 +1001,7 @@ static inline void __stop_tx(struct uart_8250_port *p) | |||
1001 | } | 1001 | } |
1002 | } | 1002 | } |
1003 | 1003 | ||
1004 | static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop) | 1004 | static void serial8250_stop_tx(struct uart_port *port) |
1005 | { | 1005 | { |
1006 | struct uart_8250_port *up = (struct uart_8250_port *)port; | 1006 | struct uart_8250_port *up = (struct uart_8250_port *)port; |
1007 | 1007 | ||
@@ -1018,7 +1018,7 @@ static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
1018 | 1018 | ||
1019 | static void transmit_chars(struct uart_8250_port *up); | 1019 | static void transmit_chars(struct uart_8250_port *up); |
1020 | 1020 | ||
1021 | static void serial8250_start_tx(struct uart_port *port, unsigned int tty_start) | 1021 | static void serial8250_start_tx(struct uart_port *port) |
1022 | { | 1022 | { |
1023 | struct uart_8250_port *up = (struct uart_8250_port *)port; | 1023 | struct uart_8250_port *up = (struct uart_8250_port *)port; |
1024 | 1024 | ||
@@ -1158,7 +1158,11 @@ static _INLINE_ void transmit_chars(struct uart_8250_port *up) | |||
1158 | up->port.x_char = 0; | 1158 | up->port.x_char = 0; |
1159 | return; | 1159 | return; |
1160 | } | 1160 | } |
1161 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { | 1161 | if (uart_tx_stopped(&up->port)) { |
1162 | serial8250_stop_tx(&up->port); | ||
1163 | return; | ||
1164 | } | ||
1165 | if (uart_circ_empty(xmit)) { | ||
1162 | __stop_tx(up); | 1166 | __stop_tx(up); |
1163 | return; | 1167 | return; |
1164 | } | 1168 | } |
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index 07f05e9d0955..0e21f583690e 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c | |||
@@ -34,36 +34,6 @@ | |||
34 | #undef SERIAL_DEBUG_PCI | 34 | #undef SERIAL_DEBUG_PCI |
35 | 35 | ||
36 | /* | 36 | /* |
37 | * Definitions for PCI support. | ||
38 | */ | ||
39 | #define FL_BASE_MASK 0x0007 | ||
40 | #define FL_BASE0 0x0000 | ||
41 | #define FL_BASE1 0x0001 | ||
42 | #define FL_BASE2 0x0002 | ||
43 | #define FL_BASE3 0x0003 | ||
44 | #define FL_BASE4 0x0004 | ||
45 | #define FL_GET_BASE(x) (x & FL_BASE_MASK) | ||
46 | |||
47 | /* Use successive BARs (PCI base address registers), | ||
48 | else use offset into some specified BAR */ | ||
49 | #define FL_BASE_BARS 0x0008 | ||
50 | |||
51 | /* do not assign an irq */ | ||
52 | #define FL_NOIRQ 0x0080 | ||
53 | |||
54 | /* Use the Base address register size to cap number of ports */ | ||
55 | #define FL_REGION_SZ_CAP 0x0100 | ||
56 | |||
57 | struct pci_board { | ||
58 | unsigned int flags; | ||
59 | unsigned int num_ports; | ||
60 | unsigned int base_baud; | ||
61 | unsigned int uart_offset; | ||
62 | unsigned int reg_shift; | ||
63 | unsigned int first_offset; | ||
64 | }; | ||
65 | |||
66 | /* | ||
67 | * init function returns: | 37 | * init function returns: |
68 | * > 0 - number of ports | 38 | * > 0 - number of ports |
69 | * = 0 - use board->num_ports | 39 | * = 0 - use board->num_ports |
@@ -75,14 +45,15 @@ struct pci_serial_quirk { | |||
75 | u32 subvendor; | 45 | u32 subvendor; |
76 | u32 subdevice; | 46 | u32 subdevice; |
77 | int (*init)(struct pci_dev *dev); | 47 | int (*init)(struct pci_dev *dev); |
78 | int (*setup)(struct pci_dev *dev, struct pci_board *board, | 48 | int (*setup)(struct serial_private *, struct pciserial_board *, |
79 | struct uart_port *port, int idx); | 49 | struct uart_port *, int); |
80 | void (*exit)(struct pci_dev *dev); | 50 | void (*exit)(struct pci_dev *dev); |
81 | }; | 51 | }; |
82 | 52 | ||
83 | #define PCI_NUM_BAR_RESOURCES 6 | 53 | #define PCI_NUM_BAR_RESOURCES 6 |
84 | 54 | ||
85 | struct serial_private { | 55 | struct serial_private { |
56 | struct pci_dev *dev; | ||
86 | unsigned int nr; | 57 | unsigned int nr; |
87 | void __iomem *remapped_bar[PCI_NUM_BAR_RESOURCES]; | 58 | void __iomem *remapped_bar[PCI_NUM_BAR_RESOURCES]; |
88 | struct pci_serial_quirk *quirk; | 59 | struct pci_serial_quirk *quirk; |
@@ -101,17 +72,18 @@ static void moan_device(const char *str, struct pci_dev *dev) | |||
101 | } | 72 | } |
102 | 73 | ||
103 | static int | 74 | static int |
104 | setup_port(struct pci_dev *dev, struct uart_port *port, | 75 | setup_port(struct serial_private *priv, struct uart_port *port, |
105 | int bar, int offset, int regshift) | 76 | int bar, int offset, int regshift) |
106 | { | 77 | { |
107 | struct serial_private *priv = pci_get_drvdata(dev); | 78 | struct pci_dev *dev = priv->dev; |
108 | unsigned long base, len; | 79 | unsigned long base, len; |
109 | 80 | ||
110 | if (bar >= PCI_NUM_BAR_RESOURCES) | 81 | if (bar >= PCI_NUM_BAR_RESOURCES) |
111 | return -EINVAL; | 82 | return -EINVAL; |
112 | 83 | ||
84 | base = pci_resource_start(dev, bar); | ||
85 | |||
113 | if (pci_resource_flags(dev, bar) & IORESOURCE_MEM) { | 86 | if (pci_resource_flags(dev, bar) & IORESOURCE_MEM) { |
114 | base = pci_resource_start(dev, bar); | ||
115 | len = pci_resource_len(dev, bar); | 87 | len = pci_resource_len(dev, bar); |
116 | 88 | ||
117 | if (!priv->remapped_bar[bar]) | 89 | if (!priv->remapped_bar[bar]) |
@@ -120,13 +92,16 @@ setup_port(struct pci_dev *dev, struct uart_port *port, | |||
120 | return -ENOMEM; | 92 | return -ENOMEM; |
121 | 93 | ||
122 | port->iotype = UPIO_MEM; | 94 | port->iotype = UPIO_MEM; |
95 | port->iobase = 0; | ||
123 | port->mapbase = base + offset; | 96 | port->mapbase = base + offset; |
124 | port->membase = priv->remapped_bar[bar] + offset; | 97 | port->membase = priv->remapped_bar[bar] + offset; |
125 | port->regshift = regshift; | 98 | port->regshift = regshift; |
126 | } else { | 99 | } else { |
127 | base = pci_resource_start(dev, bar) + offset; | ||
128 | port->iotype = UPIO_PORT; | 100 | port->iotype = UPIO_PORT; |
129 | port->iobase = base; | 101 | port->iobase = base + offset; |
102 | port->mapbase = 0; | ||
103 | port->membase = NULL; | ||
104 | port->regshift = 0; | ||
130 | } | 105 | } |
131 | return 0; | 106 | return 0; |
132 | } | 107 | } |
@@ -136,7 +111,7 @@ setup_port(struct pci_dev *dev, struct uart_port *port, | |||
136 | * Not that ugly ;) -- HW | 111 | * Not that ugly ;) -- HW |
137 | */ | 112 | */ |
138 | static int | 113 | static int |
139 | afavlab_setup(struct pci_dev *dev, struct pci_board *board, | 114 | afavlab_setup(struct serial_private *priv, struct pciserial_board *board, |
140 | struct uart_port *port, int idx) | 115 | struct uart_port *port, int idx) |
141 | { | 116 | { |
142 | unsigned int bar, offset = board->first_offset; | 117 | unsigned int bar, offset = board->first_offset; |
@@ -149,7 +124,7 @@ afavlab_setup(struct pci_dev *dev, struct pci_board *board, | |||
149 | offset += (idx - 4) * board->uart_offset; | 124 | offset += (idx - 4) * board->uart_offset; |
150 | } | 125 | } |
151 | 126 | ||
152 | return setup_port(dev, port, bar, offset, board->reg_shift); | 127 | return setup_port(priv, port, bar, offset, board->reg_shift); |
153 | } | 128 | } |
154 | 129 | ||
155 | /* | 130 | /* |
@@ -189,13 +164,13 @@ static int __devinit pci_hp_diva_init(struct pci_dev *dev) | |||
189 | * some serial ports are supposed to be hidden on certain models. | 164 | * some serial ports are supposed to be hidden on certain models. |
190 | */ | 165 | */ |
191 | static int | 166 | static int |
192 | pci_hp_diva_setup(struct pci_dev *dev, struct pci_board *board, | 167 | pci_hp_diva_setup(struct serial_private *priv, struct pciserial_board *board, |
193 | struct uart_port *port, int idx) | 168 | struct uart_port *port, int idx) |
194 | { | 169 | { |
195 | unsigned int offset = board->first_offset; | 170 | unsigned int offset = board->first_offset; |
196 | unsigned int bar = FL_GET_BASE(board->flags); | 171 | unsigned int bar = FL_GET_BASE(board->flags); |
197 | 172 | ||
198 | switch (dev->subsystem_device) { | 173 | switch (priv->dev->subsystem_device) { |
199 | case PCI_DEVICE_ID_HP_DIVA_MAESTRO: | 174 | case PCI_DEVICE_ID_HP_DIVA_MAESTRO: |
200 | if (idx == 3) | 175 | if (idx == 3) |
201 | idx++; | 176 | idx++; |
@@ -212,7 +187,7 @@ pci_hp_diva_setup(struct pci_dev *dev, struct pci_board *board, | |||
212 | 187 | ||
213 | offset += idx * board->uart_offset; | 188 | offset += idx * board->uart_offset; |
214 | 189 | ||
215 | return setup_port(dev, port, bar, offset, board->reg_shift); | 190 | return setup_port(priv, port, bar, offset, board->reg_shift); |
216 | } | 191 | } |
217 | 192 | ||
218 | /* | 193 | /* |
@@ -307,7 +282,7 @@ static void __devexit pci_plx9050_exit(struct pci_dev *dev) | |||
307 | 282 | ||
308 | /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */ | 283 | /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */ |
309 | static int | 284 | static int |
310 | sbs_setup(struct pci_dev *dev, struct pci_board *board, | 285 | sbs_setup(struct serial_private *priv, struct pciserial_board *board, |
311 | struct uart_port *port, int idx) | 286 | struct uart_port *port, int idx) |
312 | { | 287 | { |
313 | unsigned int bar, offset = board->first_offset; | 288 | unsigned int bar, offset = board->first_offset; |
@@ -323,7 +298,7 @@ sbs_setup(struct pci_dev *dev, struct pci_board *board, | |||
323 | } else /* we have only 8 ports on PMC-OCTALPRO */ | 298 | } else /* we have only 8 ports on PMC-OCTALPRO */ |
324 | return 1; | 299 | return 1; |
325 | 300 | ||
326 | return setup_port(dev, port, bar, offset, board->reg_shift); | 301 | return setup_port(priv, port, bar, offset, board->reg_shift); |
327 | } | 302 | } |
328 | 303 | ||
329 | /* | 304 | /* |
@@ -389,6 +364,9 @@ static void __devexit sbs_exit(struct pci_dev *dev) | |||
389 | * - 10x cards have control registers in IO and/or memory space; | 364 | * - 10x cards have control registers in IO and/or memory space; |
390 | * - 20x cards have control registers in standard PCI configuration space. | 365 | * - 20x cards have control registers in standard PCI configuration space. |
391 | * | 366 | * |
367 | * Note: all 10x cards have PCI device ids 0x10.. | ||
368 | * all 20x cards have PCI device ids 0x20.. | ||
369 | * | ||
392 | * There are also Quartet Serial cards which use Oxford Semiconductor | 370 | * There are also Quartet Serial cards which use Oxford Semiconductor |
393 | * 16954 quad UART PCI chip clocked by 18.432 MHz quartz. | 371 | * 16954 quad UART PCI chip clocked by 18.432 MHz quartz. |
394 | * | 372 | * |
@@ -445,24 +423,18 @@ static int pci_siig20x_init(struct pci_dev *dev) | |||
445 | return 0; | 423 | return 0; |
446 | } | 424 | } |
447 | 425 | ||
448 | int pci_siig10x_fn(struct pci_dev *dev, int enable) | 426 | static int pci_siig_init(struct pci_dev *dev) |
449 | { | 427 | { |
450 | int ret = 0; | 428 | unsigned int type = dev->device & 0xff00; |
451 | if (enable) | ||
452 | ret = pci_siig10x_init(dev); | ||
453 | return ret; | ||
454 | } | ||
455 | 429 | ||
456 | int pci_siig20x_fn(struct pci_dev *dev, int enable) | 430 | if (type == 0x1000) |
457 | { | 431 | return pci_siig10x_init(dev); |
458 | int ret = 0; | 432 | else if (type == 0x2000) |
459 | if (enable) | 433 | return pci_siig20x_init(dev); |
460 | ret = pci_siig20x_init(dev); | ||
461 | return ret; | ||
462 | } | ||
463 | 434 | ||
464 | EXPORT_SYMBOL(pci_siig10x_fn); | 435 | moan_device("Unknown SIIG card", dev); |
465 | EXPORT_SYMBOL(pci_siig20x_fn); | 436 | return -ENODEV; |
437 | } | ||
466 | 438 | ||
467 | /* | 439 | /* |
468 | * Timedia has an explosion of boards, and to avoid the PCI table from | 440 | * Timedia has an explosion of boards, and to avoid the PCI table from |
@@ -523,7 +495,7 @@ static int __devinit pci_timedia_init(struct pci_dev *dev) | |||
523 | * Ugh, this is ugly as all hell --- TYT | 495 | * Ugh, this is ugly as all hell --- TYT |
524 | */ | 496 | */ |
525 | static int | 497 | static int |
526 | pci_timedia_setup(struct pci_dev *dev, struct pci_board *board, | 498 | pci_timedia_setup(struct serial_private *priv, struct pciserial_board *board, |
527 | struct uart_port *port, int idx) | 499 | struct uart_port *port, int idx) |
528 | { | 500 | { |
529 | unsigned int bar = 0, offset = board->first_offset; | 501 | unsigned int bar = 0, offset = board->first_offset; |
@@ -549,14 +521,15 @@ pci_timedia_setup(struct pci_dev *dev, struct pci_board *board, | |||
549 | bar = idx - 2; | 521 | bar = idx - 2; |
550 | } | 522 | } |
551 | 523 | ||
552 | return setup_port(dev, port, bar, offset, board->reg_shift); | 524 | return setup_port(priv, port, bar, offset, board->reg_shift); |
553 | } | 525 | } |
554 | 526 | ||
555 | /* | 527 | /* |
556 | * Some Titan cards are also a little weird | 528 | * Some Titan cards are also a little weird |
557 | */ | 529 | */ |
558 | static int | 530 | static int |
559 | titan_400l_800l_setup(struct pci_dev *dev, struct pci_board *board, | 531 | titan_400l_800l_setup(struct serial_private *priv, |
532 | struct pciserial_board *board, | ||
560 | struct uart_port *port, int idx) | 533 | struct uart_port *port, int idx) |
561 | { | 534 | { |
562 | unsigned int bar, offset = board->first_offset; | 535 | unsigned int bar, offset = board->first_offset; |
@@ -573,7 +546,7 @@ titan_400l_800l_setup(struct pci_dev *dev, struct pci_board *board, | |||
573 | offset = (idx - 2) * board->uart_offset; | 546 | offset = (idx - 2) * board->uart_offset; |
574 | } | 547 | } |
575 | 548 | ||
576 | return setup_port(dev, port, bar, offset, board->reg_shift); | 549 | return setup_port(priv, port, bar, offset, board->reg_shift); |
577 | } | 550 | } |
578 | 551 | ||
579 | static int __devinit pci_xircom_init(struct pci_dev *dev) | 552 | static int __devinit pci_xircom_init(struct pci_dev *dev) |
@@ -593,7 +566,7 @@ static int __devinit pci_netmos_init(struct pci_dev *dev) | |||
593 | } | 566 | } |
594 | 567 | ||
595 | static int | 568 | static int |
596 | pci_default_setup(struct pci_dev *dev, struct pci_board *board, | 569 | pci_default_setup(struct serial_private *priv, struct pciserial_board *board, |
597 | struct uart_port *port, int idx) | 570 | struct uart_port *port, int idx) |
598 | { | 571 | { |
599 | unsigned int bar, offset = board->first_offset, maxnr; | 572 | unsigned int bar, offset = board->first_offset, maxnr; |
@@ -604,13 +577,13 @@ pci_default_setup(struct pci_dev *dev, struct pci_board *board, | |||
604 | else | 577 | else |
605 | offset += idx * board->uart_offset; | 578 | offset += idx * board->uart_offset; |
606 | 579 | ||
607 | maxnr = (pci_resource_len(dev, bar) - board->first_offset) / | 580 | maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) / |
608 | (8 << board->reg_shift); | 581 | (8 << board->reg_shift); |
609 | 582 | ||
610 | if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr) | 583 | if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr) |
611 | return 1; | 584 | return 1; |
612 | 585 | ||
613 | return setup_port(dev, port, bar, offset, board->reg_shift); | 586 | return setup_port(priv, port, bar, offset, board->reg_shift); |
614 | } | 587 | } |
615 | 588 | ||
616 | /* This should be in linux/pci_ids.h */ | 589 | /* This should be in linux/pci_ids.h */ |
@@ -754,152 +727,15 @@ static struct pci_serial_quirk pci_serial_quirks[] = { | |||
754 | .setup = sbs_setup, | 727 | .setup = sbs_setup, |
755 | .exit = __devexit_p(sbs_exit), | 728 | .exit = __devexit_p(sbs_exit), |
756 | }, | 729 | }, |
757 | |||
758 | /* | 730 | /* |
759 | * SIIG cards. | 731 | * SIIG cards. |
760 | * It is not clear whether these could be collapsed. | ||
761 | */ | 732 | */ |
762 | { | 733 | { |
763 | .vendor = PCI_VENDOR_ID_SIIG, | 734 | .vendor = PCI_VENDOR_ID_SIIG, |
764 | .device = PCI_DEVICE_ID_SIIG_1S_10x_550, | 735 | .device = PCI_ANY_ID, |
765 | .subvendor = PCI_ANY_ID, | ||
766 | .subdevice = PCI_ANY_ID, | ||
767 | .init = pci_siig10x_init, | ||
768 | .setup = pci_default_setup, | ||
769 | }, | ||
770 | { | ||
771 | .vendor = PCI_VENDOR_ID_SIIG, | ||
772 | .device = PCI_DEVICE_ID_SIIG_1S_10x_650, | ||
773 | .subvendor = PCI_ANY_ID, | ||
774 | .subdevice = PCI_ANY_ID, | ||
775 | .init = pci_siig10x_init, | ||
776 | .setup = pci_default_setup, | ||
777 | }, | ||
778 | { | ||
779 | .vendor = PCI_VENDOR_ID_SIIG, | ||
780 | .device = PCI_DEVICE_ID_SIIG_1S_10x_850, | ||
781 | .subvendor = PCI_ANY_ID, | ||
782 | .subdevice = PCI_ANY_ID, | ||
783 | .init = pci_siig10x_init, | ||
784 | .setup = pci_default_setup, | ||
785 | }, | ||
786 | { | ||
787 | .vendor = PCI_VENDOR_ID_SIIG, | ||
788 | .device = PCI_DEVICE_ID_SIIG_2S_10x_550, | ||
789 | .subvendor = PCI_ANY_ID, | ||
790 | .subdevice = PCI_ANY_ID, | ||
791 | .init = pci_siig10x_init, | ||
792 | .setup = pci_default_setup, | ||
793 | }, | ||
794 | { | ||
795 | .vendor = PCI_VENDOR_ID_SIIG, | ||
796 | .device = PCI_DEVICE_ID_SIIG_2S_10x_650, | ||
797 | .subvendor = PCI_ANY_ID, | ||
798 | .subdevice = PCI_ANY_ID, | ||
799 | .init = pci_siig10x_init, | ||
800 | .setup = pci_default_setup, | ||
801 | }, | ||
802 | { | ||
803 | .vendor = PCI_VENDOR_ID_SIIG, | ||
804 | .device = PCI_DEVICE_ID_SIIG_2S_10x_850, | ||
805 | .subvendor = PCI_ANY_ID, | ||
806 | .subdevice = PCI_ANY_ID, | ||
807 | .init = pci_siig10x_init, | ||
808 | .setup = pci_default_setup, | ||
809 | }, | ||
810 | { | ||
811 | .vendor = PCI_VENDOR_ID_SIIG, | ||
812 | .device = PCI_DEVICE_ID_SIIG_4S_10x_550, | ||
813 | .subvendor = PCI_ANY_ID, | ||
814 | .subdevice = PCI_ANY_ID, | ||
815 | .init = pci_siig10x_init, | ||
816 | .setup = pci_default_setup, | ||
817 | }, | ||
818 | { | ||
819 | .vendor = PCI_VENDOR_ID_SIIG, | ||
820 | .device = PCI_DEVICE_ID_SIIG_4S_10x_650, | ||
821 | .subvendor = PCI_ANY_ID, | ||
822 | .subdevice = PCI_ANY_ID, | ||
823 | .init = pci_siig10x_init, | ||
824 | .setup = pci_default_setup, | ||
825 | }, | ||
826 | { | ||
827 | .vendor = PCI_VENDOR_ID_SIIG, | ||
828 | .device = PCI_DEVICE_ID_SIIG_4S_10x_850, | ||
829 | .subvendor = PCI_ANY_ID, | ||
830 | .subdevice = PCI_ANY_ID, | ||
831 | .init = pci_siig10x_init, | ||
832 | .setup = pci_default_setup, | ||
833 | }, | ||
834 | { | ||
835 | .vendor = PCI_VENDOR_ID_SIIG, | ||
836 | .device = PCI_DEVICE_ID_SIIG_1S_20x_550, | ||
837 | .subvendor = PCI_ANY_ID, | ||
838 | .subdevice = PCI_ANY_ID, | ||
839 | .init = pci_siig20x_init, | ||
840 | .setup = pci_default_setup, | ||
841 | }, | ||
842 | { | ||
843 | .vendor = PCI_VENDOR_ID_SIIG, | ||
844 | .device = PCI_DEVICE_ID_SIIG_1S_20x_650, | ||
845 | .subvendor = PCI_ANY_ID, | ||
846 | .subdevice = PCI_ANY_ID, | ||
847 | .init = pci_siig20x_init, | ||
848 | .setup = pci_default_setup, | ||
849 | }, | ||
850 | { | ||
851 | .vendor = PCI_VENDOR_ID_SIIG, | ||
852 | .device = PCI_DEVICE_ID_SIIG_1S_20x_850, | ||
853 | .subvendor = PCI_ANY_ID, | ||
854 | .subdevice = PCI_ANY_ID, | ||
855 | .init = pci_siig20x_init, | ||
856 | .setup = pci_default_setup, | ||
857 | }, | ||
858 | { | ||
859 | .vendor = PCI_VENDOR_ID_SIIG, | ||
860 | .device = PCI_DEVICE_ID_SIIG_2S_20x_550, | ||
861 | .subvendor = PCI_ANY_ID, | ||
862 | .subdevice = PCI_ANY_ID, | ||
863 | .init = pci_siig20x_init, | ||
864 | .setup = pci_default_setup, | ||
865 | }, | ||
866 | { .vendor = PCI_VENDOR_ID_SIIG, | ||
867 | .device = PCI_DEVICE_ID_SIIG_2S_20x_650, | ||
868 | .subvendor = PCI_ANY_ID, | ||
869 | .subdevice = PCI_ANY_ID, | ||
870 | .init = pci_siig20x_init, | ||
871 | .setup = pci_default_setup, | ||
872 | }, | ||
873 | { | ||
874 | .vendor = PCI_VENDOR_ID_SIIG, | ||
875 | .device = PCI_DEVICE_ID_SIIG_2S_20x_850, | ||
876 | .subvendor = PCI_ANY_ID, | ||
877 | .subdevice = PCI_ANY_ID, | ||
878 | .init = pci_siig20x_init, | ||
879 | .setup = pci_default_setup, | ||
880 | }, | ||
881 | { | ||
882 | .vendor = PCI_VENDOR_ID_SIIG, | ||
883 | .device = PCI_DEVICE_ID_SIIG_4S_20x_550, | ||
884 | .subvendor = PCI_ANY_ID, | ||
885 | .subdevice = PCI_ANY_ID, | ||
886 | .init = pci_siig20x_init, | ||
887 | .setup = pci_default_setup, | ||
888 | }, | ||
889 | { | ||
890 | .vendor = PCI_VENDOR_ID_SIIG, | ||
891 | .device = PCI_DEVICE_ID_SIIG_4S_20x_650, | ||
892 | .subvendor = PCI_ANY_ID, | ||
893 | .subdevice = PCI_ANY_ID, | ||
894 | .init = pci_siig20x_init, | ||
895 | .setup = pci_default_setup, | ||
896 | }, | ||
897 | { | ||
898 | .vendor = PCI_VENDOR_ID_SIIG, | ||
899 | .device = PCI_DEVICE_ID_SIIG_4S_20x_850, | ||
900 | .subvendor = PCI_ANY_ID, | 736 | .subvendor = PCI_ANY_ID, |
901 | .subdevice = PCI_ANY_ID, | 737 | .subdevice = PCI_ANY_ID, |
902 | .init = pci_siig20x_init, | 738 | .init = pci_siig_init, |
903 | .setup = pci_default_setup, | 739 | .setup = pci_default_setup, |
904 | }, | 740 | }, |
905 | /* | 741 | /* |
@@ -990,7 +826,7 @@ static struct pci_serial_quirk *find_quirk(struct pci_dev *dev) | |||
990 | } | 826 | } |
991 | 827 | ||
992 | static _INLINE_ int | 828 | static _INLINE_ int |
993 | get_pci_irq(struct pci_dev *dev, struct pci_board *board, int idx) | 829 | get_pci_irq(struct pci_dev *dev, struct pciserial_board *board) |
994 | { | 830 | { |
995 | if (board->flags & FL_NOIRQ) | 831 | if (board->flags & FL_NOIRQ) |
996 | return 0; | 832 | return 0; |
@@ -1115,7 +951,7 @@ enum pci_board_num_t { | |||
1115 | * see first lines of serial_in() and serial_out() in 8250.c | 951 | * see first lines of serial_in() and serial_out() in 8250.c |
1116 | */ | 952 | */ |
1117 | 953 | ||
1118 | static struct pci_board pci_boards[] __devinitdata = { | 954 | static struct pciserial_board pci_boards[] __devinitdata = { |
1119 | [pbn_default] = { | 955 | [pbn_default] = { |
1120 | .flags = FL_BASE0, | 956 | .flags = FL_BASE0, |
1121 | .num_ports = 1, | 957 | .num_ports = 1, |
@@ -1575,7 +1411,7 @@ static struct pci_board pci_boards[] __devinitdata = { | |||
1575 | * serial specs. Returns 0 on success, 1 on failure. | 1411 | * serial specs. Returns 0 on success, 1 on failure. |
1576 | */ | 1412 | */ |
1577 | static int __devinit | 1413 | static int __devinit |
1578 | serial_pci_guess_board(struct pci_dev *dev, struct pci_board *board) | 1414 | serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board) |
1579 | { | 1415 | { |
1580 | int num_iomem, num_port, first_port = -1, i; | 1416 | int num_iomem, num_port, first_port = -1, i; |
1581 | 1417 | ||
@@ -1640,7 +1476,8 @@ serial_pci_guess_board(struct pci_dev *dev, struct pci_board *board) | |||
1640 | } | 1476 | } |
1641 | 1477 | ||
1642 | static inline int | 1478 | static inline int |
1643 | serial_pci_matches(struct pci_board *board, struct pci_board *guessed) | 1479 | serial_pci_matches(struct pciserial_board *board, |
1480 | struct pciserial_board *guessed) | ||
1644 | { | 1481 | { |
1645 | return | 1482 | return |
1646 | board->num_ports == guessed->num_ports && | 1483 | board->num_ports == guessed->num_ports && |
@@ -1650,58 +1487,14 @@ serial_pci_matches(struct pci_board *board, struct pci_board *guessed) | |||
1650 | board->first_offset == guessed->first_offset; | 1487 | board->first_offset == guessed->first_offset; |
1651 | } | 1488 | } |
1652 | 1489 | ||
1653 | /* | 1490 | struct serial_private * |
1654 | * Probe one serial board. Unfortunately, there is no rhyme nor reason | 1491 | pciserial_init_ports(struct pci_dev *dev, struct pciserial_board *board) |
1655 | * to the arrangement of serial ports on a PCI card. | ||
1656 | */ | ||
1657 | static int __devinit | ||
1658 | pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent) | ||
1659 | { | 1492 | { |
1493 | struct uart_port serial_port; | ||
1660 | struct serial_private *priv; | 1494 | struct serial_private *priv; |
1661 | struct pci_board *board, tmp; | ||
1662 | struct pci_serial_quirk *quirk; | 1495 | struct pci_serial_quirk *quirk; |
1663 | int rc, nr_ports, i; | 1496 | int rc, nr_ports, i; |
1664 | 1497 | ||
1665 | if (ent->driver_data >= ARRAY_SIZE(pci_boards)) { | ||
1666 | printk(KERN_ERR "pci_init_one: invalid driver_data: %ld\n", | ||
1667 | ent->driver_data); | ||
1668 | return -EINVAL; | ||
1669 | } | ||
1670 | |||
1671 | board = &pci_boards[ent->driver_data]; | ||
1672 | |||
1673 | rc = pci_enable_device(dev); | ||
1674 | if (rc) | ||
1675 | return rc; | ||
1676 | |||
1677 | if (ent->driver_data == pbn_default) { | ||
1678 | /* | ||
1679 | * Use a copy of the pci_board entry for this; | ||
1680 | * avoid changing entries in the table. | ||
1681 | */ | ||
1682 | memcpy(&tmp, board, sizeof(struct pci_board)); | ||
1683 | board = &tmp; | ||
1684 | |||
1685 | /* | ||
1686 | * We matched one of our class entries. Try to | ||
1687 | * determine the parameters of this board. | ||
1688 | */ | ||
1689 | rc = serial_pci_guess_board(dev, board); | ||
1690 | if (rc) | ||
1691 | goto disable; | ||
1692 | } else { | ||
1693 | /* | ||
1694 | * We matched an explicit entry. If we are able to | ||
1695 | * detect this boards settings with our heuristic, | ||
1696 | * then we no longer need this entry. | ||
1697 | */ | ||
1698 | memcpy(&tmp, &pci_boards[pbn_default], sizeof(struct pci_board)); | ||
1699 | rc = serial_pci_guess_board(dev, &tmp); | ||
1700 | if (rc == 0 && serial_pci_matches(board, &tmp)) | ||
1701 | moan_device("Redundant entry in serial pci_table.", | ||
1702 | dev); | ||
1703 | } | ||
1704 | |||
1705 | nr_ports = board->num_ports; | 1498 | nr_ports = board->num_ports; |
1706 | 1499 | ||
1707 | /* | 1500 | /* |
@@ -1718,8 +1511,10 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1718 | */ | 1511 | */ |
1719 | if (quirk->init) { | 1512 | if (quirk->init) { |
1720 | rc = quirk->init(dev); | 1513 | rc = quirk->init(dev); |
1721 | if (rc < 0) | 1514 | if (rc < 0) { |
1722 | goto disable; | 1515 | priv = ERR_PTR(rc); |
1516 | goto err_out; | ||
1517 | } | ||
1723 | if (rc) | 1518 | if (rc) |
1724 | nr_ports = rc; | 1519 | nr_ports = rc; |
1725 | } | 1520 | } |
@@ -1728,27 +1523,26 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1728 | sizeof(unsigned int) * nr_ports, | 1523 | sizeof(unsigned int) * nr_ports, |
1729 | GFP_KERNEL); | 1524 | GFP_KERNEL); |
1730 | if (!priv) { | 1525 | if (!priv) { |
1731 | rc = -ENOMEM; | 1526 | priv = ERR_PTR(-ENOMEM); |
1732 | goto deinit; | 1527 | goto err_deinit; |
1733 | } | 1528 | } |
1734 | 1529 | ||
1735 | memset(priv, 0, sizeof(struct serial_private) + | 1530 | memset(priv, 0, sizeof(struct serial_private) + |
1736 | sizeof(unsigned int) * nr_ports); | 1531 | sizeof(unsigned int) * nr_ports); |
1737 | 1532 | ||
1533 | priv->dev = dev; | ||
1738 | priv->quirk = quirk; | 1534 | priv->quirk = quirk; |
1739 | pci_set_drvdata(dev, priv); | 1535 | |
1536 | memset(&serial_port, 0, sizeof(struct uart_port)); | ||
1537 | serial_port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; | ||
1538 | serial_port.uartclk = board->base_baud * 16; | ||
1539 | serial_port.irq = get_pci_irq(dev, board); | ||
1540 | serial_port.dev = &dev->dev; | ||
1740 | 1541 | ||
1741 | for (i = 0; i < nr_ports; i++) { | 1542 | for (i = 0; i < nr_ports; i++) { |
1742 | struct uart_port serial_port; | 1543 | if (quirk->setup(priv, board, &serial_port, i)) |
1743 | memset(&serial_port, 0, sizeof(struct uart_port)); | ||
1744 | |||
1745 | serial_port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | | ||
1746 | UPF_SHARE_IRQ; | ||
1747 | serial_port.uartclk = board->base_baud * 16; | ||
1748 | serial_port.irq = get_pci_irq(dev, board, i); | ||
1749 | serial_port.dev = &dev->dev; | ||
1750 | if (quirk->setup(dev, board, &serial_port, i)) | ||
1751 | break; | 1544 | break; |
1545 | |||
1752 | #ifdef SERIAL_DEBUG_PCI | 1546 | #ifdef SERIAL_DEBUG_PCI |
1753 | printk("Setup PCI port: port %x, irq %d, type %d\n", | 1547 | printk("Setup PCI port: port %x, irq %d, type %d\n", |
1754 | serial_port.iobase, serial_port.irq, serial_port.iotype); | 1548 | serial_port.iobase, serial_port.irq, serial_port.iotype); |
@@ -1763,24 +1557,21 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1763 | 1557 | ||
1764 | priv->nr = i; | 1558 | priv->nr = i; |
1765 | 1559 | ||
1766 | return 0; | 1560 | return priv; |
1767 | 1561 | ||
1768 | deinit: | 1562 | err_deinit: |
1769 | if (quirk->exit) | 1563 | if (quirk->exit) |
1770 | quirk->exit(dev); | 1564 | quirk->exit(dev); |
1771 | disable: | 1565 | err_out: |
1772 | pci_disable_device(dev); | 1566 | return priv; |
1773 | return rc; | ||
1774 | } | 1567 | } |
1568 | EXPORT_SYMBOL_GPL(pciserial_init_ports); | ||
1775 | 1569 | ||
1776 | static void __devexit pciserial_remove_one(struct pci_dev *dev) | 1570 | void pciserial_remove_ports(struct serial_private *priv) |
1777 | { | 1571 | { |
1778 | struct serial_private *priv = pci_get_drvdata(dev); | ||
1779 | struct pci_serial_quirk *quirk; | 1572 | struct pci_serial_quirk *quirk; |
1780 | int i; | 1573 | int i; |
1781 | 1574 | ||
1782 | pci_set_drvdata(dev, NULL); | ||
1783 | |||
1784 | for (i = 0; i < priv->nr; i++) | 1575 | for (i = 0; i < priv->nr; i++) |
1785 | serial8250_unregister_port(priv->line[i]); | 1576 | serial8250_unregister_port(priv->line[i]); |
1786 | 1577 | ||
@@ -1793,25 +1584,123 @@ static void __devexit pciserial_remove_one(struct pci_dev *dev) | |||
1793 | /* | 1584 | /* |
1794 | * Find the exit quirks. | 1585 | * Find the exit quirks. |
1795 | */ | 1586 | */ |
1796 | quirk = find_quirk(dev); | 1587 | quirk = find_quirk(priv->dev); |
1797 | if (quirk->exit) | 1588 | if (quirk->exit) |
1798 | quirk->exit(dev); | 1589 | quirk->exit(priv->dev); |
1590 | |||
1591 | kfree(priv); | ||
1592 | } | ||
1593 | EXPORT_SYMBOL_GPL(pciserial_remove_ports); | ||
1594 | |||
1595 | void pciserial_suspend_ports(struct serial_private *priv) | ||
1596 | { | ||
1597 | int i; | ||
1598 | |||
1599 | for (i = 0; i < priv->nr; i++) | ||
1600 | if (priv->line[i] >= 0) | ||
1601 | serial8250_suspend_port(priv->line[i]); | ||
1602 | } | ||
1603 | EXPORT_SYMBOL_GPL(pciserial_suspend_ports); | ||
1604 | |||
1605 | void pciserial_resume_ports(struct serial_private *priv) | ||
1606 | { | ||
1607 | int i; | ||
1608 | |||
1609 | /* | ||
1610 | * Ensure that the board is correctly configured. | ||
1611 | */ | ||
1612 | if (priv->quirk->init) | ||
1613 | priv->quirk->init(priv->dev); | ||
1614 | |||
1615 | for (i = 0; i < priv->nr; i++) | ||
1616 | if (priv->line[i] >= 0) | ||
1617 | serial8250_resume_port(priv->line[i]); | ||
1618 | } | ||
1619 | EXPORT_SYMBOL_GPL(pciserial_resume_ports); | ||
1620 | |||
1621 | /* | ||
1622 | * Probe one serial board. Unfortunately, there is no rhyme nor reason | ||
1623 | * to the arrangement of serial ports on a PCI card. | ||
1624 | */ | ||
1625 | static int __devinit | ||
1626 | pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent) | ||
1627 | { | ||
1628 | struct serial_private *priv; | ||
1629 | struct pciserial_board *board, tmp; | ||
1630 | int rc; | ||
1631 | |||
1632 | if (ent->driver_data >= ARRAY_SIZE(pci_boards)) { | ||
1633 | printk(KERN_ERR "pci_init_one: invalid driver_data: %ld\n", | ||
1634 | ent->driver_data); | ||
1635 | return -EINVAL; | ||
1636 | } | ||
1637 | |||
1638 | board = &pci_boards[ent->driver_data]; | ||
1639 | |||
1640 | rc = pci_enable_device(dev); | ||
1641 | if (rc) | ||
1642 | return rc; | ||
1643 | |||
1644 | if (ent->driver_data == pbn_default) { | ||
1645 | /* | ||
1646 | * Use a copy of the pci_board entry for this; | ||
1647 | * avoid changing entries in the table. | ||
1648 | */ | ||
1649 | memcpy(&tmp, board, sizeof(struct pciserial_board)); | ||
1650 | board = &tmp; | ||
1651 | |||
1652 | /* | ||
1653 | * We matched one of our class entries. Try to | ||
1654 | * determine the parameters of this board. | ||
1655 | */ | ||
1656 | rc = serial_pci_guess_board(dev, board); | ||
1657 | if (rc) | ||
1658 | goto disable; | ||
1659 | } else { | ||
1660 | /* | ||
1661 | * We matched an explicit entry. If we are able to | ||
1662 | * detect this boards settings with our heuristic, | ||
1663 | * then we no longer need this entry. | ||
1664 | */ | ||
1665 | memcpy(&tmp, &pci_boards[pbn_default], | ||
1666 | sizeof(struct pciserial_board)); | ||
1667 | rc = serial_pci_guess_board(dev, &tmp); | ||
1668 | if (rc == 0 && serial_pci_matches(board, &tmp)) | ||
1669 | moan_device("Redundant entry in serial pci_table.", | ||
1670 | dev); | ||
1671 | } | ||
1799 | 1672 | ||
1673 | priv = pciserial_init_ports(dev, board); | ||
1674 | if (!IS_ERR(priv)) { | ||
1675 | pci_set_drvdata(dev, priv); | ||
1676 | return 0; | ||
1677 | } | ||
1678 | |||
1679 | rc = PTR_ERR(priv); | ||
1680 | |||
1681 | disable: | ||
1800 | pci_disable_device(dev); | 1682 | pci_disable_device(dev); |
1683 | return rc; | ||
1684 | } | ||
1801 | 1685 | ||
1802 | kfree(priv); | 1686 | static void __devexit pciserial_remove_one(struct pci_dev *dev) |
1687 | { | ||
1688 | struct serial_private *priv = pci_get_drvdata(dev); | ||
1689 | |||
1690 | pci_set_drvdata(dev, NULL); | ||
1691 | |||
1692 | pciserial_remove_ports(priv); | ||
1693 | |||
1694 | pci_disable_device(dev); | ||
1803 | } | 1695 | } |
1804 | 1696 | ||
1805 | static int pciserial_suspend_one(struct pci_dev *dev, pm_message_t state) | 1697 | static int pciserial_suspend_one(struct pci_dev *dev, pm_message_t state) |
1806 | { | 1698 | { |
1807 | struct serial_private *priv = pci_get_drvdata(dev); | 1699 | struct serial_private *priv = pci_get_drvdata(dev); |
1808 | 1700 | ||
1809 | if (priv) { | 1701 | if (priv) |
1810 | int i; | 1702 | pciserial_suspend_ports(priv); |
1811 | 1703 | ||
1812 | for (i = 0; i < priv->nr; i++) | ||
1813 | serial8250_suspend_port(priv->line[i]); | ||
1814 | } | ||
1815 | pci_save_state(dev); | 1704 | pci_save_state(dev); |
1816 | pci_set_power_state(dev, pci_choose_state(dev, state)); | 1705 | pci_set_power_state(dev, pci_choose_state(dev, state)); |
1817 | return 0; | 1706 | return 0; |
@@ -1825,21 +1714,12 @@ static int pciserial_resume_one(struct pci_dev *dev) | |||
1825 | pci_restore_state(dev); | 1714 | pci_restore_state(dev); |
1826 | 1715 | ||
1827 | if (priv) { | 1716 | if (priv) { |
1828 | int i; | ||
1829 | |||
1830 | /* | 1717 | /* |
1831 | * The device may have been disabled. Re-enable it. | 1718 | * The device may have been disabled. Re-enable it. |
1832 | */ | 1719 | */ |
1833 | pci_enable_device(dev); | 1720 | pci_enable_device(dev); |
1834 | 1721 | ||
1835 | /* | 1722 | pciserial_resume_ports(priv); |
1836 | * Ensure that the board is correctly configured. | ||
1837 | */ | ||
1838 | if (priv->quirk->init) | ||
1839 | priv->quirk->init(dev); | ||
1840 | |||
1841 | for (i = 0; i < priv->nr; i++) | ||
1842 | serial8250_resume_port(priv->line[i]); | ||
1843 | } | 1723 | } |
1844 | return 0; | 1724 | return 0; |
1845 | } | 1725 | } |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 97034d3937fd..d5797618a3b9 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -211,7 +211,7 @@ comment "Non-8250 serial port support" | |||
211 | 211 | ||
212 | config SERIAL_AMBA_PL010 | 212 | config SERIAL_AMBA_PL010 |
213 | tristate "ARM AMBA PL010 serial port support" | 213 | tristate "ARM AMBA PL010 serial port support" |
214 | depends on ARM_AMBA | 214 | depends on ARM_AMBA && (BROKEN || !ARCH_VERSATILE) |
215 | select SERIAL_CORE | 215 | select SERIAL_CORE |
216 | help | 216 | help |
217 | This selects the ARM(R) AMBA(R) PrimeCell PL010 UART. If you have | 217 | This selects the ARM(R) AMBA(R) PrimeCell PL010 UART. If you have |
@@ -819,7 +819,7 @@ config SERIAL_M32R_SIO_CONSOLE | |||
819 | 819 | ||
820 | config SERIAL_M32R_PLDSIO | 820 | config SERIAL_M32R_PLDSIO |
821 | bool "M32R SIO I/F on a PLD" | 821 | bool "M32R SIO I/F on a PLD" |
822 | depends on SERIAL_M32R_SIO=y | 822 | depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PALT_USRV || PLAT_M32700UT) |
823 | default n | 823 | default n |
824 | help | 824 | help |
825 | Say Y here if you want to use the M32R serial controller | 825 | Say Y here if you want to use the M32R serial controller |
diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c index 2884b310e54d..978e12437e61 100644 --- a/drivers/serial/amba-pl010.c +++ b/drivers/serial/amba-pl010.c | |||
@@ -105,7 +105,7 @@ struct uart_amba_port { | |||
105 | unsigned int old_status; | 105 | unsigned int old_status; |
106 | }; | 106 | }; |
107 | 107 | ||
108 | static void pl010_stop_tx(struct uart_port *port, unsigned int tty_stop) | 108 | static void pl010_stop_tx(struct uart_port *port) |
109 | { | 109 | { |
110 | unsigned int cr; | 110 | unsigned int cr; |
111 | 111 | ||
@@ -114,7 +114,7 @@ static void pl010_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
114 | UART_PUT_CR(port, cr); | 114 | UART_PUT_CR(port, cr); |
115 | } | 115 | } |
116 | 116 | ||
117 | static void pl010_start_tx(struct uart_port *port, unsigned int tty_start) | 117 | static void pl010_start_tx(struct uart_port *port) |
118 | { | 118 | { |
119 | unsigned int cr; | 119 | unsigned int cr; |
120 | 120 | ||
@@ -219,7 +219,7 @@ static void pl010_tx_chars(struct uart_port *port) | |||
219 | return; | 219 | return; |
220 | } | 220 | } |
221 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 221 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
222 | pl010_stop_tx(port, 0); | 222 | pl010_stop_tx(port); |
223 | return; | 223 | return; |
224 | } | 224 | } |
225 | 225 | ||
@@ -236,7 +236,7 @@ static void pl010_tx_chars(struct uart_port *port) | |||
236 | uart_write_wakeup(port); | 236 | uart_write_wakeup(port); |
237 | 237 | ||
238 | if (uart_circ_empty(xmit)) | 238 | if (uart_circ_empty(xmit)) |
239 | pl010_stop_tx(port, 0); | 239 | pl010_stop_tx(port); |
240 | } | 240 | } |
241 | 241 | ||
242 | static void pl010_modem_status(struct uart_port *port) | 242 | static void pl010_modem_status(struct uart_port *port) |
diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c index 7db88ee18f75..56071309744c 100644 --- a/drivers/serial/amba-pl011.c +++ b/drivers/serial/amba-pl011.c | |||
@@ -74,7 +74,7 @@ struct uart_amba_port { | |||
74 | unsigned int old_status; | 74 | unsigned int old_status; |
75 | }; | 75 | }; |
76 | 76 | ||
77 | static void pl011_stop_tx(struct uart_port *port, unsigned int tty_stop) | 77 | static void pl011_stop_tx(struct uart_port *port) |
78 | { | 78 | { |
79 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 79 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
80 | 80 | ||
@@ -82,7 +82,7 @@ static void pl011_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
82 | writew(uap->im, uap->port.membase + UART011_IMSC); | 82 | writew(uap->im, uap->port.membase + UART011_IMSC); |
83 | } | 83 | } |
84 | 84 | ||
85 | static void pl011_start_tx(struct uart_port *port, unsigned int tty_start) | 85 | static void pl011_start_tx(struct uart_port *port) |
86 | { | 86 | { |
87 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 87 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
88 | 88 | ||
@@ -184,7 +184,7 @@ static void pl011_tx_chars(struct uart_amba_port *uap) | |||
184 | return; | 184 | return; |
185 | } | 185 | } |
186 | if (uart_circ_empty(xmit) || uart_tx_stopped(&uap->port)) { | 186 | if (uart_circ_empty(xmit) || uart_tx_stopped(&uap->port)) { |
187 | pl011_stop_tx(&uap->port, 0); | 187 | pl011_stop_tx(&uap->port); |
188 | return; | 188 | return; |
189 | } | 189 | } |
190 | 190 | ||
@@ -201,7 +201,7 @@ static void pl011_tx_chars(struct uart_amba_port *uap) | |||
201 | uart_write_wakeup(&uap->port); | 201 | uart_write_wakeup(&uap->port); |
202 | 202 | ||
203 | if (uart_circ_empty(xmit)) | 203 | if (uart_circ_empty(xmit)) |
204 | pl011_stop_tx(&uap->port, 0); | 204 | pl011_stop_tx(&uap->port); |
205 | } | 205 | } |
206 | 206 | ||
207 | static void pl011_modem_status(struct uart_amba_port *uap) | 207 | static void pl011_modem_status(struct uart_amba_port *uap) |
diff --git a/drivers/serial/au1x00_uart.c b/drivers/serial/au1x00_uart.c index 6104aeef1243..a274ebf256a1 100644 --- a/drivers/serial/au1x00_uart.c +++ b/drivers/serial/au1x00_uart.c | |||
@@ -200,7 +200,7 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags) | |||
200 | DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name); | 200 | DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name); |
201 | } | 201 | } |
202 | 202 | ||
203 | static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop) | 203 | static void serial8250_stop_tx(struct uart_port *port) |
204 | { | 204 | { |
205 | struct uart_8250_port *up = (struct uart_8250_port *)port; | 205 | struct uart_8250_port *up = (struct uart_8250_port *)port; |
206 | 206 | ||
@@ -210,7 +210,7 @@ static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
210 | } | 210 | } |
211 | } | 211 | } |
212 | 212 | ||
213 | static void serial8250_start_tx(struct uart_port *port, unsigned int tty_start) | 213 | static void serial8250_start_tx(struct uart_port *port) |
214 | { | 214 | { |
215 | struct uart_8250_port *up = (struct uart_8250_port *)port; | 215 | struct uart_8250_port *up = (struct uart_8250_port *)port; |
216 | 216 | ||
@@ -337,7 +337,7 @@ static _INLINE_ void transmit_chars(struct uart_8250_port *up) | |||
337 | return; | 337 | return; |
338 | } | 338 | } |
339 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { | 339 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { |
340 | serial8250_stop_tx(&up->port, 0); | 340 | serial8250_stop_tx(&up->port); |
341 | return; | 341 | return; |
342 | } | 342 | } |
343 | 343 | ||
@@ -356,7 +356,7 @@ static _INLINE_ void transmit_chars(struct uart_8250_port *up) | |||
356 | DEBUG_INTR("THRE..."); | 356 | DEBUG_INTR("THRE..."); |
357 | 357 | ||
358 | if (uart_circ_empty(xmit)) | 358 | if (uart_circ_empty(xmit)) |
359 | serial8250_stop_tx(&up->port, 0); | 359 | serial8250_stop_tx(&up->port); |
360 | } | 360 | } |
361 | 361 | ||
362 | static _INLINE_ void check_modem_status(struct uart_8250_port *up) | 362 | static _INLINE_ void check_modem_status(struct uart_8250_port *up) |
diff --git a/drivers/serial/clps711x.c b/drivers/serial/clps711x.c index e92522b33c48..d822896b488c 100644 --- a/drivers/serial/clps711x.c +++ b/drivers/serial/clps711x.c | |||
@@ -69,8 +69,7 @@ | |||
69 | 69 | ||
70 | #define tx_enabled(port) ((port)->unused[0]) | 70 | #define tx_enabled(port) ((port)->unused[0]) |
71 | 71 | ||
72 | static void | 72 | static void clps711xuart_stop_tx(struct uart_port *port) |
73 | clps711xuart_stop_tx(struct uart_port *port, unsigned int tty_stop) | ||
74 | { | 73 | { |
75 | if (tx_enabled(port)) { | 74 | if (tx_enabled(port)) { |
76 | disable_irq(TX_IRQ(port)); | 75 | disable_irq(TX_IRQ(port)); |
@@ -78,8 +77,7 @@ clps711xuart_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
78 | } | 77 | } |
79 | } | 78 | } |
80 | 79 | ||
81 | static void | 80 | static void clps711xuart_start_tx(struct uart_port *port) |
82 | clps711xuart_start_tx(struct uart_port *port, unsigned int tty_start) | ||
83 | { | 81 | { |
84 | if (!tx_enabled(port)) { | 82 | if (!tx_enabled(port)) { |
85 | enable_irq(TX_IRQ(port)); | 83 | enable_irq(TX_IRQ(port)); |
@@ -165,7 +163,7 @@ static irqreturn_t clps711xuart_int_tx(int irq, void *dev_id, struct pt_regs *re | |||
165 | return IRQ_HANDLED; | 163 | return IRQ_HANDLED; |
166 | } | 164 | } |
167 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 165 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
168 | clps711xuart_stop_tx(port, 0); | 166 | clps711xuart_stop_tx(port); |
169 | return IRQ_HANDLED; | 167 | return IRQ_HANDLED; |
170 | } | 168 | } |
171 | 169 | ||
@@ -182,7 +180,7 @@ static irqreturn_t clps711xuart_int_tx(int irq, void *dev_id, struct pt_regs *re | |||
182 | uart_write_wakeup(port); | 180 | uart_write_wakeup(port); |
183 | 181 | ||
184 | if (uart_circ_empty(xmit)) | 182 | if (uart_circ_empty(xmit)) |
185 | clps711xuart_stop_tx(port, 0); | 183 | clps711xuart_stop_tx(port); |
186 | 184 | ||
187 | return IRQ_HANDLED; | 185 | return IRQ_HANDLED; |
188 | } | 186 | } |
diff --git a/drivers/serial/cpm_uart/cpm_uart.h b/drivers/serial/cpm_uart/cpm_uart.h index 5f6187baad86..73c8a088c160 100644 --- a/drivers/serial/cpm_uart/cpm_uart.h +++ b/drivers/serial/cpm_uart/cpm_uart.h | |||
@@ -40,13 +40,15 @@ | |||
40 | #define TX_NUM_FIFO 4 | 40 | #define TX_NUM_FIFO 4 |
41 | #define TX_BUF_SIZE 32 | 41 | #define TX_BUF_SIZE 32 |
42 | 42 | ||
43 | #define SCC_WAIT_CLOSING 100 | ||
44 | |||
43 | struct uart_cpm_port { | 45 | struct uart_cpm_port { |
44 | struct uart_port port; | 46 | struct uart_port port; |
45 | u16 rx_nrfifos; | 47 | u16 rx_nrfifos; |
46 | u16 rx_fifosize; | 48 | u16 rx_fifosize; |
47 | u16 tx_nrfifos; | 49 | u16 tx_nrfifos; |
48 | u16 tx_fifosize; | 50 | u16 tx_fifosize; |
49 | smc_t *smcp; | 51 | smc_t *smcp; |
50 | smc_uart_t *smcup; | 52 | smc_uart_t *smcup; |
51 | scc_t *sccp; | 53 | scc_t *sccp; |
52 | scc_uart_t *sccup; | 54 | scc_uart_t *sccup; |
@@ -67,6 +69,8 @@ struct uart_cpm_port { | |||
67 | int bits; | 69 | int bits; |
68 | /* Keep track of 'odd' SMC2 wirings */ | 70 | /* Keep track of 'odd' SMC2 wirings */ |
69 | int is_portb; | 71 | int is_portb; |
72 | /* wait on close if needed */ | ||
73 | int wait_closing; | ||
70 | }; | 74 | }; |
71 | 75 | ||
72 | extern int cpm_uart_port_map[UART_NR]; | 76 | extern int cpm_uart_port_map[UART_NR]; |
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index 29db677d4284..282b32351d8e 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
@@ -9,9 +9,10 @@ | |||
9 | * | 9 | * |
10 | * Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2) | 10 | * Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2) |
11 | * Pantelis Antoniou (panto@intracom.gr) (CPM1) | 11 | * Pantelis Antoniou (panto@intracom.gr) (CPM1) |
12 | * | 12 | * |
13 | * Copyright (C) 2004 Freescale Semiconductor, Inc. | 13 | * Copyright (C) 2004 Freescale Semiconductor, Inc. |
14 | * (C) 2004 Intracom, S.A. | 14 | * (C) 2004 Intracom, S.A. |
15 | * (C) 2005 MontaVista Software, Inc. by Vitaly Bordug <vbordug@ru.mvista.com> | ||
15 | * | 16 | * |
16 | * This program is free software; you can redistribute it and/or modify | 17 | * This program is free software; you can redistribute it and/or modify |
17 | * it under the terms of the GNU General Public License as published by | 18 | * it under the terms of the GNU General Public License as published by |
@@ -70,8 +71,22 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo); | |||
70 | 71 | ||
71 | /**************************************************************/ | 72 | /**************************************************************/ |
72 | 73 | ||
74 | static inline unsigned long cpu2cpm_addr(void *addr) | ||
75 | { | ||
76 | if ((unsigned long)addr >= CPM_ADDR) | ||
77 | return (unsigned long)addr; | ||
78 | return virt_to_bus(addr); | ||
79 | } | ||
80 | |||
81 | static inline void *cpm2cpu_addr(unsigned long addr) | ||
82 | { | ||
83 | if (addr >= CPM_ADDR) | ||
84 | return (void *)addr; | ||
85 | return bus_to_virt(addr); | ||
86 | } | ||
87 | |||
73 | /* | 88 | /* |
74 | * Check, if transmit buffers are processed | 89 | * Check, if transmit buffers are processed |
75 | */ | 90 | */ |
76 | static unsigned int cpm_uart_tx_empty(struct uart_port *port) | 91 | static unsigned int cpm_uart_tx_empty(struct uart_port *port) |
77 | { | 92 | { |
@@ -109,7 +124,7 @@ static unsigned int cpm_uart_get_mctrl(struct uart_port *port) | |||
109 | /* | 124 | /* |
110 | * Stop transmitter | 125 | * Stop transmitter |
111 | */ | 126 | */ |
112 | static void cpm_uart_stop_tx(struct uart_port *port, unsigned int tty_stop) | 127 | static void cpm_uart_stop_tx(struct uart_port *port) |
113 | { | 128 | { |
114 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; | 129 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; |
115 | volatile smc_t *smcp = pinfo->smcp; | 130 | volatile smc_t *smcp = pinfo->smcp; |
@@ -126,7 +141,7 @@ static void cpm_uart_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
126 | /* | 141 | /* |
127 | * Start transmitter | 142 | * Start transmitter |
128 | */ | 143 | */ |
129 | static void cpm_uart_start_tx(struct uart_port *port, unsigned int tty_start) | 144 | static void cpm_uart_start_tx(struct uart_port *port) |
130 | { | 145 | { |
131 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; | 146 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; |
132 | volatile smc_t *smcp = pinfo->smcp; | 147 | volatile smc_t *smcp = pinfo->smcp; |
@@ -143,15 +158,18 @@ static void cpm_uart_start_tx(struct uart_port *port, unsigned int tty_start) | |||
143 | } | 158 | } |
144 | 159 | ||
145 | if (cpm_uart_tx_pump(port) != 0) { | 160 | if (cpm_uart_tx_pump(port) != 0) { |
146 | if (IS_SMC(pinfo)) | 161 | if (IS_SMC(pinfo)) { |
147 | smcp->smc_smcm |= SMCM_TX; | 162 | smcp->smc_smcm |= SMCM_TX; |
148 | else | 163 | smcp->smc_smcmr |= SMCMR_TEN; |
164 | } else { | ||
149 | sccp->scc_sccm |= UART_SCCM_TX; | 165 | sccp->scc_sccm |= UART_SCCM_TX; |
166 | pinfo->sccp->scc_gsmrl |= SCC_GSMRL_ENT; | ||
167 | } | ||
150 | } | 168 | } |
151 | } | 169 | } |
152 | 170 | ||
153 | /* | 171 | /* |
154 | * Stop receiver | 172 | * Stop receiver |
155 | */ | 173 | */ |
156 | static void cpm_uart_stop_rx(struct uart_port *port) | 174 | static void cpm_uart_stop_rx(struct uart_port *port) |
157 | { | 175 | { |
@@ -176,7 +194,7 @@ static void cpm_uart_enable_ms(struct uart_port *port) | |||
176 | } | 194 | } |
177 | 195 | ||
178 | /* | 196 | /* |
179 | * Generate a break. | 197 | * Generate a break. |
180 | */ | 198 | */ |
181 | static void cpm_uart_break_ctl(struct uart_port *port, int break_state) | 199 | static void cpm_uart_break_ctl(struct uart_port *port, int break_state) |
182 | { | 200 | { |
@@ -231,7 +249,7 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs) | |||
231 | /* get number of characters, and check spce in flip-buffer */ | 249 | /* get number of characters, and check spce in flip-buffer */ |
232 | i = bdp->cbd_datlen; | 250 | i = bdp->cbd_datlen; |
233 | 251 | ||
234 | /* If we have not enough room in tty flip buffer, then we try | 252 | /* If we have not enough room in tty flip buffer, then we try |
235 | * later, which will be the next rx-interrupt or a timeout | 253 | * later, which will be the next rx-interrupt or a timeout |
236 | */ | 254 | */ |
237 | if ((tty->flip.count + i) >= TTY_FLIPBUF_SIZE) { | 255 | if ((tty->flip.count + i) >= TTY_FLIPBUF_SIZE) { |
@@ -243,7 +261,7 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs) | |||
243 | } | 261 | } |
244 | 262 | ||
245 | /* get pointer */ | 263 | /* get pointer */ |
246 | cp = (unsigned char *)bus_to_virt(bdp->cbd_bufaddr); | 264 | cp = cpm2cpu_addr(bdp->cbd_bufaddr); |
247 | 265 | ||
248 | /* loop through the buffer */ | 266 | /* loop through the buffer */ |
249 | while (i-- > 0) { | 267 | while (i-- > 0) { |
@@ -265,13 +283,14 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs) | |||
265 | } /* End while (i--) */ | 283 | } /* End while (i--) */ |
266 | 284 | ||
267 | /* This BD is ready to be used again. Clear status. get next */ | 285 | /* This BD is ready to be used again. Clear status. get next */ |
268 | bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV); | 286 | bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV | BD_SC_ID); |
269 | bdp->cbd_sc |= BD_SC_EMPTY; | 287 | bdp->cbd_sc |= BD_SC_EMPTY; |
270 | 288 | ||
271 | if (bdp->cbd_sc & BD_SC_WRAP) | 289 | if (bdp->cbd_sc & BD_SC_WRAP) |
272 | bdp = pinfo->rx_bd_base; | 290 | bdp = pinfo->rx_bd_base; |
273 | else | 291 | else |
274 | bdp++; | 292 | bdp++; |
293 | |||
275 | } /* End for (;;) */ | 294 | } /* End for (;;) */ |
276 | 295 | ||
277 | /* Write back buffer pointer */ | 296 | /* Write back buffer pointer */ |
@@ -336,22 +355,22 @@ static irqreturn_t cpm_uart_int(int irq, void *data, struct pt_regs *regs) | |||
336 | 355 | ||
337 | if (IS_SMC(pinfo)) { | 356 | if (IS_SMC(pinfo)) { |
338 | events = smcp->smc_smce; | 357 | events = smcp->smc_smce; |
358 | smcp->smc_smce = events; | ||
339 | if (events & SMCM_BRKE) | 359 | if (events & SMCM_BRKE) |
340 | uart_handle_break(port); | 360 | uart_handle_break(port); |
341 | if (events & SMCM_RX) | 361 | if (events & SMCM_RX) |
342 | cpm_uart_int_rx(port, regs); | 362 | cpm_uart_int_rx(port, regs); |
343 | if (events & SMCM_TX) | 363 | if (events & SMCM_TX) |
344 | cpm_uart_int_tx(port, regs); | 364 | cpm_uart_int_tx(port, regs); |
345 | smcp->smc_smce = events; | ||
346 | } else { | 365 | } else { |
347 | events = sccp->scc_scce; | 366 | events = sccp->scc_scce; |
367 | sccp->scc_scce = events; | ||
348 | if (events & UART_SCCM_BRKE) | 368 | if (events & UART_SCCM_BRKE) |
349 | uart_handle_break(port); | 369 | uart_handle_break(port); |
350 | if (events & UART_SCCM_RX) | 370 | if (events & UART_SCCM_RX) |
351 | cpm_uart_int_rx(port, regs); | 371 | cpm_uart_int_rx(port, regs); |
352 | if (events & UART_SCCM_TX) | 372 | if (events & UART_SCCM_TX) |
353 | cpm_uart_int_tx(port, regs); | 373 | cpm_uart_int_tx(port, regs); |
354 | sccp->scc_scce = events; | ||
355 | } | 374 | } |
356 | return (events) ? IRQ_HANDLED : IRQ_NONE; | 375 | return (events) ? IRQ_HANDLED : IRQ_NONE; |
357 | } | 376 | } |
@@ -360,6 +379,7 @@ static int cpm_uart_startup(struct uart_port *port) | |||
360 | { | 379 | { |
361 | int retval; | 380 | int retval; |
362 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; | 381 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; |
382 | int line = pinfo - cpm_uart_ports; | ||
363 | 383 | ||
364 | pr_debug("CPM uart[%d]:startup\n", port->line); | 384 | pr_debug("CPM uart[%d]:startup\n", port->line); |
365 | 385 | ||
@@ -376,9 +396,19 @@ static int cpm_uart_startup(struct uart_port *port) | |||
376 | pinfo->sccp->scc_sccm |= UART_SCCM_RX; | 396 | pinfo->sccp->scc_sccm |= UART_SCCM_RX; |
377 | } | 397 | } |
378 | 398 | ||
399 | if (!(pinfo->flags & FLAG_CONSOLE)) | ||
400 | cpm_line_cr_cmd(line,CPM_CR_INIT_TRX); | ||
379 | return 0; | 401 | return 0; |
380 | } | 402 | } |
381 | 403 | ||
404 | inline void cpm_uart_wait_until_send(struct uart_cpm_port *pinfo) | ||
405 | { | ||
406 | unsigned long target_jiffies = jiffies + pinfo->wait_closing; | ||
407 | |||
408 | while (!time_after(jiffies, target_jiffies)) | ||
409 | schedule(); | ||
410 | } | ||
411 | |||
382 | /* | 412 | /* |
383 | * Shutdown the uart | 413 | * Shutdown the uart |
384 | */ | 414 | */ |
@@ -394,6 +424,12 @@ static void cpm_uart_shutdown(struct uart_port *port) | |||
394 | 424 | ||
395 | /* If the port is not the console, disable Rx and Tx. */ | 425 | /* If the port is not the console, disable Rx and Tx. */ |
396 | if (!(pinfo->flags & FLAG_CONSOLE)) { | 426 | if (!(pinfo->flags & FLAG_CONSOLE)) { |
427 | /* Wait for all the BDs marked sent */ | ||
428 | while(!cpm_uart_tx_empty(port)) | ||
429 | schedule_timeout(2); | ||
430 | if(pinfo->wait_closing) | ||
431 | cpm_uart_wait_until_send(pinfo); | ||
432 | |||
397 | /* Stop uarts */ | 433 | /* Stop uarts */ |
398 | if (IS_SMC(pinfo)) { | 434 | if (IS_SMC(pinfo)) { |
399 | volatile smc_t *smcp = pinfo->smcp; | 435 | volatile smc_t *smcp = pinfo->smcp; |
@@ -502,7 +538,7 @@ static void cpm_uart_set_termios(struct uart_port *port, | |||
502 | */ | 538 | */ |
503 | if ((termios->c_cflag & CREAD) == 0) | 539 | if ((termios->c_cflag & CREAD) == 0) |
504 | port->read_status_mask &= ~BD_SC_EMPTY; | 540 | port->read_status_mask &= ~BD_SC_EMPTY; |
505 | 541 | ||
506 | spin_lock_irqsave(&port->lock, flags); | 542 | spin_lock_irqsave(&port->lock, flags); |
507 | 543 | ||
508 | /* Start bit has not been added (so don't, because we would just | 544 | /* Start bit has not been added (so don't, because we would just |
@@ -569,7 +605,8 @@ static int cpm_uart_tx_pump(struct uart_port *port) | |||
569 | /* Pick next descriptor and fill from buffer */ | 605 | /* Pick next descriptor and fill from buffer */ |
570 | bdp = pinfo->tx_cur; | 606 | bdp = pinfo->tx_cur; |
571 | 607 | ||
572 | p = bus_to_virt(bdp->cbd_bufaddr); | 608 | p = cpm2cpu_addr(bdp->cbd_bufaddr); |
609 | |||
573 | *p++ = xmit->buf[xmit->tail]; | 610 | *p++ = xmit->buf[xmit->tail]; |
574 | bdp->cbd_datlen = 1; | 611 | bdp->cbd_datlen = 1; |
575 | bdp->cbd_sc |= BD_SC_READY; | 612 | bdp->cbd_sc |= BD_SC_READY; |
@@ -586,7 +623,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) | |||
586 | } | 623 | } |
587 | 624 | ||
588 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 625 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
589 | cpm_uart_stop_tx(port, 0); | 626 | cpm_uart_stop_tx(port); |
590 | return 0; | 627 | return 0; |
591 | } | 628 | } |
592 | 629 | ||
@@ -595,7 +632,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) | |||
595 | 632 | ||
596 | while (!(bdp->cbd_sc & BD_SC_READY) && (xmit->tail != xmit->head)) { | 633 | while (!(bdp->cbd_sc & BD_SC_READY) && (xmit->tail != xmit->head)) { |
597 | count = 0; | 634 | count = 0; |
598 | p = bus_to_virt(bdp->cbd_bufaddr); | 635 | p = cpm2cpu_addr(bdp->cbd_bufaddr); |
599 | while (count < pinfo->tx_fifosize) { | 636 | while (count < pinfo->tx_fifosize) { |
600 | *p++ = xmit->buf[xmit->tail]; | 637 | *p++ = xmit->buf[xmit->tail]; |
601 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 638 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
@@ -606,6 +643,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) | |||
606 | } | 643 | } |
607 | bdp->cbd_datlen = count; | 644 | bdp->cbd_datlen = count; |
608 | bdp->cbd_sc |= BD_SC_READY; | 645 | bdp->cbd_sc |= BD_SC_READY; |
646 | __asm__("eieio"); | ||
609 | /* Get next BD. */ | 647 | /* Get next BD. */ |
610 | if (bdp->cbd_sc & BD_SC_WRAP) | 648 | if (bdp->cbd_sc & BD_SC_WRAP) |
611 | bdp = pinfo->tx_bd_base; | 649 | bdp = pinfo->tx_bd_base; |
@@ -618,7 +656,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) | |||
618 | uart_write_wakeup(port); | 656 | uart_write_wakeup(port); |
619 | 657 | ||
620 | if (uart_circ_empty(xmit)) { | 658 | if (uart_circ_empty(xmit)) { |
621 | cpm_uart_stop_tx(port, 0); | 659 | cpm_uart_stop_tx(port); |
622 | return 0; | 660 | return 0; |
623 | } | 661 | } |
624 | 662 | ||
@@ -643,12 +681,12 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo) | |||
643 | mem_addr = pinfo->mem_addr; | 681 | mem_addr = pinfo->mem_addr; |
644 | bdp = pinfo->rx_cur = pinfo->rx_bd_base; | 682 | bdp = pinfo->rx_cur = pinfo->rx_bd_base; |
645 | for (i = 0; i < (pinfo->rx_nrfifos - 1); i++, bdp++) { | 683 | for (i = 0; i < (pinfo->rx_nrfifos - 1); i++, bdp++) { |
646 | bdp->cbd_bufaddr = virt_to_bus(mem_addr); | 684 | bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr); |
647 | bdp->cbd_sc = BD_SC_EMPTY | BD_SC_INTRPT; | 685 | bdp->cbd_sc = BD_SC_EMPTY | BD_SC_INTRPT; |
648 | mem_addr += pinfo->rx_fifosize; | 686 | mem_addr += pinfo->rx_fifosize; |
649 | } | 687 | } |
650 | 688 | ||
651 | bdp->cbd_bufaddr = virt_to_bus(mem_addr); | 689 | bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr); |
652 | bdp->cbd_sc = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT; | 690 | bdp->cbd_sc = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT; |
653 | 691 | ||
654 | /* Set the physical address of the host memory | 692 | /* Set the physical address of the host memory |
@@ -658,12 +696,12 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo) | |||
658 | mem_addr = pinfo->mem_addr + L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize); | 696 | mem_addr = pinfo->mem_addr + L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize); |
659 | bdp = pinfo->tx_cur = pinfo->tx_bd_base; | 697 | bdp = pinfo->tx_cur = pinfo->tx_bd_base; |
660 | for (i = 0; i < (pinfo->tx_nrfifos - 1); i++, bdp++) { | 698 | for (i = 0; i < (pinfo->tx_nrfifos - 1); i++, bdp++) { |
661 | bdp->cbd_bufaddr = virt_to_bus(mem_addr); | 699 | bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr); |
662 | bdp->cbd_sc = BD_SC_INTRPT; | 700 | bdp->cbd_sc = BD_SC_INTRPT; |
663 | mem_addr += pinfo->tx_fifosize; | 701 | mem_addr += pinfo->tx_fifosize; |
664 | } | 702 | } |
665 | 703 | ||
666 | bdp->cbd_bufaddr = virt_to_bus(mem_addr); | 704 | bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr); |
667 | bdp->cbd_sc = BD_SC_WRAP | BD_SC_INTRPT; | 705 | bdp->cbd_sc = BD_SC_WRAP | BD_SC_INTRPT; |
668 | } | 706 | } |
669 | 707 | ||
@@ -763,6 +801,8 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) | |||
763 | /* Using idle charater time requires some additional tuning. */ | 801 | /* Using idle charater time requires some additional tuning. */ |
764 | up->smc_mrblr = pinfo->rx_fifosize; | 802 | up->smc_mrblr = pinfo->rx_fifosize; |
765 | up->smc_maxidl = pinfo->rx_fifosize; | 803 | up->smc_maxidl = pinfo->rx_fifosize; |
804 | up->smc_brklen = 0; | ||
805 | up->smc_brkec = 0; | ||
766 | up->smc_brkcr = 1; | 806 | up->smc_brkcr = 1; |
767 | 807 | ||
768 | cpm_line_cr_cmd(line, CPM_CR_INIT_TRX); | 808 | cpm_line_cr_cmd(line, CPM_CR_INIT_TRX); |
@@ -796,7 +836,7 @@ static int cpm_uart_request_port(struct uart_port *port) | |||
796 | /* | 836 | /* |
797 | * Setup any port IO, connect any baud rate generators, | 837 | * Setup any port IO, connect any baud rate generators, |
798 | * etc. This is expected to be handled by board | 838 | * etc. This is expected to be handled by board |
799 | * dependant code | 839 | * dependant code |
800 | */ | 840 | */ |
801 | if (pinfo->set_lineif) | 841 | if (pinfo->set_lineif) |
802 | pinfo->set_lineif(pinfo); | 842 | pinfo->set_lineif(pinfo); |
@@ -815,6 +855,10 @@ static int cpm_uart_request_port(struct uart_port *port) | |||
815 | return ret; | 855 | return ret; |
816 | 856 | ||
817 | cpm_uart_initbd(pinfo); | 857 | cpm_uart_initbd(pinfo); |
858 | if (IS_SMC(pinfo)) | ||
859 | cpm_uart_init_smc(pinfo); | ||
860 | else | ||
861 | cpm_uart_init_scc(pinfo); | ||
818 | 862 | ||
819 | return 0; | 863 | return 0; |
820 | } | 864 | } |
@@ -869,7 +913,7 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { | |||
869 | .flags = FLAG_SMC, | 913 | .flags = FLAG_SMC, |
870 | .tx_nrfifos = TX_NUM_FIFO, | 914 | .tx_nrfifos = TX_NUM_FIFO, |
871 | .tx_fifosize = TX_BUF_SIZE, | 915 | .tx_fifosize = TX_BUF_SIZE, |
872 | .rx_nrfifos = RX_NUM_FIFO, | 916 | .rx_nrfifos = RX_NUM_FIFO, |
873 | .rx_fifosize = RX_BUF_SIZE, | 917 | .rx_fifosize = RX_BUF_SIZE, |
874 | .set_lineif = smc1_lineif, | 918 | .set_lineif = smc1_lineif, |
875 | }, | 919 | }, |
@@ -883,7 +927,7 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { | |||
883 | .flags = FLAG_SMC, | 927 | .flags = FLAG_SMC, |
884 | .tx_nrfifos = TX_NUM_FIFO, | 928 | .tx_nrfifos = TX_NUM_FIFO, |
885 | .tx_fifosize = TX_BUF_SIZE, | 929 | .tx_fifosize = TX_BUF_SIZE, |
886 | .rx_nrfifos = RX_NUM_FIFO, | 930 | .rx_nrfifos = RX_NUM_FIFO, |
887 | .rx_fifosize = RX_BUF_SIZE, | 931 | .rx_fifosize = RX_BUF_SIZE, |
888 | .set_lineif = smc2_lineif, | 932 | .set_lineif = smc2_lineif, |
889 | #ifdef CONFIG_SERIAL_CPM_ALT_SMC2 | 933 | #ifdef CONFIG_SERIAL_CPM_ALT_SMC2 |
@@ -899,9 +943,10 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { | |||
899 | }, | 943 | }, |
900 | .tx_nrfifos = TX_NUM_FIFO, | 944 | .tx_nrfifos = TX_NUM_FIFO, |
901 | .tx_fifosize = TX_BUF_SIZE, | 945 | .tx_fifosize = TX_BUF_SIZE, |
902 | .rx_nrfifos = RX_NUM_FIFO, | 946 | .rx_nrfifos = RX_NUM_FIFO, |
903 | .rx_fifosize = RX_BUF_SIZE, | 947 | .rx_fifosize = RX_BUF_SIZE, |
904 | .set_lineif = scc1_lineif, | 948 | .set_lineif = scc1_lineif, |
949 | .wait_closing = SCC_WAIT_CLOSING, | ||
905 | }, | 950 | }, |
906 | [UART_SCC2] = { | 951 | [UART_SCC2] = { |
907 | .port = { | 952 | .port = { |
@@ -912,9 +957,10 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { | |||
912 | }, | 957 | }, |
913 | .tx_nrfifos = TX_NUM_FIFO, | 958 | .tx_nrfifos = TX_NUM_FIFO, |
914 | .tx_fifosize = TX_BUF_SIZE, | 959 | .tx_fifosize = TX_BUF_SIZE, |
915 | .rx_nrfifos = RX_NUM_FIFO, | 960 | .rx_nrfifos = RX_NUM_FIFO, |
916 | .rx_fifosize = RX_BUF_SIZE, | 961 | .rx_fifosize = RX_BUF_SIZE, |
917 | .set_lineif = scc2_lineif, | 962 | .set_lineif = scc2_lineif, |
963 | .wait_closing = SCC_WAIT_CLOSING, | ||
918 | }, | 964 | }, |
919 | [UART_SCC3] = { | 965 | [UART_SCC3] = { |
920 | .port = { | 966 | .port = { |
@@ -925,9 +971,10 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { | |||
925 | }, | 971 | }, |
926 | .tx_nrfifos = TX_NUM_FIFO, | 972 | .tx_nrfifos = TX_NUM_FIFO, |
927 | .tx_fifosize = TX_BUF_SIZE, | 973 | .tx_fifosize = TX_BUF_SIZE, |
928 | .rx_nrfifos = RX_NUM_FIFO, | 974 | .rx_nrfifos = RX_NUM_FIFO, |
929 | .rx_fifosize = RX_BUF_SIZE, | 975 | .rx_fifosize = RX_BUF_SIZE, |
930 | .set_lineif = scc3_lineif, | 976 | .set_lineif = scc3_lineif, |
977 | .wait_closing = SCC_WAIT_CLOSING, | ||
931 | }, | 978 | }, |
932 | [UART_SCC4] = { | 979 | [UART_SCC4] = { |
933 | .port = { | 980 | .port = { |
@@ -938,9 +985,10 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { | |||
938 | }, | 985 | }, |
939 | .tx_nrfifos = TX_NUM_FIFO, | 986 | .tx_nrfifos = TX_NUM_FIFO, |
940 | .tx_fifosize = TX_BUF_SIZE, | 987 | .tx_fifosize = TX_BUF_SIZE, |
941 | .rx_nrfifos = RX_NUM_FIFO, | 988 | .rx_nrfifos = RX_NUM_FIFO, |
942 | .rx_fifosize = RX_BUF_SIZE, | 989 | .rx_fifosize = RX_BUF_SIZE, |
943 | .set_lineif = scc4_lineif, | 990 | .set_lineif = scc4_lineif, |
991 | .wait_closing = SCC_WAIT_CLOSING, | ||
944 | }, | 992 | }, |
945 | }; | 993 | }; |
946 | 994 | ||
@@ -983,11 +1031,8 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
983 | * If the buffer address is in the CPM DPRAM, don't | 1031 | * If the buffer address is in the CPM DPRAM, don't |
984 | * convert it. | 1032 | * convert it. |
985 | */ | 1033 | */ |
986 | if ((uint) (bdp->cbd_bufaddr) > (uint) CPM_ADDR) | 1034 | cp = cpm2cpu_addr(bdp->cbd_bufaddr); |
987 | cp = (unsigned char *) (bdp->cbd_bufaddr); | 1035 | |
988 | else | ||
989 | cp = bus_to_virt(bdp->cbd_bufaddr); | ||
990 | |||
991 | *cp = *s; | 1036 | *cp = *s; |
992 | 1037 | ||
993 | bdp->cbd_datlen = 1; | 1038 | bdp->cbd_datlen = 1; |
@@ -1003,10 +1048,7 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
1003 | while ((bdp->cbd_sc & BD_SC_READY) != 0) | 1048 | while ((bdp->cbd_sc & BD_SC_READY) != 0) |
1004 | ; | 1049 | ; |
1005 | 1050 | ||
1006 | if ((uint) (bdp->cbd_bufaddr) > (uint) CPM_ADDR) | 1051 | cp = cpm2cpu_addr(bdp->cbd_bufaddr); |
1007 | cp = (unsigned char *) (bdp->cbd_bufaddr); | ||
1008 | else | ||
1009 | cp = bus_to_virt(bdp->cbd_bufaddr); | ||
1010 | 1052 | ||
1011 | *cp = 13; | 1053 | *cp = 13; |
1012 | bdp->cbd_datlen = 1; | 1054 | bdp->cbd_datlen = 1; |
@@ -1045,7 +1087,7 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) | |||
1045 | port = | 1087 | port = |
1046 | (struct uart_port *)&cpm_uart_ports[cpm_uart_port_map[co->index]]; | 1088 | (struct uart_port *)&cpm_uart_ports[cpm_uart_port_map[co->index]]; |
1047 | pinfo = (struct uart_cpm_port *)port; | 1089 | pinfo = (struct uart_cpm_port *)port; |
1048 | 1090 | ||
1049 | pinfo->flags |= FLAG_CONSOLE; | 1091 | pinfo->flags |= FLAG_CONSOLE; |
1050 | 1092 | ||
1051 | if (options) { | 1093 | if (options) { |
@@ -1062,7 +1104,7 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) | |||
1062 | /* | 1104 | /* |
1063 | * Setup any port IO, connect any baud rate generators, | 1105 | * Setup any port IO, connect any baud rate generators, |
1064 | * etc. This is expected to be handled by board | 1106 | * etc. This is expected to be handled by board |
1065 | * dependant code | 1107 | * dependant code |
1066 | */ | 1108 | */ |
1067 | if (pinfo->set_lineif) | 1109 | if (pinfo->set_lineif) |
1068 | pinfo->set_lineif(pinfo); | 1110 | pinfo->set_lineif(pinfo); |
@@ -1092,14 +1134,14 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) | |||
1092 | return 0; | 1134 | return 0; |
1093 | } | 1135 | } |
1094 | 1136 | ||
1095 | extern struct uart_driver cpm_reg; | 1137 | static struct uart_driver cpm_reg; |
1096 | static struct console cpm_scc_uart_console = { | 1138 | static struct console cpm_scc_uart_console = { |
1097 | .name "ttyCPM", | 1139 | .name = "ttyCPM", |
1098 | .write cpm_uart_console_write, | 1140 | .write = cpm_uart_console_write, |
1099 | .device uart_console_device, | 1141 | .device = uart_console_device, |
1100 | .setup cpm_uart_console_setup, | 1142 | .setup = cpm_uart_console_setup, |
1101 | .flags CON_PRINTBUFFER, | 1143 | .flags = CON_PRINTBUFFER, |
1102 | .index -1, | 1144 | .index = -1, |
1103 | .data = &cpm_reg, | 1145 | .data = &cpm_reg, |
1104 | }; | 1146 | }; |
1105 | 1147 | ||
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm1.c b/drivers/serial/cpm_uart/cpm_uart_cpm1.c index 8efbd6d1d6a4..4b0786e7eb7f 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2) | 6 | * Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2) |
7 | * Pantelis Antoniou (panto@intracom.gr) (CPM1) | 7 | * Pantelis Antoniou (panto@intracom.gr) (CPM1) |
8 | * | 8 | * |
9 | * Copyright (C) 2004 Freescale Semiconductor, Inc. | 9 | * Copyright (C) 2004 Freescale Semiconductor, Inc. |
10 | * (C) 2004 Intracom, S.A. | 10 | * (C) 2004 Intracom, S.A. |
11 | * | 11 | * |
@@ -82,6 +82,17 @@ void cpm_line_cr_cmd(int line, int cmd) | |||
82 | void smc1_lineif(struct uart_cpm_port *pinfo) | 82 | void smc1_lineif(struct uart_cpm_port *pinfo) |
83 | { | 83 | { |
84 | volatile cpm8xx_t *cp = cpmp; | 84 | volatile cpm8xx_t *cp = cpmp; |
85 | |||
86 | (void)cp; /* fix warning */ | ||
87 | #if defined (CONFIG_MPC885ADS) | ||
88 | /* Enable SMC1 transceivers */ | ||
89 | { | ||
90 | cp->cp_pepar |= 0x000000c0; | ||
91 | cp->cp_pedir &= ~0x000000c0; | ||
92 | cp->cp_peso &= ~0x00000040; | ||
93 | cp->cp_peso |= 0x00000080; | ||
94 | } | ||
95 | #elif defined (CONFIG_MPC86XADS) | ||
85 | unsigned int iobits = 0x000000c0; | 96 | unsigned int iobits = 0x000000c0; |
86 | 97 | ||
87 | if (!pinfo->is_portb) { | 98 | if (!pinfo->is_portb) { |
@@ -93,41 +104,33 @@ void smc1_lineif(struct uart_cpm_port *pinfo) | |||
93 | ((immap_t *)IMAP_ADDR)->im_ioport.iop_padir &= ~iobits; | 104 | ((immap_t *)IMAP_ADDR)->im_ioport.iop_padir &= ~iobits; |
94 | ((immap_t *)IMAP_ADDR)->im_ioport.iop_paodr &= ~iobits; | 105 | ((immap_t *)IMAP_ADDR)->im_ioport.iop_paodr &= ~iobits; |
95 | } | 106 | } |
96 | |||
97 | #ifdef CONFIG_MPC885ADS | ||
98 | /* Enable SMC1 transceivers */ | ||
99 | { | ||
100 | volatile uint __iomem *bcsr1 = ioremap(BCSR1, 4); | ||
101 | uint tmp; | ||
102 | |||
103 | tmp = in_be32(bcsr1); | ||
104 | tmp &= ~BCSR1_RS232EN_1; | ||
105 | out_be32(bcsr1, tmp); | ||
106 | iounmap(bcsr1); | ||
107 | } | ||
108 | #endif | 107 | #endif |
109 | |||
110 | pinfo->brg = 1; | 108 | pinfo->brg = 1; |
111 | } | 109 | } |
112 | 110 | ||
113 | void smc2_lineif(struct uart_cpm_port *pinfo) | 111 | void smc2_lineif(struct uart_cpm_port *pinfo) |
114 | { | 112 | { |
115 | #ifdef CONFIG_MPC885ADS | ||
116 | volatile cpm8xx_t *cp = cpmp; | 113 | volatile cpm8xx_t *cp = cpmp; |
117 | volatile uint __iomem *bcsr1; | ||
118 | uint tmp; | ||
119 | 114 | ||
115 | (void)cp; /* fix warning */ | ||
116 | #if defined (CONFIG_MPC885ADS) | ||
120 | cp->cp_pepar |= 0x00000c00; | 117 | cp->cp_pepar |= 0x00000c00; |
121 | cp->cp_pedir &= ~0x00000c00; | 118 | cp->cp_pedir &= ~0x00000c00; |
122 | cp->cp_peso &= ~0x00000400; | 119 | cp->cp_peso &= ~0x00000400; |
123 | cp->cp_peso |= 0x00000800; | 120 | cp->cp_peso |= 0x00000800; |
121 | #elif defined (CONFIG_MPC86XADS) | ||
122 | unsigned int iobits = 0x00000c00; | ||
123 | |||
124 | if (!pinfo->is_portb) { | ||
125 | cp->cp_pbpar |= iobits; | ||
126 | cp->cp_pbdir &= ~iobits; | ||
127 | cp->cp_pbodr &= ~iobits; | ||
128 | } else { | ||
129 | ((immap_t *)IMAP_ADDR)->im_ioport.iop_papar |= iobits; | ||
130 | ((immap_t *)IMAP_ADDR)->im_ioport.iop_padir &= ~iobits; | ||
131 | ((immap_t *)IMAP_ADDR)->im_ioport.iop_paodr &= ~iobits; | ||
132 | } | ||
124 | 133 | ||
125 | /* Enable SMC2 transceivers */ | ||
126 | bcsr1 = ioremap(BCSR1, 4); | ||
127 | tmp = in_be32(bcsr1); | ||
128 | tmp &= ~BCSR1_RS232EN_2; | ||
129 | out_be32(bcsr1, tmp); | ||
130 | iounmap(bcsr1); | ||
131 | #endif | 134 | #endif |
132 | 135 | ||
133 | pinfo->brg = 2; | 136 | pinfo->brg = 2; |
@@ -158,7 +161,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo) | |||
158 | } | 161 | } |
159 | 162 | ||
160 | /* | 163 | /* |
161 | * Allocate DP-Ram and memory buffers. We need to allocate a transmit and | 164 | * Allocate DP-Ram and memory buffers. We need to allocate a transmit and |
162 | * receive buffer descriptors from dual port ram, and a character | 165 | * receive buffer descriptors from dual port ram, and a character |
163 | * buffer area from host mem. If we are allocating for the console we need | 166 | * buffer area from host mem. If we are allocating for the console we need |
164 | * to do it from bootmem | 167 | * to do it from bootmem |
@@ -185,6 +188,8 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) | |||
185 | memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) + | 188 | memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) + |
186 | L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize); | 189 | L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize); |
187 | if (is_con) { | 190 | if (is_con) { |
191 | /* was hostalloc but changed cause it blows away the */ | ||
192 | /* large tlb mapping when pinning the kernel area */ | ||
188 | mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8)); | 193 | mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8)); |
189 | dma_addr = 0; | 194 | dma_addr = 0; |
190 | } else | 195 | } else |
diff --git a/drivers/serial/dz.c b/drivers/serial/dz.c index 97824eeeafae..e63b9dffc8d7 100644 --- a/drivers/serial/dz.c +++ b/drivers/serial/dz.c | |||
@@ -112,7 +112,7 @@ static inline void dz_out(struct dz_port *dport, unsigned offset, | |||
112 | * ------------------------------------------------------------ | 112 | * ------------------------------------------------------------ |
113 | */ | 113 | */ |
114 | 114 | ||
115 | static void dz_stop_tx(struct uart_port *uport, unsigned int tty_stop) | 115 | static void dz_stop_tx(struct uart_port *uport) |
116 | { | 116 | { |
117 | struct dz_port *dport = (struct dz_port *)uport; | 117 | struct dz_port *dport = (struct dz_port *)uport; |
118 | unsigned short tmp, mask = 1 << dport->port.line; | 118 | unsigned short tmp, mask = 1 << dport->port.line; |
@@ -125,7 +125,7 @@ static void dz_stop_tx(struct uart_port *uport, unsigned int tty_stop) | |||
125 | spin_unlock_irqrestore(&dport->port.lock, flags); | 125 | spin_unlock_irqrestore(&dport->port.lock, flags); |
126 | } | 126 | } |
127 | 127 | ||
128 | static void dz_start_tx(struct uart_port *uport, unsigned int tty_start) | 128 | static void dz_start_tx(struct uart_port *uport) |
129 | { | 129 | { |
130 | struct dz_port *dport = (struct dz_port *)uport; | 130 | struct dz_port *dport = (struct dz_port *)uport; |
131 | unsigned short tmp, mask = 1 << dport->port.line; | 131 | unsigned short tmp, mask = 1 << dport->port.line; |
@@ -290,7 +290,7 @@ static inline void dz_transmit_chars(struct dz_port *dport) | |||
290 | } | 290 | } |
291 | /* if nothing to do or stopped or hardware stopped */ | 291 | /* if nothing to do or stopped or hardware stopped */ |
292 | if (uart_circ_empty(xmit) || uart_tx_stopped(&dport->port)) { | 292 | if (uart_circ_empty(xmit) || uart_tx_stopped(&dport->port)) { |
293 | dz_stop_tx(&dport->port, 0); | 293 | dz_stop_tx(&dport->port); |
294 | return; | 294 | return; |
295 | } | 295 | } |
296 | 296 | ||
@@ -308,7 +308,7 @@ static inline void dz_transmit_chars(struct dz_port *dport) | |||
308 | 308 | ||
309 | /* Are we done */ | 309 | /* Are we done */ |
310 | if (uart_circ_empty(xmit)) | 310 | if (uart_circ_empty(xmit)) |
311 | dz_stop_tx(&dport->port, 0); | 311 | dz_stop_tx(&dport->port); |
312 | } | 312 | } |
313 | 313 | ||
314 | /* | 314 | /* |
@@ -440,7 +440,7 @@ static int dz_startup(struct uart_port *uport) | |||
440 | */ | 440 | */ |
441 | static void dz_shutdown(struct uart_port *uport) | 441 | static void dz_shutdown(struct uart_port *uport) |
442 | { | 442 | { |
443 | dz_stop_tx(uport, 0); | 443 | dz_stop_tx(uport); |
444 | } | 444 | } |
445 | 445 | ||
446 | /* | 446 | /* |
diff --git a/drivers/serial/icom.c b/drivers/serial/icom.c index c112b32764e8..79f8df4d66b7 100644 --- a/drivers/serial/icom.c +++ b/drivers/serial/icom.c | |||
@@ -989,18 +989,16 @@ static unsigned int icom_get_mctrl(struct uart_port *port) | |||
989 | return result; | 989 | return result; |
990 | } | 990 | } |
991 | 991 | ||
992 | static void icom_stop_tx(struct uart_port *port, unsigned int tty_stop) | 992 | static void icom_stop_tx(struct uart_port *port) |
993 | { | 993 | { |
994 | unsigned char cmdReg; | 994 | unsigned char cmdReg; |
995 | 995 | ||
996 | if (tty_stop) { | 996 | trace(ICOM_PORT, "STOP", 0); |
997 | trace(ICOM_PORT, "STOP", 0); | 997 | cmdReg = readb(&ICOM_PORT->dram->CmdReg); |
998 | cmdReg = readb(&ICOM_PORT->dram->CmdReg); | 998 | writeb(cmdReg | CMD_HOLD_XMIT, &ICOM_PORT->dram->CmdReg); |
999 | writeb(cmdReg | CMD_HOLD_XMIT, &ICOM_PORT->dram->CmdReg); | ||
1000 | } | ||
1001 | } | 999 | } |
1002 | 1000 | ||
1003 | static void icom_start_tx(struct uart_port *port, unsigned int tty_start) | 1001 | static void icom_start_tx(struct uart_port *port) |
1004 | { | 1002 | { |
1005 | unsigned char cmdReg; | 1003 | unsigned char cmdReg; |
1006 | 1004 | ||
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 01a8726a3f97..8861bcf84adf 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
@@ -124,7 +124,7 @@ static void imx_timeout(unsigned long data) | |||
124 | /* | 124 | /* |
125 | * interrupts disabled on entry | 125 | * interrupts disabled on entry |
126 | */ | 126 | */ |
127 | static void imx_stop_tx(struct uart_port *port, unsigned int tty_stop) | 127 | static void imx_stop_tx(struct uart_port *port) |
128 | { | 128 | { |
129 | struct imx_port *sport = (struct imx_port *)port; | 129 | struct imx_port *sport = (struct imx_port *)port; |
130 | UCR1((u32)sport->port.membase) &= ~UCR1_TXMPTYEN; | 130 | UCR1((u32)sport->port.membase) &= ~UCR1_TXMPTYEN; |
@@ -165,13 +165,13 @@ static inline void imx_transmit_buffer(struct imx_port *sport) | |||
165 | } while (!(UTS((u32)sport->port.membase) & UTS_TXFULL)); | 165 | } while (!(UTS((u32)sport->port.membase) & UTS_TXFULL)); |
166 | 166 | ||
167 | if (uart_circ_empty(xmit)) | 167 | if (uart_circ_empty(xmit)) |
168 | imx_stop_tx(&sport->port, 0); | 168 | imx_stop_tx(&sport->port); |
169 | } | 169 | } |
170 | 170 | ||
171 | /* | 171 | /* |
172 | * interrupts disabled on entry | 172 | * interrupts disabled on entry |
173 | */ | 173 | */ |
174 | static void imx_start_tx(struct uart_port *port, unsigned int tty_start) | 174 | static void imx_start_tx(struct uart_port *port) |
175 | { | 175 | { |
176 | struct imx_port *sport = (struct imx_port *)port; | 176 | struct imx_port *sport = (struct imx_port *)port; |
177 | 177 | ||
@@ -196,7 +196,7 @@ static irqreturn_t imx_txint(int irq, void *dev_id, struct pt_regs *regs) | |||
196 | } | 196 | } |
197 | 197 | ||
198 | if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) { | 198 | if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) { |
199 | imx_stop_tx(&sport->port, 0); | 199 | imx_stop_tx(&sport->port); |
200 | goto out; | 200 | goto out; |
201 | } | 201 | } |
202 | 202 | ||
diff --git a/drivers/serial/ioc4_serial.c b/drivers/serial/ioc4_serial.c index 793c3a7cbe47..0c5c96a582b3 100644 --- a/drivers/serial/ioc4_serial.c +++ b/drivers/serial/ioc4_serial.c | |||
@@ -2373,10 +2373,9 @@ static unsigned int ic4_tx_empty(struct uart_port *the_port) | |||
2373 | /** | 2373 | /** |
2374 | * ic4_stop_tx - stop the transmitter | 2374 | * ic4_stop_tx - stop the transmitter |
2375 | * @port: Port to operate on | 2375 | * @port: Port to operate on |
2376 | * @tty_stop: Set to 1 if called via uart_stop | ||
2377 | * | 2376 | * |
2378 | */ | 2377 | */ |
2379 | static void ic4_stop_tx(struct uart_port *the_port, unsigned int tty_stop) | 2378 | static void ic4_stop_tx(struct uart_port *the_port) |
2380 | { | 2379 | { |
2381 | } | 2380 | } |
2382 | 2381 | ||
@@ -2471,10 +2470,9 @@ static unsigned int ic4_get_mctrl(struct uart_port *the_port) | |||
2471 | /** | 2470 | /** |
2472 | * ic4_start_tx - Start transmitter, flush any output | 2471 | * ic4_start_tx - Start transmitter, flush any output |
2473 | * @port: Port to operate on | 2472 | * @port: Port to operate on |
2474 | * @tty_stop: Set to 1 if called via uart_start | ||
2475 | * | 2473 | * |
2476 | */ | 2474 | */ |
2477 | static void ic4_start_tx(struct uart_port *the_port, unsigned int tty_stop) | 2475 | static void ic4_start_tx(struct uart_port *the_port) |
2478 | { | 2476 | { |
2479 | struct ioc4_port *port = get_ioc4_port(the_port); | 2477 | struct ioc4_port *port = get_ioc4_port(the_port); |
2480 | unsigned long flags; | 2478 | unsigned long flags; |
diff --git a/drivers/serial/ip22zilog.c b/drivers/serial/ip22zilog.c index ea5bf4d4daa3..ef132349f310 100644 --- a/drivers/serial/ip22zilog.c +++ b/drivers/serial/ip22zilog.c | |||
@@ -592,7 +592,7 @@ static void ip22zilog_set_mctrl(struct uart_port *port, unsigned int mctrl) | |||
592 | } | 592 | } |
593 | 593 | ||
594 | /* The port lock is held and interrupts are disabled. */ | 594 | /* The port lock is held and interrupts are disabled. */ |
595 | static void ip22zilog_stop_tx(struct uart_port *port, unsigned int tty_stop) | 595 | static void ip22zilog_stop_tx(struct uart_port *port) |
596 | { | 596 | { |
597 | struct uart_ip22zilog_port *up = (struct uart_ip22zilog_port *) port; | 597 | struct uart_ip22zilog_port *up = (struct uart_ip22zilog_port *) port; |
598 | 598 | ||
@@ -600,7 +600,7 @@ static void ip22zilog_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
600 | } | 600 | } |
601 | 601 | ||
602 | /* The port lock is held and interrupts are disabled. */ | 602 | /* The port lock is held and interrupts are disabled. */ |
603 | static void ip22zilog_start_tx(struct uart_port *port, unsigned int tty_start) | 603 | static void ip22zilog_start_tx(struct uart_port *port) |
604 | { | 604 | { |
605 | struct uart_ip22zilog_port *up = (struct uart_ip22zilog_port *) port; | 605 | struct uart_ip22zilog_port *up = (struct uart_ip22zilog_port *) port; |
606 | struct zilog_channel *channel = ZILOG_CHANNEL_FROM_PORT(port); | 606 | struct zilog_channel *channel = ZILOG_CHANNEL_FROM_PORT(port); |
diff --git a/drivers/serial/jsm/jsm_tty.c b/drivers/serial/jsm/jsm_tty.c index 98de2258fd06..6fa0d62d6f68 100644 --- a/drivers/serial/jsm/jsm_tty.c +++ b/drivers/serial/jsm/jsm_tty.c | |||
@@ -113,7 +113,7 @@ static void jsm_tty_set_mctrl(struct uart_port *port, unsigned int mctrl) | |||
113 | udelay(10); | 113 | udelay(10); |
114 | } | 114 | } |
115 | 115 | ||
116 | static void jsm_tty_start_tx(struct uart_port *port, unsigned int tty_start) | 116 | static void jsm_tty_start_tx(struct uart_port *port) |
117 | { | 117 | { |
118 | struct jsm_channel *channel = (struct jsm_channel *)port; | 118 | struct jsm_channel *channel = (struct jsm_channel *)port; |
119 | 119 | ||
@@ -125,7 +125,7 @@ static void jsm_tty_start_tx(struct uart_port *port, unsigned int tty_start) | |||
125 | jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n"); | 125 | jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n"); |
126 | } | 126 | } |
127 | 127 | ||
128 | static void jsm_tty_stop_tx(struct uart_port *port, unsigned int tty_stop) | 128 | static void jsm_tty_stop_tx(struct uart_port *port) |
129 | { | 129 | { |
130 | struct jsm_channel *channel = (struct jsm_channel *)port; | 130 | struct jsm_channel *channel = (struct jsm_channel *)port; |
131 | 131 | ||
diff --git a/drivers/serial/m32r_sio.c b/drivers/serial/m32r_sio.c index 0301feacbde4..b0ecc7537ce5 100644 --- a/drivers/serial/m32r_sio.c +++ b/drivers/serial/m32r_sio.c | |||
@@ -275,7 +275,7 @@ serial_out(struct uart_sio_port *up, int offset, int value) | |||
275 | __sio_out(value, offset); | 275 | __sio_out(value, offset); |
276 | } | 276 | } |
277 | 277 | ||
278 | static void m32r_sio_stop_tx(struct uart_port *port, unsigned int tty_stop) | 278 | static void m32r_sio_stop_tx(struct uart_port *port) |
279 | { | 279 | { |
280 | struct uart_sio_port *up = (struct uart_sio_port *)port; | 280 | struct uart_sio_port *up = (struct uart_sio_port *)port; |
281 | 281 | ||
@@ -285,7 +285,7 @@ static void m32r_sio_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
285 | } | 285 | } |
286 | } | 286 | } |
287 | 287 | ||
288 | static void m32r_sio_start_tx(struct uart_port *port, unsigned int tty_start) | 288 | static void m32r_sio_start_tx(struct uart_port *port) |
289 | { | 289 | { |
290 | #ifdef CONFIG_SERIAL_M32R_PLDSIO | 290 | #ifdef CONFIG_SERIAL_M32R_PLDSIO |
291 | struct uart_sio_port *up = (struct uart_sio_port *)port; | 291 | struct uart_sio_port *up = (struct uart_sio_port *)port; |
@@ -425,7 +425,7 @@ static _INLINE_ void transmit_chars(struct uart_sio_port *up) | |||
425 | return; | 425 | return; |
426 | } | 426 | } |
427 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { | 427 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { |
428 | m32r_sio_stop_tx(&up->port, 0); | 428 | m32r_sio_stop_tx(&up->port); |
429 | return; | 429 | return; |
430 | } | 430 | } |
431 | 431 | ||
@@ -446,7 +446,7 @@ static _INLINE_ void transmit_chars(struct uart_sio_port *up) | |||
446 | DEBUG_INTR("THRE..."); | 446 | DEBUG_INTR("THRE..."); |
447 | 447 | ||
448 | if (uart_circ_empty(xmit)) | 448 | if (uart_circ_empty(xmit)) |
449 | m32r_sio_stop_tx(&up->port, 0); | 449 | m32r_sio_stop_tx(&up->port); |
450 | } | 450 | } |
451 | 451 | ||
452 | /* | 452 | /* |
@@ -1123,7 +1123,7 @@ static int __init m32r_sio_console_setup(struct console *co, char *options) | |||
1123 | return uart_set_options(port, co, baud, parity, bits, flow); | 1123 | return uart_set_options(port, co, baud, parity, bits, flow); |
1124 | } | 1124 | } |
1125 | 1125 | ||
1126 | extern struct uart_driver m32r_sio_reg; | 1126 | static struct uart_driver m32r_sio_reg; |
1127 | static struct console m32r_sio_console = { | 1127 | static struct console m32r_sio_console = { |
1128 | .name = "ttyS", | 1128 | .name = "ttyS", |
1129 | .write = m32r_sio_console_write, | 1129 | .write = m32r_sio_console_write, |
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index 2a5cf174ca30..a3cd0ee8486d 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
@@ -119,7 +119,7 @@ mpc52xx_uart_get_mctrl(struct uart_port *port) | |||
119 | } | 119 | } |
120 | 120 | ||
121 | static void | 121 | static void |
122 | mpc52xx_uart_stop_tx(struct uart_port *port, unsigned int tty_stop) | 122 | mpc52xx_uart_stop_tx(struct uart_port *port) |
123 | { | 123 | { |
124 | /* port->lock taken by caller */ | 124 | /* port->lock taken by caller */ |
125 | port->read_status_mask &= ~MPC52xx_PSC_IMR_TXRDY; | 125 | port->read_status_mask &= ~MPC52xx_PSC_IMR_TXRDY; |
@@ -127,7 +127,7 @@ mpc52xx_uart_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
127 | } | 127 | } |
128 | 128 | ||
129 | static void | 129 | static void |
130 | mpc52xx_uart_start_tx(struct uart_port *port, unsigned int tty_start) | 130 | mpc52xx_uart_start_tx(struct uart_port *port) |
131 | { | 131 | { |
132 | /* port->lock taken by caller */ | 132 | /* port->lock taken by caller */ |
133 | port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY; | 133 | port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY; |
@@ -485,7 +485,7 @@ mpc52xx_uart_int_tx_chars(struct uart_port *port) | |||
485 | 485 | ||
486 | /* Nothing to do ? */ | 486 | /* Nothing to do ? */ |
487 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 487 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
488 | mpc52xx_uart_stop_tx(port,0); | 488 | mpc52xx_uart_stop_tx(port); |
489 | return 0; | 489 | return 0; |
490 | } | 490 | } |
491 | 491 | ||
@@ -504,7 +504,7 @@ mpc52xx_uart_int_tx_chars(struct uart_port *port) | |||
504 | 504 | ||
505 | /* Maybe we're done after all */ | 505 | /* Maybe we're done after all */ |
506 | if (uart_circ_empty(xmit)) { | 506 | if (uart_circ_empty(xmit)) { |
507 | mpc52xx_uart_stop_tx(port,0); | 507 | mpc52xx_uart_stop_tx(port); |
508 | return 0; | 508 | return 0; |
509 | } | 509 | } |
510 | 510 | ||
diff --git a/drivers/serial/mpsc.c b/drivers/serial/mpsc.c index e43276c6a954..efe79b1fd431 100644 --- a/drivers/serial/mpsc.c +++ b/drivers/serial/mpsc.c | |||
@@ -1072,18 +1072,18 @@ mpsc_get_mctrl(struct uart_port *port) | |||
1072 | } | 1072 | } |
1073 | 1073 | ||
1074 | static void | 1074 | static void |
1075 | mpsc_stop_tx(struct uart_port *port, uint tty_start) | 1075 | mpsc_stop_tx(struct uart_port *port) |
1076 | { | 1076 | { |
1077 | struct mpsc_port_info *pi = (struct mpsc_port_info *)port; | 1077 | struct mpsc_port_info *pi = (struct mpsc_port_info *)port; |
1078 | 1078 | ||
1079 | pr_debug("mpsc_stop_tx[%d]: tty_start: %d\n", port->line, tty_start); | 1079 | pr_debug("mpsc_stop_tx[%d]\n", port->line); |
1080 | 1080 | ||
1081 | mpsc_freeze(pi); | 1081 | mpsc_freeze(pi); |
1082 | return; | 1082 | return; |
1083 | } | 1083 | } |
1084 | 1084 | ||
1085 | static void | 1085 | static void |
1086 | mpsc_start_tx(struct uart_port *port, uint tty_start) | 1086 | mpsc_start_tx(struct uart_port *port) |
1087 | { | 1087 | { |
1088 | struct mpsc_port_info *pi = (struct mpsc_port_info *)port; | 1088 | struct mpsc_port_info *pi = (struct mpsc_port_info *)port; |
1089 | 1089 | ||
@@ -1091,7 +1091,7 @@ mpsc_start_tx(struct uart_port *port, uint tty_start) | |||
1091 | mpsc_copy_tx_data(pi); | 1091 | mpsc_copy_tx_data(pi); |
1092 | mpsc_sdma_start_tx(pi); | 1092 | mpsc_sdma_start_tx(pi); |
1093 | 1093 | ||
1094 | pr_debug("mpsc_start_tx[%d]: tty_start: %d\n", port->line, tty_start); | 1094 | pr_debug("mpsc_start_tx[%d]\n", port->line); |
1095 | return; | 1095 | return; |
1096 | } | 1096 | } |
1097 | 1097 | ||
diff --git a/drivers/serial/mux.c b/drivers/serial/mux.c index dadd7e19714e..189064607709 100644 --- a/drivers/serial/mux.c +++ b/drivers/serial/mux.c | |||
@@ -111,22 +111,20 @@ static unsigned int mux_get_mctrl(struct uart_port *port) | |||
111 | /** | 111 | /** |
112 | * mux_stop_tx - Stop transmitting characters. | 112 | * mux_stop_tx - Stop transmitting characters. |
113 | * @port: Ptr to the uart_port. | 113 | * @port: Ptr to the uart_port. |
114 | * @tty_stop: tty layer issue this command? | ||
115 | * | 114 | * |
116 | * The Serial MUX does not support this function. | 115 | * The Serial MUX does not support this function. |
117 | */ | 116 | */ |
118 | static void mux_stop_tx(struct uart_port *port, unsigned int tty_stop) | 117 | static void mux_stop_tx(struct uart_port *port) |
119 | { | 118 | { |
120 | } | 119 | } |
121 | 120 | ||
122 | /** | 121 | /** |
123 | * mux_start_tx - Start transmitting characters. | 122 | * mux_start_tx - Start transmitting characters. |
124 | * @port: Ptr to the uart_port. | 123 | * @port: Ptr to the uart_port. |
125 | * @tty_start: tty layer issue this command? | ||
126 | * | 124 | * |
127 | * The Serial Mux does not support this function. | 125 | * The Serial Mux does not support this function. |
128 | */ | 126 | */ |
129 | static void mux_start_tx(struct uart_port *port, unsigned int tty_start) | 127 | static void mux_start_tx(struct uart_port *port) |
130 | { | 128 | { |
131 | } | 129 | } |
132 | 130 | ||
@@ -181,7 +179,7 @@ static void mux_write(struct uart_port *port) | |||
181 | } | 179 | } |
182 | 180 | ||
183 | if(uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 181 | if(uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
184 | mux_stop_tx(port, 0); | 182 | mux_stop_tx(port); |
185 | return; | 183 | return; |
186 | } | 184 | } |
187 | 185 | ||
@@ -202,7 +200,7 @@ static void mux_write(struct uart_port *port) | |||
202 | uart_write_wakeup(port); | 200 | uart_write_wakeup(port); |
203 | 201 | ||
204 | if (uart_circ_empty(xmit)) | 202 | if (uart_circ_empty(xmit)) |
205 | mux_stop_tx(port, 0); | 203 | mux_stop_tx(port); |
206 | } | 204 | } |
207 | 205 | ||
208 | /** | 206 | /** |
diff --git a/drivers/serial/pmac_zilog.c b/drivers/serial/pmac_zilog.c index 7db2f37532cf..5bfde99e245e 100644 --- a/drivers/serial/pmac_zilog.c +++ b/drivers/serial/pmac_zilog.c | |||
@@ -630,11 +630,10 @@ static unsigned int pmz_get_mctrl(struct uart_port *port) | |||
630 | 630 | ||
631 | /* | 631 | /* |
632 | * Stop TX side. Dealt like sunzilog at next Tx interrupt, | 632 | * Stop TX side. Dealt like sunzilog at next Tx interrupt, |
633 | * though for DMA, we will have to do a bit more. What is | 633 | * though for DMA, we will have to do a bit more. |
634 | * the meaning of the tty_stop bit ? XXX | ||
635 | * The port lock is held and interrupts are disabled. | 634 | * The port lock is held and interrupts are disabled. |
636 | */ | 635 | */ |
637 | static void pmz_stop_tx(struct uart_port *port, unsigned int tty_stop) | 636 | static void pmz_stop_tx(struct uart_port *port) |
638 | { | 637 | { |
639 | to_pmz(port)->flags |= PMACZILOG_FLAG_TX_STOPPED; | 638 | to_pmz(port)->flags |= PMACZILOG_FLAG_TX_STOPPED; |
640 | } | 639 | } |
@@ -643,7 +642,7 @@ static void pmz_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
643 | * Kick the Tx side. | 642 | * Kick the Tx side. |
644 | * The port lock is held and interrupts are disabled. | 643 | * The port lock is held and interrupts are disabled. |
645 | */ | 644 | */ |
646 | static void pmz_start_tx(struct uart_port *port, unsigned int tty_start) | 645 | static void pmz_start_tx(struct uart_port *port) |
647 | { | 646 | { |
648 | struct uart_pmac_port *uap = to_pmz(port); | 647 | struct uart_pmac_port *uap = to_pmz(port); |
649 | unsigned char status; | 648 | unsigned char status; |
diff --git a/drivers/serial/pxa.c b/drivers/serial/pxa.c index 461c81c93207..eaa0af835290 100644 --- a/drivers/serial/pxa.c +++ b/drivers/serial/pxa.c | |||
@@ -80,7 +80,7 @@ static void serial_pxa_enable_ms(struct uart_port *port) | |||
80 | serial_out(up, UART_IER, up->ier); | 80 | serial_out(up, UART_IER, up->ier); |
81 | } | 81 | } |
82 | 82 | ||
83 | static void serial_pxa_stop_tx(struct uart_port *port, unsigned int tty_stop) | 83 | static void serial_pxa_stop_tx(struct uart_port *port) |
84 | { | 84 | { |
85 | struct uart_pxa_port *up = (struct uart_pxa_port *)port; | 85 | struct uart_pxa_port *up = (struct uart_pxa_port *)port; |
86 | 86 | ||
@@ -185,7 +185,7 @@ static void transmit_chars(struct uart_pxa_port *up) | |||
185 | return; | 185 | return; |
186 | } | 186 | } |
187 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { | 187 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { |
188 | serial_pxa_stop_tx(&up->port, 0); | 188 | serial_pxa_stop_tx(&up->port); |
189 | return; | 189 | return; |
190 | } | 190 | } |
191 | 191 | ||
@@ -203,10 +203,10 @@ static void transmit_chars(struct uart_pxa_port *up) | |||
203 | 203 | ||
204 | 204 | ||
205 | if (uart_circ_empty(xmit)) | 205 | if (uart_circ_empty(xmit)) |
206 | serial_pxa_stop_tx(&up->port, 0); | 206 | serial_pxa_stop_tx(&up->port); |
207 | } | 207 | } |
208 | 208 | ||
209 | static void serial_pxa_start_tx(struct uart_port *port, unsigned int tty_start) | 209 | static void serial_pxa_start_tx(struct uart_port *port) |
210 | { | 210 | { |
211 | struct uart_pxa_port *up = (struct uart_pxa_port *)port; | 211 | struct uart_pxa_port *up = (struct uart_pxa_port *)port; |
212 | 212 | ||
diff --git a/drivers/serial/s3c2410.c b/drivers/serial/s3c2410.c index 7365d4b50b95..c361c6fb0809 100644 --- a/drivers/serial/s3c2410.c +++ b/drivers/serial/s3c2410.c | |||
@@ -246,8 +246,7 @@ static void s3c24xx_serial_rx_disable(struct uart_port *port) | |||
246 | spin_unlock_irqrestore(&port->lock, flags); | 246 | spin_unlock_irqrestore(&port->lock, flags); |
247 | } | 247 | } |
248 | 248 | ||
249 | static void | 249 | static void s3c24xx_serial_stop_tx(struct uart_port *port) |
250 | s3c24xx_serial_stop_tx(struct uart_port *port, unsigned int tty_stop) | ||
251 | { | 250 | { |
252 | if (tx_enabled(port)) { | 251 | if (tx_enabled(port)) { |
253 | disable_irq(TX_IRQ(port)); | 252 | disable_irq(TX_IRQ(port)); |
@@ -257,8 +256,7 @@ s3c24xx_serial_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
257 | } | 256 | } |
258 | } | 257 | } |
259 | 258 | ||
260 | static void | 259 | static void s3c24xx_serial_start_tx(struct uart_port *port) |
261 | s3c24xx_serial_start_tx(struct uart_port *port, unsigned int tty_start) | ||
262 | { | 260 | { |
263 | if (!tx_enabled(port)) { | 261 | if (!tx_enabled(port)) { |
264 | if (port->flags & UPF_CONS_FLOW) | 262 | if (port->flags & UPF_CONS_FLOW) |
@@ -424,7 +422,7 @@ static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id, struct pt_regs *re | |||
424 | */ | 422 | */ |
425 | 423 | ||
426 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 424 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
427 | s3c24xx_serial_stop_tx(port, 0); | 425 | s3c24xx_serial_stop_tx(port); |
428 | goto out; | 426 | goto out; |
429 | } | 427 | } |
430 | 428 | ||
@@ -443,7 +441,7 @@ static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id, struct pt_regs *re | |||
443 | uart_write_wakeup(port); | 441 | uart_write_wakeup(port); |
444 | 442 | ||
445 | if (uart_circ_empty(xmit)) | 443 | if (uart_circ_empty(xmit)) |
446 | s3c24xx_serial_stop_tx(port, 0); | 444 | s3c24xx_serial_stop_tx(port); |
447 | 445 | ||
448 | out: | 446 | out: |
449 | return IRQ_HANDLED; | 447 | return IRQ_HANDLED; |
diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c index 98641c3f5ab9..1225b14f6e9d 100644 --- a/drivers/serial/sa1100.c +++ b/drivers/serial/sa1100.c | |||
@@ -145,7 +145,7 @@ static void sa1100_timeout(unsigned long data) | |||
145 | /* | 145 | /* |
146 | * interrupts disabled on entry | 146 | * interrupts disabled on entry |
147 | */ | 147 | */ |
148 | static void sa1100_stop_tx(struct uart_port *port, unsigned int tty_stop) | 148 | static void sa1100_stop_tx(struct uart_port *port) |
149 | { | 149 | { |
150 | struct sa1100_port *sport = (struct sa1100_port *)port; | 150 | struct sa1100_port *sport = (struct sa1100_port *)port; |
151 | u32 utcr3; | 151 | u32 utcr3; |
@@ -158,7 +158,7 @@ static void sa1100_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
158 | /* | 158 | /* |
159 | * interrupts may not be disabled on entry | 159 | * interrupts may not be disabled on entry |
160 | */ | 160 | */ |
161 | static void sa1100_start_tx(struct uart_port *port, unsigned int tty_start) | 161 | static void sa1100_start_tx(struct uart_port *port) |
162 | { | 162 | { |
163 | struct sa1100_port *sport = (struct sa1100_port *)port; | 163 | struct sa1100_port *sport = (struct sa1100_port *)port; |
164 | unsigned long flags; | 164 | unsigned long flags; |
@@ -264,7 +264,7 @@ static void sa1100_tx_chars(struct sa1100_port *sport) | |||
264 | sa1100_mctrl_check(sport); | 264 | sa1100_mctrl_check(sport); |
265 | 265 | ||
266 | if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) { | 266 | if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) { |
267 | sa1100_stop_tx(&sport->port, 0); | 267 | sa1100_stop_tx(&sport->port); |
268 | return; | 268 | return; |
269 | } | 269 | } |
270 | 270 | ||
@@ -284,7 +284,7 @@ static void sa1100_tx_chars(struct sa1100_port *sport) | |||
284 | uart_write_wakeup(&sport->port); | 284 | uart_write_wakeup(&sport->port); |
285 | 285 | ||
286 | if (uart_circ_empty(xmit)) | 286 | if (uart_circ_empty(xmit)) |
287 | sa1100_stop_tx(&sport->port, 0); | 287 | sa1100_stop_tx(&sport->port); |
288 | } | 288 | } |
289 | 289 | ||
290 | static irqreturn_t sa1100_int(int irq, void *dev_id, struct pt_regs *regs) | 290 | static irqreturn_t sa1100_int(int irq, void *dev_id, struct pt_regs *regs) |
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index 54699c3a00ab..ac3a0bf924db 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c | |||
@@ -80,7 +80,7 @@ static void uart_stop(struct tty_struct *tty) | |||
80 | unsigned long flags; | 80 | unsigned long flags; |
81 | 81 | ||
82 | spin_lock_irqsave(&port->lock, flags); | 82 | spin_lock_irqsave(&port->lock, flags); |
83 | port->ops->stop_tx(port, 1); | 83 | port->ops->stop_tx(port); |
84 | spin_unlock_irqrestore(&port->lock, flags); | 84 | spin_unlock_irqrestore(&port->lock, flags); |
85 | } | 85 | } |
86 | 86 | ||
@@ -91,7 +91,7 @@ static void __uart_start(struct tty_struct *tty) | |||
91 | 91 | ||
92 | if (!uart_circ_empty(&state->info->xmit) && state->info->xmit.buf && | 92 | if (!uart_circ_empty(&state->info->xmit) && state->info->xmit.buf && |
93 | !tty->stopped && !tty->hw_stopped) | 93 | !tty->stopped && !tty->hw_stopped) |
94 | port->ops->start_tx(port, 1); | 94 | port->ops->start_tx(port); |
95 | } | 95 | } |
96 | 96 | ||
97 | static void uart_start(struct tty_struct *tty) | 97 | static void uart_start(struct tty_struct *tty) |
@@ -542,7 +542,7 @@ static void uart_send_xchar(struct tty_struct *tty, char ch) | |||
542 | port->x_char = ch; | 542 | port->x_char = ch; |
543 | if (ch) { | 543 | if (ch) { |
544 | spin_lock_irqsave(&port->lock, flags); | 544 | spin_lock_irqsave(&port->lock, flags); |
545 | port->ops->start_tx(port, 0); | 545 | port->ops->start_tx(port); |
546 | spin_unlock_irqrestore(&port->lock, flags); | 546 | spin_unlock_irqrestore(&port->lock, flags); |
547 | } | 547 | } |
548 | } | 548 | } |
@@ -1146,7 +1146,7 @@ static void uart_set_termios(struct tty_struct *tty, struct termios *old_termios | |||
1146 | spin_lock_irqsave(&state->port->lock, flags); | 1146 | spin_lock_irqsave(&state->port->lock, flags); |
1147 | if (!(state->port->ops->get_mctrl(state->port) & TIOCM_CTS)) { | 1147 | if (!(state->port->ops->get_mctrl(state->port) & TIOCM_CTS)) { |
1148 | tty->hw_stopped = 1; | 1148 | tty->hw_stopped = 1; |
1149 | state->port->ops->stop_tx(state->port, 0); | 1149 | state->port->ops->stop_tx(state->port); |
1150 | } | 1150 | } |
1151 | spin_unlock_irqrestore(&state->port->lock, flags); | 1151 | spin_unlock_irqrestore(&state->port->lock, flags); |
1152 | } | 1152 | } |
@@ -1869,7 +1869,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port) | |||
1869 | struct uart_ops *ops = port->ops; | 1869 | struct uart_ops *ops = port->ops; |
1870 | 1870 | ||
1871 | spin_lock_irq(&port->lock); | 1871 | spin_lock_irq(&port->lock); |
1872 | ops->stop_tx(port, 0); | 1872 | ops->stop_tx(port); |
1873 | ops->set_mctrl(port, 0); | 1873 | ops->set_mctrl(port, 0); |
1874 | ops->stop_rx(port); | 1874 | ops->stop_rx(port); |
1875 | spin_unlock_irq(&port->lock); | 1875 | spin_unlock_irq(&port->lock); |
@@ -1935,7 +1935,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) | |||
1935 | uart_change_speed(state, NULL); | 1935 | uart_change_speed(state, NULL); |
1936 | spin_lock_irq(&port->lock); | 1936 | spin_lock_irq(&port->lock); |
1937 | ops->set_mctrl(port, port->mctrl); | 1937 | ops->set_mctrl(port, port->mctrl); |
1938 | ops->start_tx(port, 0); | 1938 | ops->start_tx(port); |
1939 | spin_unlock_irq(&port->lock); | 1939 | spin_unlock_irq(&port->lock); |
1940 | } | 1940 | } |
1941 | 1941 | ||
diff --git a/drivers/serial/serial_lh7a40x.c b/drivers/serial/serial_lh7a40x.c index 56f269b6bfb1..32f808d157a1 100644 --- a/drivers/serial/serial_lh7a40x.c +++ b/drivers/serial/serial_lh7a40x.c | |||
@@ -112,13 +112,12 @@ struct uart_port_lh7a40x { | |||
112 | unsigned int statusPrev; /* Most recently read modem status */ | 112 | unsigned int statusPrev; /* Most recently read modem status */ |
113 | }; | 113 | }; |
114 | 114 | ||
115 | static void lh7a40xuart_stop_tx (struct uart_port* port, unsigned int tty_stop) | 115 | static void lh7a40xuart_stop_tx (struct uart_port* port) |
116 | { | 116 | { |
117 | BIT_CLR (port, UART_R_INTEN, TxInt); | 117 | BIT_CLR (port, UART_R_INTEN, TxInt); |
118 | } | 118 | } |
119 | 119 | ||
120 | static void lh7a40xuart_start_tx (struct uart_port* port, | 120 | static void lh7a40xuart_start_tx (struct uart_port* port) |
121 | unsigned int tty_start) | ||
122 | { | 121 | { |
123 | BIT_SET (port, UART_R_INTEN, TxInt); | 122 | BIT_SET (port, UART_R_INTEN, TxInt); |
124 | 123 | ||
diff --git a/drivers/serial/serial_txx9.c b/drivers/serial/serial_txx9.c index d085030df70b..49afadbe461b 100644 --- a/drivers/serial/serial_txx9.c +++ b/drivers/serial/serial_txx9.c | |||
@@ -253,7 +253,7 @@ sio_quot_set(struct uart_txx9_port *up, int quot) | |||
253 | sio_out(up, TXX9_SIBGR, 0xff | TXX9_SIBGR_BCLK_T6); | 253 | sio_out(up, TXX9_SIBGR, 0xff | TXX9_SIBGR_BCLK_T6); |
254 | } | 254 | } |
255 | 255 | ||
256 | static void serial_txx9_stop_tx(struct uart_port *port, unsigned int tty_stop) | 256 | static void serial_txx9_stop_tx(struct uart_port *port) |
257 | { | 257 | { |
258 | struct uart_txx9_port *up = (struct uart_txx9_port *)port; | 258 | struct uart_txx9_port *up = (struct uart_txx9_port *)port; |
259 | unsigned long flags; | 259 | unsigned long flags; |
@@ -263,7 +263,7 @@ static void serial_txx9_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
263 | spin_unlock_irqrestore(&up->port.lock, flags); | 263 | spin_unlock_irqrestore(&up->port.lock, flags); |
264 | } | 264 | } |
265 | 265 | ||
266 | static void serial_txx9_start_tx(struct uart_port *port, unsigned int tty_start) | 266 | static void serial_txx9_start_tx(struct uart_port *port) |
267 | { | 267 | { |
268 | struct uart_txx9_port *up = (struct uart_txx9_port *)port; | 268 | struct uart_txx9_port *up = (struct uart_txx9_port *)port; |
269 | unsigned long flags; | 269 | unsigned long flags; |
@@ -372,7 +372,7 @@ static inline void transmit_chars(struct uart_txx9_port *up) | |||
372 | return; | 372 | return; |
373 | } | 373 | } |
374 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { | 374 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { |
375 | serial_txx9_stop_tx(&up->port, 0); | 375 | serial_txx9_stop_tx(&up->port); |
376 | return; | 376 | return; |
377 | } | 377 | } |
378 | 378 | ||
@@ -389,7 +389,7 @@ static inline void transmit_chars(struct uart_txx9_port *up) | |||
389 | uart_write_wakeup(&up->port); | 389 | uart_write_wakeup(&up->port); |
390 | 390 | ||
391 | if (uart_circ_empty(xmit)) | 391 | if (uart_circ_empty(xmit)) |
392 | serial_txx9_stop_tx(&up->port, 0); | 392 | serial_txx9_stop_tx(&up->port); |
393 | } | 393 | } |
394 | 394 | ||
395 | static irqreturn_t serial_txx9_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 395 | static irqreturn_t serial_txx9_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index ad5b776d779b..512266307866 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -79,8 +79,8 @@ static struct sci_port *serial_console_port = 0; | |||
79 | #endif /* CONFIG_SERIAL_SH_SCI_CONSOLE */ | 79 | #endif /* CONFIG_SERIAL_SH_SCI_CONSOLE */ |
80 | 80 | ||
81 | /* Function prototypes */ | 81 | /* Function prototypes */ |
82 | static void sci_stop_tx(struct uart_port *port, unsigned int tty_stop); | 82 | static void sci_stop_tx(struct uart_port *port); |
83 | static void sci_start_tx(struct uart_port *port, unsigned int tty_start); | 83 | static void sci_start_tx(struct uart_port *port); |
84 | static void sci_start_rx(struct uart_port *port, unsigned int tty_start); | 84 | static void sci_start_rx(struct uart_port *port, unsigned int tty_start); |
85 | static void sci_stop_rx(struct uart_port *port); | 85 | static void sci_stop_rx(struct uart_port *port); |
86 | static int sci_request_irq(struct sci_port *port); | 86 | static int sci_request_irq(struct sci_port *port); |
@@ -455,7 +455,7 @@ static void sci_transmit_chars(struct uart_port *port) | |||
455 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 455 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
456 | uart_write_wakeup(port); | 456 | uart_write_wakeup(port); |
457 | if (uart_circ_empty(xmit)) { | 457 | if (uart_circ_empty(xmit)) { |
458 | sci_stop_tx(port, 0); | 458 | sci_stop_tx(port); |
459 | } else { | 459 | } else { |
460 | local_irq_save(flags); | 460 | local_irq_save(flags); |
461 | ctrl = sci_in(port, SCSCR); | 461 | ctrl = sci_in(port, SCSCR); |
@@ -900,7 +900,7 @@ static unsigned int sci_get_mctrl(struct uart_port *port) | |||
900 | return TIOCM_DTR | TIOCM_RTS | TIOCM_DSR; | 900 | return TIOCM_DTR | TIOCM_RTS | TIOCM_DSR; |
901 | } | 901 | } |
902 | 902 | ||
903 | static void sci_start_tx(struct uart_port *port, unsigned int tty_start) | 903 | static void sci_start_tx(struct uart_port *port) |
904 | { | 904 | { |
905 | struct sci_port *s = &sci_ports[port->line]; | 905 | struct sci_port *s = &sci_ports[port->line]; |
906 | 906 | ||
@@ -909,7 +909,7 @@ static void sci_start_tx(struct uart_port *port, unsigned int tty_start) | |||
909 | enable_irq(s->irqs[SCIx_TXI_IRQ]); | 909 | enable_irq(s->irqs[SCIx_TXI_IRQ]); |
910 | } | 910 | } |
911 | 911 | ||
912 | static void sci_stop_tx(struct uart_port *port, unsigned int tty_stop) | 912 | static void sci_stop_tx(struct uart_port *port) |
913 | { | 913 | { |
914 | unsigned long flags; | 914 | unsigned long flags; |
915 | unsigned short ctrl; | 915 | unsigned short ctrl; |
@@ -978,7 +978,7 @@ static void sci_shutdown(struct uart_port *port) | |||
978 | struct sci_port *s = &sci_ports[port->line]; | 978 | struct sci_port *s = &sci_ports[port->line]; |
979 | 979 | ||
980 | sci_stop_rx(port); | 980 | sci_stop_rx(port); |
981 | sci_stop_tx(port, 1); | 981 | sci_stop_tx(port); |
982 | sci_free_irq(s); | 982 | sci_free_irq(s); |
983 | 983 | ||
984 | #if defined(__H8300S__) | 984 | #if defined(__H8300S__) |
diff --git a/drivers/serial/sn_console.c b/drivers/serial/sn_console.c index 840815fde49b..313f9df24a2d 100644 --- a/drivers/serial/sn_console.c +++ b/drivers/serial/sn_console.c | |||
@@ -259,10 +259,9 @@ static unsigned int snp_tx_empty(struct uart_port *port) | |||
259 | /** | 259 | /** |
260 | * snp_stop_tx - stop the transmitter - no-op for us | 260 | * snp_stop_tx - stop the transmitter - no-op for us |
261 | * @port: Port to operat eon - we ignore - no-op function | 261 | * @port: Port to operat eon - we ignore - no-op function |
262 | * @tty_stop: Set to 1 if called via uart_stop | ||
263 | * | 262 | * |
264 | */ | 263 | */ |
265 | static void snp_stop_tx(struct uart_port *port, unsigned int tty_stop) | 264 | static void snp_stop_tx(struct uart_port *port) |
266 | { | 265 | { |
267 | } | 266 | } |
268 | 267 | ||
@@ -325,10 +324,9 @@ static void snp_stop_rx(struct uart_port *port) | |||
325 | /** | 324 | /** |
326 | * snp_start_tx - Start transmitter | 325 | * snp_start_tx - Start transmitter |
327 | * @port: Port to operate on | 326 | * @port: Port to operate on |
328 | * @tty_stop: Set to 1 if called via uart_start | ||
329 | * | 327 | * |
330 | */ | 328 | */ |
331 | static void snp_start_tx(struct uart_port *port, unsigned int tty_stop) | 329 | static void snp_start_tx(struct uart_port *port) |
332 | { | 330 | { |
333 | if (sal_console_port.sc_ops->sal_wakeup_transmit) | 331 | if (sal_console_port.sc_ops->sal_wakeup_transmit) |
334 | sal_console_port.sc_ops->sal_wakeup_transmit(&sal_console_port, | 332 | sal_console_port.sc_ops->sal_wakeup_transmit(&sal_console_port, |
@@ -615,7 +613,7 @@ static void sn_transmit_chars(struct sn_cons_port *port, int raw) | |||
615 | uart_write_wakeup(&port->sc_port); | 613 | uart_write_wakeup(&port->sc_port); |
616 | 614 | ||
617 | if (uart_circ_empty(xmit)) | 615 | if (uart_circ_empty(xmit)) |
618 | snp_stop_tx(&port->sc_port, 0); /* no-op for us */ | 616 | snp_stop_tx(&port->sc_port); /* no-op for us */ |
619 | } | 617 | } |
620 | 618 | ||
621 | /** | 619 | /** |
@@ -1093,6 +1091,7 @@ int __init sn_serial_console_early_setup(void) | |||
1093 | return -1; | 1091 | return -1; |
1094 | 1092 | ||
1095 | sal_console_port.sc_ops = &poll_ops; | 1093 | sal_console_port.sc_ops = &poll_ops; |
1094 | spin_lock_init(&sal_console_port.sc_port.lock); | ||
1096 | early_sn_setup(); /* Find SAL entry points */ | 1095 | early_sn_setup(); /* Find SAL entry points */ |
1097 | register_console(&sal_console_early); | 1096 | register_console(&sal_console_early); |
1098 | 1097 | ||
diff --git a/drivers/serial/sunsab.c b/drivers/serial/sunsab.c index 8d198880756a..e971156daa60 100644 --- a/drivers/serial/sunsab.c +++ b/drivers/serial/sunsab.c | |||
@@ -245,7 +245,7 @@ receive_chars(struct uart_sunsab_port *up, | |||
245 | return tty; | 245 | return tty; |
246 | } | 246 | } |
247 | 247 | ||
248 | static void sunsab_stop_tx(struct uart_port *, unsigned int); | 248 | static void sunsab_stop_tx(struct uart_port *); |
249 | static void sunsab_tx_idle(struct uart_sunsab_port *); | 249 | static void sunsab_tx_idle(struct uart_sunsab_port *); |
250 | 250 | ||
251 | static void transmit_chars(struct uart_sunsab_port *up, | 251 | static void transmit_chars(struct uart_sunsab_port *up, |
@@ -301,7 +301,7 @@ static void transmit_chars(struct uart_sunsab_port *up, | |||
301 | uart_write_wakeup(&up->port); | 301 | uart_write_wakeup(&up->port); |
302 | 302 | ||
303 | if (uart_circ_empty(xmit)) | 303 | if (uart_circ_empty(xmit)) |
304 | sunsab_stop_tx(&up->port, 0); | 304 | sunsab_stop_tx(&up->port); |
305 | } | 305 | } |
306 | 306 | ||
307 | static void check_status(struct uart_sunsab_port *up, | 307 | static void check_status(struct uart_sunsab_port *up, |
@@ -448,7 +448,7 @@ static unsigned int sunsab_get_mctrl(struct uart_port *port) | |||
448 | } | 448 | } |
449 | 449 | ||
450 | /* port->lock held by caller. */ | 450 | /* port->lock held by caller. */ |
451 | static void sunsab_stop_tx(struct uart_port *port, unsigned int tty_stop) | 451 | static void sunsab_stop_tx(struct uart_port *port) |
452 | { | 452 | { |
453 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 453 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
454 | 454 | ||
@@ -476,7 +476,7 @@ static void sunsab_tx_idle(struct uart_sunsab_port *up) | |||
476 | } | 476 | } |
477 | 477 | ||
478 | /* port->lock held by caller. */ | 478 | /* port->lock held by caller. */ |
479 | static void sunsab_start_tx(struct uart_port *port, unsigned int tty_start) | 479 | static void sunsab_start_tx(struct uart_port *port) |
480 | { | 480 | { |
481 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; | 481 | struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; |
482 | struct circ_buf *xmit = &up->port.info->xmit; | 482 | struct circ_buf *xmit = &up->port.info->xmit; |
diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c index d57a3553aea3..0cc879eb1c02 100644 --- a/drivers/serial/sunsu.c +++ b/drivers/serial/sunsu.c | |||
@@ -255,21 +255,27 @@ static void disable_rsa(struct uart_sunsu_port *up) | |||
255 | } | 255 | } |
256 | #endif /* CONFIG_SERIAL_8250_RSA */ | 256 | #endif /* CONFIG_SERIAL_8250_RSA */ |
257 | 257 | ||
258 | static void sunsu_stop_tx(struct uart_port *port, unsigned int tty_stop) | 258 | static inline void __stop_tx(struct uart_sunsu_port *p) |
259 | { | ||
260 | if (p->ier & UART_IER_THRI) { | ||
261 | p->ier &= ~UART_IER_THRI; | ||
262 | serial_out(p, UART_IER, p->ier); | ||
263 | } | ||
264 | } | ||
265 | |||
266 | static void sunsu_stop_tx(struct uart_port *port) | ||
259 | { | 267 | { |
260 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 268 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
261 | 269 | ||
262 | if (up->ier & UART_IER_THRI) { | 270 | __stop_tx(up); |
263 | up->ier &= ~UART_IER_THRI; | 271 | |
264 | serial_out(up, UART_IER, up->ier); | 272 | if (up->port.type == PORT_16C950 && tty_stop /*FIXME*/) { |
265 | } | ||
266 | if (up->port.type == PORT_16C950 && tty_stop) { | ||
267 | up->acr |= UART_ACR_TXDIS; | 273 | up->acr |= UART_ACR_TXDIS; |
268 | serial_icr_write(up, UART_ACR, up->acr); | 274 | serial_icr_write(up, UART_ACR, up->acr); |
269 | } | 275 | } |
270 | } | 276 | } |
271 | 277 | ||
272 | static void sunsu_start_tx(struct uart_port *port, unsigned int tty_start) | 278 | static void sunsu_start_tx(struct uart_port *port) |
273 | { | 279 | { |
274 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; | 280 | struct uart_sunsu_port *up = (struct uart_sunsu_port *) port; |
275 | 281 | ||
@@ -280,7 +286,7 @@ static void sunsu_start_tx(struct uart_port *port, unsigned int tty_start) | |||
280 | /* | 286 | /* |
281 | * We only do this from uart_start | 287 | * We only do this from uart_start |
282 | */ | 288 | */ |
283 | if (tty_start && up->port.type == PORT_16C950) { | 289 | if (tty_start && up->port.type == PORT_16C950 /*FIXME*/) { |
284 | up->acr &= ~UART_ACR_TXDIS; | 290 | up->acr &= ~UART_ACR_TXDIS; |
285 | serial_icr_write(up, UART_ACR, up->acr); | 291 | serial_icr_write(up, UART_ACR, up->acr); |
286 | } | 292 | } |
@@ -413,8 +419,12 @@ static _INLINE_ void transmit_chars(struct uart_sunsu_port *up) | |||
413 | up->port.x_char = 0; | 419 | up->port.x_char = 0; |
414 | return; | 420 | return; |
415 | } | 421 | } |
416 | if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { | 422 | if (uart_tx_stopped(&up->port)) { |
417 | sunsu_stop_tx(&up->port, 0); | 423 | sunsu_stop_tx(&up->port); |
424 | return; | ||
425 | } | ||
426 | if (uart_circ_empty(xmit)) { | ||
427 | __stop_tx(up); | ||
418 | return; | 428 | return; |
419 | } | 429 | } |
420 | 430 | ||
@@ -431,7 +441,7 @@ static _INLINE_ void transmit_chars(struct uart_sunsu_port *up) | |||
431 | uart_write_wakeup(&up->port); | 441 | uart_write_wakeup(&up->port); |
432 | 442 | ||
433 | if (uart_circ_empty(xmit)) | 443 | if (uart_circ_empty(xmit)) |
434 | sunsu_stop_tx(&up->port, 0); | 444 | __stop_tx(up); |
435 | } | 445 | } |
436 | 446 | ||
437 | static _INLINE_ void check_modem_status(struct uart_sunsu_port *up) | 447 | static _INLINE_ void check_modem_status(struct uart_sunsu_port *up) |
diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c index bff42a7b89d0..d75445738c88 100644 --- a/drivers/serial/sunzilog.c +++ b/drivers/serial/sunzilog.c | |||
@@ -684,7 +684,7 @@ static void sunzilog_set_mctrl(struct uart_port *port, unsigned int mctrl) | |||
684 | } | 684 | } |
685 | 685 | ||
686 | /* The port lock is held and interrupts are disabled. */ | 686 | /* The port lock is held and interrupts are disabled. */ |
687 | static void sunzilog_stop_tx(struct uart_port *port, unsigned int tty_stop) | 687 | static void sunzilog_stop_tx(struct uart_port *port) |
688 | { | 688 | { |
689 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 689 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
690 | 690 | ||
@@ -692,7 +692,7 @@ static void sunzilog_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
692 | } | 692 | } |
693 | 693 | ||
694 | /* The port lock is held and interrupts are disabled. */ | 694 | /* The port lock is held and interrupts are disabled. */ |
695 | static void sunzilog_start_tx(struct uart_port *port, unsigned int tty_start) | 695 | static void sunzilog_start_tx(struct uart_port *port) |
696 | { | 696 | { |
697 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; | 697 | struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port; |
698 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); | 698 | struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(port); |
diff --git a/drivers/serial/uart00.c b/drivers/serial/uart00.c index 186f1300cead..47b504ff38b2 100644 --- a/drivers/serial/uart00.c +++ b/drivers/serial/uart00.c | |||
@@ -87,7 +87,7 @@ | |||
87 | #define UART_TX_READY(s) (((s) & UART_TSR_TX_LEVEL_MSK) < 15) | 87 | #define UART_TX_READY(s) (((s) & UART_TSR_TX_LEVEL_MSK) < 15) |
88 | //#define UART_TX_EMPTY(p) ((UART_GET_FR(p) & UART00_UARTFR_TMSK) == 0) | 88 | //#define UART_TX_EMPTY(p) ((UART_GET_FR(p) & UART00_UARTFR_TMSK) == 0) |
89 | 89 | ||
90 | static void uart00_stop_tx(struct uart_port *port, unsigned int tty_stop) | 90 | static void uart00_stop_tx(struct uart_port *port) |
91 | { | 91 | { |
92 | UART_PUT_IEC(port, UART_IEC_TIE_MSK); | 92 | UART_PUT_IEC(port, UART_IEC_TIE_MSK); |
93 | } | 93 | } |
@@ -199,7 +199,7 @@ static void uart00_tx_chars(struct uart_port *port) | |||
199 | return; | 199 | return; |
200 | } | 200 | } |
201 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 201 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
202 | uart00_stop_tx(port, 0); | 202 | uart00_stop_tx(port); |
203 | return; | 203 | return; |
204 | } | 204 | } |
205 | 205 | ||
@@ -218,10 +218,10 @@ static void uart00_tx_chars(struct uart_port *port) | |||
218 | uart_write_wakeup(port); | 218 | uart_write_wakeup(port); |
219 | 219 | ||
220 | if (uart_circ_empty(xmit)) | 220 | if (uart_circ_empty(xmit)) |
221 | uart00_stop_tx(port, 0); | 221 | uart00_stop_tx(port); |
222 | } | 222 | } |
223 | 223 | ||
224 | static void uart00_start_tx(struct uart_port *port, unsigned int tty_start) | 224 | static void uart00_start_tx(struct uart_port *port) |
225 | { | 225 | { |
226 | UART_PUT_IES(port, UART_IES_TIE_MSK); | 226 | UART_PUT_IES(port, UART_IES_TIE_MSK); |
227 | uart00_tx_chars(port); | 227 | uart00_tx_chars(port); |
diff --git a/drivers/serial/v850e_uart.c b/drivers/serial/v850e_uart.c index bb482780a41d..9378895a8d56 100644 --- a/drivers/serial/v850e_uart.c +++ b/drivers/serial/v850e_uart.c | |||
@@ -240,7 +240,7 @@ console_initcall(v850e_uart_console_init); | |||
240 | 240 | ||
241 | /* TX/RX interrupt handlers. */ | 241 | /* TX/RX interrupt handlers. */ |
242 | 242 | ||
243 | static void v850e_uart_stop_tx (struct uart_port *port, unsigned tty_stop); | 243 | static void v850e_uart_stop_tx (struct uart_port *port); |
244 | 244 | ||
245 | void v850e_uart_tx (struct uart_port *port) | 245 | void v850e_uart_tx (struct uart_port *port) |
246 | { | 246 | { |
@@ -339,14 +339,14 @@ static unsigned v850e_uart_get_mctrl (struct uart_port *port) | |||
339 | return mctrl; | 339 | return mctrl; |
340 | } | 340 | } |
341 | 341 | ||
342 | static void v850e_uart_start_tx (struct uart_port *port, unsigned tty_start) | 342 | static void v850e_uart_start_tx (struct uart_port *port) |
343 | { | 343 | { |
344 | v850e_intc_disable_irq (V850E_UART_TX_IRQ (port->line)); | 344 | v850e_intc_disable_irq (V850E_UART_TX_IRQ (port->line)); |
345 | v850e_uart_tx (port); | 345 | v850e_uart_tx (port); |
346 | v850e_intc_enable_irq (V850E_UART_TX_IRQ (port->line)); | 346 | v850e_intc_enable_irq (V850E_UART_TX_IRQ (port->line)); |
347 | } | 347 | } |
348 | 348 | ||
349 | static void v850e_uart_stop_tx (struct uart_port *port, unsigned tty_stop) | 349 | static void v850e_uart_stop_tx (struct uart_port *port) |
350 | { | 350 | { |
351 | v850e_intc_disable_irq (V850E_UART_TX_IRQ (port->line)); | 351 | v850e_intc_disable_irq (V850E_UART_TX_IRQ (port->line)); |
352 | } | 352 | } |
diff --git a/drivers/serial/vr41xx_siu.c b/drivers/serial/vr41xx_siu.c index 1f985327b0d4..0c5d65a08f6e 100644 --- a/drivers/serial/vr41xx_siu.c +++ b/drivers/serial/vr41xx_siu.c | |||
@@ -284,7 +284,7 @@ static unsigned int siu_get_mctrl(struct uart_port *port) | |||
284 | return mctrl; | 284 | return mctrl; |
285 | } | 285 | } |
286 | 286 | ||
287 | static void siu_stop_tx(struct uart_port *port, unsigned int tty_stop) | 287 | static void siu_stop_tx(struct uart_port *port) |
288 | { | 288 | { |
289 | unsigned long flags; | 289 | unsigned long flags; |
290 | uint8_t ier; | 290 | uint8_t ier; |
@@ -298,7 +298,7 @@ static void siu_stop_tx(struct uart_port *port, unsigned int tty_stop) | |||
298 | spin_unlock_irqrestore(&port->lock, flags); | 298 | spin_unlock_irqrestore(&port->lock, flags); |
299 | } | 299 | } |
300 | 300 | ||
301 | static void siu_start_tx(struct uart_port *port, unsigned int tty_start) | 301 | static void siu_start_tx(struct uart_port *port) |
302 | { | 302 | { |
303 | unsigned long flags; | 303 | unsigned long flags; |
304 | uint8_t ier; | 304 | uint8_t ier; |
@@ -458,7 +458,7 @@ static inline void transmit_chars(struct uart_port *port) | |||
458 | } | 458 | } |
459 | 459 | ||
460 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { | 460 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { |
461 | siu_stop_tx(port, 0); | 461 | siu_stop_tx(port); |
462 | return; | 462 | return; |
463 | } | 463 | } |
464 | 464 | ||
@@ -474,7 +474,7 @@ static inline void transmit_chars(struct uart_port *port) | |||
474 | uart_write_wakeup(port); | 474 | uart_write_wakeup(port); |
475 | 475 | ||
476 | if (uart_circ_empty(xmit)) | 476 | if (uart_circ_empty(xmit)) |
477 | siu_stop_tx(port, 0); | 477 | siu_stop_tx(port); |
478 | } | 478 | } |
479 | 479 | ||
480 | static irqreturn_t siu_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 480 | static irqreturn_t siu_interrupt(int irq, void *dev_id, struct pt_regs *regs) |