* [PATCH] fbdev sysfs updates.
@ 2007-05-02 19:45 James Simmons
2007-05-02 21:36 ` Antonino A. Daplas
0 siblings, 1 reply; 4+ messages in thread
From: James Simmons @ 2007-05-02 19:45 UTC (permalink / raw)
To: Andrew Morton; +Cc: Linux Fbdev development list, Antonino A. Daplas
Andrew can you try this patch. The goal of the patch is to allow the
hardware behind fbdev to be shared with out types of devices i.e
backlight, drm, and display. Please give it a try.
Signed-Off: James Simmons <jsimmons@infradead.org>
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
index 2822526..2cff39c 100644
--- a/drivers/video/fbmem.c
+++ b/drivers/video/fbmem.c
@@ -1268,8 +1268,6 @@ static const struct file_operations fb_fops = {
#endif
};
-struct class *fb_class;
-EXPORT_SYMBOL(fb_class);
/**
* register_framebuffer - registers a frame buffer device
* @fb_info: frame buffer info structure
@@ -1295,14 +1293,9 @@ register_framebuffer(struct fb_info *fb_info)
break;
fb_info->node = i;
- fb_info->dev = device_create(fb_class, fb_info->device,
- MKDEV(FB_MAJOR, i), "fb%d", i);
- if (IS_ERR(fb_info->dev)) {
- /* Not fatal */
+ /* Not fatal */
+ if (fb_init_device(fb_info))
printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev));
- fb_info->dev = NULL;
- } else
- fb_init_device(fb_info);
if (fb_info->pixmap.addr == NULL) {
fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);
@@ -1356,7 +1349,6 @@ unregister_framebuffer(struct fb_info *fb_info)
registered_fb[i]=NULL;
num_registered_fb--;
fb_cleanup_device(fb_info);
- device_destroy(fb_class, MKDEV(FB_MAJOR, i));
event.info = fb_info;
fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event);
return 0;
@@ -1402,11 +1394,7 @@ fbmem_init(void)
if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
printk("unable to get major %d for fb devs\n", FB_MAJOR);
- fb_class = class_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;
- }
+ fb_create_class();
return 0;
}
@@ -1415,8 +1403,8 @@ module_init(fbmem_init);
static void __exit
fbmem_exit(void)
{
- class_destroy(fb_class);
unregister_chrdev(FB_MAJOR, "fb");
+ fb_destroy_class();
}
module_exit(fbmem_exit);
diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c
index 40c80c8..d3caba6 100644
--- a/drivers/video/fbsysfs.c
+++ b/drivers/video/fbsysfs.c
@@ -505,42 +505,99 @@ static struct device_attribute device_attrs[] = {
#endif
};
-int fb_init_device(struct fb_info *fb_info)
+struct class *fb_class;
+EXPORT_SYMBOL(fb_class);
+
+static void fb_device_release(struct device *dev)
{
- int i, error = 0;
+ struct fb_info *fb_info = dev_get_drvdata(dev);
- dev_set_drvdata(fb_info->dev, fb_info);
+ if (fb_info) {
+ acquire_console_sem();
- fb_info->class_flag |= FB_SYSFS_FLAG_ATTR;
+ // shutdown the hardware.
+ if (fb_info->fbops->fb_release)
+ fb_info->fbops->fb_release(fb_info, 0);
- for (i = 0; i < ARRAY_SIZE(device_attrs); i++) {
- error = device_create_file(fb_info->dev, &device_attrs[i]);
+ fb_dealloc_cmap(&fb_info->cmap);
+ unregister_framebuffer(fb_info);
- if (error)
- break;
+ //framebuffer_release(info); Not every driver does this yet
+ release_console_sem();
}
+}
- if (error) {
- while (--i >= 0)
- device_remove_file(fb_info->dev, &device_attrs[i]);
+int fb_init_device(struct fb_info *fb_info)
+{
+ int error = 0;
+
+ fb_info->dev = device_create(fb_class, fb_info->device,
+ MKDEV(FB_MAJOR, fb_info->node),
+ "fb%d", fb_info->node);
+ if (IS_ERR(fb_info->dev)) {
fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR;
+ fb_info->dev = NULL;
+ error = -EINVAL;
+ } else {
+ dev_set_drvdata(fb_info->dev, fb_info);
+ fb_info->dev->release = fb_device_release;
+ fb_info->class_flag |= FB_SYSFS_FLAG_ATTR;
}
-
- return 0;
+ return error;
}
void fb_cleanup_device(struct fb_info *fb_info)
{
- unsigned int i;
+ fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR;
+ dev_set_drvdata(fb_info->dev, NULL);
+ device_destroy(fb_class, MKDEV(FB_MAJOR, fb_info->node));
+}
- if (fb_info->class_flag & FB_SYSFS_FLAG_ATTR) {
- for (i = 0; i < ARRAY_SIZE(device_attrs); i++)
- device_remove_file(fb_info->dev, &device_attrs[i]);
+static int fb_class_suspend(struct device *dev, pm_message_t state)
+{
+ struct fb_info *fb_info = dev_get_drvdata(dev);
+ int ret = 0;
- fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR;
+ acquire_console_sem();
+ fb_set_suspend(fb_info, 1);
+ if (fb_info->fbops->fb_power)
+ ret = fb_info->fbops->fb_power(fb_info, state);
+ release_console_sem();
+ return ret;
+}
+
+static int fb_class_resume(struct device *dev)
+{
+ struct fb_info *fb_info = dev_get_drvdata(dev);
+ int ret = 0;
+
+ acquire_console_sem();
+ fb_set_suspend(fb_info, 0);
+ if (fb_info->fbops->fb_power)
+ ret = fb_info->fbops->fb_power(fb_info, PMSG_ON);
+ release_console_sem();
+ return ret;
+}
+
+void fb_create_class()
+{
+ fb_class = class_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;
+ } else {
+ fb_class->suspend = fb_class_suspend;
+ fb_class->resume = fb_class_resume;
+ fb_class->dev_attrs = device_attrs;
}
}
+void fb_destroy_class()
+{
+ if (fb_class)
+ class_destroy(fb_class);
+}
+
#ifdef CONFIG_FB_BACKLIGHT
/* This function generates a linear backlight curve
*
diff --git a/include/linux/fb.h b/include/linux/fb.h
index be913ec..ab01e0e 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -629,6 +629,9 @@ struct fb_ops {
/* perform fb specific mmap */
int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
+ /* Power management */
+ int (*fb_power)(struct fb_info *info, pm_message_t state);
+
/* save current hardware state */
void (*fb_save_state)(struct fb_info *info);
@@ -919,6 +922,8 @@ extern void framebuffer_release(struct fb_info *info);
extern int fb_init_device(struct fb_info *fb_info);
extern void fb_cleanup_device(struct fb_info *head);
extern void fb_bl_default_curve(struct fb_info *fb_info, u8 off, u8 min, u8 max);
+extern void fb_destroy_class(void);
+extern void fb_create_class(void);
/* drivers/video/fbmon.c */
#define FB_MAXTIMINGS 0
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] fbdev sysfs updates.
2007-05-02 19:45 [PATCH] fbdev sysfs updates James Simmons
@ 2007-05-02 21:36 ` Antonino A. Daplas
2007-05-03 14:03 ` James Simmons
0 siblings, 1 reply; 4+ messages in thread
From: Antonino A. Daplas @ 2007-05-02 21:36 UTC (permalink / raw)
To: linux-fbdev-devel; +Cc: Andrew Morton, James Simmons
On Wed, 2007-05-02 at 20:45 +0100, James Simmons wrote:
> Andrew can you try this patch. The goal of the patch is to allow the
> hardware behind fbdev to be shared with out types of devices i.e
> backlight, drm, and display. Please give it a try.
>
Any real world examples on how this patch can allow sharing with DRM?
I'm not sure if your changelog reflects the content of this patch.
Tony
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] fbdev sysfs updates.
2007-05-02 21:36 ` Antonino A. Daplas
@ 2007-05-03 14:03 ` James Simmons
2007-05-03 19:22 ` Antonino A. Daplas
0 siblings, 1 reply; 4+ messages in thread
From: James Simmons @ 2007-05-03 14:03 UTC (permalink / raw)
To: Antonino A. Daplas; +Cc: Andrew Morton, linux-fbdev-devel
> On Wed, 2007-05-02 at 20:45 +0100, James Simmons wrote:
> > Andrew can you try this patch. The goal of the patch is to allow the
> > hardware behind fbdev to be shared with out types of devices i.e
> > backlight, drm, and display. Please give it a try.
> >
>
> Any real world examples on how this patch can allow sharing with DRM?
> I'm not sure if your changelog reflects the content of this patch.
DRM would need to be updated to use a child device. The idea is simple.
Use the device created with device_create instead of the parent device.
The conflict was storing our private data with the parent device. Now it
is stored in the child device. Other subsystems already use this approach.
The drivers would need to be be cleaned up. Right now they use the parent
device to stored fb_info.
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] fbdev sysfs updates.
2007-05-03 14:03 ` James Simmons
@ 2007-05-03 19:22 ` Antonino A. Daplas
0 siblings, 0 replies; 4+ messages in thread
From: Antonino A. Daplas @ 2007-05-03 19:22 UTC (permalink / raw)
To: James Simmons; +Cc: Andrew Morton, linux-fbdev-devel
On Thu, 2007-05-03 at 15:03 +0100, James Simmons wrote:
> > On Wed, 2007-05-02 at 20:45 +0100, James Simmons wrote:
> > > Andrew can you try this patch. The goal of the patch is to allow the
> > > hardware behind fbdev to be shared with out types of devices i.e
> > > backlight, drm, and display. Please give it a try.
> > >
> >
> > Any real world examples on how this patch can allow sharing with DRM?
> > I'm not sure if your changelog reflects the content of this patch.
>
> DRM would need to be updated to use a child device. The idea is simple.
> Use the device created with device_create instead of the parent device.
> The conflict was storing our private data with the parent device. Now it
> is stored in the child device. Other subsystems already use this approach.
> The drivers would need to be be cleaned up. Right now they use the parent
> device to stored fb_info.
What I basically see in this patch, unless I miss something, is moving
device code from fbmem.c to fbsysfs.c and the creation of fb_power()
hook. I have nothing against the patch in principle, I just think the
changelog is not very clear.
Tony
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-05-03 19:22 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-02 19:45 [PATCH] fbdev sysfs updates James Simmons
2007-05-02 21:36 ` Antonino A. Daplas
2007-05-03 14:03 ` James Simmons
2007-05-03 19:22 ` Antonino A. Daplas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).