fbdev/core: Move procfs code to separate file
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 13 Jun 2023 11:07:10 +0000 (13:07 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 27 Jun 2023 07:58:51 +0000 (09:58 +0200)
Move fbdev's procfs code into a separate file and contain it in
init and cleanup helpers. For the cleanup, replace remove_proc_entry()
with proc_remove(). It is equivalent in functionality, but looks
more like an inverse of proc_create_seq().

v2:
* document proc_remove() usage (Sam)
* revert unrelated removal of for_each_registered_fb()

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230613110953.24176-36-tzimmermann@suse.de
drivers/video/fbdev/core/Makefile
drivers/video/fbdev/core/fb_internal.h
drivers/video/fbdev/core/fb_procfs.c [new file with mode: 0644]
drivers/video/fbdev/core/fbmem.c

index eee3295..6653201 100644 (file)
@@ -3,6 +3,7 @@ obj-$(CONFIG_FB_NOTIFY)           += fb_notify.o
 obj-$(CONFIG_FB)                  += fb.o
 fb-y                              := fb_backlight.o \
                                      fb_info.o \
+                                     fb_procfs.o \
                                      fbmem.o fbmon.o fbcmap.o fbsysfs.o \
                                      modedb.o fbcvt.o fb_cmdline.o fb_io_fops.o
 fb-$(CONFIG_FB_DEFERRED_IO)       += fb_defio.o
index 0b9640a..51f7c9f 100644 (file)
@@ -3,7 +3,17 @@
 #ifndef _FB_INTERNAL_H
 #define _FB_INTERNAL_H
 
-struct fb_info;
+#include <linux/fb.h>
+#include <linux/mutex.h>
+
+/* fbmem.c */
+extern struct mutex registration_lock;
+extern struct fb_info *registered_fb[FB_MAX];
+extern int num_registered_fb;
+
+/* fb_procfs.c */
+int fb_init_procfs(void);
+void fb_cleanup_procfs(void);
 
 /* fbsysfs.c */
 int fb_device_create(struct fb_info *fb_info);
diff --git a/drivers/video/fbdev/core/fb_procfs.c b/drivers/video/fbdev/core/fb_procfs.c
new file mode 100644 (file)
index 0000000..5964114
--- /dev/null
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/proc_fs.h>
+
+#include "fb_internal.h"
+
+static struct proc_dir_entry *fb_proc_dir_entry;
+
+static void *fb_seq_start(struct seq_file *m, loff_t *pos)
+{
+       mutex_lock(&registration_lock);
+
+       return (*pos < FB_MAX) ? pos : NULL;
+}
+
+static void fb_seq_stop(struct seq_file *m, void *v)
+{
+       mutex_unlock(&registration_lock);
+}
+
+static void *fb_seq_next(struct seq_file *m, void *v, loff_t *pos)
+{
+       (*pos)++;
+
+       return (*pos < FB_MAX) ? pos : NULL;
+}
+
+static int fb_seq_show(struct seq_file *m, void *v)
+{
+       int i = *(loff_t *)v;
+       struct fb_info *fi = registered_fb[i];
+
+       if (fi)
+               seq_printf(m, "%d %s\n", fi->node, fi->fix.id);
+
+       return 0;
+}
+
+static const struct seq_operations __maybe_unused fb_proc_seq_ops = {
+       .start  = fb_seq_start,
+       .stop   = fb_seq_stop,
+       .next   = fb_seq_next,
+       .show   = fb_seq_show,
+};
+
+int fb_init_procfs(void)
+{
+       struct proc_dir_entry *proc;
+
+       proc = proc_create_seq("fb", 0, NULL, &fb_proc_seq_ops);
+       if (!proc)
+               return -ENOMEM;
+
+       fb_proc_dir_entry = proc;
+
+       return 0;
+}
+
+void fb_cleanup_procfs(void)
+{
+       proc_remove(fb_proc_dir_entry);
+}
index 6653277..5362099 100644 (file)
@@ -24,9 +24,7 @@
 #include <linux/vt.h>
 #include <linux/init.h>
 #include <linux/linux_logo.h>
-#include <linux/proc_fs.h>
 #include <linux/platform_device.h>
-#include <linux/seq_file.h>
 #include <linux/console.h>
 #include <linux/kmod.h>
 #include <linux/err.h>
@@ -48,8 +46,7 @@
 
 #define FBPIXMAPSIZE   (1024 * 8)
 
-static DEFINE_MUTEX(registration_lock);
-
+DEFINE_MUTEX(registration_lock);
 struct fb_info *registered_fb[FB_MAX] __read_mostly;
 int num_registered_fb __read_mostly;
 #define for_each_registered_fb(i)              \
@@ -705,40 +702,6 @@ int fb_show_logo(struct fb_info *info, int rotate) { return 0; }
 EXPORT_SYMBOL(fb_prepare_logo);
 EXPORT_SYMBOL(fb_show_logo);
 
-static void *fb_seq_start(struct seq_file *m, loff_t *pos)
-{
-       mutex_lock(&registration_lock);
-       return (*pos < FB_MAX) ? pos : NULL;
-}
-
-static void *fb_seq_next(struct seq_file *m, void *v, loff_t *pos)
-{
-       (*pos)++;
-       return (*pos < FB_MAX) ? pos : NULL;
-}
-
-static void fb_seq_stop(struct seq_file *m, void *v)
-{
-       mutex_unlock(&registration_lock);
-}
-
-static int fb_seq_show(struct seq_file *m, void *v)
-{
-       int i = *(loff_t *)v;
-       struct fb_info *fi = registered_fb[i];
-
-       if (fi)
-               seq_printf(m, "%d %s\n", fi->node, fi->fix.id);
-       return 0;
-}
-
-static const struct seq_operations __maybe_unused proc_fb_seq_ops = {
-       .start  = fb_seq_start,
-       .next   = fb_seq_next,
-       .stop   = fb_seq_stop,
-       .show   = fb_seq_show,
-};
-
 /*
  * We hold a reference to the fb_info in file->private_data,
  * but if the current registered fb has changed, we don't
@@ -1624,8 +1587,9 @@ fbmem_init(void)
 {
        int ret;
 
-       if (!proc_create_seq("fb", 0, NULL, &proc_fb_seq_ops))
-               return -ENOMEM;
+       ret = fb_init_procfs();
+       if (ret)
+               return ret;
 
        ret = register_chrdev(FB_MAJOR, "fb", &fb_fops);
        if (ret) {
@@ -1648,7 +1612,7 @@ fbmem_init(void)
 err_class:
        unregister_chrdev(FB_MAJOR, "fb");
 err_chrdev:
-       remove_proc_entry("fb", NULL);
+       fb_cleanup_procfs();
        return ret;
 }
 
@@ -1659,7 +1623,7 @@ fbmem_exit(void)
 {
        fb_console_exit();
 
-       remove_proc_entry("fb", NULL);
+       fb_cleanup_procfs();
        class_destroy(fb_class);
        unregister_chrdev(FB_MAJOR, "fb");
 }