Re: [PATCH 1/2] ARM: OMAP: Add initialisation for the real-time counter. |
|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
On Mon, Aug 13, 2012 at 11:05 PM, Vaibhav Hiremath <hvaibhav@xxxxxx> wrote:
>
>
>
> On 8/13/2012 4:37 PM, Santosh Shilimkar wrote:
> > The real time counter also called master counter, is a free-running
> > counter. It produces the count used by the CPU local timer peripherals
> > in the MPU cluster. The timer counts at a rate of 6.144 MHz.
> >
> > The ratio registers needs to be configured based on system clock
> > only onetime. After initialisation, hardware takes care of adjusting
> > the clock in different low power modes to keep counter rate constant.
> >
> > Signed-off-by: Santosh Shilimkar <santosh.shilimkar@xxxxxx>
> > ---
> > arch/arm/mach-omap2/Kconfig | 4 ++
> > arch/arm/mach-omap2/timer.c | 89
> > ++++++++++++++++++++++++++++++++++++++++++-
> > 2 files changed, 92 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
> > index dd2db02..2120f90 100644
> > --- a/arch/arm/mach-omap2/Kconfig
> > +++ b/arch/arm/mach-omap2/Kconfig
> > @@ -24,6 +24,9 @@ config ARCH_OMAP2PLUS_TYPICAL
> > config SOC_HAS_OMAP2_SDRC
> > bool "OMAP2 SDRAM Controller support"
> >
> > +config SOC_HAS_REALTIME_COUNTER
> > + bool "Real time free running counter"
> > +
> > config ARCH_OMAP2
> > bool "TI OMAP2"
> > depends on ARCH_OMAP2PLUS
> > @@ -69,6 +72,7 @@ config SOC_OMAP5
> > select CPU_V7
> > select ARM_GIC
> > select HAVE_SMP
> > + select SOC_HAS_REALTIME_COUNTER
> >
> > comment "OMAP Core Type"
> > depends on ARCH_OMAP2
> > diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
> > index 2ff6d41..9b17e6c 100644
> > --- a/arch/arm/mach-omap2/timer.c
> > +++ b/arch/arm/mach-omap2/timer.c
> > @@ -69,6 +69,11 @@
> > #define OMAP3_SECURE_TIMER 1
> > #endif
> >
> > +#define REALTIME_COUNTER_BASE 0x48243200
> > +#define INCREMENTER_NUMERATOR_OFFSET 0x10
> > +#define INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x14
> > +#define NUMERATOR_DENUMERATOR_MASK 0xfffff000
> > +
> > /* Clockevent code */
> >
> > static struct omap_dm_timer clkev;
> > @@ -339,6 +344,83 @@ static void __init omap2_clocksource_init(int
> > gptimer_id,
> > omap2_gptimer_clocksource_init(gptimer_id, fck_source);
> > }
> >
> > +#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
> > +/*
> > + * The realtime counter also called master counter, is a free-running
> > + * counter, which is related to real time. It produces the count used
> > + * by the CPU local timer peripherals in the MPU cluster. The timer
> > counts
> > + * at a rate of 6.144 MHz. Because the device operates on different
> > clocks
> > + * in different power modes, the master counter shifts operation
> > between
> > + * clocks, adjusting the increment per clock in hardware accordingly to
> > + * maintain a constant count rate.
> > + */
> > +static void __init realtime_counter_init(void)
> > +{
> > + void __iomem *base;
> > + static struct clk *sys_clk;
> > + unsigned long rate;
> > + unsigned int reg, num, den;
> > +
> > + base = ioremap(REALTIME_COUNTER_BASE, SZ_32);
> > + if (!base) {
> > + pr_err("%s: ioremap failed\n", __func__);
> > + return;
> > + }
> > + sys_clk = clk_get(NULL, "sys_clkin_ck");
> > + if (!sys_clk) {
> > + pr_err("%s: failed to get system clock handle\n",
> > __func__);
> > + return;
>
> Don't want to unmap the ioremap'ed space?
>
yep. Infact at the end of this function I wanted to unmap the
space since this is one time init. Will fix that in next version.
> > + }
> > +
> > + rate = clk_get_rate(sys_clk);
> > + switch (rate) {
> > + case 1200000:
> > + num = 64;
> > + den = 125;
> > + break;
> > + case 1300000:
> > + num = 768;
> > + den = 1625;
> > + break;
> > + case 19200000:
> > + num = 8;
> > + den = 25;
> > + break;
> > + case 2600000:
> > + num = 384;
> > + den = 1625;
> > + break;
> > + case 2700000:
> > + num = 256;
> > + den = 1125;
> > + break;
> > + case 38400000:
> > + num = 4;
> > + den = 25;
> > + break;
> > + default:
> > + /* Program it for 38.4 MHz */
> > + num = 4;
> > + den = 25;
> > + break;
>
> You can simply do something like,
>
> case 38400000:
> /* Program it for 38.4 MHz */
> default:
> num = 4;
> den = 25;
> break;
>
Yes.
> Also, suggest to mention about why 38.4MHz as default? I believe it is
> reset value, right?
>
This is the default sys clock rate assumed in most of the documentation
and also expected to be a default sys clock rate. Reset values as you
said in many other registers also assume 38.4 MHz.
> Also, does it make sense to get rid of hardcoded values above?
>
Actually not. Because the values are fixed since the counter
clock-rate is hardwired to be 6.144 MHz and hence all the
other numbers becomes constant. All these numbers are
coming from TRM and not from any formula. I don't wanted
to go on mathematical equation path since all the values
are well documented.
Thanks for comment.
Regards
santosh
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux Arm (vger)]
[ARM Kernel]
[ARM MSM]
[Linux Tegra]
[Maemo Users]
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]