i2c: designware: remove redundant lock
authorBaruch Siach <baruch@tkos.co.il>
Tue, 12 Jan 2016 13:16:35 +0000 (15:16 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Fri, 12 Feb 2016 19:40:12 +0000 (20:40 +0100)
The per adapter bus_lock already projects from concurrent calls to the
master_xfer callback. No need to add a driver internal lock.

Also, rephrase a comment to drop mention of this lock.

Reported-by: Rongrong Zou <zourongrong@gmail.com>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-designware-core.c
drivers/i2c/busses/i2c-designware-core.h

index 10fbd6d841e06aef8ae0a627f9fcf36106f5119b..4255eaab96d1145e7f6abbe3c039fa840b56a321 100644 (file)
@@ -634,7 +634,6 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
 
        dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num);
 
-       mutex_lock(&dev->lock);
        pm_runtime_get_sync(dev->dev);
 
        reinit_completion(&dev->cmd_complete);
@@ -673,11 +672,12 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
        }
 
        /*
-        * We must disable the adapter before unlocking the &dev->lock mutex
-        * below. Otherwise the hardware might continue generating interrupts
-        * which in turn causes a race condition with the following transfer.
-        * Needs some more investigation if the additional interrupts are
-        * a hardware bug or this driver doesn't handle them correctly yet.
+        * We must disable the adapter before returning and signaling the end
+        * of the current transfer. Otherwise the hardware might continue
+        * generating interrupts which in turn causes a race condition with
+        * the following transfer.  Needs some more investigation if the
+        * additional interrupts are a hardware bug or this driver doesn't
+        * handle them correctly yet.
         */
        __i2c_dw_enable(dev, false);
 
@@ -706,7 +706,6 @@ done:
 done_nolock:
        pm_runtime_mark_last_busy(dev->dev);
        pm_runtime_put_autosuspend(dev->dev);
-       mutex_unlock(&dev->lock);
 
        return ret;
 }
@@ -860,7 +859,6 @@ int i2c_dw_probe(struct dw_i2c_dev *dev)
        int r;
 
        init_completion(&dev->cmd_complete);
-       mutex_init(&dev->lock);
 
        r = i2c_dw_init(dev);
        if (r)
index 9ffb63a60f95454ebbaf43f6a12bbe922de66179..cd409e7fbc7140677c572886965a04e25844b8da 100644 (file)
@@ -36,7 +36,6 @@
  * @dev: driver model device node
  * @base: IO registers pointer
  * @cmd_complete: tx completion indicator
- * @lock: protect this struct and IO registers
  * @clk: input reference clock
  * @cmd_err: run time hadware error code
  * @msgs: points to an array of messages currently being transfered
@@ -73,7 +72,6 @@ struct dw_i2c_dev {
        struct device           *dev;
        void __iomem            *base;
        struct completion       cmd_complete;
-       struct mutex            lock;
        struct clk              *clk;
        u32                     (*get_clk_rate_khz) (struct dw_i2c_dev *dev);
        struct dw_pci_controller *controller;