Skip to contentSkip to conversation

sysfs class patches - take 2 [0/5]

PATCH In review Greg KH 3 participants 11 messages Dec 23, 2003 – Dec 24, 2003

Subsystems (3)
lore
Share & tools
lore

Greg KH

author
#0 lore raw

PATCH 1/1 sysfs class patches - take 2 [0/5]

Here are the sysfs class patches reworked against a clean 2.6.0 tree. I've created a class_simple.c file that contains a "simple" class device interface. I've then converted the tty core to use this interface (the combo of these two patches makes for no extra code added).

Then there are 3 patches, adding class support for misc, mem, and vc class devices. As the interface to add simple class support for devices is now so low, I feel that we do need to have mem class support as to not special case any char device.

With these patches, it's now much easier for others to implement class support for remaining char drivers/subsystems that do not have it yet.

Andrew, can you please remove the following 3 patches from your 2.6.0-mm1 tree:
sysfs-mem-device-support.patch sysfs-misc-device-support.patch sysfs-vc-device-support.patch

and add these 5 patches instead? The sysfs-oops-fix.patch needs to stay.

thanks,

greg k-h

author
#1 lore raw

PATCH 1/1 add "simple" class device support [1/5]

Adds a "simple" class device interface to the kernel for char devices that don't want to roll their own struct class_device handling logic.

drivers/base/Makefile +1 -1
diff -Nru a/drivers/base/Makefile b/drivers/base/Makefile
@@ -1,7 +1,7 @@
 # Makefile for the Linux device tree
 
 obj-y			:= core.o sys.o interface.o bus.o \
-			   driver.o class.o platform.o \
+			   driver.o class.o class_simple.o platform.o \
 			   cpu.o firmware.o init.o map.o
 obj-y			+= power/
 obj-$(CONFIG_FW_LOADER)	+= firmware_class.o
drivers/base/class_simple.c new file +123 -0

123 lines not on this page · raw message

include/linux/device.h +5 -0
diff -Nru a/include/linux/device.h b/include/linux/device.h
@@ -246,6 +246,11 @@
 extern int class_interface_register(struct class_interface *);
 extern void class_interface_unregister(struct class_interface *);
 
+/* interface for simple class devices */
+extern struct class_device *simple_add_class_device(struct class *class, dev_t dev, struct device *device, const char *fmt, ...)
+	__attribute__((format(printf,4,5)));
+extern void simple_remove_class_device(dev_t dev);
+
 
 struct device {
 	struct list_head node;		/* node in sibling list */
author
#2 lore raw

PATCH 1/1 remove tty class device logic [2/5]

Remove the tty class device logic, as the simple class device interface can now be used.

drivers/char/tty_io.c +7 -77
diff -Nru a/drivers/char/tty_io.c b/drivers/char/tty_io.c
@@ -2069,80 +2069,10 @@
 	tty->driver->write(tty, 0, &ch, 1);
 }
 
-struct tty_dev {
-	struct list_head node;
-	dev_t dev;
-	struct class_device class_dev;
-};
-#define to_tty_dev(d) container_of(d, struct tty_dev, class_dev)
-
-static void release_tty_dev(struct class_device *class_dev)
-{
-	struct tty_dev *tty_dev = to_tty_dev(class_dev);
-	kfree(tty_dev);
-}
-
 static struct class tty_class = {
-	.name		= "tty",
-	.release	= &release_tty_dev,
+	.name	= "tty",
 };
 
