Commit ff8fbcf6 authored by Thomas Zimmermann's avatar Thomas Zimmermann

fbdev/core: Rework fb init code

Init the class "graphics" before the rest of fbdev. Later steps, such
as the sysfs code, depend on the class. Also arrange the module's exit
code in reverse order.

Unexport the global variable fb_class, which is only shared internally
within the fbdev core module.
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-38-tzimmermann@suse.de
parent 588b3563
...@@ -11,6 +11,7 @@ int fb_register_chrdev(void); ...@@ -11,6 +11,7 @@ int fb_register_chrdev(void);
void fb_unregister_chrdev(void); void fb_unregister_chrdev(void);
/* fbmem.c */ /* fbmem.c */
extern struct class *fb_class;
extern struct mutex registration_lock; extern struct mutex registration_lock;
extern struct fb_info *registered_fb[FB_MAX]; extern struct fb_info *registered_fb[FB_MAX];
extern int num_registered_fb; extern int num_registered_fb;
......
...@@ -78,6 +78,7 @@ ...@@ -78,6 +78,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include "fbcon.h" #include "fbcon.h"
#include "fb_internal.h"
/* /*
* FIXME: Locking * FIXME: Locking
......
...@@ -44,6 +44,8 @@ ...@@ -44,6 +44,8 @@
#define FBPIXMAPSIZE (1024 * 8) #define FBPIXMAPSIZE (1024 * 8)
struct class *fb_class;
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;
...@@ -899,9 +901,6 @@ fb_blank(struct fb_info *info, int blank) ...@@ -899,9 +901,6 @@ fb_blank(struct fb_info *info, int blank)
} }
EXPORT_SYMBOL(fb_blank); EXPORT_SYMBOL(fb_blank);
struct class *fb_class;
EXPORT_SYMBOL(fb_class);
static int fb_check_foreignness(struct fb_info *fi) static int fb_check_foreignness(struct fb_info *fi)
{ {
const bool foreign_endian = fi->flags & FBINFO_FOREIGN_ENDIAN; const bool foreign_endian = fi->flags & FBINFO_FOREIGN_ENDIAN;
...@@ -1108,59 +1107,48 @@ void fb_set_suspend(struct fb_info *info, int state) ...@@ -1108,59 +1107,48 @@ void fb_set_suspend(struct fb_info *info, int state)
} }
EXPORT_SYMBOL(fb_set_suspend); EXPORT_SYMBOL(fb_set_suspend);
/** static int __init fbmem_init(void)
* fbmem_init - init frame buffer subsystem
*
* Initialize the frame buffer subsystem.
*
* NOTE: This function is _only_ to be called by drivers/char/mem.c.
*
*/
static int __init
fbmem_init(void)
{ {
int ret; int ret;
fb_class = class_create("graphics");
if (IS_ERR(fb_class)) {
ret = PTR_ERR(fb_class);
pr_err("Unable to create fb class; errno = %d\n", ret);
goto err_fb_class;
}
ret = fb_init_procfs(); ret = fb_init_procfs();
if (ret) if (ret)
return ret; goto err_class_destroy;
ret = fb_register_chrdev(); ret = fb_register_chrdev();
if (ret) if (ret)
goto err_chrdev; goto err_fb_cleanup_procfs;
fb_class = class_create("graphics");
if (IS_ERR(fb_class)) {
ret = PTR_ERR(fb_class);
pr_warn("Unable to create fb class; errno = %d\n", ret);
fb_class = NULL;
goto err_class;
}
fb_console_init(); fb_console_init();
return 0; return 0;
err_class: err_fb_cleanup_procfs:
fb_unregister_chrdev();
err_chrdev:
fb_cleanup_procfs(); fb_cleanup_procfs();
err_class_destroy:
class_destroy(fb_class);
err_fb_class:
fb_class = NULL;
return ret; return ret;
} }
#ifdef MODULE #ifdef MODULE
module_init(fbmem_init); static void __exit fbmem_exit(void)
static void __exit
fbmem_exit(void)
{ {
fb_console_exit(); fb_console_exit();
fb_unregister_chrdev();
fb_cleanup_procfs(); fb_cleanup_procfs();
class_destroy(fb_class); class_destroy(fb_class);
fb_unregister_chrdev();
} }
module_init(fbmem_init);
module_exit(fbmem_exit); module_exit(fbmem_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Framebuffer base"); MODULE_DESCRIPTION("Framebuffer base");
......
...@@ -609,7 +609,6 @@ extern int fb_new_modelist(struct fb_info *info); ...@@ -609,7 +609,6 @@ extern int fb_new_modelist(struct fb_info *info);
extern bool fb_center_logo; extern bool fb_center_logo;
extern int fb_logo_count; extern int fb_logo_count;
extern struct class *fb_class;
static inline void lock_fb_info(struct fb_info *info) static inline void lock_fb_info(struct fb_info *info)
{ {
......
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