DTS: clock not found
Hi, I'm stuck with dts problem. Whenever I try to find a clock for my device, the of_get_clk returns an error "Kernel panic - not syncing: Can't get timer clock" My DTS looks like this (reduced to relevant parts for easier reading): #include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/interrupt-controller/arm-gic.h> #include "skeleton.dtsi" / { [...] soc { #address-cells = <1>; #size-cells = <1>; compatible = "simple-bus"; ranges; gic: interrupt-controller@10212000 { compatible = "arm,cortex-a9-gic"; interrupt-controller; #interrupt-cells = <3>; reg = <0x10211000 0x1000>, <0x10212000 0x1000>; }; osc: oscillator { compatible = "fixed-clock"; #clock-cells = <1>; clock-frequency = <15000000>; clock-output-names = "osc"; }; timer: timer-mysoc { compatible = "mysoc,mysoc-timer"; reg = <0x10008000 0x30>; interrupts = <GIC_SPI 113 IRQ_TYPE_EDGE_RISING>; clocks = <&osc 0>; clock-names = "system15m"; }; }; }; my /drivers/clocksource/mysoc-timer.c looks like this (reduced to relevant parts for easier reading): [...] static void __init mysoc_timer_init(struct device_node *node) { unsigned long rate = 0; struct clk *clk; int ret, irq; u32 val; gpt_base = of_iomap(node, 0); if (!gpt_base) panic("Can't map registers"); irq = irq_of_parse_and_map(node, 0); if (irq <= 0) panic("Can't parse IRQ"); clk = of_clk_get(node, 0); if (IS_ERR(clk)) panic("Can't get timer clock"); clk_prepare_enable(clk); rate = clk_get_rate(clk); } CLOCKSOURCE_OF_DECLARE(mtk_mt6589, "mysoc,mysoc-timer", mysoc_timer_init); What I'm missing? I seems as if the clock "osc" is not found in the device tree. Any idea why. Building the DTB works without errors, but I suppose that doesn't mean too much anyway. Cheers, Matthias -- motzblog.wordpress.com
Hello Matthias, On Wed, Feb 5, 2014 at 6:02 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote:
Hi,
I'm stuck with dts problem. Whenever I try to find a clock for my device, the of_get_clk returns an error "Kernel panic - not syncing: Can't get timer clock"
My DTS looks like this (reduced to relevant parts for easier reading):
Could you give more details about your platform? I would take a look to Documentation/devicetree/bindings/clock/<your platform>-clock.txt to be sure that you are using the bindings correctly.
#include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/interrupt-controller/arm-gic.h> #include "skeleton.dtsi"
/ {
[...]
soc { #address-cells = <1>; #size-cells = <1>; compatible = "simple-bus"; ranges;
gic: interrupt-controller@10212000 { compatible = "arm,cortex-a9-gic"; interrupt-controller; #interrupt-cells = <3>; reg = <0x10211000 0x1000>, <0x10212000 0x1000>; };
osc: oscillator { compatible = "fixed-clock"; #clock-cells = <1>;
Looking at Documentation/devicetree/bindings/clock/fixed-clock.txt it says: #clock-cells : from common clock binding; shall be set to 0 while your are setting your clock-cells to 1.
clock-frequency = <15000000>; clock-output-names = "osc"; };
timer: timer-mysoc { compatible = "mysoc,mysoc-timer"; reg = <0x10008000 0x30>; interrupts = <GIC_SPI 113 IRQ_TYPE_EDGE_RISING>; clocks = <&osc 0>; clock-names = "system15m"; }; };
Documentation/devicetree/bindings/clock/clock-bindings.txt also says: ==Clock consumers== Required properties: clocks: List of phandle and clock specifier pairs, one pair for each clock input to the device. Note: if the clock provider specifies '0' for #clock-cells, then only the phandle portion of the pair will appear. So my educated guess is that you should use #clock-cells = <0>; your your clock provider device node and clocks = <&osc> on your clock consumer device node. By looking at DTS and DTSI that uses the fixed-clock binding I see that all platforms don't have their clocks providers device nodes under soc {} but on a separate clocks {} node. I didn't find on the clock-bindings.txt DT bindings documentation that this is a requirement so probably that is not issue in your case but still something to keep in mind.
};
my /drivers/clocksource/mysoc-timer.c looks like this (reduced to relevant parts for easier reading):
[...]
static void __init mysoc_timer_init(struct device_node *node) { unsigned long rate = 0; struct clk *clk; int ret, irq; u32 val;
gpt_base = of_iomap(node, 0); if (!gpt_base) panic("Can't map registers");
irq = irq_of_parse_and_map(node, 0); if (irq <= 0) panic("Can't parse IRQ");
clk = of_clk_get(node, 0); if (IS_ERR(clk)) panic("Can't get timer clock"); clk_prepare_enable(clk);
rate = clk_get_rate(clk);
} CLOCKSOURCE_OF_DECLARE(mtk_mt6589, "mysoc,mysoc-timer", mysoc_timer_init);
What I'm missing? I seems as if the clock "osc" is not found in the device tree. Any idea why. Building the DTB works without errors, but I suppose that doesn't mean too much anyway.
Cheers, Matthias
-- motzblog.wordpress.com
Hope it helps, Javier
participants (2)
-
Javier Martinez Canillas -
Matthias Brugger