All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amit Kucheria <amit.kucheria@linaro.org>
To: linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org,
	bjorn.andersson@linaro.org, edubezval@gmail.com,
	andy.gross@linaro.org, Daniel Lezcano <daniel.lezcano@linaro.org>,
	David Brown <david.brown@linaro.org>,
	Zhang Rui <rui.zhang@intel.com>
Cc: linux-pm@vger.kernel.org
Subject: [PATCH v1 17/24] drivers: thermal: tsens: simplify get_temp_tsens_v2 routine
Date: Thu,  7 Feb 2019 16:19:35 +0530	[thread overview]
Message-ID: <9ee687bdeb1c0529038be823947da02f7d368f53.1549525708.git.amit.kucheria@linaro.org> (raw)
In-Reply-To: <cover.1549525708.git.amit.kucheria@linaro.org>
In-Reply-To: <cover.1549525708.git.amit.kucheria@linaro.org>

The current implementation is based on an algorithm published in the
docs. Instead of reading the temperature thrice w/o any explanation,
improve the algorithm.

This will become the basis for a common get_temp routine in the future.

Signed-off-by: Amit Kucheria <amit.kucheria@linaro.org>
---
 drivers/thermal/qcom/tsens-v2.c | 55 ++++++++++-----------------------
 1 file changed, 17 insertions(+), 38 deletions(-)

diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v2.c
index 8052266447f5..0ea93b89bc65 100644
--- a/drivers/thermal/qcom/tsens-v2.c
+++ b/drivers/thermal/qcom/tsens-v2.c
@@ -25,58 +25,37 @@
 #define TM_Sn_STATUS_OFF		0x00a0
 #define TM_TRDY_OFF			0x00e4
 
-#define LAST_TEMP_MASK		0xfff
-
-static int get_temp_tsens_v2(struct tsens_priv *priv, int id, int *temp)
+static int get_temp_tsens_v2(struct tsens_priv *priv, int i, int *temp)
 {
-	struct tsens_sensor *s = &priv->sensor[id];
+	struct tsens_sensor *s = &priv->sensor[i];
 	u32 temp_idx = LAST_TEMP_0 + s->hw_id;
 	u32 valid_idx = VALID_0 + s->hw_id;
-	u32 last_temp = 0, last_temp2 = 0, last_temp3 = 0, valid;
+	u32 last_temp = 0, valid, mask;
 	int ret;
 
-	ret = regmap_field_read(priv->rf[temp_idx], &last_temp);
-	if (ret)
-		return ret;
-
 	ret = regmap_field_read(priv->rf[valid_idx], &valid);
 	if (ret)
 		return ret;
-
-	if (valid)
-		goto done;
-
-	/* Try a second time */
-	ret = regmap_field_read(priv->rf[valid_idx], &valid);
-	if (ret)
-		return ret;
-	ret = regmap_field_read(priv->rf[temp_idx], &last_temp2);
-	if (ret)
-		return ret;
-	if (valid) {
-		last_temp = last_temp2;
-		goto done;
+	while (!valid) {
+		/* Valid bit is 0 for 6 AHB clock cycles.
+		 * At 19.2MHz, 1 AHB clock is ~60ns.
+		 * We should enter this loop very, very rarely.
+		 */
+		ndelay(400);
+		ret = regmap_field_read(priv->rf[valid_idx], &valid);
+		if (ret)
+			return ret;
 	}
 
-	/* Try a third/last time */
-	ret = regmap_field_read(priv->rf[valid_idx], &valid);
-	if (ret)
-		return ret;
-	ret = regmap_field_read(priv->rf[temp_idx], &last_temp3);
+	/* Valid bit is set, OK to read the temperature */
+	ret = regmap_field_read(priv->rf[temp_idx], &last_temp);
 	if (ret)
 		return ret;
-	if (valid) {
-		last_temp = last_temp3;
-		goto done;
-	}
 
-	if (last_temp == last_temp2)
-		last_temp = last_temp2;
-	else if (last_temp2 == last_temp3)
-		last_temp = last_temp3;
-done:
+	mask = GENMASK(priv->fields[LAST_TEMP_0].msb,
+		       priv->fields[LAST_TEMP_0].lsb);
 	/* Convert temperature from deciCelsius to milliCelsius */
-	*temp = sign_extend32(last_temp, fls(LAST_TEMP_MASK) - 1) * 100;
+	*temp = sign_extend32(last_temp, fls(mask) - 1) * 100;
 
 	return 0;
 }
-- 
2.17.1

  parent reply	other threads:[~2019-02-07 10:49 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-07 10:49 [PATCH v1 00/24] thermal: tsens: Refactor to use regmap_field Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 01/24] drivers: thermal: tsens: Document the data structures Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 02/24] drivers: thermal: tsens: Rename tsens_data Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 03/24] drivers: thermal: tsens: Rename tsens_device Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 04/24] drivers: thermal: tsens: Rename variable tmdev Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 05/24] drivers: thermal: tsens: Use consistent names for variables Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 06/24] drivers: thermal: tsens: Function prototypes should have argument names Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 07/24] drivers: thermal: tsens: Rename tsens-8916 to prepare to merge with tsens-8974 Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 08/24] drivers: thermal: tsens: Rename constants " Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 09/24] drivers: thermal: tsens: Merge tsens-8974 into tsens-v0_1 Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 10/24] drivers: thermal: tsens: Introduce reg_fields to deal with register description Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 11/24] drivers: thermal: tsens: Save reference to the device pointer and use it Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 12/24] drivers: thermal: tsens: Don't print error message on -EPROBE_DEFER Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 13/24] drivers: thermal: tsens: Print IP version Amit Kucheria
2019-02-20  1:17   ` Eduardo Valentin
2019-02-20  9:19     ` Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 14/24] drivers: thermal: tsens: Add new operation to check if a sensor is enabled Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 15/24] drivers: thermal: tsens: change data type for sensor IDs Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 16/24] drivers: thermal: tsens: Introduce IP-specific max_sensor count Amit Kucheria
2019-02-07 10:49 ` Amit Kucheria [this message]
2019-02-07 10:49 ` [PATCH v1 18/24] drivers: thermal: tsens: Move get_temp_tsens_v2 to allow sharing Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 19/24] drivers: thermal: tsens: Common get_temp() learns to do ADC conversion Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 20/24] dt: thermal: tsens: Add bindings for qcs404 Amit Kucheria
2019-02-25 22:31   ` Rob Herring
2019-02-07 10:49 ` [PATCH v1 21/24] drivers: thermal: tsens: Add generic support for TSENS v1 IP Amit Kucheria
2019-02-20  1:12   ` Eduardo Valentin
2019-02-07 10:49 ` [PATCH v1 22/24] arm64: dts: qcom: qcs404: Add tsens controller Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 23/24] arm64: dts: qcom: qcs404: Add thermal zones for each sensor Amit Kucheria
2019-02-20  1:09   ` Eduardo Valentin
2019-02-20  9:40     ` Amit Kucheria
2019-02-07 10:49 ` [PATCH v1 24/24] drivers: thermal: tsens: Move calibration constants to header file Amit Kucheria

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9ee687bdeb1c0529038be823947da02f7d368f53.1549525708.git.amit.kucheria@linaro.org \
    --to=amit.kucheria@linaro.org \
    --cc=andy.gross@linaro.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=daniel.lezcano@linaro.org \
    --cc=david.brown@linaro.org \
    --cc=edubezval@gmail.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rui.zhang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.