diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2009-03-31 18:19:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-01 11:59:10 -0400 |
commit | d196a949ba0fb85121c0dc0720b13380d802dbd6 (patch) | |
tree | 38c6d78b1cd684ebb7a9d8844d3a5fa2c9a3fbb0 /drivers/serial | |
parent | 201a50ba6627dd00aa7b7673a5c454ca387095fb (diff) |
proc tty: switch serial_core to ->proc_fops
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/serial_core.c | 76 |
1 files changed, 36 insertions, 40 deletions
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index 42f4e66fccaf..bf3c0e32a334 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 | ||
1685 | static int uart_line_info(char *buf, struct uart_driver *drv, int i) | 1687 | static 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 | ||
1768 | static int uart_read_proc(char *page, char **start, off_t off, | 1766 | static 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 | |||
1779 | static int uart_proc_open(struct inode *inode, struct file *file) | ||
1780 | { | ||
1781 | return single_open(file, uart_proc_show, PDE(inode)->data); | ||
1782 | } | ||
1783 | |||
1784 | static 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, |