dect
/
linux-2.6
Archived
13
0
Fork 0

tty and serial fixes for 3.4-rc2

Here are some tty and serial fixes for 3.4-rc2.
 
 Most important here is the pl011 fix, which has been reported by about
 100 different people, which means more people use it than I expected :)
 
 There are also some 8250 driver reverts due to some problems reported by
 them.  And other minor fixes as well.
 
 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.18 (GNU/Linux)
 
 iEYEABECAAYFAk+HVDgACgkQMUfUDdst+ymKngCbBIqGrmq5PiDEV7JnkpLRcCEy
 DQoAn1XH+Y4NR0Wu121AkJ7UwE8CiXSg
 =h7iL
 -----END PGP SIGNATURE-----

Merge tag 'tty-3.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

Pull tty and serial fixes from Greg KH:
 "Here are some tty and serial fixes for 3.4-rc2.

  Most important here is the pl011 fix, which has been reported by about
  100 different people, which means more people use it than I expected
  :)

  There are also some 8250 driver reverts due to some problems reported
  by them.  And other minor fixes as well.

  Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>"

* tag 'tty-3.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  pch_uart: Add Kontron COMe-mTT10 uart clock quirk
  pch_uart: Fix MSI setting issue
  serial/8250_pci: add a "force background timer" flag and use it for the "kt" serial port
  Revert "serial/8250_pci: setup-quirk workaround for the kt serial controller"
  Revert "serial/8250_pci: init-quirk msi support for kt serial controller"
  tty/serial/omap: console can only be built-in
  serial: samsung: fix omission initialize ulcon in reset port fn()
  printk(): add KERN_CONT where needed in hpet and vt code
  tty/serial: atmel_serial: fix RS485 half-duplex problem
  tty: serial: altera_uart: Check for NULL platform_data in probe.
  isdn/gigaset: use gig_dbg() for debugging output
  omap-serial: Fix the error handling in the omap_serial probe
  serial: PL011: move interrupt clearing
This commit is contained in:
Linus Torvalds 2012-04-12 15:36:33 -07:00
commit f4f9c1ac78
13 changed files with 52 additions and 57 deletions

View File

@ -906,8 +906,8 @@ int hpet_alloc(struct hpet_data *hdp)
hpetp->hp_which, hdp->hd_phys_address, hpetp->hp_which, hdp->hd_phys_address,
hpetp->hp_ntimer > 1 ? "s" : ""); hpetp->hp_ntimer > 1 ? "s" : "");
for (i = 0; i < hpetp->hp_ntimer; i++) for (i = 0; i < hpetp->hp_ntimer; i++)
printk("%s %d", i > 0 ? "," : "", hdp->hd_irq[i]); printk(KERN_CONT "%s %d", i > 0 ? "," : "", hdp->hd_irq[i]);
printk("\n"); printk(KERN_CONT "\n");
temp = hpetp->hp_tick_freq; temp = hpetp->hp_tick_freq;
remainder = do_div(temp, 1000000); remainder = do_div(temp, 1000000);

View File

@ -176,7 +176,7 @@ static void if_close(struct tty_struct *tty, struct file *filp)
struct cardstate *cs = tty->driver_data; struct cardstate *cs = tty->driver_data;
if (!cs) { /* happens if we didn't find cs in open */ if (!cs) { /* happens if we didn't find cs in open */
printk(KERN_DEBUG "%s: no cardstate\n", __func__); gig_dbg(DEBUG_IF, "%s: no cardstate", __func__);
return; return;
} }

View File

