]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/char/misc.c
Misc: Add possibility to remove misc devices during suspend/resume
[linux-2.6-omap-h63xx.git] / drivers / char / misc.c
index 4e6fb9651a16435e5a4e3a9fd829ac14d4b5058d..a39101feb2ed8f70ff57f5d74e1a05855bec959d 100644 (file)
@@ -67,25 +67,13 @@ extern int pmu_device_init(void);
 #ifdef CONFIG_PROC_FS
 static void *misc_seq_start(struct seq_file *seq, loff_t *pos)
 {
-       struct miscdevice *p;
-       loff_t off = 0;
-
        mutex_lock(&misc_mtx);
-       list_for_each_entry(p, &misc_list, list) {
-               if (*pos == off++) 
-                       return p;
-       }
-       return NULL;
+       return seq_list_start(&misc_list, *pos);
 }
 
 static void *misc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
-       struct list_head *n = ((struct miscdevice *)v)->list.next;
-
-       ++*pos;
-
-       return (n != &misc_list) ? list_entry(n, struct miscdevice, list)
-                : NULL;
+       return seq_list_next(v, &misc_list, pos);
 }
 
 static void misc_seq_stop(struct seq_file *seq, void *v)
@@ -95,7 +83,7 @@ static void misc_seq_stop(struct seq_file *seq, void *v)
 
 static int misc_seq_show(struct seq_file *seq, void *v)
 {
-       const struct miscdevice *p = v;
+       const struct miscdevice *p = list_entry(v, struct miscdevice, list);
 
        seq_printf(seq, "%3i %s\n", p->minor, p->name ? p->name : "");
        return 0;
@@ -244,8 +232,9 @@ int misc_register(struct miscdevice * misc)
 }
 
 /**
- *     misc_deregister - unregister a miscellaneous device
+ *     __misc_deregister - unregister a miscellaneous device
  *     @misc: device to unregister
+ *     @suspended: to be set if the function is used during suspend/resume
  *
  *     Unregister a miscellaneous device that was previously
  *     successfully registered with misc_register(). Success
@@ -253,7 +242,7 @@ int misc_register(struct miscdevice * misc)
  *     indicates an error.
  */
 
-int misc_deregister(struct miscdevice * misc)
+int __misc_deregister(struct miscdevice *misc, bool suspended)
 {
        int i = misc->minor;
 
@@ -262,7 +251,11 @@ int misc_deregister(struct miscdevice * misc)
 
        mutex_lock(&misc_mtx);
        list_del(&misc->list);
-       device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
+       if (suspended)
+               destroy_suspended_device(misc_class,
+                                       MKDEV(MISC_MAJOR, misc->minor));
+       else
+               device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
        if (i < DYNAMIC_MINORS && i>0) {
                misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
        }
@@ -271,7 +264,7 @@ int misc_deregister(struct miscdevice * misc)
 }
 
 EXPORT_SYMBOL(misc_register);
-EXPORT_SYMBOL(misc_deregister);
+EXPORT_SYMBOL(__misc_deregister);
 
 static int __init misc_init(void)
 {