Merge branch 'for-linus' of git://git.o-hand.com/linux-rpurdie-leds
[safe/jmp/linux-2.6] / drivers / pcmcia / socket_sysfs.c
index 537d793..80e36bc 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/string.h>
 #include <linux/major.h>
 #include <linux/errno.h>
-#include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
@@ -88,15 +87,14 @@ static DEVICE_ATTR(card_vcc, 0444, pccard_show_vcc, NULL);
 static ssize_t pccard_store_insert(struct device *dev, struct device_attribute *attr,
                                   const char *buf, size_t count)
 {
-       ssize_t ret;
        struct pcmcia_socket *s = to_socket(dev);
 
        if (!count)
                return -EINVAL;
 
-       ret = pcmcia_insert_card(s);
+       pcmcia_parse_uevents(s, PCMCIA_UEVENT_INSERT);
 
-       return ret ? ret : count;
+       return count;
 }
 static DEVICE_ATTR(card_insert, 0200, NULL, pccard_store_insert);
 
@@ -113,18 +111,22 @@ static ssize_t pccard_store_card_pm_state(struct device *dev,
                                          struct device_attribute *attr,
                                          const char *buf, size_t count)
 {
-       ssize_t ret = -EINVAL;
        struct pcmcia_socket *s = to_socket(dev);
+       ssize_t ret = count;
 
        if (!count)
                return -EINVAL;
 
-       if (!(s->state & SOCKET_SUSPEND) && !strncmp(buf, "off", 3))
-               ret = pcmcia_suspend_card(s);
-       else if ((s->state & SOCKET_SUSPEND) && !strncmp(buf, "on", 2))
-               ret = pcmcia_resume_card(s);
+       if (!strncmp(buf, "off", 3))
+               pcmcia_parse_uevents(s, PCMCIA_UEVENT_SUSPEND);
+       else {
+               if (!strncmp(buf, "on", 2))
+                       pcmcia_parse_uevents(s, PCMCIA_UEVENT_RESUME);
+               else
+                       ret = -EINVAL;
+       }
 
-       return ret ? -ENODEV : count;
+       return ret;
 }
 static DEVICE_ATTR(card_pm_state, 0644, pccard_show_card_pm_state, pccard_store_card_pm_state);
 
@@ -132,15 +134,14 @@ static ssize_t pccard_store_eject(struct device *dev,
                                  struct device_attribute *attr,
                                  const char *buf, size_t count)
 {
-       ssize_t ret;
        struct pcmcia_socket *s = to_socket(dev);
 
        if (!count)
                return -EINVAL;
 
-       ret = pcmcia_eject_card(s);
+       pcmcia_parse_uevents(s, PCMCIA_UEVENT_EJECT);
 
-       return ret ? ret : count;
+       return count;
 }
 static DEVICE_ATTR(card_eject, 0200, NULL, pccard_store_eject);
 
@@ -167,7 +168,9 @@ static ssize_t pccard_store_irq_mask(struct device *dev,
        ret = sscanf(buf, "0x%x\n", &mask);
 
        if (ret == 1) {
+               mutex_lock(&s->ops_mutex);
                s->irq_mask &= mask;
+               mutex_unlock(&s->ops_mutex);
                ret = 0;
        }
 
@@ -187,27 +190,17 @@ static ssize_t pccard_store_resource(struct device *dev,
                                     struct device_attribute *attr,
                                     const char *buf, size_t count)
 {
-       unsigned long flags;
        struct pcmcia_socket *s = to_socket(dev);
 
        if (!count)
                return -EINVAL;
 
-       spin_lock_irqsave(&s->lock, flags);
+       mutex_lock(&s->ops_mutex);
        if (!s->resource_setup_done)
                s->resource_setup_done = 1;
-       spin_unlock_irqrestore(&s->lock, flags);
-
-       mutex_lock(&s->skt_mutex);
-       if ((s->callback) &&
-           (s->state & SOCKET_PRESENT) &&
-           !(s->state & SOCKET_CARDBUS)) {
-               if (try_module_get(s->callback->owner)) {
-                       s->callback->requery(s, 0);
-                       module_put(s->callback->owner);
-               }
-       }
-       mutex_unlock(&s->skt_mutex);
+       mutex_unlock(&s->ops_mutex);
+
+       pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
 
        return count;
 }