"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