"Mark A. Greer" <mgr...@mvista.com> writes:

> From: Mark A. Greer <mgr...@mvista.com>
>
> The Davinci cpu_is_davinci_*() macros use the SoC part number
> and variant retrieved from the JTAG ID register to determine the
> type of cpu that the kernel is running on.  Currently, the code to
> read the JTAG ID register assumes that the register is always at
> the same base address.  This isn't true on some newer SoCs.
>
> To solve this, have the SoC-specific code set the JTAG ID register
> base address in 'davinci_soc_info' and add a 'cpu_id' member to
> 'davinci_soc_info' which will be used by the cpu_is_davinci_*()
> macros.  Also move the info used to identify the cpu type into
> the SoC-specific code to keep all SoC-specific code together.
>
> The common code will read the JTAG ID register, search through
> an array of davinci_id structures to identify the cpu type.
> Once identified, it will set the 'cpu_id' member of
> 'davinci_soc_info' to the proper value and the cpu_is_davinci_*()
> macros will now work.
>
> Signed-off-by: Mark A. Greer <mgr...@mvista.com>

[...]

> diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c
> index e2d035a..376ae47 100644
> --- a/arch/arm/mach-davinci/common.c
> +++ b/arch/arm/mach-davinci/common.c
> @@ -15,13 +15,31 @@
>  #include <asm/mach/map.h>
>  
>  #include <mach/common.h>
> +#include <mach/cpu.h>
>  
>  struct davinci_soc_info *davinci_soc_info;
>  EXPORT_SYMBOL(davinci_soc_info);
>  
> +static struct davinci_id * __init davinci_get_id(u32 jtag_id)
> +{
> +     int i;
> +     struct davinci_id *dip;
> +     u8 variant = (jtag_id & 0xf0000000) >> 28;
> +     u16 part_no = (jtag_id & 0x0ffff000) >> 12;
> +
> +     for (i = 0, dip = davinci_soc_info->ids; i < davinci_soc_info->ids_num;
> +                     i++, dip++)
> +             /* Don't care about the manufacturer right now */
> +             if ((dip->part_no == part_no) && (dip->variant == variant))
> +                     return dip;
> +
> +     return NULL;
> +}
> +
>  int __init davinci_common_init(struct davinci_soc_info *soc_info)
>  {
>       int ret;
> +     struct davinci_id *dip;
>  
>       if (!soc_info) {
>               ret = -EINVAL;
> @@ -41,10 +59,20 @@ int __init davinci_common_init(struct davinci_soc_info 
> *soc_info)
>       local_flush_tlb_all();
>       flush_cache_all();
>  
> -     /* We want to check CPU revision early for cpu_is_xxxx() macros.
> +     /*
> +      * We want to check CPU revision early for cpu_is_xxxx() macros.
>        * IO space mapping must be initialized before we can do that.
>        */
> -     davinci_check_revision();

Can you move the use of IO_ADDRESS() here and put the physical address
in the soc_info struct?

This will allow ease of migration away from IO_ADDRESS() in the future.

Other than that, looks ok.

Kevin


_______________________________________________
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to