.. | .. |
---|
15 | 15 | |
---|
16 | 16 | #include <linux/wait.h> |
---|
17 | 17 | #include <linux/time.h> |
---|
| 18 | +#include <linux/completion.h> |
---|
18 | 19 | #include <linux/delay.h> |
---|
19 | 20 | #include <linux/module.h> |
---|
20 | 21 | #include <linux/pci.h> |
---|
21 | 22 | #include <linux/init.h> |
---|
22 | 23 | #include <linux/mutex.h> |
---|
23 | 24 | #include <linux/sched.h> |
---|
24 | | -#include <linux/semaphore.h> |
---|
25 | 25 | #include <linux/kthread.h> |
---|
26 | 26 | #include "ibmphp.h" |
---|
27 | 27 | |
---|
.. | .. |
---|
88 | 88 | //---------------------------------------------------------------------------- |
---|
89 | 89 | // global variables |
---|
90 | 90 | //---------------------------------------------------------------------------- |
---|
91 | | -static struct mutex sem_hpcaccess; // lock access to HPC |
---|
92 | | -static struct semaphore semOperations; // lock all operations and |
---|
| 91 | +static DEFINE_MUTEX(sem_hpcaccess); // lock access to HPC |
---|
| 92 | +static DEFINE_MUTEX(operations_mutex); // lock all operations and |
---|
93 | 93 | // access to data structures |
---|
94 | | -static struct semaphore sem_exit; // make sure polling thread goes away |
---|
| 94 | +static DECLARE_COMPLETION(exit_complete); // make sure polling thread goes away |
---|
95 | 95 | static struct task_struct *ibmphp_poll_thread; |
---|
96 | 96 | //---------------------------------------------------------------------------- |
---|
97 | 97 | // local function prototypes |
---|
.. | .. |
---|
108 | 108 | static int hpc_wait_ctlr_notworking(int, struct controller *, void __iomem *, u8 *); |
---|
109 | 109 | //---------------------------------------------------------------------------- |
---|
110 | 110 | |
---|
111 | | - |
---|
112 | | -/*---------------------------------------------------------------------- |
---|
113 | | -* Name: ibmphp_hpc_initvars |
---|
114 | | -* |
---|
115 | | -* Action: initialize semaphores and variables |
---|
116 | | -*---------------------------------------------------------------------*/ |
---|
117 | | -void __init ibmphp_hpc_initvars(void) |
---|
118 | | -{ |
---|
119 | | - debug("%s - Entry\n", __func__); |
---|
120 | | - |
---|
121 | | - mutex_init(&sem_hpcaccess); |
---|
122 | | - sema_init(&semOperations, 1); |
---|
123 | | - sema_init(&sem_exit, 0); |
---|
124 | | - to_debug = 0; |
---|
125 | | - |
---|
126 | | - debug("%s - Exit\n", __func__); |
---|
127 | | -} |
---|
128 | 111 | |
---|
129 | 112 | /*---------------------------------------------------------------------- |
---|
130 | 113 | * Name: i2c_ctrl_read |
---|
.. | .. |
---|
780 | 763 | *---------------------------------------------------------------------*/ |
---|
781 | 764 | void ibmphp_lock_operations(void) |
---|
782 | 765 | { |
---|
783 | | - down(&semOperations); |
---|
| 766 | + mutex_lock(&operations_mutex); |
---|
784 | 767 | to_debug = 1; |
---|
785 | 768 | } |
---|
786 | 769 | |
---|
.. | .. |
---|
790 | 773 | void ibmphp_unlock_operations(void) |
---|
791 | 774 | { |
---|
792 | 775 | debug("%s - Entry\n", __func__); |
---|
793 | | - up(&semOperations); |
---|
| 776 | + mutex_unlock(&operations_mutex); |
---|
794 | 777 | to_debug = 0; |
---|
795 | 778 | debug("%s - Exit\n", __func__); |
---|
796 | 779 | } |
---|
.. | .. |
---|
816 | 799 | |
---|
817 | 800 | while (!kthread_should_stop()) { |
---|
818 | 801 | /* try to get the lock to do some kind of hardware access */ |
---|
819 | | - down(&semOperations); |
---|
| 802 | + mutex_lock(&operations_mutex); |
---|
820 | 803 | |
---|
821 | 804 | switch (poll_state) { |
---|
822 | 805 | case POLL_LATCH_REGISTER: |
---|
.. | .. |
---|
871 | 854 | break; |
---|
872 | 855 | case POLL_SLEEP: |
---|
873 | 856 | /* don't sleep with a lock on the hardware */ |
---|
874 | | - up(&semOperations); |
---|
| 857 | + mutex_unlock(&operations_mutex); |
---|
875 | 858 | msleep(POLL_INTERVAL_SEC * 1000); |
---|
876 | 859 | |
---|
877 | 860 | if (kthread_should_stop()) |
---|
878 | 861 | goto out_sleep; |
---|
879 | 862 | |
---|
880 | | - down(&semOperations); |
---|
| 863 | + mutex_lock(&operations_mutex); |
---|
881 | 864 | |
---|
882 | 865 | if (poll_count >= POLL_LATCH_CNT) { |
---|
883 | 866 | poll_count = 0; |
---|
.. | .. |
---|
887 | 870 | break; |
---|
888 | 871 | } |
---|
889 | 872 | /* give up the hardware semaphore */ |
---|
890 | | - up(&semOperations); |
---|
| 873 | + mutex_unlock(&operations_mutex); |
---|
891 | 874 | /* sleep for a short time just for good measure */ |
---|
892 | 875 | out_sleep: |
---|
893 | 876 | msleep(100); |
---|
894 | 877 | } |
---|
895 | | - up(&sem_exit); |
---|
| 878 | + complete(&exit_complete); |
---|
896 | 879 | debug("%s - Exit\n", __func__); |
---|
897 | 880 | return 0; |
---|
898 | 881 | } |
---|
.. | .. |
---|
1060 | 1043 | debug("after locking operations\n"); |
---|
1061 | 1044 | |
---|
1062 | 1045 | // wait for poll thread to exit |
---|
1063 | | - debug("before sem_exit down\n"); |
---|
1064 | | - down(&sem_exit); |
---|
1065 | | - debug("after sem_exit down\n"); |
---|
| 1046 | + debug("before exit_complete down\n"); |
---|
| 1047 | + wait_for_completion(&exit_complete); |
---|
| 1048 | + debug("after exit_completion down\n"); |
---|
1066 | 1049 | |
---|
1067 | 1050 | // cleanup |
---|
1068 | 1051 | debug("before free_hpc_access\n"); |
---|
.. | .. |
---|
1070 | 1053 | debug("after free_hpc_access\n"); |
---|
1071 | 1054 | ibmphp_unlock_operations(); |
---|
1072 | 1055 | debug("after unlock operations\n"); |
---|
1073 | | - up(&sem_exit); |
---|
1074 | | - debug("after sem exit up\n"); |
---|
1075 | 1056 | |
---|
1076 | 1057 | debug("%s - Exit\n", __func__); |
---|
1077 | 1058 | } |
---|