Commit abcc2f3c authored by Thomas Zimmermann's avatar Thomas Zimmermann

fbdev/core: Move procfs code to separate file

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230613110953.24176-36-tzimmermann@suse.de
parent e2af0032
...@@ -3,6 +3,7 @@ obj-$(CONFIG_FB_NOTIFY) += fb_notify.o ...@@ -3,6 +3,7 @@ obj-$(CONFIG_FB_NOTIFY) += fb_notify.o
obj-$(CONFIG_FB) += fb.o obj-$(CONFIG_FB) += fb.o
fb-y := fb_backlight.o \ fb-y := fb_backlight.o \
fb_info.o \ fb_info.o \
fb_procfs.o \
fbmem.o fbmon.o fbcmap.o fbsysfs.o \ fbmem.o fbmon.o fbcmap.o fbsysfs.o \
modedb.o fbcvt.o fb_cmdline.o fb_io_fops.o modedb.o fbcvt.o fb_cmdline.o fb_io_fops.o
fb-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o fb-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o
......
...@@ -3,7 +3,17 @@ ...@@ -3,7 +3,17 @@
#ifndef _FB_INTERNAL_H #ifndef _FB_INTERNAL_H
#define _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 */ /* fbsysfs.c */
int fb_device_create(struct fb_info *fb_info); int fb_device_create(struct fb_info *fb_info);
......
// 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);
}
...@@ -24,9 +24,7 @@ ...@@ -24,9 +24,7 @@
#include <linux/vt.h> #include <linux/vt.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/linux_logo.h> #include <linux/linux_logo.h>
#include <linux/proc_fs.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/seq_file.h>
#include <linux/console.h> #include <linux/console.h>
#include <linux/kmod.h> #include <linux/kmod.h>
#include <linux/err.h> #include <linux/err.h>
...@@ -48,8 +46,7 @@ ...@@ -48,8 +46,7 @@
#define FBPIXMAPSIZE (1024 * 8) #define FBPIXMAPSIZE (1024 * 8)
static DEFINE_MUTEX(registration_lock); DEFINE_MUTEX(registration_lock);
struct fb_info *registered_fb[FB_MAX] __read_mostly; struct fb_info *registered_fb[FB_MAX] __read_mostly;
int num_registered_fb __read_mostly; int num_registered_fb __read_mostly;
#define for_each_registered_fb(i) \ #define for_each_registered_fb(i) \
...@@ -705,40 +702,6 @@ int fb_show_logo(struct fb_info *info, int rotate) { return 0; } ...@@ -705,40 +702,6 @@ int fb_show_logo(struct fb_info *info, int rotate) { return 0; }
EXPORT_SYMBOL(fb_prepare_logo); EXPORT_SYMBOL(fb_prepare_logo);
EXPORT_SYMBOL(fb_show_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, * We hold a reference to the fb_info in file->private_data,
* but if the current registered fb has changed, we don't * but if the current registered fb has changed, we don't
...@@ -1624,8 +1587,9 @@ fbmem_init(void) ...@@ -1624,8 +1587,9 @@ fbmem_init(void)
{ {
int ret; int ret;
if (!proc_create_seq("fb", 0, NULL, &proc_fb_seq_ops)) ret = fb_init_procfs();
return -ENOMEM; if (ret)
return ret;
ret = register_chrdev(FB_MAJOR, "fb", &fb_fops); ret = register_chrdev(FB_MAJOR, "fb", &fb_fops);
if (ret) { if (ret) {
...@@ -1648,7 +1612,7 @@ fbmem_init(void) ...@@ -1648,7 +1612,7 @@ fbmem_init(void)
err_class: err_class:
unregister_chrdev(FB_MAJOR, "fb"); unregister_chrdev(FB_MAJOR, "fb");
err_chrdev: err_chrdev:
remove_proc_entry("fb", NULL); fb_cleanup_procfs();
return ret; return ret;
} }
...@@ -1659,7 +1623,7 @@ fbmem_exit(void) ...@@ -1659,7 +1623,7 @@ fbmem_exit(void)
{ {
fb_console_exit(); fb_console_exit();
remove_proc_entry("fb", NULL); fb_cleanup_procfs();
class_destroy(fb_class); class_destroy(fb_class);
unregister_chrdev(FB_MAJOR, "fb"); unregister_chrdev(FB_MAJOR, "fb");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment