From patchwork Thu Nov 30 09:17:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 10084453 X-Patchwork-Delegate: eduardo.valentin@ti.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8A6F56035E for ; Thu, 30 Nov 2017 09:17:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 90CF229F0D for ; Thu, 30 Nov 2017 09:17:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8582E29F17; Thu, 30 Nov 2017 09:17:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9071929F0D for ; Thu, 30 Nov 2017 09:17:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752305AbdK3JRr (ORCPT ); Thu, 30 Nov 2017 04:17:47 -0500 Received: from antares.kleine-koenig.org ([94.130.110.236]:36750 "EHLO antares.kleine-koenig.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752123AbdK3JRo (ORCPT ); Thu, 30 Nov 2017 04:17:44 -0500 Received: by antares.kleine-koenig.org (Postfix, from userid 1000) id 895463674A; Thu, 30 Nov 2017 10:17:43 +0100 (CET) From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= To: Leonard Crestez , Shawn Guo , Zhang Rui , Eduardo Valentin Cc: kernel@pengutronix.de, linux-pm@vger.kernel.org Subject: [PATCH v2 2/4] thermal: imx: improve comments describing algorithm for temp calculation Date: Thu, 30 Nov 2017 10:17:36 +0100 Message-Id: <20171130091738.8901-3-u.kleine-koenig@pengutronix.de> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20171130091738.8901-1-u.kleine-koenig@pengutronix.de> References: <20171130091738.8901-1-u.kleine-koenig@pengutronix.de> MIME-Version: 1.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The description of the implemented algorithm is hardly understandable without having the right application note side-by-side to the code. Fix this by using shorter and more intuitive variable names, describe their meaning and transform a single formula instead of first talking about slope and then about "milli_Tmeas". There are no code changes. Reviewed-by: Leonard Crestez Signed-off-by: Uwe Kleine-König --- Changes since (implicit) v1, sent with Message-ID: 20171121200225.23316-3-u.kleine-koenig@pengutronix.de - Add Reviewed-by: Leonard Crestez --- drivers/thermal/imx_thermal.c | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index 21b8c4c4da3c..c08883dff2cb 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c @@ -359,32 +359,28 @@ static int imx_init_calib(struct platform_device *pdev, u32 ocotp_ana1) } /* - * Sensor data layout: - * [31:20] - sensor value @ 25C - * Use universal formula now and only need sensor value @ 25C - * slope = 0.4297157 - (0.0015976 * 25C fuse) + * The sensor is calibrated at 25 °C (aka T1) and the value measured + * (aka N1) at this temperature is provided in bits [31:20] in the + * i.MX's OCOTP value ANA1. + * To find the actual temperature T, the following formula has to be used + * when reading value n from the sensor: + * + * T = T1 + (N - N1) / (0.4297157 - 0.0015976 * N1) °C + * = [T1 - N1 / (0.4297157 - 0.0015976 * N1) °C] + N / (0.4297157 - 0.0015976 * N1) °C + * = [T1 + N1 / (0.0015976 * N1 - 0.4297157) °C] - N / (0.0015976 * N1 - 0.4297157) °C + * = c2 - c1 * N + * + * with + * + * c1 = 1 / (0.0015976 * N1 - 0.4297157) °C + * c2 = T1 + N1 / (0.0015976 * N1 - 0.4297157) °C + * = T1 + N1 * C1 */ n1 = ocotp_ana1 >> 20; - t1 = 25; /* t1 always 25C */ + t1 = 25; /* °C */ - /* - * Derived from linear interpolation: - * slope = 0.4297157 - (0.0015976 * 25C fuse) - * slope = (FACTOR2 - FACTOR1 * n1) / FACTOR0 - * (Nmeas - n1) / (Tmeas - t1) = slope - * We want to reduce this down to the minimum computation necessary - * for each temperature read. Also, we want Tmeas in millicelsius - * and we don't want to lose precision from integer division. So... - * Tmeas = (Nmeas - n1) / slope + t1 - * milli_Tmeas = 1000 * (Nmeas - n1) / slope + 1000 * t1 - * milli_Tmeas = -1000 * (n1 - Nmeas) / slope + 1000 * t1 - * Let constant c1 = (-1000 / slope) - * milli_Tmeas = (n1 - Nmeas) * c1 + 1000 * t1 - * Let constant c2 = n1 *c1 + 1000 * t1 - * milli_Tmeas = c2 - Nmeas * c1 - */ - temp64 = FACTOR0; - temp64 *= 1000; + temp64 = FACTOR0; /* 10^7 for FACTOR1 and FACTOR2 */ + temp64 *= 1000; /* to get result in °mC */ do_div(temp64, FACTOR1 * n1 - FACTOR2); data->c1 = temp64; data->c2 = n1 * data->c1 + 1000 * t1;