linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / pcmcia / cs.c
index 3162998..613f2f1 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/config.h>
 #include <linux/string.h>
 #include <linux/major.h>
 #include <linux/errno.h>
@@ -110,9 +111,9 @@ int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state)
        list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
                if (socket->dev.dev != dev)
                        continue;
-               mutex_lock(&socket->skt_mutex);
+               down(&socket->skt_sem);
                socket_suspend(socket);
-               mutex_unlock(&socket->skt_mutex);
+               up(&socket->skt_sem);
        }
        up_read(&pcmcia_socket_list_rwsem);
 
@@ -128,9 +129,9 @@ int pcmcia_socket_dev_resume(struct device *dev)
        list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
                if (socket->dev.dev != dev)
                        continue;
-               mutex_lock(&socket->skt_mutex);
+               down(&socket->skt_sem);
                socket_resume(socket);
-               mutex_unlock(&socket->skt_mutex);
+               up(&socket->skt_sem);
        }
        up_read(&pcmcia_socket_list_rwsem);
 
@@ -236,7 +237,7 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
        init_completion(&socket->socket_released);
        init_completion(&socket->thread_done);
        init_waitqueue_head(&socket->thread_wait);
-       mutex_init(&socket->skt_mutex);
+       init_MUTEX(&socket->skt_sem);
        spin_lock_init(&socket->thread_lock);
 
        ret = kernel_thread(pccardd, socket, CLONE_KERNEL);
@@ -405,6 +406,8 @@ static void socket_shutdown(struct pcmcia_socket *s)
        cb_free(s);
 #endif
        s->functions = 0;
+       kfree(s->config);
+       s->config = NULL;
 
        s->ops->get_status(s, &status);
        if (status & SS_POWERON) {
@@ -661,7 +664,7 @@ static int pccardd(void *__skt)
                spin_unlock_irqrestore(&skt->thread_lock, flags);
 
                if (events) {
-                       mutex_lock(&skt->skt_mutex);
+                       down(&skt->skt_sem);
                        if (events & SS_DETECT)
                                socket_detect_change(skt);
                        if (events & SS_BATDEAD)
@@ -670,7 +673,7 @@ static int pccardd(void *__skt)
                                send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
                        if (events & SS_READY)
                                send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
-                       mutex_unlock(&skt->skt_mutex);
+                       up(&skt->skt_sem);
                        continue;
                }
 
@@ -714,8 +717,8 @@ int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c)
 {
         int ret = 0;
 
-       /* s->skt_mutex also protects s->callback */
-       mutex_lock(&s->skt_mutex);
+       /* s->skt_sem also protects s->callback */
+       down(&s->skt_sem);
 
        if (c) {
                /* registration */
@@ -731,7 +734,7 @@ int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c)
        } else
                s->callback = NULL;
  err:
-       mutex_unlock(&s->skt_mutex);
+       up(&s->skt_sem);
 
        return ret;
 }
@@ -749,7 +752,7 @@ int pccard_reset_card(struct pcmcia_socket *skt)
 
        cs_dbg(skt, 1, "resetting socket\n");
 
-       mutex_lock(&skt->skt_mutex);
+       down(&skt->skt_sem);
        do {
                if (!(skt->state & SOCKET_PRESENT)) {
                        ret = CS_NO_CARD;
@@ -778,7 +781,7 @@ int pccard_reset_card(struct pcmcia_socket *skt)
 
                ret = CS_SUCCESS;
        } while (0);
-       mutex_unlock(&skt->skt_mutex);
+       up(&skt->skt_sem);
 
        return ret;
 } /* reset_card */
@@ -794,7 +797,7 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt)
 
        cs_dbg(skt, 1, "suspending socket\n");
 
-       mutex_lock(&skt->skt_mutex);
+       down(&skt->skt_sem);
        do {
                if (!(skt->state & SOCKET_PRESENT)) {
                        ret = CS_NO_CARD;
@@ -811,7 +814,7 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt)
                }
                ret = socket_suspend(skt);
        } while (0);
-       mutex_unlock(&skt->skt_mutex);
+       up(&skt->skt_sem);
 
        return ret;
 } /* suspend_card */
@@ -824,7 +827,7 @@ int pcmcia_resume_card(struct pcmcia_socket *skt)
     
        cs_dbg(skt, 1, "waking up socket\n");
 
-       mutex_lock(&skt->skt_mutex);
+       down(&skt->skt_sem);
        do {
                if (!(skt->state & SOCKET_PRESENT)) {
                        ret = CS_NO_CARD;
@@ -838,7 +841,7 @@ int pcmcia_resume_card(struct pcmcia_socket *skt)
                if (!ret && skt->callback)
                        skt->callback->resume(skt);
        } while (0);
-       mutex_unlock(&skt->skt_mutex);
+       up(&skt->skt_sem);
 
        return ret;
 } /* resume_card */
@@ -852,7 +855,7 @@ int pcmcia_eject_card(struct pcmcia_socket *skt)
     
        cs_dbg(skt, 1, "user eject request\n");
 
-       mutex_lock(&skt->skt_mutex);
+       down(&skt->skt_sem);
        do {
                if (!(skt->state & SOCKET_PRESENT)) {
                        ret = -ENODEV;
@@ -868,7 +871,7 @@ int pcmcia_eject_card(struct pcmcia_socket *skt)
                socket_remove(skt);
                ret = 0;
        } while (0);
-       mutex_unlock(&skt->skt_mutex);
+       up(&skt->skt_sem);
 
        return ret;
 } /* eject_card */
@@ -881,7 +884,7 @@ int pcmcia_insert_card(struct pcmcia_socket *skt)
 
        cs_dbg(skt, 1, "user insert request\n");
 
-       mutex_lock(&skt->skt_mutex);
+       down(&skt->skt_sem);
        do {
                if (skt->state & SOCKET_PRESENT) {
                        ret = -EBUSY;
@@ -893,7 +896,7 @@ int pcmcia_insert_card(struct pcmcia_socket *skt)
                }
                ret = 0;
        } while (0);
-       mutex_unlock(&skt->skt_mutex);
+       up(&skt->skt_sem);
 
        return ret;
 } /* insert_card */