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