diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index 49dcc71168c7b97491cb57c47ed29eb8575a2c07..0e1027ea8a408c0dcd3dec3cbd86f9f6d3487312 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -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),