Linux-Renesas-SoC Archive on lore.kernel.org
 help / Atom feed
* [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation 
@ 2019-05-13 20:03 Yoshihiro Kaneko
  2019-05-13 20:03 ` [PATCH/RFT v3 1/3] thermal: rcar_gen3_thermal: Update value of Tj_1 Yoshihiro Kaneko
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Yoshihiro Kaneko @ 2019-05-13 20:03 UTC (permalink / raw)
  To: linux-pm
  Cc: Zhang Rui, Eduardo Valentin, Rob Herring, Simon Horman,
	Magnus Damm, linux-renesas-soc

This series was inspired by a patch in the BSP by Dien Pham <dien.pham.ry@renesas.com>.

This series is based on the master branch of Linus Torvalds's linux tree.

v3 [Yoshihiro Kaneko]
* As suggested by Simon Horman
- Patch 1/3: change the types of ths_tj_1 to int
* As suggested by Niklas Söderlund
- Patch 2/3: rename tj_2 into tj_t to accord with the datasheet

v2 [Yoshihiro Kaneko]
* As suggested by Simon Horman
- split into three patches
- avoid global variables
- marked thcode const

Yoshihiro Kaneko (3):
  thermal: rcar_gen3_thermal: Update value of Tj_1
  thermal: rcar_gen3_thermal: Update calculation formula of IRQTEMP
  thermal: rcar_gen3_thermal: Update temperature conversion method

 drivers/thermal/rcar_gen3_thermal.c | 92 ++++++++++++++++++++++++-------------
 1 file changed, 60 insertions(+), 32 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH/RFT v3 1/3] thermal: rcar_gen3_thermal: Update value of Tj_1
  2019-05-13 20:03 [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation Yoshihiro Kaneko
@ 2019-05-13 20:03 ` Yoshihiro Kaneko
  2019-05-13 20:03 ` [PATCH/RFT v3 2/3] thermal: rcar_gen3_thermal: Update calculation formula of IRQTEMP Yoshihiro Kaneko
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Yoshihiro Kaneko @ 2019-05-13 20:03 UTC (permalink / raw)
  To: linux-pm
  Cc: Zhang Rui, Eduardo Valentin, Rob Herring, Simon Horman,
	Magnus Damm, linux-renesas-soc

As evaluation of hardware team, temperature calculation formula
of M3-W is difference from all other SoCs as below:
- M3-W: Tj_1: 116 (so Tj_1 - Tj_3 = 157)
- Others: Tj_1: 126 (so Tj_1 - Tj_3 = 167)

Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
---
 drivers/thermal/rcar_gen3_thermal.c | 41 +++++++++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 11 deletions(-)

diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c
index 88fa41c..265ff6d 100644
--- a/drivers/thermal/rcar_gen3_thermal.c
+++ b/drivers/thermal/rcar_gen3_thermal.c
@@ -124,11 +124,11 @@ static inline void rcar_gen3_thermal_write(struct rcar_gen3_thermal_tsc *tsc,
 #define RCAR3_THERMAL_GRAN 500 /* mili Celsius */
 
 /* no idea where these constants come from */
-#define TJ_1 116
 #define TJ_3 -41
 
 static void rcar_gen3_thermal_calc_coefs(struct equation_coefs *coef,
-					 int *ptat, int *thcode)
+					 int *ptat, int *thcode,
+					 int ths_tj_1)
 {
 	int tj_2;
 
@@ -139,15 +139,15 @@ static void rcar_gen3_thermal_calc_coefs(struct equation_coefs *coef,
 	 * the dividend (4095 * 4095 << 14 > INT_MAX) so keep it unscaled
 	 */
 	tj_2 = (FIXPT_INT((ptat[1] - ptat[2]) * 157)
-		/ (ptat[0] - ptat[2])) - FIXPT_INT(41);
+		/ (ptat[0] - ptat[2])) + FIXPT_INT(TJ_3);
 
 	coef->a1 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[2]),
 			     tj_2 - FIXPT_INT(TJ_3));
 	coef->b1 = FIXPT_INT(thcode[2]) - coef->a1 * TJ_3;
 
 	coef->a2 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[0]),
-			     tj_2 - FIXPT_INT(TJ_1));
-	coef->b2 = FIXPT_INT(thcode[0]) - coef->a2 * TJ_1;
+			     tj_2 - FIXPT_INT(ths_tj_1));
+	coef->b2 = FIXPT_INT(thcode[0]) - coef->a2 * ths_tj_1;
 }
 
 static int rcar_gen3_thermal_round(int temp)
@@ -318,12 +318,29 @@ static void rcar_gen3_thermal_init(struct rcar_gen3_thermal_tsc *tsc)
 	usleep_range(1000, 2000);
 }
 
+static const int rcar_gen3_ths_tj_1 = 126;
+static const int rcar_gen3_ths_tj_1_m3_w = 116;
 static const struct of_device_id rcar_gen3_thermal_dt_ids[] = {
-	{ .compatible = "renesas,r8a774a1-thermal", },
-	{ .compatible = "renesas,r8a7795-thermal", },
-	{ .compatible = "renesas,r8a7796-thermal", },
-	{ .compatible = "renesas,r8a77965-thermal", },
-	{ .compatible = "renesas,r8a77980-thermal", },
+	{
+		.compatible = "renesas,r8a774a1-thermal",
+		.data = &rcar_gen3_ths_tj_1_m3_w,
+	},
+	{
+		.compatible = "renesas,r8a7795-thermal",
+		.data = &rcar_gen3_ths_tj_1,
+	},
+	{
+		.compatible = "renesas,r8a7796-thermal",
+		.data = &rcar_gen3_ths_tj_1_m3_w,
+	},
+	{
+		.compatible = "renesas,r8a77965-thermal",
+		.data = &rcar_gen3_ths_tj_1,
+	},
+	{
+		.compatible = "renesas,r8a77980-thermal",
+		.data = &rcar_gen3_ths_tj_1,
+	},
 	{},
 };
 MODULE_DEVICE_TABLE(of, rcar_gen3_thermal_dt_ids);
@@ -349,6 +366,7 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
 {
 	struct rcar_gen3_thermal_priv *priv;
 	struct device *dev = &pdev->dev;
+	const int *rcar_gen3_ths_tj_1 = of_device_get_match_data(dev);
 	struct resource *res;
 	struct thermal_zone_device *zone;
 	int ret, irq, i;
@@ -422,7 +440,8 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
 		priv->tscs[i] = tsc;
 
 		priv->thermal_init(tsc);
-		rcar_gen3_thermal_calc_coefs(&tsc->coef, ptat, thcode[i]);
+		rcar_gen3_thermal_calc_coefs(&tsc->coef, ptat, thcode[i],
+					     *rcar_gen3_ths_tj_1);
 
 		zone = devm_thermal_zone_of_sensor_register(dev, i, tsc,
 							    &rcar_gen3_tz_of_ops);
-- 
1.9.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH/RFT v3 2/3] thermal: rcar_gen3_thermal: Update calculation formula of IRQTEMP
  2019-05-13 20:03 [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation Yoshihiro Kaneko
  2019-05-13 20:03 ` [PATCH/RFT v3 1/3] thermal: rcar_gen3_thermal: Update value of Tj_1 Yoshihiro Kaneko
@ 2019-05-13 20:03 ` Yoshihiro Kaneko
  2019-05-13 20:03 ` [PATCH/RFT v3 3/3] thermal: rcar_gen3_thermal: Update temperature conversion method Yoshihiro Kaneko
  2019-05-17 12:09 ` [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation Simon Horman
  3 siblings, 0 replies; 5+ messages in thread
From: Yoshihiro Kaneko @ 2019-05-13 20:03 UTC (permalink / raw)
  To: linux-pm
  Cc: Zhang Rui, Eduardo Valentin, Rob Herring, Simon Horman,
	Magnus Damm, linux-renesas-soc

Update the formula to calculate CTEMP:
Currently, the CTEMP is average of val1 (is calculated by
formula 1) and val2 (is calculated by formula 2). But,
as description in HWM (chapter 10A.3.1.1 Setting of Normal Mode)

If (STEMP < Tj_T) CTEMP value should be val1.
If (STEMP > Tj_T) CTEMP value should be val2.

Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
---
 drivers/thermal/rcar_gen3_thermal.c | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c
index 265ff6d..a2873e7 100644
--- a/drivers/thermal/rcar_gen3_thermal.c
+++ b/drivers/thermal/rcar_gen3_thermal.c
@@ -77,6 +77,7 @@ struct rcar_gen3_thermal_tsc {
 	struct equation_coefs coef;
 	int low;
 	int high;
+	int tj_t;
 };
 
 struct rcar_gen3_thermal_priv {
@@ -126,28 +127,26 @@ static inline void rcar_gen3_thermal_write(struct rcar_gen3_thermal_tsc *tsc,
 /* no idea where these constants come from */
 #define TJ_3 -41
 
-static void rcar_gen3_thermal_calc_coefs(struct equation_coefs *coef,
+static void rcar_gen3_thermal_calc_coefs(struct rcar_gen3_thermal_tsc *tsc,
 					 int *ptat, int *thcode,
 					 int ths_tj_1)
 {
-	int tj_2;
-
 	/* TODO: Find documentation and document constant calculation formula */
 
 	/*
 	 * Division is not scaled in BSP and if scaled it might overflow
 	 * the dividend (4095 * 4095 << 14 > INT_MAX) so keep it unscaled
 	 */
-	tj_2 = (FIXPT_INT((ptat[1] - ptat[2]) * 157)
-		/ (ptat[0] - ptat[2])) + FIXPT_INT(TJ_3);
+	tsc->tj_t = (FIXPT_INT((ptat[1] - ptat[2]) * 157)
+		     / (ptat[0] - ptat[2])) + FIXPT_INT(TJ_3);
 
-	coef->a1 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[2]),
-			     tj_2 - FIXPT_INT(TJ_3));
-	coef->b1 = FIXPT_INT(thcode[2]) - coef->a1 * TJ_3;
+	tsc->coef.a1 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[2]),
+				 tsc->tj_t - FIXPT_INT(TJ_3));
+	tsc->coef.b1 = FIXPT_INT(thcode[2]) - tsc->coef.a1 * TJ_3;
 
-	coef->a2 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[0]),
-			     tj_2 - FIXPT_INT(ths_tj_1));
-	coef->b2 = FIXPT_INT(thcode[0]) - coef->a2 * ths_tj_1;
+	tsc->coef.a2 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[0]),
+				 tsc->tj_t - FIXPT_INT(ths_tj_1));
+	tsc->coef.b2 = FIXPT_INT(thcode[0]) - tsc->coef.a2 * ths_tj_1;
 }
 
 static int rcar_gen3_thermal_round(int temp)
@@ -186,13 +185,15 @@ static int rcar_gen3_thermal_get_temp(void *devdata, int *temp)
 static int rcar_gen3_thermal_mcelsius_to_temp(struct rcar_gen3_thermal_tsc *tsc,
 					      int mcelsius)
 {
-	int celsius, val1, val2;
+	int celsius, val;
 
 	celsius = DIV_ROUND_CLOSEST(mcelsius, 1000);
-	val1 = celsius * tsc->coef.a1 + tsc->coef.b1;
-	val2 = celsius * tsc->coef.a2 + tsc->coef.b2;
+	if (celsius <= INT_FIXPT(tsc->tj_t))
+		val = celsius * tsc->coef.a1 + tsc->coef.b1;
+	else
+		val = celsius * tsc->coef.a2 + tsc->coef.b2;
 
-	return INT_FIXPT((val1 + val2) / 2);
+	return INT_FIXPT(val);
 }
 
 static int rcar_gen3_thermal_set_trips(void *devdata, int low, int high)
@@ -440,7 +441,7 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
 		priv->tscs[i] = tsc;
 
 		priv->thermal_init(tsc);
-		rcar_gen3_thermal_calc_coefs(&tsc->coef, ptat, thcode[i],
+		rcar_gen3_thermal_calc_coefs(tsc, ptat, thcode[i],
 					     *rcar_gen3_ths_tj_1);
 
 		zone = devm_thermal_zone_of_sensor_register(dev, i, tsc,
-- 
1.9.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH/RFT v3 3/3] thermal: rcar_gen3_thermal: Update temperature conversion method
  2019-05-13 20:03 [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation Yoshihiro Kaneko
  2019-05-13 20:03 ` [PATCH/RFT v3 1/3] thermal: rcar_gen3_thermal: Update value of Tj_1 Yoshihiro Kaneko
  2019-05-13 20:03 ` [PATCH/RFT v3 2/3] thermal: rcar_gen3_thermal: Update calculation formula of IRQTEMP Yoshihiro Kaneko
@ 2019-05-13 20:03 ` Yoshihiro Kaneko
  2019-05-17 12:09 ` [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation Simon Horman
  3 siblings, 0 replies; 5+ messages in thread
From: Yoshihiro Kaneko @ 2019-05-13 20:03 UTC (permalink / raw)
  To: linux-pm
  Cc: Zhang Rui, Eduardo Valentin, Rob Herring, Simon Horman,
	Magnus Damm, linux-renesas-soc

Update the formula to calculate temperature:
Currently, current TEMP is calculated as
average of val1 (is calculated by formula 1)
and val2 (is calculated by formula 2). But,
as description in HWM (chapter 10A.3.1.2 Normal Mode.)

If (TEMP_CODE < THCODE2[11:0]) CTEMP value should be val1.
If (TEMP_CODE > THCODE2[11:0]) CTEMP value should be val2.

Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
---
 drivers/thermal/rcar_gen3_thermal.c | 28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c
index a2873e7..661b36c 100644
--- a/drivers/thermal/rcar_gen3_thermal.c
+++ b/drivers/thermal/rcar_gen3_thermal.c
@@ -63,6 +63,13 @@
 
 #define TSC_MAX_NUM	3
 
+/* default THCODE values if FUSEs are missing */
+static const int thcode[TSC_MAX_NUM][3] = {
+	{ 3397, 2800, 2221 },
+	{ 3393, 2795, 2216 },
+	{ 3389, 2805, 2237 },
+};
+
 /* Structure for thermal temperature calculation */
 struct equation_coefs {
 	int a1;
@@ -78,6 +85,7 @@ struct rcar_gen3_thermal_tsc {
 	int low;
 	int high;
 	int tj_t;
+	int id; /* thermal channel id */
 };
 
 struct rcar_gen3_thermal_priv {
@@ -128,7 +136,7 @@ static inline void rcar_gen3_thermal_write(struct rcar_gen3_thermal_tsc *tsc,
 #define TJ_3 -41
 
 static void rcar_gen3_thermal_calc_coefs(struct rcar_gen3_thermal_tsc *tsc,
-					 int *ptat, int *thcode,
+					 int *ptat, const int *thcode,
 					 int ths_tj_1)
 {
 	/* TODO: Find documentation and document constant calculation formula */
@@ -162,15 +170,19 @@ static int rcar_gen3_thermal_round(int temp)
 static int rcar_gen3_thermal_get_temp(void *devdata, int *temp)
 {
 	struct rcar_gen3_thermal_tsc *tsc = devdata;
-	int mcelsius, val1, val2;
+	int mcelsius, val;
 	u32 reg;
 
 	/* Read register and convert to mili Celsius */
 	reg = rcar_gen3_thermal_read(tsc, REG_GEN3_TEMP) & CTEMP_MASK;
 
-	val1 = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b1, tsc->coef.a1);
-	val2 = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b2, tsc->coef.a2);
-	mcelsius = FIXPT_TO_MCELSIUS((val1 + val2) / 2);
+	if (reg <= thcode[tsc->id][1])
+		val = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b1,
+				tsc->coef.a1);
+	else
+		val = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b2,
+				tsc->coef.a2);
+	mcelsius = FIXPT_TO_MCELSIUS(val);
 
 	/* Make sure we are inside specifications */
 	if ((mcelsius < MCELSIUS(-40)) || (mcelsius > MCELSIUS(125)))
@@ -376,11 +388,6 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
 	/* default values if FUSEs are missing */
 	/* TODO: Read values from hardware on supported platforms */
 	int ptat[3] = { 2631, 1509, 435 };
-	int thcode[TSC_MAX_NUM][3] = {
-		{ 3397, 2800, 2221 },
-		{ 3393, 2795, 2216 },
-		{ 3389, 2805, 2237 },
-	};
 
 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
 	if (!priv)
@@ -437,6 +444,7 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
 			ret = PTR_ERR(tsc->base);
 			goto error_unregister;
 		}
+		tsc->id = i;
 
 		priv->tscs[i] = tsc;
 
-- 
1.9.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation
  2019-05-13 20:03 [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation Yoshihiro Kaneko
                   ` (2 preceding siblings ...)
  2019-05-13 20:03 ` [PATCH/RFT v3 3/3] thermal: rcar_gen3_thermal: Update temperature conversion method Yoshihiro Kaneko
@ 2019-05-17 12:09 ` Simon Horman
  3 siblings, 0 replies; 5+ messages in thread
From: Simon Horman @ 2019-05-17 12:09 UTC (permalink / raw)
  To: Yoshihiro Kaneko
  Cc: linux-pm, Zhang Rui, Eduardo Valentin, Rob Herring, Magnus Damm,
	linux-renesas-soc

On Tue, May 14, 2019 at 05:03:52AM +0900, Yoshihiro Kaneko wrote:
> This series was inspired by a patch in the BSP by Dien Pham <dien.pham.ry@renesas.com>.
> 
> This series is based on the master branch of Linus Torvalds's linux tree.

Thanks Kaneko-san,

this looks good to me.

For all patches:

Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
Tested-by: Simon Horman <horms+renesas@verge.net.au>




^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, back to index

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-13 20:03 [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation Yoshihiro Kaneko
2019-05-13 20:03 ` [PATCH/RFT v3 1/3] thermal: rcar_gen3_thermal: Update value of Tj_1 Yoshihiro Kaneko
2019-05-13 20:03 ` [PATCH/RFT v3 2/3] thermal: rcar_gen3_thermal: Update calculation formula of IRQTEMP Yoshihiro Kaneko
2019-05-13 20:03 ` [PATCH/RFT v3 3/3] thermal: rcar_gen3_thermal: Update temperature conversion method Yoshihiro Kaneko
2019-05-17 12:09 ` [PATCH/RFT v3 0/3] thermal: rcar_gen3_thermal: Update calculation formula due to HW evaluation Simon Horman

Linux-Renesas-SoC Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-renesas-soc/0 linux-renesas-soc/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-renesas-soc linux-renesas-soc/ https://lore.kernel.org/linux-renesas-soc \
		linux-renesas-soc@vger.kernel.org linux-renesas-soc@archiver.kernel.org
	public-inbox-index linux-renesas-soc


Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-renesas-soc


AGPL code for this site: git clone https://public-inbox.org/ public-inbox