PCI: ibmphp: Turn semaphores into completions or mutexes

The sem_exit variable is conceptually a completion, so it should be called
that.

Similarly, the semOperations semaphore is a simple mutex, and can be
changed into that, respectively.

With both converted, the ibmphp_hpc_initvars() function is no longer used
and can be removed.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
Arnd Bergmann 2018-12-10 22:49:10 +01:00 committed by Bjorn Helgaas
parent 25bd879ec1
commit 2a727f6091
3 changed files with 14 additions and 36 deletions

View file

@ -378,7 +378,6 @@ int ibmphp_add_pfmem_from_mem(struct resource_node *);
struct bus_node *ibmphp_find_res_bus(u8); struct bus_node *ibmphp_find_res_bus(u8);
void ibmphp_print_test(void); /* for debugging purposes */ void ibmphp_print_test(void); /* for debugging purposes */
void ibmphp_hpc_initvars(void);
int ibmphp_hpc_readslot(struct slot *, u8, u8 *); int ibmphp_hpc_readslot(struct slot *, u8, u8 *);
int ibmphp_hpc_writeslot(struct slot *, u8); int ibmphp_hpc_writeslot(struct slot *, u8);
void ibmphp_lock_operations(void); void ibmphp_lock_operations(void);

View file

@ -1277,8 +1277,6 @@ static int __init ibmphp_init(void)
ibmphp_debug = debug; ibmphp_debug = debug;
ibmphp_hpc_initvars();
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
irqs[i] = 0; irqs[i] = 0;

View file

@ -15,13 +15,13 @@
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/completion.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/semaphore.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include "ibmphp.h" #include "ibmphp.h"
@ -88,10 +88,10 @@ static int to_debug = 0;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// global variables // global variables
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
static struct mutex sem_hpcaccess; // lock access to HPC static DEFINE_MUTEX(sem_hpcaccess); // lock access to HPC
static struct semaphore semOperations; // lock all operations and static DEFINE_MUTEX(operations_mutex); // lock all operations and
// access to data structures // access to data structures
static struct semaphore sem_exit; // make sure polling thread goes away static DECLARE_COMPLETION(exit_complete); // make sure polling thread goes away
static struct task_struct *ibmphp_poll_thread; static struct task_struct *ibmphp_poll_thread;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// local function prototypes // local function prototypes
@ -109,23 +109,6 @@ static int hpc_wait_ctlr_notworking(int, struct controller *, void __iomem *, u8
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
/*----------------------------------------------------------------------
* Name: ibmphp_hpc_initvars
*
* Action: initialize semaphores and variables
*---------------------------------------------------------------------*/
void __init ibmphp_hpc_initvars(void)
{
debug("%s - Entry\n", __func__);
mutex_init(&sem_hpcaccess);
sema_init(&semOperations, 1);
sema_init(&sem_exit, 0);
to_debug = 0;
debug("%s - Exit\n", __func__);
}
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
* Name: i2c_ctrl_read * Name: i2c_ctrl_read
* *
@ -780,7 +763,7 @@ void free_hpc_access(void)
*---------------------------------------------------------------------*/ *---------------------------------------------------------------------*/
void ibmphp_lock_operations(void) void ibmphp_lock_operations(void)
{ {
down(&semOperations); mutex_lock(&operations_mutex);
to_debug = 1; to_debug = 1;
} }
@ -790,7 +773,7 @@ void ibmphp_lock_operations(void)
void ibmphp_unlock_operations(void) void ibmphp_unlock_operations(void)
{ {
debug("%s - Entry\n", __func__); debug("%s - Entry\n", __func__);
up(&semOperations); mutex_unlock(&operations_mutex);
to_debug = 0; to_debug = 0;
debug("%s - Exit\n", __func__); debug("%s - Exit\n", __func__);
} }
@ -816,7 +799,7 @@ static int poll_hpc(void *data)
while (!kthread_should_stop()) { while (!kthread_should_stop()) {
/* try to get the lock to do some kind of hardware access */ /* try to get the lock to do some kind of hardware access */
down(&semOperations); mutex_lock(&operations_mutex);
switch (poll_state) { switch (poll_state) {
case POLL_LATCH_REGISTER: case POLL_LATCH_REGISTER:
@ -871,13 +854,13 @@ static int poll_hpc(void *data)
break; break;
case POLL_SLEEP: case POLL_SLEEP:
/* don't sleep with a lock on the hardware */ /* don't sleep with a lock on the hardware */
up(&semOperations); mutex_unlock(&operations_mutex);
msleep(POLL_INTERVAL_SEC * 1000); msleep(POLL_INTERVAL_SEC * 1000);
if (kthread_should_stop()) if (kthread_should_stop())
goto out_sleep; goto out_sleep;
down(&semOperations); mutex_lock(&operations_mutex);
if (poll_count >= POLL_LATCH_CNT) { if (poll_count >= POLL_LATCH_CNT) {
poll_count = 0; poll_count = 0;
@ -887,12 +870,12 @@ static int poll_hpc(void *data)
break; break;
} }
/* give up the hardware semaphore */ /* give up the hardware semaphore */
up(&semOperations); mutex_unlock(&operations_mutex);
/* sleep for a short time just for good measure */ /* sleep for a short time just for good measure */
out_sleep: out_sleep:
msleep(100); msleep(100);
} }
up(&sem_exit); complete(&exit_complete);
debug("%s - Exit\n", __func__); debug("%s - Exit\n", __func__);
return 0; return 0;
} }
@ -1060,9 +1043,9 @@ void __exit ibmphp_hpc_stop_poll_thread(void)
debug("after locking operations\n"); debug("after locking operations\n");
// wait for poll thread to exit // wait for poll thread to exit
debug("before sem_exit down\n"); debug("before exit_complete down\n");
down(&sem_exit); wait_for_completion(&exit_complete);
debug("after sem_exit down\n"); debug("after exit_completion down\n");
// cleanup // cleanup
debug("before free_hpc_access\n"); debug("before free_hpc_access\n");
@ -1070,8 +1053,6 @@ void __exit ibmphp_hpc_stop_poll_thread(void)
debug("after free_hpc_access\n"); debug("after free_hpc_access\n");
ibmphp_unlock_operations(); ibmphp_unlock_operations();
debug("after unlock operations\n"); debug("after unlock operations\n");
up(&sem_exit);
debug("after sem exit up\n");
debug("%s - Exit\n", __func__); debug("%s - Exit\n", __func__);
} }