如何在linux内核设备树中定义时钟多路复用器

时间:2015-03-19 19:33:29

标签: linux-kernel linux-device-driver clock gpio device-tree

我正在编写Linux设备驱动程序,需要在设备树文件中定义以下时钟树:

linux, common clock framework, clock tree

注意:在多路复用器中选择振荡器是通过将 gpio 输出拉高或拉低来完成的。时钟发生器通过I2C编程。

以下是我到目前为止的一个例子:

clocks {
    /* fixed clock oscillators */
    osc22: oscillator22 {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        clock-frequency = <22579200>;
    };

    osc24: oscillator24 {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        clock-frequency = <24576000>;
    };

    /* clock multiplexer
     * I'm afraid the following is not going to work :( ?
     */
    mux: multiplexer {
        compatible = "mux-clock";     /* <-------- ??? */
        clocks = <&osc22>, <&osc24>;  /* parent clocks */
    };
};

i2c1 {
    /* clock generator */
    si5351: si5351c@60 {
        #address-cells = <1>;
        #size-cells = <0>;
        #clock-cells = <1>;
        compatible = "silabs,si5351c";
        reg = <0x60>;
        clocks = <0>, <&mux>;
        clock-names = "xtal", "clkin";
        status = "okay";

        clkout0 {
            reg = <0>;
            silabs,disable-state = <2>;
            silabs,clock-source = <3>;
        };
    };
};

参考

如何在设备树中定义简单的 gpio控制的时钟多路复用器?

4 个答案:

答案 0 :(得分:1)

您不需要为时钟复用提供设备树支持的简单答案。我可以看到的想法是提供时钟驱动程序可用于选择父时钟的API。

如果您可以看到Silicon Labs si5351c驱动程序(drivers/clk/clk-si5351.c)的代码,则它具有设备树支持。 Documentation/devicetree/bindings/clock/silabs,si5351.txt详细描述了允许的字段。我想你必须根据需要定义尽可能多的clkin

答案 1 :(得分:1)

当前内核不支持这一点。你必须编写自己的内核模块。

答案 2 :(得分:1)

多路复用器可用于选择其中一个父时钟:osc22或osc24。 但是你需要为属性编写自己的绑定&#34; mux-clock&#34;在你的司机。

我不知道以下链接是否可以直接帮助您,但请看一下: https://www.kernel.org/doc/Documentation/devicetree/bindings/clock/ti/mux.txt

上面的链接定义了在DT

中使用的mux绑定

这里的mux绑定&#34; ti,mux-clock&#34;根据常见的clk框架在驱动程序中定义: http://lxr.free-electrons.com/source/drivers/clk/ti/mux.c

可能您可以了解如何实现绑定。

答案 3 :(得分:1)

正如@ h3n正确指出的那样,在提出这个问题时,内核没有为gpio控制的时钟多路复用器提供支持。 所以,我不得不为这些设备添加一个通用的时钟驱动程序。

此驱动程序(drivers/clk/clk-gpio.c)位于4.3-rc1之后的主线中。

上述用例的设备树绑定可能如下所示:

clocks {
    /* fixed clock oscillators */
    osc22: oscillator22 {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        clock-frequency = <22579200>;
    };

    osc24: oscillator24 {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        clock-frequency = <24576000>;
    };

    /* gpio-controlled clock multiplexer */
    mux: multiplexer {
        compatible = "gpio-mux-clock";
        clocks = <&osc22>, <&osc24>;  /* parent clocks */
        #clock-cells = <0>;
        select-gpios = <&gpio 42 GPIO_ACTIVE_HIGH>;
    };
};