如何在 linux 内核设备树中定义时钟多路复用器
How to define a clock multiplexer in a linux kernel device tree
我正在编写 linux 设备驱动程序,需要在设备树文件中定义以下时钟树:
注意:选择多路复用器中的振荡器是通过将 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>;
};
};
};
参考文献:
- Clock Bindings
- Binding for simple fixed-rate clock sources
- Binding for Silicon Labs Si5351a/b/c programmable i2c clock generator
如何在设备树中定义简单的 gpio 控制的 时钟多路复用器?
简单的回答是您不需要为时钟复用提供设备树支持。据我所知,这个想法是提供 API 您的时钟驱动程序可以用来选择父时钟。
如果您可以查看 Silicon Labs si5351c 驱动程序 (drivers/clk/clk-si5351.c
) 的代码,它具有设备树支持。 Documentation/devicetree/bindings/clock/silabs,si5351.txt
对允许的字段有详细的描述。我想您必须根据需要定义尽可能多的 clkin
。
当前内核不支持。您必须编写自己的内核模块。
多路复用器可用于 select 父时钟之一:osc22 或 osc24。
但是您需要在驱动程序中为 属性 "mux-clock" 编写自己的绑定。
不知道下面的link能不能直接帮到你,看看吧:
https://www.kernel.org/doc/Documentation/devicetree/bindings/clock/ti/mux.txt
以上 link 定义了要在 DT
中使用的 mux 绑定
这里 mux 绑定 "ti,mux-clock" 是在驱动程序中根据通用 clk 框架定义的:
http://lxr.free-electrons.com/source/drivers/clk/ti/mux.c
也许您可以得出一些关于如何实现绑定的想法。
正如@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>;
};
};
我正在编写 linux 设备驱动程序,需要在设备树文件中定义以下时钟树:
注意:选择多路复用器中的振荡器是通过将 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>;
};
};
};
参考文献:
- Clock Bindings
- Binding for simple fixed-rate clock sources
- Binding for Silicon Labs Si5351a/b/c programmable i2c clock generator
如何在设备树中定义简单的 gpio 控制的 时钟多路复用器?
简单的回答是您不需要为时钟复用提供设备树支持。据我所知,这个想法是提供 API 您的时钟驱动程序可以用来选择父时钟。
如果您可以查看 Silicon Labs si5351c 驱动程序 (drivers/clk/clk-si5351.c
) 的代码,它具有设备树支持。 Documentation/devicetree/bindings/clock/silabs,si5351.txt
对允许的字段有详细的描述。我想您必须根据需要定义尽可能多的 clkin
。
当前内核不支持。您必须编写自己的内核模块。
多路复用器可用于 select 父时钟之一:osc22 或 osc24。 但是您需要在驱动程序中为 属性 "mux-clock" 编写自己的绑定。
不知道下面的link能不能直接帮到你,看看吧: https://www.kernel.org/doc/Documentation/devicetree/bindings/clock/ti/mux.txt
以上 link 定义了要在 DT
中使用的 mux 绑定这里 mux 绑定 "ti,mux-clock" 是在驱动程序中根据通用 clk 框架定义的: http://lxr.free-electrons.com/source/drivers/clk/ti/mux.c
也许您可以得出一些关于如何实现绑定的想法。
正如@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>;
};
};