| ================= | 
 | SoundWire Locking | 
 | ================= | 
 |  | 
 | This document explains locking mechanism of the SoundWire Bus. Bus uses | 
 | following locks in order to avoid race conditions in Bus operations on | 
 | shared resources. | 
 |  | 
 |   - Bus lock | 
 |  | 
 |   - Message lock | 
 |  | 
 | Bus lock | 
 | ======== | 
 |  | 
 | SoundWire Bus lock is a mutex and is part of Bus data structure | 
 | (sdw_bus) which is used for every Bus instance. This lock is used to | 
 | serialize each of the following operations(s) within SoundWire Bus instance. | 
 |  | 
 |   - Addition and removal of Slave(s), changing Slave status. | 
 |  | 
 |   - Prepare, Enable, Disable and De-prepare stream operations. | 
 |  | 
 |   - Access of Stream data structure. | 
 |  | 
 | Message lock | 
 | ============ | 
 |  | 
 | SoundWire message transfer lock. This mutex is part of | 
 | Bus data structure (sdw_bus). This lock is used to serialize the message | 
 | transfers (read/write) within a SoundWire Bus instance. | 
 |  | 
 | Below examples show how locks are acquired. | 
 |  | 
 | Example 1 | 
 | --------- | 
 |  | 
 | Message transfer. | 
 |  | 
 |   1. For every message transfer | 
 |  | 
 |      a. Acquire Message lock. | 
 |  | 
 |      b. Transfer message (Read/Write) to Slave1 or broadcast message on | 
 |         Bus in case of bank switch. | 
 |  | 
 |      c. Release Message lock :: | 
 |  | 
 | 	+----------+                    +---------+ | 
 | 	|          |                    |         | | 
 | 	|   Bus    |                    | Master  | | 
 | 	|          |                    | Driver  | | 
 | 	|          |                    |         | | 
 | 	+----+-----+                    +----+----+ | 
 | 	     |                               | | 
 | 	     |     bus->ops->xfer_msg()      | | 
 | 	     <-------------------------------+   a. Acquire Message lock | 
 | 	     |                               |   b. Transfer message | 
 | 	     |                               | | 
 | 	     +------------------------------->   c. Release Message lock | 
 | 	     |    return success/error       |   d. Return success/error | 
 | 	     |                               | | 
 | 	     +                               + | 
 |  | 
 | Example 2 | 
 | --------- | 
 |  | 
 | Prepare operation. | 
 |  | 
 |   1. Acquire lock for Bus instance associated with Master 1. | 
 |  | 
 |   2. For every message transfer in Prepare operation | 
 |  | 
 |      a. Acquire Message lock. | 
 |  | 
 |      b. Transfer message (Read/Write) to Slave1 or broadcast message on | 
 |         Bus in case of bank switch. | 
 |  | 
 |      c. Release Message lock. | 
 |  | 
 |   3. Release lock for Bus instance associated with Master 1 :: | 
 |  | 
 | 	+----------+                    +---------+ | 
 | 	|          |                    |         | | 
 | 	|   Bus    |                    | Master  | | 
 | 	|          |                    | Driver  | | 
 | 	|          |                    |         | | 
 | 	+----+-----+                    +----+----+ | 
 | 	     |                               | | 
 | 	     |    sdw_prepare_stream()       | | 
 | 	     <-------------------------------+   1. Acquire bus lock | 
 | 	     |                               |   2. Perform stream prepare | 
 | 	     |                               | | 
 | 	     |                               | | 
 | 	     |     bus->ops->xfer_msg()      | | 
 | 	     <-------------------------------+   a. Acquire Message lock | 
 | 	     |                               |   b. Transfer message | 
 | 	     |                               | | 
 | 	     +------------------------------->   c. Release Message lock | 
 | 	     |    return success/error       |   d. Return success/error | 
 | 	     |                               | | 
 | 	     |                               | | 
 | 	     |    return success/error       |   3. Release bus lock | 
 | 	     +------------------------------->   4. Return success/error | 
 | 	     |                               | | 
 | 	     +                               + |