mbox series

[v7,0/7] Add TSENS support for IPQ5332, IPQ5424

Message ID 20241107140550.3260859-1-quic_mmanikan@quicinc.com
Headers show
Series Add TSENS support for IPQ5332, IPQ5424 | expand

Message

Manikanta Mylavarapu Nov. 7, 2024, 2:05 p.m. UTC
IPQ5332 uses tsens v2.3.3 IP with combined interrupt for
upper/lower and critical. IPQ5332 does not have RPM and
kernel has to take care of TSENS enablement and calibration.

IPQ5424 also uses same tsens v2.3.3 IP and it's similar to IPQ5332
(no RPM) hence add IPQ5424 support in this series itself.

This patch series adds the temperature sensor enablement,
calibration support for IPQ5332 and IPQ5424.

Depends On:
https://lore.kernel.org/linux-arm-msm/20241028060506.246606-1-quic_srichara@quicinc.com/

Changes in V7:
	- Fixed all review comments from Dmitry Baryshkov, Konrad Dybico
	- Detailed change logs are added to the respective patches

V6 can be found at:
https://lore.kernel.org/linux-arm-msm/20241104124413.2012794-1-quic_mmanikan@quicinc.com/

V5 can be found at:
https://lore.kernel.org/linux-arm-msm/20230721054619.2366510-1-quic_ipkumar@quicinc.com/

V4 can be found at:
https://lore.kernel.org/linux-arm-msm/20230719104041.126718-1-quic_ipkumar@quicinc.com/

V3 can be found at:
https://lore.kernel.org/linux-arm-msm/20230713052732.787853-1-quic_ipkumar@quicinc.com/

V2 can be found at:
https://lore.kernel.org/linux-arm-msm/20230712113539.4029941-1-quic_ipkumar@quicinc.com/


Manikanta Mylavarapu (3):
  dt-bindings: nvmem: Add compatible for IPQ5424
  arm64: dts: qcom: ipq5424: Add tsens node
  arm64: dts: qcom: ipq5424: Add thermal zone nodes

Praveenkumar I (4):
  dt-bindings: thermal: tsens: Add ipq5332, ipq5424 compatible
  thermal/drivers/tsens: Add TSENS enable and calibration support for V2
  arm64: dts: qcom: ipq5332: Add tsens node
  arm64: dts: qcom: ipq5332: Add thermal zone nodes

 .../bindings/nvmem/qcom,qfprom.yaml           |   1 +
 .../bindings/thermal/qcom-tsens.yaml          |  18 ++
 arch/arm64/boot/dts/qcom/ipq5332.dtsi         | 134 ++++++++++++
 arch/arm64/boot/dts/qcom/ipq5424.dtsi         | 197 ++++++++++++++++++
 drivers/thermal/qcom/tsens-v2.c               | 176 ++++++++++++++++
 drivers/thermal/qcom/tsens.c                  |   8 +-
 drivers/thermal/qcom/tsens.h                  |   4 +-
 7 files changed, 536 insertions(+), 2 deletions(-)


base-commit: 5b913f5d7d7fe0f567dea8605f21da6eaa1735fb
prerequisite-patch-id: 1090fe9cee19a52dc8595e2fecef659199828246
prerequisite-patch-id: 491c9f6c32738c4eb4398962c1ae7c625cd43238
prerequisite-patch-id: 1651c75547b539eb46eb4d02630e364f262860bf
prerequisite-patch-id: 7ce54f0af6083e897067a7e5cd9561198f3d4d41
prerequisite-patch-id: 0a04fdee4b5b76cd5b734c666f7c8f5561e3e9d8
prerequisite-patch-id: 084f6dced27c39b600711dde2f797b43393cde73

Comments

