时钟、复位与电源

设备树引用将 S31 外设连接到 Linux 的时钟、复位和电源域提供者。时钟树说明已注册的时钟关系,电源域说明各域的控制策略。

获取和释放驱动资源

通过提供者 API 获取设备绑定声明的资源。保留资源获取操作返回的错误,包括 -EPROBE_DEFER,使内核能在所需提供者就绪后重新尝试探测。

API

作用

devm_clk_get()

获取时钟引用,不会启用时钟

clk_prepare_enable()

准备并启用已获取的时钟

clk_get_rate()

读取用于计算外设时序的时钟频率

clk_disable_unprepare()

与成功的准备、启用操作配对

devm_reset_control_get_optional_exclusive()

获取可选复位控制;未提供可选控制时可能返回 NULL

reset_control_reset()

通过该控制请求一次复位脉冲

S31 I2C 的探测流程可作为具体示例:映射寄存器,获取并启用时钟,通过 devm_add_action_or_reset() 注册 clk_disable_unprepare() 清理操作,获取并触发可选复位,然后配置控制器并申请 IRQ。错误路径保留提供者的错误码。这是该控制器的顺序;其他设备应遵循自身绑定与硬件要求。参见 I2C 探测与清理。

释放时钟或缓冲区前,应停止设备传输与中断活动。DMA 清理还要求同步完成,见 DMA 与缓存一致性。客户端驱动不应绕过提供者,直接写入时钟或 PMU 寄存器。

查看提供者状态

for file in /sys/bus/platform/devices/*/clocks; do
    [ -r "$file" ] && cat "$file"
done
for file in /sys/bus/platform/devices/*/domains; do
    [ -r "$file" ] && cat "$file"
done

clocks 的每一行包含以下字段:

字段

含义

开头的整数

S31 时钟绑定中的时钟 ID

名称

注册到 CCF 的时钟名称

state=on / state=off

clk_hw_is_prepared() 的结果,即 CCF 准备状态

critical=0 / critical=1

CCF 是否将该时钟标记为关键时钟

rate=

提供者报告的频率,单位为 Hz

state=on 不是对实际电气时钟信号的独立回读,也不能证明外设已正常工作。应结合频率、探测日志和设备状态解释该字段。具体输出格式见 clocks_show()。

domains 输出分别列出策略、软件状态和强制控制寄存器设置;见字段定义。CPU 频率与系统睡眠控制见电源管理。