Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0 2 : 3 : #include <linux/proc_fs.h> 4 : 5 : #include "fb_internal.h" 6 : 7 : static struct proc_dir_entry *fb_proc_dir_entry; 8 : 9 0 : static void *fb_seq_start(struct seq_file *m, loff_t *pos) 10 : { 11 0 : mutex_lock(®istration_lock); 12 : 13 0 : return (*pos < FB_MAX) ? pos : NULL; 14 : } 15 : 16 0 : static void fb_seq_stop(struct seq_file *m, void *v) 17 : { 18 0 : mutex_unlock(®istration_lock); 19 0 : } 20 : 21 0 : static void *fb_seq_next(struct seq_file *m, void *v, loff_t *pos) 22 : { 23 0 : (*pos)++; 24 : 25 0 : return (*pos < FB_MAX) ? pos : NULL; 26 : } 27 : 28 0 : static int fb_seq_show(struct seq_file *m, void *v) 29 : { 30 0 : int i = *(loff_t *)v; 31 0 : struct fb_info *fi = registered_fb[i]; 32 : 33 0 : if (fi) 34 0 : seq_printf(m, "%d %s\n", fi->node, fi->fix.id); 35 : 36 0 : return 0; 37 : } 38 : 39 : static const struct seq_operations __maybe_unused fb_proc_seq_ops = { 40 : .start = fb_seq_start, 41 : .stop = fb_seq_stop, 42 : .next = fb_seq_next, 43 : .show = fb_seq_show, 44 : }; 45 : 46 1 : int fb_init_procfs(void) 47 : { 48 : struct proc_dir_entry *proc; 49 : 50 1 : proc = proc_create_seq("fb", 0, NULL, &fb_proc_seq_ops); 51 1 : if (!proc) 52 : return -ENOMEM; 53 : 54 1 : fb_proc_dir_entry = proc; 55 : 56 1 : return 0; 57 : } 58 : 59 0 : void fb_cleanup_procfs(void) 60 : { 61 0 : proc_remove(fb_proc_dir_entry); 62 0 : }