From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752261AbbJHFgT (ORCPT ); Thu, 8 Oct 2015 01:36:19 -0400 Received: from mailout2.w1.samsung.com ([210.118.77.12]:26171 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751641AbbJHFfK (ORCPT ); Thu, 8 Oct 2015 01:35:10 -0400 X-AuditID: cbfec7f5-f794b6d000001495-13-5616008befd0 From: Krzysztof Kozlowski To: Lukasz Majewski , Zhang Rui , Eduardo Valentin , Kukjin Kim , Krzysztof Kozlowski , linux-pm@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/5] thermal: exynos: Fix first temperature read after registering sensor Date: Thu, 08 Oct 2015 14:34:03 +0900 Message-id: <1444282446-6419-2-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1444282446-6419-1-git-send-email-k.kozlowski@samsung.com> References: <1444282446-6419-1-git-send-email-k.kozlowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprMLMWRmVeSWpSXmKPExsVy+t/xa7rdDGJhBrs+qlrMv3KN1eL1C0OL /sevmS3ePNzMaLHpMVDo8q45bBafe48wWsw4v4/J4snDPjYHTo+ds+6yeyze85LJY9OqTjaP zUvqPfq2rGL0+LxJLoAtissmJTUnsyy1SN8ugStj63n3goMSFZN+bmZqYLwv3MXIwSEhYCJx cJtzFyMnkCkmceHeejYQW0hgKaPE9lbmLkYuIPs/o8SXa/eYQRJsAsYSm5cvYQNJiAicYZI4 2bGVESQhLBAt8eTSexYQm0VAVWLLwntgNq+Am8Tlt7eYIDbISZw8NpkVxOYUcJd4d+MwI8Q2 N4m1C+axTmDkWcDIsIpRNLU0uaA4KT3XSK84Mbe4NC9dLzk/dxMjJKi+7mBceszqEKMAB6MS D+8PY5EwIdbEsuLK3EOMEhzMSiK8O+eLhgnxpiRWVqUW5ccXleakFh9ilOZgURLnnbnrfYiQ QHpiSWp2ampBahFMlomDU6qBMf7T1Y/Sl1fFujyRXyd4gD9l2u0LskdyFtXbPlu1Vj2WY/cK /8UegjYbAmszz/6esbu2NjCkKePB27NLG89E206ZslgtTjTWNPDHmffXyup/7ypdK109Iad7 Xr5mU8WfgiWMV6YE/jw74VmJVvMMbRbx5n6ly/XnOR9a73E7KdNUuelV6/L1V5RYijMSDbWY i4oTASQucMomAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. Signed-off-by: Krzysztof Kozlowski Fixes: 3b6a1a805f34 ("thermal: samsung: core: Exynos TMU rework to use device tree for configuration") --- drivers/thermal/samsung/exynos_tmu.c | 27 +++++++++++++++++---------- 1 file 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) platform_set_drvdata(pdev, data); mutex_init(&data->lock); - data->tzd = thermal_zone_of_sensor_register(&pdev->dev, 0, data, - &exynos_sensor_ops); - if (IS_ERR(data->tzd)) { - pr_err("thermal: tz: %p ERROR\n", data->tzd); - return PTR_ERR(data->tzd); - } - /* * Try enabling the regulator if found * TODO: Add regulator as an SOC feature, so that regulator enable @@ -1365,21 +1358,36 @@ static int exynos_tmu_probe(struct platform_device *pdev) break; }; + /* + * data->tzd must be registered before calling exynos_tmu_initialize(), + * requesting irq and calling exynos_tmu_control(). + */ + data->tzd = thermal_zone_of_sensor_register(&pdev->dev, 0, data, + &exynos_sensor_ops); + if (IS_ERR(data->tzd)) { + ret = PTR_ERR(data->tzd); + dev_err(&pdev->dev, "Failed to register sensor: %d\n", ret); + goto err_sclk; + } + ret = exynos_tmu_initialize(pdev); if (ret) { dev_err(&pdev->dev, "Failed to initialize TMU\n"); - goto err_sclk; + goto err_thermal; } ret = devm_request_irq(&pdev->dev, data->irq, exynos_tmu_irq, IRQF_TRIGGER_RISING | IRQF_SHARED, dev_name(&pdev->dev), data); if (ret) { dev_err(&pdev->dev, "Failed to request irq: %d\n", data->irq); - goto err_sclk; + goto err_thermal; } exynos_tmu_control(pdev, true); return 0; + +err_thermal: + thermal_zone_of_sensor_unregister(&pdev->dev, data->tzd); err_sclk: clk_disable_unprepare(data->sclk); err_clk: @@ -1390,7 +1398,6 @@ err_clk_sec: err_sensor: if (!IS_ERR_OR_NULL(data->regulator)) regulator_disable(data->regulator); - thermal_zone_of_sensor_unregister(&pdev->dev, data->tzd); return ret; } -- 1.9.1