[PATCH v5 08/22] mfd: omap-usb-tll: serialize access to TLL device

From: Roger Quadros
Date: Wed Jan 02 2013 - 10:03:56 EST


Get rid of the unnecessary spin_lock_irqsave/restore() as there is
no interrupt handler for this driver. Instead we serialize access
to tll_dev using a global spinlock.

Signed-off-by: Roger Quadros <rogerq@xxxxxx>
---
drivers/mfd/omap-usb-tll.c | 53 ++++++++++++++++++++++---------------------
1 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/drivers/mfd/omap-usb-tll.c b/drivers/mfd/omap-usb-tll.c
index 5f61352..3dadacb 100644
--- a/drivers/mfd/omap-usb-tll.c
+++ b/drivers/mfd/omap-usb-tll.c
@@ -103,14 +103,13 @@ struct usbtll_omap {
int nch; /* num. of channels */
struct usbtll_omap_platform_data *pdata;
struct clk **ch_clk;
- /* secure the register updates */
- spinlock_t lock;
};

/*-------------------------------------------------------------------------*/

static const char usbtll_driver_name[] = USBTLL_DRIVER_NAME;
static struct device *tll_dev;
+static DEFINE_SPINLOCK(tll_lock); /* serialize access to tll_dev */

/*-------------------------------------------------------------------------*/

@@ -212,7 +211,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
struct resource *res;
struct usbtll_omap *tll;
unsigned reg;
- unsigned long flags;
int ret = 0;
int i, ver;
bool needs_tll;
@@ -230,8 +228,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
return -ENODEV;
}

- spin_lock_init(&tll->lock);
-
tll->pdata = pdata;

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -243,8 +239,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
pm_runtime_enable(dev);
pm_runtime_get_sync(dev);

- spin_lock_irqsave(&tll->lock, flags);
-
ver = usbtll_read(base, OMAP_USBTLL_REVISION);
switch (ver) {
case OMAP_USBTLL_REV1:
@@ -262,8 +256,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
break;
}

- spin_unlock_irqrestore(&tll->lock, flags);
-
tll->ch_clk = devm_kzalloc(dev, sizeof(struct clk * [tll->nch]),
GFP_KERNEL);
if (!tll->ch_clk) {
@@ -272,8 +264,6 @@ static int usbtll_omap_probe(struct platform_device *pdev)
goto err_clk_alloc;
}

- spin_lock_irqsave(&tll->lock, flags);
-
for (i = 0; i < tll->nch; i++) {
char clkname[] = "usb_tll_hs_usb_chx_clk";
struct clk *fck;
@@ -332,10 +322,11 @@ static int usbtll_omap_probe(struct platform_device *pdev)
}
}

- spin_unlock_irqrestore(&tll->lock, flags);
pm_runtime_put_sync(dev);
/* only after this can omap_tll_enable/disable work */
+ spin_lock(&tll_lock);
tll_dev = dev;
+ spin_unlock(&tll_lock);

return 0;

@@ -357,7 +348,9 @@ static int usbtll_omap_remove(struct platform_device *pdev)
struct usbtll_omap *tll = platform_get_drvdata(pdev);
int i;

+ spin_lock(&tll_lock);
tll_dev = NULL;
+ spin_unlock(&tll_lock);

for (i = 0; i < tll->nch; i++)
clk_put(tll->ch_clk[i]);
@@ -370,13 +363,10 @@ static int usbtll_runtime_resume(struct device *dev)
{
struct usbtll_omap *tll = dev_get_drvdata(dev);
struct usbtll_omap_platform_data *pdata = tll->pdata;
- unsigned long flags;
int i;

dev_dbg(dev, "usbtll_runtime_resume\n");

- spin_lock_irqsave(&tll->lock, flags);
-
for (i = 0; i < tll->nch; i++) {
if (omap_usb_mode_needs_tll(pdata->port_mode[i])) {
int r;
@@ -392,8 +382,6 @@ static int usbtll_runtime_resume(struct device *dev)
}
}

- spin_unlock_irqrestore(&tll->lock, flags);
-
return 0;
}

@@ -401,13 +389,10 @@ static int usbtll_runtime_suspend(struct device *dev)
{
struct usbtll_omap *tll = dev_get_drvdata(dev);
struct usbtll_omap_platform_data *pdata = tll->pdata;
- unsigned long flags;
int i;

dev_dbg(dev, "usbtll_runtime_suspend\n");

- spin_lock_irqsave(&tll->lock, flags);
-
for (i = 0; i < tll->nch; i++) {
if (omap_usb_mode_needs_tll(pdata->port_mode[i])) {
if (tll->ch_clk[i])
@@ -415,8 +400,6 @@ static int usbtll_runtime_suspend(struct device *dev)
}
}

- spin_unlock_irqrestore(&tll->lock, flags);
-
return 0;
}

@@ -438,21 +421,39 @@ static struct platform_driver usbtll_omap_driver = {

int omap_tll_enable(void)
{
+ int ret;
+
+ spin_lock(&tll_lock);
+
if (!tll_dev) {
pr_err("%s: OMAP USB TLL not initialized\n", __func__);
- return -ENODEV;
+ ret = -ENODEV;
+ } else {
+ ret = pm_runtime_get_sync(tll_dev);
}
- return pm_runtime_get_sync(tll_dev);
+
+ spin_unlock(&tll_lock);
+
+ return ret;
}
EXPORT_SYMBOL_GPL(omap_tll_enable);

int omap_tll_disable(void)
{
+ int ret;
+
+ spin_lock(&tll_lock);
+
if (!tll_dev) {
pr_err("%s: OMAP USB TLL not initialized\n", __func__);
- return -ENODEV;
+ ret = -ENODEV;
+ } else {
+ ret = pm_runtime_put_sync(tll_dev);
}
- return pm_runtime_put_sync(tll_dev);
+
+ spin_unlock(&tll_lock);
+
+ return ret;
}
EXPORT_SYMBOL_GPL(omap_tll_disable);

--
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/