diff options
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/8250.c | 17 | ||||
-rw-r--r-- | drivers/serial/8250_pci.c | 50 | ||||
-rw-r--r-- | drivers/serial/8250_pnp.c | 2 | ||||
-rw-r--r-- | drivers/serial/Kconfig | 2 | ||||
-rw-r--r-- | drivers/serial/atmel_serial.c | 6 | ||||
-rw-r--r-- | drivers/serial/jsm/jsm_driver.c | 5 | ||||
-rw-r--r-- | drivers/serial/jsm/jsm_neo.c | 3 | ||||
-rw-r--r-- | drivers/serial/jsm/jsm_tty.c | 6 | ||||
-rw-r--r-- | drivers/serial/mcf.c | 11 | ||||
-rw-r--r-- | drivers/serial/of_serial.c | 1 | ||||
-rw-r--r-- | drivers/serial/pnx8xxx_uart.c | 23 | ||||
-rw-r--r-- | drivers/serial/sh-sci.h | 7 |
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 | ||
2119 | dont_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 | ||
801 | static 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 | ||
2150 | static struct pci_device_id serial_pci_tbl[] = { | 2192 | static 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 | ||
983 | config SERIAL_PNX8XXX | 983 | config 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 | ||
183 | static void jsm_remove_one(struct pci_dev *pdev) | 185 | static 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 | }; |
217 | MODULE_DEVICE_TABLE(pci, jsm_pci_tbl); | 220 | MODULE_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 | ||
164 | static void jsm_tty_enable_ms(struct uart_port *port) | ||
165 | { | ||
166 | /* Nothing needed */ | ||
167 | } | ||
168 | |||
164 | static void jsm_tty_break(struct uart_port *port, int break_state) | 169 | static 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) | |||
393 | SCIx_FNS(SCxTDR, 0x20, 8, 0x0c, 8) | 395 | SCIx_FNS(SCxTDR, 0x20, 8, 0x0c, 8) |
394 | SCIx_FNS(SCxSR, 0x14, 16, 0x10, 16) | 396 | SCIx_FNS(SCxSR, 0x14, 16, 0x10, 16) |
395 | SCIx_FNS(SCxRDR, 0x24, 8, 0x14, 8) | 397 | SCIx_FNS(SCxRDR, 0x24, 8, 0x14, 8) |
398 | SCIx_FNS(SCSPTR, 0, 0, 0, 0) | ||
396 | SCIF_FNS(SCTDSR, 0x0c, 8) | 399 | SCIF_FNS(SCTDSR, 0x0c, 8) |
397 | SCIF_FNS(SCFER, 0x10, 16) | 400 | SCIF_FNS(SCFER, 0x10, 16) |
398 | SCIF_FNS(SCFCR, 0x18, 16) | 401 | SCIF_FNS(SCFCR, 0x18, 16) |