2018-04-26 20:08:02 +07:00
|
|
|
=================
|
|
|
|
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.
|
|
|
|
|
2019-06-04 21:17:47 +07:00
|
|
|
c. Release Message lock
|
|
|
|
|
|
|
|
::
|
2018-04-26 20:08:02 +07:00
|
|
|
|
|
|
|
+----------+ +---------+
|
|
|
|
| | | |
|
|
|
|
| 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
|
|
|
|
| |
|
|
|
|
+ +
|