Dmitry Baryshkov Nov. 9, 2024, 12:23 a.m. UTC | #1
On Thu, Nov 07, 2024 at 07:35:46PM +0530, Manikanta Mylavarapu wrote:
> From: Praveenkumar I <quic_ipkumar@quicinc.com>
> 
> SoCs without RPM need to enable sensors and calibrate them from the kernel.
> The IPQ5332 and IPQ5424 use the tsens v2.3.3 IP and do not have RPM.
> Therefore, add a new calibration function for V2, as the tsens.c calib
> function only supports V1. Also add new feature_config, ops and data for
> IPQ5332, IPQ5424.
> 
> Although the TSENS IP supports 16 sensors, not all are used. The hw_id
> is used to enable the relevant sensors.
> 
> Signed-off-by: Praveenkumar I <quic_ipkumar@quicinc.com>
> Signed-off-by: Manikanta Mylavarapu <quic_mmanikan@quicinc.com>
> ---
> Changes in V7:
> 	- Move val calculation out of switch-case and assign default
> 	  values to shift, slope and czero and then change them under
> 	  switch-case in tsens_v2_calibrate_sensor().
> 
>  drivers/thermal/qcom/tsens-v2.c | 176 ++++++++++++++++++++++++++++++++
>  drivers/thermal/qcom/tsens.c    |   8 +-
>  drivers/thermal/qcom/tsens.h    |   4 +-
>  3 files changed, 186 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v2.c
> index 0cb7301eca6e..6d2783577139 100644
> --- a/drivers/thermal/qcom/tsens-v2.c
> +++ b/drivers/thermal/qcom/tsens-v2.c
> @@ -4,13 +4,32 @@
>   * Copyright (c) 2018, Linaro Limited
>   */
>  
> +#include <linux/bitfield.h>
>  #include <linux/bitops.h>
>  #include <linux/regmap.h>
> +#include <linux/nvmem-consumer.h>
>  #include "tsens.h"
>  
>  /* ----- SROT ------ */
>  #define SROT_HW_VER_OFF	0x0000
>  #define SROT_CTRL_OFF		0x0004
> +#define SROT_MEASURE_PERIOD	0x0008
> +#define SROT_Sn_CONVERSION	0x0060
> +#define V2_SHIFT_DEFAULT	0x0003
> +#define V2_SLOPE_DEFAULT	0x0cd0
> +#define V2_CZERO_DEFAULT	0x016a
> +#define ONE_PT_SLOPE		0x0cd0
> +#define TWO_PT_SHIFTED_GAIN	921600
> +#define ONE_PT_CZERO_CONST	94
> +#define SW_RST_DEASSERT		0x0
> +#define SW_RST_ASSERT		0x1
> +#define MEASURE_PERIOD_2mSEC	0x1
> +#define RSEULT_FORMAT_TEMP	0x1
> +#define TSENS_ENABLE		0x1
> +#define SENSOR_CONVERSION(n)	(((n) * 4) + SROT_Sn_CONVERSION)
> +#define CONVERSION_SHIFT_MASK	GENMASK(24, 23)
> +#define CONVERSION_SLOPE_MASK	GENMASK(22, 10)
> +#define CONVERSION_CZERO_MASK	GENMASK(9, 0)
>  
>  /* ----- TM ------ */
>  #define TM_INT_EN_OFF			0x0004
> @@ -50,6 +69,17 @@ static struct tsens_features ipq8074_feat = {
>  	.trip_max_temp	= 204000,
>  };
>  
> +static struct tsens_features ipq5332_feat = {
> +	.ver_major	= VER_2_X_NO_RPM,
> +	.crit_int	= 1,
> +	.combo_int	= 1,
> +	.adc		= 0,
> +	.srot_split	= 1,
> +	.max_sensors	= 16,
> +	.trip_min_temp	= 0,
> +	.trip_max_temp	= 204000,
> +};
> +
>  static const struct reg_field tsens_v2_regfields[MAX_REGFIELDS] = {
>  	/* ----- SROT ------ */
>  	/* VERSION */
> @@ -59,6 +89,10 @@ static const struct reg_field tsens_v2_regfields[MAX_REGFIELDS] = {
>  	/* CTRL_OFF */
>  	[TSENS_EN]     = REG_FIELD(SROT_CTRL_OFF,    0,  0),
>  	[TSENS_SW_RST] = REG_FIELD(SROT_CTRL_OFF,    1,  1),
> +	[SENSOR_EN]    = REG_FIELD(SROT_CTRL_OFF,    3,  18),
> +	[CODE_OR_TEMP] = REG_FIELD(SROT_CTRL_OFF,    21, 21),
> +
> +	[MAIN_MEASURE_PERIOD] = REG_FIELD(SROT_MEASURE_PERIOD, 0, 7),
>  
>  	/* ----- TM ------ */
>  	/* INTERRUPT ENABLE */
> @@ -104,6 +138,126 @@ static const struct reg_field tsens_v2_regfields[MAX_REGFIELDS] = {
>  	[TRDY] = REG_FIELD(TM_TRDY_OFF, 0, 0),
>  };
>  
> +static int tsens_v2_calibrate_sensor(struct device *dev, struct tsens_sensor *sensor,
> +				     struct regmap *map,  u32 mode, u32 base0, u32 base1)
> +{
> +	u32 shift = V2_SHIFT_DEFAULT;
> +	u32 slope = V2_SLOPE_DEFAULT, czero = V2_CZERO_DEFAULT, val;
> +	char name[8];
> +	int ret;
> +
> +	/* Read offset value */
> +	ret = snprintf(name, sizeof(name), "s%d", sensor->hw_id);
> +	if (ret < 0)
> +		return ret;
> +
> +	ret = nvmem_cell_read_variable_le_u32(dev, name, &sensor->offset);
> +	if (ret)
> +		return ret;
> +
> +	/* Based on calib mode, program SHIFT, SLOPE and CZERO */
> +	switch (mode) {
> +	case TWO_PT_CALIB:
> +		slope = (TWO_PT_SHIFTED_GAIN / (base1 - base0));
> +
> +		czero = (base0 + sensor->offset - ((base1 - base0) / 3));
> +
> +		fallthrough;
> +	case ONE_PT_CALIB2:
> +		czero = base0 + sensor->offset - ONE_PT_CZERO_CONST;

THis will override czero calculation from TWO_PT_CALIB case.

> +
> +		slope = ONE_PT_SLOPE;
> +
> +		break;
> +	default:
> +		dev_dbg(dev, "calibrationless mode\n");
> +	}
> +
> +	val =	FIELD_PREP(CONVERSION_SHIFT_MASK, shift) |
> +		FIELD_PREP(CONVERSION_SLOPE_MASK, slope) |
> +		FIELD_PREP(CONVERSION_CZERO_MASK, czero);
> +
> +	regmap_write(map, SENSOR_CONVERSION(sensor->hw_id), val);
> +
> +	return 0;
> +}
> +
Konrad Dybcio Nov. 9, 2024, 10:18 a.m. UTC | #2
On 7.11.2024 3:05 PM, Manikanta Mylavarapu wrote:
> IPQ5332 uses tsens v2.3.3 IP with combined interrupt for
> upper/lower and critical. IPQ5332 does not have RPM and
> kernel has to take care of TSENS enablement and calibration.
> 
> IPQ5424 also uses same tsens v2.3.3 IP and it's similar to IPQ5332
> (no RPM) hence add IPQ5424 support in this series itself.
> 
> This patch series adds the temperature sensor enablement,
> calibration support for IPQ5332 and IPQ5424.
> 
> Depends On:
> https://lore.kernel.org/linux-arm-msm/20241028060506.246606-1-quic_srichara@quicinc.com/
> 
> Changes in V7:
> 	- Fixed all review comments from Dmitry Baryshkov, Konrad Dybico
> 	- Detailed change logs are added to the respective patches

Please see the responses I made on that thread

Konrad
Manikanta Mylavarapu Nov. 11, 2024, 11:44 a.m. UTC | #3
On 11/9/2024 5:53 AM, Dmitry Baryshkov wrote:
> On Thu, Nov 07, 2024 at 07:35:46PM +0530, Manikanta Mylavarapu wrote:
>> From: Praveenkumar I <quic_ipkumar@quicinc.com>
>>
>> SoCs without RPM need to enable sensors and calibrate them from the kernel.
>> The IPQ5332 and IPQ5424 use the tsens v2.3.3 IP and do not have RPM.
>> Therefore, add a new calibration function for V2, as the tsens.c calib
>> function only supports V1. Also add new feature_config, ops and data for
>> IPQ5332, IPQ5424.
>>
>> Although the TSENS IP supports 16 sensors, not all are used. The hw_id
>> is used to enable the relevant sensors.
>>
>> Signed-off-by: Praveenkumar I <quic_ipkumar@quicinc.com>
>> Signed-off-by: Manikanta Mylavarapu <quic_mmanikan@quicinc.com>
>> ---
>> Changes in V7:
>> 	- Move val calculation out of switch-case and assign default
>> 	  values to shift, slope and czero and then change them under
>> 	  switch-case in tsens_v2_calibrate_sensor().
>>
>>  drivers/thermal/qcom/tsens-v2.c | 176 ++++++++++++++++++++++++++++++++
>>  drivers/thermal/qcom/tsens.c    |   8 +-
>>  drivers/thermal/qcom/tsens.h    |   4 +-
>>  3 files changed, 186 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v2.c
>> index 0cb7301eca6e..6d2783577139 100644
>> --- a/drivers/thermal/qcom/tsens-v2.c
>> +++ b/drivers/thermal/qcom/tsens-v2.c
>> @@ -4,13 +4,32 @@
>>   * Copyright (c) 2018, Linaro Limited
>>   */
>>  
>> +#include <linux/bitfield.h>
>>  #include <linux/bitops.h>
>>  #include <linux/regmap.h>
>> +#include <linux/nvmem-consumer.h>
>>  #include "tsens.h"
>>  
>>  /* ----- SROT ------ */
>>  #define SROT_HW_VER_OFF	0x0000
>>  #define SROT_CTRL_OFF		0x0004
>> +#define SROT_MEASURE_PERIOD	0x0008
>> +#define SROT_Sn_CONVERSION	0x0060
>> +#define V2_SHIFT_DEFAULT	0x0003
>> +#define V2_SLOPE_DEFAULT	0x0cd0
>> +#define V2_CZERO_DEFAULT	0x016a
>> +#define ONE_PT_SLOPE		0x0cd0
>> +#define TWO_PT_SHIFTED_GAIN	921600
>> +#define ONE_PT_CZERO_CONST	94
>> +#define SW_RST_DEASSERT		0x0
>> +#define SW_RST_ASSERT		0x1
>> +#define MEASURE_PERIOD_2mSEC	0x1
>> +#define RSEULT_FORMAT_TEMP	0x1
>> +#define TSENS_ENABLE		0x1
>> +#define SENSOR_CONVERSION(n)	(((n) * 4) + SROT_Sn_CONVERSION)
>> +#define CONVERSION_SHIFT_MASK	GENMASK(24, 23)
>> +#define CONVERSION_SLOPE_MASK	GENMASK(22, 10)
>> +#define CONVERSION_CZERO_MASK	GENMASK(9, 0)
>>  
>>  /* ----- TM ------ */
>>  #define TM_INT_EN_OFF			0x0004
>> @@ -50,6 +69,17 @@ static struct tsens_features ipq8074_feat = {
>>  	.trip_max_temp	= 204000,
>>  };
>>  
>> +static struct tsens_features ipq5332_feat = {
>> +	.ver_major	= VER_2_X_NO_RPM,
>> +	.crit_int	= 1,
>> +	.combo_int	= 1,
>> +	.adc		= 0,
>> +	.srot_split	= 1,
>> +	.max_sensors	= 16,
>> +	.trip_min_temp	= 0,
>> +	.trip_max_temp	= 204000,
>> +};
>> +
>>  static const struct reg_field tsens_v2_regfields[MAX_REGFIELDS] = {
>>  	/* ----- SROT ------ */
>>  	/* VERSION */
>> @@ -59,6 +89,10 @@ static const struct reg_field tsens_v2_regfields[MAX_REGFIELDS] = {
>>  	/* CTRL_OFF */
>>  	[TSENS_EN]     = REG_FIELD(SROT_CTRL_OFF,    0,  0),
>>  	[TSENS_SW_RST] = REG_FIELD(SROT_CTRL_OFF,    1,  1),
>> +	[SENSOR_EN]    = REG_FIELD(SROT_CTRL_OFF,    3,  18),
>> +	[CODE_OR_TEMP] = REG_FIELD(SROT_CTRL_OFF,    21, 21),
>> +
>> +	[MAIN_MEASURE_PERIOD] = REG_FIELD(SROT_MEASURE_PERIOD, 0, 7),
>>  
>>  	/* ----- TM ------ */
>>  	/* INTERRUPT ENABLE */
>> @@ -104,6 +138,126 @@ static const struct reg_field tsens_v2_regfields[MAX_REGFIELDS] = {
>>  	[TRDY] = REG_FIELD(TM_TRDY_OFF, 0, 0),
>>  };
>>  
>> +static int tsens_v2_calibrate_sensor(struct device *dev, struct tsens_sensor *sensor,
>> +				     struct regmap *map,  u32 mode, u32 base0, u32 base1)
>> +{
>> +	u32 shift = V2_SHIFT_DEFAULT;
>> +	u32 slope = V2_SLOPE_DEFAULT, czero = V2_CZERO_DEFAULT, val;
>> +	char name[8];
>> +	int ret;
>> +
>> +	/* Read offset value */
>> +	ret = snprintf(name, sizeof(name), "s%d", sensor->hw_id);
>> +	if (ret < 0)
>> +		return ret;
>> +
>> +	ret = nvmem_cell_read_variable_le_u32(dev, name, &sensor->offset);
>> +	if (ret)
>> +		return ret;
>> +
>> +	/* Based on calib mode, program SHIFT, SLOPE and CZERO */
>> +	switch (mode) {
>> +	case TWO_PT_CALIB:
>> +		slope = (TWO_PT_SHIFTED_GAIN / (base1 - base0));
>> +
>> +		czero = (base0 + sensor->offset - ((base1 - base0) / 3));
>> +
>> +		fallthrough;
>> +	case ONE_PT_CALIB2:
>> +		czero = base0 + sensor->offset - ONE_PT_CZERO_CONST;
> 
> THis will override czero calculation from TWO_PT_CALIB case.
> 

I will replace 'fallthrough' with 'break' to avoid override.

Thanks & Regards,
Manikanta.
Manikanta Mylavarapu Nov. 15, 2024, 10:38 a.m. UTC | #4
On 11/9/2024 3:48 PM, Konrad Dybcio wrote:
> On 7.11.2024 3:05 PM, Manikanta Mylavarapu wrote:
>> IPQ5332 uses tsens v2.3.3 IP with combined interrupt for
>> upper/lower and critical. IPQ5332 does not have RPM and
>> kernel has to take care of TSENS enablement and calibration.
>>
>> IPQ5424 also uses same tsens v2.3.3 IP and it's similar to IPQ5332
>> (no RPM) hence add IPQ5424 support in this series itself.
>>
>> This patch series adds the temperature sensor enablement,
>> calibration support for IPQ5332 and IPQ5424.
>>
>> Depends On:
>> https://lore.kernel.org/linux-arm-msm/20241028060506.246606-1-quic_srichara@quicinc.com/
>>
>> Changes in V7:
>> 	- Fixed all review comments from Dmitry Baryshkov, Konrad Dybico
>> 	- Detailed change logs are added to the respective patches
> 
> Please see the responses I made on that thread
> 
> Konrad
> 

Hi Konrad,

I have addressed all of your comments.

Thanks & Regards,
Manikanta.