xref: /linux/Documentation/driver-api/soundwire/locking.rst (revision b7019ac550eb3916f34d79db583e9b7ea2524afa)
1=================
2SoundWire Locking
3=================
4
5This document explains locking mechanism of the SoundWire Bus. Bus uses
6following locks in order to avoid race conditions in Bus operations on
7shared resources.
8
9  - Bus lock
10
11  - Message lock
12
13Bus lock
14========
15
16SoundWire Bus lock is a mutex and is part of Bus data structure
17(sdw_bus) which is used for every Bus instance. This lock is used to
18serialize each of the following operations(s) within SoundWire Bus instance.
19
20  - Addition and removal of Slave(s), changing Slave status.
21
22  - Prepare, Enable, Disable and De-prepare stream operations.
23
24  - Access of Stream data structure.
25
26Message lock
27============
28
29SoundWire message transfer lock. This mutex is part of
30Bus data structure (sdw_bus). This lock is used to serialize the message
31transfers (read/write) within a SoundWire Bus instance.
32
33Below examples show how locks are acquired.
34
35Example 1
36---------
37
38Message transfer.
39
40  1. For every message transfer
41
42     a. Acquire Message lock.
43
44     b. Transfer message (Read/Write) to Slave1 or broadcast message on
45        Bus in case of bank switch.
46
47     c. Release Message lock ::
48
49	+----------+                    +---------+
50	|          |                    |         |
51	|   Bus    |                    | Master  |
52	|          |                    | Driver  |
53	|          |                    |         |
54	+----+-----+                    +----+----+
55	     |                               |
56	     |     bus->ops->xfer_msg()      |
57	     <-------------------------------+   a. Acquire Message lock
58	     |                               |   b. Transfer message
59	     |                               |
60	     +------------------------------->   c. Release Message lock
61	     |    return success/error       |   d. Return success/error
62	     |                               |
63	     +                               +
64
65Example 2
66---------
67
68Prepare operation.
69
70  1. Acquire lock for Bus instance associated with Master 1.
71
72  2. For every message transfer in Prepare operation
73
74     a. Acquire Message lock.
75
76     b. Transfer message (Read/Write) to Slave1 or broadcast message on
77        Bus in case of bank switch.
78
79     c. Release Message lock.
80
81  3. Release lock for Bus instance associated with Master 1 ::
82
83	+----------+                    +---------+
84	|          |                    |         |
85	|   Bus    |                    | Master  |
86	|          |                    | Driver  |
87	|          |                    |         |
88	+----+-----+                    +----+----+
89	     |                               |
90	     |    sdw_prepare_stream()       |
91	     <-------------------------------+   1. Acquire bus lock
92	     |                               |   2. Perform stream prepare
93	     |                               |
94	     |                               |
95	     |     bus->ops->xfer_msg()      |
96	     <-------------------------------+   a. Acquire Message lock
97	     |                               |   b. Transfer message
98	     |                               |
99	     +------------------------------->   c. Release Message lock
100	     |    return success/error       |   d. Return success/error
101	     |                               |
102	     |                               |
103	     |    return success/error       |   3. Release bus lock
104	     +------------------------------->   4. Return success/error
105	     |                               |
106	     +                               +
107