Merge branch 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6
* 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: omap-serial: Allow IXON and IXOFF to be disabled. TTY: serial, document ignoring of uart->ops->startup error TTY: pty, fix pty counting 8250: Fix race condition in serial8250_backup_timeout(). serial/8250_pci: delete duplicate data definition 8250_pci: add support for Rosewill RC-305 4x serial port card tty: Add "spi:" prefix for spi modalias atmel_serial: fix atmel_default_console_device serial: 8250_pnp: add Intermec CV60 touchscreen device drivers/serial/ucc_uart.c: Fix compiler warning pch_uart: Set PCIe bus number using probe parameter serial: samsung: Fix build errorhifive-unleashed-5.1
commit
efe45ab1ee
|
@ -446,8 +446,19 @@ static inline void legacy_pty_init(void) { }
|
||||||
int pty_limit = NR_UNIX98_PTY_DEFAULT;
|
int pty_limit = NR_UNIX98_PTY_DEFAULT;
|
||||||
static int pty_limit_min;
|
static int pty_limit_min;
|
||||||
static int pty_limit_max = NR_UNIX98_PTY_MAX;
|
static int pty_limit_max = NR_UNIX98_PTY_MAX;
|
||||||
|
static int tty_count;
|
||||||
static int pty_count;
|
static int pty_count;
|
||||||
|
|
||||||
|
static inline void pty_inc_count(void)
|
||||||
|
{
|
||||||
|
pty_count = (++tty_count) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void pty_dec_count(void)
|
||||||
|
{
|
||||||
|
pty_count = (--tty_count) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
static struct cdev ptmx_cdev;
|
static struct cdev ptmx_cdev;
|
||||||
|
|
||||||
static struct ctl_table pty_table[] = {
|
static struct ctl_table pty_table[] = {
|
||||||
|
@ -542,6 +553,7 @@ static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
|
||||||
|
|
||||||
static void pty_unix98_shutdown(struct tty_struct *tty)
|
static void pty_unix98_shutdown(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
|
tty_driver_remove_tty(tty->driver, tty);
|
||||||
/* We have our own method as we don't use the tty index */
|
/* We have our own method as we don't use the tty index */
|
||||||
kfree(tty->termios);
|
kfree(tty->termios);
|
||||||
}
|
}
|
||||||
|
@ -588,7 +600,8 @@ static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||||
*/
|
*/
|
||||||
tty_driver_kref_get(driver);
|
tty_driver_kref_get(driver);
|
||||||
tty->count++;
|
tty->count++;
|
||||||
pty_count++;
|
pty_inc_count(); /* tty */
|
||||||
|
pty_inc_count(); /* tty->link */
|
||||||
return 0;
|
return 0;
|
||||||
err_free_mem:
|
err_free_mem:
|
||||||
deinitialize_tty_struct(o_tty);
|
deinitialize_tty_struct(o_tty);
|
||||||
|
@ -602,7 +615,7 @@ err_free_tty:
|
||||||
|
|
||||||
static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
|
static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
pty_count--;
|
pty_dec_count();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct tty_operations ptm_unix98_ops = {
|
static const struct tty_operations ptm_unix98_ops = {
|
||||||
|
|
|
@ -1819,6 +1819,8 @@ static void serial8250_backup_timeout(unsigned long data)
|
||||||
unsigned int iir, ier = 0, lsr;
|
unsigned int iir, ier = 0, lsr;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&up->port.lock, flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Must disable interrupts or else we risk racing with the interrupt
|
* Must disable interrupts or else we risk racing with the interrupt
|
||||||
* based handler.
|
* based handler.
|
||||||
|
@ -1836,10 +1838,8 @@ static void serial8250_backup_timeout(unsigned long data)
|
||||||
* the "Diva" UART used on the management processor on many HP
|
* the "Diva" UART used on the management processor on many HP
|
||||||
* ia64 and parisc boxes.
|
* ia64 and parisc boxes.
|
||||||
*/
|
*/
|
||||||
spin_lock_irqsave(&up->port.lock, flags);
|
|
||||||
lsr = serial_in(up, UART_LSR);
|
lsr = serial_in(up, UART_LSR);
|
||||||
up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
|
up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
|
||||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
|
||||||
if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
|
if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
|
||||||
(!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
|
(!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
|
||||||
(lsr & UART_LSR_THRE)) {
|
(lsr & UART_LSR_THRE)) {
|
||||||
|
@ -1848,11 +1848,13 @@ static void serial8250_backup_timeout(unsigned long data)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(iir & UART_IIR_NO_INT))
|
if (!(iir & UART_IIR_NO_INT))
|
||||||
serial8250_handle_port(up);
|
transmit_chars(up);
|
||||||
|
|
||||||
if (is_real_interrupt(up->port.irq))
|
if (is_real_interrupt(up->port.irq))
|
||||||
serial_out(up, UART_IER, ier);
|
serial_out(up, UART_IER, ier);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||||
|
|
||||||
/* Standard timer interval plus 0.2s to keep the port running */
|
/* Standard timer interval plus 0.2s to keep the port running */
|
||||||
mod_timer(&up->timer,
|
mod_timer(&up->timer,
|
||||||
jiffies + uart_poll_timeout(&up->port) + HZ / 5);
|
jiffies + uart_poll_timeout(&up->port) + HZ / 5);
|
||||||
|
|
|
@ -1599,11 +1599,6 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
|
||||||
.device = 0x800D,
|
.device = 0x800D,
|
||||||
.init = pci_eg20t_init,
|
.init = pci_eg20t_init,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
.vendor = 0x10DB,
|
|
||||||
.device = 0x800D,
|
|
||||||
.init = pci_eg20t_init,
|
|
||||||
},
|
|
||||||
/*
|
/*
|
||||||
* Cronyx Omega PCI (PLX-chip based)
|
* Cronyx Omega PCI (PLX-chip based)
|
||||||
*/
|
*/
|
||||||
|
@ -4021,13 +4016,17 @@ static struct pci_device_id serial_pci_tbl[] = {
|
||||||
0, 0, pbn_NETMOS9900_2s_115200 },
|
0, 0, pbn_NETMOS9900_2s_115200 },
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Best Connectivity PCI Multi I/O cards
|
* Best Connectivity and Rosewill PCI Multi I/O cards
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
||||||
0xA000, 0x1000,
|
0xA000, 0x1000,
|
||||||
0, 0, pbn_b0_1_115200 },
|
0, 0, pbn_b0_1_115200 },
|
||||||
|
|
||||||
|
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
||||||
|
0xA000, 0x3002,
|
||||||
|
0, 0, pbn_b0_bt_2_115200 },
|
||||||
|
|
||||||
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
||||||
0xA000, 0x3004,
|
0xA000, 0x3004,
|
||||||
0, 0, pbn_b0_bt_4_115200 },
|
0, 0, pbn_b0_bt_4_115200 },
|
||||||
|
|
|
@ -109,6 +109,9 @@ static const struct pnp_device_id pnp_dev_table[] = {
|
||||||
/* IBM */
|
/* IBM */
|
||||||
/* IBM Thinkpad 701 Internal Modem Voice */
|
/* IBM Thinkpad 701 Internal Modem Voice */
|
||||||
{ "IBM0033", 0 },
|
{ "IBM0033", 0 },
|
||||||
|
/* Intermec */
|
||||||
|
/* Intermec CV60 touchscreen port */
|
||||||
|
{ "PNP4972", 0 },
|
||||||
/* Intertex */
|
/* Intertex */
|
||||||
/* Intertex 28k8 33k6 Voice EXT PnP */
|
/* Intertex 28k8 33k6 Voice EXT PnP */
|
||||||
{ "IXDC801", 0 },
|
{ "IXDC801", 0 },
|
||||||
|
|
|
@ -1609,9 +1609,11 @@ static struct console atmel_console = {
|
||||||
static int __init atmel_console_init(void)
|
static int __init atmel_console_init(void)
|
||||||
{
|
{
|
||||||
if (atmel_default_console_device) {
|
if (atmel_default_console_device) {
|
||||||
add_preferred_console(ATMEL_DEVICENAME,
|
struct atmel_uart_data *pdata =
|
||||||
atmel_default_console_device->id, NULL);
|
atmel_default_console_device->dev.platform_data;
|
||||||
atmel_init_port(&atmel_ports[atmel_default_console_device->id],
|
|
||||||
|
add_preferred_console(ATMEL_DEVICENAME, pdata->num, NULL);
|
||||||
|
atmel_init_port(&atmel_ports[pdata->num],
|
||||||
atmel_default_console_device);
|
atmel_default_console_device);
|
||||||
register_console(&atmel_console);
|
register_console(&atmel_console);
|
||||||
}
|
}
|
||||||
|
|
|
@ -340,5 +340,5 @@ module_exit(max3107_exit);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("MAX3107 driver");
|
MODULE_DESCRIPTION("MAX3107 driver");
|
||||||
MODULE_AUTHOR("Aavamobile");
|
MODULE_AUTHOR("Aavamobile");
|
||||||
MODULE_ALIAS("aava-max3107-spi");
|
MODULE_ALIAS("spi:aava-max3107");
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
|
@ -1209,5 +1209,5 @@ module_exit(max3107_exit);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("MAX3107 driver");
|
MODULE_DESCRIPTION("MAX3107 driver");
|
||||||
MODULE_AUTHOR("Aavamobile");
|
MODULE_AUTHOR("Aavamobile");
|
||||||
MODULE_ALIAS("max3107-spi");
|
MODULE_ALIAS("spi:max3107");
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
|
@ -917,4 +917,4 @@ module_init(serial_m3110_init);
|
||||||
module_exit(serial_m3110_exit);
|
module_exit(serial_m3110_exit);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
MODULE_ALIAS("max3110-uart");
|
MODULE_ALIAS("spi:max3110-uart");
|
||||||
|
|
|
@ -806,8 +806,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||||
|
|
||||||
serial_omap_set_mctrl(&up->port, up->port.mctrl);
|
serial_omap_set_mctrl(&up->port, up->port.mctrl);
|
||||||
/* Software Flow Control Configuration */
|
/* Software Flow Control Configuration */
|
||||||
if (termios->c_iflag & (IXON | IXOFF))
|
serial_omap_configure_xonxoff(up, termios);
|
||||||
serial_omap_configure_xonxoff(up, termios);
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||||
dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->pdev->id);
|
dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->pdev->id);
|
||||||
|
|
|
@ -598,7 +598,8 @@ static void pch_request_dma(struct uart_port *port)
|
||||||
dma_cap_zero(mask);
|
dma_cap_zero(mask);
|
||||||
dma_cap_set(DMA_SLAVE, mask);
|
dma_cap_set(DMA_SLAVE, mask);
|
||||||
|
|
||||||
dma_dev = pci_get_bus_and_slot(2, PCI_DEVFN(0xa, 0)); /* Get DMA's dev
|
dma_dev = pci_get_bus_and_slot(priv->pdev->bus->number,
|
||||||
|
PCI_DEVFN(0xa, 0)); /* Get DMA's dev
|
||||||
information */
|
information */
|
||||||
/* Set Tx DMA */
|
/* Set Tx DMA */
|
||||||
param = &priv->param_tx;
|
param = &priv->param_tx;
|
||||||
|
|
|
@ -1225,15 +1225,19 @@ static const struct dev_pm_ops s3c24xx_serial_pm_ops = {
|
||||||
.suspend = s3c24xx_serial_suspend,
|
.suspend = s3c24xx_serial_suspend,
|
||||||
.resume = s3c24xx_serial_resume,
|
.resume = s3c24xx_serial_resume,
|
||||||
};
|
};
|
||||||
|
#define SERIAL_SAMSUNG_PM_OPS (&s3c24xx_serial_pm_ops)
|
||||||
|
|
||||||
#else /* !CONFIG_PM_SLEEP */
|
#else /* !CONFIG_PM_SLEEP */
|
||||||
#define s3c24xx_serial_pm_ops NULL
|
|
||||||
|
#define SERIAL_SAMSUNG_PM_OPS NULL
|
||||||
#endif /* CONFIG_PM_SLEEP */
|
#endif /* CONFIG_PM_SLEEP */
|
||||||
|
|
||||||
int s3c24xx_serial_init(struct platform_driver *drv,
|
int s3c24xx_serial_init(struct platform_driver *drv,
|
||||||
struct s3c24xx_uart_info *info)
|
struct s3c24xx_uart_info *info)
|
||||||
{
|
{
|
||||||
dbg("s3c24xx_serial_init(%p,%p)\n", drv, info);
|
dbg("s3c24xx_serial_init(%p,%p)\n", drv, info);
|
||||||
drv->driver.pm = &s3c24xx_serial_pm_ops;
|
|
||||||
|
drv->driver.pm = SERIAL_SAMSUNG_PM_OPS;
|
||||||
|
|
||||||
return platform_driver_register(drv);
|
return platform_driver_register(drv);
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,6 +200,11 @@ static int uart_startup(struct tty_struct *tty, struct uart_state *state, int in
|
||||||
clear_bit(TTY_IO_ERROR, &tty->flags);
|
clear_bit(TTY_IO_ERROR, &tty->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is to allow setserial on this port. People may want to set
|
||||||
|
* port/irq/type and then reconfigure the port properly if it failed
|
||||||
|
* now.
|
||||||
|
*/
|
||||||
if (retval && capable(CAP_SYS_ADMIN))
|
if (retval && capable(CAP_SYS_ADMIN))
|
||||||
retval = 0;
|
retval = 0;
|
||||||
|
|
||||||
|
|
|
@ -235,7 +235,7 @@ static inline void *qe2cpu_addr(dma_addr_t addr, struct uart_qe_port *qe_port)
|
||||||
return qe_port->bd_virt + (addr - qe_port->bd_dma_addr);
|
return qe_port->bd_virt + (addr - qe_port->bd_dma_addr);
|
||||||
|
|
||||||
/* something nasty happened */
|
/* something nasty happened */
|
||||||
printk(KERN_ERR "%s: addr=%x\n", __func__, addr);
|
printk(KERN_ERR "%s: addr=%llx\n", __func__, (u64)addr);
|
||||||
BUG();
|
BUG();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1295,8 +1295,7 @@ static int tty_driver_install_tty(struct tty_driver *driver,
|
||||||
*
|
*
|
||||||
* Locking: tty_mutex for now
|
* Locking: tty_mutex for now
|
||||||
*/
|
*/
|
||||||
static void tty_driver_remove_tty(struct tty_driver *driver,
|
void tty_driver_remove_tty(struct tty_driver *driver, struct tty_struct *tty)
|
||||||
struct tty_struct *tty)
|
|
||||||
{
|
{
|
||||||
if (driver->ops->remove)
|
if (driver->ops->remove)
|
||||||
driver->ops->remove(driver, tty);
|
driver->ops->remove(driver, tty);
|
||||||
|
|
|
@ -421,6 +421,8 @@ extern void tty_driver_flush_buffer(struct tty_struct *tty);
|
||||||
extern void tty_throttle(struct tty_struct *tty);
|
extern void tty_throttle(struct tty_struct *tty);
|
||||||
extern void tty_unthrottle(struct tty_struct *tty);
|
extern void tty_unthrottle(struct tty_struct *tty);
|
||||||
extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws);
|
extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws);
|
||||||
|
extern void tty_driver_remove_tty(struct tty_driver *driver,
|
||||||
|
struct tty_struct *tty);
|
||||||
extern void tty_shutdown(struct tty_struct *tty);
|
extern void tty_shutdown(struct tty_struct *tty);
|
||||||
extern void tty_free_termios(struct tty_struct *tty);
|
extern void tty_free_termios(struct tty_struct *tty);
|
||||||
extern int is_current_pgrp_orphaned(void);
|
extern int is_current_pgrp_orphaned(void);
|
||||||
|
|
|
@ -47,6 +47,9 @@
|
||||||
*
|
*
|
||||||
* This routine is called synchronously when a particular tty device
|
* This routine is called synchronously when a particular tty device
|
||||||
* is closed for the last time freeing up the resources.
|
* is closed for the last time freeing up the resources.
|
||||||
|
* Note that tty_shutdown() is not called if ops->shutdown is defined.
|
||||||
|
* This means one is responsible to take care of calling ops->remove (e.g.
|
||||||
|
* via tty_driver_remove_tty) and releasing tty->termios.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* void (*cleanup)(struct tty_struct * tty);
|
* void (*cleanup)(struct tty_struct * tty);
|
||||||
|
|
Loading…
Reference in New Issue