From: Paul Walmsley <[email protected]>

Sometimes, the automatic voltage scaling control loop parameters in
the SoC eFuse data are not present or are incorrect.  Nevertheless,
some boards may wish to use SmartReflex anyway, with conservative
values provided by the SoC manufacturer.  This patch adds code to
allow board files to specify or override the SmartReflex eFuse data.

Signed-off-by: Paul Walmsley <[email protected]>
Signed-off-by: Jean Pihet <[email protected]>
Cc: Thara Gopinath <[email protected]>
Cc: Nishanth Menon <[email protected]>
Cc: Kevin Hilman <[email protected]>
---
 arch/arm/mach-omap2/sr_device.c |   40 ++++++++++++++++++++++----------------
 arch/arm/mach-omap2/voltage.h   |    2 +
 2 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c
index 8fe836f..2dec827 100644
--- a/arch/arm/mach-omap2/sr_device.c
+++ b/arch/arm/mach-omap2/sr_device.c
@@ -7,8 +7,9 @@
  * Copyright (C) 2010 Texas Instruments, Inc.
  * Thara Gopinath <[email protected]>
  *
- * Copyright (C) 2008 Nokia Corporation
+ * Copyright (C) 2008, 2011 Nokia Corporation
  * Kalle Jokiniemi
+ * Paul Walmsley
  *
  * Copyright (C) 2007 Texas Instruments, Inc.
  * Lesly A M <[email protected]>
@@ -54,31 +55,36 @@ static void __init sr_set_nvalues(struct omap_volt_data 
*volt_data,
        for (i = 0, j = 0; i < count; i++) {
                u32 v;
 
-               /*
-                * In OMAP4 the efuse registers are 24 bit aligned.
-                * A __raw_readl will fail for non-32 bit aligned address
-                * and hence the 8-bit read and shift.
-                */
-               if (cpu_is_omap44xx()) {
-                       u16 offset = volt_data[i].sr_efuse_offs;
-
-                       v = omap_ctrl_readb(offset) |
-                               omap_ctrl_readb(offset + 1) << 8 |
-                               omap_ctrl_readb(offset + 2) << 16;
+               if (volt_data[i].sr_nvalue != 0) {
+                       v = volt_data[i].sr_nvalue;
                } else {
-                       v = omap_ctrl_readl(volt_data[i].sr_efuse_offs);
+                       /*
+                        * In OMAP4 the efuse registers are 24 bit
+                        * aligned.  A __raw_readl will fail for
+                        * non-32 bit aligned address and hence the
+                        * 8-bit read and shift.
+                        */
+                       if (cpu_is_omap44xx()) {
+                               u16 offset = volt_data[i].sr_efuse_offs;
+
+                               v = omap_ctrl_readb(offset) |
+                                       omap_ctrl_readb(offset + 1) << 8 |
+                                       omap_ctrl_readb(offset + 2) << 16;
+                       } else {
+                               v = omap_ctrl_readl(volt_data[i].sr_efuse_offs);
+                       }
                }
 
                /*
                 * Many OMAP SoCs don't have the eFuse values set.
                 * For example, pretty much all OMAP3xxx before
                 * ES3.something.
-                *
-                * XXX There needs to be some way for board files or
-                * userspace to add these in.
                 */
-               if (v == 0)
+               if (v == 0) {
+                       pr_debug("SR: %s: voltage %d: no N value; skipping\n",
+                                sr_data->voltdm->name, 
volt_data[i].volt_nominal);
                        continue;
+               }
 
                nvalue_table[j].nvalue = v;
                nvalue_table[j].errminlimit = volt_data[i].sr_errminlimit;
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index 16a1b09..ebd8899 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -96,6 +96,7 @@ struct voltagedomain {
  * @sr_efuse_offs:     The offset of the efuse register(from system
  *                     control module base address) from where to read
  *                     the n-target value for the smartreflex module.
+ * @sr_nvalue: the SR N value for this OPP.  Use to override bogus eFuse vals
  * @sr_errminlimit:    Error min limit value for smartreflex. This value
  *                     differs at differnet opp and thus is linked
  *                     with voltage.
@@ -105,6 +106,7 @@ struct voltagedomain {
 struct omap_volt_data {
        u32     volt_nominal;
        u32     sr_efuse_offs;
+       u32     sr_nvalue;
        u8      sr_errminlimit;
        u8      vp_errgain;
 };
-- 
1.7.5.4

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

Reply via email to