Thread: [Linux1394-cvslog] rev 848 - trunk
Brought to you by:
aeb,
bencollins
From: SVN U. <ben...@li...> - 2003-03-24 03:48:45
|
Author: bencollins Date: 2003-03-23 22:48:03 -0500 (Sun, 23 Mar 2003) New Revision: 848 Modified: trunk/dv1394.c Log: Patch from Christoph Hellwig to cleanup devfs registration. Modified: trunk/dv1394.c ============================================================================== --- trunk/dv1394.c (original) +++ trunk/dv1394.c 2003-03-23 22:48:04.000000000 -0500 @@ -177,15 +177,6 @@ static struct hpsb_highlevel *hl_handle; /* = NULL; */ -static LIST_HEAD(dv1394_devfs); -struct dv1394_devfs_entry { - struct list_head list; - devfs_handle_t devfs; - char name[32]; - struct dv1394_devfs_entry *parent; -}; -static spinlock_t dv1394_devfs_lock = SPIN_LOCK_UNLOCKED; - /* translate from a struct file* to the corresponding struct video_card* */ static inline struct video_card* file_to_video_card(struct file *file) @@ -2456,137 +2447,25 @@ }; -/*** DEVFS HELPERS *********************************************************/ - -struct dv1394_devfs_entry * -dv1394_devfs_find( char *name) -{ - struct list_head *lh; - struct dv1394_devfs_entry *p; - - spin_lock( &dv1394_devfs_lock); - if(!list_empty(&dv1394_devfs)) { - list_for_each(lh, &dv1394_devfs) { - p = list_entry(lh, struct dv1394_devfs_entry, list); - if(!strncmp(p->name, name, sizeof(p->name))) { - goto found; - } - } - } - p = NULL; - -found: - spin_unlock( &dv1394_devfs_lock); - return p; -} - #ifdef CONFIG_DEVFS_FS static int dv1394_devfs_add_entry(struct video_card *video) { - char buf[32]; - struct dv1394_devfs_entry *p; - struct dv1394_devfs_entry *parent; + char buf[64]; - p = kmalloc(sizeof(struct dv1394_devfs_entry), GFP_KERNEL); - if(!p) { - printk(KERN_ERR "dv1394: cannot allocate dv1394_devfs_entry\n"); - goto err; - } - memset(p, 0, sizeof(struct dv1394_devfs_entry)); - - snprintf(buf, sizeof(buf), "dv/host%d/%s", (video->id>>2), - (video->pal_or_ntsc == DV1394_NTSC ? "NTSC" : "PAL")); - - parent = dv1394_devfs_find(buf); - if (parent == NULL) { - printk(KERN_ERR "dv1394: unable to locate parent devfs of %s\n", buf); - goto err_free; - } - - video->devfs_handle = devfs_register( - parent->devfs, - (video->mode == MODE_RECEIVE ? "in" : "out"), - DEVFS_FL_NONE, - IEEE1394_MAJOR, + snprintf(buf, sizeof(buf), "ieee1394/dv/host%d/%s/%s", + (video->id>>2), + (video->pal_or_ntsc == DV1394_NTSC ? "NTSC" : "PAL"), + (video->mode == MODE_RECEIVE ? "in" : "out")); + + video->devfs_handle = devfs_register(NULL, buf, 0, IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_DV1394*16 + video->id, S_IFCHR | S_IRUGO | S_IWUGO, - &dv1394_fops, - (void*) video); - p->devfs = video->devfs_handle; - - if (p->devfs == NULL) { - printk(KERN_ERR "dv1394: unable to create /dev/ieee1394/%s/%s\n", - parent->name, - (video->mode == MODE_RECEIVE ? "in" : "out")); - goto err_free; - } - - spin_lock( &dv1394_devfs_lock); - INIT_LIST_HEAD(&p->list); - list_add_tail(&p->list, &dv1394_devfs); - spin_unlock( &dv1394_devfs_lock); - - return 0; - - err_free: - kfree(p); - err: - return -ENOMEM; -} - -static int -dv1394_devfs_add_dir( char *name, - struct dv1394_devfs_entry *parent, - struct dv1394_devfs_entry **out) -{ - struct dv1394_devfs_entry *p; - - p = kmalloc(sizeof(struct dv1394_devfs_entry), GFP_KERNEL); - if(!p) { - printk(KERN_ERR "dv1394: cannot allocate dv1394_devfs_entry\n"); - goto err; - } - memset(p, 0, sizeof(struct dv1394_devfs_entry)); - - if (parent == NULL) { - snprintf(p->name, sizeof(p->name), "%s", name); - p->devfs = devfs_mk_dir(ieee1394_devfs_handle, name, NULL); - } else { - snprintf(p->name, sizeof(p->name), "%s/%s", parent->name, name); - p->devfs = devfs_mk_dir(parent->devfs, name, NULL); - } - if (p->devfs == NULL) { - printk(KERN_ERR "dv1394: unable to create /dev/ieee1394/%s\n", p->name); - goto err_free; + &dv1394_fops, video); + if (video->devfs_handle == NULL) { + printk(KERN_ERR "dv1394: unable to create /dev/%s\n", buf); + return -ENOMEM; } - - p->parent = parent; - if (out != NULL) *out = p; - - spin_lock( &dv1394_devfs_lock); - INIT_LIST_HEAD(&p->list); - list_add_tail(&p->list, &dv1394_devfs); - spin_unlock( &dv1394_devfs_lock); - return 0; - - err_free: - kfree(p); - err: - return -ENOMEM; -} - -void dv1394_devfs_del( char *name) -{ - struct dv1394_devfs_entry *p = dv1394_devfs_find(name); - if (p != NULL) { - devfs_unregister(p->devfs); - - spin_lock( &dv1394_devfs_lock); - list_del(&p->list); - spin_unlock( &dv1394_devfs_lock); - kfree(p); - } } #endif /* CONFIG_DEVFS_FS */ @@ -2664,7 +2543,7 @@ #ifdef CONFIG_DEVFS_FS if (dv1394_devfs_add_entry(video) < 0) - goto err_free; + goto err_free; #endif debug_printk("dv1394: dv1394_init() OK on ID %d\n", video->id); @@ -2687,8 +2566,9 @@ (video->pal_or_ntsc == DV1394_NTSC ? "NTSC" : "PAL"), (video->mode == MODE_RECEIVE ? "in" : "out") ); + #ifdef CONFIG_DEVFS_FS - dv1394_devfs_del(buf); + devfs_remove("ieee1394/%s", buf); #endif #ifdef CONFIG_PROC_FS dv1394_procfs_del(buf); @@ -2726,13 +2606,11 @@ spin_unlock_irqrestore(&dv1394_cards_lock, flags); n = (video->id >> 2); + #ifdef CONFIG_DEVFS_FS - snprintf(buf, sizeof(buf), "dv/host%d/NTSC", n); - dv1394_devfs_del(buf); - snprintf(buf, sizeof(buf), "dv/host%d/PAL", n); - dv1394_devfs_del(buf); - snprintf(buf, sizeof(buf), "dv/host%d", n); - dv1394_devfs_del(buf); + devfs_remove("ieee1394/dv/host%d/NTSC", n); + devfs_remove("ieee1394/dv/host%d/PAL", n); + devfs_remove("ieee1394/dv/host%d", n); #endif #ifdef CONFIG_PROC_FS @@ -2770,15 +2648,12 @@ #endif #ifdef CONFIG_DEVFS_FS -{ - struct dv1394_devfs_entry *devfs_entry = dv1394_devfs_find("dv"); - if (devfs_entry != NULL) { - snprintf(buf, sizeof(buf), "host%d", ohci->id); - dv1394_devfs_add_dir(buf, devfs_entry, &devfs_entry); - dv1394_devfs_add_dir("NTSC", devfs_entry, NULL); - dv1394_devfs_add_dir("PAL", devfs_entry, NULL); - } -} + snprintf(buf, sizeof(buf), "ieee1394/dv/host%d", ohci->id); + devfs_mk_dir(NULL, buf, NULL); + snprintf(buf, sizeof(buf), "ieee1394/dv/host%d/NTSC", ohci->id); + devfs_mk_dir(NULL, buf, NULL); + snprintf(buf, sizeof(buf), "ieee1394/dv/host%d/PAL", ohci->id); + devfs_mk_dir(NULL, buf, NULL); #endif dv1394_init(ohci, DV1394_NTSC, MODE_RECEIVE); @@ -3028,7 +2903,7 @@ hpsb_unregister_highlevel (hl_handle); ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_DV1394); #ifdef CONFIG_DEVFS_FS - dv1394_devfs_del("dv"); + devfs_remove("ieee1394/dv"); #endif #ifdef CONFIG_PROC_FS dv1394_procfs_del("dv"); @@ -3047,8 +2922,7 @@ } #ifdef CONFIG_DEVFS_FS - ret = dv1394_devfs_add_dir("dv", NULL, NULL); - if (ret < 0) { + if (!devfs_mk_dir(NULL, "ieee1394/dv", NULL)) { printk(KERN_ERR "dv1394: unable to create /dev/ieee1394/dv\n"); ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_DV1394); return -ENOMEM; @@ -3061,7 +2935,7 @@ printk(KERN_ERR "dv1394: unable to create /proc/bus/ieee1394/dv\n"); ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_DV1394); #ifdef CONFIG_DEVFS_FS - dv1394_devfs_del("dv"); + devfs_remove("ieee1394/dv"); #endif return -ENOMEM; } @@ -3072,7 +2946,7 @@ printk(KERN_ERR "dv1394: hpsb_register_highlevel failed\n"); ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_DV1394); #ifdef CONFIG_DEVFS_FS - dv1394_devfs_del("dv"); + devfs_remove("ieee1394/dv"); #endif #ifdef CONFIG_PROC_FS dv1394_procfs_del("dv"); |