DTS: clock not found

Javier Martinez Canillas martinez.javier at gmail.com
Thu Feb 6 07:56:25 EST 2014


Hello Matthias,

On Wed, Feb 5, 2014 at 6:02 PM, Matthias Brugger <matthias.bgg at 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 at 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



More information about the Kernelnewbies mailing list