Linux kernel [通用时钟框架]:如果多路复用时钟的父时钟无法设置,如何设置多路复用时钟的速率?

Linux kernel [通用时钟框架]:如果多路复用时钟的父时钟无法设置,如何设置多路复用时钟的速率?,linux-kernel,arm,linux-device-driver,clock,Linux Kernel,Arm,Linux Device Driver,Clock,正在学习并对多路混音时钟有疑问 如果我们想要设置一个多工时钟的特定速率,而该时钟的当前父时钟无法设置所需速率(父时钟的速率较小) 那么,是否有任何功能或机制可以自动切换时钟的父级(从其父级列表)并设置期望速率 一种可能的解决方案是,我们可以手动调用set\u parent(),然后调用set\u rate(),它可以设置期望速率。但是,如果我们只调用set_rate(),它会自动切换时钟的父时钟并设置所需的速率,那该怎么办呢。因此,拥有一个时钟频率较低的父时钟并不意味着自动尝试增加父时钟是最好的

正在学习并对
多路混音
时钟有疑问

如果我们想要设置一个
多工
时钟的特定速率,而该时钟的当前父时钟无法设置所需速率(父时钟的速率较小)

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

一种可能的解决方案是,我们可以手动调用
set\u parent()
,然后调用
set\u rate()
,它可以设置期望速率。但是,如果我们只调用
set_rate()
,它会自动切换时钟的父时钟并设置所需的速率,那该怎么办呢。因此,拥有一个时钟频率较低的父时钟并不意味着自动尝试增加父时钟是最好的解决方案。CCF旨在允许多个驱动程序/子系统访问共享资源。CCF并不试图智能化,因为不同的时钟树的行为方式一般很难知道

一种可能的解决方案是,我们可以手动调用
set\u parent()
,然后调用
set\u rate()
,它可以设置期望速率

我想你的意思是调用
get\u parent()
,然后使用
set\u rate
?有时,调用
set\u parent()
并不容易,因为它可能是固定的。您需要阅读SOC文档。在某些情况下,有多个输入时钟可用。也就是说,真正的时钟层次结构不是树而是DAG,尽管活动的层次结构是树状的

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

这可能对您正在查看的SOC时钟有意义,但不是一般意义上的。可能有几十个时钟依赖于一个父母,可能会重新给祖父母评分,等等。重新给系统时钟评分可能不是最好的选择,因为音频驱动器想要一个输出几赫兹的时钟

可以编写时钟驱动程序,以便在对不起作用的子级发出请求时,它将重新对父级进行评级。然而,这是时钟驱动程序的一部分,而不是CCF


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

  • 专用48000khz
  • 一些低速总线时钟(平台通用)
  • USB时钟
  • 选项1是具有最高功耗的最佳音质。选项2是通用的,但可能无法很好地匹配声速,从而产生次优DAC/波/声音。选项三可能适用于某种类型的USB声音从设备,但如果您不使用USB,则耗电可能会很昂贵

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


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


    参考:.

    在最新版本的内核(v=3.18)中,找到了api
    \uu clk\u mux\u determine\u rate()
    ,这有助于找到提供给定频率的最佳父级。这可以直接用作确定速率回调(例如,对于mux),也可以从可能将mux与其他操作相结合的更复杂时钟中使用。