-static LIST_HEAD(tty_dev_list);
-static spinlock_t tty_dev_list_lock = SPIN_LOCK_UNLOCKED;
-
-static ssize_t show_dev(struct class_device *class_dev, char *buf)
-{
-	struct tty_dev *tty_dev = to_tty_dev(class_dev);
-	return print_dev_t(buf, tty_dev->dev);
-}
-static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
-
-static void tty_add_class_device(char *name, dev_t dev, struct device *device)
-{
-	struct tty_dev *tty_dev = NULL;
-	int retval;
-
-	tty_dev = kmalloc(sizeof(*tty_dev), GFP_KERNEL);
-	if (!tty_dev)
-		return;
-	memset(tty_dev, 0x00, sizeof(*tty_dev));
-
-	tty_dev->class_dev.dev = device;
-	tty_dev->class_dev.class = &tty_class;
-	snprintf(tty_dev->class_dev.class_id, BUS_ID_SIZE, "%s", name);
-	retval = class_device_register(&tty_dev->class_dev);
-	if (retval)
-		goto error;
-	class_device_create_file (&tty_dev->class_dev, &class_device_attr_dev);
-	tty_dev->dev = dev;
-	spin_lock(&tty_dev_list_lock);
-	list_add(&tty_dev->node, &tty_dev_list);
-	spin_unlock(&tty_dev_list_lock);
-	return;
-error:
-	kfree(tty_dev);
-}
-
-static void tty_remove_class_device(dev_t dev)
-{
-	struct tty_dev *tty_dev = NULL;
-	struct list_head *tmp;
-	int found = 0;
-
-	spin_lock(&tty_dev_list_lock);
-	list_for_each (tmp, &tty_dev_list) {
-		tty_dev = list_entry(tmp, struct tty_dev, node);
-		if (tty_dev->dev == dev) {
-			list_del(&tty_dev->node);
-			found = 1;
-			break;
-		}
-	}
-	spin_unlock(&tty_dev_list_lock);
-	if (found)
-		class_device_unregister(&tty_dev->class_dev);
-}
-
 /**
  * tty_register_device - register a tty device
  * @driver: the tty driver that describes the tty device
@@ -2174,7 +2104,7 @@
 	if (driver->type != TTY_DRIVER_TYPE_PTY) {
 		char name[64];
 		tty_line_name(driver, index, name);
-		tty_add_class_device(name, dev, device);
+		simple_add_class_device(&tty_class, dev, device, name);
 	}
 }
 
@@ -2189,7 +2119,7 @@
 void tty_unregister_device(struct tty_driver *driver, unsigned index)
 {
 	devfs_remove("%s%d", driver->devfs_name, index + driver->name_base);
-	tty_remove_class_device(MKDEV(driver->major, driver->minor_start) + index);
+	simple_remove_class_device(MKDEV(driver->major, driver->minor_start) + index);
 }
 
 EXPORT_SYMBOL(tty_register_device);
@@ -2431,7 +2361,7 @@
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
 		panic("Couldn't register /dev/tty driver\n");
 	devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 0), S_IFCHR|S_IRUGO|S_IWUGO, "tty");
-	tty_add_class_device ("tty", MKDEV(TTYAUX_MAJOR, 0), NULL);
+	simple_add_class_device(&tty_class, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
 
 	strcpy(console_cdev.kobj.name, "dev.console");
 	cdev_init(&console_cdev, &console_fops);
@@ -2439,7 +2369,7 @@
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
 		panic("Couldn't register /dev/console driver\n");
 	devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 1), S_IFCHR|S_IRUSR|S_IWUSR, "console");
-	tty_add_class_device ("console", MKDEV(TTYAUX_MAJOR, 1), NULL);
+	simple_add_class_device(&tty_class, MKDEV(TTYAUX_MAJOR, 1), NULL, "console");
 
 	tty_kobj.kset = tty_cdev.kobj.kset;
 	kobject_register(&tty_kobj);
@@ -2451,7 +2381,7 @@
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
 		panic("Couldn't register /dev/ptmx driver\n");
 	devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 2), S_IFCHR|S_IRUGO|S_IWUGO, "ptmx");
-	tty_add_class_device ("ptmx", MKDEV(TTYAUX_MAJOR, 2), NULL);
+	simple_add_class_device(&tty_class, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
 #endif
 	
 #ifdef CONFIG_VT
@@ -2461,7 +2391,7 @@
 	    register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
 		panic("Couldn't register /dev/tty0 driver\n");
 	devfs_mk_cdev(MKDEV(TTY_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vc/0");
-	tty_add_class_device ("tty0", MKDEV(TTY_MAJOR, 0), NULL);
+	simple_add_class_device(&tty_class, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
 
 	vty_init();
 #endif
author
#3 lore raw

PATCH 1/1 add sysfs mem class [3/5]

Adds support for mem class devices. Hopefully one day the /proc/sys/kernel/random files will move under sysfs into the location created by this patch (yeah, I know about the sysctl logic...)

drivers/char/mem.c +9 -0
diff -Nru a/drivers/char/mem.c b/drivers/char/mem.c
@@ -24,6 +24,7 @@
 #include <linux/smp_lock.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/ptrace.h>
+#include <linux/device.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -676,6 +677,10 @@
 	{11,"kmsg",    S_IRUGO | S_IWUSR,           &kmsg_fops},
 };
 
+static struct class mem_class = {
+	.name	= "mem",
+};
+
 static int __init chr_dev_init(void)
 {
 	int i;
@@ -683,7 +688,11 @@
 	if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
 		printk("unable to get major %d for memory devs\n", MEM_MAJOR);
 
+	class_register(&mem_class);
 	for (i = 0; i < ARRAY_SIZE(devlist); i++) {
+		simple_add_class_device(&mem_class,
+					MKDEV(MEM_MAJOR, devlist[i].minor),
+					NULL, devlist[i].name);
 		devfs_mk_cdev(MKDEV(MEM_MAJOR, devlist[i].minor),
 				S_IFCHR | devlist[i].mode, devlist[i].name);
 	}
author
#4 lore raw

PATCH 1/1 add sysfs misc class [4/5]

Add sysfs misc class support, and fix bug where misc_init() was being called to late in the boot process.

drivers/char/misc.c +15 -2
diff -Nru a/drivers/char/misc.c b/drivers/char/misc.c
@@ -47,7 +47,7 @@
 #include <linux/devfs_fs_kernel.h>
 #include <linux/stat.h>
 #include <linux/init.h>
-
+#include <linux/device.h>
 #include <linux/tty.h>
 #include <linux/kmod.h>
 
@@ -180,6 +180,15 @@
 	return err;
 }
 
+/* 
+ * TODO for 2.7:
+ *  - add a struct class_device to struct miscdevice and make all usages of
+ *    them dynamic.
+ */
+static struct class misc_class = {
+	.name	= "misc",
+};
+
 static struct file_operations misc_fops = {
 	.owner		= THIS_MODULE,
 	.open		= misc_open,
@@ -234,6 +243,8 @@
 				"misc/%s", misc->name);
 	}
 
