[PATCH v3 2/2] cpufreq: qoriq: Don't look at clock implementation details
Michael Turquette
mturquette at baylibre.com
Fri Jul 8 12:26:16 AEST 2016
Quoting Scott Wood (2016-07-06 21:13:23)
> On Wed, 2016-07-06 at 18:30 -0700, Michael Turquette wrote:
> > Quoting Scott Wood (2016-06-15 23:21:25)
> > >
> > > -static struct device_node *cpu_to_clk_node(int cpu)
> > > +static struct clk *cpu_to_clk(int cpu)
> > > {
> > > - struct device_node *np, *clk_np;
> > > + struct device_node *np;
> > > + struct clk *clk;
> > >
> > > if (!cpu_present(cpu))
> > > return NULL;
> > > @@ -112,37 +80,28 @@ static struct device_node *cpu_to_clk_node(int cpu)
> > > if (!np)
> > > return NULL;
> > >
> > > - clk_np = of_parse_phandle(np, "clocks", 0);
> > > - if (!clk_np)
> > > - return NULL;
> > > -
> > > + clk = of_clk_get(np, 0);
> > Why not use devm_clk_get here?
>
> devm_clk_get() is a wrapper around clk_get() which is not the same as
> of_clk_get(). What device would you pass to devm_clk_get(), and what name
> would you pass?
I'm fuzzy on whether or not you get a struct device from a cpufreq
driver. If so, then that would be the one to use. I would hope that
cpufreq drivers model cpus as devices, but I'm really not sure without
looking into the code.
Regards,
Mike
>
> > >
> > > @@ -221,17 +180,12 @@ static int qoriq_cpufreq_cpu_init(struct
> > > cpufreq_policy *policy)
> > > goto err_nomem2;
> > > }
> > >
> > > - pnode = of_parse_phandle(np, "clocks", 0);
> > > - if (!pnode) {
> > > - pr_err("%s: could not get clock information\n", __func__);
> > > - goto err_nomem2;
> > > - }
> > > + count = clk_get_num_parents(policy->clk);
> > We already have of_clk_get_parent_count. This is found in
> > clk-provider.h, which doesn't fit perfectly here since the cpufreq
> > driver is not a clock provider, but instead a consumer.
>
> It's also a device tree function, and the clock parents in question aren't in
> the device tree.
>
> > > @@ -240,23 +194,11 @@ static int qoriq_cpufreq_cpu_init(struct
> > > cpufreq_policy *policy)
> > > goto err_pclk;
> > > }
> > >
> > > - if (fmask)
> > > - mask = fmask[get_cpu_physical_id(cpu)];
> > > - else
> > > - mask = 0x0;
> > > -
> > > for (i = 0; i < count; i++) {
> > > - clk = of_clk_get(pnode, i);
> > > + clk = clk_get_parent_by_index(policy->clk, i);
> > > data->pclk[i] = clk;
> > > freq = clk_get_rate(clk);
> > > - /*
> > > - * the clock is valid if its frequency is not masked
> > > - * and large than minimum allowed frequency.
> > > - */
> > > - if (freq < min_cpufreq || (mask & (1 << i)))
> > > - table[i].frequency = CPUFREQ_ENTRY_INVALID;
> > > - else
> > > - table[i].frequency = freq / 1000;
> > > + table[i].frequency = freq / 1000;
> > Hmm, so you change cpu clock rate by selecting different clock sources
> > from a cpu clock mux, right?
>
> Yes. You'd think such a simple thing would be more straightforward.
>
> > I wonder if you can just have a child mux
> > clock that selects parents from .set_rate (via a .determine_rate
> > callback)? Then you could just call clk_set_rate() on your cpu mux clock
> > and maybe skip most of the stuff this driver does?
>
> "Most of the stuff this driver does" is dealing with the cpufreq subsystem
> (ask the cpufreq maintainers why it requires so much boilerplate), associating
> clock muxes with cpus, etc. It is also not obvious to me how to use
> determine_rate() or that the end result would be any simpler or better. It
> seems like the implementation would just be reimplementing logic that already
> exists in cpufreq, and the cpufreq driver would still need to be able to get a
> list of possible frequencies, because cpufreq wants a table of them.
>
> After nearly a year of non-response to these patches[1], a request to
> completely rearchitect this driver[2] just to avoid exposing a couple
> straightforward informational functions to clock consumers[3] was not quite
> what I was hoping for. What is wrong with clock consumers being able to query
> the parent list, given that clock consumers have the ability to request a
> particular parent?
>
> -Scott
>
> [1] Original versions:
> http://www.spinics.net/lists/linux-clk/msg03069.html
> http://www.spinics.net/lists/linux-clk/msg03070.html
>
>
> [2] The only reason I'm touching this driver at all is because it currently
> makes bad assumptions about clock provider internals (and clock provider
> device tree structure) that are broken by the new bindings enabled by
> commit 0dfc86b3173fee ("clk: qoriq: Move chip-specific knowledge into
> driver").
>
> [3] I initially discussed adding consumer APIs for this patchset in
> http://lkml.iu.edu/hypermail/linux/kernel/1509.2/02728.html
>
More information about the Linuxppc-dev
mailing list