Sanjeev Premi <premi@xxxxxx> writes: > Added runtime check via omap2_set_globals_35xx() > Also added runtime check for the OMAP35x variants. > > Signed-off-by: Sanjeev Premi <premi@xxxxxx> > --- > arch/arm/mach-omap2/id.c | 90 ++++++++++++++++++++++++------ > arch/arm/plat-omap/common.c | 19 ++++++ > arch/arm/plat-omap/include/mach/common.h | 1 + > arch/arm/plat-omap/include/mach/cpu.h | 88 ++++++++++++++++++++++++++++- > 4 files changed, 178 insertions(+), 20 deletions(-) > > diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c > index 2c5e0a3..5815c33 100644 > --- a/arch/arm/mach-omap2/id.c > +++ b/arch/arm/mach-omap2/id.c > @@ -152,9 +152,11 @@ void __init omap24xx_check_revision(void) > pr_info("\n"); > } > > +#define OMAP_CTRL_STATUS OMAP2_IO_ADDRESS(0x4800244C) > + > void __init omap34xx_check_revision(void) > { > - u32 cpuid, idcode; > + u32 cpuid, idcode, ctrl_status; > u16 hawkeye; > u8 rev; > char *rev_name = "ES1.0"; > @@ -180,24 +182,76 @@ void __init omap34xx_check_revision(void) > hawkeye = (idcode >> 12) & 0xffff; > rev = (idcode >> 28) & 0xff; > > + /* > + * The OMAP35x family was derived off the OMAP34xx ES2.0 Si. > + * Added specific check for the OMAP35x family here. > + */ > + > if (hawkeye == 0xb7ae) { > - switch (rev) { > - case 0: > - omap_revision = OMAP3430_REV_ES2_0; > - rev_name = "ES2.0"; > - break; > - case 2: > - omap_revision = OMAP3430_REV_ES2_1; > - rev_name = "ES2.1"; > - break; > - case 3: > - omap_revision = OMAP3430_REV_ES3_0; > - rev_name = "ES3.0"; > - break; > - default: > - /* Use the latest known revision as default */ > - omap_revision = OMAP3430_REV_ES3_0; > - rev_name = "Unknown revision\n"; > + if (cpu_is_omap35xx()) { > + omap_revision = OMAP35XX_CLASS ; > + > + /* > + * Get the chip ID > + */ > + ctrl_status = __raw_readl(OMAP_CTRL_STATUS); > + > + switch (ctrl_status) { > + case 0x05C00 : > + omap_revision |= OMAP3503_MASK; > + break; > + case 0x01C00 : > + omap_revision |= OMAP3515_MASK; > + break; > + case 0x04C00 : > + omap_revision |= OMAP3525_MASK; > + break; > + case 0x00C00 : > + omap_revision |= OMAP3530_MASK; > + break; > + } > + > + /* > + * Get the silicon version information > + */ > + switch (rev) { > + case 1: > + omap_revision |= OMAP35XX_MASK_ES2_0; > + rev_name = "ES2.0"; > + break; > + case 2: > + omap_revision |= OMAP35XX_MASK_ES2_1; > + rev_name = "ES2.1"; > + break; > + case 3: > + omap_revision |= OMAP35XX_MASK_ES3_0; > + rev_name = "ES3.0"; > + break; > + default: > + /* Use the latest known revision as default */ > + omap_revision |= OMAP35XX_MASK_ES3_0; > + rev_name = "Unknown revision\n"; > + } > + } > + else { > + switch (rev) { > + case 0: > + omap_revision = OMAP3430_REV_ES2_0; > + rev_name = "ES2.0"; > + break; > + case 2: > + omap_revision = OMAP3430_REV_ES2_1; > + rev_name = "ES2.1"; > + break; > + case 3: > + omap_revision = OMAP3430_REV_ES3_0; > + rev_name = "ES3.0"; > + break; > + default: > + /* Use the latest known revision as default */ > + omap_revision = OMAP3430_REV_ES3_0; > + rev_name = "Unknown revision\n"; > + } > } > } > > diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c > index 8c53125..1056d3d 100644 > --- a/arch/arm/plat-omap/common.c > +++ b/arch/arm/plat-omap/common.c > @@ -333,3 +333,22 @@ void __init omap2_set_globals_343x(void) > } > #endif > > +#ifdef CONFIG_ARCH_OMAP35XX > +static struct omap_globals omap35xx_globals = { > + .class = OMAP35XX_CLASS, > + .tap = OMAP2_IO_ADDRESS(0x4830A000), > + .sdrc = OMAP2_IO_ADDRESS(OMAP343X_SDRC_BASE), > + .sms = OMAP2_IO_ADDRESS(OMAP343X_SMS_BASE), > + .ctrl = OMAP2_IO_ADDRESS(OMAP343X_CTRL_BASE), > + .prm = OMAP2_IO_ADDRESS(OMAP3430_PRM_BASE), > + .cm = OMAP2_IO_ADDRESS(OMAP3430_CM_BASE), > +}; This is exactly the same as omap34xx_globals. Why is this needed? > + > +void __init omap2_set_globals_35xx(void) > +{ > + omap2_globals = &omap35xx_globals; > + > + __omap2_set_globals(); > +} > +#endif /* CONFIG_ARCH_OMAP35XX */ > + What is the problem of the init code just leaving omap2_set_globals_343x() If you really think this will confuse folks, then how about just changing the #ifdef of the 343x defines to: #if defined(CONFIG_ARCH_OMAP3430) || defined(CONFIG_ARCH_OMAP35XX) and then adding this: #define omap2_set_globals_35xx omap2_set_globals_343x() Kevin > diff --git a/arch/arm/plat-omap/include/mach/common.h b/arch/arm/plat-omap/include/mach/common.h > index af4105f..f41cba2 100644 > --- a/arch/arm/plat-omap/include/mach/common.h > +++ b/arch/arm/plat-omap/include/mach/common.h > @@ -60,6 +60,7 @@ struct omap_globals { > void omap2_set_globals_242x(void); > void omap2_set_globals_243x(void); > void omap2_set_globals_343x(void); > +void omap2_set_globals_35xx(void); > > /* These get called from omap2_set_globals_xxxx(), do not call these */ > void omap2_set_globals_tap(struct omap_globals *); > diff --git a/arch/arm/plat-omap/include/mach/cpu.h b/arch/arm/plat-omap/include/mach/cpu.h > index b2062f1..447e053 100644 > --- a/arch/arm/plat-omap/include/mach/cpu.h > +++ b/arch/arm/plat-omap/include/mach/cpu.h > @@ -93,7 +93,7 @@ unsigned int omap_rev(void); > # define OMAP_NAME omap2430 > # endif > #endif > -#ifdef CONFIG_ARCH_OMAP3430 > +#if defined(CONFIG_ARCH_OMAP3430) && !defined(CONFIG_ARCH_OMAP35XX) > # ifdef OMAP_NAME > # undef MULTI_OMAP2 > # define MULTI_OMAP2 > @@ -102,6 +102,46 @@ unsigned int omap_rev(void); > # endif > #endif > > +#ifdef CONFIG_ARCH_OMAP35XX > +# ifdef CONFIG_ARCH_OMAP3503 > +# ifdef OMAP_NAME > +# undef MULTI_OMAP2 > +# define MULTI_OMAP2 > +# else > +# define OMAP_NAME omap3503 > +# endif > +# endif /* ifdef CONFIG_ARCH_OMAP3503 */ > + > +# ifdef CONFIG_ARCH_OMAP3515 > +# ifdef OMAP_NAME > +# undef MULTI_OMAP2 > +# define MULTI_OMAP2 > +# else > +# define OMAP_NAME omap3515 > +# endif > +# endif /* ifdef CONFIG_ARCH_OMAP3515 */ > + > +# ifdef CONFIG_ARCH_OMAP3525 > +# ifdef OMAP_NAME > +# undef MULTI_OMAP2 > +# define MULTI_OMAP2 > +# else > +# define OMAP_NAME omap3525 > +# endif > +# endif /* ifdef CONFIG_ARCH_OMAP3525 */ > + > +# ifdef CONFIG_ARCH_OMAP3530 > +# ifdef OMAP_NAME > +# undef MULTI_OMAP2 > +# define MULTI_OMAP2 > +# else > +# define OMAP_NAME omap3530 > +# endif > +# endif /* ifdef CONFIG_ARCH_OMAP3530 */ > + > +#endif /* ifdef CONFIG_ARCH_OMAP35XX */ > + > + > /* > * Macros to group OMAP into cpu classes. > * These can be used in most places. > @@ -112,6 +152,7 @@ unsigned int omap_rev(void); > * cpu_is_omap242x(): True for OMAP2420, OMAP2422, OMAP2423 > * cpu_is_omap243x(): True for OMAP2430 > * cpu_is_omap343x(): True for OMAP3430 > + * cpu_is_omap35xx(): True for OMAP35XX > */ > #define GET_OMAP_CLASS (omap_rev() & 0xff) > > @@ -147,6 +188,7 @@ IS_OMAP_SUBCLASS(343x, 0x343) > #define cpu_is_omap243x() 0 > #define cpu_is_omap34xx() 0 > #define cpu_is_omap343x() 0 > +#define cpu_is_omap35xx() 0 > > #if defined(MULTI_OMAP1) > # if defined(CONFIG_ARCH_OMAP730) > @@ -191,6 +233,10 @@ IS_OMAP_SUBCLASS(343x, 0x343) > # define cpu_is_omap34xx() is_omap34xx() > # define cpu_is_omap343x() is_omap343x() > # endif > +# if defined(CONFIG_ARCH_OMAP35XX) > +# undef cpu_is_omap35xx > +# define cpu_is_omap35xx() is_omap35xx() > +# endif > #else > # if defined(CONFIG_ARCH_OMAP24XX) > # undef cpu_is_omap24xx > @@ -212,6 +258,10 @@ IS_OMAP_SUBCLASS(343x, 0x343) > # undef cpu_is_omap343x > # define cpu_is_omap343x() 1 > # endif > +# if defined(CONFIG_ARCH_OMAP35XX) > +# undef cpu_is_omap35xx > +# define cpu_is_omap35xx() 1 > +# endif > #endif > > /* > @@ -230,7 +280,11 @@ IS_OMAP_SUBCLASS(343x, 0x343) > * cpu_is_omap2423(): True for OMAP2423 > * cpu_is_omap2430(): True for OMAP2430 > * cpu_is_omap3430(): True for OMAP3430 > - */ > + * cpu_is_omap3503(): True for OMAP3503 > + * cpu_is_omap3515(): True for OMAP3515 > + * cpu_is_omap3525(): True for OMAP3525 > + * cpu_is_omap3530(): True for OMAP3530 > + */; > #define GET_OMAP_TYPE ((omap_rev() >> 16) & 0xffff) > > #define IS_OMAP_TYPE(type, id) \ > @@ -252,6 +306,10 @@ IS_OMAP_TYPE(2422, 0x2422) > IS_OMAP_TYPE(2423, 0x2423) > IS_OMAP_TYPE(2430, 0x2430) > IS_OMAP_TYPE(3430, 0x3430) > +IS_OMAP_TYPE(3503, 0x3503) > +IS_OMAP_TYPE(3515, 0x3515) > +IS_OMAP_TYPE(3525, 0x3525) > +IS_OMAP_TYPE(3530, 0x3530) > > #define cpu_is_omap310() 0 > #define cpu_is_omap730() 0 > @@ -266,6 +324,10 @@ IS_OMAP_TYPE(3430, 0x3430) > #define cpu_is_omap2423() 0 > #define cpu_is_omap2430() 0 > #define cpu_is_omap3430() 0 > +#define cpu_is_omap3503() 0 > +#define cpu_is_omap3515() 0 > +#define cpu_is_omap3525() 0 > +#define cpu_is_omap3530() 0 > > #if defined(MULTI_OMAP1) > # if defined(CONFIG_ARCH_OMAP730) > @@ -319,6 +381,18 @@ IS_OMAP_TYPE(3430, 0x3430) > # define cpu_is_omap3430() is_omap3430() > #endif > > +#if defined(CONFIG_ARCH_OMAP35XX) > +# undef cpu_is_omap3503 > +# undef cpu_is_omap3515 > +# undef cpu_is_omap3525 > +# undef cpu_is_omap3530 > + > +# define cpu_is_omap3503() is_omap3503() > +# define cpu_is_omap3515() is_omap3515() > +# define cpu_is_omap3525() is_omap3525() > +# define cpu_is_omap3530() is_omap3530() > +#endif /* if defined(CONFIG_ARCH_OMAP35XX) */ > + > /* Macros to detect if we have OMAP1 or OMAP2 */ > #define cpu_class_is_omap1() (cpu_is_omap730() || cpu_is_omap15xx() || \ > cpu_is_omap16xx()) > @@ -340,6 +414,16 @@ IS_OMAP_TYPE(3430, 0x3430) > #define OMAP3430_REV_ES2_1 0x34302034 > #define OMAP3430_REV_ES3_0 0x34303034 > > +#define OMAP35XX_CLASS 0x35000035 > +#define OMAP3503_MASK 0x00030000 > +#define OMAP3515_MASK 0x00150000 > +#define OMAP3525_MASK 0x00250000 > +#define OMAP3530_MASK 0x00300000 > + > +#define OMAP35XX_MASK_ES2_0 0x00001000 > +#define OMAP35XX_MASK_ES2_1 0x00002000 > +#define OMAP35XX_MASK_ES3_0 0x00003000 > + > /* > * omap_chip bits > * > -- > 1.5.6 > > -- > 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 -- 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