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