@ -1572,13 +1572,11 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
do { do {
struct uart_8250_port *up; struct uart_8250_port *up;
struct uart_port *port; struct uart_port *port;
bool skip;
up = list_entry(l, struct uart_8250_port, list); up = list_entry(l, struct uart_8250_port, list);
port = &up->port; port = &up->port;
skip = pass_counter && up->port.flags & UPF_IIR_ONCE;
if (!skip && port->handle_irq(port)) { if (port->handle_irq(port)) {
handled = 1; handled = 1;
end = NULL; end = NULL;
} else if (end == NULL) } else if (end == NULL)
@ -2037,10 +2035,12 @@ static int serial8250_startup(struct uart_port *port)
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
/* /*
* If the interrupt is not reasserted, setup a timer to * If the interrupt is not reasserted, or we otherwise
* kick the UART on a regular basis. * don't trust the iir, setup a timer to kick the UART
* on a regular basis.
*/ */
if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) { if ((!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) ||
up->port.flags & UPF_BUG_THRE) {
up->bugs |= UART_BUG_THRE; up->bugs |= UART_BUG_THRE;
pr_debug("ttyS%d - using backup timer\n", pr_debug("ttyS%d - using backup timer\n",
serial_index(port)); serial_index(port));

View File

@ -1096,7 +1096,7 @@ static int kt_serial_setup(struct serial_private *priv,
const struct pciserial_board *board, const struct pciserial_board *board,
struct uart_port *port, int idx) struct uart_port *port, int idx)
{ {
port->flags |= UPF_IIR_ONCE; port->flags |= UPF_BUG_THRE;
return skip_tx_en_setup(priv, board, port, idx); return skip_tx_en_setup(priv, board, port, idx);
} }
@ -1118,18 +1118,6 @@ pci_xr17c154_setup(struct serial_private *priv,
return pci_default_setup(priv, board, port, idx); return pci_default_setup(priv, board, port, idx);
} }
static int try_enable_msi(struct pci_dev *dev)
{
/* use msi if available, but fallback to legacy otherwise */
pci_enable_msi(dev);
return 0;
}
static void disable_msi(struct pci_dev *dev)
{
pci_disable_msi(dev);
}
#define PCI_VENDOR_ID_SBSMODULARIO 0x124B #define PCI_VENDOR_ID_SBSMODULARIO 0x124B
#define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B #define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B
#define PCI_DEVICE_ID_OCTPRO 0x0001 #define PCI_DEVICE_ID_OCTPRO 0x0001
@ -1249,9 +1237,7 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
.device = PCI_DEVICE_ID_INTEL_PATSBURG_KT, .device = PCI_DEVICE_ID_INTEL_PATSBURG_KT,
.subvendor = PCI_ANY_ID, .subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
.init = try_enable_msi,
.setup = kt_serial_setup, .setup = kt_serial_setup,
.exit = disable_msi,
}, },
/* /*
* ITE * ITE

View File

@ -1041,7 +1041,7 @@ config SERIAL_OMAP
config SERIAL_OMAP_CONSOLE config SERIAL_OMAP_CONSOLE
bool "Console on OMAP serial port" bool "Console on OMAP serial port"
depends on SERIAL_OMAP depends on SERIAL_OMAP=y
select SERIAL_CORE_CONSOLE select SERIAL_CORE_CONSOLE
help help
Select this option if you would like to use omap serial port as Select this option if you would like to use omap serial port as

View File

@ -556,7 +556,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res_mem) if (res_mem)
port->mapbase = res_mem->start; port->mapbase = res_mem->start;
else if (platp->mapbase) else if (platp)
port->mapbase = platp->mapbase; port->mapbase = platp->mapbase;
else else
return -EINVAL; return -EINVAL;
@ -564,7 +564,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (res_irq) if (res_irq)
port->irq = res_irq->start; port->irq = res_irq->start;
else if (platp->irq) else if (platp)
port->irq = platp->irq; port->irq = platp->irq;
/* Check platform data first so we can override device node data */ /* Check platform data first so we can override device node data */

View File

@ -1946,10 +1946,6 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
goto unmap; goto unmap;
} }
/* Ensure interrupts from this UART are masked and cleared */
writew(0, uap->port.membase + UART011_IMSC);
writew(0xffff, uap->port.membase + UART011_ICR);
uap->vendor = vendor; uap->vendor = vendor;
uap->lcrh_rx = vendor->lcrh_rx; uap->lcrh_rx = vendor->lcrh_rx;
uap->lcrh_tx = vendor->lcrh_tx; uap->lcrh_tx = vendor->lcrh_tx;
@ -1967,6 +1963,10 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
uap->port.line = i; uap->port.line = i;
pl011_dma_probe(uap); pl011_dma_probe(uap);
/* Ensure interrupts from this UART are masked and cleared */
writew(0, uap->port.membase + UART011_IMSC);
writew(0xffff, uap->port.membase + UART011_ICR);
snprintf(uap->type, sizeof(uap->type), "PL011 rev%u", amba_rev(dev)); snprintf(uap->type, sizeof(uap->type), "PL011 rev%u", amba_rev(dev));
amba_ports[i] = uap; amba_ports[i] = uap;

View File

