aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial/serial_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/serial/serial_core.c')
-rw-r--r--drivers/serial/serial_core.c76
1 files changed, 36 insertions, 40 deletions
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 42f4e66fcca..bf3c0e32a33 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -27,6 +27,8 @@
27#include <linux/slab.h> 27#include <linux/slab.h>
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/console.h> 29#include <linux/console.h>
30#include <linux/proc_fs.h>
31#include <linux/seq_file.h>
30#include <linux/serial_core.h> 32#include <linux/serial_core.h>
31#include <linux/smp_lock.h> 33#include <linux/smp_lock.h>
32#include <linux/device.h> 34#include <linux/device.h>
@@ -1682,20 +1684,20 @@ static const char *uart_type(struct uart_port *port)
1682 1684
1683#ifdef CONFIG_PROC_FS 1685#ifdef CONFIG_PROC_FS
1684 1686
1685static int uart_line_info(char *buf, struct uart_driver *drv, int i) 1687static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
1686{ 1688{
1687 struct uart_state *state = drv->state + i; 1689 struct uart_state *state = drv->state + i;
1688 int pm_state; 1690 int pm_state;
1689 struct uart_port *port = state->port; 1691 struct uart_port *port = state->port;
1690 char stat_buf[32]; 1692 char stat_buf[32];
1691 unsigned int status; 1693 unsigned int status;
1692 int mmio, ret; 1694 int mmio;
1693 1695
1694 if (!port) 1696 if (!port)
1695 return 0; 1697 return;
1696 1698
1697 mmio = port->iotype >= UPIO_MEM; 1699 mmio = port->iotype >= UPIO_MEM;
1698 ret = sprintf(buf, "%d: uart:%s %s%08llX irq:%d", 1700 seq_printf(m, "%d: uart:%s %s%08llX irq:%d",
1699 port->line, uart_type(port), 1701 port->line, uart_type(port),
1700 mmio ? "mmio:0x" : "port:", 1702 mmio ? "mmio:0x" : "port:",
1701 mmio ? (unsigned long long)port->mapbase 1703 mmio ? (unsigned long long)port->mapbase
@@ -1703,8 +1705,8 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i)
1703 port->irq); 1705 port->irq);
1704 1706
1705 if (port->type == PORT_UNKNOWN) { 1707 if (port->type == PORT_UNKNOWN) {
1706 strcat(buf, "\n"); 1708 seq_putc(m, '\n');
1707 return ret + 1; 1709 return;
1708 } 1710 }
1709 1711
1710 if (capable(CAP_SYS_ADMIN)) { 1712 if (capable(CAP_SYS_ADMIN)) {
@@ -1719,19 +1721,19 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i)
1719 uart_change_pm(state, pm_state); 1721 uart_change_pm(state, pm_state);
1720 mutex_unlock(&state->mutex); 1722 mutex_unlock(&state->mutex);
1721 1723
1722 ret += sprintf(buf + ret, " tx:%d rx:%d", 1724 seq_printf(m, " tx:%d rx:%d",
1723 port->icount.tx, port->icount.rx); 1725 port->icount.tx, port->icount.rx);
1724 if (port->icount.frame) 1726 if (port->icount.frame)
1725 ret += sprintf(buf + ret, " fe:%d", 1727 seq_printf(m, " fe:%d",
1726 port->icount.frame); 1728 port->icount.frame);
1727 if (port->icount.parity) 1729 if (port->icount.parity)
1728 ret += sprintf(buf + ret, " pe:%d", 1730 seq_printf(m, " pe:%d",
1729 port->icount.parity); 1731 port->icount.parity);
1730 if (port->icount.brk) 1732 if (port->icount.brk)
1731 ret += sprintf(buf + ret, " brk:%d", 1733 seq_printf(m, " brk:%d",
1732 port->icount.brk); 1734 port->icount.brk);
1733 if (port->icount.overrun) 1735 if (port->icount.overrun)
1734 ret += sprintf(buf + ret, " oe:%d", 1736 seq_printf(m, " oe:%d",
1735 port->icount.overrun); 1737 port->icount.overrun);
1736 1738
1737#define INFOBIT(bit, str) \ 1739#define INFOBIT(bit, str) \
@@ -1753,45 +1755,39 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i)
1753 STATBIT(TIOCM_RNG, "|RI"); 1755 STATBIT(TIOCM_RNG, "|RI");
1754 if (stat_buf[0]) 1756 if (stat_buf[0])
1755 stat_buf[0] = ' '; 1757 stat_buf[0] = ' ';
1756 strcat(stat_buf, "\n");
1757 1758
1758 ret += sprintf(buf + ret, stat_buf); 1759 seq_puts(m, stat_buf);
1759 } else {
1760 strcat(buf, "\n");
1761 ret++;
1762 } 1760 }
1761 seq_putc(m, '\n');
1763#undef STATBIT 1762#undef STATBIT
1764#undef INFOBIT 1763#undef INFOBIT
1765 return ret;
1766} 1764}
1767 1765
1768static int uart_read_proc(char *page, char **start, off_t off, 1766static int uart_proc_show(struct seq_file *m, void *v)
1769 int count, int *eof, void *data)
1770{ 1767{
1771 struct tty_driver *ttydrv = data; 1768 struct tty_driver *ttydrv = v;
1772 struct uart_driver *drv = ttydrv->driver_state; 1769 struct uart_driver *drv = ttydrv->driver_state;
1773 int i, len = 0, l; 1770 int i;
1774 off_t begin = 0;
1775 1771
1776 len += sprintf(page, "serinfo:1.0 driver%s%s revision:%s\n", 1772 seq_printf(m, "serinfo:1.0 driver%s%s revision:%s\n",
1777 "", "", ""); 1773 "", "", "");
1778 for (i = 0; i < drv->nr && len < PAGE_SIZE - 96; i++) { 1774 for (i = 0; i < drv->nr; i++)
1779 l = uart_line_info(page + len, drv, i); 1775 uart_line_info(m, drv, i);
1780 len += l; 1776 return 0;
1781 if (len + begin > off + count)
1782 goto done;
1783 if (len + begin < off) {
1784 begin += len;
1785 len = 0;
1786 }
1787 }
1788 *eof = 1;
1789 done:
1790 if (off >= len + begin)
1791 return 0;
1792 *start = page + (off - begin);
1793 return (count < begin + len - off) ? count : (begin + len - off);
1794} 1777}
1778
1779static int uart_proc_open(struct inode *inode, struct file *file)
1780{
1781 return single_open(file, uart_proc_show, PDE(inode)->data);
1782}
1783
1784static const struct file_operations uart_proc_fops = {
1785 .owner = THIS_MODULE,
1786 .open = uart_proc_open,
1787 .read = seq_read,
1788 .llseek = seq_lseek,
1789 .release = single_release,
1790};
1795#endif 1791#endif
1796 1792
1797#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL) 1793#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
@@ -2299,7 +2295,7 @@ static const struct tty_operations uart_ops = {
2299 .break_ctl = uart_break_ctl, 2295 .break_ctl = uart_break_ctl,
2300 .wait_until_sent= uart_wait_until_sent, 2296 .wait_until_sent= uart_wait_until_sent,
2301#ifdef CONFIG_PROC_FS 2297#ifdef CONFIG_PROC_FS
2302 .read_proc = uart_read_proc, 2298 .proc_fops = &uart_proc_fops,
2303#endif 2299#endif
2304 .tiocmget = uart_tiocmget, 2300 .tiocmget = uart_tiocmget,
2305 .tiocmset = uart_tiocmset, 2301 .tiocmset = uart_tiocmset,