SoundWire 锁定¶
本文档解释了 SoundWire 总线的锁定机制。总线使用以下锁来避免在共享资源的总线操作中出现竞争情况。
总线锁
消息锁
总线锁¶
SoundWire 总线锁是一个互斥锁,并且是总线数据结构 (sdw_bus) 的一部分,该结构用于每个总线实例。此锁用于序列化 SoundWire 总线实例中的以下每个操作:
添加和删除从设备,更改从设备状态。
准备、启用、禁用和取消准备流操作。
访问流数据结构。
消息锁¶
SoundWire 消息传输锁。 此互斥锁是总线数据结构 (sdw_bus) 的一部分。 此锁用于序列化 SoundWire 总线实例中的消息传输(读取/写入)。
以下示例显示了如何获取锁。
示例 1¶
消息传输。
对于每个消息传输
获取消息锁。
将消息(读取/写入)传输到 Slave1 或在 bank switch 的情况下在总线上广播消息。
释放消息锁
+----------+ +---------+ | | | | | 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¶
准备操作。
获取与 Master 1 关联的总线实例的锁。
对于准备操作中的每个消息传输
获取消息锁。
将消息(读取/写入)传输到 Slave1 或在 bank switch 的情况下在总线上广播消息。
释放消息锁。
释放与 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 | | + +