提交 f1553334 编写于 作者: E Eduardo Valentin 提交者: Greg Kroah-Hartman

staging: ti-soc-thermal: defer probe if cpufreq is not ready

When builtin compiled, there is a chance for this driver
be probed before cpufreq driver is up and running. In this
case, the cpucooling device can be wrong initialized.

Thus, this patch makes sure this driver is probed only
when cpufreq driver is ready. Whenever there is no
cpufreq driver registered, the probe will return -EPROBE_DEFER.
Tested-by: NJ Keerthy <j-keerthy@ti.com>
Signed-off-by: NEduardo Valentin <eduardo.valentin@ti.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 537eb936
...@@ -1305,12 +1305,18 @@ int ti_bandgap_probe(struct platform_device *pdev) ...@@ -1305,12 +1305,18 @@ int ti_bandgap_probe(struct platform_device *pdev)
for (i = 0; i < bgp->conf->sensor_count; i++) { for (i = 0; i < bgp->conf->sensor_count; i++) {
char *domain; char *domain;
if (bgp->conf->sensors[i].register_cooling) if (bgp->conf->sensors[i].register_cooling) {
bgp->conf->sensors[i].register_cooling(bgp, i); ret = bgp->conf->sensors[i].register_cooling(bgp, i);
if (ret)
goto remove_sensors;
}
domain = bgp->conf->sensors[i].domain; if (bgp->conf->expose_sensor) {
if (bgp->conf->expose_sensor) domain = bgp->conf->sensors[i].domain;
bgp->conf->expose_sensor(bgp, i, domain); ret = bgp->conf->expose_sensor(bgp, i, domain);
if (ret)
goto remove_last_cooling;
}
} }
/* /*
...@@ -1329,6 +1335,17 @@ int ti_bandgap_probe(struct platform_device *pdev) ...@@ -1329,6 +1335,17 @@ int ti_bandgap_probe(struct platform_device *pdev)
return 0; return 0;
remove_last_cooling:
if (bgp->conf->sensors[i].unregister_cooling)
bgp->conf->sensors[i].unregister_cooling(bgp, i);
remove_sensors:
for (i--; i >= 0; i--) {
if (bgp->conf->sensors[i].unregister_cooling)
bgp->conf->sensors[i].unregister_cooling(bgp, i);
if (bgp->conf->remove_sensor)
bgp->conf->remove_sensor(bgp, i);
}
ti_bandgap_power(bgp, false);
disable_clk: disable_clk:
if (TI_BANDGAP_HAS(bgp, CLK_CTRL)) if (TI_BANDGAP_HAS(bgp, CLK_CTRL))
clk_disable_unprepare(bgp->fclock); clk_disable_unprepare(bgp->fclock);
......
...@@ -339,6 +339,11 @@ int ti_thermal_register_cpu_cooling(struct ti_bandgap *bgp, int id) ...@@ -339,6 +339,11 @@ int ti_thermal_register_cpu_cooling(struct ti_bandgap *bgp, int id)
if (!data) if (!data)
return -EINVAL; return -EINVAL;
if (!cpufreq_get_current_driver()) {
dev_dbg(bgp->dev, "no cpufreq driver yet\n");
return -EPROBE_DEFER;
}
/* Register cooling device */ /* Register cooling device */
data->cool_dev = cpufreq_cooling_register(cpu_present_mask); data->cool_dev = cpufreq_cooling_register(cpu_present_mask);
if (IS_ERR_OR_NULL(data->cool_dev)) { if (IS_ERR_OR_NULL(data->cool_dev)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册