Exynos4412的Linux5.4.174时钟驱动开发(五)——时钟设备树的修改方法

系列文章目录

Exynos4412的Linux时钟驱动开发(一)——Exynos4412的时钟管理单元CMU

Exynos4412的Linux时钟驱动开发(二)——时钟驱动的初始化(CLK_OF_DECLARE的机制)

Exynos4412的Linux时钟驱动开发(三)——Common Clock Framework(CCF)简介

Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法

Exynos4412的Linux5.4.174时钟驱动开发(五)——时钟设备树的修改方法



Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法这篇博文中,我们了解到关于时钟有2种设备:第一种是时钟提供者,例如晶振、PLL;第二种是时钟使用者,例如串口、pwm、adc等。这两种设备的设备树的属性是不一样的。

一、时钟提供者(clock provider)的设备树

示例:

    /* 外部晶振(external oscillator)*/
    osc: oscillator {
        compatible = "fixed-clock";
        #clock-cells = <1>;
        clock-frequency  = <32678>;
        clock-output-names = "osc";
    };

    /* PLL device, 产生高频率clock
     * 其输入时钟是外部晶振(external oscillator)*/
    pll: pll@4c000 {
        compatible = "vendor,some-pll-interface"
        #clock-cells = <1>;
        clocks = <&osc 0>;
        clock-names = "ref";
        reg = <0x4c000 0x1000>;
        clock-output-names = "pll", "pll-switched";
    };
  1. compatible属性
    匹配compatible属性,调用时钟初始化函数,就能够构建clk_hw结构体,并把该节点添加到of_clk_provider的list链表中。

  2. #clock-cells属性:
    时钟提供者(clock provider)的node节点必须#clock-cells属性,说明该节点是clock provider。它有2种取值:
    #clock-cells = <0>,只有一个时钟输出
    #clock-cells = <1>,有多个时钟输出

  3. reg属性
    时钟控制寄存器的物理首地址。

  4. clock-output-names、clock-indices、Protected clocks属性
    请参考以下文献,第①个博文较好地翻译了第②个帮助文档:
    clock bindings
    Documentation/devicetree/bindings/clock/clock-bindings.txt

可以看出,示例中的pll: pll@4c000既是时钟使用者,也是时钟生产者。

二、时钟使用者(clock consumer)的设备树

示例:

    uart@a000 {
        compatible = "fsl,imx-uart";
        reg = <0xa000 0x1000>;
        ...
        clocks = <&osc 0>, <&pll 1>;
        clock-names = "baud", "register";

        assigned-clocks = <&clkcon 0>, <&pll 2>;
        assigned-clock-parents = <&pll 2>;
        assigned-clock-rates = <0>, <460800>;
    };
  1. compatible属性
    根据compatible匹配probe函数,调用devm_clk_get()函数根据clock-names来查找并获取对时钟生产者的引用,获取时钟生产者的clk结构体。
  2. clocks属性:
    时钟使用者(clock consumer)的node节点必须clocks属性,说明该节点是clock consumer。
    clocks属性由2部分组成:phandle、clock-specifier。
	clocks = <phandle clock-specifier>

– phandle是@节点名称(例如上个示例中的@osc、@pll)。
– clock-specifier怎么理解呢?一个时钟控制器可以控制很多时钟硬件(例如5种基本时钟:fixed-rate、fixed-factor、gate、mux、divider),每种时钟硬件都有对应的ID号。clock-specifier就是这个ID号。例如,Exynos4412的时钟硬件编号已经在include/dt-bindings/clock/exynos4.h中声明了。

另外,注意:如果时钟提供者将#clock-cells指定为“ 0”,则仅会出现该对中的phandle部分。

  1. reg属性
    时钟使用者寄存器的物理首地址。

  2. clock-names、clock-ranges、Assigned clock parents and rates属性
    请参考以下文献,第①个博文较好地翻译了第②个帮助文档:
    clock bindings
    Documentation/devicetree/bindings/clock/clock-bindings.txt

三、编写驱动代码

可以参看Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法最后的示例。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值