vserver 2.0 rc7
[linux-2.6.git] / drivers / pcmcia / socket_sysfs.c
index a68d7e5..8eed039 100644 (file)
@@ -148,6 +148,45 @@ static ssize_t pccard_store_irq_mask(struct class_device *dev, const char *buf,
 static CLASS_DEVICE_ATTR(card_irq_mask, 0600, pccard_show_irq_mask, pccard_store_irq_mask);
 
 
+static ssize_t pccard_show_resource(struct class_device *dev, char *buf)
+{
+       struct pcmcia_socket *s = to_socket(dev);
+       return sprintf(buf, "%s\n", s->resource_setup_done ? "yes" : "no");
+}
+
+static ssize_t pccard_store_resource(struct class_device *dev, 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);
+       if (!s->resource_setup_done) {
+               s->resource_setup_done = 1;
+               spin_unlock_irqrestore(&s->lock, flags);
+
+               down(&s->skt_sem);
+               if ((s->callback) &&
+                   (s->state & SOCKET_PRESENT) &&
+                   !(s->state & SOCKET_CARDBUS)) {
+                       if (try_module_get(s->callback->owner)) {
+                               s->callback->resources_done(s);
+                               module_put(s->callback->owner);
+                       }
+               }
+               up(&s->skt_sem);
+
+               return count;
+       }
+       spin_unlock_irqrestore(&s->lock, flags);
+
+       return count;
+}
+static CLASS_DEVICE_ATTR(available_resources_setup_done, 0600, pccard_show_resource, pccard_store_resource);
+
+
 static struct class_device_attribute *pccard_socket_attributes[] = {
        &class_device_attr_card_type,
        &class_device_attr_card_voltage,
@@ -156,6 +195,7 @@ static struct class_device_attribute *pccard_socket_attributes[] = {
        &class_device_attr_card_insert,
        &class_device_attr_card_eject,
        &class_device_attr_card_irq_mask,
+       &class_device_attr_available_resources_setup_done,
        NULL,
 };