diff options
Diffstat (limited to 'drivers/pcmcia/cs.c')
-rw-r--r-- | drivers/pcmcia/cs.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index f0630a61da90..137a5db2eca2 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
@@ -407,7 +407,7 @@ static void socket_shutdown(struct pcmcia_socket *s) | |||
407 | "*** DANGER *** unable to remove socket power\n"); | 407 | "*** DANGER *** unable to remove socket power\n"); |
408 | } | 408 | } |
409 | 409 | ||
410 | cs_socket_put(s); | 410 | s->state &= ~SOCKET_INUSE; |
411 | } | 411 | } |
412 | 412 | ||
413 | static int socket_setup(struct pcmcia_socket *skt, int initial_delay) | 413 | static int socket_setup(struct pcmcia_socket *skt, int initial_delay) |
@@ -496,8 +496,8 @@ static int socket_insert(struct pcmcia_socket *skt) | |||
496 | 496 | ||
497 | dev_dbg(&skt->dev, "insert\n"); | 497 | dev_dbg(&skt->dev, "insert\n"); |
498 | 498 | ||
499 | if (!cs_socket_get(skt)) | 499 | WARN_ON(skt->state & SOCKET_INUSE); |
500 | return -ENODEV; | 500 | skt->state |= SOCKET_INUSE; |
501 | 501 | ||
502 | ret = socket_setup(skt, setup_delay); | 502 | ret = socket_setup(skt, setup_delay); |
503 | if (ret == 0) { | 503 | if (ret == 0) { |
@@ -697,6 +697,13 @@ static int pccardd(void *__skt) | |||
697 | /* make sure we are running before we exit */ | 697 | /* make sure we are running before we exit */ |
698 | set_current_state(TASK_RUNNING); | 698 | set_current_state(TASK_RUNNING); |
699 | 699 | ||
700 | /* shut down socket, if a device is still present */ | ||
701 | if (skt->state & SOCKET_PRESENT) { | ||
702 | mutex_lock(&skt->skt_mutex); | ||
703 | socket_remove(skt); | ||
704 | mutex_unlock(&skt->skt_mutex); | ||
705 | } | ||
706 | |||
700 | /* remove from the device core */ | 707 | /* remove from the device core */ |
701 | pccard_sysfs_remove_socket(&skt->dev); | 708 | pccard_sysfs_remove_socket(&skt->dev); |
702 | device_unregister(&skt->dev); | 709 | device_unregister(&skt->dev); |