diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2008-04-28 05:15:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-28 11:58:41 -0400 |
commit | 0aa163418edfb96ca3b39133979d8e4352aaac3c (patch) | |
tree | d3f423e53b63e4bcdcb02e7bdbce1142688aeff3 /drivers | |
parent | 60c1645dfac320e992bb5635887b7698ae6606bc (diff) |
fb: convert /proc/fb to seq_file interface
Note: looks like accesses to "registered_fb" are done without any exclusion
so there're none in new proc code, too. This should be fixed in separate
patch.
[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/video/fbmem.c | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 0c1461b26dd6..776f7fcd2fbf 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/linux_logo.h> | 27 | #include <linux/linux_logo.h> |
28 | #include <linux/proc_fs.h> | 28 | #include <linux/proc_fs.h> |
29 | #include <linux/seq_file.h> | ||
29 | #include <linux/console.h> | 30 | #include <linux/console.h> |
30 | #ifdef CONFIG_KMOD | 31 | #ifdef CONFIG_KMOD |
31 | #include <linux/kmod.h> | 32 | #include <linux/kmod.h> |
@@ -632,27 +633,51 @@ int fb_prepare_logo(struct fb_info *info, int rotate) { return 0; } | |||
632 | int fb_show_logo(struct fb_info *info, int rotate) { return 0; } | 633 | int fb_show_logo(struct fb_info *info, int rotate) { return 0; } |
633 | #endif /* CONFIG_LOGO */ | 634 | #endif /* CONFIG_LOGO */ |
634 | 635 | ||
635 | static int fbmem_read_proc(char *buf, char **start, off_t offset, | 636 | static void *fb_seq_start(struct seq_file *m, loff_t *pos) |
636 | int len, int *eof, void *private) | 637 | { |
638 | return (*pos < FB_MAX) ? pos : NULL; | ||
639 | } | ||
640 | |||
641 | static void *fb_seq_next(struct seq_file *m, void *v, loff_t *pos) | ||
642 | { | ||
643 | (*pos)++; | ||
644 | return (*pos < FB_MAX) ? pos : NULL; | ||
645 | } | ||
646 | |||
647 | static void fb_seq_stop(struct seq_file *m, void *v) | ||
637 | { | 648 | { |
638 | struct fb_info **fi; | ||
639 | int clen; | ||
640 | |||
641 | clen = 0; | ||
642 | for (fi = registered_fb; fi < ®istered_fb[FB_MAX] && clen < 4000; | ||
643 | fi++) | ||
644 | if (*fi) | ||
645 | clen += sprintf(buf + clen, "%d %s\n", | ||
646 | (*fi)->node, | ||
647 | (*fi)->fix.id); | ||
648 | *start = buf + offset; | ||
649 | if (clen > offset) | ||
650 | clen -= offset; | ||
651 | else | ||
652 | clen = 0; | ||
653 | return clen < len ? clen : len; | ||
654 | } | 649 | } |
655 | 650 | ||
651 | static int fb_seq_show(struct seq_file *m, void *v) | ||
652 | { | ||
653 | int i = *(loff_t *)v; | ||
654 | struct fb_info *fi = registered_fb[i]; | ||
655 | |||
656 | if (fi) | ||
657 | seq_printf(m, "%d %s\n", fi->node, fi->fix.id); | ||
658 | return 0; | ||
659 | } | ||
660 | |||
661 | static const struct seq_operations proc_fb_seq_ops = { | ||
662 | .start = fb_seq_start, | ||
663 | .next = fb_seq_next, | ||
664 | .stop = fb_seq_stop, | ||
665 | .show = fb_seq_show, | ||
666 | }; | ||
667 | |||
668 | static int proc_fb_open(struct inode *inode, struct file *file) | ||
669 | { | ||
670 | return seq_open(file, &proc_fb_seq_ops); | ||
671 | } | ||
672 | |||
673 | static const struct file_operations fb_proc_fops = { | ||
674 | .owner = THIS_MODULE, | ||
675 | .open = proc_fb_open, | ||
676 | .read = seq_read, | ||
677 | .llseek = seq_lseek, | ||
678 | .release = seq_release, | ||
679 | }; | ||
680 | |||
656 | static ssize_t | 681 | static ssize_t |
657 | fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) | 682 | fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) |
658 | { | 683 | { |
@@ -1533,7 +1558,7 @@ void fb_set_suspend(struct fb_info *info, int state) | |||
1533 | static int __init | 1558 | static int __init |
1534 | fbmem_init(void) | 1559 | fbmem_init(void) |
1535 | { | 1560 | { |
1536 | create_proc_read_entry("fb", 0, NULL, fbmem_read_proc, NULL); | 1561 | proc_create("fb", 0, NULL, &fb_proc_fops); |
1537 | 1562 | ||
1538 | if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) | 1563 | if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) |
1539 | printk("unable to get major %d for fb devs\n", FB_MAJOR); | 1564 | printk("unable to get major %d for fb devs\n", FB_MAJOR); |