"Mark A. Greer" <[email protected]> writes:
> From: Mark A. Greer <[email protected]>
>
> 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 <[email protected]>
[...]
> 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
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source