Re: [PATCH 1/1] OMAP3: Common mechanism to identify cpu revision

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sanjeev Premi <premi@xxxxxx> writes:

> There are multiple mechanisms to identify the cpu revisions.
> Most common is use of omap_rev(). This, however, does a
> absolute comparison of omap_revision - which includes
> CPU id, CPU rev and CPU class. This comparison fails for
> OMAP35x processors.
>
> This patch defines generic functions that use only the
> CPU rev bits in omap_revision to identify the revision
> information.
>
> Usage will change from (for example):
> 	if (omap_rev() > OMAP3430_REV_ES2_0)
> to:
> 	if (cpu_is_omap34xx() && omap_rev_gt_2_0())
>
> Specific check for cpu_is_xxx() will not be needed for
> files specific to silicon e.g. pm34xx.c, clock34xx.c, etc.
>
> Signed-off-by: Sanjeev Premi <premi@xxxxxx>

Looks mostly good, some minor comments/questions below...

> ---
>  arch/arm/mach-omap2/clock34xx.c       |    4 +-
>  arch/arm/mach-omap2/control.c         |    6 ++--
>  arch/arm/mach-omap2/pm34xx.c          |   17 +++++-----
>  arch/arm/plat-omap/include/mach/cpu.h |   55 +++++++++++++++++++++++++++++++++
>  4 files changed, 69 insertions(+), 13 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c
> index e0df0ce..074c593 100644
> --- a/arch/arm/mach-omap2/clock34xx.c
> +++ b/arch/arm/mach-omap2/clock34xx.c
> @@ -815,7 +815,7 @@ static int omap3_dpll4_set_rate(struct clk *clk, unsigned long rate)
>  	 * on 3430ES1 prevents us from changing DPLL multipliers or dividers
>  	 * on DPLL4.
>  	 */
> -	if (omap_rev() == OMAP3430_REV_ES1_0) {
> +	if (omap_rev_is_1_0()) {
>  		printk(KERN_ERR "clock: DPLL4 cannot change rate due to "
>  		       "silicon 'Limitation 2.5' on 3430ES1.\n");
>  		return -EINVAL;
> @@ -1157,7 +1157,7 @@ int __init omap2_clk_init(void)
>  		 * Update this if there are further clock changes between ES2
>  		 * and production parts
>  		 */
> -		if (omap_rev() == OMAP3430_REV_ES1_0) {
> +		if (omap_rev_is_1_0()) {
>  			/* No 3430ES1-only rates exist, so no RATE_IN_3430ES1 */
>  			cpu_clkflg |= CK_3430ES1;
>  		} else {
> diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c
> index c9407c0..089e714 100644
> --- a/arch/arm/mach-omap2/control.c
> +++ b/arch/arm/mach-omap2/control.c
> @@ -209,8 +209,8 @@ void omap3_save_scratchpad_contents(void)
>  
>  	/* Populate the Scratchpad contents */
>  	scratchpad_contents.boot_config_ptr = 0x0;
> -	if (omap_rev() != OMAP3430_REV_ES3_0 &&
> -					omap_rev() != OMAP3430_REV_ES3_1)
> +	if (cpu_is_omap34xx()
> +		&& !omap_rev_is_3_0() && !omap_rev_is_3_1())
>  		scratchpad_contents.public_restore_ptr =
>  			virt_to_phys(get_restore_pointer());
>  	else
> @@ -271,7 +271,7 @@ void omap3_save_scratchpad_contents(void)
>  	 * of AUTO_CNT = 1 prior to any transition to OFF mode.
>  	 */
>  	if ((omap_type() != OMAP2_DEVICE_TYPE_GP)
> -			&& (omap_rev() >= OMAP3430_REV_ES3_0))
> +		&& cpu_is_omap34xx() && omap_rev_ge_3_0())

I don't think the cpu_is_... is needed here because of the OMAP3
specific function.

>  		sdrc_block_contents.power = (sdrc_read_reg(SDRC_POWER) &
>  				~(SDRC_POWER_AUTOCOUNT_MASK|
>  				SDRC_POWER_CLKCTRL_MASK)) |
> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
> index c1d58a7..7a1eb95 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -28,6 +28,7 @@
>  #include <linux/clk.h>
>  #include <linux/usb/musb.h>
>  
> +#include <mach/cpu.h>
>  #include <mach/sram.h>
>  #include <mach/prcm.h>
>  #include <mach/clockdomain.h>
> @@ -108,7 +109,7 @@ static void omap3_enable_io_chain(void)
>  {
>  	int timeout = 0;
>  
> -	if (omap_rev() >= OMAP3430_REV_ES3_1) {
> +	if (omap_rev_ge_3_1()) {
>  		prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
>  		/* Do a readback to assure write has been done */
>  		prm_read_mod_reg(WKUP_MOD, PM_WKEN);
> @@ -129,7 +130,7 @@ static void omap3_enable_io_chain(void)
>  
>  static void omap3_disable_io_chain(void)
>  {
> -	if (omap_rev() >= OMAP3430_REV_ES3_1)
> +	if (omap_rev_ge_3_1())
>  		prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
>  }
>  
> @@ -248,7 +249,7 @@ static int _prcm_int_handle_wakeup(void)
>  	c = prcm_clear_mod_irqs(WKUP_MOD, 1);
>  	c += prcm_clear_mod_irqs(CORE_MOD, 1);
>  	c += prcm_clear_mod_irqs(OMAP3430_PER_MOD, 1);
> -	if (omap_rev() > OMAP3430_REV_ES1_0) {
> +	if (omap_rev_gt_1_0()) {
>  		c += prcm_clear_mod_irqs(CORE_MOD, 3);
>  		c += prcm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1);
>  	}
> @@ -432,7 +433,7 @@ void omap_sram_idle(void)
>  	* of AUTO_CNT = 1 enabled. This takes care of errata 1.142.
>  	* Hence store/restore the SDRC_POWER register here.
>  	*/
> -	if (omap_rev() >= OMAP3430_REV_ES3_0 &&
> +	if (omap_rev_ge_3_0() &&
>  	    omap_type() != OMAP2_DEVICE_TYPE_GP &&
>  	    core_next_state == PWRDM_POWER_OFF)
>  		sdrc_pwr = sdrc_read_reg(SDRC_POWER);
> @@ -449,7 +450,7 @@ void omap_sram_idle(void)
>  	cpu_init();
>  
>  	/* Restore normal SDRC POWER settings */
> -	if (omap_rev() >= OMAP3430_REV_ES3_0 &&
> +	if (omap_rev_ge_3_0() &&
>  	    omap_type() != OMAP2_DEVICE_TYPE_GP &&
>  	    core_next_state == PWRDM_POWER_OFF)
>  		sdrc_write_reg(sdrc_pwr, SDRC_POWER);
> @@ -784,7 +785,7 @@ static void __init prcm_setup_regs(void)
>  	prm_write_mod_reg(0, OMAP3430_NEON_MOD, PM_WKDEP);
>  	prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP);
>  	prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP);
> -	if (omap_rev() > OMAP3430_REV_ES1_0) {
> +	if (omap_rev_gt_1_0()) {
>  		prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP);
>  		prm_write_mod_reg(0, OMAP3430ES2_USBHOST_MOD, PM_WKDEP);
>  	} else
> @@ -835,7 +836,7 @@ static void __init prcm_setup_regs(void)
>  		OMAP3430_AUTO_DES1,
>  		CORE_MOD, CM_AUTOIDLE2);
>  
> -	if (omap_rev() > OMAP3430_REV_ES1_0) {
> +	if (omap_rev_gt_1_0()) {
>  		cm_write_mod_reg(
>  			OMAP3430_AUTO_MAD2D |
>  			OMAP3430ES2_AUTO_USBTLL,
> @@ -883,7 +884,7 @@ static void __init prcm_setup_regs(void)
>  		OMAP3430_PER_MOD,
>  		CM_AUTOIDLE);
>  
> -	if (omap_rev() > OMAP3430_REV_ES1_0) {
> +	if (omap_rev_gt_1_0()) {
>  		cm_write_mod_reg(
>  			OMAP3430ES2_AUTO_USBHOST,
>  			OMAP3430ES2_USBHOST_MOD,
> diff --git a/arch/arm/plat-omap/include/mach/cpu.h b/arch/arm/plat-omap/include/mach/cpu.h
> index b689013..522df64 100644
> --- a/arch/arm/plat-omap/include/mach/cpu.h
> +++ b/arch/arm/plat-omap/include/mach/cpu.h
> @@ -453,6 +453,61 @@ IS_OMAP_TYPE(3517, 0x3517)
>  #define omap35xx_rev_mask()	(omap_rev() & 0x0000F000)
>  
>  /*
> + * Silicon revisions
> + */
> +#define OMAP_ES_1_0		0x00
> +#define OMAP_ES_2_0		0x10
> +#define OMAP_ES_2_1		0x20
> +#define OMAP_ES_3_0		0x30
> +#define OMAP_ES_3_1		0x40

Hmm, are these the same values on OMAP2? and OMAP4?

> +#define OMAP_REV_MASK		0x0000ff00
> +#define OMAP_REV_BITS		((omap_rev() & OMAP_REV_MASK) >> 8)
> +
> +#define OMAP_REV_IS(revid)					\
> +static inline u8 omap_rev_is_ ##revid (void)			\

Minor nit, but these should return bool.

> +{								\
> +	return (OMAP_REV_BITS == OMAP_ES_ ##revid) ? 1 : 0;	\
> +}
> +
> +#define OMAP_REV_LT(revid)					\
> +static inline u8 omap_rev_lt_ ##revid (void)			\
> +{								\
> +	return (OMAP_REV_BITS < OMAP_ES_ ##revid) ? 1 : 0;	\
> +}
> +
> +#define OMAP_REV_LE(revid)					\
> +static inline u8 omap_rev_le_ ##revid (void)			\
> +{								\
> +	return (OMAP_REV_BITS <= OMAP_ES_ ##revid) ? 1 : 0;	\
> +}
> +
> +#define OMAP_REV_GT(revid)					\
> +static inline u8 omap_rev_gt_ ##revid (void)			\
> +{								\
> +	return (OMAP_REV_BITS > OMAP_ES_ ##revid) ? 1 : 0;	\
> +}
> +
> +#define OMAP_REV_GE(revid)					\
> +static inline u8 omap_rev_ge_ ##revid (void)			\
> +{								\
> +	return (OMAP_REV_BITS >= OMAP_ES_ ##revid) ? 1 : 0;	\
> +}
> +
> +#define OMAP_REV_FUNCTIONS(revid)	\
> +	OMAP_REV_IS(revid)		\
> +	OMAP_REV_LT(revid)		\
> +	OMAP_REV_LE(revid)		\
> +	OMAP_REV_GT(revid)		\
> +	OMAP_REV_GE(revid)
> +
> +OMAP_REV_FUNCTIONS(1_0)
> +OMAP_REV_FUNCTIONS(2_0)
> +OMAP_REV_FUNCTIONS(2_1)
> +OMAP_REV_FUNCTIONS(3_0)
> +OMAP_REV_FUNCTIONS(3_1)
> +
> +/*
>   * omap_chip bits
>   *
>   * CHIP_IS_OMAP{2420,2430,3430} indicate that a particular structure is

Kevin
--
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

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux