From patchwork Thu Oct 8 05:34:03 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 7349041 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3638A9F1B9 for ; Thu, 8 Oct 2015 05:36:38 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4F13F2058C for ; Thu, 8 Oct 2015 05:36:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5D55B2056C for ; Thu, 8 Oct 2015 05:36:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752225AbbJHFgT (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 Received: from eucpsbgm2.samsung.com (unknown [203.254.199.245]) by mailout2.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NVV00JVDZIJZY10@mailout2.w1.samsung.com>; Thu, 08 Oct 2015 06:35:08 +0100 (BST) X-AuditID: cbfec7f5-f794b6d000001495-13-5616008befd0 Received: from eusync4.samsung.com ( [203.254.199.214]) by eucpsbgm2.samsung.com (EUCPMTA) with SMTP id 68.AD.05269.B8006165; Thu, 8 Oct 2015 06:35:07 +0100 (BST) Received: from localhost.localdomain ([10.252.80.64]) by eusync4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NVV001ENZIA2J60@eusync4.samsung.com>; Thu, 08 Oct 2015 06:35:07 +0100 (BST) 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-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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") Reviewed-by: Alim Akhtar Tested-by: Alim Akhtar Acked-by: Lukasz Majewski Tested-by: Lukasz Majewski --- 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; }