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

    1. Acquire Message lock.

    2. Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch.

    3. 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

    1. Acquire Message lock.
    2. Transfer message (Read/Write) to Slave1 or broadcast message on Bus in case of bank switch.
    3. 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
         |                               |
         +                               +