@ -389,6 +389,8 @@ static void atmel_start_rx(struct uart_port *port)
{ {
UART_PUT_CR(port, ATMEL_US_RSTSTA); /* reset status and receiver */ UART_PUT_CR(port, ATMEL_US_RSTSTA); /* reset status and receiver */
UART_PUT_CR(port, ATMEL_US_RXEN);
if (atmel_use_dma_rx(port)) { if (atmel_use_dma_rx(port)) {
/* enable PDC controller */ /* enable PDC controller */
UART_PUT_IER(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT | UART_PUT_IER(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT |
@ -404,6 +406,8 @@ static void atmel_start_rx(struct uart_port *port)
*/ */
static void atmel_stop_rx(struct uart_port *port) static void atmel_stop_rx(struct uart_port *port)
{ {
UART_PUT_CR(port, ATMEL_US_RXDIS);
if (atmel_use_dma_rx(port)) { if (atmel_use_dma_rx(port)) {
/* disable PDC receive */ /* disable PDC receive */
UART_PUT_PTCR(port, ATMEL_PDC_RXTDIS); UART_PUT_PTCR(port, ATMEL_PDC_RXTDIS);

View File

@ -1381,29 +1381,24 @@ static int serial_omap_probe(struct platform_device *pdev)
return -ENODEV; return -ENODEV;
} }
if (!request_mem_region(mem->start, resource_size(mem), if (!devm_request_mem_region(&pdev->dev, mem->start, resource_size(mem),
pdev->dev.driver->name)) { pdev->dev.driver->name)) {
dev_err(&pdev->dev, "memory region already claimed\n"); dev_err(&pdev->dev, "memory region already claimed\n");
return -EBUSY; return -EBUSY;
} }
dma_rx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); dma_rx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx");
if (!dma_rx) { if (!dma_rx)
ret = -EINVAL; return -ENXIO;
goto err;
}
dma_tx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); dma_tx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
if (!dma_tx) { if (!dma_tx)
ret = -EINVAL; return -ENXIO;
goto err;
} up = devm_kzalloc(&pdev->dev, sizeof(*up), GFP_KERNEL);
if (!up)
return -ENOMEM;
up = kzalloc(sizeof(*up), GFP_KERNEL);
if (up == NULL) {
ret = -ENOMEM;
goto do_release_region;
}
up->pdev = pdev; up->pdev = pdev;
up->port.dev = &pdev->dev; up->port.dev = &pdev->dev;
up->port.type = PORT_OMAP; up->port.type = PORT_OMAP;
@ -1423,16 +1418,17 @@ static int serial_omap_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "failed to get alias/pdev id, errno %d\n", dev_err(&pdev->dev, "failed to get alias/pdev id, errno %d\n",
up->port.line); up->port.line);
ret = -ENODEV; ret = -ENODEV;
goto err; goto err_port_line;
} }
sprintf(up->name, "OMAP UART%d", up->port.line); sprintf(up->name, "OMAP UART%d", up->port.line);
up->port.mapbase = mem->start; up->port.mapbase = mem->start;
up->port.membase = ioremap(mem->start, resource_size(mem)); up->port.membase = devm_ioremap(&pdev->dev, mem->start,
resource_size(mem));
if (!up->port.membase) { if (!up->port.membase) {
dev_err(&pdev->dev, "can't ioremap UART\n"); dev_err(&pdev->dev, "can't ioremap UART\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err; goto err_ioremap;
} }
up->port.flags = omap_up_info->flags; up->port.flags = omap_up_info->flags;
@ -1478,16 +1474,19 @@ static int serial_omap_probe(struct platform_device *pdev)
ret = uart_add_one_port(&serial_omap_reg, &up->port); ret = uart_add_one_port(&serial_omap_reg, &up->port);
if (ret != 0) if (ret != 0)
goto do_release_region; goto err_add_port;
pm_runtime_put(&pdev->dev); pm_runtime_put(&pdev->dev);
platform_set_drvdata(pdev, up); platform_set_drvdata(pdev, up);
return 0; return 0;
err:
err_add_port:
pm_runtime_put(&pdev->dev);
pm_runtime_disable(&pdev->dev);
err_ioremap:
err_port_line:
dev_err(&pdev->dev, "[UART%d]: failure [%s]: %d\n", dev_err(&pdev->dev, "[UART%d]: failure [%s]: %d\n",
pdev->id, __func__, ret); pdev->id, __func__, ret);
do_release_region:
release_mem_region(mem->start, resource_size(mem));
return ret; return ret;
} }
@ -1499,8 +1498,6 @@ static int serial_omap_remove(struct platform_device *dev)
pm_runtime_disable(&up->pdev->dev); pm_runtime_disable(&up->pdev->dev);
uart_remove_one_port(&serial_omap_reg, &up->port); uart_remove_one_port(&serial_omap_reg, &up->port);
pm_qos_remove_request(&up->pm_qos_request); pm_qos_remove_request(&up->pm_qos_request);
kfree(up);
} }
platform_set_drvdata(dev, NULL); platform_set_drvdata(dev, NULL);

