]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
OMAP2 SDRC: add SDRAM timing parameter infrastructure
authorPaul Walmsley <paul@pwsan.com>
Tue, 8 Jul 2008 02:54:47 +0000 (20:54 -0600)
committerTony Lindgren <tony@atomide.com>
Tue, 5 Aug 2008 12:05:01 +0000 (15:05 +0300)
For a given SDRAM clock rate, SDRAM chips require memory controllers
to use a specific set of timing minimums and maximums to transfer data
reliably.  These parameters can be different for different memory chips
and can also potentially vary by board.

This patch adds the infrastructure for board-*.c files to pass this
timing data to the SDRAM controller init function.  The timing data is
specified in an 'omap_sdrc_params' structure, in terms of SDRC
controller register values.  An array of these structs, one per SDRC
target clock rate, is passed by the board-*.c file to
omap2_init_common_hw().

This patch does not define the values for different memory chips, nor
does it use the values for anything; those will come in subsequent patches.

Signed-off-by: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
14 files changed:
arch/arm/mach-omap2/board-2430sdp.c
arch/arm/mach-omap2/board-3430sdp.c
arch/arm/mach-omap2/board-apollon.c
arch/arm/mach-omap2/board-generic.c
arch/arm/mach-omap2/board-h4.c
arch/arm/mach-omap2/board-ldp.c
arch/arm/mach-omap2/board-n800.c
arch/arm/mach-omap2/board-omap2evm.c
arch/arm/mach-omap2/board-omap3beagle.c
arch/arm/mach-omap2/board-omap3evm.c
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/sdrc.c
include/asm-arm/arch-omap/io.h
include/asm-arm/arch-omap/sdrc.h

index 780913e7446740fcb2e54dc7381c103224eca3bd..b2f8b9ccd75f0ad46e28209b07c114e13fc75c75 100644 (file)
@@ -347,7 +347,7 @@ out:
 
 static void __init omap_2430sdp_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
        sdp2430_init_smc91x();
index f6cd08b05bacedfc5417177a2b42b9222073f1d1..19549d7f8726fcb1d15eb165b55bc0ed1cc76281 100644 (file)
@@ -248,7 +248,7 @@ static inline void __init sdp3430_init_smc91x(void)
 
 static void __init omap_3430sdp_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
        sdp3430_init_smc91x();
index a06654a0b5d87940ce75d19f069b263e10ba9f05..41542a034a26a1ac8682a631bb2213f48ce48b55 100644 (file)
@@ -323,7 +323,7 @@ out:
 
 static void __init omap_apollon_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
        apollon_init_smc91x();
index 6e7b13215c4cf3f7e852654c2bcd85a6eae142ca..4df4e7bb2c531e0d4ef82136d9aaa85c8fbd3a1f 100644 (file)
@@ -33,7 +33,7 @@
 
 static void __init omap_generic_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
 }
 
index c17446795baea7bf6694a40389663bc99f28d5d2..6dd4667108895df5fd24c05a532246128efc18cb 100644 (file)
@@ -376,7 +376,7 @@ static void __init h4_init_flash(void)
 
 static void __init omap_h4_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
        h4_init_flash();
index 2ac4c9b2e6908c2dadbdb1f9301bbb3a064e7f95..1998d62c46c14b2bd5ad8123a49d53ab42455bcb 100644 (file)
@@ -191,7 +191,7 @@ static struct platform_device *ldp_devices[] __initdata = {
 
 static void __init omap_ldp_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
 }
index 2baaf048196d3220cf5c58f7bb3cff91be3ce3ed..433bd8e6b5a332275945d401ec7c50b9eb6cad1d 100644 (file)
@@ -122,7 +122,7 @@ static struct lm8323_platform_data lm8323_pdata = {
 
 void __init nokia_n800_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
 
index bcdf4a6a2e7a8664d6b015cec74599495dc48216..0baf704e3f8094dadca9244a511e431aa692bc93 100644 (file)
@@ -64,7 +64,7 @@ static inline void __init omap2evm_init_smc911x(void)
 
 static void __init omap2_evm_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
        omap2evm_init_smc911x();
index 6981dc366c5e6040a6803b165bed700b899c79aa..eeadf2b3058465ab5923a7666b487de2414b22a2 100644 (file)
@@ -111,7 +111,7 @@ static int __init omap3_beagle_i2c_init(void)
 
 static void __init omap3_beagle_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
 }