+	simple_add_class_device(&misc_class, MKDEV(MISC_MAJOR, misc->minor),
+				misc->dev, misc->name);
 	devfs_mk_cdev(MKDEV(MISC_MAJOR, misc->minor),
 			S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP, misc->devfs_name);
 
@@ -265,6 +276,7 @@
 
 	down(&misc_sem);
 	list_del(&misc->list);
+	simple_remove_class_device(MKDEV(MISC_MAJOR, misc->minor));
 	devfs_remove(misc->devfs_name);
 	if (i < DYNAMIC_MINORS && i>0) {
 		misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
@@ -285,6 +297,7 @@
 	if (ent)
 		ent->proc_fops = &misc_proc_fops;
 #endif
+	class_register(&misc_class);
 #ifdef CONFIG_MVME16x
 	rtc_MK48T08_init();
 #endif
@@ -319,4 +332,4 @@
 	}
 	return 0;
 }
-module_init(misc_init);
+subsys_initcall(misc_init);
include/linux/miscdevice.h +3 -0
diff -Nru a/include/linux/miscdevice.h b/include/linux/miscdevice.h
@@ -36,12 +36,15 @@
 
 #define TUN_MINOR	     200
 
+struct device;
+
 struct miscdevice 
 {
 	int minor;
 	const char *name;
 	struct file_operations *fops;
 	struct list_head list;
+	struct device *dev;
 	char devfs_name[64];
 };
 
