Sanjeev Premi <[email protected]> writes:
> Added runtime check via omap2_set_globals_35xx()
> Also added runtime check for the OMAP35x variants.
>
> Signed-off-by: Sanjeev Premi <[email protected]>
> ---
> 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 [email protected]
> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html