SoundWire 锁定

本文档解释了 SoundWire 总线的锁定机制。总线使用以下锁以避免在共享资源上的总线操作中出现竞争条件。

  • 总线锁

  • 消息锁

总线锁

SoundWire 总线锁是一个互斥锁,并且是每个总线实例使用的总线数据结构 (sdw_bus) 的一部分。此锁用于序列化 SoundWire 总线实例中的以下每个操作。

  • 添加和删除从设备,更改从设备状态。

  • 准备、启用、禁用和取消准备流操作。

  • 访问流数据结构。

消息锁

SoundWire 消息传输锁。此互斥锁是总线数据结构 (sdw_bus) 的一部分。此锁用于序列化 SoundWire 总线实例中的消息传输(读取/写入)。

以下示例显示了如何获取锁。

示例 1

消息传输。

  1. 对于每个消息传输

    1. 获取消息锁。

    2. 将消息(读取/写入)传输到从设备 1 或在发生组切换时在总线上广播消息。

    3. 释放消息锁

    +----------+                    +---------+
    |          |                    |         |
    |   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
         |                               |
         +                               +
    

示例 2

准备操作。

  1. 获取与主设备 1 关联的总线实例的锁。

  2. 对于准备操作中的每个消息传输

    1. 获取消息锁。

    2. 将消息(读取/写入)传输到从设备 1 或在发生组切换时在总线上广播消息。

    3. 释放消息锁。

  3. 释放与主设备 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
         |                               |
         +                               +