diff options
Diffstat (limited to 'drivers/pcmcia/cs.c')
-rw-r--r-- | drivers/pcmcia/cs.c | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 613f2f1fbfdd..3162998579c1 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/moduleparam.h> | 16 | #include <linux/moduleparam.h> |
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/config.h> | ||
20 | #include <linux/string.h> | 19 | #include <linux/string.h> |
21 | #include <linux/major.h> | 20 | #include <linux/major.h> |
22 | #include <linux/errno.h> | 21 | #include <linux/errno.h> |
@@ -111,9 +110,9 @@ int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state) | |||
111 | list_for_each_entry(socket, &pcmcia_socket_list, socket_list) { | 110 | list_for_each_entry(socket, &pcmcia_socket_list, socket_list) { |
112 | if (socket->dev.dev != dev) | 111 | if (socket->dev.dev != dev) |
113 | continue; | 112 | continue; |
114 | down(&socket->skt_sem); | 113 | mutex_lock(&socket->skt_mutex); |
115 | socket_suspend(socket); | 114 | socket_suspend(socket); |
116 | up(&socket->skt_sem); | 115 | mutex_unlock(&socket->skt_mutex); |
117 | } | 116 | } |
118 | up_read(&pcmcia_socket_list_rwsem); | 117 | up_read(&pcmcia_socket_list_rwsem); |
119 | 118 | ||
@@ -129,9 +128,9 @@ int pcmcia_socket_dev_resume(struct device *dev) | |||
129 | list_for_each_entry(socket, &pcmcia_socket_list, socket_list) { | 128 | list_for_each_entry(socket, &pcmcia_socket_list, socket_list) { |
130 | if (socket->dev.dev != dev) | 129 | if (socket->dev.dev != dev) |
131 | continue; | 130 | continue; |
132 | down(&socket->skt_sem); | 131 | mutex_lock(&socket->skt_mutex); |
133 | socket_resume(socket); | 132 | socket_resume(socket); |
134 | up(&socket->skt_sem); | 133 | mutex_unlock(&socket->skt_mutex); |
135 | } | 134 | } |
136 | up_read(&pcmcia_socket_list_rwsem); | 135 | up_read(&pcmcia_socket_list_rwsem); |
137 | 136 | ||
@@ -237,7 +236,7 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) | |||
237 | init_completion(&socket->socket_released); | 236 | init_completion(&socket->socket_released); |
238 | init_completion(&socket->thread_done); | 237 | init_completion(&socket->thread_done); |
239 | init_waitqueue_head(&socket->thread_wait); | 238 | init_waitqueue_head(&socket->thread_wait); |
240 | init_MUTEX(&socket->skt_sem); | 239 | mutex_init(&socket->skt_mutex); |
241 | spin_lock_init(&socket->thread_lock); | 240 | spin_lock_init(&socket->thread_lock); |
242 | 241 | ||
243 | ret = kernel_thread(pccardd, socket, CLONE_KERNEL); | 242 | ret = kernel_thread(pccardd, socket, CLONE_KERNEL); |
@@ -406,8 +405,6 @@ static void socket_shutdown(struct pcmcia_socket *s) | |||
406 | cb_free(s); | 405 | cb_free(s); |
407 | #endif | 406 | #endif |
408 | s->functions = 0; | 407 | s->functions = 0; |
409 | kfree(s->config); | ||
410 | s->config = NULL; | ||
411 | 408 | ||
412 | s->ops->get_status(s, &status); | 409 | s->ops->get_status(s, &status); |
413 | if (status & SS_POWERON) { | 410 | if (status & SS_POWERON) { |
@@ -664,7 +661,7 @@ static int pccardd(void *__skt) | |||
664 | spin_unlock_irqrestore(&skt->thread_lock, flags); | 661 | spin_unlock_irqrestore(&skt->thread_lock, flags); |
665 | 662 | ||
666 | if (events) { | 663 | if (events) { |
667 | down(&skt->skt_sem); | 664 | mutex_lock(&skt->skt_mutex); |
668 | if (events & SS_DETECT) | 665 | if (events & SS_DETECT) |
669 | socket_detect_change(skt); | 666 | socket_detect_change(skt); |
670 | if (events & SS_BATDEAD) | 667 | if (events & SS_BATDEAD) |
@@ -673,7 +670,7 @@ static int pccardd(void *__skt) | |||
673 | send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW); | 670 | send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW); |
674 | if (events & SS_READY) | 671 | if (events & SS_READY) |
675 | send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW); | 672 | send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW); |
676 | up(&skt->skt_sem); | 673 | mutex_unlock(&skt->skt_mutex); |
677 | continue; | 674 | continue; |
678 | } | 675 | } |
679 | 676 | ||
@@ -717,8 +714,8 @@ int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c) | |||
717 | { | 714 | { |
718 | int ret = 0; | 715 | int ret = 0; |
719 | 716 | ||
720 | /* s->skt_sem also protects s->callback */ | 717 | /* s->skt_mutex also protects s->callback */ |
721 | down(&s->skt_sem); | 718 | mutex_lock(&s->skt_mutex); |
722 | 719 | ||
723 | if (c) { | 720 | if (c) { |
724 | /* registration */ | 721 | /* registration */ |
@@ -734,7 +731,7 @@ int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c) | |||
734 | } else | 731 | } else |
735 | s->callback = NULL; | 732 | s->callback = NULL; |
736 | err: | 733 | err: |
737 | up(&s->skt_sem); | 734 | mutex_unlock(&s->skt_mutex); |
738 | 735 | ||
739 | return ret; | 736 | return ret; |
740 | } | 737 | } |
@@ -752,7 +749,7 @@ int pccard_reset_card(struct pcmcia_socket *skt) | |||
752 | 749 | ||
753 | cs_dbg(skt, 1, "resetting socket\n"); | 750 | cs_dbg(skt, 1, "resetting socket\n"); |
754 | 751 | ||
755 | down(&skt->skt_sem); | 752 | mutex_lock(&skt->skt_mutex); |
756 | do { | 753 | do { |
757 | if (!(skt->state & SOCKET_PRESENT)) { | 754 | if (!(skt->state & SOCKET_PRESENT)) { |
758 | ret = CS_NO_CARD; | 755 | ret = CS_NO_CARD; |
@@ -781,7 +778,7 @@ int pccard_reset_card(struct pcmcia_socket *skt) | |||
781 | 778 | ||
782 | ret = CS_SUCCESS; | 779 | ret = CS_SUCCESS; |
783 | } while (0); | 780 | } while (0); |
784 | up(&skt->skt_sem); | 781 | mutex_unlock(&skt->skt_mutex); |
785 | 782 | ||
786 | return ret; | 783 | return ret; |
787 | } /* reset_card */ | 784 | } /* reset_card */ |
@@ -797,7 +794,7 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt) | |||
797 | 794 | ||
798 | cs_dbg(skt, 1, "suspending socket\n"); | 795 | cs_dbg(skt, 1, "suspending socket\n"); |
799 | 796 | ||
800 | down(&skt->skt_sem); | 797 | mutex_lock(&skt->skt_mutex); |
801 | do { | 798 | do { |
802 | if (!(skt->state & SOCKET_PRESENT)) { | 799 | if (!(skt->state & SOCKET_PRESENT)) { |
803 | ret = CS_NO_CARD; | 800 | ret = CS_NO_CARD; |
@@ -814,7 +811,7 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt) | |||
814 | } | 811 | } |
815 | ret = socket_suspend(skt); | 812 | ret = socket_suspend(skt); |
816 | } while (0); | 813 | } while (0); |
817 | up(&skt->skt_sem); | 814 | mutex_unlock(&skt->skt_mutex); |
818 | 815 | ||
819 | return ret; | 816 | return ret; |
820 | } /* suspend_card */ | 817 | } /* suspend_card */ |
@@ -827,7 +824,7 @@ int pcmcia_resume_card(struct pcmcia_socket *skt) | |||
827 | 824 | ||
828 | cs_dbg(skt, 1, "waking up socket\n"); | 825 | cs_dbg(skt, 1, "waking up socket\n"); |
829 | 826 | ||
830 | down(&skt->skt_sem); | 827 | mutex_lock(&skt->skt_mutex); |
831 | do { | 828 | do { |
832 | if (!(skt->state & SOCKET_PRESENT)) { | 829 | if (!(skt->state & SOCKET_PRESENT)) { |
833 | ret = CS_NO_CARD; | 830 | ret = CS_NO_CARD; |
@@ -841,7 +838,7 @@ int pcmcia_resume_card(struct pcmcia_socket *skt) | |||
841 | if (!ret && skt->callback) | 838 | if (!ret && skt->callback) |
842 | skt->callback->resume(skt); | 839 | skt->callback->resume(skt); |
843 | } while (0); | 840 | } while (0); |
844 | up(&skt->skt_sem); | 841 | mutex_unlock(&skt->skt_mutex); |
845 | 842 | ||
846 | return ret; | 843 | return ret; |
847 | } /* resume_card */ | 844 | } /* resume_card */ |
@@ -855,7 +852,7 @@ int pcmcia_eject_card(struct pcmcia_socket *skt) | |||
855 | 852 | ||
856 | cs_dbg(skt, 1, "user eject request\n"); | 853 | cs_dbg(skt, 1, "user eject request\n"); |
857 | 854 | ||
858 | down(&skt->skt_sem); | 855 | mutex_lock(&skt->skt_mutex); |
859 | do { | 856 | do { |
860 | if (!(skt->state & SOCKET_PRESENT)) { | 857 | if (!(skt->state & SOCKET_PRESENT)) { |
861 | ret = -ENODEV; | 858 | ret = -ENODEV; |
@@ -871,7 +868,7 @@ int pcmcia_eject_card(struct pcmcia_socket *skt) | |||
871 | socket_remove(skt); | 868 | socket_remove(skt); |
872 | ret = 0; | 869 | ret = 0; |
873 | } while (0); | 870 | } while (0); |
874 | up(&skt->skt_sem); | 871 | mutex_unlock(&skt->skt_mutex); |
875 | 872 | ||
876 | return ret; | 873 | return ret; |
877 | } /* eject_card */ | 874 | } /* eject_card */ |
@@ -884,7 +881,7 @@ int pcmcia_insert_card(struct pcmcia_socket *skt) | |||
884 | 881 | ||
885 | cs_dbg(skt, 1, "user insert request\n"); | 882 | cs_dbg(skt, 1, "user insert request\n"); |
886 | 883 | ||
887 | down(&skt->skt_sem); | 884 | mutex_lock(&skt->skt_mutex); |
888 | do { | 885 | do { |
889 | if (skt->state & SOCKET_PRESENT) { | 886 | if (skt->state & SOCKET_PRESENT) { |
890 | ret = -EBUSY; | 887 | ret = -EBUSY; |
@@ -896,7 +893,7 @@ int pcmcia_insert_card(struct pcmcia_socket *skt) | |||
896 | } | 893 | } |
897 | ret = 0; | 894 | ret = 0; |
898 | } while (0); | 895 | } while (0); |
899 | up(&skt->skt_sem); | 896 | mutex_unlock(&skt->skt_mutex); |
900 | 897 | ||
901 | return ret; | 898 | return ret; |
902 | } /* insert_card */ | 899 | } /* insert_card */ |