فهرست منبع

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: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Sekhar Nori 15 سال پیش
والد
کامیت
13d5e27a44
3فایلهای تغییر یافته به همراه39 افزوده شده و 33 حذف شده
  1. 7 0
      arch/arm/mach-davinci/cpufreq.c
  2. 31 33
      arch/arm/mach-davinci/da850.c
  3. 1 0
      arch/arm/mach-davinci/include/mach/cpufreq.h

+ 7 - 0
arch/arm/mach-davinci/cpufreq.c

@@ -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) {

+ 31 - 33
arch/arm/mach-davinci/da850.c

@@ -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)
 }
 }
 #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,

+ 1 - 0
arch/arm/mach-davinci/include/mach/cpufreq.h

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