提交 738206de 编写于 作者: W Wolfram Sang 提交者: Wolfram Sang

i2c: rcar: remove spinlock

We make sure to reinit the HW in the timeout case; then we know that
interrupts are always disabled in the sections protected by the
spinlock. Thus, we can simply remove it which is a preparation for
further refactoring. While here, rename the timeout variable to
time_left which is way more readable.
Signed-off-by: NWolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
上级 59daef90
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h>
/* register offsets */ /* register offsets */
#define ICSCR 0x00 /* slave ctrl */ #define ICSCR 0x00 /* slave ctrl */
...@@ -110,7 +109,6 @@ struct rcar_i2c_priv { ...@@ -110,7 +109,6 @@ struct rcar_i2c_priv {
struct i2c_msg *msg; struct i2c_msg *msg;
struct clk *clk; struct clk *clk;
spinlock_t lock;
wait_queue_head_t wait; wait_queue_head_t wait;
int pos; int pos;
...@@ -428,9 +426,6 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr) ...@@ -428,9 +426,6 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
irqreturn_t result = IRQ_HANDLED; irqreturn_t result = IRQ_HANDLED;
u32 msr; u32 msr;
/*-------------- spin lock -----------------*/
spin_lock(&priv->lock);
if (rcar_i2c_slave_irq(priv)) if (rcar_i2c_slave_irq(priv))
goto exit; goto exit;
...@@ -477,9 +472,6 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr) ...@@ -477,9 +472,6 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
} }
exit: exit:
spin_unlock(&priv->lock);
/*-------------- spin unlock -----------------*/
return result; return result;
} }
...@@ -489,9 +481,8 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, ...@@ -489,9 +481,8 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
{ {
struct rcar_i2c_priv *priv = i2c_get_adapdata(adap); struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
struct device *dev = rcar_i2c_priv_to_dev(priv); struct device *dev = rcar_i2c_priv_to_dev(priv);
unsigned long flags;
int i, ret; int i, ret;
long timeout; long time_left;
pm_runtime_get_sync(dev); pm_runtime_get_sync(dev);
...@@ -506,9 +497,6 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, ...@@ -506,9 +497,6 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
break; break;
} }
/*-------------- spin lock -----------------*/
spin_lock_irqsave(&priv->lock, flags);
/* init each data */ /* init each data */
priv->msg = &msgs[i]; priv->msg = &msgs[i];
priv->pos = 0; priv->pos = 0;
...@@ -518,13 +506,11 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, ...@@ -518,13 +506,11 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
rcar_i2c_prepare_msg(priv); rcar_i2c_prepare_msg(priv);
spin_unlock_irqrestore(&priv->lock, flags); time_left = wait_event_timeout(priv->wait,
/*-------------- spin unlock -----------------*/
timeout = wait_event_timeout(priv->wait,
rcar_i2c_flags_has(priv, ID_DONE), rcar_i2c_flags_has(priv, ID_DONE),
adap->timeout); adap->timeout);
if (!timeout) { if (!time_left) {
rcar_i2c_init(priv);
ret = -ETIMEDOUT; ret = -ETIMEDOUT;
break; break;
} }
...@@ -658,7 +644,6 @@ static int rcar_i2c_probe(struct platform_device *pdev) ...@@ -658,7 +644,6 @@ static int rcar_i2c_probe(struct platform_device *pdev)
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
init_waitqueue_head(&priv->wait); init_waitqueue_head(&priv->wait);
spin_lock_init(&priv->lock);
adap = &priv->adap; adap = &priv->adap;
adap->nr = pdev->id; adap->nr = pdev->id;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册