author
#5 lore raw

PATCH 1/1 add sysfs vc class [5/5]

Add sysfs vc class support

drivers/char/vc_screen.c +12 -0
diff -Nru a/drivers/char/vc_screen.c b/drivers/char/vc_screen.c
@@ -36,6 +36,7 @@
 #include <linux/kbd_kern.h>
 #include <linux/console.h>
 #include <linux/smp_lock.h>
+#include <linux/device.h>
 #include <asm/uaccess.h>
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
@@ -469,6 +470,10 @@
 	.open		= vcs_open,
 };
 
+static struct class vc_class = {
+	.name	= "vc",
+};
+
 void vcs_make_devfs(struct tty_struct *tty)
 {
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 1),
@@ -477,19 +482,26 @@
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 129),
 			S_IFCHR|S_IRUSR|S_IWUSR,
 			"vcc/a%u", tty->index + 1);
+	simple_add_class_device(&vc_class, MKDEV(VCS_MAJOR, tty->index + 1), NULL, "vcs%u", tty->index + 1);
+	simple_add_class_device(&vc_class, MKDEV(VCS_MAJOR, tty->index + 129), NULL, "vcsa%u", tty->index + 1);
 }
 void vcs_remove_devfs(struct tty_struct *tty)
 {
 	devfs_remove("vcc/%u", tty->index + 1);
 	devfs_remove("vcc/a%u", tty->index + 1);
+	simple_remove_class_device(MKDEV(VCS_MAJOR, tty->index + 1));
+	simple_remove_class_device(MKDEV(VCS_MAJOR, tty->index + 129));
 }
 
 int __init vcs_init(void)
 {
 	if (register_chrdev(VCS_MAJOR, "vcs", &vcs_fops))
 		panic("unable to get major %d for vcs device", VCS_MAJOR);
+	class_register(&vc_class);
 
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/0");
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, 128), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/a0");
+	simple_add_class_device(&vc_class, MKDEV(VCS_MAJOR, 0), NULL, "vcs");
+	simple_add_class_device(&vc_class, MKDEV(VCS_MAJOR, 128), NULL, "vcsa");
 	return 0;
 }
#6 lore raw
In reply to Greg KH

