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.
For every message transfer
- Acquire Message lock.
- Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch.
- 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.
Acquire lock for Bus instance associated with Master 1.
For every message transfer in Prepare operation
- Acquire Message lock.
- Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch.
- Release Message lock.
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 | | + +