aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/8250.c17
-rw-r--r--drivers/serial/8250_pci.c50
-rw-r--r--drivers/serial/8250_pnp.c2
-rw-r--r--drivers/serial/Kconfig2
-rw-r--r--drivers/serial/atmel_serial.c6
-rw-r--r--drivers/serial/jsm/jsm_driver.c5
-rw-r--r--drivers/serial/jsm/jsm_neo.c3
-rw-r--r--drivers/serial/jsm/jsm_tty.c6
-rw-r--r--drivers/serial/mcf.c11
-rw-r--r--drivers/serial/of_serial.c1
-rw-r--r--drivers/serial/pnx8xxx_uart.c23
-rw-r--r--drivers/serial/sh-sci.h7
12 files changed, 114 insertions, 19 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 1889a63ebc22..b4b39811b445 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2083,6 +2083,20 @@ static int serial8250_startup(struct uart_port *port)
2083 2083
2084 serial8250_set_mctrl(&up->port, up->port.mctrl); 2084 serial8250_set_mctrl(&up->port, up->port.mctrl);
2085 2085
2086 /* Serial over Lan (SoL) hack:
2087 Intel 8257x Gigabit ethernet chips have a
2088 16550 emulation, to be used for Serial Over Lan.
2089 Those chips take a longer time than a normal
2090 serial device to signalize that a transmission
2091 data was queued. Due to that, the above test generally
2092 fails. One solution would be to delay the reading of
2093 iir. However, this is not reliable, since the timeout
2094 is variable. So, let's just don't test if we receive
2095 TX irq. This way, we'll never enable UART_BUG_TXEN.
2096 */
2097 if (up->port.flags & UPF_NO_TXEN_TEST)
2098 goto dont_test_tx_en;
2099
2086 /* 2100 /*
2087 * Do a quick test to see if we receive an 2101 * Do a quick test to see if we receive an
2088 * interrupt when we enable the TX irq. 2102 * interrupt when we enable the TX irq.
@@ -2102,6 +2116,7 @@ static int serial8250_startup(struct uart_port *port)
2102 up->bugs &= ~UART_BUG_TXEN; 2116 up->bugs &= ~UART_BUG_TXEN;
2103 } 2117 }
2104 2118
2119dont_test_tx_en:
2105 spin_unlock_irqrestore(&up->port.lock, flags); 2120 spin_unlock_irqrestore(&up->port.lock, flags);
2106 2121
2107 /* 2122 /*
@@ -2839,6 +2854,8 @@ int __init early_serial_setup(struct uart_port *port)
2839 p->flags = port->flags; 2854 p->flags = port->flags;
2840 p->mapbase = port->mapbase; 2855 p->mapbase = port->mapbase;
2841 p->private_data = port->private_data; 2856 p->private_data = port->private_data;
2857 p->type = port->type;
2858 p->line = port->line;
2842 2859
2843 set_io_from_upio(p); 2860 set_io_from_upio(p);
2844 if (port->serial_in) 2861 if (port->serial_in)
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
index c088146b7513..533f82025adf 100644
--- a/drivers/serial/8250_pci.c
+++ b/drivers/serial/8250_pci.c
@@ -602,6 +602,10 @@ static int pci_netmos_init(struct pci_dev *dev)
602 /* subdevice 0x00PS means <P> parallel, <S> serial */ 602 /* subdevice 0x00PS means <P> parallel, <S> serial */
603 unsigned int num_serial = dev->subsystem_device & 0xf; 603 unsigned int num_serial = dev->subsystem_device & 0xf;
604 604
605 if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
606 dev->subsystem_device == 0x0299)
607 return 0;
608
605 if (num_serial == 0) 609 if (num_serial == 0)
606 return -ENODEV; 610 return -ENODEV;
607 return num_serial; 611 return num_serial;
@@ -794,6 +798,21 @@ pci_default_setup(struct serial_private *priv,
794 return setup_port(priv, port, bar, offset, board->reg_shift); 798 return setup_port(priv, port, bar, offset, board->reg_shift);
795} 799}
796 800
801static int skip_tx_en_setup(struct serial_private *priv,
802 const struct pciserial_board *board,
803 struct uart_port *port, int idx)
804{
805 port->flags |= UPF_NO_TXEN_TEST;
806 printk(KERN_DEBUG "serial8250: skipping TxEn test for device "
807 "[%04x:%04x] subsystem [%04x:%04x]\n",
808 priv->dev->vendor,
809 priv->dev->device,
810 priv->dev->subsystem_vendor,
811 priv->dev->subsystem_device);
812
813 return pci_default_setup(priv, board, port, idx);
814}
815
797/* This should be in linux/pci_ids.h */ 816/* This should be in linux/pci_ids.h */
798#define PCI_VENDOR_ID_SBSMODULARIO 0x124B 817#define PCI_VENDOR_ID_SBSMODULARIO 0x124B
799#define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B 818#define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B
@@ -802,6 +821,8 @@ pci_default_setup(struct serial_private *priv,
802#define PCI_SUBDEVICE_ID_OCTPRO422 0x0208 821#define PCI_SUBDEVICE_ID_OCTPRO422 0x0208
803#define PCI_SUBDEVICE_ID_POCTAL232 0x0308 822#define PCI_SUBDEVICE_ID_POCTAL232 0x0308
804#define PCI_SUBDEVICE_ID_POCTAL422 0x0408 823#define PCI_SUBDEVICE_ID_POCTAL422 0x0408
824#define PCI_VENDOR_ID_ADVANTECH 0x13fe
825#define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620
805 826
806/* Unknown vendors/cards - this should not be in linux/pci_ids.h */ 827/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
807#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 828#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
@@ -858,6 +879,27 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
858 .init = pci_inteli960ni_init, 879 .init = pci_inteli960ni_init,
859 .setup = pci_default_setup, 880 .setup = pci_default_setup,
860 }, 881 },
882 {
883 .vendor = PCI_VENDOR_ID_INTEL,
884 .device = PCI_DEVICE_ID_INTEL_8257X_SOL,
885 .subvendor = PCI_ANY_ID,
886 .subdevice = PCI_ANY_ID,
887 .setup = skip_tx_en_setup,
888 },
889 {
890 .vendor = PCI_VENDOR_ID_INTEL,
891 .device = PCI_DEVICE_ID_INTEL_82573L_SOL,
892 .subvendor = PCI_ANY_ID,
893 .subdevice = PCI_ANY_ID,
894 .setup = skip_tx_en_setup,
895 },
896 {
897 .vendor = PCI_VENDOR_ID_INTEL,
898 .device = PCI_DEVICE_ID_INTEL_82573E_SOL,
899 .subvendor = PCI_ANY_ID,
900 .subdevice = PCI_ANY_ID,
901 .setup = skip_tx_en_setup,
902 },
861 /* 903 /*
862 * ITE 904 * ITE
863 */ 905 */
@@ -2148,6 +2190,10 @@ static int pciserial_resume_one(struct pci_dev *dev)
2148#endif 2190#endif
2149 2191
2150static struct pci_device_id serial_pci_tbl[] = { 2192static struct pci_device_id serial_pci_tbl[] = {
2193 /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */
2194 { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620,
2195 PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0,
2196 pbn_b2_8_921600 },
2151 { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960, 2197 { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
2152 PCI_SUBVENDOR_ID_CONNECT_TECH, 2198 PCI_SUBVENDOR_ID_CONNECT_TECH,
2153 PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0, 2199 PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0,
@@ -3096,6 +3142,10 @@ static struct pci_device_id serial_pci_tbl[] = {
3096 0, 3142 0,
3097 pbn_b0_8_115200 }, 3143 pbn_b0_8_115200 },
3098 3144
3145 { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
3146 PCI_VENDOR_ID_IBM, 0x0299,
3147 0, 0, pbn_b0_bt_2_115200 },
3148
3099 /* 3149 /*
3100 * These entries match devices with class COMMUNICATION_SERIAL, 3150 * These entries match devices with class COMMUNICATION_SERIAL,
3101 * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL 3151 * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c
index fde7f9ccf57e..bbcfc26a3b6d 100644
--- a/drivers/serial/8250_pnp.c
+++ b/drivers/serial/8250_pnp.c
@@ -270,6 +270,8 @@ static const struct pnp_device_id pnp_dev_table[] = {
270 { "RSS0250", 0 }, 270 { "RSS0250", 0 },
271 /* SupraExpress 28.8 Data/Fax PnP modem */ 271 /* SupraExpress 28.8 Data/Fax PnP modem */
272 { "SUP1310", 0 }, 272 { "SUP1310", 0 },
273 /* SupraExpress 336i PnP Voice Modem */
274 { "SUP1381", 0 },
273 /* SupraExpress 33.6 Data/Fax PnP modem */ 275 /* SupraExpress 33.6 Data/Fax PnP modem */
274 { "SUP1421", 0 }, 276 { "SUP1421", 0 },
275 /* SupraExpress 33.6 Data/Fax PnP modem */ 277 /* SupraExpress 33.6 Data/Fax PnP modem */
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 3e525e38a5d9..7d7f576da202 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -982,7 +982,7 @@ config SERIAL_SH_SCI_CONSOLE
982 982
983config SERIAL_PNX8XXX 983config SERIAL_PNX8XXX
984 bool "Enable PNX8XXX SoCs' UART Support" 984 bool "Enable PNX8XXX SoCs' UART Support"
985 depends on MIPS && SOC_PNX8550 985 depends on MIPS && (SOC_PNX8550 || SOC_PNX833X)
986 select SERIAL_CORE 986 select SERIAL_CORE
987 help 987 help
988 If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330 988 If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c
index d5efd6c77904..8f58f7ff0dd7 100644
--- a/drivers/serial/atmel_serial.c
+++ b/drivers/serial/atmel_serial.c
@@ -579,7 +579,7 @@ static void atmel_tx_dma(struct uart_port *port)
579 /* disable PDC transmit */ 579 /* disable PDC transmit */
580 UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS); 580 UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS);
581 581
582 if (!uart_circ_empty(xmit)) { 582 if (!uart_circ_empty(xmit) && !uart_tx_stopped(port)) {
583 dma_sync_single_for_device(port->dev, 583 dma_sync_single_for_device(port->dev,
584 pdc->dma_addr, 584 pdc->dma_addr,
585 pdc->dma_size, 585 pdc->dma_size,
@@ -877,6 +877,10 @@ static int atmel_startup(struct uart_port *port)
877 } 877 }
878 } 878 }
879 879
880 /* Save current CSR for comparison in atmel_tasklet_func() */
881 atmel_port->irq_status_prev = UART_GET_CSR(port);
882 atmel_port->irq_status = atmel_port->irq_status_prev;
883
880 /* 884 /*
881 * Finally, enable the serial port 885 * Finally, enable the serial port
882 */ 886 */
diff --git a/drivers/serial/jsm/jsm_driver.c b/drivers/serial/jsm/jsm_driver.c
index 338cf8a08b43..ac79cbe4c2cf 100644
--- a/drivers/serial/jsm/jsm_driver.c
+++ b/drivers/serial/jsm/jsm_driver.c
@@ -84,6 +84,8 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
84 brd->pci_dev = pdev; 84 brd->pci_dev = pdev;
85 if (pdev->device == PCIE_DEVICE_ID_NEO_4_IBM) 85 if (pdev->device == PCIE_DEVICE_ID_NEO_4_IBM)
86 brd->maxports = 4; 86 brd->maxports = 4;
87 else if (pdev->device == PCI_DEVICE_ID_DIGI_NEO_8)
88 brd->maxports = 8;
87 else 89 else
88 brd->maxports = 2; 90 brd->maxports = 2;
89 91
@@ -180,7 +182,7 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
180 return rc; 182 return rc;
181} 183}
182 184
183static void jsm_remove_one(struct pci_dev *pdev) 185static void __devexit jsm_remove_one(struct pci_dev *pdev)
184{ 186{
185 struct jsm_board *brd = pci_get_drvdata(pdev); 187 struct jsm_board *brd = pci_get_drvdata(pdev);
186 int i = 0; 188 int i = 0;
@@ -212,6 +214,7 @@ static struct pci_device_id jsm_pci_tbl[] = {
212 { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 }, 214 { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 },
213 { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 }, 215 { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 },
214 { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 }, 216 { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 },
217 { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_NEO_8), 0, 0, 5 },
215 { 0, } 218 { 0, }
216}; 219};
217MODULE_DEVICE_TABLE(pci, jsm_pci_tbl); 220MODULE_DEVICE_TABLE(pci, jsm_pci_tbl);
diff --git a/drivers/serial/jsm/jsm_neo.c b/drivers/serial/jsm/jsm_neo.c
index b7584ca55ade..e6390d023634 100644
--- a/drivers/serial/jsm/jsm_neo.c
+++ b/drivers/serial/jsm/jsm_neo.c
@@ -577,9 +577,6 @@ static void neo_parse_modem(struct jsm_channel *ch, u8 signals)
577 jsm_printk(MSIGS, INFO, &ch->ch_bd->pci_dev, 577 jsm_printk(MSIGS, INFO, &ch->ch_bd->pci_dev,
578 "neo_parse_modem: port: %d msignals: %x\n", ch->ch_portnum, msignals); 578 "neo_parse_modem: port: %d msignals: %x\n", ch->ch_portnum, msignals);
579 579
580 if (!ch)
581 return;
582
583 /* Scrub off lower bits. They signify delta's, which I don't care about */ 580 /* Scrub off lower bits. They signify delta's, which I don't care about */
584 /* Keep DDCD and DDSR though */ 581 /* Keep DDCD and DDSR though */
585 msignals &= 0xf8; 582 msignals &= 0xf8;
diff --git a/drivers/serial/jsm/jsm_tty.c b/drivers/serial/jsm/jsm_tty.c
index 3547558d2caf..324c74d2f666 100644
--- a/drivers/serial/jsm/jsm_tty.c
+++ b/drivers/serial/jsm/jsm_tty.c
@@ -161,6 +161,11 @@ static void jsm_tty_stop_rx(struct uart_port *port)
161 channel->ch_bd->bd_ops->disable_receiver(channel); 161 channel->ch_bd->bd_ops->disable_receiver(channel);
162} 162}
163 163
164static void jsm_tty_enable_ms(struct uart_port *port)
165{
166 /* Nothing needed */
167}
168
164static void jsm_tty_break(struct uart_port *port, int break_state) 169static void jsm_tty_break(struct uart_port *port, int break_state)
165{ 170{
166 unsigned long lock_flags; 171 unsigned long lock_flags;
@@ -345,6 +350,7 @@ static struct uart_ops jsm_ops = {
345 .start_tx = jsm_tty_start_tx, 350 .start_tx = jsm_tty_start_tx,
346 .send_xchar = jsm_tty_send_xchar, 351 .send_xchar = jsm_tty_send_xchar,
347 .stop_rx = jsm_tty_stop_rx, 352 .stop_rx = jsm_tty_stop_rx,
353 .enable_ms = jsm_tty_enable_ms,
348 .break_ctl = jsm_tty_break, 354 .break_ctl = jsm_tty_break,
349 .startup = jsm_tty_open, 355 .startup = jsm_tty_open,
350 .shutdown = jsm_tty_close, 356 .shutdown = jsm_tty_close,
diff --git a/drivers/serial/mcf.c b/drivers/serial/mcf.c
index b2001c5b145c..56841fe5f483 100644
--- a/drivers/serial/mcf.c
+++ b/drivers/serial/mcf.c
@@ -212,10 +212,18 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
212{ 212{
213 unsigned long flags; 213 unsigned long flags;
214 unsigned int baud, baudclk; 214 unsigned int baud, baudclk;
215#if defined(CONFIG_M5272)
216 unsigned int baudfr;
217#endif
215 unsigned char mr1, mr2; 218 unsigned char mr1, mr2;
216 219
217 baud = uart_get_baud_rate(port, termios, old, 0, 230400); 220 baud = uart_get_baud_rate(port, termios, old, 0, 230400);
221#if defined(CONFIG_M5272)
222 baudclk = (MCF_BUSCLK / baud) / 32;
223 baudfr = (((MCF_BUSCLK / baud) + 1) / 2) % 16;
224#else
218 baudclk = ((MCF_BUSCLK / baud) + 16) / 32; 225 baudclk = ((MCF_BUSCLK / baud) + 16) / 32;
226#endif
219 227
220 mr1 = MCFUART_MR1_RXIRQRDY | MCFUART_MR1_RXERRCHAR; 228 mr1 = MCFUART_MR1_RXIRQRDY | MCFUART_MR1_RXERRCHAR;
221 mr2 = 0; 229 mr2 = 0;
@@ -262,6 +270,9 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
262 writeb(mr2, port->membase + MCFUART_UMR); 270 writeb(mr2, port->membase + MCFUART_UMR);
263 writeb((baudclk & 0xff00) >> 8, port->membase + MCFUART_UBG1); 271 writeb((baudclk & 0xff00) >> 8, port->membase + MCFUART_UBG1);
264 writeb((baudclk & 0xff), port->membase + MCFUART_UBG2); 272 writeb((baudclk & 0xff), port->membase + MCFUART_UBG2);
273#if defined(CONFIG_M5272)
274 writeb((baudfr & 0x0f), port->membase + MCFUART_UFPD);
275#endif
265 writeb(MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER, 276 writeb(MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER,
266 port->membase + MCFUART_UCSR); 277 port->membase + MCFUART_UCSR);
267 writeb(MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE, 278 writeb(MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE,
diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c
index a821e3a3d664..14f8fa9135be 100644
--- a/drivers/serial/of_serial.c
+++ b/drivers/serial/of_serial.c
@@ -163,6 +163,7 @@ static struct of_device_id __devinitdata of_platform_serial_table[] = {
163 { .type = "serial", .compatible = "ns16450", .data = (void *)PORT_16450, }, 163 { .type = "serial", .compatible = "ns16450", .data = (void *)PORT_16450, },
164 { .type = "serial", .compatible = "ns16550", .data = (void *)PORT_16550, }, 164 { .type = "serial", .compatible = "ns16550", .data = (void *)PORT_16550, },
165 { .type = "serial", .compatible = "ns16750", .data = (void *)PORT_16750, }, 165 { .type = "serial", .compatible = "ns16750", .data = (void *)PORT_16750, },
166 { .type = "serial", .compatible = "ns16850", .data = (void *)PORT_16850, },
166#ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL 167#ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL
167 { .type = "serial", .compatible = "ibm,qpace-nwp-serial", 168 { .type = "serial", .compatible = "ibm,qpace-nwp-serial",
168 .data = (void *)PORT_NWPSERIAL, }, 169 .data = (void *)PORT_NWPSERIAL, },
diff --git a/drivers/serial/pnx8xxx_uart.c b/drivers/serial/pnx8xxx_uart.c
index 22e30d21225e..1bb8f1b45767 100644
--- a/drivers/serial/pnx8xxx_uart.c
+++ b/drivers/serial/pnx8xxx_uart.c
@@ -187,7 +187,7 @@ static void pnx8xxx_rx_chars(struct pnx8xxx_port *sport)
187 status = FIFO_TO_SM(serial_in(sport, PNX8XXX_FIFO)) | 187 status = FIFO_TO_SM(serial_in(sport, PNX8XXX_FIFO)) |
188 ISTAT_TO_SM(serial_in(sport, PNX8XXX_ISTAT)); 188 ISTAT_TO_SM(serial_in(sport, PNX8XXX_ISTAT));
189 while (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFIFO)) { 189 while (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFIFO)) {
190 ch = serial_in(sport, PNX8XXX_FIFO); 190 ch = serial_in(sport, PNX8XXX_FIFO) & 0xff;
191 191
192 sport->port.icount.rx++; 192 sport->port.icount.rx++;
193 193
@@ -198,9 +198,16 @@ static void pnx8xxx_rx_chars(struct pnx8xxx_port *sport)
198 * out of the main execution path 198 * out of the main execution path
199 */ 199 */
200 if (status & (FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE | 200 if (status & (FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE |
201 PNX8XXX_UART_FIFO_RXPAR) | 201 PNX8XXX_UART_FIFO_RXPAR |
202 PNX8XXX_UART_FIFO_RXBRK) |
202 ISTAT_TO_SM(PNX8XXX_UART_INT_RXOVRN))) { 203 ISTAT_TO_SM(PNX8XXX_UART_INT_RXOVRN))) {
203 if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR)) 204 if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXBRK)) {
205 status &= ~(FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE) |
206 FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR));
207 sport->port.icount.brk++;
208 if (uart_handle_break(&sport->port))
209 goto ignore_char;
210 } else if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR))
204 sport->port.icount.parity++; 211 sport->port.icount.parity++;
205 else if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE)) 212 else if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE))
206 sport->port.icount.frame++; 213 sport->port.icount.frame++;
@@ -284,14 +291,8 @@ static irqreturn_t pnx8xxx_int(int irq, void *dev_id)
284 /* Get the interrupts */ 291 /* Get the interrupts */
285 status = serial_in(sport, PNX8XXX_ISTAT) & serial_in(sport, PNX8XXX_IEN); 292 status = serial_in(sport, PNX8XXX_ISTAT) & serial_in(sport, PNX8XXX_IEN);
286 293
287 /* Break signal received */ 294 /* Byte or break signal received */
288 if (status & PNX8XXX_UART_INT_BREAK) { 295 if (status & (PNX8XXX_UART_INT_RX | PNX8XXX_UART_INT_BREAK))
289 sport->port.icount.brk++;
290 uart_handle_break(&sport->port);
291 }
292
293 /* Byte received */
294 if (status & PNX8XXX_UART_INT_RX)
295 pnx8xxx_rx_chars(sport); 296 pnx8xxx_rx_chars(sport);
296 297
297 /* TX holding register empty - transmit a byte */ 298 /* TX holding register empty - transmit a byte */
diff --git a/drivers/serial/sh-sci.h b/drivers/serial/sh-sci.h
index 38c600c0dbbf..022e89ffec1d 100644
--- a/drivers/serial/sh-sci.h
+++ b/drivers/serial/sh-sci.h
@@ -32,7 +32,9 @@
32#elif defined(CONFIG_CPU_SUBTYPE_SH7720) || \ 32#elif defined(CONFIG_CPU_SUBTYPE_SH7720) || \
33 defined(CONFIG_CPU_SUBTYPE_SH7721) 33 defined(CONFIG_CPU_SUBTYPE_SH7721)
34# define SCSCR_INIT(port) 0x0030 /* TIE=0,RIE=0,TE=1,RE=1 */ 34# define SCSCR_INIT(port) 0x0030 /* TIE=0,RIE=0,TE=1,RE=1 */
35#define SCIF_ORER 0x0200 /* overrun error bit */ 35# define PORT_PTCR 0xA405011EUL
36# define PORT_PVCR 0xA4050122UL
37# define SCIF_ORER 0x0200 /* overrun error bit */
36#elif defined(CONFIG_SH_RTS7751R2D) 38#elif defined(CONFIG_SH_RTS7751R2D)
37# define SCSPTR1 0xFFE0001C /* 8 bit SCIF */ 39# define SCSPTR1 0xFFE0001C /* 8 bit SCIF */
38# define SCSPTR2 0xFFE80020 /* 16 bit SCIF */ 40# define SCSPTR2 0xFFE80020 /* 16 bit SCIF */
@@ -131,7 +133,7 @@
131# define SCSPTR3 0xffed0024 /* 16 bit SCIF */ 133# define SCSPTR3 0xffed0024 /* 16 bit SCIF */
132# define SCSPTR4 0xffee0024 /* 16 bit SCIF */ 134# define SCSPTR4 0xffee0024 /* 16 bit SCIF */
133# define SCSPTR5 0xffef0024 /* 16 bit SCIF */ 135# define SCSPTR5 0xffef0024 /* 16 bit SCIF */
134# define SCIF_OPER 0x0001 /* Overrun error bit */ 136# define SCIF_ORER 0x0001 /* Overrun error bit */
135# define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ 137# define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
136#elif defined(CONFIG_CPU_SUBTYPE_SH7201) || \ 138#elif defined(CONFIG_CPU_SUBTYPE_SH7201) || \
137 defined(CONFIG_CPU_SUBTYPE_SH7203) || \ 139 defined(CONFIG_CPU_SUBTYPE_SH7203) || \
@@ -393,6 +395,7 @@ SCIx_FNS(SCSCR, 0x08, 16, 0x08, 16)
393SCIx_FNS(SCxTDR, 0x20, 8, 0x0c, 8) 395SCIx_FNS(SCxTDR, 0x20, 8, 0x0c, 8)
394SCIx_FNS(SCxSR, 0x14, 16, 0x10, 16) 396SCIx_FNS(SCxSR, 0x14, 16, 0x10, 16)
395SCIx_FNS(SCxRDR, 0x24, 8, 0x14, 8) 397SCIx_FNS(SCxRDR, 0x24, 8, 0x14, 8)
398SCIx_FNS(SCSPTR, 0, 0, 0, 0)
396SCIF_FNS(SCTDSR, 0x0c, 8) 399SCIF_FNS(SCTDSR, 0x0c, 8)
397SCIF_FNS(SCFER, 0x10, 16) 400SCIF_FNS(SCFER, 0x10, 16)
398SCIF_FNS(SCFCR, 0x18, 16) 401SCIF_FNS(SCFCR, 0x18, 16)