W1: split master mutex to avoid deadlocks.
[firefly-linux-kernel-4.4.55.git] / drivers / w1 / w1.c
index bfb898641029f963f05bb019b4b21a198c33d4be..1a574370d2cd22ec4686604520c9f139052afba9 100644 (file)
@@ -885,16 +885,21 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb
                 *
                 * Return 0 - device(s) present, 1 - no devices present.
                 */
+               mutex_lock(&dev->bus_mutex);
                if (w1_reset_bus(dev)) {
+                       mutex_unlock(&dev->bus_mutex);
                        dev_dbg(&dev->dev, "No devices present on the wire.\n");
                        break;
                }
 
                /* Do fast search on single slave bus */
                if (dev->max_slave_count == 1) {
+                       int rv;
                        w1_write_8(dev, W1_READ_ROM);
+                       rv = w1_read_block(dev, (u8 *)&rn, 8);
+                       mutex_unlock(&dev->bus_mutex);
 
-                       if (w1_read_block(dev, (u8 *)&rn, 8) == 8 && rn)
+                       if (rv == 8 && rn)
                                cb(dev, rn);
 
                        break;
@@ -927,10 +932,12 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb
                        rn |= (tmp64 << i);
 
                        if (kthread_should_stop()) {
+                               mutex_unlock(&dev->bus_mutex);
                                dev_dbg(&dev->dev, "Abort w1_search\n");
                                return;
                        }
                }
+               mutex_unlock(&dev->bus_mutex);
 
                if ( (triplet_ret & 0x03) != 0x03 ) {
                        if ( (desc_bit == last_zero) || (last_zero < 0))