aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Kozlowski <k.kozlowski@samsung.com>2015-10-08 01:34:03 -0400
committerEduardo Valentin <edubezval@gmail.com>2015-11-04 14:08:30 -0500
commit9e4249b4034090730017deaf632b46b5faaa12b9 (patch)
treee8ab29f52feded0050e8385ef420e653ee3eeca1
parent824ead03b78403a21449cb7eb153a4344cd3b4c8 (diff)
thermal: exynos: Fix first temperature read after registering sensor
Thermal core could not read the temperature after registering the thermal sensor with thermal_zone_of_sensor_register() because the driver was not yet initialized. The call trace looked like: exynos_tmu_probe() thermal_zone_of_sensor_register() of_thermal_set_mode() thermal_zone_device_update() exynos_get_temp() if (!data->tmu_read) return -EINVAL; exynos_map_dt_data() data->tmu_read = ... This produced an error in dmesg: thermal thermal_zone0: failed to read out thermal zone (-22) Register the thermal_zone_device later, after parsing Device Tree and enabling necessary clocks, but before calling exynos_tmu_initialize() which uses the registered thermal_zone_device. Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com> Tested-by: Alim Akhtar <alim.akhtar@samsung.com> Acked-by: Lukasz Majewski <l.majewski@samsung.com> Tested-by: Lukasz Majewski <l.majewski@samsung.com> Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Fixes: 3b6a1a805f34 ("thermal: samsung: core: Exynos TMU rework to use device tree for configuration") Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
-rw-r--r--drivers/thermal/samsung/exynos_tmu.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index 23f4320f8ef7..bc71a61f0c4a 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -1289,13 +1289,6 @@ static int exynos_tmu_probe(struct platform_device *pdev)
1289 platform_set_drvdata(pdev, data); 1289 platform_set_drvdata(pdev, data);
1290 mutex_init(&data->lock); 1290 mutex_init(&data->lock);
1291 1291
1292 data->tzd = thermal_zone_of_sensor_register(&pdev->dev, 0, data,
1293 &exynos_sensor_ops);
1294 if (IS_ERR(data->tzd)) {
1295 pr_err("thermal: tz: %p ERROR\n", data->tzd);
1296 return PTR_ERR(data->tzd);
1297 }
1298
1299 /* 1292 /*
1300 * Try enabling the regulator if found 1293 * Try enabling the regulator if found
1301 * TODO: Add regulator as an SOC feature, so that regulator enable 1294 * TODO: Add regulator as an SOC feature, so that regulator enable
@@ -1365,21 +1358,36 @@ static int exynos_tmu_probe(struct platform_device *pdev)
1365 break; 1358 break;
1366 }; 1359 };
1367 1360
1361 /*
1362 * data->tzd must be registered before calling exynos_tmu_initialize(),
1363 * requesting irq and calling exynos_tmu_control().
1364 */
1365 data->tzd = thermal_zone_of_sensor_register(&pdev->dev, 0, data,
1366 &exynos_sensor_ops);
1367 if (IS_ERR(data->tzd)) {
1368 ret = PTR_ERR(data->tzd);
1369 dev_err(&pdev->dev, "Failed to register sensor: %d\n", ret);
1370 goto err_sclk;
1371 }
1372
1368 ret = exynos_tmu_initialize(pdev); 1373 ret = exynos_tmu_initialize(pdev);
1369 if (ret) { 1374 if (ret) {
1370 dev_err(&pdev->dev, "Failed to initialize TMU\n"); 1375 dev_err(&pdev->dev, "Failed to initialize TMU\n");
1371 goto err_sclk; 1376 goto err_thermal;
1372 } 1377 }
1373 1378
1374 ret = devm_request_irq(&pdev->dev, data->irq, exynos_tmu_irq, 1379 ret = devm_request_irq(&pdev->dev, data->irq, exynos_tmu_irq,
1375 IRQF_TRIGGER_RISING | IRQF_SHARED, dev_name(&pdev->dev), data); 1380 IRQF_TRIGGER_RISING | IRQF_SHARED, dev_name(&pdev->dev), data);
1376 if (ret) { 1381 if (ret) {
1377 dev_err(&pdev->dev, "Failed to request irq: %d\n", data->irq); 1382 dev_err(&pdev->dev, "Failed to request irq: %d\n", data->irq);
1378 goto err_sclk; 1383 goto err_thermal;
1379 } 1384 }
1380 1385
1381 exynos_tmu_control(pdev, true); 1386 exynos_tmu_control(pdev, true);
1382 return 0; 1387 return 0;
1388
1389err_thermal:
1390 thermal_zone_of_sensor_unregister(&pdev->dev, data->tzd);
1383err_sclk: 1391err_sclk:
1384 clk_disable_unprepare(data->sclk); 1392 clk_disable_unprepare(data->sclk);
1385err_clk: 1393err_clk:
@@ -1390,7 +1398,6 @@ err_clk_sec:
1390err_sensor: 1398err_sensor:
1391 if (!IS_ERR_OR_NULL(data->regulator)) 1399 if (!IS_ERR_OR_NULL(data->regulator))
1392 regulator_disable(data->regulator); 1400 regulator_disable(data->regulator);
1393 thermal_zone_of_sensor_unregister(&pdev->dev, data->tzd);
1394 1401
1395 return ret; 1402 return ret;
1396} 1403}