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