index 0061512d9c29d3c7a8e32e207e2ce5d315a26704..1ba8a45473209a038a54b4b5ccdd007cf8217508 100644 (file)
@@ -188,7 +188,7 @@ static struct platform_device omap3evm_kp_device = {
 
 static void __init omap3_evm_init_irq(void)
 {
-       omap2_init_common_hw();
+       omap2_init_common_hw(NULL);
        omap_init_irq();
        omap_gpio_init();
        omap3evm_init_smc911x();
index e3dcff9172610dd96c94451efb0f8f5dcccaee9f..e0191aa3a144c683d0d080ac475f016280965558 100644 (file)
@@ -194,12 +194,12 @@ void __init omap2_map_common_io(void)
        omapfb_reserve_sdram();
 }
 
-void __init omap2_init_common_hw(void)
+void __init omap2_init_common_hw(struct omap_sdrc_params *sp)
 {
        omap2_mux_init();
        pwrdm_init(powerdomains_omap);
        clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps);
        omap2_clk_init();
-       omap2_sdrc_init();
+       omap2_sdrc_init(sp);
        gpmc_init();
 }
index 0f17716218c3ccc70aea5df56d52d6b7f27d7bf2..7c2e36cf516a0f0e26bfe9a9ae49436803f8a624 100644 (file)
@@ -12,6 +12,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+#undef DEBUG
 
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <asm/arch/sdrc.h>
 #include "sdrc.h"
 
+static struct omap_sdrc_params *sdrc_init_params;
+
 void __iomem *omap2_sdrc_base;
 void __iomem *omap2_sms_base;
 
+
+/**
+ * omap2_sdrc_get_params - return SDRC register values for a given clock rate
+ * @r: SDRC clock rate (in Hz)
+ *
+ * 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.
+ */
+struct omap_sdrc_params *omap2_sdrc_get_params(unsigned long r)
+{
+       struct omap_sdrc_params *sp;
+
+       sp = sdrc_init_params;
+
+       while (sp->rate != r)
+               sp++;
+
+       if (!sp->rate)
+               return NULL;
+
+       return sp;
+}
+
+
 void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals)
 {
        omap2_sdrc_base = omap2_globals->sdrc;
@@ -41,7 +75,7 @@ void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals)
 }
 
 /* turn on smart idle modes for SDRAM scheduler and controller */
-void __init omap2_sdrc_init(void)
+void __init omap2_sdrc_init(struct omap_sdrc_params *sp)
 {
        u32 l;
 
@@ -54,4 +88,6 @@ void __init omap2_sdrc_init(void)
        l &= ~(0x3 << 3);
        l |= (0x2 << 3);
        sdrc_write_reg(l, SDRC_SYSCONFIG);
+
+       sdrc_init_params = sp;
 }
index 0b13557fd30b90469b8347eed745081f5b87248f..1a14b4c14748d0521f6c2a8721ad1ad7ab0e5379 100644 (file)
 #define omap_writew(v,a)       (*(volatile unsigned short *)IO_ADDRESS(a) = (v))
 #define omap_writel(v,a)       (*(volatile unsigned int   *)IO_ADDRESS(a) = (v))
 
+struct omap_sdrc_params;
+
 extern void omap1_map_common_io(void);
 extern void omap1_init_common_hw(void);
 
 extern void omap2_map_common_io(void);
-extern void omap2_init_common_hw(void);
+extern void omap2_init_common_hw(struct omap_sdrc_params *sp);
 
 #endif
 
index c75caf5f0660923829b9d1dfd333704d54576f67..00ba5395b26babdb89146361a0bec6b8e5cbda98 100644 (file)
 
 #ifndef __ASSEMBLER__
 
+/**
+ * struct omap_sdrc_params - SDRC parameters for a given SDRC clock rate
+ * @rate: SDRC clock rate (in Hz)
+ * @actim_ctrla: Value to program to SDRC_ACTIM_CTRLA for this rate
+ * @actim_ctrlb: Value to program to SDRC_ACTIM_CTRLB for this rate
+ * @rfr_ctrl: Value to program to SDRC_RFR_CTRL for this rate
+ * @mr: Value to program to SDRC_MR for this rate
+ *
+ * This structure holds a pre-computed set of register values for the
+ * SDRC for a given SDRC clock rate and SDRAM chip.  These are
+ * intended to be pre-computed and specified in an array in the board-*.c
+ * files.  The structure is keyed off the 'rate' field.
+ */
+struct omap_sdrc_params {
+       unsigned long rate;
+       u32 actim_ctrla;
+       u32 actim_ctrlb;
+       u32 rfr_ctrl;
+       u32 mr;
+};
+
 void __init omap2_sdrc_init(void);
+struct omap_sdrc_params *omap2_sdrc_get_params(unsigned long r);
 
 #ifdef CONFIG_ARCH_OMAP2