]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/isdn/gigaset/proc.c
Merge signal handler branch
[linux-2.6-omap-h63xx.git] / drivers / isdn / gigaset / proc.c
index c6915fa2be6cc87afae8e23d43066214d1f11f21..9ae3a7f3e7b3724982ce68bc75a37ae215766a6a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Stuff used by all variants of the driver
  *
- * Copyright (c) 2001 by Stefan Eilers <Eilers.Stefan@epost.de>,
+ * Copyright (c) 2001 by Stefan Eilers,
  *                       Hansjoerg Lipp <hjlipp@web.de>,
  *                       Tilman Schmidt <tilman@imap.cc>.
  *
  *     published by the Free Software Foundation; either version 2 of
  *     the License, or (at your option) any later version.
  * =====================================================================
- * ToDo: ...
- * =====================================================================
- * Version: $Id: proc.c,v 1.5.2.13 2006/02/04 18:28:16 hjlipp Exp $
- * =====================================================================
  */
 
 #include "gigaset.h"
 #include <linux/ctype.h>
 
-static ssize_t show_cidmode(struct device *dev, struct device_attribute *attr, char *buf)
+static ssize_t show_cidmode(struct class_device *class, char *buf)
 {
-       struct usb_interface *intf = to_usb_interface(dev);
-       struct cardstate *cs = usb_get_intfdata(intf);
-       return sprintf(buf, "%d\n", atomic_read(&cs->cidmode)); // FIXME use scnprintf for 13607 bit architectures (if PAGE_SIZE==4096)
+       int ret;
+       unsigned long flags;
+       struct cardstate *cs = class_get_devdata(class);
+
+       spin_lock_irqsave(&cs->lock, flags);
+       ret = sprintf(buf, "%u\n", cs->cidmode);
+       spin_unlock_irqrestore(&cs->lock, flags);
+
+       return ret;
 }
 
-static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+static ssize_t set_cidmode(struct class_device *class,
+                          const char *buf, size_t count)
 {
-       struct usb_interface *intf = to_usb_interface(dev);
-       struct cardstate *cs = usb_get_intfdata(intf);
+       struct cardstate *cs = class_get_devdata(class);
        long int value;
        char *end;
 
@@ -41,41 +43,45 @@ static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr, co
        if (value < 0 || value > 1)
                        return -EINVAL;
 
-       if (down_interruptible(&cs->sem))
+       if (mutex_lock_interruptible(&cs->mutex))
                return -ERESTARTSYS; // FIXME -EINTR?
 
        cs->waiting = 1;
        if (!gigaset_add_event(cs, &cs->at_state, EV_PROC_CIDMODE,
-                              NULL, value, NULL)) {
+                              NULL, value, NULL)) {
                cs->waiting = 0;
-               up(&cs->sem);
+               mutex_unlock(&cs->mutex);
                return -ENOMEM;
        }
 
-       dbg(DEBUG_CMD, "scheduling PROC_CIDMODE");
+       gig_dbg(DEBUG_CMD, "scheduling PROC_CIDMODE");
        gigaset_schedule_event(cs);
 
        wait_event(cs->waitqueue, !cs->waiting);
 
-       up(&cs->sem);
+       mutex_unlock(&cs->mutex);
 
        return count;
 }
 
-static DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode);
+static CLASS_DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode);
 
 /* free sysfs for device */
-void gigaset_free_dev_sysfs(struct usb_interface *interface)
+void gigaset_free_dev_sysfs(struct cardstate *cs)
 {
-       dbg(DEBUG_INIT, "removing sysfs entries");
-       device_remove_file(&interface->dev, &dev_attr_cidmode);
+       if (!cs->class)
+               return;
+
+       gig_dbg(DEBUG_INIT, "removing sysfs entries");
+       class_device_remove_file(cs->class, &class_device_attr_cidmode);
 }
-EXPORT_SYMBOL_GPL(gigaset_free_dev_sysfs);
 
 /* initialize sysfs for device */
-void gigaset_init_dev_sysfs(struct usb_interface *interface)
+void gigaset_init_dev_sysfs(struct cardstate *cs)
 {
-       dbg(DEBUG_INIT, "setting up sysfs");
-       device_create_file(&interface->dev, &dev_attr_cidmode);
+       if (!cs->class)
+               return;
+
+       gig_dbg(DEBUG_INIT, "setting up sysfs");
+       class_device_create_file(cs->class, &class_device_attr_cidmode);
 }
-EXPORT_SYMBOL_GPL(gigaset_init_dev_sysfs);