diff options
Diffstat (limited to 'arch/arm/mach-omap2/sdrc.c')
| -rw-r--r-- | arch/arm/mach-omap2/sdrc.c | 68 | 
1 files changed, 45 insertions, 23 deletions
diff --git a/arch/arm/mach-omap2/sdrc.c b/arch/arm/mach-omap2/sdrc.c index 2045441e838..9e3bd4fa781 100644 --- a/arch/arm/mach-omap2/sdrc.c +++ b/arch/arm/mach-omap2/sdrc.c @@ -32,7 +32,7 @@  #include <mach/sdrc.h>  #include "sdrc.h" -static struct omap_sdrc_params *sdrc_init_params; +static struct omap_sdrc_params *sdrc_init_params_cs0, *sdrc_init_params_cs1;  void __iomem *omap2_sdrc_base;  void __iomem *omap2_sms_base; @@ -45,33 +45,49 @@ void __iomem *omap2_sms_base;  /**   * omap2_sdrc_get_params - return SDRC register values for a given clock rate   * @r: SDRC clock rate (in Hz) + * @sdrc_cs0: chip select 0 ram timings ** + * @sdrc_cs1: chip select 1 ram timings **   *   * Return pre-calculated values for the SDRC_ACTIM_CTRLA, - * SDRC_ACTIM_CTRLB, SDRC_RFR_CTRL, and SDRC_MR registers, for a given - * SDRC clock rate 'r'.  These parameters control various timing - * delays in the SDRAM controller that are expressed in terms of the - * number of SDRC clock cycles to wait; hence the clock rate - * dependency. Note that sdrc_init_params must be sorted rate - * descending.  Also assumes that both chip-selects use the same - * timing parameters.  Returns a struct omap_sdrc_params * upon - * success, or NULL upon failure. + *  SDRC_ACTIM_CTRLB, SDRC_RFR_CTRL and SDRC_MR registers in sdrc_cs[01] + *  structs,for a given SDRC clock rate 'r'. + * These parameters control various timing delays in the SDRAM controller + *  that are expressed in terms of the number of SDRC clock cycles to + *  wait; hence the clock rate dependency. + * + * Supports 2 different timing parameters for both chip selects. + * + * Note 1: the sdrc_init_params_cs[01] must be sorted rate descending. + * Note 2: If sdrc_init_params_cs_1 is not NULL it must be of same size + *  as sdrc_init_params_cs_0. + * + * Fills in the struct omap_sdrc_params * for each chip select. + * Returns 0 upon success or -1 upon failure.   */ -struct omap_sdrc_params *omap2_sdrc_get_params(unsigned long r) +int omap2_sdrc_get_params(unsigned long r, +			  struct omap_sdrc_params **sdrc_cs0, +			  struct omap_sdrc_params **sdrc_cs1)  { -	struct omap_sdrc_params *sp; +	struct omap_sdrc_params *sp0, *sp1; -	if (!sdrc_init_params) -		return NULL; +	if (!sdrc_init_params_cs0) +		return -1; -	sp = sdrc_init_params; +	sp0 = sdrc_init_params_cs0; +	sp1 = sdrc_init_params_cs1; -	while (sp->rate && sp->rate != r) -		sp++; +	while (sp0->rate && sp0->rate != r) { +		sp0++; +		if (sdrc_init_params_cs1) +			sp1++; +	} -	if (!sp->rate) -		return NULL; +	if (!sp0->rate) +		return -1; -	return sp; +	*sdrc_cs0 = sp0; +	*sdrc_cs1 = sp1; +	return 0;  } @@ -83,13 +99,15 @@ void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals)  /**   * omap2_sdrc_init - initialize SMS, SDRC devices on boot - * @sp: pointer to a null-terminated list of struct omap_sdrc_params + * @sdrc_cs[01]: pointers to a null-terminated list of struct omap_sdrc_params + *  Support for 2 chip selects timings   *   * Turn on smart idle modes for SDRAM scheduler and controller.   * Program a known-good configuration for the SDRC to deal with buggy   * bootloaders.   */ -void __init omap2_sdrc_init(struct omap_sdrc_params *sp) +void __init omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0, +			    struct omap_sdrc_params *sdrc_cs1)  {  	u32 l; @@ -103,11 +121,15 @@ void __init omap2_sdrc_init(struct omap_sdrc_params *sp)  	l |= (0x2 << 3);  	sdrc_write_reg(l, SDRC_SYSCONFIG); -	sdrc_init_params = sp; +	sdrc_init_params_cs0 = sdrc_cs0; +	sdrc_init_params_cs1 = sdrc_cs1;  	/* XXX Enable SRFRONIDLEREQ here also? */ +	/* +	 * PWDENA should not be set due to 34xx erratum 1.150 - PWDENA +	 * can cause random memory corruption +	 */  	l = (1 << SDRC_POWER_EXTCLKDIS_SHIFT) | -		(1 << SDRC_POWER_PWDENA_SHIFT) |  		(1 << SDRC_POWER_PAGEPOLICY_SHIFT);  	sdrc_write_reg(l, SDRC_POWER);  }  |