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