Commit 17e8ea40 authored by Luca Tettamanti's avatar Luca Tettamanti Committed by Greg Kroah-Hartman

[PATCH] Sysfs for framebuffer

the following patch (against 2.6.5-rc2) teaches fb to use class_simple.
With this patch udev will automagically create device nodes for each
framebuffer registered. Once all drivers are converted to
framebuffer_{alloc,release} we can switch to our own class.

This is what sysfs dir looks like:

notebook:~# tree /sys/class/graphics/
/sys/class/graphics/
`-- fb0
    `-- dev
parent 2df5f2d5
...@@ -32,6 +32,9 @@ ...@@ -32,6 +32,9 @@
#include <linux/kmod.h> #include <linux/kmod.h>
#endif #endif
#include <linux/devfs_fs_kernel.h> #include <linux/devfs_fs_kernel.h>
#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/device.h>
#if defined(__mc68000__) || defined(CONFIG_APUS) #if defined(__mc68000__) || defined(CONFIG_APUS)
#include <asm/setup.h> #include <asm/setup.h>
...@@ -1251,6 +1254,8 @@ static struct file_operations fb_fops = { ...@@ -1251,6 +1254,8 @@ static struct file_operations fb_fops = {
#endif #endif
}; };
static struct class_simple *fb_class;
/** /**
* register_framebuffer - registers a frame buffer device * register_framebuffer - registers a frame buffer device
* @fb_info: frame buffer info structure * @fb_info: frame buffer info structure
...@@ -1265,6 +1270,7 @@ int ...@@ -1265,6 +1270,7 @@ int
register_framebuffer(struct fb_info *fb_info) register_framebuffer(struct fb_info *fb_info)
{ {
int i; int i;
struct class_device *c;
if (num_registered_fb == FB_MAX) if (num_registered_fb == FB_MAX)
return -ENXIO; return -ENXIO;
...@@ -1273,6 +1279,12 @@ register_framebuffer(struct fb_info *fb_info) ...@@ -1273,6 +1279,12 @@ register_framebuffer(struct fb_info *fb_info)
if (!registered_fb[i]) if (!registered_fb[i])
break; break;
fb_info->node = i; fb_info->node = i;
c = class_simple_device_add(fb_class, MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
if (IS_ERR(c)) {
/* Not fatal */
printk(KERN_WARNING "Unable to create class_device for framebuffer %d; errno = %ld\n", i, PTR_ERR(c));
}
if (fb_info->pixmap.addr == NULL) { if (fb_info->pixmap.addr == NULL) {
fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL); fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);
...@@ -1338,6 +1350,7 @@ unregister_framebuffer(struct fb_info *fb_info) ...@@ -1338,6 +1350,7 @@ unregister_framebuffer(struct fb_info *fb_info)
kfree(fb_info->sprite.addr); kfree(fb_info->sprite.addr);
registered_fb[i]=NULL; registered_fb[i]=NULL;
num_registered_fb--; num_registered_fb--;
class_simple_device_remove(MKDEV(FB_MAJOR, i));
return 0; return 0;
} }
...@@ -1399,6 +1412,12 @@ fbmem_init(void) ...@@ -1399,6 +1412,12 @@ fbmem_init(void)
if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
printk("unable to get major %d for fb devs\n", FB_MAJOR); printk("unable to get major %d for fb devs\n", FB_MAJOR);
fb_class = class_simple_create(THIS_MODULE, "graphics");
if (IS_ERR(fb_class)) {
printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
fb_class = NULL;
}
#ifdef CONFIG_FB_OF #ifdef CONFIG_FB_OF
if (ofonly) { if (ofonly) {
offb_init(); offb_init();
......
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