Clock API and "maximum rate"

Russell King - ARM Linux linux at arm.linux.org.uk
Thu Jan 12 09:11:28 EST 2012


On Thu, Jan 12, 2012 at 07:49:35AM -0600, Matt Sealey wrote:
> On Wed, Jan 11, 2012 at 10:58 AM, Jamie Iles <jamie at jamieiles.com> wrote:
> > Hi Matt,
> >
> > On Wed, Jan 11, 2012 at 10:30:15AM -0600, Matt Sealey wrote:
> >> Just a curious question, is there any safe way in the current API or
> >> even by peeking a little behind the scenes to find out what the
> >> maximum clock rate would be for a given named clock or struct clk?
> >
> > How about:
> >
> >        long max = clk_round_rate(clk, ~0LU);
> >
> > clk_round_rate() is one of the optional API calls though.
> 
> Luckily implemented in this case :) Seems to do the trick, thanks.

If it's not implemented, but there is an implemented clk_set_rate(), feel
free to complain at whoever created the implementation.

If there's a clk_set_rate() implementation, then there's _already_ an
implementation of clk_round_rate() internally doing the rounding for the
set_rate function, so there's really no excuse not to expose that via
clk_round_rate().

clk_round_rate() is supposed to tell you what you end up with if you
ask clk_set_rate() to set the exact same value you passed in - but
clk_round_rate() won't modify the hardware.

So, clk_round_rate/clk_set_rate really should be thought of being
implemented as this:

long clk_round_rate(struct clk *clk, unsigned long rate)
{
	return __clk_round_rate(clk, rate);
}

int clk_set_rate(struct clk *clk, unsigned long rate)
{
	long rate = __clk_round_rate(clk, rate);

	if (rate < 0)
		return rate;

	return __clk_set_rate(clk, rate);
}



More information about the linux-arm-kernel mailing list