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