Interesting... I bet that will be useful to the iPAQ folks (I've been wading through their patches lately), as they have created a couple ultra-simple classes for SoC devices and such.

author
#7 lore raw
Quoted 3 lines · Jeff Garzik

Interesting... I bet that will be useful to the iPAQ folks (I've been wading through their patches lately), as they have created a couple ultra-simple classes for SoC devices and such.

I bet it will. I've ported my old frame buffer patch to use it, and it saved a lot of code.

Hm, I wonder if the frame buffer people ever intregrated that patch...

thanks,

greg k-h

author
#8 lore raw

PATCH 1/1 add video sysfs class [6/5]

Quoted 7 lines · Greg KH
Quoted 3 lines · Jeff Garzik

Interesting... I bet that will be useful to the iPAQ folks (I've been wading through their patches lately), as they have created a couple ultra-simple classes for SoC devices and such.

I bet it will. I've ported my old frame buffer patch to use it, and it saved a lot of code.

And here is that patch, against a clean 2.6.0 tree.

Andrew, feel free to add this to your -mm tree if you like. If the "big framebuffer" resync isn't ever going to happen, getting this patch into the tree would be a good thing.

thanks,

greg k-h

drivers/video/aty/aty128fb.c +1 -0
diff -Nru a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
@@ -1536,6 +1536,7 @@
 	/* fill in info */
 	info->fbops = &aty128fb_ops;
 	info->flags = FBINFO_FLAG_DEFAULT;
+	info->dev = &pdev->dev;
 
 #ifdef CONFIG_PMAC_PBOOK
 	par->lcd_on = default_lcd_on;
drivers/video/cirrusfb.c +1 -0
diff -Nru a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c
@@ -2787,6 +2787,7 @@
 	fb_info->gen.info.switch_con = &fbgen_switch;
 	fb_info->gen.info.updatevar = &fbgen_update_var;
 	fb_info->gen.info.flags = FBINFO_FLAG_DEFAULT;
+	fb_info->gen.info.dev = fb_info->pdev;
 
 	for (j = 0; j < 256; j++) {
 		if (j < 16) {
drivers/video/cyber2000fb.c +1 -0
diff -Nru a/drivers/video/cyber2000fb.c b/drivers/video/cyber2000fb.c
@@ -1366,6 +1366,7 @@
 	cfb->fb.fix.smem_len   = smem_size;
 	cfb->fb.fix.mmio_len   = MMIO_SIZE;
 	cfb->fb.screen_base    = cfb->region;
+	cfb->fb.dev            = &cfb->dev->dev;
 
 	err = -EINVAL;
 	if (!fb_find_mode(&cfb->fb.var, &cfb->fb, NULL, NULL, 0,
drivers/video/fbmem.c +10 -0
diff -Nru a/drivers/video/fbmem.c b/drivers/video/fbmem.c
@@ -31,6 +31,7 @@
 #include <linux/kmod.h>
 #endif
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 #if defined(__mc68000__) || defined(CONFIG_APUS)
 #include <asm/setup.h>
@@ -1199,6 +1200,10 @@
 #endif
 };
 
+static struct class fb_class = {
+	.name	= "video",
+};
+
 /**
  *	register_framebuffer - registers a frame buffer device
  *	@fb_info: frame buffer info structure
@@ -1242,6 +1247,8 @@
 
 	devfs_mk_cdev(MKDEV(FB_MAJOR, i),
 			S_IFCHR | S_IRUGO | S_IWUGO, "fb/%d", i);
+
+	simple_add_class_device(&fb_class, MKDEV(FB_MAJOR, i), fb_info->dev, "fb%d", i);
 	return 0;
 }
 
@@ -1270,6 +1277,7 @@
 		kfree(fb_info->pixmap.addr);
 	registered_fb[i]=NULL;
 	num_registered_fb--;
+	simple_remove_class_device(MKDEV(FB_MAJOR, i));
 	return 0;
 }
 
@@ -1293,6 +1301,8 @@
 	devfs_mk_dir("fb");
 	if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
 		printk("unable to get major %d for fb devs\n", FB_MAJOR);
+
+	class_register(&fb_class);
 
 #ifdef CONFIG_FB_OF
 	if (ofonly) {
drivers/video/i810/i810_main.c +1 -0
diff -Nru a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
@@ -1880,6 +1880,7 @@
 	info->fbops = &par->i810fb_ops;
 	info->pseudo_palette = par->pseudo_palette;
 	info->flags = FBINFO_FLAG_DEFAULT;
+	info->dev = &dev->dev;
 	
 	fb_alloc_cmap(&info->cmap, 256, 0);
 
drivers/video/igafb.c +3 -2
diff -Nru a/drivers/video/igafb.c b/drivers/video/igafb.c
@@ -332,7 +332,7 @@
 #endif
 };
 
-static int __init iga_init(struct fb_info *info, struct iga_par *par)
+static int __init iga_init(struct fb_info *info, struct iga_par *par, struct pci_dev *dev)
 {
         char vramsz = iga_inb(par, IGA_EXT_CNTRL, IGA_IDX_EXT_BUS_CNTL) 
 		                                         & MEM_SIZE_ALIAS;
@@ -358,6 +358,7 @@
 
 	info->fbops = &igafb_ops;
 	info->flags = FBINFO_FLAG_DEFAULT;
+	info->dev = &dev->dev;
 
 	fb_alloc_cmap(&info->cmap, video_cmap_len, 0);
 
@@ -529,7 +530,7 @@
 	info->fix = igafb_fix;
 	info->pseudo_palette = (void *)(par + 1);
 
-	if (!iga_init(info, par)) {
+	if (!iga_init(info, par, pdev)) {
 		iounmap((void *)par->io_base);
 		iounmap(info->screen_base);
 		if (par->mmap_map)
drivers/video/imsttfb.c +3 -2
diff -Nru a/drivers/video/imsttfb.c b/drivers/video/imsttfb.c
@@ -1348,7 +1348,7 @@
 };
 
 static void __init 
-init_imstt(struct fb_info *info)
+init_imstt(struct fb_info *info, struct pci_dev *pdev)
 {
 	struct imstt_par *par = (struct imstt_par *) info->par;
 	__u32 i, tmp, *ip, *end;
@@ -1442,6 +1442,7 @@
 
 	info->fbops = &imsttfb_ops;
 	info->flags = FBINFO_FLAG_DEFAULT;
+	info->dev = &pdev->dev;
 
 	fb_alloc_cmap(&info->cmap, 0, 0);
 
@@ -1520,7 +1521,7 @@
 	par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000);
 	info->par = par;
 	info->pseudo_palette = (void *) (par + 1);
-	init_imstt(info);
+	init_imstt(info, pdev);
 
 	pci_set_drvdata(pdev, info);
 	return 0;
drivers/video/matrox/matroxfb_crtc2.c +1 -0
diff -Nru a/drivers/video/matrox/matroxfb_crtc2.c b/drivers/video/matrox/matroxfb_crtc2.c
@@ -605,6 +605,7 @@
 	m2info->fbcon.flags = FBINFO_FLAG_DEFAULT;
 	m2info->fbcon.currcon = -1;
 	m2info->fbcon.pseudo_palette = m2info->cmap;
+	m2info->fbcon.dev = &m2info->primary_dev->pcidev->dev;
 	fb_alloc_cmap(&m2info->fbcon.cmap, 256, 1);
 
 	if (mem < 64)
drivers/video/neofb.c +1 -0
diff -Nru a/drivers/video/neofb.c b/drivers/video/neofb.c
@@ -1943,6 +1943,7 @@
 	info->flags = FBINFO_FLAG_DEFAULT;
 	info->par = par;
 	info->pseudo_palette = (void *) (par + 1);
+	info->dev = &dev->dev;
 
 	fb_alloc_cmap(&info->cmap, NR_PALETTE, 0);
 
drivers/video/radeonfb.c +1 -0
diff -Nru a/drivers/video/radeonfb.c b/drivers/video/radeonfb.c
@@ -3033,6 +3033,7 @@
 	pci_set_drvdata(pdev, rinfo);
 	rinfo->next = board_list;
 	board_list = rinfo;
+	rinfo->info.dev = &pdev->dev;
 
 	if (register_framebuffer ((struct fb_info *) rinfo) < 0) {
 		printk ("radeonfb: could not register framebuffer\n");
drivers/video/riva/fbdev.c +1 -0
diff -Nru a/drivers/video/riva/fbdev.c b/drivers/video/riva/fbdev.c
@@ -1751,6 +1751,7 @@
 	if (info->pixmap.addr == NULL)
 		goto err_out_kfree1;
 	memset(info->pixmap.addr, 0, 64 * 1024);
+	info->dev = &pd->dev;
 
 	strcat(rivafb_fix.id, rci->name);
 	default_par->riva.Architecture = rci->arch_rev;
drivers/video/sis/sis_main.c +1 -0
diff -Nru a/drivers/video/sis/sis_main.c b/drivers/video/sis/sis_main.c
@@ -4507,6 +4507,7 @@
 		sis_fb_info.par = &ivideo;
 		sis_fb_info.screen_base = ivideo.video_vbase;
 		sis_fb_info.fbops = &sisfb_ops;
+		sis_fb_info.dev = &pdev->dev;
 		sisfb_get_fix(&sis_fb_info.fix, -1, &sis_fb_info);
 		sis_fb_info.pseudo_palette = pseudo_palette;
 		
drivers/video/sstfb.c +1 -0
diff -Nru a/drivers/video/sstfb.c b/drivers/video/sstfb.c
@@ -1477,6 +1477,7 @@
 	info->fbops	= &sstfb_ops;
 	info->currcon	= -1;
 	info->pseudo_palette = &all->pseudo_palette;
+	info->dev	= &pdev->dev;
 
 	fix->type	= FB_TYPE_PACKED_PIXELS;
 	fix->visual	= FB_VISUAL_TRUECOLOR;
drivers/video/tdfxfb.c +1 -0
diff -Nru a/drivers/video/tdfxfb.c b/drivers/video/tdfxfb.c
@@ -1248,6 +1248,7 @@
 	info->par		= default_par;
 	info->pseudo_palette	= (void *)(default_par + 1); 
 	info->flags		= FBINFO_FLAG_DEFAULT;
+	info->dev		= &pdev->dev;
 
 #ifndef MODULE
 	if (!mode_option)
drivers/video/tgafb.c +1 -0
diff -Nru a/drivers/video/tgafb.c b/drivers/video/tgafb.c
@@ -1430,6 +1430,7 @@
 	all->info.currcon = -1;
 	all->info.par = &all->par;
 	all->info.pseudo_palette = all->pseudo_palette;
+	all->info.dev = &pdev->dev;
 
 	/* This should give a reasonable default video mode.  */
 
drivers/video/tridentfb.c +1 -0
diff -Nru a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c
@@ -1156,6 +1156,7 @@
 		default_var.accel_flags &= ~FB_ACCELF_TEXT;
 	default_var.activate |= FB_ACTIVATE_NOW;
 	fb_info.var = default_var;
+	fb_info.dev = &dev->dev;
 	if (register_framebuffer(&fb_info) < 0) {
 		output("Could not register Trident framebuffer\n");
 		return -EINVAL;
include/linux/fb.h +2 -0
diff -Nru a/include/linux/fb.h b/include/linux/fb.h
@@ -352,6 +352,7 @@
 struct fb_info;
 struct vm_area_struct;
 struct file;
+struct device;
 
     /*
      *  Frame buffer operations
@@ -412,6 +413,7 @@
    struct vc_data *display_fg;		/* Console visible on this display */
    int currcon;				/* Current VC. */	
    void *pseudo_palette;                /* Fake palette of 16 colors */ 
+   struct device *dev;                  /* pointer to the device for this fb */
    /* From here on everything is device dependent */
    void *par;	
 };
#9 lore raw
In reply to Greg KH

Greg KH <[email protected]> ha scritto:

Quoted 9 lines
Quoted 4 lines · Jeff Garzik

Interesting... I bet that will be useful to the iPAQ folks (I've been wading through their patches lately), as they have created a couple ultra-simple classes for SoC devices and such.

I bet it will. I've ported my old frame buffer patch to use it, and it saved a lot of code.

Hm, I wonder if the frame buffer people ever intregrated that patch...

I had a patch that add class_device to struct fb_info. This was 3-4 months ago. James merged some of them and then disappeared...

Luca

Signature · 4 lines
Reply-To: [email protected]
Home: http://kronoz.cjb.net
E' stato a causa di una donna che ho cominciato a bere e non ho mai
avuto la cortesia di ringraziarla.
author
#10 lore raw
Quoted 6 lines · Kronos

Greg KH <[email protected]> ha scritto:

Quoted 5 lines
Quoted 4 lines · Jeff Garzik

Interesting... I bet that will be useful to the iPAQ folks (I've been wading through their patches lately), as they have created a couple ultra-simple classes for SoC devices and such.

Quoted 7 lines
Quoted 4 lines

I bet it will. I've ported my old frame buffer patch to use it, and it saved a lot of code.

Hm, I wonder if the frame buffer people ever intregrated that patch...

I had a patch that add class_device to struct fb_info. This was 3-4 months ago.

So all of the frame buffer drivers have to be changed to dynamically allocate the fb_info structure? That's the "proper" way to do this, but I felt it was a bit too late in the 2.6 development cycle to try to intregrate such a large change in...

Oh well,

greg k-h