[PATCH v11 01/10] clk: Add RISC-V Canaan Kendryte K210 clock driver
Damien Le Moal
Damien.LeMoal at wdc.com
Wed Jan 13 22:15:53 EST 2021
On Wed, 2021-01-13 at 17:47 -0800, Stephen Boyd wrote:
> Quoting Damien Le Moal (2021-01-13 17:12:06)
> > On Wed, 2021-01-13 at 12:52 -0800, Stephen Boyd wrote:
> > > Quoting Damien Le Moal (2021-01-13 03:29:36)
> > > > On Wed, 2021-01-13 at 00:25 -0800, Stephen Boyd wrote:
> > > > > Quoting Damien Le Moal (2021-01-11 17:02:38)
> > > > > > +
> > > > > > + /* Get the system base fixed-rate 26MHz oscillator clock */
> > > > > > + in0 = of_clk_get(np, 0);
> > > > > > + if (IS_ERR(in0)) {
> > > > > > + pr_err("%pOFP: failed to get base fixed-rate oscillator\n", np);
> > > > > > + return;
> > > > > > + }
> > > > > > + kcl->parents[K210_PARENT_IN0] = __clk_get_hw(in0);
> > > > >
> > > > > This shouldn't be necessary. Specify the DT node index in the
> > > > > parent_data structure instead.
> > > >
> > > > OK. I understood what you mean here. However, IN0 is not created by this
> > > > driver. It has its own fixed-oscillator DT node that creates the clock. So a
> > > > different provider. Hence I think we cannot use an index into clk_data->hws,
> > > > unless I am not understanding something.
> > > >
> > >
> > > Can you use clk_parent_data::index?
> >
> > Not for the base oscillator "in0" as that clock is created through the device
> > tree (it has its own fixed-clock node) and so is not provided by this driver.
> >
> > But I can use parent_data::hw. That works.
> > So I ended up rewriting all parents setup using the clk_parent_data struct to
> > define all clocks parents using the parent_data::hw field. That removes the
> > need for the parents array that I had.
>
> The driver should not be calling of_clk_get(). It should register clks
> with a device node or a device that has a DT binding with a clocks
> property and then the index and/or fw_name can indicate what that fixed
> clock node is.
>
> In DT:
>
> this_files_associated_device_node {
> clocks = <&phandle_to_fixed_clock_node>;
> };
>
> And then clk_parent_data::index == 0 to indicate that it should use that
> clk. If the clk_hw is registered by this driver then using clk_hw is
> appropriate, but otherwise we shouldn't need to get the hw pointer for
> any clk that is created outside of this file.
I cannot get this to work. The sysclk node has "clocks = <&in0>;" has the sole
input/parent clock. But using clk_parent_data::index = 0 to specify in0 as a
parent clock for the clocks registered by the k210-clk driver does not work (no
boot). However, if I use
clk_parent_data::name = of_clk_get_parent_name(np, 0)
where np is the device node for the sysclk driver, things work.
Looking at clk_core_fill_parent_index() and clk_core_get(), using index should
work. Not sure what I am doing wrong here. Digging...
--
Damien Le Moal
Western Digital
More information about the linux-riscv
mailing list