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:
Коммит
f4f9c1ac78
|
@ -906,8 +906,8 @@ int hpet_alloc(struct hpet_data *hdp)
|
|||
hpetp->hp_which, hdp->hd_phys_address,
|
||||
hpetp->hp_ntimer > 1 ? "s" : "");
|
||||
for (i = 0; i < hpetp->hp_ntimer; i++)
|
||||
printk("%s %d", i > 0 ? "," : "", hdp->hd_irq[i]);
|
||||
printk("\n");
|
||||
printk(KERN_CONT "%s %d", i > 0 ? "," : "", hdp->hd_irq[i]);
|
||||
printk(KERN_CONT "\n");
|
||||
|
||||
temp = hpetp->hp_tick_freq;
|
||||
remainder = do_div(temp, 1000000);
|
||||
|
|
|
@ -176,7 +176,7 @@ static void if_close(struct tty_struct *tty, struct file *filp)
|
|||
struct cardstate *cs = tty->driver_data;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1572,13 +1572,11 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
|
|||
do {
|
||||
struct uart_8250_port *up;
|
||||
struct uart_port *port;
|
||||
bool skip;
|
||||
|
||||
up = list_entry(l, struct uart_8250_port, list);
|
||||
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;
|
||||
end = NULL;
|
||||
} else if (end == NULL)
|
||||
|
@ -2037,10 +2035,12 @@ static int serial8250_startup(struct uart_port *port)
|
|||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
/*
|
||||
* If the interrupt is not reasserted, setup a timer to
|
||||
* kick the UART on a regular basis.
|
||||
* If the interrupt is not reasserted, or we otherwise
|
||||
* 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;
|
||||
pr_debug("ttyS%d - using backup timer\n",
|
||||
serial_index(port));
|
||||
|
|
|
@ -1096,7 +1096,7 @@ static int kt_serial_setup(struct serial_private *priv,
|
|||
const struct pciserial_board *board,
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -1118,18 +1118,6 @@ pci_xr17c154_setup(struct serial_private *priv,
|
|||
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_SUBVENDOR_ID_SBSMODULARIO 0x124B
|
||||
#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,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.init = try_enable_msi,
|
||||
.setup = kt_serial_setup,
|
||||
.exit = disable_msi,
|
||||
},
|
||||
/*
|
||||
* ITE
|
||||
|
|
|
@ -1041,7 +1041,7 @@ config SERIAL_OMAP
|
|||
|
||||
config SERIAL_OMAP_CONSOLE
|
||||
bool "Console on OMAP serial port"
|
||||
depends on SERIAL_OMAP
|
||||
depends on SERIAL_OMAP=y
|
||||
select SERIAL_CORE_CONSOLE
|
||||
help
|
||||
Select this option if you would like to use omap serial port as
|
||||
|
|
|
@ -556,7 +556,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
|
|||
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res_mem)
|
||||
port->mapbase = res_mem->start;
|
||||
else if (platp->mapbase)
|
||||
else if (platp)
|
||||
port->mapbase = platp->mapbase;
|
||||
else
|
||||
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);
|
||||
if (res_irq)
|
||||
port->irq = res_irq->start;
|
||||
else if (platp->irq)
|
||||
else if (platp)
|
||||
port->irq = platp->irq;
|
||||
|
||||
/* Check platform data first so we can override device node data */
|
||||
|
|
|
@ -1946,10 +1946,6 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
|
|||
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->lcrh_rx = vendor->lcrh_rx;
|
||||
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;
|
||||
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));
|
||||
|
||||
amba_ports[i] = uap;
|
||||
|
|
|
@ -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_RXEN);
|
||||
|
||||
if (atmel_use_dma_rx(port)) {
|
||||
/* enable PDC controller */
|
||||
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)
|
||||
{
|
||||
UART_PUT_CR(port, ATMEL_US_RXDIS);
|
||||
|
||||
if (atmel_use_dma_rx(port)) {
|
||||
/* disable PDC receive */
|
||||
UART_PUT_PTCR(port, ATMEL_PDC_RXTDIS);
|
||||
|
|
|
@ -1381,29 +1381,24 @@ static int serial_omap_probe(struct platform_device *pdev)
|
|||
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)) {
|
||||
dev_err(&pdev->dev, "memory region already claimed\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
dma_rx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx");
|
||||
if (!dma_rx) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
if (!dma_rx)
|
||||
return -ENXIO;
|
||||
|
||||
dma_tx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
|
||||
if (!dma_tx) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
if (!dma_tx)
|
||||
return -ENXIO;
|
||||
|
||||
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->port.dev = &pdev->dev;
|
||||
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",
|
||||
up->port.line);
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
goto err_port_line;
|
||||
}
|
||||
|
||||
sprintf(up->name, "OMAP UART%d", up->port.line);
|
||||
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) {
|
||||
dev_err(&pdev->dev, "can't ioremap UART\n");
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
goto err_ioremap;
|
||||
}
|
||||
|
||||
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);
|
||||
if (ret != 0)
|
||||
goto do_release_region;
|
||||
goto err_add_port;
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
platform_set_drvdata(pdev, up);
|
||||
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",
|
||||
pdev->id, __func__, ret);
|
||||
do_release_region:
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1499,8 +1498,6 @@ static int serial_omap_remove(struct platform_device *dev)
|
|||
pm_runtime_disable(&up->pdev->dev);
|
||||
uart_remove_one_port(&serial_omap_reg, &up->port);
|
||||
pm_qos_remove_request(&up->pm_qos_request);
|
||||
|
||||
kfree(up);
|
||||
}
|
||||
|
||||
platform_set_drvdata(dev, NULL);
|
||||
|
|
|
@ -210,6 +210,7 @@ enum {
|
|||
#define CMITC_UARTCLK 192000000 /* 192.0000 MHz */
|
||||
#define FRI2_64_UARTCLK 64000000 /* 64.0000 MHz */
|
||||
#define FRI2_48_UARTCLK 48000000 /* 48.0000 MHz */
|
||||
#define NTC1_UARTCLK 64000000 /* 64.0000 MHz */
|
||||
|
||||
struct pch_uart_buffer {
|
||||
unsigned char *buf;
|
||||
|
@ -384,6 +385,12 @@ static int pch_uart_get_uartclk(void)
|
|||
if (cmp && strstr(cmp, "Fish River Island II"))
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1651,6 +1658,7 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
|
|||
}
|
||||
|
||||
pci_enable_msi(pdev);
|
||||
pci_set_master(pdev);
|
||||
|
||||
iobase = pci_resource_start(pdev, 0);
|
||||
mapbase = pci_resource_start(pdev, 1);
|
||||
|
|
|
@ -982,6 +982,7 @@ static void s3c24xx_serial_resetport(struct uart_port *port,
|
|||
|
||||
ucon &= ucon_mask;
|
||||
wr_regl(port, S3C2410_UCON, ucon | cfg->ucon);
|
||||
wr_regl(port, S3C2410_ULCON, cfg->ulcon);
|
||||
|
||||
/* reset both fifos */
|
||||
wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH);
|
||||
|
|
|
@ -2932,11 +2932,10 @@ static int __init con_init(void)
|
|||
gotoxy(vc, vc->vc_x, vc->vc_y);
|
||||
csi_J(vc, 0);
|
||||
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",
|
||||
display_desc, vc->vc_cols, vc->vc_rows);
|
||||
printable = 1;
|
||||
printk("\n");
|
||||
|
||||
console_unlock();
|
||||
|
||||
|
|
|
@ -357,7 +357,7 @@ struct uart_port {
|
|||
#define UPF_CONS_FLOW ((__force upf_t) (1 << 23))
|
||||
#define UPF_SHARE_IRQ ((__force upf_t) (1 << 24))
|
||||
#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. */
|
||||
#define UPF_FIXED_TYPE ((__force upf_t) (1 << 27))
|
||||
#define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28))
|
||||
|
|
Загрузка…
Ссылка в новой задаче