ARM: OMAP2+: Export SoC information to userspace
[pandora-kernel.git] / arch / arm / mach-omap2 / sdram-nokia.c
index 690202b..14caa22 100644 (file)
@@ -22,6 +22,7 @@
 #include <plat/clock.h>
 #include <plat/sdrc.h>
 
+#include "sdram-nokia.h"
 
 /* In picoseconds, except for tREF (ns), tXP, tCKE, tWTR (clks) */
 struct sdram_timings {
@@ -43,9 +44,28 @@ struct sdram_timings {
        u32 tWTR;
 };
 
-static struct omap_sdrc_params nokia_sdrc_params[4];
+static const struct sdram_timings nokia_97dot6mhz_timings[] = {
+       {
+               .casl = 3,
+               .tDAL = 30725,
+               .tDPL = 15362,
+               .tRRD = 10241,
+               .tRCD = 20483,
+               .tRP = 15362,
+               .tRAS = 40967,
+               .tRC = 56330,
+               .tRFC = 138266,
+               .tXSR = 204839,
+
+               .tREF = 7798,
+
+               .tXP = 2,
+               .tCKE = 4,
+               .tWTR = 2,
+       },
+};
 
-static const struct sdram_timings memory_timings[] = {
+static const struct sdram_timings nokia_166mhz_timings[] = {
        {
                .casl = 3,
                .tDAL = 33000,
@@ -66,6 +86,38 @@ static const struct sdram_timings memory_timings[] = {
        },
 };
 
+static const struct sdram_timings nokia_195dot2mhz_timings[] = {
+       {
+               .casl = 3,
+               .tDAL = 30725,
+               .tDPL = 15362,
+               .tRRD = 10241,
+               .tRCD = 20483,
+               .tRP = 15362,
+               .tRAS = 40967,
+               .tRC = 56330,
+               .tRFC = 138266,
+               .tXSR = 204839,
+
+               .tREF = 7752,
+
+               .tXP = 2,
+               .tCKE = 4,
+               .tWTR = 2,
+       },
+};
+
+static const struct {
+       long rate;
+       struct sdram_timings const *data;
+} nokia_timings[] = {
+       { 83000000, nokia_166mhz_timings },
+       { 97600000, nokia_97dot6mhz_timings },
+       { 166000000, nokia_166mhz_timings },
+       { 195200000, nokia_195dot2mhz_timings },
+};
+static struct omap_sdrc_params nokia_sdrc_params[ARRAY_SIZE(nokia_timings) + 1];
+
 static unsigned long sdrc_get_fclk_period(long rate)
 {
        /* In picoseconds */
@@ -159,7 +211,8 @@ static int set_sdrc_timing_regval_ps(u32 *regval, int st_bit, int end_bit,
                err = -1;
 #endif
 
-static int sdrc_timings(int id, long rate)
+static int sdrc_timings(int id, long rate,
+                       const struct sdram_timings *memory_timings)
 {
        u32 ticks_per_ms;
        u32 rfr, l;
@@ -210,12 +263,17 @@ static int sdrc_timings(int id, long rate)
 
 struct omap_sdrc_params *nokia_get_sdram_timings(void)
 {
-       int err;
+       int err = 0;
+       int i;
 
-       err = sdrc_timings(0, 41500000);
-       err |= sdrc_timings(1, 83000000);
-       err |= sdrc_timings(2, 166000000);
+       for (i = 0; i < ARRAY_SIZE(nokia_timings); i++) {
+               err |= sdrc_timings(i, nokia_timings[i].rate,
+                                      nokia_timings[i].data);
+               if (err)
+                       pr_err("%s: error with rate %ld: %d\n", __func__,
+                              nokia_timings[i].rate, err);
+       }
 
-       return &nokia_sdrc_params[0];
+       return err ? NULL : nokia_sdrc_params;
 }