Link: https://lore.kernel.org/r/20260217200002.683975158@linuxfoundation.org Tested-by: Florian Fainelli <florian.fainelli@broadcom.com> Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com> Tested-by: Peter Schneider <pschneider1968@googlemail.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Tested-by: Salvatore Bonaccorso <carnil@debian.org> Tested-by: Brett A C Sheffield <bacs@librecast.net> Tested-by: Mark Brown <broonie@kernel.org> Tested-by: Luna Jernberg <droidbittin@gmail.com> Tested-by: Ronald Warsow <rwarsow@gmx.de> Tested-by: Justin M. Forbes <jforbes@fedoraproject.org> Tested-by: Ron Economos <re@w6rz.net> Tested-by: Miguel Ojeda <ojeda@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
109 lines
3.4 KiB
ReStructuredText
109 lines
3.4 KiB
ReStructuredText
=================
|
|
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
|
|
| |
|
|
+ +
|