This patch adds support for regulating the CVDD voltage for the
DA850/OMAP-L138 platform.

The CVDD min and max values for each OPP have been obtained from
section 5.2 "Recommended Operating Conditions" of SPRS586

Signed-off-by: Sekhar Nori <[email protected]>
---
 arch/arm/mach-davinci/da850.c |   43 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
index 49dcc71..0e1027e 100644
--- a/arch/arm/mach-davinci/da850.c
+++ b/arch/arm/mach-davinci/da850.c
@@ -16,6 +16,7 @@
 #include <linux/clk.h>
 #include <linux/platform_device.h>
 #include <linux/cpufreq.h>
+#include <linux/regulator/consumer.h>
 
 #include <asm/mach/map.h>
 
@@ -844,6 +845,8 @@ struct da850_opp {
        unsigned int    prediv;
        unsigned int    mult;
        unsigned int    postdiv;
+       unsigned int    cvdd_min; /* in uV */
+       unsigned int    cvdd_max; /* in uV */
 };
 
 static const struct da850_opp da850_opp_300 = {
@@ -851,6 +854,8 @@ static const struct da850_opp da850_opp_300 = {
        .prediv         = 1,
        .mult           = 25,
        .postdiv        = 2,
+       .cvdd_min       = 1140000,
+       .cvdd_max       = 1320000,
 };
 
 static const struct da850_opp da850_opp_200 = {
@@ -858,6 +863,8 @@ static const struct da850_opp da850_opp_200 = {
        .prediv         = 1,
        .mult           = 25,
        .postdiv        = 3,
+       .cvdd_min       = 1050000,
+       .cvdd_max       = 1160000,
 };
 
 static const struct da850_opp da850_opp_96 = {
@@ -865,6 +872,8 @@ static const struct da850_opp da850_opp_96 = {
        .prediv         = 1,
        .mult           = 20,
        .postdiv        = 5,
+       .cvdd_min       = 950000,
+       .cvdd_max       = 1050000,
 };
 
 #define OPP(freq)              \
@@ -973,6 +982,40 @@ static int da850_round_armrate(struct clk *clk, unsigned 
long rate)
 }
 #endif
 
+#ifdef CONFIG_REGULATOR
+static struct regulator *cvdd;
+
+static int da850_set_voltage(unsigned int index)
+{
+       struct da850_opp *opp;
+
+       if (!cvdd)
+               return -ENODEV;
+
+       opp = (struct da850_opp *) da850_freq_table[index].index;
+
+       return regulator_set_voltage(cvdd, opp->cvdd_min, opp->cvdd_max);
+}
+
+static int __init da850_regulator_init(void)
+{
+       int ret = 0;
+
+       cvdd = regulator_get(NULL, "cvdd");
+       if (WARN(IS_ERR(cvdd), "Unable to obtain voltage regulator for CVDD;"
+                                       " voltage scaling unsupported\n")) {
+               ret = PTR_ERR(cvdd);
+               goto out;
+       }
+
+       cpufreq_info.set_voltage = da850_set_voltage;
+
+out:
+       return ret;
+}
+device_initcall(da850_regulator_init);
+#endif
+
 static struct davinci_soc_info davinci_soc_info_da850 = {
        .io_desc                = da850_io_desc,
        .io_desc_num            = ARRAY_SIZE(da850_io_desc),
-- 
1.6.2.4

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to