[PATCH 6/7] tegra: add proper timer driver
Antony Pavlov
antonynpavlov at gmail.com
Sun Mar 3 02:07:27 EST 2013
On 3 March 2013 03:13, Lucas Stach <dev at lynxeye.de> wrote:
> Am Freitag, den 01.03.2013, 18:23 +0100 schrieb Sascha Hauer:
>> On Fri, Mar 01, 2013 at 10:22:52AM +0100, Lucas Stach wrote:
>> > Replace the ad-hoc clocksource implementation with a proper driver for
>> > the Tegra 20 timer. This driver is able to do the required hardware
>> > initialisation itself.
>> >
>> > +
>> > +static int tegra20_timer_probe(struct device_d *dev)
>> > +{
>> > + struct clk *timer_clk;
>> > + unsigned long rate;
>> > +
>> > + /* use only one timer */
>> > + if (timer_base)
>> > + return -EBUSY;
>> > +
>> > + timer_base = dev_request_mem_region(dev, 0);
>> > + if (!timer_base) {
>> > + dev_err(dev, "could not get memory region\n");
>> > + return -ENODEV;
>> > + }
>> > +
>> > + timer_clk = clk_get(dev, NULL);
>> > + if (!timer_clk) {
>> > + dev_err(dev, "could not get clock\n");
>> > + return -ENODEV;
>> > + }
>> > +
>> > + clk_enable(timer_clk);
>> > +
>> > + /*
>> > + * calibrate timer to run at 1MHz
>>
>> We don't need the timer to be running at a certain frequency, you can
>> just use clocks_calc_mult_shift to calculate the correct values from
>> whatever frequency.
>
> Other hardware blocks like the flow controller might assume the timer to
> be running at 1MHz. The timer and time register is named US (like usec)
> for a reason. It's the officially correct way to initialize this timer
> (as documented in the Tegra TRM).
IMHO, then Jean-Christophe speaking about 'just use
clocks_calc_mult_shift' he mean this part of your
arch/arm/mach-tegra/tegra20-timer.c:
+static struct clocksource cs = {
+ .read = tegra20_timer_cs_read,
+ .mask = CLOCKSOURCE_MASK(32),
+ .mult = 1000,
+};
He want to say "please don't use fixed 'mult' value, use
clocks_calc_mult_shift to calculate it".
Please try to examine existing clocksources.
The command
grep -R -A 5 "static struct clocksource.*=" arch/arm/
will show you some results like this
arch/arm/mach-imx/clocksource.c:static struct clocksource cs = {
arch/arm/mach-imx/clocksource.c- .read = imx_clocksource_read,
arch/arm/mach-imx/clocksource.c- .mask = CLOCKSOURCE_MASK(32),
arch/arm/mach-imx/clocksource.c- .shift = 10,
arch/arm/mach-imx/clocksource.c-};
or even like that
arch/arm/mach-clps711x/clock.c:static struct clocksource cs = {
arch/arm/mach-clps711x/clock.c- .read = clocksource_read,
arch/arm/mach-clps711x/clock.c- .mask = CLOCKSOURCE_MASK(16),
arch/arm/mach-clps711x/clock.c-};
But I can't find any example of 'struct clocksource' definition with
fixed 'mult' value.
--
Best regards,
Antony Pavlov
More information about the barebox
mailing list