Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 00431707 authored by Arjan van de Ven's avatar Arjan van de Ven Committed by Russell King
Browse files

[ARM] Convert some arm semaphores to mutexes



The arm clock semaphores are strict mutexes, convert them to the new
mutex implementation

Signed-off-by: default avatarArjan van de Ven <arjan@infradead.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent f4619025
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/miscdevice.h>
#include <linux/spinlock.h>
#include <linux/device.h>
#include <linux/mutex.h>

#include <asm/rtc.h>
#include <asm/semaphore.h>
@@ -34,7 +35,7 @@ static unsigned long rtc_irq_data;
/*
 * rtc_sem protects rtc_inuse and rtc_ops
 */
static DECLARE_MUTEX(rtc_sem);
static DEFINE_MUTEX(rtc_mutex);
static unsigned long rtc_inuse;
static struct rtc_ops *rtc_ops;

@@ -355,7 +356,7 @@ static int rtc_open(struct inode *inode, struct file *file)
{
	int ret;

	down(&rtc_sem);
	mutex_lock(&rtc_mutex);

	if (rtc_inuse) {
		ret = -EBUSY;
@@ -373,7 +374,7 @@ static int rtc_open(struct inode *inode, struct file *file)
			rtc_inuse = 1;
		}
	}
	up(&rtc_sem);
	mutex_unlock(&rtc_mutex);

	return ret;
}
@@ -479,7 +480,7 @@ int register_rtc(struct rtc_ops *ops)
{
	int ret = -EBUSY;

	down(&rtc_sem);
	mutex_lock(&rtc_mutex);
	if (rtc_ops == NULL) {
		rtc_ops = ops;

@@ -488,7 +489,7 @@ int register_rtc(struct rtc_ops *ops)
			create_proc_read_entry("driver/rtc", 0, NULL,
					       rtc_read_proc, ops);
	}
	up(&rtc_sem);
	mutex_unlock(&rtc_mutex);

	return ret;
}
@@ -496,12 +497,12 @@ EXPORT_SYMBOL(register_rtc);

void unregister_rtc(struct rtc_ops *rtc)
{
	down(&rtc_sem);
	mutex_lock(&rtc_mutex);
	if (rtc == rtc_ops) {
		remove_proc_entry("driver/rtc", NULL);
		misc_deregister(&rtc_miscdev);
		rtc_ops = NULL;
	}
	up(&rtc_sem);
	mutex_unlock(&rtc_mutex);
}
EXPORT_SYMBOL(unregister_rtc);
+4 −3
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@
#include <linux/proc_fs.h>
#include <linux/device.h>
#include <linux/init.h>
#include <linux/mutex.h>

#include <asm/dma.h>
#include <asm/ecard.h>
@@ -206,7 +207,7 @@ static void ecard_task_readbytes(struct ecard_request *req)

static DECLARE_WAIT_QUEUE_HEAD(ecard_wait);
static struct ecard_request *ecard_req;
static DECLARE_MUTEX(ecard_sem);
static DEFINE_MUTEX(ecard_mutex);

/*
 * Set up the expansion card daemon's page tables.
@@ -299,7 +300,7 @@ static void ecard_call(struct ecard_request *req)

	req->complete = &completion;

	down(&ecard_sem);
	mutex_lock(&ecard_mutex);
	ecard_req = req;
	wake_up(&ecard_wait);

@@ -307,7 +308,7 @@ static void ecard_call(struct ecard_request *req)
	 * Now wait for kecardd to run.
	 */
	wait_for_completion(&completion);
	up(&ecard_sem);
	mutex_unlock(&ecard_mutex);
}

/* ======================= Mid-level card control ===================== */
+8 −7
Original line number Diff line number Diff line
@@ -16,26 +16,27 @@
#include <linux/err.h>
#include <linux/string.h>
#include <linux/clk.h>
#include <linux/mutex.h>

#include <asm/semaphore.h>

#include "clock.h"

static LIST_HEAD(clocks);
static DECLARE_MUTEX(clocks_sem);
static DEFINE_MUTEX(clocks_mutex);

struct clk *clk_get(struct device *dev, const char *id)
{
	struct clk *p, *clk = ERR_PTR(-ENOENT);

	down(&clocks_sem);
	mutex_lock(&clocks_mutex);
	list_for_each_entry(p, &clocks, node) {
		if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
			clk = p;
			break;
		}
	}
	up(&clocks_sem);
	mutex_unlock(&clocks_mutex);

	return clk;
}
@@ -78,18 +79,18 @@ EXPORT_SYMBOL(clk_set_rate);

