| ================= | 
| 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 | 
|          |                               | | 
|          +                               + |