Loading drivers/serial/8250.c +20 −10 Original line number Diff line number Diff line Loading @@ -2454,6 +2454,7 @@ static struct platform_driver serial8250_isa_driver = { .resume = serial8250_resume, .driver = { .name = "serial8250", .owner = THIS_MODULE, }, }; Loading Loading @@ -2594,21 +2595,30 @@ static int __init serial8250_init(void) if (ret) goto out; serial8250_isa_devs = platform_device_register_simple("serial8250", PLAT8250_DEV_LEGACY, NULL, 0); if (IS_ERR(serial8250_isa_devs)) { ret = PTR_ERR(serial8250_isa_devs); goto unreg; ret = platform_driver_register(&serial8250_isa_driver); if (ret) goto unreg_uart_drv; serial8250_isa_devs = platform_device_alloc("serial8250", PLAT8250_DEV_LEGACY); if (!serial8250_isa_devs) { ret = -ENOMEM; goto unreg_plat_drv; } ret = platform_device_add(serial8250_isa_devs); if (ret) goto put_dev; serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev); ret = platform_driver_register(&serial8250_isa_driver); if (ret == 0) goto out; platform_device_unregister(serial8250_isa_devs); unreg: put_dev: platform_device_put(serial8250_isa_devs); unreg_plat_drv: platform_driver_unregister(&serial8250_isa_driver); unreg_uart_drv: uart_unregister_driver(&serial8250_reg); out: return ret; Loading drivers/serial/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -847,7 +847,7 @@ config SERIAL_M32R_SIO_CONSOLE config SERIAL_M32R_PLDSIO bool "M32R SIO I/F on a PLD" depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PALT_USRV || PLAT_M32700UT) depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PLAT_USRV || PLAT_M32700UT) default n help Say Y here if you want to use the M32R serial controller Loading drivers/serial/pmac_zilog.c +4 −5 Original line number Diff line number Diff line Loading @@ -69,7 +69,6 @@ #include <asm/pmac_feature.h> #include <asm/dbdma.h> #include <asm/macio.h> #include <asm/semaphore.h> #if defined (CONFIG_SERIAL_PMACZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ Loading Loading @@ -1593,7 +1592,7 @@ static int pmz_suspend(struct macio_dev *mdev, pm_message_t pm_state) state = pmz_uart_reg.state + uap->port.line; mutex_lock(&pmz_irq_mutex); down(&state->sem); mutex_lock(&state->mutex); spin_lock_irqsave(&uap->port.lock, flags); Loading Loading @@ -1624,7 +1623,7 @@ static int pmz_suspend(struct macio_dev *mdev, pm_message_t pm_state) /* Shut the chip down */ pmz_set_scc_power(uap, 0); up(&state->sem); mutex_unlock(&state->mutex); mutex_unlock(&pmz_irq_mutex); pmz_debug("suspend, switching complete\n"); Loading Loading @@ -1653,7 +1652,7 @@ static int pmz_resume(struct macio_dev *mdev) state = pmz_uart_reg.state + uap->port.line; mutex_lock(&pmz_irq_mutex); down(&state->sem); mutex_lock(&state->mutex); spin_lock_irqsave(&uap->port.lock, flags); if (!ZS_IS_OPEN(uap) && !ZS_IS_CONS(uap)) { Loading Loading @@ -1685,7 +1684,7 @@ static int pmz_resume(struct macio_dev *mdev) } bail: up(&state->sem); mutex_unlock(&state->mutex); mutex_unlock(&pmz_irq_mutex); /* Right now, we deal with delay by blocking here, I'll be Loading drivers/serial/serial_core.c +30 −30 Original line number Diff line number Diff line Loading @@ -638,7 +638,7 @@ static int uart_set_info(struct uart_state *state, * module insertion/removal doesn't change anything * under us. */ down(&state->sem); mutex_lock(&state->mutex); change_irq = new_serial.irq != port->irq; Loading Loading @@ -797,7 +797,7 @@ static int uart_set_info(struct uart_state *state, } else retval = uart_startup(state, 1); exit: up(&state->sem); mutex_unlock(&state->mutex); return retval; } Loading Loading @@ -834,7 +834,7 @@ static int uart_tiocmget(struct tty_struct *tty, struct file *file) struct uart_port *port = state->port; int result = -EIO; down(&state->sem); mutex_lock(&state->mutex); if ((!file || !tty_hung_up_p(file)) && !(tty->flags & (1 << TTY_IO_ERROR))) { result = port->mctrl; Loading @@ -843,7 +843,7 @@ static int uart_tiocmget(struct tty_struct *tty, struct file *file) result |= port->ops->get_mctrl(port); spin_unlock_irq(&port->lock); } up(&state->sem); mutex_unlock(&state->mutex); return result; } Loading @@ -856,13 +856,13 @@ uart_tiocmset(struct tty_struct *tty, struct file *file, struct uart_port *port = state->port; int ret = -EIO; down(&state->sem); mutex_lock(&state->mutex); if ((!file || !tty_hung_up_p(file)) && !(tty->flags & (1 << TTY_IO_ERROR))) { uart_update_mctrl(port, set, clear); ret = 0; } up(&state->sem); mutex_unlock(&state->mutex); return ret; } Loading @@ -873,12 +873,12 @@ static void uart_break_ctl(struct tty_struct *tty, int break_state) BUG_ON(!kernel_locked()); down(&state->sem); mutex_lock(&state->mutex); if (port->type != PORT_UNKNOWN) port->ops->break_ctl(port, break_state); up(&state->sem); mutex_unlock(&state->mutex); } static int uart_do_autoconfig(struct uart_state *state) Loading @@ -894,7 +894,7 @@ static int uart_do_autoconfig(struct uart_state *state) * changing, and hence any extra opens of the port while * we're auto-configuring. */ if (down_interruptible(&state->sem)) if (mutex_lock_interruptible(&state->mutex)) return -ERESTARTSYS; ret = -EBUSY; Loading @@ -920,7 +920,7 @@ static int uart_do_autoconfig(struct uart_state *state) ret = uart_startup(state, 1); } up(&state->sem); mutex_unlock(&state->mutex); return ret; } Loading Loading @@ -1074,7 +1074,7 @@ uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, if (ret != -ENOIOCTLCMD) goto out; down(&state->sem); mutex_lock(&state->mutex); if (tty_hung_up_p(filp)) { ret = -EIO; Loading @@ -1098,7 +1098,7 @@ uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, } } out_up: up(&state->sem); mutex_unlock(&state->mutex); out: return ret; } Loading Loading @@ -1186,7 +1186,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp) DPRINTK("uart_close(%d) called\n", port->line); down(&state->sem); mutex_lock(&state->mutex); if (tty_hung_up_p(filp)) goto done; Loading Loading @@ -1260,7 +1260,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp) wake_up_interruptible(&state->info->open_wait); done: up(&state->sem); mutex_unlock(&state->mutex); } static void uart_wait_until_sent(struct tty_struct *tty, int timeout) Loading Loading @@ -1334,7 +1334,7 @@ static void uart_hangup(struct tty_struct *tty) BUG_ON(!kernel_locked()); DPRINTK("uart_hangup(%d)\n", state->port->line); down(&state->sem); mutex_lock(&state->mutex); if (state->info && state->info->flags & UIF_NORMAL_ACTIVE) { uart_flush_buffer(tty); uart_shutdown(state); Loading @@ -1344,7 +1344,7 @@ static void uart_hangup(struct tty_struct *tty) wake_up_interruptible(&state->info->open_wait); wake_up_interruptible(&state->info->delta_msr_wait); } up(&state->sem); mutex_unlock(&state->mutex); } /* Loading Loading @@ -1447,9 +1447,9 @@ uart_block_til_ready(struct file *filp, struct uart_state *state) if (mctrl & TIOCM_CAR) break; up(&state->sem); mutex_unlock(&state->mutex); schedule(); down(&state->sem); mutex_lock(&state->mutex); if (signal_pending(current)) break; Loading @@ -1475,7 +1475,7 @@ static struct uart_state *uart_get(struct uart_driver *drv, int line) mutex_lock(&port_mutex); state = drv->state + line; if (down_interruptible(&state->sem)) { if (mutex_lock_interruptible(&state->mutex)) { state = ERR_PTR(-ERESTARTSYS); goto out; } Loading @@ -1483,7 +1483,7 @@ static struct uart_state *uart_get(struct uart_driver *drv, int line) state->count++; if (!state->port) { state->count--; up(&state->sem); mutex_unlock(&state->mutex); state = ERR_PTR(-ENXIO); goto out; } Loading @@ -1504,7 +1504,7 @@ static struct uart_state *uart_get(struct uart_driver *drv, int line) (unsigned long)state); } else { state->count--; up(&state->sem); mutex_unlock(&state->mutex); state = ERR_PTR(-ENOMEM); } } Loading Loading @@ -1571,7 +1571,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp) if (tty_hung_up_p(filp)) { retval = -EAGAIN; state->count--; up(&state->sem); mutex_unlock(&state->mutex); goto fail; } Loading @@ -1591,7 +1591,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp) */ if (retval == 0) retval = uart_block_til_ready(filp, state); up(&state->sem); mutex_unlock(&state->mutex); /* * If this is the first open to succeed, adjust things to suit. Loading Loading @@ -1867,7 +1867,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port) { struct uart_state *state = drv->state + port->line; down(&state->sem); mutex_lock(&state->mutex); if (state->info && state->info->flags & UIF_INITIALIZED) { struct uart_ops *ops = port->ops; Loading Loading @@ -1896,7 +1896,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port) uart_change_pm(state, 3); up(&state->sem); mutex_unlock(&state->mutex); return 0; } Loading @@ -1905,7 +1905,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) { struct uart_state *state = drv->state + port->line; down(&state->sem); mutex_lock(&state->mutex); uart_change_pm(state, 0); Loading Loading @@ -1954,7 +1954,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) } } up(&state->sem); mutex_unlock(&state->mutex); return 0; } Loading Loading @@ -2049,7 +2049,7 @@ uart_unconfigure_port(struct uart_driver *drv, struct uart_state *state) if (info && info->tty) tty_vhangup(info->tty); down(&state->sem); mutex_lock(&state->mutex); state->info = NULL; Loading @@ -2072,7 +2072,7 @@ uart_unconfigure_port(struct uart_driver *drv, struct uart_state *state) kfree(info); } up(&state->sem); mutex_unlock(&state->mutex); } static struct tty_operations uart_ops = { Loading Loading @@ -2161,7 +2161,7 @@ int uart_register_driver(struct uart_driver *drv) state->close_delay = 500; /* .5 seconds */ state->closing_wait = 30000; /* 30 seconds */ init_MUTEX(&state->sem); mutex_init(&state->mutex); } retval = tty_register_driver(normal); Loading include/linux/serial_core.h +2 −1 Original line number Diff line number Diff line Loading @@ -136,6 +136,7 @@ #include <linux/spinlock.h> #include <linux/sched.h> #include <linux/tty.h> #include <linux/mutex.h> struct uart_port; struct uart_info; Loading Loading @@ -284,7 +285,7 @@ struct uart_state { struct uart_info *info; struct uart_port *port; struct semaphore sem; struct mutex mutex; }; #define UART_XMIT_SIZE PAGE_SIZE Loading Loading
drivers/serial/8250.c +20 −10 Original line number Diff line number Diff line Loading @@ -2454,6 +2454,7 @@ static struct platform_driver serial8250_isa_driver = { .resume = serial8250_resume, .driver = { .name = "serial8250", .owner = THIS_MODULE, }, }; Loading Loading @@ -2594,21 +2595,30 @@ static int __init serial8250_init(void) if (ret) goto out; serial8250_isa_devs = platform_device_register_simple("serial8250", PLAT8250_DEV_LEGACY, NULL, 0); if (IS_ERR(serial8250_isa_devs)) { ret = PTR_ERR(serial8250_isa_devs); goto unreg; ret = platform_driver_register(&serial8250_isa_driver); if (ret) goto unreg_uart_drv; serial8250_isa_devs = platform_device_alloc("serial8250", PLAT8250_DEV_LEGACY); if (!serial8250_isa_devs) { ret = -ENOMEM; goto unreg_plat_drv; } ret = platform_device_add(serial8250_isa_devs); if (ret) goto put_dev; serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev); ret = platform_driver_register(&serial8250_isa_driver); if (ret == 0) goto out; platform_device_unregister(serial8250_isa_devs); unreg: put_dev: platform_device_put(serial8250_isa_devs); unreg_plat_drv: platform_driver_unregister(&serial8250_isa_driver); unreg_uart_drv: uart_unregister_driver(&serial8250_reg); out: return ret; Loading
drivers/serial/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -847,7 +847,7 @@ config SERIAL_M32R_SIO_CONSOLE config SERIAL_M32R_PLDSIO bool "M32R SIO I/F on a PLD" depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PALT_USRV || PLAT_M32700UT) depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PLAT_USRV || PLAT_M32700UT) default n help Say Y here if you want to use the M32R serial controller Loading
drivers/serial/pmac_zilog.c +4 −5 Original line number Diff line number Diff line Loading @@ -69,7 +69,6 @@ #include <asm/pmac_feature.h> #include <asm/dbdma.h> #include <asm/macio.h> #include <asm/semaphore.h> #if defined (CONFIG_SERIAL_PMACZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ Loading Loading @@ -1593,7 +1592,7 @@ static int pmz_suspend(struct macio_dev *mdev, pm_message_t pm_state) state = pmz_uart_reg.state + uap->port.line; mutex_lock(&pmz_irq_mutex); down(&state->sem); mutex_lock(&state->mutex); spin_lock_irqsave(&uap->port.lock, flags); Loading Loading @@ -1624,7 +1623,7 @@ static int pmz_suspend(struct macio_dev *mdev, pm_message_t pm_state) /* Shut the chip down */ pmz_set_scc_power(uap, 0); up(&state->sem); mutex_unlock(&state->mutex); mutex_unlock(&pmz_irq_mutex); pmz_debug("suspend, switching complete\n"); Loading Loading @@ -1653,7 +1652,7 @@ static int pmz_resume(struct macio_dev *mdev) state = pmz_uart_reg.state + uap->port.line; mutex_lock(&pmz_irq_mutex); down(&state->sem); mutex_lock(&state->mutex); spin_lock_irqsave(&uap->port.lock, flags); if (!ZS_IS_OPEN(uap) && !ZS_IS_CONS(uap)) { Loading Loading @@ -1685,7 +1684,7 @@ static int pmz_resume(struct macio_dev *mdev) } bail: up(&state->sem); mutex_unlock(&state->mutex); mutex_unlock(&pmz_irq_mutex); /* Right now, we deal with delay by blocking here, I'll be Loading
drivers/serial/serial_core.c +30 −30 Original line number Diff line number Diff line Loading @@ -638,7 +638,7 @@ static int uart_set_info(struct uart_state *state, * module insertion/removal doesn't change anything * under us. */ down(&state->sem); mutex_lock(&state->mutex); change_irq = new_serial.irq != port->irq; Loading Loading @@ -797,7 +797,7 @@ static int uart_set_info(struct uart_state *state, } else retval = uart_startup(state, 1); exit: up(&state->sem); mutex_unlock(&state->mutex); return retval; } Loading Loading @@ -834,7 +834,7 @@ static int uart_tiocmget(struct tty_struct *tty, struct file *file) struct uart_port *port = state->port; int result = -EIO; down(&state->sem); mutex_lock(&state->mutex); if ((!file || !tty_hung_up_p(file)) && !(tty->flags & (1 << TTY_IO_ERROR))) { result = port->mctrl; Loading @@ -843,7 +843,7 @@ static int uart_tiocmget(struct tty_struct *tty, struct file *file) result |= port->ops->get_mctrl(port); spin_unlock_irq(&port->lock); } up(&state->sem); mutex_unlock(&state->mutex); return result; } Loading @@ -856,13 +856,13 @@ uart_tiocmset(struct tty_struct *tty, struct file *file, struct uart_port *port = state->port; int ret = -EIO; down(&state->sem); mutex_lock(&state->mutex); if ((!file || !tty_hung_up_p(file)) && !(tty->flags & (1 << TTY_IO_ERROR))) { uart_update_mctrl(port, set, clear); ret = 0; } up(&state->sem); mutex_unlock(&state->mutex); return ret; } Loading @@ -873,12 +873,12 @@ static void uart_break_ctl(struct tty_struct *tty, int break_state) BUG_ON(!kernel_locked()); down(&state->sem); mutex_lock(&state->mutex); if (port->type != PORT_UNKNOWN) port->ops->break_ctl(port, break_state); up(&state->sem); mutex_unlock(&state->mutex); } static int uart_do_autoconfig(struct uart_state *state) Loading @@ -894,7 +894,7 @@ static int uart_do_autoconfig(struct uart_state *state) * changing, and hence any extra opens of the port while * we're auto-configuring. */ if (down_interruptible(&state->sem)) if (mutex_lock_interruptible(&state->mutex)) return -ERESTARTSYS; ret = -EBUSY; Loading @@ -920,7 +920,7 @@ static int uart_do_autoconfig(struct uart_state *state) ret = uart_startup(state, 1); } up(&state->sem); mutex_unlock(&state->mutex); return ret; } Loading Loading @@ -1074,7 +1074,7 @@ uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, if (ret != -ENOIOCTLCMD) goto out; down(&state->sem); mutex_lock(&state->mutex); if (tty_hung_up_p(filp)) { ret = -EIO; Loading @@ -1098,7 +1098,7 @@ uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, } } out_up: up(&state->sem); mutex_unlock(&state->mutex); out: return ret; } Loading Loading @@ -1186,7 +1186,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp) DPRINTK("uart_close(%d) called\n", port->line); down(&state->sem); mutex_lock(&state->mutex); if (tty_hung_up_p(filp)) goto done; Loading Loading @@ -1260,7 +1260,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp) wake_up_interruptible(&state->info->open_wait); done: up(&state->sem); mutex_unlock(&state->mutex); } static void uart_wait_until_sent(struct tty_struct *tty, int timeout) Loading Loading @@ -1334,7 +1334,7 @@ static void uart_hangup(struct tty_struct *tty) BUG_ON(!kernel_locked()); DPRINTK("uart_hangup(%d)\n", state->port->line); down(&state->sem); mutex_lock(&state->mutex); if (state->info && state->info->flags & UIF_NORMAL_ACTIVE) { uart_flush_buffer(tty); uart_shutdown(state); Loading @@ -1344,7 +1344,7 @@ static void uart_hangup(struct tty_struct *tty) wake_up_interruptible(&state->info->open_wait); wake_up_interruptible(&state->info->delta_msr_wait); } up(&state->sem); mutex_unlock(&state->mutex); } /* Loading Loading @@ -1447,9 +1447,9 @@ uart_block_til_ready(struct file *filp, struct uart_state *state) if (mctrl & TIOCM_CAR) break; up(&state->sem); mutex_unlock(&state->mutex); schedule(); down(&state->sem); mutex_lock(&state->mutex); if (signal_pending(current)) break; Loading @@ -1475,7 +1475,7 @@ static struct uart_state *uart_get(struct uart_driver *drv, int line) mutex_lock(&port_mutex); state = drv->state + line; if (down_interruptible(&state->sem)) { if (mutex_lock_interruptible(&state->mutex)) { state = ERR_PTR(-ERESTARTSYS); goto out; } Loading @@ -1483,7 +1483,7 @@ static struct uart_state *uart_get(struct uart_driver *drv, int line) state->count++; if (!state->port) { state->count--; up(&state->sem); mutex_unlock(&state->mutex); state = ERR_PTR(-ENXIO); goto out; } Loading @@ -1504,7 +1504,7 @@ static struct uart_state *uart_get(struct uart_driver *drv, int line) (unsigned long)state); } else { state->count--; up(&state->sem); mutex_unlock(&state->mutex); state = ERR_PTR(-ENOMEM); } } Loading Loading @@ -1571,7 +1571,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp) if (tty_hung_up_p(filp)) { retval = -EAGAIN; state->count--; up(&state->sem); mutex_unlock(&state->mutex); goto fail; } Loading @@ -1591,7 +1591,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp) */ if (retval == 0) retval = uart_block_til_ready(filp, state); up(&state->sem); mutex_unlock(&state->mutex); /* * If this is the first open to succeed, adjust things to suit. Loading Loading @@ -1867,7 +1867,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port) { struct uart_state *state = drv->state + port->line; down(&state->sem); mutex_lock(&state->mutex); if (state->info && state->info->flags & UIF_INITIALIZED) { struct uart_ops *ops = port->ops; Loading Loading @@ -1896,7 +1896,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port) uart_change_pm(state, 3); up(&state->sem); mutex_unlock(&state->mutex); return 0; } Loading @@ -1905,7 +1905,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) { struct uart_state *state = drv->state + port->line; down(&state->sem); mutex_lock(&state->mutex); uart_change_pm(state, 0); Loading Loading @@ -1954,7 +1954,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) } } up(&state->sem); mutex_unlock(&state->mutex); return 0; } Loading Loading @@ -2049,7 +2049,7 @@ uart_unconfigure_port(struct uart_driver *drv, struct uart_state *state) if (info && info->tty) tty_vhangup(info->tty); down(&state->sem); mutex_lock(&state->mutex); state->info = NULL; Loading @@ -2072,7 +2072,7 @@ uart_unconfigure_port(struct uart_driver *drv, struct uart_state *state) kfree(info); } up(&state->sem); mutex_unlock(&state->mutex); } static struct tty_operations uart_ops = { Loading Loading @@ -2161,7 +2161,7 @@ int uart_register_driver(struct uart_driver *drv) state->close_delay = 500; /* .5 seconds */ state->closing_wait = 30000; /* 30 seconds */ init_MUTEX(&state->sem); mutex_init(&state->mutex); } retval = tty_register_driver(normal); Loading
include/linux/serial_core.h +2 −1 Original line number Diff line number Diff line Loading @@ -136,6 +136,7 @@ #include <linux/spinlock.h> #include <linux/sched.h> #include <linux/tty.h> #include <linux/mutex.h> struct uart_port; struct uart_info; Loading Loading @@ -284,7 +285,7 @@ struct uart_state { struct uart_info *info; struct uart_port *port; struct semaphore sem; struct mutex mutex; }; #define UART_XMIT_SIZE PAGE_SIZE Loading