int clk_register(struct clk *clk)
{
	down(&clocks_sem);
	mutex_lock(&clocks_mutex);
	list_add(&clk->node, &clocks);
	up(&clocks_sem);
	mutex_unlock(&clocks_mutex);
	return 0;
}
EXPORT_SYMBOL(clk_register);

void clk_unregister(struct clk *clk)
{
	down(&clocks_sem);
	mutex_lock(&clocks_mutex);
	list_del(&clk->node);
	up(&clocks_sem);
	mutex_unlock(&clocks_mutex);
}
EXPORT_SYMBOL(clk_unregister);

+8 −7
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#include <linux/err.h>
#include <linux/string.h>
#include <linux/clk.h>
#include <linux/mutex.h>

#include <asm/semaphore.h>
#include <asm/hardware/icst525.h>
@@ -22,20 +23,20 @@
#include "clock.h"

static LIST_HEAD(clocks);
static DECLARE_MUTEX(clocks_sem);
static DEFINE_MUTEX(clocks_mutex);

struct clk *clk_get(struct device *dev, const char *id)
{
	struct clk *p, *clk = ERR_PTR(-ENOENT);

	down(&clocks_sem);
	mutex_lock(&clocks_mutex);
	list_for_each_entry(p, &clocks, node) {
		if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
			clk = p;
			break;
		}
	}
	up(&clocks_sem);
	mutex_unlock(&clocks_mutex);

	return clk;
}
@@ -107,18 +108,18 @@ static struct clk uart_clk = {

int clk_register(struct clk *clk)
{
	down(&clocks_sem);
	mutex_lock(&clocks_mutex);
	list_add(&clk->node, &clocks);
	up(&clocks_sem);
	mutex_unlock(&clocks_mutex);
	return 0;
}
EXPORT_SYMBOL(clk_register);

void clk_unregister(struct clk *clk)
{
	down(&clocks_sem);
	mutex_lock(&clocks_mutex);
	list_del(&clk->node);
	up(&clocks_sem);
	mutex_unlock(&clocks_mutex);
}
EXPORT_SYMBOL(clk_unregister);

+9 −8
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/mutex.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/hardware.h>
@@ -59,7 +60,7 @@ static const struct ssp_info_ ssp_info[PXA_SSP_PORTS] = {
#endif
};

static DECLARE_MUTEX(sem);
static DEFINE_MUTEX(mutex);
static int use_count[PXA_SSP_PORTS] = {0, 0, 0};

static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs)
@@ -239,16 +240,16 @@ int ssp_init(struct ssp_dev *dev, u32 port, u32 init_flags)
	if (port > PXA_SSP_PORTS || port == 0)
		return -ENODEV;

	down(&sem);
	mutex_lock(&mutex);
	if (use_count[port - 1]) {
		up(&sem);
		mutex_unlock(&mutex);
		return -EBUSY;
	}
	use_count[port - 1]++;

	if (!request_mem_region(__PREG(SSCR0_P(port)), 0x2c, "SSP")) {
		use_count[port - 1]--;
		up(&sem);
		mutex_unlock(&mutex);
		return -EBUSY;
	}
	dev->port = port;
@@ -265,13 +266,13 @@ int ssp_init(struct ssp_dev *dev, u32 port, u32 init_flags)

	/* turn on SSP port clock */
	pxa_set_cken(ssp_info[port-1].clock, 1);
	up(&sem);
	mutex_unlock(&mutex);
	return 0;

out_region:
	release_mem_region(__PREG(SSCR0_P(port)), 0x2c);
	use_count[port - 1]--;
	up(&sem);
	mutex_unlock(&mutex);
	return ret;
}

@@ -282,7 +283,7 @@ out_region:
 */
void ssp_exit(struct ssp_dev *dev)
{
	down(&sem);
	mutex_lock(&mutex);
	SSCR0_P(dev->port) &= ~SSCR0_SSE;

    	if (dev->port > PXA_SSP_PORTS || dev->port == 0) {
@@ -295,7 +296,7 @@ void ssp_exit(struct ssp_dev *dev)
		free_irq(dev->irq, dev);
	release_mem_region(__PREG(SSCR0_P(dev->port)), 0x2c);
	use_count[dev->port - 1]--;
	up(&sem);
	mutex_unlock(&mutex);
}

EXPORT_SYMBOL(ssp_write_word);
Loading