View File

@ -210,6 +210,7 @@ enum {
#define CMITC_UARTCLK 192000000 /* 192.0000 MHz */ #define CMITC_UARTCLK 192000000 /* 192.0000 MHz */
#define FRI2_64_UARTCLK 64000000 /* 64.0000 MHz */ #define FRI2_64_UARTCLK 64000000 /* 64.0000 MHz */
#define FRI2_48_UARTCLK 48000000 /* 48.0000 MHz */ #define FRI2_48_UARTCLK 48000000 /* 48.0000 MHz */
#define NTC1_UARTCLK 64000000 /* 64.0000 MHz */
struct pch_uart_buffer { struct pch_uart_buffer {
unsigned char *buf; unsigned char *buf;
@ -384,6 +385,12 @@ static int pch_uart_get_uartclk(void)
if (cmp && strstr(cmp, "Fish River Island II")) if (cmp && strstr(cmp, "Fish River Island II"))
return FRI2_48_UARTCLK; return FRI2_48_UARTCLK;
/* Kontron COMe-mTT10 (nanoETXexpress-TT) */
cmp = dmi_get_system_info(DMI_BOARD_NAME);
if (cmp && (strstr(cmp, "COMe-mTT") ||
strstr(cmp, "nanoETXexpress-TT")))
return NTC1_UARTCLK;
return DEFAULT_UARTCLK; return DEFAULT_UARTCLK;
} }
@ -1651,6 +1658,7 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
} }
pci_enable_msi(pdev); pci_enable_msi(pdev);
pci_set_master(pdev);
iobase = pci_resource_start(pdev, 0); iobase = pci_resource_start(pdev, 0);
mapbase = pci_resource_start(pdev, 1); mapbase = pci_resource_start(pdev, 1);

View File

@ -982,6 +982,7 @@ static void s3c24xx_serial_resetport(struct uart_port *port,
ucon &= ucon_mask; ucon &= ucon_mask;
wr_regl(port, S3C2410_UCON, ucon | cfg->ucon); wr_regl(port, S3C2410_UCON, ucon | cfg->ucon);
wr_regl(port, S3C2410_ULCON, cfg->ulcon);
/* reset both fifos */ /* reset both fifos */
wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH);

View File

@ -2932,11 +2932,10 @@ static int __init con_init(void)
gotoxy(vc, vc->vc_x, vc->vc_y); gotoxy(vc, vc->vc_x, vc->vc_y);
csi_J(vc, 0); csi_J(vc, 0);
update_screen(vc); update_screen(vc);
pr_info("Console: %s %s %dx%d", pr_info("Console: %s %s %dx%d\n",
vc->vc_can_do_color ? "colour" : "mono", vc->vc_can_do_color ? "colour" : "mono",
display_desc, vc->vc_cols, vc->vc_rows); display_desc, vc->vc_cols, vc->vc_rows);
printable = 1; printable = 1;
printk("\n");
console_unlock(); console_unlock();

View File

@ -357,7 +357,7 @@ struct uart_port {
#define UPF_CONS_FLOW ((__force upf_t) (1 << 23)) #define UPF_CONS_FLOW ((__force upf_t) (1 << 23))
#define UPF_SHARE_IRQ ((__force upf_t) (1 << 24)) #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24))
#define UPF_EXAR_EFR ((__force upf_t) (1 << 25)) #define UPF_EXAR_EFR ((__force upf_t) (1 << 25))
#define UPF_IIR_ONCE ((__force upf_t) (1 << 26)) #define UPF_BUG_THRE ((__force upf_t) (1 << 26))
/* The exact UART type is known and should not be probed. */ /* The exact UART type is known and should not be probed. */
#define UPF_FIXED_TYPE ((__force upf_t) (1 << 27)) #define UPF_FIXED_TYPE ((__force upf_t) (1 << 27))
#define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28)) #define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28))