提交 13d5e27a 编写于 作者: S Sekhar Nori 提交者: Kevin Hilman

davinci: DA850/OMAP-L138: avoid using separate initcall for initializing regulator

Using a device_initcall() for initializing the voltage regulator
on DA850 is not such a good idea because it gets called for all
platforms - even those who do not have a regulator implemented.
This leads to a big fat warning message during boot-up when
regulator cannot be found.

Instead, tie initialization of voltage regulator to cpufreq init.
Define a platform specific init call which in case of DA850 gets
used for initializing the regulator. On other future platforms it
can be used for other purposes.
Signed-off-by: NSekhar Nori <nsekhar@ti.com>
Signed-off-by: NKevin Hilman <khilman@deeprootsystems.com>
上级 5aeb15aa
...@@ -127,6 +127,13 @@ static int __init davinci_cpu_init(struct cpufreq_policy *policy) ...@@ -127,6 +127,13 @@ static int __init davinci_cpu_init(struct cpufreq_policy *policy)
if (policy->cpu != 0) if (policy->cpu != 0)
return -EINVAL; return -EINVAL;
/* Finish platform specific initialization */
if (pdata->init) {
result = pdata->init();
if (result)
return result;
}
policy->cur = policy->min = policy->max = davinci_getspeed(0); policy->cur = policy->min = policy->max = davinci_getspeed(0);
if (freq_table) { if (freq_table) {
......
...@@ -907,8 +907,39 @@ static struct cpufreq_frequency_table da850_freq_table[] = { ...@@ -907,8 +907,39 @@ static struct cpufreq_frequency_table da850_freq_table[] = {
}, },
}; };
#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 da850_regulator_init(void)
{
cvdd = regulator_get(NULL, "cvdd");
if (WARN(IS_ERR(cvdd), "Unable to obtain voltage regulator for CVDD;"
" voltage scaling unsupported\n")) {
return PTR_ERR(cvdd);
}
return 0;
}
#endif
static struct davinci_cpufreq_config cpufreq_info = { static struct davinci_cpufreq_config cpufreq_info = {
.freq_table = &da850_freq_table[0], .freq_table = &da850_freq_table[0],
#ifdef CONFIG_REGULATOR
.init = da850_regulator_init,
.set_voltage = da850_set_voltage,
#endif
}; };
static struct platform_device da850_cpufreq_device = { static struct platform_device da850_cpufreq_device = {
...@@ -997,39 +1028,6 @@ static int da850_round_armrate(struct clk *clk, unsigned long rate) ...@@ -997,39 +1028,6 @@ static int da850_round_armrate(struct clk *clk, unsigned long rate)
} }
#endif #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 = { static struct davinci_soc_info davinci_soc_info_da850 = {
.io_desc = da850_io_desc, .io_desc = da850_io_desc,
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
struct davinci_cpufreq_config { struct davinci_cpufreq_config {
struct cpufreq_frequency_table *freq_table; struct cpufreq_frequency_table *freq_table;
int (*set_voltage) (unsigned int index); int (*set_voltage) (unsigned int index);
int (*init) (void);
}; };
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册