diff options
Diffstat (limited to 'arch/ia64/hp/sim/simserial.c')
-rw-r--r-- | arch/ia64/hp/sim/simserial.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c index 24b1ad5334cb..2bef5261d96d 100644 --- a/arch/ia64/hp/sim/simserial.c +++ b/arch/ia64/hp/sim/simserial.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/major.h> | 24 | #include <linux/major.h> |
25 | #include <linux/fcntl.h> | 25 | #include <linux/fcntl.h> |
26 | #include <linux/mm.h> | 26 | #include <linux/mm.h> |
27 | #include <linux/seq_file.h> | ||
27 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
28 | #include <linux/capability.h> | 29 | #include <linux/capability.h> |
29 | #include <linux/console.h> | 30 | #include <linux/console.h> |
@@ -848,38 +849,36 @@ static int rs_open(struct tty_struct *tty, struct file * filp) | |||
848 | * /proc fs routines.... | 849 | * /proc fs routines.... |
849 | */ | 850 | */ |
850 | 851 | ||
851 | static inline int line_info(char *buf, struct serial_state *state) | 852 | static inline void line_info(struct seq_file *m, struct serial_state *state) |
852 | { | 853 | { |
853 | return sprintf(buf, "%d: uart:%s port:%lX irq:%d\n", | 854 | seq_printf(m, "%d: uart:%s port:%lX irq:%d\n", |
854 | state->line, uart_config[state->type].name, | 855 | state->line, uart_config[state->type].name, |
855 | state->port, state->irq); | 856 | state->port, state->irq); |
856 | } | 857 | } |
857 | 858 | ||
858 | static int rs_read_proc(char *page, char **start, off_t off, int count, | 859 | static int rs_proc_show(struct seq_file *m, void *v) |
859 | int *eof, void *data) | ||
860 | { | 860 | { |
861 | int i, len = 0, l; | 861 | int i; |
862 | off_t begin = 0; | 862 | |
863 | 863 | seq_printf(m, "simserinfo:1.0 driver:%s\n", serial_version); | |
864 | len += sprintf(page, "simserinfo:1.0 driver:%s\n", serial_version); | 864 | for (i = 0; i < NR_PORTS; i++) |
865 | for (i = 0; i < NR_PORTS && len < 4000; i++) { | 865 | line_info(m, &rs_table[i]); |
866 | l = line_info(page + len, &rs_table[i]); | 866 | return 0; |
867 | len += l; | ||
868 | if (len+begin > off+count) | ||
869 | goto done; | ||
870 | if (len+begin < off) { | ||
871 | begin += len; | ||
872 | len = 0; | ||
873 | } | ||
874 | } | ||
875 | *eof = 1; | ||
876 | done: | ||
877 | if (off >= len+begin) | ||
878 | return 0; | ||
879 | *start = page + (begin-off); | ||
880 | return ((count < begin+len-off) ? count : begin+len-off); | ||
881 | } | 867 | } |
882 | 868 | ||
869 | static int rs_proc_open(struct inode *inode, struct file *file) | ||
870 | { | ||
871 | return single_open(file, rs_proc_show, NULL); | ||
872 | } | ||
873 | |||
874 | static const struct file_operations rs_proc_fops = { | ||
875 | .owner = THIS_MODULE, | ||
876 | .open = rs_proc_open, | ||
877 | .read = seq_read, | ||
878 | .llseek = seq_lseek, | ||
879 | .release = single_release, | ||
880 | }; | ||
881 | |||
883 | /* | 882 | /* |
884 | * --------------------------------------------------------------------- | 883 | * --------------------------------------------------------------------- |
885 | * rs_init() and friends | 884 | * rs_init() and friends |
@@ -917,7 +916,7 @@ static const struct tty_operations hp_ops = { | |||
917 | .start = rs_start, | 916 | .start = rs_start, |
918 | .hangup = rs_hangup, | 917 | .hangup = rs_hangup, |
919 | .wait_until_sent = rs_wait_until_sent, | 918 | .wait_until_sent = rs_wait_until_sent, |
920 | .read_proc = rs_read_proc, | 919 | .proc_fops = &rs_proc_fops, |
921 | }; | 920 | }; |
922 | 921 | ||
923 | /* | 922 | /* |