【问题标题】:[Common Clock Framework]: How to set rate of a muxed clock if its parent clock unable to set?[公共时钟框架]:如果父时钟无法设置,如何设置复用时钟的速率?
【发布时间】:2023-03-04 11:10:01
【问题描述】:

学习Common Clock Framework,对muxed时钟有疑问。

如果我们想设置 muxed 时钟的特定速率,而时钟的当前父级无法设置所需的速率(父级的速率较小)。

那么,是否有任何功能或机制可以自动切换时钟的父级(从其父级列表中)并设置期望速率?

一种可能的解决方案,我们可以手动调用set_parent(),然后调用set_rate(),可以设置欲望率。但是,如果我们只调用set_rate(),它会自动切换时钟的父级并设置所需的速率。

【问题讨论】:

    标签: linux-kernel arm linux-device-driver clock


    【解决方案1】:

    某些时钟可能放大使用PLL 的计时器。因此,拥有较低时钟的父母并不意味着自动尝试增加父母时钟是最好的解决方案。 Common clock framework (CCF) 旨在允许多个驱动程序/子系统访问共享资源。 CCF 不会尝试变得智能,因为不同的时钟树的行为方式很难通用。

    一种可能的解决方案,我们可以手动调用set_parent(),然后调用set_rate(),可以设置欲望率。

    我想你的意思是打电话给get_parent(),然后使用set_rate?有时,调用set_parent() 并不容易,因为它可能已修复。您需要阅读 SOC 文档。在某些情况下,有多个输入时钟可用。即,真正的时钟层次结构不是树而是 DAG,虽然 active 层次结构是树状的。

    但是,如果我们只调用 set_rate(),它会自动切换时钟的父级并设置所需的速率。

    这可能对您正在查看的 SOC 时钟有意义,但不是通用的。可能有几十个时钟依赖于父级,并且可能重新评估祖父母等。重新评估系统时钟可能不是最佳选择,因为音频驱动程序需要一个时钟差几赫兹?

    可以编写时钟驱动程序,以便在对不起作用的子节点发出请求时,它会重新评估父节点。但是,这是时钟驱动程序的一部分,通常不是 CCF


    示例

    例如,一个 SOC 可能有一个带有三个输入源的音频时钟,

    1. 专用48000khz
    2. 一些低速总线时钟(平台通用)
    3. USB 时钟

    选项 1 是功耗最高的最佳音质。选项 2 是通用的,但可能无法很好地匹配声音速率,从而导致次优 DAC/波形/声音生成。选项三可能适用于某种 USB 声音从属设备,但如果您不使用 USB,这可能会耗电。

    在上述情况下,set_parent() 可能是一种获得所需速率的方法,如果 SOC 时钟驱动程序支持的话。


    CCF 中没有智能; 时钟驱动程序中是否有一些灵活性,但这取决于时钟硬件。程序员需要阅读 SOC 文档并确定配置时钟树的最佳方式。可能您还应该检查您的 SOC 和 Linux 版本的时钟驱动程序,看看它支持什么。您不能一般地更改驱动程序中父母的时钟频率,因为其他设备可能依赖于它们。如果您需要对 SOC 系列中的特定 SOC 使用此功能,则需要通过检查设备树来查看驱动程序正在哪个 SOC 上运行来对其进行特殊处理。在这种情况下,您可以将get_parent()set_rate() 用于特定的SOC。

    参考:A question on older Linux clock structure

    【讨论】:

    • 在最新版本的内核 (v=3.18) 中,找到了 api __clk_mux_determine_rate(),它有助于找到最好的父节点以提供给定的频率。这可以直接用作确定速率回调(例如,用于多路复用器),或者来自可以将多路复用器与其他操作结合的更复杂的时钟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多