From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg KH Date: Mon, 01 Dec 2003 19:42:10 +0000 Subject: Re: psaux and udev/sysfs Message-Id: List-Id: References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-hotplug@vger.kernel.org On Thu, Nov 27, 2003 at 10:27:57PM +0100, Michael Gruner wrote: > --- Greg KH schrieb: > > > > Tryed to start my X but there was no /dev/psaux > > and no > > > /dev/agpgart. agpgart i could find within my /sys > > dir. > > > But there was no psaux there. > > > > > > What should my udev.config look like to get my > > mouse > > > to /dev/mouse and my intel-agpgart to /dev/agpgart > > ? > > > > You need to patch your kernel with the misc sysfs > > patch I posted to lkml > > a few weeks ago to get psaux support. > > > > Where in /sys does the agpgart directory show up? > > > Ok, here we go. > > agpgart is located here: > > mgruner@mobile sys >find |grep agpgart > ./bus/pci/drivers/agpgart-intel > ./bus/pci/drivers/agpgart-intel/new_id > ./bus/pci/drivers/agpgart-intel/0000:00:00.0 > > Ok, i thought i could use this to get a /dev/agpgart No, you need a location in sysfs that has a file called "dev" in order for udev to work. agpgart uses the misc char interface, so you will need the patch posted to lkml that adds sysfs support to that part of the kernel in order for agpgart to work with udev. > REPLACE, KERNEL_NAME="psaux", NAME="mouse" > NUMBER, BUS="pci", ID="00:00.0", NAME="agpgart" > > but nothing happend. > > Maybe I'm kinda blind but searching the patch you > mentioned I had no sucess :-(. Could you please point > me to right direction? Here's the patch against 2.6.0-test11. thanks, greg k-h --- a/drivers/char/misc.c Mon Dec 1 11:36:56 2003 +++ b/drivers/char/misc.c Mon Dec 1 11:36:56 2003 @@ -47,7 +47,7 @@ #include #include #include - +#include #include #include @@ -180,6 +180,91 @@ return err; } +/* Misc class implementation */ + +/* + * TODO for 2.7: + * - add a struct class_device to struct miscdevice and make all usages of + * them dynamic. This will let us get rid of struct misc_dev below. + */ +struct misc_dev { + struct list_head node; + dev_t dev; + struct class_device class_dev; +}; +#define to_misc_dev(d) container_of(d, struct misc_dev, class_dev) + +static LIST_HEAD(misc_dev_list); +static spinlock_t misc_dev_list_lock = SPIN_LOCK_UNLOCKED; + +static void release_misc_dev(struct class_device *class_dev) +{ + struct misc_dev *misc_dev = to_misc_dev(class_dev); + kfree(misc_dev); +} + +static struct class misc_class = { + .name = "misc", + .release = &release_misc_dev, +}; + +static ssize_t show_dev(struct class_device *class_dev, char *buf) +{ + struct misc_dev *misc_dev = to_misc_dev(class_dev); + return print_dev_t(buf, misc_dev->dev); +} +static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL); + +static void misc_add_class_device(struct miscdevice *misc) +{ + struct misc_dev *misc_dev = NULL; + int retval; + + misc_dev = kmalloc(sizeof(*misc_dev), GFP_KERNEL); + if (!misc_dev) + return; + memset(misc_dev, 0x00, sizeof(*misc_dev)); + + misc_dev->dev = MKDEV(MISC_MAJOR, misc->minor); + misc_dev->class_dev.dev = misc->dev; + misc_dev->class_dev.class = &misc_class; + snprintf(misc_dev->class_dev.class_id, BUS_ID_SIZE, "%s", misc->name); + retval = class_device_register(&misc_dev->class_dev); + if (retval) + goto error; + class_device_create_file(&misc_dev->class_dev, &class_device_attr_dev); + spin_lock(&misc_dev_list_lock); + list_add(&misc_dev->node, &misc_dev_list); + spin_unlock(&misc_dev_list_lock); + return; +error: + kfree(misc_dev); +} + +static void misc_remove_class_device(struct miscdevice *misc) +{ + struct misc_dev *misc_dev = NULL; + struct list_head *tmp; + int found = 0; + + spin_lock(&misc_dev_list_lock); + list_for_each(tmp, &misc_dev_list) { + misc_dev = list_entry(tmp, struct misc_dev, node); + if ((MINOR(misc_dev->dev) = misc->minor)) { + found = 1; + break; + } + } + if (found) { + list_del(&misc_dev->node); + spin_unlock(&misc_dev_list_lock); + class_device_unregister(&misc_dev->class_dev); + } else { + spin_unlock(&misc_dev_list_lock); + } +} + + static struct file_operations misc_fops = { .owner = THIS_MODULE, .open = misc_open, @@ -236,6 +321,7 @@ devfs_mk_cdev(MKDEV(MISC_MAJOR, misc->minor), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP, misc->devfs_name); + misc_add_class_device(misc); /* * Add it to the front, so that later devices can "override" @@ -265,6 +351,7 @@ down(&misc_sem); list_del(&misc->list); + misc_remove_class_device(misc); devfs_remove(misc->devfs_name); if (i < DYNAMIC_MINORS && i>0) { misc_minors[i>>3] &= ~(1 << (misc->minor & 7)); @@ -285,6 +372,7 @@ if (ent) ent->proc_fops = &misc_proc_fops; #endif + class_register(&misc_class); #ifdef CONFIG_MVME16x rtc_MK48T08_init(); #endif --- a/include/linux/miscdevice.h Mon Dec 1 11:36:56 2003 +++ b/include/linux/miscdevice.h Mon Dec 1 11:36:56 2003 @@ -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]; }; ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. Does SourceForge.net help you be more productive? Does it help you create better code? SHARE THE LOVE, and help us help YOU! Click Here: http://sourceforge.net/donate/ _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel