All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@linaro.org>
To: Chen Baozi <baozich@gmail.com>
Cc: Ian Campbell <Ian.Campbell@citrix.com>, xen-devel@lists.xen.org
Subject: Re: [PATCH v3 5/5] xen/arm: Add OMAP5 architected timer initialization codes.
Date: Wed, 07 Aug 2013 18:05:01 +0100	[thread overview]
Message-ID: <52027E3D.5060400@linaro.org> (raw)
In-Reply-To: <1375885131-32743-6-git-send-email-baozich@gmail.com>

On 08/07/2013 03:18 PM, Chen Baozi wrote:
> Signed-off-by: Chen Baozi <baozich@gmail.com>
> ---
>  xen/arch/arm/platforms/omap5.c        | 72 +++++++++++++++++++++++++++++++++++
>  xen/arch/arm/time.c                   |  7 +++-
>  xen/include/asm-arm/platforms/omap5.h | 12 ++++++
>  3 files changed, 90 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/arch/arm/platforms/omap5.c b/xen/arch/arm/platforms/omap5.c
> index 084e211..4791366 100644
> --- a/xen/arch/arm/platforms/omap5.c
> +++ b/xen/arch/arm/platforms/omap5.c
> @@ -20,6 +20,77 @@
>  #include <xen/config.h>
>  #include <asm/platform.h>
>  #include <asm/platforms/omap5.h>
> +#include <xen/mm.h>
> +#include <xen/vmap.h>
> +
> +static uint16_t num_den[8][2] = {
> +    {         0,          0 },  /* not used */
> +    {  26 *  64,  26 *  125 },  /* 12.0 Mhz */
> +    {   2 * 768,   2 * 1625 },  /* 13.0 Mhz */
> +    {         0,          0 },  /* not used */
> +    { 130 *   8, 130 *   25 },  /* 19.2 Mhz */
> +    {   2 * 384,   2 * 1625 },  /* 26.0 Mhz */
> +    {   3 * 256,   3 * 1125 },  /* 27.0 Mhz */
> +    { 130 *   4, 130 *   25 },  /* 38.4 Mhz */
> +};
> +
> +/*
> + * 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 teh 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 int omap5_init_time(void)
> +{
> +    void __iomem *ckgen_prm_base;
> +    void __iomem *rt_ct_base;
> +    unsigned int sys_clksel;
> +    unsigned int num, den, frac1, frac2;
> +
> +    ckgen_prm_base = ioremap_attr(OMAP5_CKGEN_PRM_BASE,
> +                                  0x20, PAGE_HYPERVISOR_NOCACHE);
> +    if (!ckgen_prm_base) {
Coding style.
if ( .. )
{

> +        dprintk(XENLOG_ERR, "%s: PRM_BASE ioremap failed\n", __func__);
> +        return -ENOMEM;
> +    }
> +
> +    sys_clksel = ioreadl(ckgen_prm_base + OMAP5_CM_CLKSEL_SYS) &
> +        ~SYS_CLKSEL_MASK;
> +
> +    iounmap(ckgen_prm_base);
> +
> +    rt_ct_base = ioremap_attr(REALTIME_COUNTER_BASE,
> +                              0x20, PAGE_HYPERVISOR_NOCACHE);
> +    if (!rt_ct_base) {
Same here.
> +        dprintk(XENLOG_ERR, "%s: REALTIME_COUNTER_BASE ioremap failed\n", __func__);
> +        return -ENOMEM;
> +    }
> +
> +    frac1 = ioreadl(rt_ct_base + INCREMENTER_NUMERATOR_OFFSET);
> +    num = frac1 & ~NUMERATOR_DENUMERATOR_MASK;
> +    if (num_den[sys_clksel][0] != num) {
Same here.
> +        frac1 &= NUMERATOR_DENUMERATOR_MASK;
> +        frac1 |= num_den[sys_clksel][0];
> +    }
> +
> +    frac2 = ioreadl(rt_ct_base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET);
> +    den = frac2 & ~NUMERATOR_DENUMERATOR_MASK;
> +    if (num_den[sys_clksel][1] != num) {
Same here.
> +        frac2 &= NUMERATOR_DENUMERATOR_MASK;
> +        frac2 |= num_den[sys_clksel][1];
> +    }
> +
> +    iowritel(rt_ct_base + INCREMENTER_NUMERATOR_OFFSET, frac1);
> +    iowritel(rt_ct_base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET,
> +             frac2 | PRM_FRAC_INCREMENTER_DENUMERATOR_RELOAD);
> +
> +    iounmap(rt_ct_base);
> +
> +    return 0;
> +}
>  
>  static const char const *omap5_dt_compat[] __initdata =
>  {
> @@ -29,6 +100,7 @@ static const char const *omap5_dt_compat[] __initdata =
>  
>  PLATFORM_START(omap5, "TI OMAP5")
>      .compatible = omap5_dt_compat,
> +    .init_time = omap5_init_time,
>  PLATFORM_END
>  
>  /*
> diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c
> index 4ed7882..104aefc 100644
> --- a/xen/arch/arm/time.c
> +++ b/xen/arch/arm/time.c
> @@ -104,6 +104,7 @@ int __init init_xen_time(void)
>      struct dt_device_node *dev;
>      int res;
>      unsigned int i;
> +    u32 rate;
>  
>      dev = dt_find_compatible_node(NULL, NULL, "arm,armv7-timer");
>      if ( !dev )
> @@ -134,7 +135,11 @@ int __init init_xen_time(void)
>      if ( !cpu_has_gentimer )
>          panic("CPU does not support the Generic Timer v1 interface.\n");
>  
> -    cpu_khz = READ_SYSREG32(CNTFRQ_EL0) / 1000;
> +    res = dt_property_read_u32(dev, "clock-frequency", &rate);
> +    if ( res )
> +	cpu_khz = rate / 1000;
> +    else
> +        cpu_khz = READ_SYSREG32(CNTFRQ_EL0) / 1000;
>  
>      boot_count = READ_SYSREG64(CNTPCT_EL0);
>      printk("Using generic timer at %lu KHz\n", cpu_khz);
> diff --git a/xen/include/asm-arm/platforms/omap5.h b/xen/include/asm-arm/platforms/omap5.h
> index ff07d95..c657bae 100644
> --- a/xen/include/asm-arm/platforms/omap5.h
> +++ b/xen/include/asm-arm/platforms/omap5.h
> @@ -1,6 +1,18 @@
>  #ifndef __ASM_ARM_PLATFORMS_OMAP5_H
>  #define __ASM_ASM_PLATFORMS_OMAP5_H
>  
> +#define REALTIME_COUNTER_BASE                 0x48243200
> +#define INCREMENTER_NUMERATOR_OFFSET          0x10
> +#define INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x14
> +#define NUMERATOR_DENUMERATOR_MASK            0xfffff000
> +#define PRM_FRAC_INCREMENTER_DENUMERATOR_RELOAD 0x00010000
> +
> +#define OMAP5_L4_WKUP                         0x4AE00000
> +#define OMAP5_PRM_BASE                        (OMAP5_L4_WKUP + 0x6000)
> +#define OMAP5_CKGEN_PRM_BASE                  (OMAP5_PRM_BASE + 0x100)
> +#define OMAP5_CM_CLKSEL_SYS                   0x10
> +#define SYS_CLKSEL_MASK                       0xfffffff8
> +
>  #endif /* __ASM_ARM_PLATFORMS_OMAP5_H */
>  
>  /*
> 

-- 
Julien Grall

  reply	other threads:[~2013-08-07 17:05 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-07 14:18 [PATCH v3 0/5] Add UART support and arch timer initialization for OMAP5 Chen Baozi
2013-08-07 14:18 ` [PATCH v3 1/5] xen: rename ns16550-uart.h to 8250-uart.h and fix some typos Chen Baozi
2013-08-07 16:53   ` Keir Fraser
2013-08-07 14:18 ` [PATCH v3 2/5] xen/arm: add 8250 compatible UART support for early_printk Chen Baozi
2013-08-07 14:18 ` [PATCH v3 3/5] xen/arm: Add the new OMAP UART driver Chen Baozi
2013-08-07 17:12   ` Julien Grall
2013-08-07 14:18 ` [PATCH v3 4/5] xen/arm: Introduce platform recognition codes for the OMAP5 Chen Baozi
2013-08-07 16:59   ` Julien Grall
2013-08-07 14:18 ` [PATCH v3 5/5] xen/arm: Add OMAP5 architected timer initialization codes Chen Baozi
2013-08-07 17:05   ` Julien Grall [this message]
2013-08-08  8:31   ` Andrii Anisov
2013-08-08  8:58     ` Chen Baozi
2013-08-08 10:12       ` Julien Grall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52027E3D.5060400@linaro.org \
    --to=julien.grall@linaro.org \
    --cc=Ian.Campbell@citrix.com \
    --cc=baozich@gmail.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.