| From ff2316b87a336bff940939cd9fc56287ed48e578 Mon Sep 17 00:00:00 2001 |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Date: Thu, 19 Nov 2015 16:56:44 +0100 |
| Subject: i2c: rcar: remove spinlock |
| |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| |
| commit ff2316b87a336bff940939cd9fc56287ed48e578 upstream. |
| |
| After making sure to reinit the HW and clear interrupts in the timeout |
| case, 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: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| Signed-off-by: Fabrizio Castro <fabrizio.castro@bp.renesas.com> |
| Reviewed-by: Chris Paterson <Chris.Paterson2@renesas.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/i2c/busses/i2c-rcar.c | 23 ++++------------------- |
| 1 file changed, 4 insertions(+), 19 deletions(-) |
| |
| --- a/drivers/i2c/busses/i2c-rcar.c |
| +++ b/drivers/i2c/busses/i2c-rcar.c |
| @@ -33,7 +33,6 @@ |
| #include <linux/platform_device.h> |
| #include <linux/pm_runtime.h> |
| #include <linux/slab.h> |
| -#include <linux/spinlock.h> |
| |
| /* register offsets */ |
| #define ICSCR 0x00 /* slave ctrl */ |
| @@ -110,7 +109,6 @@ struct rcar_i2c_priv { |
| struct i2c_msg *msg; |
| struct clk *clk; |
| |
| - spinlock_t lock; |
| wait_queue_head_t wait; |
| |
| int pos; |
| @@ -429,9 +427,6 @@ static irqreturn_t rcar_i2c_irq(int irq, |
| irqreturn_t result = IRQ_HANDLED; |
| u32 msr; |
| |
| - /*-------------- spin lock -----------------*/ |
| - spin_lock(&priv->lock); |
| - |
| if (rcar_i2c_slave_irq(priv)) |
| goto exit; |
| |
| @@ -478,9 +473,6 @@ out: |
| } |
| |
| exit: |
| - spin_unlock(&priv->lock); |
| - /*-------------- spin unlock -----------------*/ |
| - |
| return result; |
| } |
| |
| @@ -490,9 +482,8 @@ static int rcar_i2c_master_xfer(struct i |
| { |
| struct rcar_i2c_priv *priv = i2c_get_adapdata(adap); |
| struct device *dev = rcar_i2c_priv_to_dev(priv); |
| - unsigned long flags; |
| int i, ret; |
| - long timeout; |
| + long time_left; |
| |
| pm_runtime_get_sync(dev); |
| |
| @@ -507,9 +498,6 @@ static int rcar_i2c_master_xfer(struct i |
| break; |
| } |
| |
| - /*-------------- spin lock -----------------*/ |
| - spin_lock_irqsave(&priv->lock, flags); |
| - |
| /* init each data */ |
| priv->msg = &msgs[i]; |
| priv->pos = 0; |
| @@ -519,13 +507,11 @@ static int rcar_i2c_master_xfer(struct i |
| |
| rcar_i2c_prepare_msg(priv); |
| |
| - spin_unlock_irqrestore(&priv->lock, flags); |
| - /*-------------- spin unlock -----------------*/ |
| - |
| - timeout = wait_event_timeout(priv->wait, |
| + time_left = wait_event_timeout(priv->wait, |
| rcar_i2c_flags_has(priv, ID_DONE), |
| adap->timeout); |
| - if (!timeout) { |
| + if (!time_left) { |
| + rcar_i2c_init(priv); |
| ret = -ETIMEDOUT; |
| break; |
| } |
| @@ -656,7 +642,6 @@ static int rcar_i2c_probe(struct platfor |
| |
| irq = platform_get_irq(pdev, 0); |
| init_waitqueue_head(&priv->wait); |
| - spin_lock_init(&priv->lock); |
| |
| adap = &priv->adap; |
| adap->nr = pdev->id; |