Re: [PATCH v2 03/12] arm64: dts: tegra210: set thermtrip

2019-04-25 Thread Wei Ni
Hi Thierry,
Eduardo have picked this series to his branch except dts patches.
Please check
"git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git"
in the linus branch. They will be merged in the next major kernel release.

Could you please take these three dts changes?
Here is the list:
[PATCH v2 03/12] arm64: dts: tegra210: set thermtrip
[PATCH v2 06/12] arm64: dts: tegra210: set gpu hw throttle level
[PATCH v2 10/12] arm64: dts: tegra210: set EDP interrupt line

Thanks.
Wei.

On 21/2/2019 6:18 PM, Wei Ni wrote:
> Set "nvidia,thermtrips" property, it used to set
> HW shutdown temperatures.
> 
> Signed-off-by: Wei Ni 
> ---
>  arch/arm64/boot/dts/nvidia/tegra210.dtsi | 15 +--
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
> b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
> index 6574396d2257..582d56820bbb 100644
> --- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
> +++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
> @@ -1410,6 +1410,9 @@
>   reset-names = "soctherm";
>   #thermal-sensor-cells = <1>;
>  
> + nvidia,thermtrips =  +  TEGRA124_SOCTHERM_SENSOR_GPU 103000>;
> +
>   throttle-cfgs {
>   throttle_heavy: heavy {
>   nvidia,priority = <100>;
> @@ -1429,8 +1432,8 @@
>   < TEGRA124_SOCTHERM_SENSOR_CPU>;
>  
>   trips {
> - cpu-shutdown-trip {
> - temperature = <102500>;
> + cpu-critical-trip {
> + temperature = <102000>;
>   hysteresis = <0>;
>   type = "critical";
>   };
> @@ -1457,7 +1460,7 @@
>   < TEGRA124_SOCTHERM_SENSOR_MEM>;
>  
>   trips {
> - mem-shutdown-trip {
> + mem-critical-trip {
>   temperature = <103000>;
>   hysteresis = <0>;
>   type = "critical";
> @@ -1479,8 +1482,8 @@
>   < TEGRA124_SOCTHERM_SENSOR_GPU>;
>  
>   trips {
> - gpu-shutdown-trip {
> - temperature = <103000>;
> + gpu-critical-trip {
> + temperature = <102500>;
>   hysteresis = <0>;
>   type = "critical";
>   };
> @@ -1507,7 +1510,7 @@
>   < TEGRA124_SOCTHERM_SENSOR_PLLX>;
>  
>   trips {
> - pllx-shutdown-trip {
> + pllx-critical-trip {
>   temperature = <103000>;
>   hysteresis = <0>;
>   type = "critical";
> 


[PATCH] arm64: defconfig: Enable TEGRA_SOCTHERM

2019-04-24 Thread Wei Ni
Enable Tegra soctherm, and builds as kernel.

Signed-off-by: Wei Ni 
---
 arch/arm64/configs/defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index c8432e24207e..3d8f9d5bf7cb 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -406,6 +406,7 @@ CONFIG_ARMADA_THERMAL=y
 CONFIG_BCM2835_THERMAL=m
 CONFIG_BRCMSTB_THERMAL=m
 CONFIG_EXYNOS_THERMAL=y
+CONFIG_TEGRA_SOCTHERM=y
 CONFIG_TEGRA_BPMP_THERMAL=m
 CONFIG_QCOM_TSENS=y
 CONFIG_UNIPHIER_THERMAL=y
-- 
2.7.4



Re: [PATCH v2 12/12] thermal: tegra: enable OC hw throttle

2019-04-24 Thread Wei Ni
Hi Eduardo,

On 24/4/2019 4:36 PM, Wei Ni wrote:
> 
> 
> On 23/4/2019 11:46 PM, Eduardo Valentin wrote:
>> On Thu, Feb 21, 2019 at 06:18:47PM +0800, Wei Ni wrote:
>>> Parse Over Current settings from DT and program them to
>>> generate interrupts. Also enable hw throttling whenever
>>> there are OC events. Log the OC events as debug messages.
>>>
>>> Signed-off-by: Wei Ni 
>>
>> I applied this series except for this specific patch which:
>> a. does not apply clean
>> b. does not compile.
>>
>> Please rebase on top of my -linus branch and resend this. remember to 
>> checkpatch and compile and boot test before sending.
> 
> Thanks for your comment, will rebase and test it.

I git clone your
"git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git",
and "git am" this series, but doesn't have problems, all patches can be
applied one by one.
Because the CONFIG_TEGRA_SOCTHERM didn't be enabled in the defconfig, so
the driver doesn't be compiled. I will send the patch to enable it next.
Did you miss any patches before applying this last one, could you please
try it again?

Thanks.
Wei.

> 
>>
>>> ---
>>>  drivers/thermal/tegra/soctherm.c | 130 
>>> ---
>>>  1 file changed, 120 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/thermal/tegra/soctherm.c 
>>> b/drivers/thermal/tegra/soctherm.c
>>> index b8c66368e54e..6e3f329d1ac4 100644
>>> --- a/drivers/thermal/tegra/soctherm.c
>>> +++ b/drivers/thermal/tegra/soctherm.c
>>> @@ -106,9 +106,26 @@
>>>  #define STATS_CTL_CLR_UP   0x2
>>>  #define STATS_CTL_EN_UP0x1
>>>  
>>> +#define OC1_CFG0x310
>>> +#define OC1_CFG_LONG_LATENCY_MASK  BIT(6)
>>> +#define OC1_CFG_HW_RESTORE_MASKBIT(5)
>>> +#define OC1_CFG_PWR_GOOD_MASK_MASK BIT(4)
>>> +#define OC1_CFG_THROTTLE_MODE_MASK (0x3 << 2)
>>> +#define OC1_CFG_ALARM_POLARITY_MASKBIT(1)
>>> +#define OC1_CFG_EN_THROTTLE_MASK   BIT(0)
>>> +
>>> +#define OC1_CNT_THRESHOLD  0x314
>>> +#define OC1_THROTTLE_PERIOD0x318
>>> +#define OC1_ALARM_COUNT0x31c
>>> +#define OC1_FILTER 0x320
>>> +#define OC1_STATS  0x3a8
>>> +
>>>  #define OC_INTR_STATUS 0x39c
>>>  #define OC_INTR_ENABLE 0x3a0
>>>  #define OC_INTR_DISABLE0x3a4
>>> +#define OC_STATS_CTL   0x3c4
>>> +#define OC_STATS_CTL_CLR_ALL   0x2
>>> +#define OC_STATS_CTL_EN_ALL0x1
>>>  
>>>  #define OC_INTR_OC1_MASK   BIT(0)
>>>  #define OC_INTR_OC2_MASK   BIT(1)
>>> @@ -207,6 +224,25 @@
>>>  #define THROT_DELAY_CTRL(throt)(THROT_DELAY_LITE + \
>>> (THROT_OFFSET * throt))
>>>  
>>> +#define ALARM_OFFSET   0x14
>>> +#define ALARM_CFG(throt)   (OC1_CFG + \
>>> +   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
>>> +
>>> +#define ALARM_CNT_THRESHOLD(throt) (OC1_CNT_THRESHOLD + \
>>> +   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
>>> +
>>> +#define ALARM_THROTTLE_PERIOD(throt)   (OC1_THROTTLE_PERIOD + \
>>> +   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
>>> +
>>> +#define ALARM_ALARM_COUNT(throt)   (OC1_ALARM_COUNT + \
>>> +   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
>>> +
>>> +#define ALARM_FILTER(throt)(OC1_FILTER + \
>>> +   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
>>> +
>>> +#define ALARM_STATS(throt) (OC1_STATS + \
>>> +   (4 * (throt - THROTTLE_OC1)))
>>> +
>>>  /* get CCROC_THROT_PSKIP_xxx offset per HIGH/MED/LOW vect*/
>>>  #define CCROC_THROT_OFFSET 0x0c
>>>  #define CCROC_THROT_PSKIP_CTRL_CPU_REG(vect)
>>> (CCROC_THROT_PSKIP_CTRL_CPU + \
>>> @@ -218,6 +254,9 @@
>>>  #define THERMCTL_LVL_REGS_SIZE 0x20
>>>  #define THE

Re: [PATCH v2 12/12] thermal: tegra: enable OC hw throttle

2019-04-24 Thread Wei Ni



On 23/4/2019 11:46 PM, Eduardo Valentin wrote:
> On Thu, Feb 21, 2019 at 06:18:47PM +0800, Wei Ni wrote:
>> Parse Over Current settings from DT and program them to
>> generate interrupts. Also enable hw throttling whenever
>> there are OC events. Log the OC events as debug messages.
>>
>> Signed-off-by: Wei Ni 
> 
> I applied this series except for this specific patch which:
> a. does not apply clean
> b. does not compile.
> 
> Please rebase on top of my -linus branch and resend this. remember to 
> checkpatch and compile and boot test before sending.

Thanks for your comment, will rebase and test it.

> 
>> ---
>>  drivers/thermal/tegra/soctherm.c | 130 
>> ---
>>  1 file changed, 120 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c 
>> b/drivers/thermal/tegra/soctherm.c
>> index b8c66368e54e..6e3f329d1ac4 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -106,9 +106,26 @@
>>  #define STATS_CTL_CLR_UP0x2
>>  #define STATS_CTL_EN_UP 0x1
>>  
>> +#define OC1_CFG 0x310
>> +#define OC1_CFG_LONG_LATENCY_MASK   BIT(6)
>> +#define OC1_CFG_HW_RESTORE_MASK BIT(5)
>> +#define OC1_CFG_PWR_GOOD_MASK_MASK  BIT(4)
>> +#define OC1_CFG_THROTTLE_MODE_MASK  (0x3 << 2)
>> +#define OC1_CFG_ALARM_POLARITY_MASK BIT(1)
>> +#define OC1_CFG_EN_THROTTLE_MASKBIT(0)
>> +
>> +#define OC1_CNT_THRESHOLD   0x314
>> +#define OC1_THROTTLE_PERIOD 0x318
>> +#define OC1_ALARM_COUNT 0x31c
>> +#define OC1_FILTER  0x320
>> +#define OC1_STATS   0x3a8
>> +
>>  #define OC_INTR_STATUS  0x39c
>>  #define OC_INTR_ENABLE  0x3a0
>>  #define OC_INTR_DISABLE 0x3a4
>> +#define OC_STATS_CTL0x3c4
>> +#define OC_STATS_CTL_CLR_ALL0x2
>> +#define OC_STATS_CTL_EN_ALL 0x1
>>  
>>  #define OC_INTR_OC1_MASKBIT(0)
>>  #define OC_INTR_OC2_MASKBIT(1)
>> @@ -207,6 +224,25 @@
>>  #define THROT_DELAY_CTRL(throt) (THROT_DELAY_LITE + \
>>  (THROT_OFFSET * throt))
>>  
>> +#define ALARM_OFFSET0x14
>> +#define ALARM_CFG(throt)(OC1_CFG + \
>> +(ALARM_OFFSET * (throt - THROTTLE_OC1)))
>> +
>> +#define ALARM_CNT_THRESHOLD(throt)  (OC1_CNT_THRESHOLD + \
>> +(ALARM_OFFSET * (throt - THROTTLE_OC1)))
>> +
>> +#define ALARM_THROTTLE_PERIOD(throt)(OC1_THROTTLE_PERIOD + \
>> +(ALARM_OFFSET * (throt - THROTTLE_OC1)))
>> +
>> +#define ALARM_ALARM_COUNT(throt)(OC1_ALARM_COUNT + \
>> +(ALARM_OFFSET * (throt - THROTTLE_OC1)))
>> +
>> +#define ALARM_FILTER(throt) (OC1_FILTER + \
>> +(ALARM_OFFSET * (throt - THROTTLE_OC1)))
>> +
>> +#define ALARM_STATS(throt)  (OC1_STATS + \
>> +(4 * (throt - THROTTLE_OC1)))
>> +
>>  /* get CCROC_THROT_PSKIP_xxx offset per HIGH/MED/LOW vect*/
>>  #define CCROC_THROT_OFFSET  0x0c
>>  #define CCROC_THROT_PSKIP_CTRL_CPU_REG(vect)(CCROC_THROT_PSKIP_CTRL_CPU 
>> + \
>> @@ -218,6 +254,9 @@
>>  #define THERMCTL_LVL_REGS_SIZE  0x20
>>  #define THERMCTL_LVL_REG(rg, lv)((rg) + ((lv) * THERMCTL_LVL_REGS_SIZE))
>>  
>> +#define OC_THROTTLE_MODE_DISABLED   0
>> +#define OC_THROTTLE_MODE_BRIEF  2
>> +
>>  static const int min_low_temp = -127000;
>>  static const int max_high_temp = 127000;
>>  
>> @@ -266,6 +305,15 @@ struct tegra_thermctl_zone {
>>  const struct tegra_tsensor_group *sg;
>>  };
>>  
>> +struct soctherm_oc_cfg {
>> +u32 active_low;
>> +u32 throt_period;
>> +u32 alarm_cnt_thresh;
>> +u32 alarm_filter;
>> +u32 mode;
>> +bool intr_en;
>> +};
>> +
>>  struct soctherm_throt_cfg {
>>  const char *name;
>>  unsigned int id;
>> @@ -273,6 +321,7 @@ struct soctherm_throt_cfg {
>>  u8

Re: [PATCH v2 00/12] Add some functionalities for Tegra soctherm

2019-03-25 Thread Wei Ni
Hi all,
Does there have any comments on this serial?

Thanks.
Wei.

On 21/2/2019 6:18 PM, Wei Ni wrote:
> Move the hw/sw shutdown patches into this serial. There already have
> some discussion for it in https://lkml.org/lkml/2018/12/7/225.
> Support GPU HW throttle, thermal IRQ, set_trips(), EDP IRQ and OC
> hw throttle.
> 
> Main change from v1:
> 1. Use boolean for "nvidia,polarity-active-low".
> 2. Add suffix "-us" for "nvidia,throttle-period".
> 
> 
> Wei Ni (12):
>   of: Add bindings of thermtrip for Tegra soctherm
>   thermal: tegra: support hw and sw shutdown
>   arm64: dts: tegra210: set thermtrip
>   of: Add bindings of gpu hw throttle for Tegra soctherm
>   thermal: tegra: add support for gpu hw-throttle
>   arm64: dts: tegra210: set gpu hw throttle level
>   thermal: tegra: add support for thermal IRQ
>   thermal: tegra: add set_trips functionality
>   thermal: tegra: add support for EDP IRQ
>   arm64: dts: tegra210: set EDP interrupt line
>   of: Add bindings of OC hw throttle for Tegra soctherm
>   thermal: tegra: enable OC hw throttle
> 
>  .../bindings/thermal/nvidia,tegra124-soctherm.txt  |  62 +-
>  arch/arm64/boot/dts/nvidia/tegra210.dtsi   |  20 +-
>  drivers/thermal/tegra/soctherm.c   | 961 
> +++--
>  drivers/thermal/tegra/soctherm.h   |  16 +
>  drivers/thermal/tegra/tegra124-soctherm.c  |   7 +-
>  drivers/thermal/tegra/tegra132-soctherm.c  |   7 +-
>  drivers/thermal/tegra/tegra210-soctherm.c  |  15 +-
>  include/dt-bindings/thermal/tegra124-soctherm.h|   8 +-
>  8 files changed, 1020 insertions(+), 76 deletions(-)
> 


[PATCH v2 02/12] thermal: tegra: support hw and sw shutdown

2019-02-21 Thread Wei Ni
Currently the critical trip points in thermal framework are the only
way to specify a temperature at which HW should shutdown. This is
insufficient for certain platforms which would want an orderly
software shutdown in addition to HW shutdown.

This change support to parse "nvidia, thermtrips" property,
it allows soctherm DT to specify thermtrip temperatures so that
critical trip points framework can be used for doing software
shutdown.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c  | 99 ++-
 drivers/thermal/tegra/soctherm.h  |  6 ++
 drivers/thermal/tegra/tegra210-soctherm.c |  8 +++
 3 files changed, 98 insertions(+), 15 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 45b41b885f49..4bb6c097c028 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -446,6 +446,24 @@ find_throttle_cfg_by_name(struct tegra_soctherm *ts, const 
char *name)
return NULL;
 }
 
+static int tsensor_group_thermtrip_get(struct tegra_soctherm *ts, int id)
+{
+   int i, temp = min_low_temp;
+   struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+
+   if (id >= TEGRA124_SOCTHERM_SENSOR_NUM)
+   return temp;
+
+   if (tt) {
+   for (i = 0; i < ts->soc->num_ttgs; i++) {
+   if (tt[i].id == id)
+   return tt[i].temp;
+   }
+   }
+
+   return temp;
+}
+
 static int tegra_thermctl_set_trip_temp(void *data, int trip, int temp)
 {
struct tegra_thermctl_zone *zone = data;
@@ -464,7 +482,16 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return ret;
 
if (type == THERMAL_TRIP_CRITICAL) {
-   return thermtrip_program(dev, sg, temp);
+   /*
+* If thermtrips property is set in DT,
+* doesn't need to program critical type trip to HW,
+* if not, program critical trip to HW.
+*/
+   if (min_low_temp == tsensor_group_thermtrip_get(ts, sg->id))
+   return thermtrip_program(dev, sg, temp);
+   else
+   return 0;
+
} else if (type == THERMAL_TRIP_HOT) {
int i;
 
@@ -523,7 +550,8 @@ static int get_hot_temp(struct thermal_zone_device *tz, int 
*trip, int *temp)
  * @dev: struct device * of the SOC_THERM instance
  *
  * Configure the SOC_THERM HW trip points, setting "THERMTRIP"
- * "THROTTLE" trip points , using "critical" or "hot" type trip_temp
+ * "THROTTLE" trip points , using "thermtrips", "critical" or "hot"
+ * type trip_temp
  * from thermal zone.
  * After they have been configured, THERMTRIP or THROTTLE will take
  * action when the configured SoC thermal sensor group reaches a
@@ -545,28 +573,23 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 {
struct tegra_soctherm *ts = dev_get_drvdata(dev);
struct soctherm_throt_cfg *stc;
-   int i, trip, temperature;
-   int ret;
+   int i, trip, temperature, ret;
 
-   ret = tz->ops->get_crit_temp(tz, );
-   if (ret) {
-   dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
-sg->name);
-   goto set_throttle;
-   }
+   /* Get thermtrips. If missing, try to get critical trips. */
+   temperature = tsensor_group_thermtrip_get(ts, sg->id);
+   if (min_low_temp == temperature)
+   if (tz->ops->get_crit_temp(tz, ))
+   temperature = max_high_temp;
 
ret = thermtrip_program(dev, sg, temperature);
if (ret) {
-   dev_err(dev, "thermtrip: %s: error during enable\n",
-   sg->name);
+   dev_err(dev, "thermtrip: %s: error during enable\n", sg->name);
return ret;
}
 
-   dev_info(dev,
-"thermtrip: will shut down when %s reaches %d mC\n",
+   dev_info(dev, "thermtrip: will shut down when %s reaches %d mC\n",
 sg->name, temperature);
 
-set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
dev_warn(dev, "throttrip: %s: missing hot temperature\n",
@@ -897,6 +920,50 @@ static const struct thermal_cooling_device_ops 
throt_cooling_ops = {
.set_cur_state = throt_set_cdev_state,
 };
 
+static int soctherm_thermtrips_parse(struct platform_device *pdev)
+{
+   struct device *dev = >dev;
+   struct tegra_soctherm *ts = dev_get_drvdata(dev);
+   struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+   const int max_num_prop = ts->soc->num_ttgs * 2;
+   u3

[PATCH v2 04/12] of: Add bindings of gpu hw throttle for Tegra soctherm

2019-02-21 Thread Wei Ni
Add "nvidia,gpu-throt-level" property to set gpu hw
throttle level.

Signed-off-by: Wei Ni 
---
 .../bindings/thermal/nvidia,tegra124-soctherm.txt   | 17 +++--
 include/dt-bindings/thermal/tegra124-soctherm.h |  8 
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git 
a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
index ab66d6feab4b..cf6d0be56b7a 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
@@ -52,6 +52,15 @@ Required properties :
 Must set as following values:
 TEGRA_SOCTHERM_THROT_LEVEL_LOW, TEGRA_SOCTHERM_THROT_LEVEL_MED
 TEGRA_SOCTHERM_THROT_LEVEL_HIGH, TEGRA_SOCTHERM_THROT_LEVEL_NONE
+  - nvidia,gpu-throt-level: This property is for Tegra124 and Tegra210.
+It is the level of pulse skippers, which used to throttle clock
+frequencies. It indicates gpu clock throttling depth and can be
+programmed to any of the following values which represent a throttling
+percentage:
+TEGRA_SOCTHERM_THROT_LEVEL_NONE (0%)
+TEGRA_SOCTHERM_THROT_LEVEL_LOW (50%),
+TEGRA_SOCTHERM_THROT_LEVEL_MED (75%),
+TEGRA_SOCTHERM_THROT_LEVEL_HIGH (85%).
   - #cooling-cells: Should be 1. This cooling device only support on/off 
state.
 See ./thermal.txt for a description of this property.
 
@@ -96,22 +105,26 @@ Example :
throttle-cfgs {
/*
 * When the "heavy" cooling device triggered,
-* the HW will skip cpu clock's pulse in 85% depth
+* the HW will skip cpu clock's pulse in 85% depth,
+* skip gpu clock's pulse in 85% level
 */
throttle_heavy: heavy {
nvidia,priority = <100>;
nvidia,cpu-throt-percent = <85>;
+   nvidia,gpu-throt-level = 
;
 
#cooling-cells = <1>;
};
 
/*
 * When the "light" cooling device triggered,
-* the HW will skip cpu clock's pulse in 50% depth
+* the HW will skip cpu clock's pulse in 50% depth,
+* skip gpu clock's pulse in 50% level
 */
throttle_light: light {
nvidia,priority = <80>;
nvidia,cpu-throt-percent = <50>;
+   nvidia,gpu-throt-level = 
;
 
#cooling-cells = <1>;
};
diff --git a/include/dt-bindings/thermal/tegra124-soctherm.h 
b/include/dt-bindings/thermal/tegra124-soctherm.h
index c15e8b709a0d..444c7bdde146 100644
--- a/include/dt-bindings/thermal/tegra124-soctherm.h
+++ b/include/dt-bindings/thermal/tegra124-soctherm.h
@@ -12,9 +12,9 @@
 #define TEGRA124_SOCTHERM_SENSOR_PLLX 3
 #define TEGRA124_SOCTHERM_SENSOR_NUM 4
 
-#define TEGRA_SOCTHERM_THROT_LEVEL_LOW  0
-#define TEGRA_SOCTHERM_THROT_LEVEL_MED  1
-#define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 2
-#define TEGRA_SOCTHERM_THROT_LEVEL_NONE -1
+#define TEGRA_SOCTHERM_THROT_LEVEL_NONE 0
+#define TEGRA_SOCTHERM_THROT_LEVEL_LOW  1
+#define TEGRA_SOCTHERM_THROT_LEVEL_MED  2
+#define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 3
 
 #endif
-- 
2.7.4



[PATCH v2 05/12] thermal: tegra: add support for gpu hw-throttle

2019-02-21 Thread Wei Ni
Add support to trigger pulse skippers on the GPU
when a HOT trip point is triggered. The pulse skippers
can be signalled to throttle at low, medium and high
depths\levels.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 118 ---
 1 file changed, 85 insertions(+), 33 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 4bb6c097c028..edbb90da1ac3 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1,5 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
- * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2014 - 2018, NVIDIA CORPORATION.  All rights reserved.
  *
  * Author:
  * Mikko Perttunen 
@@ -160,6 +161,15 @@
 /* get dividend from the depth */
 #define THROT_DEPTH_DIVIDEND(depth)((256 * (100 - (depth)) / 100) - 1)
 
+/* gk20a nv_therm interface N:3 Mapping. Levels defined in tegra124-sochterm.h
+ * level   vector
+ * NONE3'b000
+ * LOW 3'b001
+ * MED 3'b011
+ * HIGH3'b111
+ */
+#define THROT_LEVEL_TO_DEPTH(level)((0x1 << (level)) - 1)
+
 /* get THROT_PSKIP_xxx offset per LIGHT/HEAVY throt and CPU/GPU dev */
 #define THROT_OFFSET   0x30
 #define THROT_PSKIP_CTRL(throt, dev)   (THROT_PSKIP_CTRL_LITE_CPU + \
@@ -219,6 +229,7 @@ struct soctherm_throt_cfg {
u8 priority;
u8 cpu_throt_level;
u32 cpu_throt_depth;
+   u32 gpu_throt_level;
struct thermal_cooling_device *cdev;
bool init;
 };
@@ -964,6 +975,50 @@ static int soctherm_thermtrips_parse(struct 
platform_device *pdev)
return 0;
 }
 
+static int soctherm_throt_cfg_parse(struct device *dev,
+   struct device_node *np,
+   struct soctherm_throt_cfg *stc)
+{
+   struct tegra_soctherm *ts = dev_get_drvdata(dev);
+   int ret;
+   u32 val;
+
+   ret = of_property_read_u32(np, "nvidia,priority", );
+   if (ret) {
+   dev_err(dev, "throttle-cfg: %s: invalid priority\n", stc->name);
+   return -EINVAL;
+   }
+   stc->priority = val;
+
+   ret = of_property_read_u32(np, ts->soc->use_ccroc ?
+  "nvidia,cpu-throt-level" :
+  "nvidia,cpu-throt-percent", );
+   if (!ret) {
+   if (ts->soc->use_ccroc &&
+   val <= TEGRA_SOCTHERM_THROT_LEVEL_HIGH)
+   stc->cpu_throt_level = val;
+   else if (!ts->soc->use_ccroc && val <= 100)
+   stc->cpu_throt_depth = val;
+   else
+   goto err;
+   } else {
+   goto err;
+   }
+
+   ret = of_property_read_u32(np, "nvidia,gpu-throt-level", );
+   if (!ret && val <= TEGRA_SOCTHERM_THROT_LEVEL_HIGH)
+   stc->gpu_throt_level = val;
+   else
+   goto err;
+
+   return 0;
+
+err:
+   dev_err(dev, "throttle-cfg: %s: no throt prop or invalid prop\n",
+   stc->name);
+   return -EINVAL;
+}
+
 /**
  * soctherm_init_hw_throt_cdev() - Parse the HW throttle configurations
  * and register them as cooling devices.
@@ -974,8 +1029,7 @@ static void soctherm_init_hw_throt_cdev(struct 
platform_device *pdev)
struct tegra_soctherm *ts = dev_get_drvdata(dev);
struct device_node *np_stc, *np_stcc;
const char *name;
-   u32 val;
-   int i, r;
+   int i;
 
for (i = 0; i < THROTTLE_SIZE; i++) {
ts->throt_cfgs[i].name = throt_names[i];
@@ -993,6 +1047,7 @@ static void soctherm_init_hw_throt_cdev(struct 
platform_device *pdev)
for_each_child_of_node(np_stc, np_stcc) {
struct soctherm_throt_cfg *stc;
struct thermal_cooling_device *tcd;
+   int err;
 
name = np_stcc->name;
stc = find_throttle_cfg_by_name(ts, name);
@@ -1002,37 +1057,10 @@ static void soctherm_init_hw_throt_cdev(struct 
platform_device *pdev)
continue;
}
 
-   r = of_property_read_u32(np_stcc, "nvidia,priority", );
-   if (r) {
-   dev_info(dev,
-"throttle-cfg: %s: missing priority\n", name);
+
+   err = soctherm_throt_cfg_parse(dev, np_stcc, stc);
+   if (err)
continue;
-   }
-   stc->priority = val;
-
-   if (ts->soc->use_ccroc) {
-   r = of_property_read_u32(np_stcc,
-"nvidia,cpu-throt-level",
- 

[PATCH v2 10/12] arm64: dts: tegra210: set EDP interrupt line

2019-02-21 Thread Wei Ni
Set EDP interrupt line.

Signed-off-by: Wei Ni 
---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 551600513c1a..19966b9f5ce7 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1402,7 +1402,8 @@
reg = <0x0 0x700e2000 0x0 0x600 /* SOC_THERM reg_base */
0x0 0x60006000 0x0 0x400>; /* CAR reg_base */
reg-names = "soctherm-reg", "car-reg";
-   interrupts = ;
+   interrupts = ;
clocks = <_car TEGRA210_CLK_TSENSOR>,
<_car TEGRA210_CLK_SOC_THERM>;
clock-names = "tsensor", "soctherm";
-- 
2.7.4



[PATCH v2 09/12] thermal: tegra: add support for EDP IRQ

2019-02-21 Thread Wei Ni
Add support to generate OC (over-current) interrupts to
indicate the OC event and print out alarm messages.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 420 +++
 1 file changed, 420 insertions(+)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 69a0d553ec9e..b8c66368e54e 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -23,6 +23,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -104,6 +106,16 @@
 #define STATS_CTL_CLR_UP   0x2
 #define STATS_CTL_EN_UP0x1
 
+#define OC_INTR_STATUS 0x39c
+#define OC_INTR_ENABLE 0x3a0
+#define OC_INTR_DISABLE0x3a4
+
+#define OC_INTR_OC1_MASK   BIT(0)
+#define OC_INTR_OC2_MASK   BIT(1)
+#define OC_INTR_OC3_MASK   BIT(2)
+#define OC_INTR_OC4_MASK   BIT(3)
+#define OC_INTR_OC5_MASK   BIT(4)
+
 #define THROT_GLOBAL_CFG   0x400
 #define THROT_GLOBAL_ENB_MASK  BIT(0)
 
@@ -212,9 +224,23 @@ static const int max_high_temp = 127000;
 enum soctherm_throttle_id {
THROTTLE_LIGHT = 0,
THROTTLE_HEAVY,
+   THROTTLE_OC1,
+   THROTTLE_OC2,
+   THROTTLE_OC3,
+   THROTTLE_OC4,
+   THROTTLE_OC5, /* OC5 is reserved */
THROTTLE_SIZE,
 };
 
+enum soctherm_oc_irq_id {
+   TEGRA_SOC_OC_IRQ_1,
+   TEGRA_SOC_OC_IRQ_2,
+   TEGRA_SOC_OC_IRQ_3,
+   TEGRA_SOC_OC_IRQ_4,
+   TEGRA_SOC_OC_IRQ_5,
+   TEGRA_SOC_OC_IRQ_MAX,
+};
+
 enum soctherm_throttle_dev_id {
THROTTLE_DEV_CPU = 0,
THROTTLE_DEV_GPU,
@@ -224,6 +250,11 @@ enum soctherm_throttle_dev_id {
 static const char *const throt_names[] = {
[THROTTLE_LIGHT] = "light",
[THROTTLE_HEAVY] = "heavy",
+   [THROTTLE_OC1]   = "oc1",
+   [THROTTLE_OC2]   = "oc2",
+   [THROTTLE_OC3]   = "oc3",
+   [THROTTLE_OC4]   = "oc4",
+   [THROTTLE_OC5]   = "oc5",
 };
 
 struct tegra_soctherm;
@@ -255,6 +286,7 @@ struct tegra_soctherm {
void __iomem *ccroc_regs;
 
int thermal_irq;
+   int edp_irq;
 
u32 *calib;
struct thermal_zone_device **thermctl_tzs;
@@ -267,6 +299,15 @@ struct tegra_soctherm {
struct mutex thermctl_lock;
 };
 
+struct soctherm_oc_irq_chip_data {
+   struct mutexirq_lock; /* serialize OC IRQs */
+   struct irq_chip irq_chip;
+   struct irq_domain   *domain;
+   int irq_enable;
+};
+
+static struct soctherm_oc_irq_chip_data soc_irq_cdata;
+
 /**
  * ccroc_writel() - writes a value to a CCROC register
  * @ts: pointer to a struct tegra_soctherm
@@ -807,6 +848,360 @@ static irqreturn_t soctherm_thermal_isr_thread(int irq, 
void *dev_id)
return IRQ_HANDLED;
 }
 
+/**
+ * soctherm_oc_intr_enable() - Enables the soctherm over-current interrupt
+ * @alarm: The soctherm throttle id
+ * @enable:Flag indicating enable the soctherm over-current
+ * interrupt or disable it
+ *
+ * Enables a specific over-current pins @alarm to raise an interrupt if the 
flag
+ * is set and the alarm corresponds to OC1, OC2, OC3, or OC4.
+ */
+static void soctherm_oc_intr_enable(struct tegra_soctherm *ts,
+   enum soctherm_throttle_id alarm,
+   bool enable)
+{
+   u32 r;
+
+   if (!enable)
+   return;
+
+   r = readl(ts->regs + OC_INTR_ENABLE);
+   switch (alarm) {
+   case THROTTLE_OC1:
+   r = REG_SET_MASK(r, OC_INTR_OC1_MASK, 1);
+   break;
+   case THROTTLE_OC2:
+   r = REG_SET_MASK(r, OC_INTR_OC2_MASK, 1);
+   break;
+   case THROTTLE_OC3:
+   r = REG_SET_MASK(r, OC_INTR_OC3_MASK, 1);
+   break;
+   case THROTTLE_OC4:
+   r = REG_SET_MASK(r, OC_INTR_OC4_MASK, 1);
+   break;
+   default:
+   r = 0;
+   break;
+   }
+   writel(r, ts->regs + OC_INTR_ENABLE);
+}
+
+/**
+ * soctherm_handle_alarm() - Handles soctherm alarms
+ * @alarm: The soctherm throttle id
+ *
+ * "Handles" over-current alarms (OC1, OC2, OC3, and OC4) by printing
+ * a warning or informative message.
+ *
+ * Return: -EINVAL for @alarm = THROTTLE_OC3, otherwise 0 (success).
+ */
+static int soctherm_handle_alarm(enum soctherm_throttle_id alarm)
+{
+   int rv = -EINVAL;
+
+   switch (alarm) {
+   case THROTTLE_OC1:
+   pr_debug("soctherm: Successfully handled OC1 alarm\n");
+   rv = 0;
+   break;
+
+   case THROTTLE

[PATCH v2 07/12] thermal: tegra: add support for thermal IRQ

2019-02-21 Thread Wei Ni
Support to generate an interrupt when the temperature
crosses a programmed threshold and notify the thermal framework.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 136 +++
 1 file changed, 136 insertions(+)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index edbb90da1ac3..16275de2d67b 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -86,6 +86,20 @@
 #define THERMCTL_LVL0_UP_STATS 0x10
 #define THERMCTL_LVL0_DN_STATS 0x14
 
+#define THERMCTL_INTR_STATUS   0x84
+#define THERMCTL_INTR_ENABLE   0x88
+#define THERMCTL_INTR_DISABLE  0x8c
+
+#define TH_INTR_MD0_MASK   BIT(25)
+#define TH_INTR_MU0_MASK   BIT(24)
+#define TH_INTR_GD0_MASK   BIT(17)
+#define TH_INTR_GU0_MASK   BIT(16)
+#define TH_INTR_CD0_MASK   BIT(9)
+#define TH_INTR_CU0_MASK   BIT(8)
+#define TH_INTR_PD0_MASK   BIT(1)
+#define TH_INTR_PU0_MASK   BIT(0)
+#define TH_INTR_IGNORE_MASK0xFCFCFCFC
+
 #define THERMCTL_STATS_CTL 0x94
 #define STATS_CTL_CLR_DN   0x8
 #define STATS_CTL_EN_DN0x4
@@ -242,6 +256,8 @@ struct tegra_soctherm {
void __iomem *clk_regs;
void __iomem *ccroc_regs;
 
+   int thermal_irq;
+
u32 *calib;
struct thermal_zone_device **thermctl_tzs;
struct tegra_soctherm_soc *soc;
@@ -640,6 +656,98 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
return 0;
 }
 
+static irqreturn_t soctherm_thermal_isr(int irq, void *dev_id)
+{
+   struct tegra_soctherm *ts = dev_id;
+   u32 r;
+
+   r = readl(ts->regs + THERMCTL_INTR_STATUS);
+   writel(r, ts->regs + THERMCTL_INTR_DISABLE);
+
+   return IRQ_WAKE_THREAD;
+}
+
+/**
+ * soctherm_thermal_isr_thread() - Handles a thermal interrupt request
+ * @irq:   The interrupt number being requested; not used
+ * @dev_id:Opaque pointer to tegra_soctherm;
+ *
+ * Clears the interrupt status register if there are expected
+ * interrupt bits set.
+ * The interrupt(s) are then handled by updating the corresponding
+ * thermal zones.
+ *
+ * An error is logged if any unexpected interrupt bits are set.
+ *
+ * Disabled interrupts are re-enabled.
+ *
+ * Return: %IRQ_HANDLED. Interrupt was handled and no further processing
+ * is needed.
+ */
+static irqreturn_t soctherm_thermal_isr_thread(int irq, void *dev_id)
+{
+   struct tegra_soctherm *ts = dev_id;
+   struct thermal_zone_device *tz;
+   u32 st, ex = 0, cp = 0, gp = 0, pl = 0, me = 0;
+
+   st = readl(ts->regs + THERMCTL_INTR_STATUS);
+
+   /* deliberately clear expected interrupts handled in SW */
+   cp |= st & TH_INTR_CD0_MASK;
+   cp |= st & TH_INTR_CU0_MASK;
+
+   gp |= st & TH_INTR_GD0_MASK;
+   gp |= st & TH_INTR_GU0_MASK;
+
+   pl |= st & TH_INTR_PD0_MASK;
+   pl |= st & TH_INTR_PU0_MASK;
+
+   me |= st & TH_INTR_MD0_MASK;
+   me |= st & TH_INTR_MU0_MASK;
+
+   ex |= cp | gp | pl | me;
+   if (ex) {
+   writel(ex, ts->regs + THERMCTL_INTR_STATUS);
+   st &= ~ex;
+
+   if (cp) {
+   tz = ts->thermctl_tzs[TEGRA124_SOCTHERM_SENSOR_CPU];
+   thermal_zone_device_update(tz,
+  THERMAL_EVENT_UNSPECIFIED);
+   }
+
+   if (gp) {
+   tz = ts->thermctl_tzs[TEGRA124_SOCTHERM_SENSOR_GPU];
+   thermal_zone_device_update(tz,
+  THERMAL_EVENT_UNSPECIFIED);
+   }
+
+   if (pl) {
+   tz = ts->thermctl_tzs[TEGRA124_SOCTHERM_SENSOR_PLLX];
+   thermal_zone_device_update(tz,
+  THERMAL_EVENT_UNSPECIFIED);
+   }
+
+   if (me) {
+   tz = ts->thermctl_tzs[TEGRA124_SOCTHERM_SENSOR_MEM];
+   thermal_zone_device_update(tz,
+  THERMAL_EVENT_UNSPECIFIED);
+   }
+   }
+
+   /* deliberately ignore expected interrupts NOT handled in SW */
+   ex |= TH_INTR_IGNORE_MASK;
+   st &= ~ex;
+
+   if (st) {
+   /* Whine about any other unexpected INTR bits still set */
+   pr_err("soctherm: Ignored unexpected INTRs 0x%08x\n", st);
+   writel(st, ts->regs + THERMCTL_INTR_STATUS);
+   }
+
+   return IRQ_HANDLED;
+}
+
 #ifdef CONFIG_DEBUG_FS
 static int regs_show(struct seq_file *s, voi

[PATCH v2 06/12] arm64: dts: tegra210: set gpu hw throttle level

2019-02-21 Thread Wei Ni
Set gpu hw throttle level to TEGRA_SOCTHERM_THROT_LEVEL_HIGH

Signed-off-by: Wei Ni 
---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 582d56820bbb..551600513c1a 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1417,6 +1417,8 @@
throttle_heavy: heavy {
nvidia,priority = <100>;
nvidia,cpu-throt-percent = <85>;
+   nvidia,gpu-throt-level =
+   ;
 
#cooling-cells = <2>;
};
-- 
2.7.4



[PATCH v2 08/12] thermal: tegra: add set_trips functionality

2019-02-21 Thread Wei Ni
Implement set_trips ops to set passive trip points.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c  | 64 ++-
 drivers/thermal/tegra/soctherm.h  | 10 +
 drivers/thermal/tegra/tegra124-soctherm.c |  7 +++-
 drivers/thermal/tegra/tegra132-soctherm.c |  7 +++-
 drivers/thermal/tegra/tegra210-soctherm.c |  7 +++-
 5 files changed, 90 insertions(+), 5 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 16275de2d67b..69a0d553ec9e 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -87,8 +87,6 @@
 #define THERMCTL_LVL0_DN_STATS 0x14
 
 #define THERMCTL_INTR_STATUS   0x84
-#define THERMCTL_INTR_ENABLE   0x88
-#define THERMCTL_INTR_DISABLE  0x8c
 
 #define TH_INTR_MD0_MASK   BIT(25)
 #define TH_INTR_MU0_MASK   BIT(24)
@@ -265,6 +263,8 @@ struct tegra_soctherm {
struct soctherm_throt_cfg throt_cfgs[THROTTLE_SIZE];
 
struct dentry *debugfs_dir;
+
+   struct mutex thermctl_lock;
 };
 
 /**
@@ -542,9 +542,59 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return 0;
 }
 
+static void thermal_irq_enable(struct tegra_thermctl_zone *zn)
+{
+   u32 r;
+
+   /* multiple zones could be handling and setting trips at once */
+   mutex_lock(>ts->thermctl_lock);
+   r = readl(zn->ts->regs + THERMCTL_INTR_ENABLE);
+   r = REG_SET_MASK(r, zn->sg->thermctl_isr_mask, TH_INTR_UP_DN_EN);
+   writel(r, zn->ts->regs + THERMCTL_INTR_ENABLE);
+   mutex_unlock(>ts->thermctl_lock);
+}
+
+static void thermal_irq_disable(struct tegra_thermctl_zone *zn)
+{
+   u32 r;
+
+   /* multiple zones could be handling and setting trips at once */
+   mutex_lock(>ts->thermctl_lock);
+   r = readl(zn->ts->regs + THERMCTL_INTR_DISABLE);
+   r = REG_SET_MASK(r, zn->sg->thermctl_isr_mask, 0);
+   writel(r, zn->ts->regs + THERMCTL_INTR_DISABLE);
+   mutex_unlock(>ts->thermctl_lock);
+}
+
+static int tegra_thermctl_set_trips(void *data, int lo, int hi)
+{
+   struct tegra_thermctl_zone *zone = data;
+   u32 r;
+
+   thermal_irq_disable(zone);
+
+   r = readl(zone->ts->regs + zone->sg->thermctl_lvl0_offset);
+   r = REG_SET_MASK(r, THERMCTL_LVL0_CPU0_EN_MASK, 0);
+   writel(r, zone->ts->regs + zone->sg->thermctl_lvl0_offset);
+
+   lo = enforce_temp_range(zone->dev, lo) / zone->ts->soc->thresh_grain;
+   hi = enforce_temp_range(zone->dev, hi) / zone->ts->soc->thresh_grain;
+   dev_dbg(zone->dev, "%s hi:%d, lo:%d\n", __func__, hi, lo);
+
+   r = REG_SET_MASK(r, zone->sg->thermctl_lvl0_up_thresh_mask, hi);
+   r = REG_SET_MASK(r, zone->sg->thermctl_lvl0_dn_thresh_mask, lo);
+   r = REG_SET_MASK(r, THERMCTL_LVL0_CPU0_EN_MASK, 1);
+   writel(r, zone->ts->regs + zone->sg->thermctl_lvl0_offset);
+
+   thermal_irq_enable(zone);
+
+   return 0;
+}
+
 static const struct thermal_zone_of_device_ops tegra_of_thermal_ops = {
.get_temp = tegra_thermctl_get_temp,
.set_trip_temp = tegra_thermctl_set_trip_temp,
+   .set_trips = tegra_thermctl_set_trips,
 };
 
 static int get_hot_temp(struct thermal_zone_device *tz, int *trip, int *temp)
@@ -661,6 +711,15 @@ static irqreturn_t soctherm_thermal_isr(int irq, void 
*dev_id)
struct tegra_soctherm *ts = dev_id;
u32 r;
 
+   /* Case for no lock:
+* Although interrupts are enabled in set_trips, there is still no need
+* to lock here because the interrupts are disabled before programming
+* new trip points. Hence there cant be a interrupt on the same sensor.
+* An interrupt can however occur on a sensor while trips are being
+* programmed on a different one. This beign a LEVEL interrupt won't
+* cause a new interrupt but this is taken care of by the re-reading of
+* the STATUS register in the thread function.
+*/
r = readl(ts->regs + THERMCTL_INTR_STATUS);
writel(r, ts->regs + THERMCTL_INTR_DISABLE);
 
@@ -1513,6 +1572,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
if (!tegra)
return -ENOMEM;
 
+   mutex_init(>thermctl_lock);
dev_set_drvdata(>dev, tegra);
 
tegra->soc = soc;
diff --git a/drivers/thermal/tegra/soctherm.h b/drivers/thermal/tegra/soctherm.h
index c05c7e37e968..70501e73d586 100644
--- a/drivers/thermal/tegra/soctherm.h
+++ b/drivers/thermal/tegra/soctherm.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2014-2016, NVIDIA CORPORATION.  All rights reserved.
  *
@@ -29,6 +30,14 @@
 #define THERMCTL_THERMTRIP_CTL 

[PATCH v2 12/12] thermal: tegra: enable OC hw throttle

2019-02-21 Thread Wei Ni
Parse Over Current settings from DT and program them to
generate interrupts. Also enable hw throttling whenever
there are OC events. Log the OC events as debug messages.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 130 ---
 1 file changed, 120 insertions(+), 10 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index b8c66368e54e..6e3f329d1ac4 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -106,9 +106,26 @@
 #define STATS_CTL_CLR_UP   0x2
 #define STATS_CTL_EN_UP0x1
 
+#define OC1_CFG0x310
+#define OC1_CFG_LONG_LATENCY_MASK  BIT(6)
+#define OC1_CFG_HW_RESTORE_MASKBIT(5)
+#define OC1_CFG_PWR_GOOD_MASK_MASK BIT(4)
+#define OC1_CFG_THROTTLE_MODE_MASK (0x3 << 2)
+#define OC1_CFG_ALARM_POLARITY_MASKBIT(1)
+#define OC1_CFG_EN_THROTTLE_MASK   BIT(0)
+
+#define OC1_CNT_THRESHOLD  0x314
+#define OC1_THROTTLE_PERIOD0x318
+#define OC1_ALARM_COUNT0x31c
+#define OC1_FILTER 0x320
+#define OC1_STATS  0x3a8
+
 #define OC_INTR_STATUS 0x39c
 #define OC_INTR_ENABLE 0x3a0
 #define OC_INTR_DISABLE0x3a4
+#define OC_STATS_CTL   0x3c4
+#define OC_STATS_CTL_CLR_ALL   0x2
+#define OC_STATS_CTL_EN_ALL0x1
 
 #define OC_INTR_OC1_MASK   BIT(0)
 #define OC_INTR_OC2_MASK   BIT(1)
@@ -207,6 +224,25 @@
 #define THROT_DELAY_CTRL(throt)(THROT_DELAY_LITE + \
(THROT_OFFSET * throt))
 
+#define ALARM_OFFSET   0x14
+#define ALARM_CFG(throt)   (OC1_CFG + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_CNT_THRESHOLD(throt) (OC1_CNT_THRESHOLD + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_THROTTLE_PERIOD(throt)   (OC1_THROTTLE_PERIOD + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_ALARM_COUNT(throt)   (OC1_ALARM_COUNT + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_FILTER(throt)(OC1_FILTER + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_STATS(throt) (OC1_STATS + \
+   (4 * (throt - THROTTLE_OC1)))
+
 /* get CCROC_THROT_PSKIP_xxx offset per HIGH/MED/LOW vect*/
 #define CCROC_THROT_OFFSET 0x0c
 #define CCROC_THROT_PSKIP_CTRL_CPU_REG(vect)(CCROC_THROT_PSKIP_CTRL_CPU + \
@@ -218,6 +254,9 @@
 #define THERMCTL_LVL_REGS_SIZE 0x20
 #define THERMCTL_LVL_REG(rg, lv)   ((rg) + ((lv) * THERMCTL_LVL_REGS_SIZE))
 
+#define OC_THROTTLE_MODE_DISABLED  0
+#define OC_THROTTLE_MODE_BRIEF 2
+
 static const int min_low_temp = -127000;
 static const int max_high_temp = 127000;
 
@@ -266,6 +305,15 @@ struct tegra_thermctl_zone {
const struct tegra_tsensor_group *sg;
 };
 
+struct soctherm_oc_cfg {
+   u32 active_low;
+   u32 throt_period;
+   u32 alarm_cnt_thresh;
+   u32 alarm_filter;
+   u32 mode;
+   bool intr_en;
+};
+
 struct soctherm_throt_cfg {
const char *name;
unsigned int id;
@@ -273,6 +321,7 @@ struct soctherm_throt_cfg {
u8 cpu_throt_level;
u32 cpu_throt_depth;
u32 gpu_throt_level;
+   struct soctherm_oc_cfg oc_cfg;
struct thermal_cooling_device *cdev;
bool init;
 };
@@ -715,7 +764,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
return 0;
}
 
-   for (i = 0; i < THROTTLE_SIZE; i++) {
+   for (i = 0; i < THROTTLE_OC1; i++) {
struct thermal_cooling_device *cdev;
 
if (!ts->throt_cfgs[i].init)
@@ -1537,6 +1586,32 @@ static int soctherm_thermtrips_parse(struct 
platform_device *pdev)
return 0;
 }
 
+static void soctherm_oc_cfg_parse(struct device *dev,
+   struct device_node *np_oc,
+   struct soctherm_throt_cfg *stc)
+{
+   u32 val;
+
+   if (of_property_read_bool(np_oc, "nvidia,polarity-active-low"))
+   stc->oc_cfg.active_low = 1;
+   else
+   stc->oc_cfg.active_low = 0;
+
+   if (!of_property_read_u32(np_oc, "nvidia,count-threshold", )) {
+   stc->oc_cfg.intr_en = 1;
+   stc->oc_cfg.alarm_cnt_thresh = val;
+   }
+
+   if (!of_prop

[PATCH v2 11/12] of: Add bindings of OC hw throttle for Tegra soctherm

2019-02-21 Thread Wei Ni
Add OC HW throttle configuration for soctherm in DT.
It is used to describe the OCx throttle events.

Signed-off-by: Wei Ni 
---
 .../bindings/thermal/nvidia,tegra124-soctherm.txt  | 25 ++
 1 file changed, 25 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
index cf6d0be56b7a..f02f38527a6b 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
@@ -64,6 +64,20 @@ Required properties :
   - #cooling-cells: Should be 1. This cooling device only support on/off 
state.
 See ./thermal.txt for a description of this property.
 
+  Optional properties: The following properties are T210 specific and
+  valid only for OCx throttle events.
+  - nvidia,count-threshold: Specifies the number of OC events that are
+required for triggering an interrupt. Interrupts are not triggered if
+the property is missing. A value of 0 will interrupt on every OC alarm.
+  - nvidia,polarity-active-low: Configures the polarity of the OC alaram
+signal. If present, this means assert low, otherwise assert high.
+  - nvidia,alarm-filter: Number of clocks to filter event. When the filter
+expires (which means the OC event has not occurred for a long time),
+the counter is cleared and filter is rearmed. Default value is 0.
+  - nvidia,throttle-period-us: Specifies the number of uSec for which
+throttling is engaged after the OC event is deasserted. Default value
+is 0.
+
 Optional properties:
 - nvidia,thermtrips : When present, this property specifies the temperature at
   which the soctherm hardware will assert the thermal trigger signal to the
@@ -134,6 +148,17 @@ Example :
 * arbiter will select the highest priority as the 
final throttle
 * settings to skip cpu pulse.
 */
+
+   throttle_oc1: oc1 {
+   nvidia,priority = <50>;
+   nvidia,polarity-active-low;
+   nvidia,count-threshold = <100>;
+   nvidia,alarm-filter = <510>;
+   nvidia,throttle-period-us = <0>;
+   nvidia,cpu-throt-percent = <75>;
+   nvidia,gpu-throt-level =
+   
;
+};
};
};
 
-- 
2.7.4



[PATCH v2 03/12] arm64: dts: tegra210: set thermtrip

2019-02-21 Thread Wei Ni
Set "nvidia,thermtrips" property, it used to set
HW shutdown temperatures.

Signed-off-by: Wei Ni 
---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 15 +--
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 6574396d2257..582d56820bbb 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1410,6 +1410,9 @@
reset-names = "soctherm";
#thermal-sensor-cells = <1>;
 
+   nvidia,thermtrips = ;
+
throttle-cfgs {
throttle_heavy: heavy {
nvidia,priority = <100>;
@@ -1429,8 +1432,8 @@
< TEGRA124_SOCTHERM_SENSOR_CPU>;
 
trips {
-   cpu-shutdown-trip {
-   temperature = <102500>;
+   cpu-critical-trip {
+   temperature = <102000>;
hysteresis = <0>;
type = "critical";
};
@@ -1457,7 +1460,7 @@
< TEGRA124_SOCTHERM_SENSOR_MEM>;
 
trips {
-   mem-shutdown-trip {
+   mem-critical-trip {
temperature = <103000>;
hysteresis = <0>;
type = "critical";
@@ -1479,8 +1482,8 @@
< TEGRA124_SOCTHERM_SENSOR_GPU>;
 
trips {
-   gpu-shutdown-trip {
-   temperature = <103000>;
+   gpu-critical-trip {
+   temperature = <102500>;
hysteresis = <0>;
type = "critical";
};
@@ -1507,7 +1510,7 @@
< TEGRA124_SOCTHERM_SENSOR_PLLX>;
 
trips {
-   pllx-shutdown-trip {
+   pllx-critical-trip {
temperature = <103000>;
hysteresis = <0>;
type = "critical";
-- 
2.7.4



[PATCH v2 00/12] Add some functionalities for Tegra soctherm

2019-02-21 Thread Wei Ni
Move the hw/sw shutdown patches into this serial. There already have
some discussion for it in https://lkml.org/lkml/2018/12/7/225.
Support GPU HW throttle, thermal IRQ, set_trips(), EDP IRQ and OC
hw throttle.

Main change from v1:
1. Use boolean for "nvidia,polarity-active-low".
2. Add suffix "-us" for "nvidia,throttle-period".


Wei Ni (12):
  of: Add bindings of thermtrip for Tegra soctherm
  thermal: tegra: support hw and sw shutdown
  arm64: dts: tegra210: set thermtrip
  of: Add bindings of gpu hw throttle for Tegra soctherm
  thermal: tegra: add support for gpu hw-throttle
  arm64: dts: tegra210: set gpu hw throttle level
  thermal: tegra: add support for thermal IRQ
  thermal: tegra: add set_trips functionality
  thermal: tegra: add support for EDP IRQ
  arm64: dts: tegra210: set EDP interrupt line
  of: Add bindings of OC hw throttle for Tegra soctherm
  thermal: tegra: enable OC hw throttle

 .../bindings/thermal/nvidia,tegra124-soctherm.txt  |  62 +-
 arch/arm64/boot/dts/nvidia/tegra210.dtsi   |  20 +-
 drivers/thermal/tegra/soctherm.c   | 961 +++--
 drivers/thermal/tegra/soctherm.h   |  16 +
 drivers/thermal/tegra/tegra124-soctherm.c  |   7 +-
 drivers/thermal/tegra/tegra132-soctherm.c  |   7 +-
 drivers/thermal/tegra/tegra210-soctherm.c  |  15 +-
 include/dt-bindings/thermal/tegra124-soctherm.h|   8 +-
 8 files changed, 1020 insertions(+), 76 deletions(-)

-- 
2.7.4



[PATCH v2 01/12] of: Add bindings of thermtrip for Tegra soctherm

2019-02-21 Thread Wei Ni
Add optional property "nvidia,thermtrips".
If present, these trips will be used as HW shutdown trips,
and critical trips will be used as SW shutdown trips.

Signed-off-by: Wei Ni 
---
 .../bindings/thermal/nvidia,tegra124-soctherm.txt| 20 +---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git 
a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
index b6c0ae53d4dc..ab66d6feab4b 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
@@ -55,10 +55,21 @@ Required properties :
   - #cooling-cells: Should be 1. This cooling device only support on/off 
state.
 See ./thermal.txt for a description of this property.
 
+Optional properties:
+- nvidia,thermtrips : When present, this property specifies the temperature at
+  which the soctherm hardware will assert the thermal trigger signal to the
+  Power Management IC, which can be configured to reset or shutdown the device.
+  It is an array of pairs where each pair represents a tsensor id followed by a
+  temperature in milli Celcius. In the absence of this property the critical
+  trip point will be used for thermtrip temperature.
+
 Note:
-- the "critical" type trip points will be set to SOC_THERM hardware as the
-shut down temperature. Once the temperature of this thermal zone is higher
-than it, the system will be shutdown or reset by hardware.
+- the "critical" type trip points will be used to set the temperature at which
+the SOC_THERM hardware will assert a thermal trigger if the "nvidia,thermtrips"
+property is missing. When the thermtrips property is present, the breach of a
+critical trip point is reported back to the thermal framework to implement
+software shutdown.
+
 - the "hot" type trip points will be set to SOC_THERM hardware as the throttle
 temperature. Once the the temperature of this thermal zone is higher
 than it, it will trigger the HW throttle event.
@@ -79,6 +90,9 @@ Example :
 
#thermal-sensor-cells = <1>;
 
+   nvidia,thermtrips = ;
+
throttle-cfgs {
/*
 * When the "heavy" cooling device triggered,
-- 
2.7.4



Re: [PATCH v7 0/3] Fixes for Tegra soctherm

2019-02-20 Thread Wei Ni



On 20/2/2019 10:14 AM, Zhang Rui wrote:
> On 一, 2019-02-18 at 15:59 +0800, Wei Ni wrote:
>> Rui,
>> Will you take this serial?
>>
> it is already in my tree.
> I missed -rc6, thus I will queue them for 5.1-rc1.

Thanks.
I updated v8 patch per Daniel Lezcano's comment.
Please check it.

Wei.

> 
> thanks,
> rui
> 
>> Thanks.
>> Wei.
>>
>> On 21/1/2019 5:17 PM, Wei Ni wrote:
>>>
>>> Does there have any comments?
>>>
>>> Thanks.
>>> Wei.
>>>
>>> On 11/1/2019 10:20 AM, Wei Ni wrote:
>>>>
>>>> Hi Eduardo,
>>>> Do you have any more comments, will you take this serial?
>>>>
>>>> Thanks.
>>>> Wei.
>>>>
>>>> On 3/1/2019 6:12 PM, Wei Ni wrote:
>>>>>
>>>>> This series fixed some issues for Tegra soctherm,
>>>>> and add get_trend().
>>>>>
>>>>> Main changes from v6:
>>>>> 1. Per Eduardo's comment, we can remove the change:
>>>>> "thermal: tegra: parse sensor id before sensor register"
>>>>>
>>>>> Main changes from v5:
>>>>> 1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/
>>>>> 643
>>>>> into this serial.
>>>>>
>>>>> Main changes from v4:
>>>>> 1. fixed for the parsing sensor id.
>>>>> 2. keep warning for missing critical trips.
>>>>>
>>>>> Main changes from v3:
>>>>> 1. updated codes for parsing sensor id, per Thierry's comments
>>>>>
>>>>> Main changes from v2:
>>>>> 1. add codes to parse sensor id to avoid registration
>>>>> failure.
>>>>>
>>>>> Main changes from v1:
>>>>> 1. Acked by Thierry Reding  for the patch
>>>>> "thermal: tegra: fix memory allocation".
>>>>> 2. Print out the sensor name when register failed.
>>>>> 2. Remove patch "thermal: tegra: fix coverity defect"
>>>>>
>>>>> Wei Ni (3):
>>>>>   thermal: tegra: remove unnecessary warnings
>>>>>   thermal: tegra: fix memory allocation
>>>>>   thermal: tegra: add get_trend ops
>>>>>
>>>>>  drivers/thermal/tegra/soctherm.c | 40
>>>>> +---
>>>>>  1 file changed, 37 insertions(+), 3 deletions(-)
>>>>>


Re: [PATCH v1 01/12] of: Add bindings of thermtrip for Tegra soctherm

2019-02-20 Thread Wei Ni



On 20/2/2019 9:22 AM, Eduardo Valentin wrote:
> On Fri, Dec 28, 2018 at 11:28:42AM +0800, Wei Ni wrote:
>>
>>
>> On 28/12/2018 7:06 AM, Rob Herring wrote:
>>> On Tue, Dec 18, 2018 at 03:34:33PM +0800, Wei Ni wrote:
>>>> Add optional property "nvidia,thermtrips".
>>>> If present, these trips will be used as HW shutdown trips,
>>>> and critical trips will be used as SW shutdown trips.
>>>>
>>>> Signed-off-by: Wei Ni 
>>>> ---
>>>>  .../bindings/thermal/nvidia,tegra124-soctherm.txt| 20 
>>>> +---
>>>>  1 file changed, 17 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git 
>>>> a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
>>>> b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>>>> index b6c0ae53d4dc..ab66d6feab4b 100644
>>>> --- 
>>>> a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>>>> +++ 
>>>> b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>>>> @@ -55,10 +55,21 @@ Required properties :
>>>>- #cooling-cells: Should be 1. This cooling device only support 
>>>> on/off state.
>>>>  See ./thermal.txt for a description of this property.
>>>>  
>>>> +Optional properties:
>>>> +- nvidia,thermtrips : When present, this property specifies the 
>>>> temperature at
>>>> +  which the soctherm hardware will assert the thermal trigger signal to 
>>>> the
>>>> +  Power Management IC, which can be configured to reset or shutdown the 
>>>> device.
>>>> +  It is an array of pairs where each pair represents a tsensor id 
>>>> followed by a
>>>> +  temperature in milli Celcius. In the absence of this property the 
>>>> critical
>>>> +  trip point will be used for thermtrip temperature.
>>>> +
>>>>  Note:
>>>> -- the "critical" type trip points will be set to SOC_THERM hardware as the
>>>> -shut down temperature. Once the temperature of this thermal zone is higher
>>>> -than it, the system will be shutdown or reset by hardware.
>>>> +- the "critical" type trip points will be used to set the temperature at 
>>>> which
>>>> +the SOC_THERM hardware will assert a thermal trigger if the 
>>>> "nvidia,thermtrips"
>>>> +property is missing. When the thermtrips property is present, the breach 
>>>> of a
>>>> +critical trip point is reported back to the thermal framework to implement
>>>> +software shutdown.
>>>
>>> This hardly seems like a NVidia specific concept. A h/w shutdown 
>>> temperature... Come up with something common.
>>
>> Hi Rob,
>> In current thermal framework, it doesn't support to set h/w shutdown
>> trips, the "critical" trip is used for s/w shutdown. I noticed that in
>> rockchip-thermal driver, it also used "rockchip,hw-tshut-temp" to set
>> h/w shutdown temperature.
> 
> Why a critical trip point cannot be used for your hw shutdown too?

Hi Eduardo,
The thermal framework handle the critical type trip point in
handle_critical_trips(), it will call orderly_poweroff to shutdown
system gracefully.
"
if (trip_type == THERMAL_TRIP_CRITICAL) {
...
if (!power_off_triggered) {
/*
 * Queue a backup emergency shutdown in the event of
 * orderly_poweroff failure
 */
thermal_emergency_poweroff();
orderly_poweroff(true);
power_off_triggered = true;
}
"
And in this change, we added a new property to handle hw shutdown for
Tegra. When trigger the hw shutdown trip point, the hw will cut the
power to poweroff directly. If the temperature is raised very quickly,
the hardware can shutdown system before s/w shutdown.

Thanks.
Wei.

> 
>>
>>>
>>> Also, we already have a temperature table. Why do we need temperatures 
>>> in 2 places.
>>
>> Sorry, what do you mean temperature table? Do you mean the trip nodes?
>>
>> Thanks.
>> Wei.
>>
>>>
>>>> +
>>>>  - the "hot" type trip points will be set to SOC_THERM hardware as the 
>>>> throttle
>>>>  temperature. Once the the temperature of this thermal zone is higher
>>>>  than it, it will trigger the HW throttle event.
>>>> @@ -79,6 +90,9 @@ Example :
>>>>  
>>>>#thermal-sensor-cells = <1>;
>>>>  
>>>> +  nvidia,thermtrips = >>> +   TEGRA124_SOCTHERM_SENSOR_GPU 103000>;
>>>> +
>>>>throttle-cfgs {
>>>>/*
>>>> * When the "heavy" cooling device triggered,
>>>> -- 
>>>> 2.7.4
>>>>


Re: [PATCH v1 04/12] of: Add bindings of gpu hw throttle for Tegra soctherm

2019-02-18 Thread Wei Ni



On 19/2/2019 4:33 AM, Rob Herring wrote:
> On Tue, Dec 18, 2018 at 03:34:36PM +0800, Wei Ni wrote:
>> Add "nvidia,gpu-throt-level" property to set gpu hw
>> throttle level.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  .../bindings/thermal/nvidia,tegra124-soctherm.txt  | 17 +++--
>>  include/dt-bindings/thermal/tegra124-soctherm.h| 22 
>> ++
>>  2 files changed, 33 insertions(+), 6 deletions(-)
>>
>> diff --git 
>> a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
>> b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> index ab66d6feab4b..cf6d0be56b7a 100644
>> --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> @@ -52,6 +52,15 @@ Required properties :
>>  Must set as following values:
>>  TEGRA_SOCTHERM_THROT_LEVEL_LOW, TEGRA_SOCTHERM_THROT_LEVEL_MED
>>  TEGRA_SOCTHERM_THROT_LEVEL_HIGH, TEGRA_SOCTHERM_THROT_LEVEL_NONE
>> +  - nvidia,gpu-throt-level: This property is for Tegra124 and Tegra210.
> 
> Also, why not just use percents like nvidia,cpu-throt-percent?

Hi Rob,
We have to use "-level" for gpu throttle, can't use percents. It's
designed by hardware.
BTW, for the cpu-throt, it use "-level" for t132, and use "-percent" for
t124 and t210.

Thanks.
Wei.

> 
>> +It is the level of pulse skippers, which used to throttle clock
>> +frequencies. It indicates gpu clock throttling depth and can be
>> +programmed to any of the following values which represent a 
>> throttling
>> +percentage:
>> +TEGRA_SOCTHERM_THROT_LEVEL_NONE (0%)
>> +TEGRA_SOCTHERM_THROT_LEVEL_LOW (50%),
>> +TEGRA_SOCTHERM_THROT_LEVEL_MED (75%),
>> +TEGRA_SOCTHERM_THROT_LEVEL_HIGH (85%).
>>- #cooling-cells: Should be 1. This cooling device only support 
>> on/off state.
>>  See ./thermal.txt for a description of this property.


Re: [PATCH v1 11/12] of: Add bindings of OC hw throttle for Tegra soctherm

2019-02-18 Thread Wei Ni



On 19/2/2019 4:32 AM, Rob Herring wrote:
> On Tue, Dec 18, 2018 at 03:34:43PM +0800, Wei Ni wrote:
>> Add OC HW throttle configuration for soctherm in DT.
>> It is used to describe the OCx throttle events.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  .../bindings/thermal/nvidia,tegra124-soctherm.txt  | 26 
>> ++
>>  1 file changed, 26 insertions(+)
>>
>> diff --git 
>> a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
>> b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> index cf6d0be56b7a..d112a8e59ec3 100644
>> --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> @@ -64,6 +64,21 @@ Required properties :
>>- #cooling-cells: Should be 1. This cooling device only support 
>> on/off state.
>>  See ./thermal.txt for a description of this property.
>>  
>> +  Optional properties: The following properties are T210 specific and
>> +  valid only for OCx throttle events.
>> +  - nvidia,count-threshold: Specifies the number of OC events that are
>> +required for triggering an interrupt. Interrupts are not triggered 
>> if
>> +the property is missing. A value of 0 will interrupt on every OC 
>> alarm.
>> +  - nvidia,polarity-active-low: Configures the polarity of the OC alaram
>> +signal. Accepted values are 1 for assert low and 0 for assert high.
>> +Default value is 0.
> 
> Why not boolean?

Ok, will change to use boolean.

> 
>> +  - nvidia,alarm-filter: Number of clocks to filter event. When the 
>> filter
>> +expires (which means the OC event has not occurred for a long time),
>> +the counter is cleared and filter is rearmed. Default value is 0.
>> +  - nvidia,throttle-period: Specifies the number of uSec for which
>> +throttling is engaged after the OC event is deasserted. Default 
>> value
>> +is 0.
> 
> Needs a unit suffix as defined in property-units.txt.

Yes, will add suffix "-us" for it.

> 
>> +
>>  Optional properties:
>>  - nvidia,thermtrips : When present, this property specifies the temperature 
>> at
>>which the soctherm hardware will assert the thermal trigger signal to the
>> @@ -134,6 +149,17 @@ Example :
>>   * arbiter will select the highest priority as the 
>> final throttle
>>   * settings to skip cpu pulse.
>>   */
>> +
>> +throttle_oc1: oc1 {
>> +nvidia,priority = <50>;
>> +nvidia,polarity-active-low = <1>;
>> +nvidia,count-threshold = <100>;
>> +nvidia,alarm-filter = <510>;
>> +nvidia,throttle-period = <0>;
>> +nvidia,cpu-throt-percent = <75>;
>> +nvidia,gpu-throt-level =
>> +
>> ;
>> +};
>>  };
>>  };
>>  
>> -- 
>> 2.7.4
>>


Re: [PATCH v1 04/12] of: Add bindings of gpu hw throttle for Tegra soctherm

2019-02-18 Thread Wei Ni



On 19/2/2019 4:29 AM, Rob Herring wrote:
> On Tue, Dec 18, 2018 at 03:34:36PM +0800, Wei Ni wrote:
>> Add "nvidia,gpu-throt-level" property to set gpu hw
>> throttle level.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  .../bindings/thermal/nvidia,tegra124-soctherm.txt  | 17 +++--
>>  include/dt-bindings/thermal/tegra124-soctherm.h| 22 
>> ++
>>  2 files changed, 33 insertions(+), 6 deletions(-)
>>
>> diff --git 
>> a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
>> b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> index ab66d6feab4b..cf6d0be56b7a 100644
>> --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> @@ -52,6 +52,15 @@ Required properties :
>>  Must set as following values:
>>  TEGRA_SOCTHERM_THROT_LEVEL_LOW, TEGRA_SOCTHERM_THROT_LEVEL_MED
>>  TEGRA_SOCTHERM_THROT_LEVEL_HIGH, TEGRA_SOCTHERM_THROT_LEVEL_NONE
>> +  - nvidia,gpu-throt-level: This property is for Tegra124 and Tegra210.
>> +It is the level of pulse skippers, which used to throttle clock
>> +frequencies. It indicates gpu clock throttling depth and can be
>> +programmed to any of the following values which represent a 
>> throttling
>> +percentage:
>> +TEGRA_SOCTHERM_THROT_LEVEL_NONE (0%)
>> +TEGRA_SOCTHERM_THROT_LEVEL_LOW (50%),
>> +TEGRA_SOCTHERM_THROT_LEVEL_MED (75%),
>> +TEGRA_SOCTHERM_THROT_LEVEL_HIGH (85%).
>>- #cooling-cells: Should be 1. This cooling device only support 
>> on/off state.
>>  See ./thermal.txt for a description of this property.
>>  
>> @@ -96,22 +105,26 @@ Example :
>>  throttle-cfgs {
>>  /*
>>   * When the "heavy" cooling device triggered,
>> - * the HW will skip cpu clock's pulse in 85% depth
>> + * the HW will skip cpu clock's pulse in 85% depth,
>> + * skip gpu clock's pulse in 85% level
>>   */
>>  throttle_heavy: heavy {
>>  nvidia,priority = <100>;
>>  nvidia,cpu-throt-percent = <85>;
>> +nvidia,gpu-throt-level = 
>> ;
>>  
>>  #cooling-cells = <1>;
>>  };
>>  
>>  /*
>>   * When the "light" cooling device triggered,
>> - * the HW will skip cpu clock's pulse in 50% depth
>> + * the HW will skip cpu clock's pulse in 50% depth,
>> + * skip gpu clock's pulse in 50% level
>>   */
>>  throttle_light: light {
>>  nvidia,priority = <80>;
>>  nvidia,cpu-throt-percent = <50>;
>> +nvidia,gpu-throt-level = 
>> ;
>>  
>>  #cooling-cells = <1>;
>>  };
>> diff --git a/include/dt-bindings/thermal/tegra124-soctherm.h 
>> b/include/dt-bindings/thermal/tegra124-soctherm.h
>> index c15e8b709a0d..75853df1c609 100644
>> --- a/include/dt-bindings/thermal/tegra124-soctherm.h
>> +++ b/include/dt-bindings/thermal/tegra124-soctherm.h
>> @@ -1,5 +1,19 @@
>>  /* SPDX-License-Identifier: GPL-2.0 */
>>  /*
>> + * Copyright (c) 2014 - 2018, NVIDIA CORPORATION.  All rights reserved.
>> + *
>> + * Author:
>> + *  Mikko Perttunen 
>> + *
>> + * This software is licensed under the terms of the GNU General Public
>> + * License version 2, as published by the Free Software Foundation, and
>> + * may be copied, distributed, and modified under those terms.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
> 
> Why are you adding this?

We doesn't need it, will remove it.

> 
>>   * This header provides constants for binding nvidia,tegra124-soctherm.
>>   */
>>  
>> @@ -12,9 +26,9 @@
>>  #define TEGRA124_SOCTHERM_SENSOR_PLLX 3
>>  #define TEGRA124_SOCTHERM_SENSOR_NUM 4
>>  
>> -#define TEGRA_SOCTHERM_THROT_LEVEL_LOW  0
>> -#define TEGRA_SOCTHERM_THROT_LEVEL_MED  1
>> -#define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 2
>> -#define TEGRA_SOCTHERM_THROT_LEVEL_NONE -1
>> +#define TEGRA_SOCTHERM_THROT_LEVEL_NONE 0
>> +#define TEGRA_SOCTHERM_THROT_LEVEL_LOW  1
>> +#define TEGRA_SOCTHERM_THROT_LEVEL_MED  2
>> +#define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 3
> 
> You are breaking an ABI.
> 
> Rob
> 


[PATCH v8 1/3] thermal: tegra: remove unnecessary warnings

2019-02-18 Thread Wei Ni
Convert warnings to info as not all platforms may
have all the thresholds and sensors enabled.

Signed-off-by: Wei Ni 
Reviewed-by: Daniel Lezcano 
---
 drivers/thermal/tegra/soctherm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 45b41b885f49..fa50484e1c84 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
-   dev_warn(dev, "throttrip: %s: missing hot temperature\n",
+   dev_info(dev, "throttrip: %s: missing hot temperature\n",
 sg->name);
return 0;
}
@@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
}
 
if (i == THROTTLE_SIZE)
-   dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
+   dev_info(dev, "throttrip: %s: missing throttle cdev\n",
 sg->name);
 
return 0;
-- 
2.7.4



[PATCH v8 0/3] Fixes for Tegra soctherm

2019-02-18 Thread Wei Ni
This series fixed some issues for Tegra soctherm,
and add get_trend().

Main changes from v7:
1. use READ_ONCE to get temperature in get_trend()

Main changes from v6:
1. Per Eduardo's comment, we can remove the change:
"thermal: tegra: parse sensor id before sensor register"

Main changes from v5:
1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/643
into this serial.

Main changes from v4:
1. fixed for the parsing sensor id.
2. keep warning for missing critical trips.

Main changes from v3:
1. updated codes for parsing sensor id, per Thierry's comments

Main changes from v2:
1. add codes to parse sensor id to avoid registration
failure.

Main changes from v1:
1. Acked by Thierry Reding  for the patch
"thermal: tegra: fix memory allocation".
2. Print out the sensor name when register failed.
2. Remove patch "thermal: tegra: fix coverity defect"


*** BLURB HERE ***

Wei Ni (3):
  thermal: tegra: remove unnecessary warnings
  thermal: tegra: fix memory allocation
  thermal: tegra: add get_trend ops

 drivers/thermal/tegra/soctherm.c | 38 +++---
 1 file changed, 35 insertions(+), 3 deletions(-)

-- 
2.7.4



[PATCH v8 2/3] thermal: tegra: fix memory allocation

2019-02-18 Thread Wei Ni
Fix memory allocation to store the pointers to
thermal_zone_device.

Signed-off-by: Wei Ni 
Acked-by: Thierry Reding 
Reviewed-by: Daniel Lezcano 
---
 drivers/thermal/tegra/soctherm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index fa50484e1c84..b1ead6ea4c73 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1329,7 +1329,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
}
 
tegra->thermctl_tzs = devm_kcalloc(>dev,
-  soc->num_ttgs, sizeof(*z),
+  soc->num_ttgs, sizeof(z),
   GFP_KERNEL);
if (!tegra->thermctl_tzs)
return -ENOMEM;
-- 
2.7.4



[PATCH v8 3/3] thermal: tegra: add get_trend ops

2019-02-18 Thread Wei Ni
Add support for get_trend ops that allows soctherm
sensors to be used with the step-wise governor.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 32 
 1 file changed, 32 insertions(+)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index b1ead6ea4c73..70043a28eb7a 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -488,9 +488,41 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return 0;
 }
 
+static int tegra_thermctl_get_trend(void *data, int trip,
+   enum thermal_trend *trend)
+{
+   struct tegra_thermctl_zone *zone = data;
+   struct thermal_zone_device *tz = zone->tz;
+   int trip_temp, temp, last_temp, ret;
+
+   if (!tz)
+   return -EINVAL;
+
+   ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
+   if (ret)
+   return ret;
+
+   temp = READ_ONCE(tz->temperature);
+   last_temp = READ_ONCE(tz->last_temperature);
+
+   if (temp > trip_temp) {
+   if (temp >= last_temp)
+   *trend = THERMAL_TREND_RAISING;
+   else
+   *trend = THERMAL_TREND_STABLE;
+   } else if (temp < trip_temp) {
+   *trend = THERMAL_TREND_DROPPING;
+   } else {
+   *trend = THERMAL_TREND_STABLE;
+   }
+
+   return 0;
+}
+
 static const struct thermal_zone_of_device_ops tegra_of_thermal_ops = {
.get_temp = tegra_thermctl_get_temp,
.set_trip_temp = tegra_thermctl_set_trip_temp,
+   .get_trend = tegra_thermctl_get_trend,
 };
 
 static int get_hot_temp(struct thermal_zone_device *tz, int *trip, int *temp)
-- 
2.7.4



Re: [PATCH v7 3/3] thermal: tegra: add get_trend ops

2019-02-18 Thread Wei Ni



On 18/2/2019 6:27 PM, Daniel Lezcano wrote:
> On 03/01/2019 11:12, Wei Ni wrote:
>> Add support for get_trend ops that allows soctherm
>> sensors to be used with the step-wise governor.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  drivers/thermal/tegra/soctherm.c | 34 ++
>>  1 file changed, 34 insertions(+)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c 
>> b/drivers/thermal/tegra/soctherm.c
>> index fd2703c0cfc5..864205af104b 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -488,9 +488,43 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
>> trip, int temp)
>>  return 0;
>>  }
>>  
>> +static int tegra_thermctl_get_trend(void *data, int trip,
>> +enum thermal_trend *trend)
>> +{
>> +struct tegra_thermctl_zone *zone = data;
>> +struct thermal_zone_device *tz = zone->tz;
>> +int trip_temp, temp, last_temp, ret;
>> +
>> +if (!tz)
>> +return -EINVAL;
>> +
>> +ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
>> +if (ret)
>> +return ret;
>> +
>> +mutex_lock(>lock);
> 
> No need to use the mutex here.
> 
> Why not ?
> 
> temp = READ_ONCE(tz->temperature);
> last_temp = READ_ONCE(tz->last_temperature);

Yes, you are right, will change it in next version.

Wei.

> 
>> +temp = tz->temperature;
>> +last_temp = tz->last_temperature;
>> +mutex_unlock(>lock);
>> +
>> +if (temp > trip_temp) {
>> +if (temp >= last_temp)
>> +*trend = THERMAL_TREND_RAISING;
>> +else
>> +*trend = THERMAL_TREND_STABLE;
>> +} else if (temp < trip_temp) {
>> +*trend = THERMAL_TREND_DROPPING;
>> +} else {
>> +*trend = THERMAL_TREND_STABLE;
>> +}
>> +
>> +return 0;
>> +}
>> +
>>  static const struct thermal_zone_of_device_ops tegra_of_thermal_ops = {
>>  .get_temp = tegra_thermctl_get_temp,
>>  .set_trip_temp = tegra_thermctl_set_trip_temp,
>> +.get_trend = tegra_thermctl_get_trend,
>>  };
>>  
>>  static int get_hot_temp(struct thermal_zone_device *tz, int *trip, int 
>> *temp)
>>
> 
> 


Re: [PATCH v7 1/3] thermal: tegra: remove unnecessary warnings

2019-02-18 Thread Wei Ni



On 18/2/2019 5:47 PM, Daniel Lezcano wrote:
> On 03/01/2019 11:12, Wei Ni wrote:
>> Convert warnings to info as not all platforms may
>> have all the thresholds and sensors enabled.
>>
>> Signed-off-by: Wei Ni 
>> ---
> 
> Reviewed-by: Daniel Lezcano 

Daniel, thank you for your review.
> 
>>  drivers/thermal/tegra/soctherm.c | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c 
>> b/drivers/thermal/tegra/soctherm.c
>> index ed28110a3535..f07de8258e93 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>  set_throttle:
>>  ret = get_hot_temp(tz, , );
>>  if (ret) {
>> -dev_warn(dev, "throttrip: %s: missing hot temperature\n",
>> +dev_info(dev, "throttrip: %s: missing hot temperature\n",
>>   sg->name);
>>  return 0;
>>  }
>> @@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>  }
>>  
>>  if (i == THROTTLE_SIZE)
>> -dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
>> +dev_info(dev, "throttrip: %s: missing throttle cdev\n",
>>   sg->name);
>>  
>>  return 0;
>>
> 
> 


Re: [PATCH v7 0/3] Fixes for Tegra soctherm

2019-02-17 Thread Wei Ni
Rui,
Will you take this serial?

Thanks.
Wei.

On 21/1/2019 5:17 PM, Wei Ni wrote:
> Does there have any comments?
> 
> Thanks.
> Wei.
> 
> On 11/1/2019 10:20 AM, Wei Ni wrote:
>> Hi Eduardo,
>> Do you have any more comments, will you take this serial?
>>
>> Thanks.
>> Wei.
>>
>> On 3/1/2019 6:12 PM, Wei Ni wrote:
>>> This series fixed some issues for Tegra soctherm,
>>> and add get_trend().
>>>
>>> Main changes from v6:
>>> 1. Per Eduardo's comment, we can remove the change:
>>> "thermal: tegra: parse sensor id before sensor register"
>>>
>>> Main changes from v5:
>>> 1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/643
>>> into this serial.
>>>
>>> Main changes from v4:
>>> 1. fixed for the parsing sensor id.
>>> 2. keep warning for missing critical trips.
>>>
>>> Main changes from v3:
>>> 1. updated codes for parsing sensor id, per Thierry's comments
>>>
>>> Main changes from v2:
>>> 1. add codes to parse sensor id to avoid registration
>>> failure.
>>>
>>> Main changes from v1:
>>> 1. Acked by Thierry Reding  for the patch
>>> "thermal: tegra: fix memory allocation".
>>> 2. Print out the sensor name when register failed.
>>> 2. Remove patch "thermal: tegra: fix coverity defect"
>>>
>>> Wei Ni (3):
>>>   thermal: tegra: remove unnecessary warnings
>>>   thermal: tegra: fix memory allocation
>>>   thermal: tegra: add get_trend ops
>>>
>>>  drivers/thermal/tegra/soctherm.c | 40 
>>> +---
>>>  1 file changed, 37 insertions(+), 3 deletions(-)
>>>


Re: [PATCH v1 00/12] Add some functionalities for Tegra soctherm

2019-01-21 Thread Wei Ni
Hi Eduardo,
Could you please take a look this serial?

Thanks.
Wei.

On 18/12/2018 3:34 PM, Wei Ni wrote:
> Move the hw/sw shutdown patches into this serial. There already have
> some discussion for it in https://lkml.org/lkml/2018/12/7/225.
> Support GPU HW throttle, thermal IRQ, set_trips(), EDP IRQ and OC
> hw throttle.
> 
> Wei Ni (12):
>   of: Add bindings of thermtrip for Tegra soctherm
>   thermal: tegra: support hw and sw shutdown
>   arm64: dts: tegra210: set thermtrip
>   of: Add bindings of gpu hw throttle for Tegra soctherm
>   thermal: tegra: add support for gpu hw-throttle
>   arm64: dts: tegra210: set gpu hw throttle level
>   thermal: tegra: add support for thermal IRQ
>   thermal: tegra: add set_trips functionality
>   thermal: tegra: add support for EDP IRQ
>   arm64: dts: tegra210: set EDP interrupt line
>   of: Add bindings of OC hw throttle for Tegra soctherm
>   thermal: tegra: enable OC hw throttle
> 
>  .../bindings/thermal/nvidia,tegra124-soctherm.txt  |  63 +-
>  arch/arm64/boot/dts/nvidia/tegra210.dtsi   |  20 +-
>  drivers/thermal/tegra/soctherm.c   | 959 
> +++--
>  drivers/thermal/tegra/soctherm.h   |  16 +
>  drivers/thermal/tegra/tegra124-soctherm.c  |   7 +-
>  drivers/thermal/tegra/tegra132-soctherm.c  |   7 +-
>  drivers/thermal/tegra/tegra210-soctherm.c  |  15 +-
>  include/dt-bindings/thermal/tegra124-soctherm.h|  22 +-
>  8 files changed, 1033 insertions(+), 76 deletions(-)
> 


Re: [PATCH v7 0/3] Fixes for Tegra soctherm

2019-01-21 Thread Wei Ni
Does there have any comments?

Thanks.
Wei.

On 11/1/2019 10:20 AM, Wei Ni wrote:
> Hi Eduardo,
> Do you have any more comments, will you take this serial?
> 
> Thanks.
> Wei.
> 
> On 3/1/2019 6:12 PM, Wei Ni wrote:
>> This series fixed some issues for Tegra soctherm,
>> and add get_trend().
>>
>> Main changes from v6:
>> 1. Per Eduardo's comment, we can remove the change:
>> "thermal: tegra: parse sensor id before sensor register"
>>
>> Main changes from v5:
>> 1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/643
>> into this serial.
>>
>> Main changes from v4:
>> 1. fixed for the parsing sensor id.
>> 2. keep warning for missing critical trips.
>>
>> Main changes from v3:
>> 1. updated codes for parsing sensor id, per Thierry's comments
>>
>> Main changes from v2:
>> 1. add codes to parse sensor id to avoid registration
>> failure.
>>
>> Main changes from v1:
>> 1. Acked by Thierry Reding  for the patch
>> "thermal: tegra: fix memory allocation".
>> 2. Print out the sensor name when register failed.
>> 2. Remove patch "thermal: tegra: fix coverity defect"
>>
>> Wei Ni (3):
>>   thermal: tegra: remove unnecessary warnings
>>   thermal: tegra: fix memory allocation
>>   thermal: tegra: add get_trend ops
>>
>>  drivers/thermal/tegra/soctherm.c | 40 
>> +---
>>  1 file changed, 37 insertions(+), 3 deletions(-)
>>


Re: [PATCH v7 0/3] Fixes for Tegra soctherm

2019-01-10 Thread Wei Ni
Hi Eduardo,
Do you have any more comments, will you take this serial?

Thanks.
Wei.

On 3/1/2019 6:12 PM, Wei Ni wrote:
> This series fixed some issues for Tegra soctherm,
> and add get_trend().
> 
> Main changes from v6:
> 1. Per Eduardo's comment, we can remove the change:
> "thermal: tegra: parse sensor id before sensor register"
> 
> Main changes from v5:
> 1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/643
> into this serial.
> 
> Main changes from v4:
> 1. fixed for the parsing sensor id.
> 2. keep warning for missing critical trips.
> 
> Main changes from v3:
> 1. updated codes for parsing sensor id, per Thierry's comments
> 
> Main changes from v2:
> 1. add codes to parse sensor id to avoid registration
> failure.
> 
> Main changes from v1:
> 1. Acked by Thierry Reding  for the patch
> "thermal: tegra: fix memory allocation".
> 2. Print out the sensor name when register failed.
> 2. Remove patch "thermal: tegra: fix coverity defect"
> 
> Wei Ni (3):
>   thermal: tegra: remove unnecessary warnings
>   thermal: tegra: fix memory allocation
>   thermal: tegra: add get_trend ops
> 
>  drivers/thermal/tegra/soctherm.c | 40 
> +---
>  1 file changed, 37 insertions(+), 3 deletions(-)
> 


[PATCH v7 2/3] thermal: tegra: fix memory allocation

2019-01-03 Thread Wei Ni
Fix memory allocation to store the pointers to
thermal_zone_device.

Signed-off-by: Wei Ni 
Acked-by: Thierry Reding 
---
 drivers/thermal/tegra/soctherm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index f07de8258e93..fd2703c0cfc5 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1339,7 +1339,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
}
 
tegra->thermctl_tzs = devm_kcalloc(>dev,
-  soc->num_ttgs, sizeof(*z),
+  soc->num_ttgs, sizeof(z),
   GFP_KERNEL);
if (!tegra->thermctl_tzs)
return -ENOMEM;
-- 
2.7.4



[PATCH v7 3/3] thermal: tegra: add get_trend ops

2019-01-03 Thread Wei Ni
Add support for get_trend ops that allows soctherm
sensors to be used with the step-wise governor.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 34 ++
 1 file changed, 34 insertions(+)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index fd2703c0cfc5..864205af104b 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -488,9 +488,43 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return 0;
 }
 
+static int tegra_thermctl_get_trend(void *data, int trip,
+   enum thermal_trend *trend)
+{
+   struct tegra_thermctl_zone *zone = data;
+   struct thermal_zone_device *tz = zone->tz;
+   int trip_temp, temp, last_temp, ret;
+
+   if (!tz)
+   return -EINVAL;
+
+   ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
+   if (ret)
+   return ret;
+
+   mutex_lock(>lock);
+   temp = tz->temperature;
+   last_temp = tz->last_temperature;
+   mutex_unlock(>lock);
+
+   if (temp > trip_temp) {
+   if (temp >= last_temp)
+   *trend = THERMAL_TREND_RAISING;
+   else
+   *trend = THERMAL_TREND_STABLE;
+   } else if (temp < trip_temp) {
+   *trend = THERMAL_TREND_DROPPING;
+   } else {
+   *trend = THERMAL_TREND_STABLE;
+   }
+
+   return 0;
+}
+
 static const struct thermal_zone_of_device_ops tegra_of_thermal_ops = {
.get_temp = tegra_thermctl_get_temp,
.set_trip_temp = tegra_thermctl_set_trip_temp,
+   .get_trend = tegra_thermctl_get_trend,
 };
 
 static int get_hot_temp(struct thermal_zone_device *tz, int *trip, int *temp)
-- 
2.7.4



[PATCH v7 1/3] thermal: tegra: remove unnecessary warnings

2019-01-03 Thread Wei Ni
Convert warnings to info as not all platforms may
have all the thresholds and sensors enabled.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..f07de8258e93 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
-   dev_warn(dev, "throttrip: %s: missing hot temperature\n",
+   dev_info(dev, "throttrip: %s: missing hot temperature\n",
 sg->name);
return 0;
}
@@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
}
 
if (i == THROTTLE_SIZE)
-   dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
+   dev_info(dev, "throttrip: %s: missing throttle cdev\n",
 sg->name);
 
return 0;
-- 
2.7.4



[PATCH v7 0/3] Fixes for Tegra soctherm

2019-01-03 Thread Wei Ni
This series fixed some issues for Tegra soctherm,
and add get_trend().

Main changes from v6:
1. Per Eduardo's comment, we can remove the change:
"thermal: tegra: parse sensor id before sensor register"

Main changes from v5:
1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/643
into this serial.

Main changes from v4:
1. fixed for the parsing sensor id.
2. keep warning for missing critical trips.

Main changes from v3:
1. updated codes for parsing sensor id, per Thierry's comments

Main changes from v2:
1. add codes to parse sensor id to avoid registration
failure.

Main changes from v1:
1. Acked by Thierry Reding  for the patch
"thermal: tegra: fix memory allocation".
2. Print out the sensor name when register failed.
2. Remove patch "thermal: tegra: fix coverity defect"

Wei Ni (3):
  thermal: tegra: remove unnecessary warnings
  thermal: tegra: fix memory allocation
  thermal: tegra: add get_trend ops

 drivers/thermal/tegra/soctherm.c | 40 +---
 1 file changed, 37 insertions(+), 3 deletions(-)

-- 
2.7.4



Re: [PATCH v1 01/12] of: Add bindings of thermtrip for Tegra soctherm

2018-12-27 Thread Wei Ni



On 28/12/2018 7:06 AM, Rob Herring wrote:
> On Tue, Dec 18, 2018 at 03:34:33PM +0800, Wei Ni wrote:
>> Add optional property "nvidia,thermtrips".
>> If present, these trips will be used as HW shutdown trips,
>> and critical trips will be used as SW shutdown trips.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  .../bindings/thermal/nvidia,tegra124-soctherm.txt| 20 
>> +---
>>  1 file changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git 
>> a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
>> b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> index b6c0ae53d4dc..ab66d6feab4b 100644
>> --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> @@ -55,10 +55,21 @@ Required properties :
>>- #cooling-cells: Should be 1. This cooling device only support 
>> on/off state.
>>  See ./thermal.txt for a description of this property.
>>  
>> +Optional properties:
>> +- nvidia,thermtrips : When present, this property specifies the temperature 
>> at
>> +  which the soctherm hardware will assert the thermal trigger signal to the
>> +  Power Management IC, which can be configured to reset or shutdown the 
>> device.
>> +  It is an array of pairs where each pair represents a tsensor id followed 
>> by a
>> +  temperature in milli Celcius. In the absence of this property the critical
>> +  trip point will be used for thermtrip temperature.
>> +
>>  Note:
>> -- the "critical" type trip points will be set to SOC_THERM hardware as the
>> -shut down temperature. Once the temperature of this thermal zone is higher
>> -than it, the system will be shutdown or reset by hardware.
>> +- the "critical" type trip points will be used to set the temperature at 
>> which
>> +the SOC_THERM hardware will assert a thermal trigger if the 
>> "nvidia,thermtrips"
>> +property is missing. When the thermtrips property is present, the breach of 
>> a
>> +critical trip point is reported back to the thermal framework to implement
>> +software shutdown.
> 
> This hardly seems like a NVidia specific concept. A h/w shutdown 
> temperature... Come up with something common.

Hi Rob,
In current thermal framework, it doesn't support to set h/w shutdown
trips, the "critical" trip is used for s/w shutdown. I noticed that in
rockchip-thermal driver, it also used "rockchip,hw-tshut-temp" to set
h/w shutdown temperature.

> 
> Also, we already have a temperature table. Why do we need temperatures 
> in 2 places.

Sorry, what do you mean temperature table? Do you mean the trip nodes?

Thanks.
Wei.

> 
>> +
>>  - the "hot" type trip points will be set to SOC_THERM hardware as the 
>> throttle
>>  temperature. Once the the temperature of this thermal zone is higher
>>  than it, it will trigger the HW throttle event.
>> @@ -79,6 +90,9 @@ Example :
>>  
>>  #thermal-sensor-cells = <1>;
>>  
>> +nvidia,thermtrips = > + TEGRA124_SOCTHERM_SENSOR_GPU 103000>;
>> +
>>  throttle-cfgs {
>>  /*
>>   * When the "heavy" cooling device triggered,
>> -- 
>> 2.7.4
>>


Re: [PATCH v6 3/4] thermal: tegra: parse sensor id before sensor register

2018-12-19 Thread Wei Ni



On 19/12/2018 10:57 PM, Eduardo Valentin wrote:
> On Wed, Dec 19, 2018 at 11:00:10AM +0800, Wei Ni wrote:
>>
>>
>> On 19/12/2018 9:24 AM, Eduardo Valentin wrote:
>>> On Fri, Dec 14, 2018 at 05:49:52PM +0800, Wei Ni wrote:
>>>> Since different platforms may not support all 4
>>>> sensors, so the sensor registration may be failed.
>>>> Add codes to parse dt to find sensor id which
>>>> need to be registered. So that the registration
>>>> can be successful on all platform.
>>>>
>>>> Signed-off-by: Wei Ni 
>>>> ---
>>>>  drivers/thermal/tegra/soctherm.c | 45 
>>>> ++--
>>>>  1 file changed, 43 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/thermal/tegra/soctherm.c 
>>>> b/drivers/thermal/tegra/soctherm.c
>>>> index fd2703c0cfc5..6bee31cd4621 100644
>>>> --- a/drivers/thermal/tegra/soctherm.c
>>>> +++ b/drivers/thermal/tegra/soctherm.c
>>>> @@ -1224,6 +1224,41 @@ static void soctherm_init(struct platform_device 
>>>> *pdev)
>>>>tegra_soctherm_throttle(>dev);
>>>>  }
>>>>  
>>>> +static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
>>>> +{
>>>> +  bool ret = false;
>>>> +  struct of_phandle_args sensor_specs;
>>>> +  struct device_node *np, *sensor_np;
>>>> +
>>>> +  np = of_find_node_by_name(NULL, "thermal-zones");
>>>> +  if (!np)
>>>> +  return ret;
>>>> +
>>>> +  for_each_available_child_of_node(np, sensor_np) {
>>>> +  if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
>>>> +   "#thermal-sensor-cells",
>>>> +   0, _specs))
>>>> +  continue;
>>>> +
>>>> +  if (sensor_specs.args_count != 1) {
>>>> +  WARN(sensor_specs.args_count != 1,
>>>> +   "%s: wrong cells in sensor specifier %d\n",
>>>> +   sensor_specs.np->name, sensor_specs.args_count);
>>>> +  continue;
>>>> +  }
>>>> +
>>>> +  if (sensor_specs.args[0] == sensor_id) {
>>>> +  of_node_put(sensor_np);
>>>> +  ret = true;
>>>> +  break;
>>>> +  }
>>>> +  }
>>>> +
>>>> +  of_node_put(np);
>>>> +
>>>> +  return ret;
>>>> +}
>>>
>>> So, I am still failing to see why this is really needed. 
>>>
>>> Why can't you simply resolve this with different compatibles?
>>> If the sensor is not present or disabled, the compatible is not, well,
>>> compatible anymore.
>>
>> This driver can support three Tegra chip t124, t132 and t210. And we
>> also support some platforms for every chips. As the description in the
>> commit, different platforms may not support all 4 sensors, so I
>> upstreamed this patch.
> 
> ok.. Which means, all platforms need to have a proper DT that describes
> the correct amount of sensors.

Thanks for your comments.
I thought about it carefully again, and found we doesn't need to change
any codes for this issue.
In the DT, actually the node "thermal-zones{} already describes the
correct sensors, so we doesn't need to add more changes in DT.

> 
>> If we use different compatibles, I think we can't resolve it simply,
>> because we also need to add codes to configure which platform support
>> which sensors, and may add more in the future. If use this patch, we
> 
> There is a very common way of solving this, you can pass .data and grab
> after calling of_node_match(), just like the tegra soc thermal driver
> already does.

Yes, for the driver, we just need to add a new file, something like
tegra210-soctherm.c, to configure a new platform, which can remove the
configuration for the disabled sensor, so that the soctherm driver will
not try to register that sensors anymore.

> 
>> doesn't need to do any more in the future.
> 
> Well, if the patch is needed to add support for different versions of
> your sensor block, then there is no reason why not patching.

Since in current released platforms, they support all 4 sensors, so I
will not send new patches by now.

So please ignore this change.
And will you take other 3 changes?


T

Re: [PATCH v6 0/4] Fixes for Tegra soctherm

2018-12-18 Thread Wei Ni



On 19/12/2018 5:31 AM, Eduardo Valentin wrote:
> On Tue, Dec 18, 2018 at 11:35:54AM +0800, Zhang Rui wrote:
>> On 五, 2018-12-14 at 17:54 +0800, Wei Ni wrote:
>>> Hi Rui,
>>> I moved get_trend() patch https://lkml.org/lkml/2018/11/20/643 in
>>> this
>>> serial.
>>> Since no more comments on these patches, will you take them?
>>>
>> I think Eduardo will take care of this patch series.
> 
> Yes, I will take a look on this series.
> 
> But, please, next time you send a series of patches on thermal, copy the
> linux...@vger.kernel.org mailing list. This way we can track your
> patches on patchwork.

Sure, will do it.

Thanks.
Wei.

> 
>>
>> thanks,
>> rui
>>> Thanks.
>>> Wei.
>>>
>>> On 14/12/2018 5:49 PM, Wei Ni wrote:
>>>>
>>>> This series fixed some issues for Tegra soctherm,
>>>> and add get_trend().
>>>>
>>>> Main changes from v5:
>>>> 1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/643
>>>> into this serial.
>>>>
>>>> Main changes from v4:
>>>> 1. fixed for the parsing sensor id.
>>>> 2. keep warning for missing critical trips.
>>>>
>>>> Main changes from v3:
>>>> 1. updated codes for parsing sensor id, per Thierry's comments
>>>>
>>>> Main changes from v2:
>>>> 1. add codes to parse sensor id to avoid registration
>>>> failure.
>>>>
>>>> Main changes from v1:
>>>> 1. Acked by Thierry Reding  for the patch
>>>> "thermal: tegra: fix memory allocation".
>>>> 2. Print out the sensor name when register failed.
>>>> 2. Remove patch "thermal: tegra: fix coverity defect"
>>>>
>>>> Wei Ni (4):
>>>>   thermal: tegra: remove unnecessary warnings
>>>>   thermal: tegra: fix memory allocation
>>>>   thermal: tegra: parse sensor id before sensor register
>>>>   thermal: tegra: add get_trend ops
>>>>
>>>>  drivers/thermal/tegra/soctherm.c | 85
>>>> +---
>>>>  1 file changed, 80 insertions(+), 5 deletions(-)
>>>>


Re: [PATCH v6 3/4] thermal: tegra: parse sensor id before sensor register

2018-12-18 Thread Wei Ni



On 19/12/2018 9:24 AM, Eduardo Valentin wrote:
> On Fri, Dec 14, 2018 at 05:49:52PM +0800, Wei Ni wrote:
>> Since different platforms may not support all 4
>> sensors, so the sensor registration may be failed.
>> Add codes to parse dt to find sensor id which
>> need to be registered. So that the registration
>> can be successful on all platform.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  drivers/thermal/tegra/soctherm.c | 45 
>> ++--
>>  1 file changed, 43 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c 
>> b/drivers/thermal/tegra/soctherm.c
>> index fd2703c0cfc5..6bee31cd4621 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -1224,6 +1224,41 @@ static void soctherm_init(struct platform_device 
>> *pdev)
>>  tegra_soctherm_throttle(>dev);
>>  }
>>  
>> +static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
>> +{
>> +bool ret = false;
>> +struct of_phandle_args sensor_specs;
>> +struct device_node *np, *sensor_np;
>> +
>> +np = of_find_node_by_name(NULL, "thermal-zones");
>> +if (!np)
>> +return ret;
>> +
>> +for_each_available_child_of_node(np, sensor_np) {
>> +if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
>> + "#thermal-sensor-cells",
>> + 0, _specs))
>> +continue;
>> +
>> +if (sensor_specs.args_count != 1) {
>> +WARN(sensor_specs.args_count != 1,
>> + "%s: wrong cells in sensor specifier %d\n",
>> + sensor_specs.np->name, sensor_specs.args_count);
>> +continue;
>> +}
>> +
>> +if (sensor_specs.args[0] == sensor_id) {
>> +of_node_put(sensor_np);
>> +ret = true;
>> +break;
>> +}
>> +}
>> +
>> +of_node_put(np);
>> +
>> +return ret;
>> +}
> 
> So, I am still failing to see why this is really needed. 
> 
> Why can't you simply resolve this with different compatibles?
> If the sensor is not present or disabled, the compatible is not, well,
> compatible anymore.

This driver can support three Tegra chip t124, t132 and t210. And we
also support some platforms for every chips. As the description in the
commit, different platforms may not support all 4 sensors, so I
upstreamed this patch.
If we use different compatibles, I think we can't resolve it simply,
because we also need to add codes to configure which platform support
which sensors, and may add more in the future. If use this patch, we
doesn't need to do any more in the future.
Actually in my original change, I just ignore the registration failure
to fix this issue, it will not affect loading driver, but as Daniel's
comment, it's not better to ignore, so I followed his comment to refer
the QORIQ thermal driver to get the sensor id.

Thanks.
Wei.

> 
>> +
>>  static const struct of_device_id tegra_soctherm_of_match[] = {
>>  #ifdef CONFIG_ARCH_TEGRA_124_SOC
>>  {
>> @@ -1365,13 +1400,16 @@ static int tegra_soctherm_probe(struct 
>> platform_device *pdev)
>>  zone->sg = soc->ttgs[i];
>>  zone->ts = tegra;
>>  
>> +if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
>> +continue;
>> +
>>  z = devm_thermal_zone_of_sensor_register(>dev,
>>   soc->ttgs[i]->id, zone,
>>   _of_thermal_ops);
>>  if (IS_ERR(z)) {
>>  err = PTR_ERR(z);
>> -dev_err(>dev, "failed to register sensor: %d\n",
>> -err);
>> +dev_err(>dev, "failed to register sensor %s: 
>> %d\n",
>> +soc->ttgs[i]->name, err);
>>  goto disable_clocks;
>>  }
>>  
>> @@ -1434,6 +1472,9 @@ static int __maybe_unused soctherm_resume(struct 
>> device *dev)
>>  struct thermal_zone_device *tz;
>>  
>>  tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
>> +if (!tz)
>> +continue;
>> +
>>  err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
>>  if (err) {
>>  dev_err(>dev,
>> -- 
>> 2.7.4
>>


Re: [PATCH v1 00/12] Add some functionalities for Tegra soctherm

2018-12-17 Thread Wei Ni
Sorry, please ignore this cover-letter.

Wei.

On 18/12/2018 3:34 PM, Wei Ni wrote:
> Move the hw/sw shutdown patches into this serial. There already have
> some discussion for it in https://lkml.org/lkml/2018/12/7/225.
> Support GPU HW throttle, thermal IRQ, set_trips(), EDP IRQ and OC
> hw throttle.
> 
> Wei Ni (12):
>   of: Add bindings of thermtrip for Tegra soctherm
>   thermal: tegra: support hw and sw shutdown
>   arm64: dts: tegra210: set thermtrip
>   of: Add bindings of gpu hw throttle for Tegra soctherm
>   thermal: tegra: add support for gpu hw-throttle
>   arm64: dts: tegra210: set gpu hw throttle level
>   thermal: tegra: add support for thermal IRQ
>   thermal: tegra: add set_trips functionality
>   thermal: tegra: add support for EDP IRQ
>   arm64: dts: tegra210: set EDP interrupt line
>   of: Add bindings of OC hw throttle for Tegra soctherm
>   thermal: tegra: enable OC hw throttle
> 
>  .../bindings/thermal/nvidia,tegra124-soctherm.txt  |  63 +-
>  arch/arm64/boot/dts/nvidia/tegra210.dtsi   |  20 +-
>  drivers/thermal/tegra/soctherm.c   | 955 
> +++--
>  drivers/thermal/tegra/soctherm.h   |  16 +
>  drivers/thermal/tegra/tegra124-soctherm.c  |   7 +-
>  drivers/thermal/tegra/tegra132-soctherm.c  |   7 +-
>  drivers/thermal/tegra/tegra210-soctherm.c  |  15 +-
>  include/dt-bindings/thermal/tegra124-soctherm.h|  22 +-
>  8 files changed, 1029 insertions(+), 76 deletions(-)
> 


[PATCH v1 07/12] thermal: tegra: add support for thermal IRQ

2018-12-17 Thread Wei Ni
Support to generate an interrupt when the temperature
crosses a programmed threshold and notify the thermal framework.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 136 +++
 1 file changed, 136 insertions(+)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index d3cef88a3f22..c66fdd546ef0 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -86,6 +86,20 @@
 #define THERMCTL_LVL0_UP_STATS 0x10
 #define THERMCTL_LVL0_DN_STATS 0x14
 
+#define THERMCTL_INTR_STATUS   0x84
+#define THERMCTL_INTR_ENABLE   0x88
+#define THERMCTL_INTR_DISABLE  0x8c
+
+#define TH_INTR_MD0_MASK   BIT(25)
+#define TH_INTR_MU0_MASK   BIT(24)
+#define TH_INTR_GD0_MASK   BIT(17)
+#define TH_INTR_GU0_MASK   BIT(16)
+#define TH_INTR_CD0_MASK   BIT(9)
+#define TH_INTR_CU0_MASK   BIT(8)
+#define TH_INTR_PD0_MASK   BIT(1)
+#define TH_INTR_PU0_MASK   BIT(0)
+#define TH_INTR_IGNORE_MASK0xFCFCFCFC
+
 #define THERMCTL_STATS_CTL 0x94
 #define STATS_CTL_CLR_DN   0x8
 #define STATS_CTL_EN_DN0x4
@@ -242,6 +256,8 @@ struct tegra_soctherm {
void __iomem *clk_regs;
void __iomem *ccroc_regs;
 
+   int thermal_irq;
+
u32 *calib;
struct thermal_zone_device **thermctl_tzs;
struct tegra_soctherm_soc *soc;
@@ -640,6 +656,98 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
return 0;
 }
 
+static irqreturn_t soctherm_thermal_isr(int irq, void *dev_id)
+{
+   struct tegra_soctherm *ts = dev_id;
+   u32 r;
+
+   r = readl(ts->regs + THERMCTL_INTR_STATUS);
+   writel(r, ts->regs + THERMCTL_INTR_DISABLE);
+
+   return IRQ_WAKE_THREAD;
+}
+
+/**
+ * soctherm_thermal_isr_thread() - Handles a thermal interrupt request
+ * @irq:   The interrupt number being requested; not used
+ * @dev_id:Opaque pointer to tegra_soctherm;
+ *
+ * Clears the interrupt status register if there are expected
+ * interrupt bits set.
+ * The interrupt(s) are then handled by updating the corresponding
+ * thermal zones.
+ *
+ * An error is logged if any unexpected interrupt bits are set.
+ *
+ * Disabled interrupts are re-enabled.
+ *
+ * Return: %IRQ_HANDLED. Interrupt was handled and no further processing
+ * is needed.
+ */
+static irqreturn_t soctherm_thermal_isr_thread(int irq, void *dev_id)
+{
+   struct tegra_soctherm *ts = dev_id;
+   struct thermal_zone_device *tz;
+   u32 st, ex = 0, cp = 0, gp = 0, pl = 0, me = 0;
+
+   st = readl(ts->regs + THERMCTL_INTR_STATUS);
+
+   /* deliberately clear expected interrupts handled in SW */
+   cp |= st & TH_INTR_CD0_MASK;
+   cp |= st & TH_INTR_CU0_MASK;
+
+   gp |= st & TH_INTR_GD0_MASK;
+   gp |= st & TH_INTR_GU0_MASK;
+
+   pl |= st & TH_INTR_PD0_MASK;
+   pl |= st & TH_INTR_PU0_MASK;
+
+   me |= st & TH_INTR_MD0_MASK;
+   me |= st & TH_INTR_MU0_MASK;
+
+   ex |= cp | gp | pl | me;
+   if (ex) {
+   writel(ex, ts->regs + THERMCTL_INTR_STATUS);
+   st &= ~ex;
+
+   if (cp) {
+   tz = ts->thermctl_tzs[TEGRA124_SOCTHERM_SENSOR_CPU];
+   thermal_zone_device_update(tz,
+  THERMAL_EVENT_UNSPECIFIED);
+   }
+
+   if (gp) {
+   tz = ts->thermctl_tzs[TEGRA124_SOCTHERM_SENSOR_GPU];
+   thermal_zone_device_update(tz,
+  THERMAL_EVENT_UNSPECIFIED);
+   }
+
+   if (pl) {
+   tz = ts->thermctl_tzs[TEGRA124_SOCTHERM_SENSOR_PLLX];
+   thermal_zone_device_update(tz,
+  THERMAL_EVENT_UNSPECIFIED);
+   }
+
+   if (me) {
+   tz = ts->thermctl_tzs[TEGRA124_SOCTHERM_SENSOR_MEM];
+   thermal_zone_device_update(tz,
+  THERMAL_EVENT_UNSPECIFIED);
+   }
+   }
+
+   /* deliberately ignore expected interrupts NOT handled in SW */
+   ex |= TH_INTR_IGNORE_MASK;
+   st &= ~ex;
+
+   if (st) {
+   /* Whine about any other unexpected INTR bits still set */
+   pr_err("soctherm: Ignored unexpected INTRs 0x%08x\n", st);
+   writel(st, ts->regs + THERMCTL_INTR_STATUS);
+   }
+
+   return IRQ_HANDLED;
+}
+
 #ifdef CONFIG_DEBUG_FS
 static int regs_show(struct seq_file *s, voi

[PATCH v1 03/12] arm64: dts: tegra210: set thermtrip

2018-12-17 Thread Wei Ni
Set "nvidia,thermtrips" property, it used to set
HW shutdown temperatures.

Signed-off-by: Wei Ni 
---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 15 +--
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 2205d66b0443..36c7dce7fa69 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1332,6 +1332,9 @@
reset-names = "soctherm";
#thermal-sensor-cells = <1>;
 
+   nvidia,thermtrips = ;
+
throttle-cfgs {
throttle_heavy: heavy {
nvidia,priority = <100>;
@@ -1351,8 +1354,8 @@
< TEGRA124_SOCTHERM_SENSOR_CPU>;
 
trips {
-   cpu-shutdown-trip {
-   temperature = <102500>;
+   cpu-critical-trip {
+   temperature = <102000>;
hysteresis = <0>;
type = "critical";
};
@@ -1379,7 +1382,7 @@
< TEGRA124_SOCTHERM_SENSOR_MEM>;
 
trips {
-   mem-shutdown-trip {
+   mem-critical-trip {
temperature = <103000>;
hysteresis = <0>;
type = "critical";
@@ -1401,8 +1404,8 @@
< TEGRA124_SOCTHERM_SENSOR_GPU>;
 
trips {
-   gpu-shutdown-trip {
-   temperature = <103000>;
+   gpu-critical-trip {
+   temperature = <102500>;
hysteresis = <0>;
type = "critical";
};
@@ -1429,7 +1432,7 @@
< TEGRA124_SOCTHERM_SENSOR_PLLX>;
 
trips {
-   pllx-shutdown-trip {
+   pllx-critical-trip {
temperature = <103000>;
hysteresis = <0>;
type = "critical";
-- 
2.7.4



[PATCH v1 01/12] of: Add bindings of thermtrip for Tegra soctherm

2018-12-17 Thread Wei Ni
Add optional property "nvidia,thermtrips".
If present, these trips will be used as HW shutdown trips,
and critical trips will be used as SW shutdown trips.

Signed-off-by: Wei Ni 
---
 .../bindings/thermal/nvidia,tegra124-soctherm.txt| 20 +---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git 
a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
index b6c0ae53d4dc..ab66d6feab4b 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
@@ -55,10 +55,21 @@ Required properties :
   - #cooling-cells: Should be 1. This cooling device only support on/off 
state.
 See ./thermal.txt for a description of this property.
 
+Optional properties:
+- nvidia,thermtrips : When present, this property specifies the temperature at
+  which the soctherm hardware will assert the thermal trigger signal to the
+  Power Management IC, which can be configured to reset or shutdown the device.
+  It is an array of pairs where each pair represents a tsensor id followed by a
+  temperature in milli Celcius. In the absence of this property the critical
+  trip point will be used for thermtrip temperature.
+
 Note:
-- the "critical" type trip points will be set to SOC_THERM hardware as the
-shut down temperature. Once the temperature of this thermal zone is higher
-than it, the system will be shutdown or reset by hardware.
+- the "critical" type trip points will be used to set the temperature at which
+the SOC_THERM hardware will assert a thermal trigger if the "nvidia,thermtrips"
+property is missing. When the thermtrips property is present, the breach of a
+critical trip point is reported back to the thermal framework to implement
+software shutdown.
+
 - the "hot" type trip points will be set to SOC_THERM hardware as the throttle
 temperature. Once the the temperature of this thermal zone is higher
 than it, it will trigger the HW throttle event.
@@ -79,6 +90,9 @@ Example :
 
#thermal-sensor-cells = <1>;
 
+   nvidia,thermtrips = ;
+
throttle-cfgs {
/*
 * When the "heavy" cooling device triggered,
-- 
2.7.4



[PATCH v1 02/12] thermal: tegra: support hw and sw shutdown

2018-12-17 Thread Wei Ni
Currently the critical trip points in thermal framework are the only
way to specify a temperature at which HW should shutdown. This is
insufficient for certain platforms which would want an orderly
software shutdown in addition to HW shutdown.

This change support to parse "nvidia, thermtrips" property,
it allows soctherm DT to specify thermtrip temperatures so that
critical trip points framework can be used for doing software
shutdown.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c  | 99 ++-
 drivers/thermal/tegra/soctherm.h  |  6 ++
 drivers/thermal/tegra/tegra210-soctherm.c |  8 +++
 3 files changed, 98 insertions(+), 15 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..673c3ffa9001 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -446,6 +446,24 @@ find_throttle_cfg_by_name(struct tegra_soctherm *ts, const 
char *name)
return NULL;
 }
 
+static int tsensor_group_thermtrip_get(struct tegra_soctherm *ts, int id)
+{
+   int i, temp = min_low_temp;
+   struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+
+   if (id >= TEGRA124_SOCTHERM_SENSOR_NUM)
+   return temp;
+
+   if (tt) {
+   for (i = 0; i < ts->soc->num_ttgs; i++) {
+   if (tt[i].id == id)
+   return tt[i].temp;
+   }
+   }
+
+   return temp;
+}
+
 static int tegra_thermctl_set_trip_temp(void *data, int trip, int temp)
 {
struct tegra_thermctl_zone *zone = data;
@@ -464,7 +482,16 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return ret;
 
if (type == THERMAL_TRIP_CRITICAL) {
-   return thermtrip_program(dev, sg, temp);
+   /*
+* If thermtrips property is set in DT,
+* doesn't need to program critical type trip to HW,
+* if not, program critical trip to HW.
+*/
+   if (min_low_temp == tsensor_group_thermtrip_get(ts, sg->id))
+   return thermtrip_program(dev, sg, temp);
+   else
+   return 0;
+
} else if (type == THERMAL_TRIP_HOT) {
int i;
 
@@ -523,7 +550,8 @@ static int get_hot_temp(struct thermal_zone_device *tz, int 
*trip, int *temp)
  * @dev: struct device * of the SOC_THERM instance
  *
  * Configure the SOC_THERM HW trip points, setting "THERMTRIP"
- * "THROTTLE" trip points , using "critical" or "hot" type trip_temp
+ * "THROTTLE" trip points , using "thermtrips", "critical" or "hot"
+ * type trip_temp
  * from thermal zone.
  * After they have been configured, THERMTRIP or THROTTLE will take
  * action when the configured SoC thermal sensor group reaches a
@@ -545,28 +573,23 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 {
struct tegra_soctherm *ts = dev_get_drvdata(dev);
struct soctherm_throt_cfg *stc;
-   int i, trip, temperature;
-   int ret;
+   int i, trip, temperature, ret;
 
-   ret = tz->ops->get_crit_temp(tz, );
-   if (ret) {
-   dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
-sg->name);
-   goto set_throttle;
-   }
+   /* Get thermtrips. If missing, try to get critical trips. */
+   temperature = tsensor_group_thermtrip_get(ts, sg->id);
+   if (min_low_temp == temperature)
+   if (tz->ops->get_crit_temp(tz, ))
+   temperature = max_high_temp;
 
ret = thermtrip_program(dev, sg, temperature);
if (ret) {
-   dev_err(dev, "thermtrip: %s: error during enable\n",
-   sg->name);
+   dev_err(dev, "thermtrip: %s: error during enable\n", sg->name);
return ret;
}
 
-   dev_info(dev,
-"thermtrip: will shut down when %s reaches %d mC\n",
+   dev_info(dev, "thermtrip: will shut down when %s reaches %d mC\n",
 sg->name, temperature);
 
-set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
dev_warn(dev, "throttrip: %s: missing hot temperature\n",
@@ -907,6 +930,50 @@ static const struct thermal_cooling_device_ops 
throt_cooling_ops = {
.set_cur_state = throt_set_cdev_state,
 };
 
+static int soctherm_thermtrips_parse(struct platform_device *pdev)
+{
+   struct device *dev = >dev;
+   struct tegra_soctherm *ts = dev_get_drvdata(dev);
+   struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+   const int max_num_prop = ts->soc->num_ttgs * 2;
+   u3

[PATCH v1 09/12] thermal: tegra: add support for EDP IRQ

2018-12-17 Thread Wei Ni
Add support to generate OC (over-current) interrupts to
indicate the OC event and print out alarm messages.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 420 +++
 1 file changed, 420 insertions(+)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index eefbb29b3b7d..37108f2290f9 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -23,6 +23,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -104,6 +106,16 @@
 #define STATS_CTL_CLR_UP   0x2
 #define STATS_CTL_EN_UP0x1
 
+#define OC_INTR_STATUS 0x39c
+#define OC_INTR_ENABLE 0x3a0
+#define OC_INTR_DISABLE0x3a4
+
+#define OC_INTR_OC1_MASK   BIT(0)
+#define OC_INTR_OC2_MASK   BIT(1)
+#define OC_INTR_OC3_MASK   BIT(2)
+#define OC_INTR_OC4_MASK   BIT(3)
+#define OC_INTR_OC5_MASK   BIT(4)
+
 #define THROT_GLOBAL_CFG   0x400
 #define THROT_GLOBAL_ENB_MASK  BIT(0)
 
@@ -212,9 +224,23 @@ static const int max_high_temp = 127000;
 enum soctherm_throttle_id {
THROTTLE_LIGHT = 0,
THROTTLE_HEAVY,
+   THROTTLE_OC1,
+   THROTTLE_OC2,
+   THROTTLE_OC3,
+   THROTTLE_OC4,
+   THROTTLE_OC5, /* OC5 is reserved */
THROTTLE_SIZE,
 };
 
+enum soctherm_oc_irq_id {
+   TEGRA_SOC_OC_IRQ_1,
+   TEGRA_SOC_OC_IRQ_2,
+   TEGRA_SOC_OC_IRQ_3,
+   TEGRA_SOC_OC_IRQ_4,
+   TEGRA_SOC_OC_IRQ_5,
+   TEGRA_SOC_OC_IRQ_MAX,
+};
+
 enum soctherm_throttle_dev_id {
THROTTLE_DEV_CPU = 0,
THROTTLE_DEV_GPU,
@@ -224,6 +250,11 @@ enum soctherm_throttle_dev_id {
 static const char *const throt_names[] = {
[THROTTLE_LIGHT] = "light",
[THROTTLE_HEAVY] = "heavy",
+   [THROTTLE_OC1]   = "oc1",
+   [THROTTLE_OC2]   = "oc2",
+   [THROTTLE_OC3]   = "oc3",
+   [THROTTLE_OC4]   = "oc4",
+   [THROTTLE_OC5]   = "oc5",
 };
 
 struct tegra_soctherm;
@@ -255,6 +286,7 @@ struct tegra_soctherm {
void __iomem *ccroc_regs;
 
int thermal_irq;
+   int edp_irq;
 
u32 *calib;
struct thermal_zone_device **thermctl_tzs;
@@ -267,6 +299,15 @@ struct tegra_soctherm {
struct mutex thermctl_lock;
 };
 
+struct soctherm_oc_irq_chip_data {
+   struct mutexirq_lock; /* serialize OC IRQs */
+   struct irq_chip irq_chip;
+   struct irq_domain   *domain;
+   int irq_enable;
+};
+
+static struct soctherm_oc_irq_chip_data soc_irq_cdata;
+
 /**
  * ccroc_writel() - writes a value to a CCROC register
  * @ts: pointer to a struct tegra_soctherm
@@ -807,6 +848,360 @@ static irqreturn_t soctherm_thermal_isr_thread(int irq, 
void *dev_id)
return IRQ_HANDLED;
 }
 
+/**
+ * soctherm_oc_intr_enable() - Enables the soctherm over-current interrupt
+ * @alarm: The soctherm throttle id
+ * @enable:Flag indicating enable the soctherm over-current
+ * interrupt or disable it
+ *
+ * Enables a specific over-current pins @alarm to raise an interrupt if the 
flag
+ * is set and the alarm corresponds to OC1, OC2, OC3, or OC4.
+ */
+static void soctherm_oc_intr_enable(struct tegra_soctherm *ts,
+   enum soctherm_throttle_id alarm,
+   bool enable)
+{
+   u32 r;
+
+   if (!enable)
+   return;
+
+   r = readl(ts->regs + OC_INTR_ENABLE);
+   switch (alarm) {
+   case THROTTLE_OC1:
+   r = REG_SET_MASK(r, OC_INTR_OC1_MASK, 1);
+   break;
+   case THROTTLE_OC2:
+   r = REG_SET_MASK(r, OC_INTR_OC2_MASK, 1);
+   break;
+   case THROTTLE_OC3:
+   r = REG_SET_MASK(r, OC_INTR_OC3_MASK, 1);
+   break;
+   case THROTTLE_OC4:
+   r = REG_SET_MASK(r, OC_INTR_OC4_MASK, 1);
+   break;
+   default:
+   r = 0;
+   break;
+   }
+   writel(r, ts->regs + OC_INTR_ENABLE);
+}
+
+/**
+ * soctherm_handle_alarm() - Handles soctherm alarms
+ * @alarm: The soctherm throttle id
+ *
+ * "Handles" over-current alarms (OC1, OC2, OC3, and OC4) by printing
+ * a warning or informative message.
+ *
+ * Return: -EINVAL for @alarm = THROTTLE_OC3, otherwise 0 (success).
+ */
+static int soctherm_handle_alarm(enum soctherm_throttle_id alarm)
+{
+   int rv = -EINVAL;
+
+   switch (alarm) {
+   case THROTTLE_OC1:
+   pr_debug("soctherm: Successfully handled OC1 alarm\n");
+   rv = 0;
+   break;
+
+   case THROTTLE

[PATCH v1 08/12] thermal: tegra: add set_trips functionality

2018-12-17 Thread Wei Ni
Implement set_trips ops to set passive trip points.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c  | 64 ++-
 drivers/thermal/tegra/soctherm.h  | 10 +
 drivers/thermal/tegra/tegra124-soctherm.c |  7 +++-
 drivers/thermal/tegra/tegra132-soctherm.c |  7 +++-
 drivers/thermal/tegra/tegra210-soctherm.c |  7 +++-
 5 files changed, 90 insertions(+), 5 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index c66fdd546ef0..eefbb29b3b7d 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -87,8 +87,6 @@
 #define THERMCTL_LVL0_DN_STATS 0x14
 
 #define THERMCTL_INTR_STATUS   0x84
-#define THERMCTL_INTR_ENABLE   0x88
-#define THERMCTL_INTR_DISABLE  0x8c
 
 #define TH_INTR_MD0_MASK   BIT(25)
 #define TH_INTR_MU0_MASK   BIT(24)
@@ -265,6 +263,8 @@ struct tegra_soctherm {
struct soctherm_throt_cfg throt_cfgs[THROTTLE_SIZE];
 
struct dentry *debugfs_dir;
+
+   struct mutex thermctl_lock;
 };
 
 /**
@@ -542,9 +542,59 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return 0;
 }
 
+static void thermal_irq_enable(struct tegra_thermctl_zone *zn)
+{
+   u32 r;
+
+   /* multiple zones could be handling and setting trips at once */
+   mutex_lock(>ts->thermctl_lock);
+   r = readl(zn->ts->regs + THERMCTL_INTR_ENABLE);
+   r = REG_SET_MASK(r, zn->sg->thermctl_isr_mask, TH_INTR_UP_DN_EN);
+   writel(r, zn->ts->regs + THERMCTL_INTR_ENABLE);
+   mutex_unlock(>ts->thermctl_lock);
+}
+
+static void thermal_irq_disable(struct tegra_thermctl_zone *zn)
+{
+   u32 r;
+
+   /* multiple zones could be handling and setting trips at once */
+   mutex_lock(>ts->thermctl_lock);
+   r = readl(zn->ts->regs + THERMCTL_INTR_DISABLE);
+   r = REG_SET_MASK(r, zn->sg->thermctl_isr_mask, 0);
+   writel(r, zn->ts->regs + THERMCTL_INTR_DISABLE);
+   mutex_unlock(>ts->thermctl_lock);
+}
+
+static int tegra_thermctl_set_trips(void *data, int lo, int hi)
+{
+   struct tegra_thermctl_zone *zone = data;
+   u32 r;
+
+   thermal_irq_disable(zone);
+
+   r = readl(zone->ts->regs + zone->sg->thermctl_lvl0_offset);
+   r = REG_SET_MASK(r, THERMCTL_LVL0_CPU0_EN_MASK, 0);
+   writel(r, zone->ts->regs + zone->sg->thermctl_lvl0_offset);
+
+   lo = enforce_temp_range(zone->dev, lo) / zone->ts->soc->thresh_grain;
+   hi = enforce_temp_range(zone->dev, hi) / zone->ts->soc->thresh_grain;
+   dev_dbg(zone->dev, "%s hi:%d, lo:%d\n", __func__, hi, lo);
+
+   r = REG_SET_MASK(r, zone->sg->thermctl_lvl0_up_thresh_mask, hi);
+   r = REG_SET_MASK(r, zone->sg->thermctl_lvl0_dn_thresh_mask, lo);
+   r = REG_SET_MASK(r, THERMCTL_LVL0_CPU0_EN_MASK, 1);
+   writel(r, zone->ts->regs + zone->sg->thermctl_lvl0_offset);
+
+   thermal_irq_enable(zone);
+
+   return 0;
+}
+
 static const struct thermal_zone_of_device_ops tegra_of_thermal_ops = {
.get_temp = tegra_thermctl_get_temp,
.set_trip_temp = tegra_thermctl_set_trip_temp,
+   .set_trips = tegra_thermctl_set_trips,
 };
 
 static int get_hot_temp(struct thermal_zone_device *tz, int *trip, int *temp)
@@ -661,6 +711,15 @@ static irqreturn_t soctherm_thermal_isr(int irq, void 
*dev_id)
struct tegra_soctherm *ts = dev_id;
u32 r;
 
+   /* Case for no lock:
+* Although interrupts are enabled in set_trips, there is still no need
+* to lock here because the interrupts are disabled before programming
+* new trip points. Hence there cant be a interrupt on the same sensor.
+* An interrupt can however occur on a sensor while trips are being
+* programmed on a different one. This beign a LEVEL interrupt won't
+* cause a new interrupt but this is taken care of by the re-reading of
+* the STATUS register in the thread function.
+*/
r = readl(ts->regs + THERMCTL_INTR_STATUS);
writel(r, ts->regs + THERMCTL_INTR_DISABLE);
 
@@ -1523,6 +1582,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
if (!tegra)
return -ENOMEM;
 
+   mutex_init(>thermctl_lock);
dev_set_drvdata(>dev, tegra);
 
tegra->soc = soc;
diff --git a/drivers/thermal/tegra/soctherm.h b/drivers/thermal/tegra/soctherm.h
index c05c7e37e968..70501e73d586 100644
--- a/drivers/thermal/tegra/soctherm.h
+++ b/drivers/thermal/tegra/soctherm.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2014-2016, NVIDIA CORPORATION.  All rights reserved.
  *
@@ -29,6 +30,14 @@
 #define THERMCTL_THERMTRIP_CTL 

[PATCH v1 10/12] arm64: dts: tegra210: set EDP interrupt line

2018-12-17 Thread Wei Ni
Set EDP interrupt line.

Signed-off-by: Wei Ni 
---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 57dae9cc7b7d..b4531a8c18f6 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1324,7 +1324,8 @@
reg = <0x0 0x700e2000 0x0 0x600 /* SOC_THERM reg_base */
0x0 0x60006000 0x0 0x400>; /* CAR reg_base */
reg-names = "soctherm-reg", "car-reg";
-   interrupts = ;
+   interrupts = ;
clocks = <_car TEGRA210_CLK_TSENSOR>,
<_car TEGRA210_CLK_SOC_THERM>;
clock-names = "tsensor", "soctherm";
-- 
2.7.4



[PATCH v1 04/12] of: Add bindings of gpu hw throttle for Tegra soctherm

2018-12-17 Thread Wei Ni
Add "nvidia,gpu-throt-level" property to set gpu hw
throttle level.

Signed-off-by: Wei Ni 
---
 .../bindings/thermal/nvidia,tegra124-soctherm.txt  | 17 +++--
 include/dt-bindings/thermal/tegra124-soctherm.h| 22 ++
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git 
a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
index ab66d6feab4b..cf6d0be56b7a 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
@@ -52,6 +52,15 @@ Required properties :
 Must set as following values:
 TEGRA_SOCTHERM_THROT_LEVEL_LOW, TEGRA_SOCTHERM_THROT_LEVEL_MED
 TEGRA_SOCTHERM_THROT_LEVEL_HIGH, TEGRA_SOCTHERM_THROT_LEVEL_NONE
+  - nvidia,gpu-throt-level: This property is for Tegra124 and Tegra210.
+It is the level of pulse skippers, which used to throttle clock
+frequencies. It indicates gpu clock throttling depth and can be
+programmed to any of the following values which represent a throttling
+percentage:
+TEGRA_SOCTHERM_THROT_LEVEL_NONE (0%)
+TEGRA_SOCTHERM_THROT_LEVEL_LOW (50%),
+TEGRA_SOCTHERM_THROT_LEVEL_MED (75%),
+TEGRA_SOCTHERM_THROT_LEVEL_HIGH (85%).
   - #cooling-cells: Should be 1. This cooling device only support on/off 
state.
 See ./thermal.txt for a description of this property.
 
@@ -96,22 +105,26 @@ Example :
throttle-cfgs {
/*
 * When the "heavy" cooling device triggered,
-* the HW will skip cpu clock's pulse in 85% depth
+* the HW will skip cpu clock's pulse in 85% depth,
+* skip gpu clock's pulse in 85% level
 */
throttle_heavy: heavy {
nvidia,priority = <100>;
nvidia,cpu-throt-percent = <85>;
+   nvidia,gpu-throt-level = 
;
 
#cooling-cells = <1>;
};
 
/*
 * When the "light" cooling device triggered,
-* the HW will skip cpu clock's pulse in 50% depth
+* the HW will skip cpu clock's pulse in 50% depth,
+* skip gpu clock's pulse in 50% level
 */
throttle_light: light {
nvidia,priority = <80>;
nvidia,cpu-throt-percent = <50>;
+   nvidia,gpu-throt-level = 
;
 
#cooling-cells = <1>;
};
diff --git a/include/dt-bindings/thermal/tegra124-soctherm.h 
b/include/dt-bindings/thermal/tegra124-soctherm.h
index c15e8b709a0d..75853df1c609 100644
--- a/include/dt-bindings/thermal/tegra124-soctherm.h
+++ b/include/dt-bindings/thermal/tegra124-soctherm.h
@@ -1,5 +1,19 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /*
+ * Copyright (c) 2014 - 2018, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * Author:
+ *  Mikko Perttunen 
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
  * This header provides constants for binding nvidia,tegra124-soctherm.
  */
 
@@ -12,9 +26,9 @@
 #define TEGRA124_SOCTHERM_SENSOR_PLLX 3
 #define TEGRA124_SOCTHERM_SENSOR_NUM 4
 
-#define TEGRA_SOCTHERM_THROT_LEVEL_LOW  0
-#define TEGRA_SOCTHERM_THROT_LEVEL_MED  1
-#define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 2
-#define TEGRA_SOCTHERM_THROT_LEVEL_NONE -1
+#define TEGRA_SOCTHERM_THROT_LEVEL_NONE 0
+#define TEGRA_SOCTHERM_THROT_LEVEL_LOW  1
+#define TEGRA_SOCTHERM_THROT_LEVEL_MED  2
+#define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 3
 
 #endif
-- 
2.7.4



[PATCH v1 00/12] Add some functionalities for Tegra soctherm

2018-12-17 Thread Wei Ni
Move the hw/sw shutdown patches into this serial. There already have
some discussion for it in https://lkml.org/lkml/2018/12/7/225.
Support GPU HW throttle, thermal IRQ, set_trips(), EDP IRQ and OC
hw throttle.

Wei Ni (12):
  of: Add bindings of thermtrip for Tegra soctherm
  thermal: tegra: support hw and sw shutdown
  arm64: dts: tegra210: set thermtrip
  of: Add bindings of gpu hw throttle for Tegra soctherm
  thermal: tegra: add support for gpu hw-throttle
  arm64: dts: tegra210: set gpu hw throttle level
  thermal: tegra: add support for thermal IRQ
  thermal: tegra: add set_trips functionality
  thermal: tegra: add support for EDP IRQ
  arm64: dts: tegra210: set EDP interrupt line
  of: Add bindings of OC hw throttle for Tegra soctherm
  thermal: tegra: enable OC hw throttle

 .../bindings/thermal/nvidia,tegra124-soctherm.txt  |  63 +-
 arch/arm64/boot/dts/nvidia/tegra210.dtsi   |  20 +-
 drivers/thermal/tegra/soctherm.c   | 959 +++--
 drivers/thermal/tegra/soctherm.h   |  16 +
 drivers/thermal/tegra/tegra124-soctherm.c  |   7 +-
 drivers/thermal/tegra/tegra132-soctherm.c  |   7 +-
 drivers/thermal/tegra/tegra210-soctherm.c  |  15 +-
 include/dt-bindings/thermal/tegra124-soctherm.h|  22 +-
 8 files changed, 1033 insertions(+), 76 deletions(-)

-- 
2.7.4



[PATCH v1 12/12] thermal: tegra: enable OC hw throttle

2018-12-17 Thread Wei Ni
Parse Over Current settings from DT and program them to
generate interrupts. Also enable hw throttling whenever
there are OC events. Log the OC events as debug messages.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 128 ---
 1 file changed, 118 insertions(+), 10 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 37108f2290f9..c2a0b048a085 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -106,9 +106,26 @@
 #define STATS_CTL_CLR_UP   0x2
 #define STATS_CTL_EN_UP0x1
 
+#define OC1_CFG0x310
+#define OC1_CFG_LONG_LATENCY_MASK  BIT(6)
+#define OC1_CFG_HW_RESTORE_MASKBIT(5)
+#define OC1_CFG_PWR_GOOD_MASK_MASK BIT(4)
+#define OC1_CFG_THROTTLE_MODE_MASK (0x3 << 2)
+#define OC1_CFG_ALARM_POLARITY_MASKBIT(1)
+#define OC1_CFG_EN_THROTTLE_MASK   BIT(0)
+
+#define OC1_CNT_THRESHOLD  0x314
+#define OC1_THROTTLE_PERIOD0x318
+#define OC1_ALARM_COUNT0x31c
+#define OC1_FILTER 0x320
+#define OC1_STATS  0x3a8
+
 #define OC_INTR_STATUS 0x39c
 #define OC_INTR_ENABLE 0x3a0
 #define OC_INTR_DISABLE0x3a4
+#define OC_STATS_CTL   0x3c4
+#define OC_STATS_CTL_CLR_ALL   0x2
+#define OC_STATS_CTL_EN_ALL0x1
 
 #define OC_INTR_OC1_MASK   BIT(0)
 #define OC_INTR_OC2_MASK   BIT(1)
@@ -207,6 +224,25 @@
 #define THROT_DELAY_CTRL(throt)(THROT_DELAY_LITE + \
(THROT_OFFSET * throt))
 
+#define ALARM_OFFSET   0x14
+#define ALARM_CFG(throt)   (OC1_CFG + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_CNT_THRESHOLD(throt) (OC1_CNT_THRESHOLD + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_THROTTLE_PERIOD(throt)   (OC1_THROTTLE_PERIOD + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_ALARM_COUNT(throt)   (OC1_ALARM_COUNT + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_FILTER(throt)(OC1_FILTER + \
+   (ALARM_OFFSET * (throt - THROTTLE_OC1)))
+
+#define ALARM_STATS(throt) (OC1_STATS + \
+   (4 * (throt - THROTTLE_OC1)))
+
 /* get CCROC_THROT_PSKIP_xxx offset per HIGH/MED/LOW vect*/
 #define CCROC_THROT_OFFSET 0x0c
 #define CCROC_THROT_PSKIP_CTRL_CPU_REG(vect)(CCROC_THROT_PSKIP_CTRL_CPU + \
@@ -218,6 +254,9 @@
 #define THERMCTL_LVL_REGS_SIZE 0x20
 #define THERMCTL_LVL_REG(rg, lv)   ((rg) + ((lv) * THERMCTL_LVL_REGS_SIZE))
 
+#define OC_THROTTLE_MODE_DISABLED  0
+#define OC_THROTTLE_MODE_BRIEF 2
+
 static const int min_low_temp = -127000;
 static const int max_high_temp = 127000;
 
@@ -266,6 +305,15 @@ struct tegra_thermctl_zone {
const struct tegra_tsensor_group *sg;
 };
 
+struct soctherm_oc_cfg {
+   u32 active_low;
+   u32 throt_period;
+   u32 alarm_cnt_thresh;
+   u32 alarm_filter;
+   u32 mode;
+   bool intr_en;
+};
+
 struct soctherm_throt_cfg {
const char *name;
unsigned int id;
@@ -273,6 +321,7 @@ struct soctherm_throt_cfg {
u8 cpu_throt_level;
u32 cpu_throt_depth;
u32 gpu_throt_level;
+   struct soctherm_oc_cfg oc_cfg;
struct thermal_cooling_device *cdev;
bool init;
 };
@@ -715,7 +764,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
return 0;
}
 
-   for (i = 0; i < THROTTLE_SIZE; i++) {
+   for (i = 0; i < THROTTLE_OC1; i++) {
struct thermal_cooling_device *cdev;
 
if (!ts->throt_cfgs[i].init)
@@ -1547,6 +1596,30 @@ static int soctherm_thermtrips_parse(struct 
platform_device *pdev)
return 0;
 }
 
+static void soctherm_oc_cfg_parse(struct device *dev,
+   struct device_node *np_oc,
+   struct soctherm_throt_cfg *stc)
+{
+   u32 val;
+
+   if (!of_property_read_u32(np_oc, "nvidia,polarity-active-low", ))
+   stc->oc_cfg.active_low = val;
+
+   if (!of_property_read_u32(np_oc, "nvidia,count-threshold", )) {
+   stc->oc_cfg.intr_en = 1;
+   stc->oc_cfg.alarm_cnt_thresh = val;
+   }
+
+   if (!of_property_read_u32(np_oc, "nvidia,throttle-period&qu

[PATCH v1 11/12] of: Add bindings of OC hw throttle for Tegra soctherm

2018-12-17 Thread Wei Ni
Add OC HW throttle configuration for soctherm in DT.
It is used to describe the OCx throttle events.

Signed-off-by: Wei Ni 
---
 .../bindings/thermal/nvidia,tegra124-soctherm.txt  | 26 ++
 1 file changed, 26 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
index cf6d0be56b7a..d112a8e59ec3 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
@@ -64,6 +64,21 @@ Required properties :
   - #cooling-cells: Should be 1. This cooling device only support on/off 
state.
 See ./thermal.txt for a description of this property.
 
+  Optional properties: The following properties are T210 specific and
+  valid only for OCx throttle events.
+  - nvidia,count-threshold: Specifies the number of OC events that are
+required for triggering an interrupt. Interrupts are not triggered if
+the property is missing. A value of 0 will interrupt on every OC alarm.
+  - nvidia,polarity-active-low: Configures the polarity of the OC alaram
+signal. Accepted values are 1 for assert low and 0 for assert high.
+Default value is 0.
+  - nvidia,alarm-filter: Number of clocks to filter event. When the filter
+expires (which means the OC event has not occurred for a long time),
+the counter is cleared and filter is rearmed. Default value is 0.
+  - nvidia,throttle-period: Specifies the number of uSec for which
+throttling is engaged after the OC event is deasserted. Default value
+is 0.
+
 Optional properties:
 - nvidia,thermtrips : When present, this property specifies the temperature at
   which the soctherm hardware will assert the thermal trigger signal to the
@@ -134,6 +149,17 @@ Example :
 * arbiter will select the highest priority as the 
final throttle
 * settings to skip cpu pulse.
 */
+
+   throttle_oc1: oc1 {
+   nvidia,priority = <50>;
+   nvidia,polarity-active-low = <1>;
+   nvidia,count-threshold = <100>;
+   nvidia,alarm-filter = <510>;
+   nvidia,throttle-period = <0>;
+   nvidia,cpu-throt-percent = <75>;
+   nvidia,gpu-throt-level =
+   
;
+};
};
};
 
-- 
2.7.4



[PATCH v1 06/12] arm64: dts: tegra210: set gpu hw throttle level

2018-12-17 Thread Wei Ni
Set gpu hw throttle level to TEGRA_SOCTHERM_THROT_LEVEL_HIGH

Signed-off-by: Wei Ni 
---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 36c7dce7fa69..57dae9cc7b7d 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1339,6 +1339,8 @@
throttle_heavy: heavy {
nvidia,priority = <100>;
nvidia,cpu-throt-percent = <85>;
+   nvidia,gpu-throt-level =
+   ;
 
#cooling-cells = <2>;
};
-- 
2.7.4



[PATCH v1 05/12] thermal: tegra: add support for gpu hw-throttle

2018-12-17 Thread Wei Ni
Add support to trigger pulse skippers on the GPU
when a HOT trip point is triggered. The pulse skippers
can be signalled to throttle at low, medium and high
depths\levels.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 118 ---
 1 file changed, 85 insertions(+), 33 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 673c3ffa9001..d3cef88a3f22 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1,5 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
- * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2014 - 2018, NVIDIA CORPORATION.  All rights reserved.
  *
  * Author:
  * Mikko Perttunen 
@@ -160,6 +161,15 @@
 /* get dividend from the depth */
 #define THROT_DEPTH_DIVIDEND(depth)((256 * (100 - (depth)) / 100) - 1)
 
+/* gk20a nv_therm interface N:3 Mapping. Levels defined in tegra124-sochterm.h
+ * level   vector
+ * NONE3'b000
+ * LOW 3'b001
+ * MED 3'b011
+ * HIGH3'b111
+ */
+#define THROT_LEVEL_TO_DEPTH(level)((0x1 << (level)) - 1)
+
 /* get THROT_PSKIP_xxx offset per LIGHT/HEAVY throt and CPU/GPU dev */
 #define THROT_OFFSET   0x30
 #define THROT_PSKIP_CTRL(throt, dev)   (THROT_PSKIP_CTRL_LITE_CPU + \
@@ -219,6 +229,7 @@ struct soctherm_throt_cfg {
u8 priority;
u8 cpu_throt_level;
u32 cpu_throt_depth;
+   u32 gpu_throt_level;
struct thermal_cooling_device *cdev;
bool init;
 };
@@ -974,6 +985,50 @@ static int soctherm_thermtrips_parse(struct 
platform_device *pdev)
return 0;
 }
 
+static int soctherm_throt_cfg_parse(struct device *dev,
+   struct device_node *np,
+   struct soctherm_throt_cfg *stc)
+{
+   struct tegra_soctherm *ts = dev_get_drvdata(dev);
+   int ret;
+   u32 val;
+
+   ret = of_property_read_u32(np, "nvidia,priority", );
+   if (ret) {
+   dev_err(dev, "throttle-cfg: %s: invalid priority\n", stc->name);
+   return -EINVAL;
+   }
+   stc->priority = val;
+
+   ret = of_property_read_u32(np, ts->soc->use_ccroc ?
+  "nvidia,cpu-throt-level" :
+  "nvidia,cpu-throt-percent", );
+   if (!ret) {
+   if (ts->soc->use_ccroc &&
+   val <= TEGRA_SOCTHERM_THROT_LEVEL_HIGH)
+   stc->cpu_throt_level = val;
+   else if (!ts->soc->use_ccroc && val <= 100)
+   stc->cpu_throt_depth = val;
+   else
+   goto err;
+   } else {
+   goto err;
+   }
+
+   ret = of_property_read_u32(np, "nvidia,gpu-throt-level", );
+   if (!ret && val <= TEGRA_SOCTHERM_THROT_LEVEL_HIGH)
+   stc->gpu_throt_level = val;
+   else
+   goto err;
+
+   return 0;
+
+err:
+   dev_err(dev, "throttle-cfg: %s: no throt prop or invalid prop\n",
+   stc->name);
+   return -EINVAL;
+}
+
 /**
  * soctherm_init_hw_throt_cdev() - Parse the HW throttle configurations
  * and register them as cooling devices.
@@ -984,8 +1039,7 @@ static void soctherm_init_hw_throt_cdev(struct 
platform_device *pdev)
struct tegra_soctherm *ts = dev_get_drvdata(dev);
struct device_node *np_stc, *np_stcc;
const char *name;
-   u32 val;
-   int i, r;
+   int i;
 
for (i = 0; i < THROTTLE_SIZE; i++) {
ts->throt_cfgs[i].name = throt_names[i];
@@ -1003,6 +1057,7 @@ static void soctherm_init_hw_throt_cdev(struct 
platform_device *pdev)
for_each_child_of_node(np_stc, np_stcc) {
struct soctherm_throt_cfg *stc;
struct thermal_cooling_device *tcd;
+   int err;
 
name = np_stcc->name;
stc = find_throttle_cfg_by_name(ts, name);
@@ -1012,37 +1067,10 @@ static void soctherm_init_hw_throt_cdev(struct 
platform_device *pdev)
continue;
}
 
-   r = of_property_read_u32(np_stcc, "nvidia,priority", );
-   if (r) {
-   dev_info(dev,
-"throttle-cfg: %s: missing priority\n", name);
+
+   err = soctherm_throt_cfg_parse(dev, np_stcc, stc);
+   if (err)
continue;
-   }
-   stc->priority = val;
-
-   if (ts->soc->use_ccroc) {
-   r = of_property_read_u32(np_stcc,
-"nvidia,cpu-throt-level",
- 

[PATCH v1 00/12] Add some functionalities for Tegra soctherm

2018-12-17 Thread Wei Ni
Move the hw/sw shutdown patches into this serial. There already have
some discussion for it in https://lkml.org/lkml/2018/12/7/225.
Support GPU HW throttle, thermal IRQ, set_trips(), EDP IRQ and OC
hw throttle.

Wei Ni (12):
  of: Add bindings of thermtrip for Tegra soctherm
  thermal: tegra: support hw and sw shutdown
  arm64: dts: tegra210: set thermtrip
  of: Add bindings of gpu hw throttle for Tegra soctherm
  thermal: tegra: add support for gpu hw-throttle
  arm64: dts: tegra210: set gpu hw throttle level
  thermal: tegra: add support for thermal IRQ
  thermal: tegra: add set_trips functionality
  thermal: tegra: add support for EDP IRQ
  arm64: dts: tegra210: set EDP interrupt line
  of: Add bindings of OC hw throttle for Tegra soctherm
  thermal: tegra: enable OC hw throttle

 .../bindings/thermal/nvidia,tegra124-soctherm.txt  |  63 +-
 arch/arm64/boot/dts/nvidia/tegra210.dtsi   |  20 +-
 drivers/thermal/tegra/soctherm.c   | 955 +++--
 drivers/thermal/tegra/soctherm.h   |  16 +
 drivers/thermal/tegra/tegra124-soctherm.c  |   7 +-
 drivers/thermal/tegra/tegra132-soctherm.c  |   7 +-
 drivers/thermal/tegra/tegra210-soctherm.c  |  15 +-
 include/dt-bindings/thermal/tegra124-soctherm.h|  22 +-
 8 files changed, 1029 insertions(+), 76 deletions(-)

-- 
2.7.4



Re: [PATCH v1 1/3] of: add nvidia,thermtrips property

2018-12-16 Thread Wei Ni



On 14/12/2018 10:29 PM, Thierry Reding wrote:
> On Fri, Dec 07, 2018 at 06:10:05PM +0800, Wei Ni wrote:
>> Add optional property "nvidia,thermtrips".
>> If present, these trips will be used as HW shutdown trips,
>> and critical trips will be used as SW shutdown trips.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  .../bindings/thermal/nvidia,tegra124-soctherm.txt| 20 
>> +---
>>  1 file changed, 17 insertions(+), 3 deletions(-)
> 
> This seems like an odd exception. Why not extend the list of trip point
> types with a "shutdown" or "emergency" type that can be used for this?
> This doesn't seem like NVIDIA specific functionality, so adding an
> NVIDIA specific property doesn't seem right.

The thermal framework only support four types "active", "passive",
"hot", "critical". Normally if the "critical" trip is triggered, the
thermal framework will implement a software shutdown. In our soctherm
driver, we also set this "critical" trips to hardware, so it will cause
the HW shutdown directly.
This serial added the "nvidia,thermtrips" to set HW shutdown trips for
our NVIDIA specific functionality, and keep the "critical" trips to
implement SW shutdown.
For example, we will set "critical" trip to 102C, and set
""nvidia,thermtrips" to 103C, it mean if the temperature hit to 102, the
system will be software shutdown, if the temperature increase fast and
up to 103 directly, then it will cause the hardware shutdown.

Thanks.
Wei.

> 
> Also, please always Cc devicet...@vger.kernel.org and the device tree
> bindings maintainers when sending updates for a binding. They need to
> ack these kinds of patches and they can't do that if they don't get a
> copy of the patch.
> 
> Cc'ing them now and quoting the full patch for reference.
> 
> Thierry
> 
>>
>> diff --git 
>> a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
>> b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> index b6c0ae53d4dc..ab66d6feab4b 100644
>> --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
>> @@ -55,10 +55,21 @@ Required properties :
>>- #cooling-cells: Should be 1. This cooling device only support 
>> on/off state.
>>  See ./thermal.txt for a description of this property.
>>  
>> +Optional properties:
>> +- nvidia,thermtrips : When present, this property specifies the temperature 
>> at
>> +  which the soctherm hardware will assert the thermal trigger signal to the
>> +  Power Management IC, which can be configured to reset or shutdown the 
>> device.
>> +  It is an array of pairs where each pair represents a tsensor id followed 
>> by a
>> +  temperature in milli Celcius. In the absence of this property the critical
>> +  trip point will be used for thermtrip temperature.
>> +
>>  Note:
>> -- the "critical" type trip points will be set to SOC_THERM hardware as the
>> -shut down temperature. Once the temperature of this thermal zone is higher
>> -than it, the system will be shutdown or reset by hardware.
>> +- the "critical" type trip points will be used to set the temperature at 
>> which
>> +the SOC_THERM hardware will assert a thermal trigger if the 
>> "nvidia,thermtrips"
>> +property is missing. When the thermtrips property is present, the breach of 
>> a
>> +critical trip point is reported back to the thermal framework to implement
>> +software shutdown.
>> +
>>  - the "hot" type trip points will be set to SOC_THERM hardware as the 
>> throttle
>>  temperature. Once the the temperature of this thermal zone is higher
>>  than it, it will trigger the HW throttle event.
>> @@ -79,6 +90,9 @@ Example :
>>  
>>  #thermal-sensor-cells = <1>;
>>  
>> +nvidia,thermtrips = > + TEGRA124_SOCTHERM_SENSOR_GPU 103000>;
>> +
>>  throttle-cfgs {
>>  /*
>>   * When the "heavy" cooling device triggered,
>> -- 
>> 2.7.4


Re: [PATCH v6 0/4] Fixes for Tegra soctherm

2018-12-14 Thread Wei Ni
Hi Rui,
I moved get_trend() patch https://lkml.org/lkml/2018/11/20/643 in this
serial.
Since no more comments on these patches, will you take them?

Thanks.
Wei.

On 14/12/2018 5:49 PM, Wei Ni wrote:
> This series fixed some issues for Tegra soctherm,
> and add get_trend().
> 
> Main changes from v5:
> 1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/643
> into this serial.
> 
> Main changes from v4:
> 1. fixed for the parsing sensor id.
> 2. keep warning for missing critical trips.
> 
> Main changes from v3:
> 1. updated codes for parsing sensor id, per Thierry's comments
> 
> Main changes from v2:
> 1. add codes to parse sensor id to avoid registration
> failure.
> 
> Main changes from v1:
> 1. Acked by Thierry Reding  for the patch
> "thermal: tegra: fix memory allocation".
> 2. Print out the sensor name when register failed.
> 2. Remove patch "thermal: tegra: fix coverity defect"
> 
> Wei Ni (4):
>   thermal: tegra: remove unnecessary warnings
>   thermal: tegra: fix memory allocation
>   thermal: tegra: parse sensor id before sensor register
>   thermal: tegra: add get_trend ops
> 
>  drivers/thermal/tegra/soctherm.c | 85 
> +---
>  1 file changed, 80 insertions(+), 5 deletions(-)
> 


[PATCH v6 4/4] thermal: tegra: add get_trend ops

2018-12-14 Thread Wei Ni
Add support for get_trend ops that allows soctherm
sensors to be used with the step-wise governor.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 34 ++
 1 file changed, 34 insertions(+)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 6bee31cd4621..330bffd38fdd 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -488,9 +488,43 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return 0;
 }
 
+static int tegra_thermctl_get_trend(void *data, int trip,
+   enum thermal_trend *trend)
+{
+   struct tegra_thermctl_zone *zone = data;
+   struct thermal_zone_device *tz = zone->tz;
+   int trip_temp, temp, last_temp, ret;
+
+   if (!tz)
+   return -EINVAL;
+
+   ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
+   if (ret)
+   return ret;
+
+   mutex_lock(>lock);
+   temp = tz->temperature;
+   last_temp = tz->last_temperature;
+   mutex_unlock(>lock);
+
+   if (temp > trip_temp) {
+   if (temp >= last_temp)
+   *trend = THERMAL_TREND_RAISING;
+   else
+   *trend = THERMAL_TREND_STABLE;
+   } else if (temp < trip_temp) {
+   *trend = THERMAL_TREND_DROPPING;
+   } else {
+   *trend = THERMAL_TREND_STABLE;
+   }
+
+   return 0;
+}
+
 static const struct thermal_zone_of_device_ops tegra_of_thermal_ops = {
.get_temp = tegra_thermctl_get_temp,
.set_trip_temp = tegra_thermctl_set_trip_temp,
+   .get_trend = tegra_thermctl_get_trend,
 };
 
 static int get_hot_temp(struct thermal_zone_device *tz, int *trip, int *temp)
-- 
2.7.4



[PATCH v6 3/4] thermal: tegra: parse sensor id before sensor register

2018-12-14 Thread Wei Ni
Since different platforms may not support all 4
sensors, so the sensor registration may be failed.
Add codes to parse dt to find sensor id which
need to be registered. So that the registration
can be successful on all platform.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 45 ++--
 1 file changed, 43 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index fd2703c0cfc5..6bee31cd4621 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1224,6 +1224,41 @@ static void soctherm_init(struct platform_device *pdev)
tegra_soctherm_throttle(>dev);
 }
 
+static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
+{
+   bool ret = false;
+   struct of_phandle_args sensor_specs;
+   struct device_node *np, *sensor_np;
+
+   np = of_find_node_by_name(NULL, "thermal-zones");
+   if (!np)
+   return ret;
+
+   for_each_available_child_of_node(np, sensor_np) {
+   if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
+"#thermal-sensor-cells",
+0, _specs))
+   continue;
+
+   if (sensor_specs.args_count != 1) {
+   WARN(sensor_specs.args_count != 1,
+"%s: wrong cells in sensor specifier %d\n",
+sensor_specs.np->name, sensor_specs.args_count);
+   continue;
+   }
+
+   if (sensor_specs.args[0] == sensor_id) {
+   of_node_put(sensor_np);
+   ret = true;
+   break;
+   }
+   }
+
+   of_node_put(np);
+
+   return ret;
+}
+
 static const struct of_device_id tegra_soctherm_of_match[] = {
 #ifdef CONFIG_ARCH_TEGRA_124_SOC
{
@@ -1365,13 +1400,16 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
zone->sg = soc->ttgs[i];
zone->ts = tegra;
 
+   if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
+   continue;
+
z = devm_thermal_zone_of_sensor_register(>dev,
 soc->ttgs[i]->id, zone,
 _of_thermal_ops);
if (IS_ERR(z)) {
err = PTR_ERR(z);
-   dev_err(>dev, "failed to register sensor: %d\n",
-   err);
+   dev_err(>dev, "failed to register sensor %s: 
%d\n",
+   soc->ttgs[i]->name, err);
goto disable_clocks;
}
 
@@ -1434,6 +1472,9 @@ static int __maybe_unused soctherm_resume(struct device 
*dev)
struct thermal_zone_device *tz;
 
tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
+   if (!tz)
+   continue;
+
err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
if (err) {
dev_err(>dev,
-- 
2.7.4



[PATCH v6 1/4] thermal: tegra: remove unnecessary warnings

2018-12-14 Thread Wei Ni
Convert warnings to info as not all platforms may
have all the thresholds and sensors enabled.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..f07de8258e93 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
-   dev_warn(dev, "throttrip: %s: missing hot temperature\n",
+   dev_info(dev, "throttrip: %s: missing hot temperature\n",
 sg->name);
return 0;
}
@@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
}
 
if (i == THROTTLE_SIZE)
-   dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
+   dev_info(dev, "throttrip: %s: missing throttle cdev\n",
 sg->name);
 
return 0;
-- 
2.7.4



[PATCH v6 2/4] thermal: tegra: fix memory allocation

2018-12-14 Thread Wei Ni
Fix memory allocation to store the pointers to
thermal_zone_device.

Signed-off-by: Wei Ni 
Acked-by: Thierry Reding 
---
 drivers/thermal/tegra/soctherm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index f07de8258e93..fd2703c0cfc5 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1339,7 +1339,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
}
 
tegra->thermctl_tzs = devm_kcalloc(>dev,
-  soc->num_ttgs, sizeof(*z),
+  soc->num_ttgs, sizeof(z),
   GFP_KERNEL);
if (!tegra->thermctl_tzs)
return -ENOMEM;
-- 
2.7.4



[PATCH v6 0/4] Fixes for Tegra soctherm

2018-12-14 Thread Wei Ni
This series fixed some issues for Tegra soctherm,
and add get_trend().

Main changes from v5:
1. Move the get_trend() patch https://lkml.org/lkml/2018/11/20/643
into this serial.

Main changes from v4:
1. fixed for the parsing sensor id.
2. keep warning for missing critical trips.

Main changes from v3:
1. updated codes for parsing sensor id, per Thierry's comments

Main changes from v2:
1. add codes to parse sensor id to avoid registration
failure.

Main changes from v1:
1. Acked by Thierry Reding  for the patch
"thermal: tegra: fix memory allocation".
2. Print out the sensor name when register failed.
2. Remove patch "thermal: tegra: fix coverity defect"

Wei Ni (4):
  thermal: tegra: remove unnecessary warnings
  thermal: tegra: fix memory allocation
  thermal: tegra: parse sensor id before sensor register
  thermal: tegra: add get_trend ops

 drivers/thermal/tegra/soctherm.c | 85 +---
 1 file changed, 80 insertions(+), 5 deletions(-)

-- 
2.7.4



Re: [PATCH] thermal: tegra: add get_trend ops

2018-12-10 Thread Wei Ni
Hi Rui & Eduardo,
Could you please take this patch?

Thanks.
Wei.

On 5/12/2018 4:30 PM, Wei Ni wrote:
> Hi Daniel,
> It seems no more comments, could this patch be approved?
> 
> Thanks.
> Wei.
> 
> On 30/11/2018 11:07 AM, Wei Ni wrote:
>>
>>
>> On 30/11/2018 1:01 AM, Eduardo Valentin wrote:
>>> On Wed, Nov 21, 2018 at 02:36:10PM +0800, Wei Ni wrote:
>>>>
>>>>
>>>> On 20/11/2018 11:38 PM, Thierry Reding wrote:
>>>>> On Tue, Nov 20, 2018 at 05:11:17PM +0800, Wei Ni wrote:
>>>>>> Add support for get_trend ops that allows soctherm
>>>>>> sensors to be used with the step-wise governor.
>>>>>>
>>>>>> Signed-off-by: Wei Ni 
>>>>>> ---
>>>>>>  drivers/thermal/tegra/soctherm.c | 34 ++
>>>>>>  1 file changed, 34 insertions(+)
>>>>>>
>>>>>> diff --git a/drivers/thermal/tegra/soctherm.c 
>>>>>> b/drivers/thermal/tegra/soctherm.c
>>>>>> index ed28110a3535..d2951fbe2b7c 100644
>>>>>> --- a/drivers/thermal/tegra/soctherm.c
>>>>>> +++ b/drivers/thermal/tegra/soctherm.c
>>>>>> @@ -488,9 +488,43 @@ static int tegra_thermctl_set_trip_temp(void *data, 
>>>>>> int trip, int temp)
>>>>>>  return 0;
>>>>>>  }
>>>>>>  
>>>>>> +static int tegra_thermctl_get_trend(void *data, int trip,
>>>>>> +enum thermal_trend *trend)
>>>>>> +{
>>>>>> +struct tegra_thermctl_zone *zone = data;
>>>>>> +struct thermal_zone_device *tz = zone->tz;
>>>>>> +int trip_temp, temp, last_temp, ret;
>>>>>> +
>>>>>> +if (!tz)
>>>>>> +return -EINVAL;
>>>>>> +
>>>>>> +ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
>>>>>> +if (ret)
>>>>>> +return ret;
>>>>>> +
>>>>>> +mutex_lock(>lock);
>>>>>> +temp = tz->temperature;
>>>>>> +last_temp = tz->last_temperature;
>>>>>> +mutex_unlock(>lock);
>>>>>> +
>>>>>> +if (temp > trip_temp) {
>>>>>> +if (temp >= last_temp)
>>>>>> +*trend = THERMAL_TREND_RAISING;
>>>>>> +else
>>>>>> +*trend = THERMAL_TREND_STABLE;
>>>>>> +} else if (temp < trip_temp) {
>>>>>> +*trend = THERMAL_TREND_DROPPING;
>>>>>> +} else {
>>>>>> +*trend = THERMAL_TREND_STABLE;
>>>>>> +}
>>>>>> +
>>>>>> +return 0;
>>>>>> +}
>>>>>
>>>>> This looks like a reimplementation of the get_tz_trend() helper. Is
>>>>> seems like that helper already has everything we need. Perhaps this
>>>>> isn't working because of-thermal installs of_thermal_get_trend(), a
>>>>> function that returns -EINVAL if the driver doesn't implement the
>>>>> ->get_trend() callback.
>>>>
>>>> 1. The get_tz_trend() helper can work, because it has:
>>>> if (tz->emul_temperature || !tz->ops->get_trend ||
>>>> tz->ops->get_trend(tz, trip, )) {
>>>> ...
>>>> }
>>>> the tz->ops->get_trend is of_thermal_get_trend(). If without special
>>>> get_trend(), it will return -EINVAL, so it will implement the if block
>>>> to get the "trend". If we have the special get_trend(), then the
>>>> of_thermal_get_trend() will return 0, so this helper will not implement
>>>> the if block, it will get the "trend" from the special get_trend().
>>>
>>> The idea of the helper is to provide a trend in case drivers dont have
>>> a specific way of doing so. 
>>
>> Yes, thanks for your explanation.
>>
>>>
>>>>
>>>> 2. There has a little difference between the helper and our special
>>>> callback. The tegra_thermctl_get_trend() consider the trip_temp, but the
>>>> get_tz_trend() helper didn't.
>>>>
>>>
>>> Yeah, if you are computing trend towards a trip, then yes, that is
>>> different and this patch is needed.
>>>
>>>>>
>>>>> Perhaps a better way would be to do something like this in
>>>>> thermal_zone_of_add_sensor():
>>>>>
>>>>>   if (ops->get_trend)
>>>>>   tzd->ops->get_trend = of_thermal_get_trend;
>>>>>
>>>>> That's similar to how ->set_trips() and ->set_emul_temp() are set up
>>>>> and should make sure that get_tz_trend() will do the right thing for
>>>>> all drivers that don't implement a special ->get_trend().
>>>>
>>>> As above description, I think the of_thermal_get_trend() already can
>>>> handle this case, doesn't need to change.
>>>>
>>>> Wei.
>>>>
>>>>>
>>>>> Thierry
>>>>>


Re: [PATCH v5 0/3] Fixes for Tegra soctherm

2018-12-10 Thread Wei Ni
Hi Rui & Eduardo,
It looks no more comments on this version, could you please take this
serial?

Thanks.
Wei.

On 5/12/2018 4:31 PM, Wei Ni wrote:
> Hi,
> Does there have any comments on this serial?
> 
> Thanks.
> Wei.
> 
> On 3/12/2018 1:55 PM, Wei Ni wrote:
>> This series fixed some issues for Tegra soctherm
>>
>> Main changes from v4:
>> 1. fixed for the parsing sensor id.
>> 2. keep warning for missing critical trips.
>>
>> Main changes from v3:
>> 1. updated codes for parsing sensor id, per Thierry's comments
>>
>> Main changes from v2:
>> 1. add codes to parse sensor id to avoid registration
>> failure.
>>
>> Main changes from v1:
>> 1. Acked by Thierry Reding  for the patch
>> "thermal: tegra: fix memory allocation".
>> 2. Print out the sensor name when register failed.
>> 2. Remove patch "thermal: tegra: fix coverity defect"
>>
>> Wei Ni (3):
>>   thermal: tegra: remove unnecessary warnings
>>   thermal: tegra: fix memory allocation
>>   thermal: tegra: parse sensor id before sensor register
>>
>>  drivers/thermal/tegra/soctherm.c | 51 
>> 
>>  1 file changed, 46 insertions(+), 5 deletions(-)
>>


[PATCH v1 1/3] of: add nvidia,thermtrips property

2018-12-07 Thread Wei Ni
Add optional property "nvidia,thermtrips".
If present, these trips will be used as HW shutdown trips,
and critical trips will be used as SW shutdown trips.

Signed-off-by: Wei Ni 
---
 .../bindings/thermal/nvidia,tegra124-soctherm.txt| 20 +---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git 
a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
index b6c0ae53d4dc..ab66d6feab4b 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
@@ -55,10 +55,21 @@ Required properties :
   - #cooling-cells: Should be 1. This cooling device only support on/off 
state.
 See ./thermal.txt for a description of this property.
 
+Optional properties:
+- nvidia,thermtrips : When present, this property specifies the temperature at
+  which the soctherm hardware will assert the thermal trigger signal to the
+  Power Management IC, which can be configured to reset or shutdown the device.
+  It is an array of pairs where each pair represents a tsensor id followed by a
+  temperature in milli Celcius. In the absence of this property the critical
+  trip point will be used for thermtrip temperature.
+
 Note:
-- the "critical" type trip points will be set to SOC_THERM hardware as the
-shut down temperature. Once the temperature of this thermal zone is higher
-than it, the system will be shutdown or reset by hardware.
+- the "critical" type trip points will be used to set the temperature at which
+the SOC_THERM hardware will assert a thermal trigger if the "nvidia,thermtrips"
+property is missing. When the thermtrips property is present, the breach of a
+critical trip point is reported back to the thermal framework to implement
+software shutdown.
+
 - the "hot" type trip points will be set to SOC_THERM hardware as the throttle
 temperature. Once the the temperature of this thermal zone is higher
 than it, it will trigger the HW throttle event.
@@ -79,6 +90,9 @@ Example :
 
#thermal-sensor-cells = <1>;
 
+   nvidia,thermtrips = ;
+
throttle-cfgs {
/*
 * When the "heavy" cooling device triggered,
-- 
2.7.4



[PATCH v1 0/3] support nvidia,thermtrip property

2018-12-07 Thread Wei Ni
Add "nvidia,thermtrip" property to implement HW and SW
shutdown.

Wei Ni (3):
  of: add nvidia,thermtrips property
  thermal: tegra: support hw and sw shutdown
  arm64: dts: tegra210: set thermtrip

 .../bindings/thermal/nvidia,tegra124-soctherm.txt  | 20 -
 arch/arm64/boot/dts/nvidia/tegra210.dtsi   | 15 ++--
 drivers/thermal/tegra/soctherm.c   | 99 ++
 drivers/thermal/tegra/soctherm.h   |  6 ++
 drivers/thermal/tegra/tegra210-soctherm.c  |  8 ++
 5 files changed, 124 insertions(+), 24 deletions(-)

-- 
2.7.4



[PATCH v1 1/3] of: add nvidia,thermtrips property

2018-12-07 Thread Wei Ni
Add optional property "nvidia,thermtrips".
If present, these trips will be used as HW shutdown trips,
and critical trips will be used as SW shutdown trips.

Signed-off-by: Wei Ni 
---
 .../bindings/thermal/nvidia,tegra124-soctherm.txt| 20 +---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git 
a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt 
b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
index b6c0ae53d4dc..ab66d6feab4b 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.txt
@@ -55,10 +55,21 @@ Required properties :
   - #cooling-cells: Should be 1. This cooling device only support on/off 
state.
 See ./thermal.txt for a description of this property.
 
+Optional properties:
+- nvidia,thermtrips : When present, this property specifies the temperature at
+  which the soctherm hardware will assert the thermal trigger signal to the
+  Power Management IC, which can be configured to reset or shutdown the device.
+  It is an array of pairs where each pair represents a tsensor id followed by a
+  temperature in milli Celcius. In the absence of this property the critical
+  trip point will be used for thermtrip temperature.
+
 Note:
-- the "critical" type trip points will be set to SOC_THERM hardware as the
-shut down temperature. Once the temperature of this thermal zone is higher
-than it, the system will be shutdown or reset by hardware.
+- the "critical" type trip points will be used to set the temperature at which
+the SOC_THERM hardware will assert a thermal trigger if the "nvidia,thermtrips"
+property is missing. When the thermtrips property is present, the breach of a
+critical trip point is reported back to the thermal framework to implement
+software shutdown.
+
 - the "hot" type trip points will be set to SOC_THERM hardware as the throttle
 temperature. Once the the temperature of this thermal zone is higher
 than it, it will trigger the HW throttle event.
@@ -79,6 +90,9 @@ Example :
 
#thermal-sensor-cells = <1>;
 
+   nvidia,thermtrips = ;
+
throttle-cfgs {
/*
 * When the "heavy" cooling device triggered,
-- 
2.7.4



[PATCH v1 0/3] support nvidia,thermtrip property

2018-12-07 Thread Wei Ni
Add "nvidia,thermtrip" property to implement HW and SW
shutdown.

Wei Ni (3):
  of: add nvidia,thermtrips property
  thermal: tegra: support hw and sw shutdown
  arm64: dts: tegra210: set thermtrip

 .../bindings/thermal/nvidia,tegra124-soctherm.txt  | 20 -
 arch/arm64/boot/dts/nvidia/tegra210.dtsi   | 15 ++--
 drivers/thermal/tegra/soctherm.c   | 99 ++
 drivers/thermal/tegra/soctherm.h   |  6 ++
 drivers/thermal/tegra/tegra210-soctherm.c  |  8 ++
 5 files changed, 124 insertions(+), 24 deletions(-)

-- 
2.7.4



[PATCH v1 2/3] thermal: tegra: support hw and sw shutdown

2018-12-07 Thread Wei Ni
Currently the critical trip points in thermal framework are the only
way to specify a temperature at which HW should shutdown. This is
insufficient for certain platforms which would want an orderly
software shutdown in addition to HW shutdown.

This change support to parse "nvidia, thermtrips" property,
it allows soctherm DT to specify thermtrip temperatures so that
critical trip points framework can be used for doing software
shutdown.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c  | 99 ++-
 drivers/thermal/tegra/soctherm.h  |  6 ++
 drivers/thermal/tegra/tegra210-soctherm.c |  8 +++
 3 files changed, 98 insertions(+), 15 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..673c3ffa9001 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -446,6 +446,24 @@ find_throttle_cfg_by_name(struct tegra_soctherm *ts, const 
char *name)
return NULL;
 }
 
+static int tsensor_group_thermtrip_get(struct tegra_soctherm *ts, int id)
+{
+   int i, temp = min_low_temp;
+   struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+
+   if (id >= TEGRA124_SOCTHERM_SENSOR_NUM)
+   return temp;
+
+   if (tt) {
+   for (i = 0; i < ts->soc->num_ttgs; i++) {
+   if (tt[i].id == id)
+   return tt[i].temp;
+   }
+   }
+
+   return temp;
+}
+
 static int tegra_thermctl_set_trip_temp(void *data, int trip, int temp)
 {
struct tegra_thermctl_zone *zone = data;
@@ -464,7 +482,16 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return ret;
 
if (type == THERMAL_TRIP_CRITICAL) {
-   return thermtrip_program(dev, sg, temp);
+   /*
+* If thermtrips property is set in DT,
+* doesn't need to program critical type trip to HW,
+* if not, program critical trip to HW.
+*/
+   if (min_low_temp == tsensor_group_thermtrip_get(ts, sg->id))
+   return thermtrip_program(dev, sg, temp);
+   else
+   return 0;
+
} else if (type == THERMAL_TRIP_HOT) {
int i;
 
@@ -523,7 +550,8 @@ static int get_hot_temp(struct thermal_zone_device *tz, int 
*trip, int *temp)
  * @dev: struct device * of the SOC_THERM instance
  *
  * Configure the SOC_THERM HW trip points, setting "THERMTRIP"
- * "THROTTLE" trip points , using "critical" or "hot" type trip_temp
+ * "THROTTLE" trip points , using "thermtrips", "critical" or "hot"
+ * type trip_temp
  * from thermal zone.
  * After they have been configured, THERMTRIP or THROTTLE will take
  * action when the configured SoC thermal sensor group reaches a
@@ -545,28 +573,23 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 {
struct tegra_soctherm *ts = dev_get_drvdata(dev);
struct soctherm_throt_cfg *stc;
-   int i, trip, temperature;
-   int ret;
+   int i, trip, temperature, ret;
 
-   ret = tz->ops->get_crit_temp(tz, );
-   if (ret) {
-   dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
-sg->name);
-   goto set_throttle;
-   }
+   /* Get thermtrips. If missing, try to get critical trips. */
+   temperature = tsensor_group_thermtrip_get(ts, sg->id);
+   if (min_low_temp == temperature)
+   if (tz->ops->get_crit_temp(tz, ))
+   temperature = max_high_temp;
 
ret = thermtrip_program(dev, sg, temperature);
if (ret) {
-   dev_err(dev, "thermtrip: %s: error during enable\n",
-   sg->name);
+   dev_err(dev, "thermtrip: %s: error during enable\n", sg->name);
return ret;
}
 
-   dev_info(dev,
-"thermtrip: will shut down when %s reaches %d mC\n",
+   dev_info(dev, "thermtrip: will shut down when %s reaches %d mC\n",
 sg->name, temperature);
 
-set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
dev_warn(dev, "throttrip: %s: missing hot temperature\n",
@@ -907,6 +930,50 @@ static const struct thermal_cooling_device_ops 
throt_cooling_ops = {
.set_cur_state = throt_set_cdev_state,
 };
 
+static int soctherm_thermtrips_parse(struct platform_device *pdev)
+{
+   struct device *dev = >dev;
+   struct tegra_soctherm *ts = dev_get_drvdata(dev);
+   struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+   const int max_num_prop = ts->soc->num_ttgs * 2;
+   u3

[PATCH v1 2/3] thermal: tegra: support hw and sw shutdown

2018-12-07 Thread Wei Ni
Currently the critical trip points in thermal framework are the only
way to specify a temperature at which HW should shutdown. This is
insufficient for certain platforms which would want an orderly
software shutdown in addition to HW shutdown.

This change support to parse "nvidia, thermtrips" property,
it allows soctherm DT to specify thermtrip temperatures so that
critical trip points framework can be used for doing software
shutdown.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c  | 99 ++-
 drivers/thermal/tegra/soctherm.h  |  6 ++
 drivers/thermal/tegra/tegra210-soctherm.c |  8 +++
 3 files changed, 98 insertions(+), 15 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..673c3ffa9001 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -446,6 +446,24 @@ find_throttle_cfg_by_name(struct tegra_soctherm *ts, const 
char *name)
return NULL;
 }
 
+static int tsensor_group_thermtrip_get(struct tegra_soctherm *ts, int id)
+{
+   int i, temp = min_low_temp;
+   struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+
+   if (id >= TEGRA124_SOCTHERM_SENSOR_NUM)
+   return temp;
+
+   if (tt) {
+   for (i = 0; i < ts->soc->num_ttgs; i++) {
+   if (tt[i].id == id)
+   return tt[i].temp;
+   }
+   }
+
+   return temp;
+}
+
 static int tegra_thermctl_set_trip_temp(void *data, int trip, int temp)
 {
struct tegra_thermctl_zone *zone = data;
@@ -464,7 +482,16 @@ static int tegra_thermctl_set_trip_temp(void *data, int 
trip, int temp)
return ret;
 
if (type == THERMAL_TRIP_CRITICAL) {
-   return thermtrip_program(dev, sg, temp);
+   /*
+* If thermtrips property is set in DT,
+* doesn't need to program critical type trip to HW,
+* if not, program critical trip to HW.
+*/
+   if (min_low_temp == tsensor_group_thermtrip_get(ts, sg->id))
+   return thermtrip_program(dev, sg, temp);
+   else
+   return 0;
+
} else if (type == THERMAL_TRIP_HOT) {
int i;
 
@@ -523,7 +550,8 @@ static int get_hot_temp(struct thermal_zone_device *tz, int 
*trip, int *temp)
  * @dev: struct device * of the SOC_THERM instance
  *
  * Configure the SOC_THERM HW trip points, setting "THERMTRIP"
- * "THROTTLE" trip points , using "critical" or "hot" type trip_temp
+ * "THROTTLE" trip points , using "thermtrips", "critical" or "hot"
+ * type trip_temp
  * from thermal zone.
  * After they have been configured, THERMTRIP or THROTTLE will take
  * action when the configured SoC thermal sensor group reaches a
@@ -545,28 +573,23 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 {
struct tegra_soctherm *ts = dev_get_drvdata(dev);
struct soctherm_throt_cfg *stc;
-   int i, trip, temperature;
-   int ret;
+   int i, trip, temperature, ret;
 
-   ret = tz->ops->get_crit_temp(tz, );
-   if (ret) {
-   dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
-sg->name);
-   goto set_throttle;
-   }
+   /* Get thermtrips. If missing, try to get critical trips. */
+   temperature = tsensor_group_thermtrip_get(ts, sg->id);
+   if (min_low_temp == temperature)
+   if (tz->ops->get_crit_temp(tz, ))
+   temperature = max_high_temp;
 
ret = thermtrip_program(dev, sg, temperature);
if (ret) {
-   dev_err(dev, "thermtrip: %s: error during enable\n",
-   sg->name);
+   dev_err(dev, "thermtrip: %s: error during enable\n", sg->name);
return ret;
}
 
-   dev_info(dev,
-"thermtrip: will shut down when %s reaches %d mC\n",
+   dev_info(dev, "thermtrip: will shut down when %s reaches %d mC\n",
 sg->name, temperature);
 
-set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
dev_warn(dev, "throttrip: %s: missing hot temperature\n",
@@ -907,6 +930,50 @@ static const struct thermal_cooling_device_ops 
throt_cooling_ops = {
.set_cur_state = throt_set_cdev_state,
 };
 
+static int soctherm_thermtrips_parse(struct platform_device *pdev)
+{
+   struct device *dev = >dev;
+   struct tegra_soctherm *ts = dev_get_drvdata(dev);
+   struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+   const int max_num_prop = ts->soc->num_ttgs * 2;
+   u3

[PATCH v1 3/3] arm64: dts: tegra210: set thermtrip

2018-12-07 Thread Wei Ni
Set "nvidia,thermtrips" property, it used to set
HW shutdown temperatures.

Signed-off-by: Wei Ni 
---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 15 +--
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 8fe47d6445a5..f2e89b218b23 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1330,6 +1330,9 @@
reset-names = "soctherm";
#thermal-sensor-cells = <1>;
 
+   nvidia,thermtrips = ;
+
throttle-cfgs {
throttle_heavy: heavy {
nvidia,priority = <100>;
@@ -1349,8 +1352,8 @@
< TEGRA124_SOCTHERM_SENSOR_CPU>;
 
trips {
-   cpu-shutdown-trip {
-   temperature = <102500>;
+   cpu-critical-trip {
+   temperature = <102000>;
hysteresis = <0>;
type = "critical";
};
@@ -1377,7 +1380,7 @@
< TEGRA124_SOCTHERM_SENSOR_MEM>;
 
trips {
-   mem-shutdown-trip {
+   mem-critical-trip {
temperature = <103000>;
hysteresis = <0>;
type = "critical";
@@ -1399,8 +1402,8 @@
< TEGRA124_SOCTHERM_SENSOR_GPU>;
 
trips {
-   gpu-shutdown-trip {
-   temperature = <103000>;
+   gpu-critical-trip {
+   temperature = <102500>;
hysteresis = <0>;
type = "critical";
};
@@ -1427,7 +1430,7 @@
< TEGRA124_SOCTHERM_SENSOR_PLLX>;
 
trips {
-   pllx-shutdown-trip {
+   pllx-critical-trip {
temperature = <103000>;
hysteresis = <0>;
type = "critical";
-- 
2.7.4



[PATCH v1 3/3] arm64: dts: tegra210: set thermtrip

2018-12-07 Thread Wei Ni
Set "nvidia,thermtrips" property, it used to set
HW shutdown temperatures.

Signed-off-by: Wei Ni 
---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 15 +--
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 8fe47d6445a5..f2e89b218b23 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1330,6 +1330,9 @@
reset-names = "soctherm";
#thermal-sensor-cells = <1>;
 
+   nvidia,thermtrips = ;
+
throttle-cfgs {
throttle_heavy: heavy {
nvidia,priority = <100>;
@@ -1349,8 +1352,8 @@
< TEGRA124_SOCTHERM_SENSOR_CPU>;
 
trips {
-   cpu-shutdown-trip {
-   temperature = <102500>;
+   cpu-critical-trip {
+   temperature = <102000>;
hysteresis = <0>;
type = "critical";
};
@@ -1377,7 +1380,7 @@
< TEGRA124_SOCTHERM_SENSOR_MEM>;
 
trips {
-   mem-shutdown-trip {
+   mem-critical-trip {
temperature = <103000>;
hysteresis = <0>;
type = "critical";
@@ -1399,8 +1402,8 @@
< TEGRA124_SOCTHERM_SENSOR_GPU>;
 
trips {
-   gpu-shutdown-trip {
-   temperature = <103000>;
+   gpu-critical-trip {
+   temperature = <102500>;
hysteresis = <0>;
type = "critical";
};
@@ -1427,7 +1430,7 @@
< TEGRA124_SOCTHERM_SENSOR_PLLX>;
 
trips {
-   pllx-shutdown-trip {
+   pllx-critical-trip {
temperature = <103000>;
hysteresis = <0>;
type = "critical";
-- 
2.7.4



Re: [PATCH v5 0/3] Fixes for Tegra soctherm

2018-12-05 Thread Wei Ni
Hi,
Does there have any comments on this serial?

Thanks.
Wei.

On 3/12/2018 1:55 PM, Wei Ni wrote:
> This series fixed some issues for Tegra soctherm
> 
> Main changes from v4:
> 1. fixed for the parsing sensor id.
> 2. keep warning for missing critical trips.
> 
> Main changes from v3:
> 1. updated codes for parsing sensor id, per Thierry's comments
> 
> Main changes from v2:
> 1. add codes to parse sensor id to avoid registration
> failure.
> 
> Main changes from v1:
> 1. Acked by Thierry Reding  for the patch
> "thermal: tegra: fix memory allocation".
> 2. Print out the sensor name when register failed.
> 2. Remove patch "thermal: tegra: fix coverity defect"
> 
> Wei Ni (3):
>   thermal: tegra: remove unnecessary warnings
>   thermal: tegra: fix memory allocation
>   thermal: tegra: parse sensor id before sensor register
> 
>  drivers/thermal/tegra/soctherm.c | 51 
> 
>  1 file changed, 46 insertions(+), 5 deletions(-)
> 


Re: [PATCH v5 0/3] Fixes for Tegra soctherm

2018-12-05 Thread Wei Ni
Hi,
Does there have any comments on this serial?

Thanks.
Wei.

On 3/12/2018 1:55 PM, Wei Ni wrote:
> This series fixed some issues for Tegra soctherm
> 
> Main changes from v4:
> 1. fixed for the parsing sensor id.
> 2. keep warning for missing critical trips.
> 
> Main changes from v3:
> 1. updated codes for parsing sensor id, per Thierry's comments
> 
> Main changes from v2:
> 1. add codes to parse sensor id to avoid registration
> failure.
> 
> Main changes from v1:
> 1. Acked by Thierry Reding  for the patch
> "thermal: tegra: fix memory allocation".
> 2. Print out the sensor name when register failed.
> 2. Remove patch "thermal: tegra: fix coverity defect"
> 
> Wei Ni (3):
>   thermal: tegra: remove unnecessary warnings
>   thermal: tegra: fix memory allocation
>   thermal: tegra: parse sensor id before sensor register
> 
>  drivers/thermal/tegra/soctherm.c | 51 
> 
>  1 file changed, 46 insertions(+), 5 deletions(-)
> 


Re: [PATCH] thermal: tegra: add get_trend ops

2018-12-05 Thread Wei Ni
Hi Daniel,
It seems no more comments, could this patch be approved?

Thanks.
Wei.

On 30/11/2018 11:07 AM, Wei Ni wrote:
> 
> 
> On 30/11/2018 1:01 AM, Eduardo Valentin wrote:
>> On Wed, Nov 21, 2018 at 02:36:10PM +0800, Wei Ni wrote:
>>>
>>>
>>> On 20/11/2018 11:38 PM, Thierry Reding wrote:
>>>> On Tue, Nov 20, 2018 at 05:11:17PM +0800, Wei Ni wrote:
>>>>> Add support for get_trend ops that allows soctherm
>>>>> sensors to be used with the step-wise governor.
>>>>>
>>>>> Signed-off-by: Wei Ni 
>>>>> ---
>>>>>  drivers/thermal/tegra/soctherm.c | 34 ++
>>>>>  1 file changed, 34 insertions(+)
>>>>>
>>>>> diff --git a/drivers/thermal/tegra/soctherm.c 
>>>>> b/drivers/thermal/tegra/soctherm.c
>>>>> index ed28110a3535..d2951fbe2b7c 100644
>>>>> --- a/drivers/thermal/tegra/soctherm.c
>>>>> +++ b/drivers/thermal/tegra/soctherm.c
>>>>> @@ -488,9 +488,43 @@ static int tegra_thermctl_set_trip_temp(void *data, 
>>>>> int trip, int temp)
>>>>>   return 0;
>>>>>  }
>>>>>  
>>>>> +static int tegra_thermctl_get_trend(void *data, int trip,
>>>>> + enum thermal_trend *trend)
>>>>> +{
>>>>> + struct tegra_thermctl_zone *zone = data;
>>>>> + struct thermal_zone_device *tz = zone->tz;
>>>>> + int trip_temp, temp, last_temp, ret;
>>>>> +
>>>>> + if (!tz)
>>>>> + return -EINVAL;
>>>>> +
>>>>> + ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
>>>>> + if (ret)
>>>>> + return ret;
>>>>> +
>>>>> + mutex_lock(>lock);
>>>>> + temp = tz->temperature;
>>>>> + last_temp = tz->last_temperature;
>>>>> + mutex_unlock(>lock);
>>>>> +
>>>>> + if (temp > trip_temp) {
>>>>> + if (temp >= last_temp)
>>>>> + *trend = THERMAL_TREND_RAISING;
>>>>> + else
>>>>> + *trend = THERMAL_TREND_STABLE;
>>>>> + } else if (temp < trip_temp) {
>>>>> + *trend = THERMAL_TREND_DROPPING;
>>>>> + } else {
>>>>> + *trend = THERMAL_TREND_STABLE;
>>>>> + }
>>>>> +
>>>>> + return 0;
>>>>> +}
>>>>
>>>> This looks like a reimplementation of the get_tz_trend() helper. Is
>>>> seems like that helper already has everything we need. Perhaps this
>>>> isn't working because of-thermal installs of_thermal_get_trend(), a
>>>> function that returns -EINVAL if the driver doesn't implement the
>>>> ->get_trend() callback.
>>>
>>> 1. The get_tz_trend() helper can work, because it has:
>>> if (tz->emul_temperature || !tz->ops->get_trend ||
>>> tz->ops->get_trend(tz, trip, )) {
>>> ...
>>> }
>>> the tz->ops->get_trend is of_thermal_get_trend(). If without special
>>> get_trend(), it will return -EINVAL, so it will implement the if block
>>> to get the "trend". If we have the special get_trend(), then the
>>> of_thermal_get_trend() will return 0, so this helper will not implement
>>> the if block, it will get the "trend" from the special get_trend().
>>
>> The idea of the helper is to provide a trend in case drivers dont have
>> a specific way of doing so. 
> 
> Yes, thanks for your explanation.
> 
>>
>>>
>>> 2. There has a little difference between the helper and our special
>>> callback. The tegra_thermctl_get_trend() consider the trip_temp, but the
>>> get_tz_trend() helper didn't.
>>>
>>
>> Yeah, if you are computing trend towards a trip, then yes, that is
>> different and this patch is needed.
>>
>>>>
>>>> Perhaps a better way would be to do something like this in
>>>> thermal_zone_of_add_sensor():
>>>>
>>>>if (ops->get_trend)
>>>>tzd->ops->get_trend = of_thermal_get_trend;
>>>>
>>>> That's similar to how ->set_trips() and ->set_emul_temp() are set up
>>>> and should make sure that get_tz_trend() will do the right thing for
>>>> all drivers that don't implement a special ->get_trend().
>>>
>>> As above description, I think the of_thermal_get_trend() already can
>>> handle this case, doesn't need to change.
>>>
>>> Wei.
>>>
>>>>
>>>> Thierry
>>>>


Re: [PATCH] thermal: tegra: add get_trend ops

2018-12-05 Thread Wei Ni
Hi Daniel,
It seems no more comments, could this patch be approved?

Thanks.
Wei.

On 30/11/2018 11:07 AM, Wei Ni wrote:
> 
> 
> On 30/11/2018 1:01 AM, Eduardo Valentin wrote:
>> On Wed, Nov 21, 2018 at 02:36:10PM +0800, Wei Ni wrote:
>>>
>>>
>>> On 20/11/2018 11:38 PM, Thierry Reding wrote:
>>>> On Tue, Nov 20, 2018 at 05:11:17PM +0800, Wei Ni wrote:
>>>>> Add support for get_trend ops that allows soctherm
>>>>> sensors to be used with the step-wise governor.
>>>>>
>>>>> Signed-off-by: Wei Ni 
>>>>> ---
>>>>>  drivers/thermal/tegra/soctherm.c | 34 ++
>>>>>  1 file changed, 34 insertions(+)
>>>>>
>>>>> diff --git a/drivers/thermal/tegra/soctherm.c 
>>>>> b/drivers/thermal/tegra/soctherm.c
>>>>> index ed28110a3535..d2951fbe2b7c 100644
>>>>> --- a/drivers/thermal/tegra/soctherm.c
>>>>> +++ b/drivers/thermal/tegra/soctherm.c
>>>>> @@ -488,9 +488,43 @@ static int tegra_thermctl_set_trip_temp(void *data, 
>>>>> int trip, int temp)
>>>>>   return 0;
>>>>>  }
>>>>>  
>>>>> +static int tegra_thermctl_get_trend(void *data, int trip,
>>>>> + enum thermal_trend *trend)
>>>>> +{
>>>>> + struct tegra_thermctl_zone *zone = data;
>>>>> + struct thermal_zone_device *tz = zone->tz;
>>>>> + int trip_temp, temp, last_temp, ret;
>>>>> +
>>>>> + if (!tz)
>>>>> + return -EINVAL;
>>>>> +
>>>>> + ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
>>>>> + if (ret)
>>>>> + return ret;
>>>>> +
>>>>> + mutex_lock(>lock);
>>>>> + temp = tz->temperature;
>>>>> + last_temp = tz->last_temperature;
>>>>> + mutex_unlock(>lock);
>>>>> +
>>>>> + if (temp > trip_temp) {
>>>>> + if (temp >= last_temp)
>>>>> + *trend = THERMAL_TREND_RAISING;
>>>>> + else
>>>>> + *trend = THERMAL_TREND_STABLE;
>>>>> + } else if (temp < trip_temp) {
>>>>> + *trend = THERMAL_TREND_DROPPING;
>>>>> + } else {
>>>>> + *trend = THERMAL_TREND_STABLE;
>>>>> + }
>>>>> +
>>>>> + return 0;
>>>>> +}
>>>>
>>>> This looks like a reimplementation of the get_tz_trend() helper. Is
>>>> seems like that helper already has everything we need. Perhaps this
>>>> isn't working because of-thermal installs of_thermal_get_trend(), a
>>>> function that returns -EINVAL if the driver doesn't implement the
>>>> ->get_trend() callback.
>>>
>>> 1. The get_tz_trend() helper can work, because it has:
>>> if (tz->emul_temperature || !tz->ops->get_trend ||
>>> tz->ops->get_trend(tz, trip, )) {
>>> ...
>>> }
>>> the tz->ops->get_trend is of_thermal_get_trend(). If without special
>>> get_trend(), it will return -EINVAL, so it will implement the if block
>>> to get the "trend". If we have the special get_trend(), then the
>>> of_thermal_get_trend() will return 0, so this helper will not implement
>>> the if block, it will get the "trend" from the special get_trend().
>>
>> The idea of the helper is to provide a trend in case drivers dont have
>> a specific way of doing so. 
> 
> Yes, thanks for your explanation.
> 
>>
>>>
>>> 2. There has a little difference between the helper and our special
>>> callback. The tegra_thermctl_get_trend() consider the trip_temp, but the
>>> get_tz_trend() helper didn't.
>>>
>>
>> Yeah, if you are computing trend towards a trip, then yes, that is
>> different and this patch is needed.
>>
>>>>
>>>> Perhaps a better way would be to do something like this in
>>>> thermal_zone_of_add_sensor():
>>>>
>>>>if (ops->get_trend)
>>>>tzd->ops->get_trend = of_thermal_get_trend;
>>>>
>>>> That's similar to how ->set_trips() and ->set_emul_temp() are set up
>>>> and should make sure that get_tz_trend() will do the right thing for
>>>> all drivers that don't implement a special ->get_trend().
>>>
>>> As above description, I think the of_thermal_get_trend() already can
>>> handle this case, doesn't need to change.
>>>
>>> Wei.
>>>
>>>>
>>>> Thierry
>>>>


[PATCH v5 1/3] thermal: tegra: remove unnecessary warnings

2018-12-02 Thread Wei Ni
Convert warnings to info as not all platforms may
have all the thresholds and sensors enabled.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..f07de8258e93 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
-   dev_warn(dev, "throttrip: %s: missing hot temperature\n",
+   dev_info(dev, "throttrip: %s: missing hot temperature\n",
 sg->name);
return 0;
}
@@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
}
 
if (i == THROTTLE_SIZE)
-   dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
+   dev_info(dev, "throttrip: %s: missing throttle cdev\n",
 sg->name);
 
return 0;
-- 
2.7.4



[PATCH v5 3/3] thermal: tegra: parse sensor id before sensor register

2018-12-02 Thread Wei Ni
Since different platforms may not support all 4
sensors, so the sensor registration may be failed.
Add codes to parse dt to find sensor id which
need to be registered. So that the registration
can be successful on all platform.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 45 ++--
 1 file changed, 43 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index fd2703c0cfc5..45e3ae8aac86 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1224,6 +1224,41 @@ static void soctherm_init(struct platform_device *pdev)
tegra_soctherm_throttle(>dev);
 }
 
+static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
+{
+   bool ret = false;
+   struct of_phandle_args sensor_specs;
+   struct device_node *np, *sensor_np;
+
+   np = of_find_node_by_name(NULL, "thermal-zones");
+   if (!np)
+   return ret;
+
+   for_each_available_child_of_node(np, sensor_np) {
+   if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
+"#thermal-sensor-cells",
+0, _specs))
+   continue;
+
+   if (sensor_specs.args_count != 1) {
+   WARN(sensor_specs.args_count != 1,
+"%s: wrong cells in sensor specifier %d\n",
+sensor_specs.np->name, sensor_specs.args_count);
+   continue;
+   }
+
+   if (sensor_specs.args[0] == sensor_id) {
+   ret = true;
+   break;
+   }
+   }
+
+   of_node_put(np);
+   of_node_put(sensor_np);
+
+   return ret;
+}
+
 static const struct of_device_id tegra_soctherm_of_match[] = {
 #ifdef CONFIG_ARCH_TEGRA_124_SOC
{
@@ -1365,13 +1400,16 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
zone->sg = soc->ttgs[i];
zone->ts = tegra;
 
+   if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
+   continue;
+
z = devm_thermal_zone_of_sensor_register(>dev,
 soc->ttgs[i]->id, zone,
 _of_thermal_ops);
if (IS_ERR(z)) {
err = PTR_ERR(z);
-   dev_err(>dev, "failed to register sensor: %d\n",
-   err);
+   dev_err(>dev, "failed to register sensor %s: 
%d\n",
+   soc->ttgs[i]->name, err);
goto disable_clocks;
}
 
@@ -1434,6 +1472,9 @@ static int __maybe_unused soctherm_resume(struct device 
*dev)
struct thermal_zone_device *tz;
 
tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
+   if (!tz)
+   continue;
+
err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
if (err) {
dev_err(>dev,
-- 
2.7.4



[PATCH v5 2/3] thermal: tegra: fix memory allocation

2018-12-02 Thread Wei Ni
Fix memory allocation to store the pointers to
thermal_zone_device.

Signed-off-by: Wei Ni 
Acked-by: Thierry Reding 
---
 drivers/thermal/tegra/soctherm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index f07de8258e93..fd2703c0cfc5 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1339,7 +1339,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
}
 
tegra->thermctl_tzs = devm_kcalloc(>dev,
-  soc->num_ttgs, sizeof(*z),
+  soc->num_ttgs, sizeof(z),
   GFP_KERNEL);
if (!tegra->thermctl_tzs)
return -ENOMEM;
-- 
2.7.4



[PATCH v5 0/3] Fixes for Tegra soctherm

2018-12-02 Thread Wei Ni
This series fixed some issues for Tegra soctherm

Main changes from v4:
1. fixed for the parsing sensor id.
2. keep warning for missing critical trips.

Main changes from v3:
1. updated codes for parsing sensor id, per Thierry's comments

Main changes from v2:
1. add codes to parse sensor id to avoid registration
failure.

Main changes from v1:
1. Acked by Thierry Reding  for the patch
"thermal: tegra: fix memory allocation".
2. Print out the sensor name when register failed.
2. Remove patch "thermal: tegra: fix coverity defect"

Wei Ni (3):
  thermal: tegra: remove unnecessary warnings
  thermal: tegra: fix memory allocation
  thermal: tegra: parse sensor id before sensor register

 drivers/thermal/tegra/soctherm.c | 51 
 1 file changed, 46 insertions(+), 5 deletions(-)

-- 
2.7.4



[PATCH v5 1/3] thermal: tegra: remove unnecessary warnings

2018-12-02 Thread Wei Ni
Convert warnings to info as not all platforms may
have all the thresholds and sensors enabled.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..f07de8258e93 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
-   dev_warn(dev, "throttrip: %s: missing hot temperature\n",
+   dev_info(dev, "throttrip: %s: missing hot temperature\n",
 sg->name);
return 0;
}
@@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
}
 
if (i == THROTTLE_SIZE)
-   dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
+   dev_info(dev, "throttrip: %s: missing throttle cdev\n",
 sg->name);
 
return 0;
-- 
2.7.4



[PATCH v5 3/3] thermal: tegra: parse sensor id before sensor register

2018-12-02 Thread Wei Ni
Since different platforms may not support all 4
sensors, so the sensor registration may be failed.
Add codes to parse dt to find sensor id which
need to be registered. So that the registration
can be successful on all platform.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 45 ++--
 1 file changed, 43 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index fd2703c0cfc5..45e3ae8aac86 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1224,6 +1224,41 @@ static void soctherm_init(struct platform_device *pdev)
tegra_soctherm_throttle(>dev);
 }
 
+static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
+{
+   bool ret = false;
+   struct of_phandle_args sensor_specs;
+   struct device_node *np, *sensor_np;
+
+   np = of_find_node_by_name(NULL, "thermal-zones");
+   if (!np)
+   return ret;
+
+   for_each_available_child_of_node(np, sensor_np) {
+   if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
+"#thermal-sensor-cells",
+0, _specs))
+   continue;
+
+   if (sensor_specs.args_count != 1) {
+   WARN(sensor_specs.args_count != 1,
+"%s: wrong cells in sensor specifier %d\n",
+sensor_specs.np->name, sensor_specs.args_count);
+   continue;
+   }
+
+   if (sensor_specs.args[0] == sensor_id) {
+   ret = true;
+   break;
+   }
+   }
+
+   of_node_put(np);
+   of_node_put(sensor_np);
+
+   return ret;
+}
+
 static const struct of_device_id tegra_soctherm_of_match[] = {
 #ifdef CONFIG_ARCH_TEGRA_124_SOC
{
@@ -1365,13 +1400,16 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
zone->sg = soc->ttgs[i];
zone->ts = tegra;
 
+   if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
+   continue;
+
z = devm_thermal_zone_of_sensor_register(>dev,
 soc->ttgs[i]->id, zone,
 _of_thermal_ops);
if (IS_ERR(z)) {
err = PTR_ERR(z);
-   dev_err(>dev, "failed to register sensor: %d\n",
-   err);
+   dev_err(>dev, "failed to register sensor %s: 
%d\n",
+   soc->ttgs[i]->name, err);
goto disable_clocks;
}
 
@@ -1434,6 +1472,9 @@ static int __maybe_unused soctherm_resume(struct device 
*dev)
struct thermal_zone_device *tz;
 
tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
+   if (!tz)
+   continue;
+
err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
if (err) {
dev_err(>dev,
-- 
2.7.4



[PATCH v5 2/3] thermal: tegra: fix memory allocation

2018-12-02 Thread Wei Ni
Fix memory allocation to store the pointers to
thermal_zone_device.

Signed-off-by: Wei Ni 
Acked-by: Thierry Reding 
---
 drivers/thermal/tegra/soctherm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index f07de8258e93..fd2703c0cfc5 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1339,7 +1339,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
}
 
tegra->thermctl_tzs = devm_kcalloc(>dev,
-  soc->num_ttgs, sizeof(*z),
+  soc->num_ttgs, sizeof(z),
   GFP_KERNEL);
if (!tegra->thermctl_tzs)
return -ENOMEM;
-- 
2.7.4



[PATCH v5 0/3] Fixes for Tegra soctherm

2018-12-02 Thread Wei Ni
This series fixed some issues for Tegra soctherm

Main changes from v4:
1. fixed for the parsing sensor id.
2. keep warning for missing critical trips.

Main changes from v3:
1. updated codes for parsing sensor id, per Thierry's comments

Main changes from v2:
1. add codes to parse sensor id to avoid registration
failure.

Main changes from v1:
1. Acked by Thierry Reding  for the patch
"thermal: tegra: fix memory allocation".
2. Print out the sensor name when register failed.
2. Remove patch "thermal: tegra: fix coverity defect"

Wei Ni (3):
  thermal: tegra: remove unnecessary warnings
  thermal: tegra: fix memory allocation
  thermal: tegra: parse sensor id before sensor register

 drivers/thermal/tegra/soctherm.c | 51 
 1 file changed, 46 insertions(+), 5 deletions(-)

-- 
2.7.4



Re: [PATCH v3 3/3] thermal: tegra: parse sensor id before sensor register

2018-11-29 Thread Wei Ni



On 30/11/2018 1:13 AM, Thierry Reding wrote:
> On Thu, Nov 29, 2018 at 01:55:02PM +0800, Wei Ni wrote:
>> On 28/11/2018 6:25 PM, Thierry Reding wrote:
>>> On Wed, Nov 28, 2018 at 01:44:37PM +0800, Wei Ni wrote:
> [...]
>>>> +  bool ret = false;
>>>> +  struct of_phandle_args sensor_specs;
>>>> +  struct device_node *np, *sensor_np;
>>>> +
>>>> +  np = of_find_node_by_name(NULL, "thermal-zones");
>>>> +  if (!np)
>>>> +  return ret;
>>>> +
>>>> +  sensor_np = of_get_next_child(np, NULL);
>>>> +  for_each_available_child_of_node(np, sensor_np) {
>>>
>>> Aren't we leaking np here? I think we need of_node_put() after
>>> of_get_next_child() to make sure the reference to the "thermal-zones"
>>> node is properly released.
>>
>> No, we will not leak np here. Because the
>> for_each_available_child_of_node will call
>> of_get_next_available_child(), which will call of_node_put(prev) to
>> decrease refcount of the prev node. So we just need to of_node_put the
>> last node after break from this for block.
> 
> Okay, looks like I misinterpreted what you were doing there. I thought
> that for_each_available_child_of_node() took the child as first argument
> and the parent as second and therefore np would be overwritten by the
> first assignment in the macro.
> 
> But looking at this more closely I think there's something else wrong
> here. for_each_available_child_of_node() is defined as:
> 
>   for_each_available_child_of_node(parent, child)
> 
> so in the above, np will be the parent and sensor_np the child. Why do
> you have to do
> 
>   sensor_np = of_get_next_child(np, NULL);
> 
> ? That's already done as part of the loop in the macro, right? So does
> that not mean we get two references and we leak the first one? Can the
> above not simply been dropped?

It's so sorry, it's my mistake, we should remove this line, it was my
develop code, forgot to remove it.
Will fix it in next version.

Thanks.

> 
> Thierry
> 


Re: [PATCH v3 3/3] thermal: tegra: parse sensor id before sensor register

2018-11-29 Thread Wei Ni



On 30/11/2018 1:13 AM, Thierry Reding wrote:
> On Thu, Nov 29, 2018 at 01:55:02PM +0800, Wei Ni wrote:
>> On 28/11/2018 6:25 PM, Thierry Reding wrote:
>>> On Wed, Nov 28, 2018 at 01:44:37PM +0800, Wei Ni wrote:
> [...]
>>>> +  bool ret = false;
>>>> +  struct of_phandle_args sensor_specs;
>>>> +  struct device_node *np, *sensor_np;
>>>> +
>>>> +  np = of_find_node_by_name(NULL, "thermal-zones");
>>>> +  if (!np)
>>>> +  return ret;
>>>> +
>>>> +  sensor_np = of_get_next_child(np, NULL);
>>>> +  for_each_available_child_of_node(np, sensor_np) {
>>>
>>> Aren't we leaking np here? I think we need of_node_put() after
>>> of_get_next_child() to make sure the reference to the "thermal-zones"
>>> node is properly released.
>>
>> No, we will not leak np here. Because the
>> for_each_available_child_of_node will call
>> of_get_next_available_child(), which will call of_node_put(prev) to
>> decrease refcount of the prev node. So we just need to of_node_put the
>> last node after break from this for block.
> 
> Okay, looks like I misinterpreted what you were doing there. I thought
> that for_each_available_child_of_node() took the child as first argument
> and the parent as second and therefore np would be overwritten by the
> first assignment in the macro.
> 
> But looking at this more closely I think there's something else wrong
> here. for_each_available_child_of_node() is defined as:
> 
>   for_each_available_child_of_node(parent, child)
> 
> so in the above, np will be the parent and sensor_np the child. Why do
> you have to do
> 
>   sensor_np = of_get_next_child(np, NULL);
> 
> ? That's already done as part of the loop in the macro, right? So does
> that not mean we get two references and we leak the first one? Can the
> above not simply been dropped?

It's so sorry, it's my mistake, we should remove this line, it was my
develop code, forgot to remove it.
Will fix it in next version.

Thanks.

> 
> Thierry
> 


Re: [PATCH] thermal: tegra: add get_trend ops

2018-11-29 Thread Wei Ni



On 30/11/2018 1:01 AM, Eduardo Valentin wrote:
> On Wed, Nov 21, 2018 at 02:36:10PM +0800, Wei Ni wrote:
>>
>>
>> On 20/11/2018 11:38 PM, Thierry Reding wrote:
>>> On Tue, Nov 20, 2018 at 05:11:17PM +0800, Wei Ni wrote:
>>>> Add support for get_trend ops that allows soctherm
>>>> sensors to be used with the step-wise governor.
>>>>
>>>> Signed-off-by: Wei Ni 
>>>> ---
>>>>  drivers/thermal/tegra/soctherm.c | 34 ++
>>>>  1 file changed, 34 insertions(+)
>>>>
>>>> diff --git a/drivers/thermal/tegra/soctherm.c 
>>>> b/drivers/thermal/tegra/soctherm.c
>>>> index ed28110a3535..d2951fbe2b7c 100644
>>>> --- a/drivers/thermal/tegra/soctherm.c
>>>> +++ b/drivers/thermal/tegra/soctherm.c
>>>> @@ -488,9 +488,43 @@ static int tegra_thermctl_set_trip_temp(void *data, 
>>>> int trip, int temp)
>>>>return 0;
>>>>  }
>>>>  
>>>> +static int tegra_thermctl_get_trend(void *data, int trip,
>>>> +  enum thermal_trend *trend)
>>>> +{
>>>> +  struct tegra_thermctl_zone *zone = data;
>>>> +  struct thermal_zone_device *tz = zone->tz;
>>>> +  int trip_temp, temp, last_temp, ret;
>>>> +
>>>> +  if (!tz)
>>>> +  return -EINVAL;
>>>> +
>>>> +  ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
>>>> +  if (ret)
>>>> +  return ret;
>>>> +
>>>> +  mutex_lock(>lock);
>>>> +  temp = tz->temperature;
>>>> +  last_temp = tz->last_temperature;
>>>> +  mutex_unlock(>lock);
>>>> +
>>>> +  if (temp > trip_temp) {
>>>> +  if (temp >= last_temp)
>>>> +  *trend = THERMAL_TREND_RAISING;
>>>> +  else
>>>> +  *trend = THERMAL_TREND_STABLE;
>>>> +  } else if (temp < trip_temp) {
>>>> +  *trend = THERMAL_TREND_DROPPING;
>>>> +  } else {
>>>> +  *trend = THERMAL_TREND_STABLE;
>>>> +  }
>>>> +
>>>> +  return 0;
>>>> +}
>>>
>>> This looks like a reimplementation of the get_tz_trend() helper. Is
>>> seems like that helper already has everything we need. Perhaps this
>>> isn't working because of-thermal installs of_thermal_get_trend(), a
>>> function that returns -EINVAL if the driver doesn't implement the
>>> ->get_trend() callback.
>>
>> 1. The get_tz_trend() helper can work, because it has:
>> if (tz->emul_temperature || !tz->ops->get_trend ||
>> tz->ops->get_trend(tz, trip, )) {
>> ...
>> }
>> the tz->ops->get_trend is of_thermal_get_trend(). If without special
>> get_trend(), it will return -EINVAL, so it will implement the if block
>> to get the "trend". If we have the special get_trend(), then the
>> of_thermal_get_trend() will return 0, so this helper will not implement
>> the if block, it will get the "trend" from the special get_trend().
> 
> The idea of the helper is to provide a trend in case drivers dont have
> a specific way of doing so. 

Yes, thanks for your explanation.

> 
>>
>> 2. There has a little difference between the helper and our special
>> callback. The tegra_thermctl_get_trend() consider the trip_temp, but the
>> get_tz_trend() helper didn't.
>>
> 
> Yeah, if you are computing trend towards a trip, then yes, that is
> different and this patch is needed.
> 
>>>
>>> Perhaps a better way would be to do something like this in
>>> thermal_zone_of_add_sensor():
>>>
>>> if (ops->get_trend)
>>> tzd->ops->get_trend = of_thermal_get_trend;
>>>
>>> That's similar to how ->set_trips() and ->set_emul_temp() are set up
>>> and should make sure that get_tz_trend() will do the right thing for
>>> all drivers that don't implement a special ->get_trend().
>>
>> As above description, I think the of_thermal_get_trend() already can
>> handle this case, doesn't need to change.
>>
>> Wei.
>>
>>>
>>> Thierry
>>>


Re: [PATCH] thermal: tegra: add get_trend ops

2018-11-29 Thread Wei Ni



On 30/11/2018 1:01 AM, Eduardo Valentin wrote:
> On Wed, Nov 21, 2018 at 02:36:10PM +0800, Wei Ni wrote:
>>
>>
>> On 20/11/2018 11:38 PM, Thierry Reding wrote:
>>> On Tue, Nov 20, 2018 at 05:11:17PM +0800, Wei Ni wrote:
>>>> Add support for get_trend ops that allows soctherm
>>>> sensors to be used with the step-wise governor.
>>>>
>>>> Signed-off-by: Wei Ni 
>>>> ---
>>>>  drivers/thermal/tegra/soctherm.c | 34 ++
>>>>  1 file changed, 34 insertions(+)
>>>>
>>>> diff --git a/drivers/thermal/tegra/soctherm.c 
>>>> b/drivers/thermal/tegra/soctherm.c
>>>> index ed28110a3535..d2951fbe2b7c 100644
>>>> --- a/drivers/thermal/tegra/soctherm.c
>>>> +++ b/drivers/thermal/tegra/soctherm.c
>>>> @@ -488,9 +488,43 @@ static int tegra_thermctl_set_trip_temp(void *data, 
>>>> int trip, int temp)
>>>>return 0;
>>>>  }
>>>>  
>>>> +static int tegra_thermctl_get_trend(void *data, int trip,
>>>> +  enum thermal_trend *trend)
>>>> +{
>>>> +  struct tegra_thermctl_zone *zone = data;
>>>> +  struct thermal_zone_device *tz = zone->tz;
>>>> +  int trip_temp, temp, last_temp, ret;
>>>> +
>>>> +  if (!tz)
>>>> +  return -EINVAL;
>>>> +
>>>> +  ret = tz->ops->get_trip_temp(zone->tz, trip, _temp);
>>>> +  if (ret)
>>>> +  return ret;
>>>> +
>>>> +  mutex_lock(>lock);
>>>> +  temp = tz->temperature;
>>>> +  last_temp = tz->last_temperature;
>>>> +  mutex_unlock(>lock);
>>>> +
>>>> +  if (temp > trip_temp) {
>>>> +  if (temp >= last_temp)
>>>> +  *trend = THERMAL_TREND_RAISING;
>>>> +  else
>>>> +  *trend = THERMAL_TREND_STABLE;
>>>> +  } else if (temp < trip_temp) {
>>>> +  *trend = THERMAL_TREND_DROPPING;
>>>> +  } else {
>>>> +  *trend = THERMAL_TREND_STABLE;
>>>> +  }
>>>> +
>>>> +  return 0;
>>>> +}
>>>
>>> This looks like a reimplementation of the get_tz_trend() helper. Is
>>> seems like that helper already has everything we need. Perhaps this
>>> isn't working because of-thermal installs of_thermal_get_trend(), a
>>> function that returns -EINVAL if the driver doesn't implement the
>>> ->get_trend() callback.
>>
>> 1. The get_tz_trend() helper can work, because it has:
>> if (tz->emul_temperature || !tz->ops->get_trend ||
>> tz->ops->get_trend(tz, trip, )) {
>> ...
>> }
>> the tz->ops->get_trend is of_thermal_get_trend(). If without special
>> get_trend(), it will return -EINVAL, so it will implement the if block
>> to get the "trend". If we have the special get_trend(), then the
>> of_thermal_get_trend() will return 0, so this helper will not implement
>> the if block, it will get the "trend" from the special get_trend().
> 
> The idea of the helper is to provide a trend in case drivers dont have
> a specific way of doing so. 

Yes, thanks for your explanation.

> 
>>
>> 2. There has a little difference between the helper and our special
>> callback. The tegra_thermctl_get_trend() consider the trip_temp, but the
>> get_tz_trend() helper didn't.
>>
> 
> Yeah, if you are computing trend towards a trip, then yes, that is
> different and this patch is needed.
> 
>>>
>>> Perhaps a better way would be to do something like this in
>>> thermal_zone_of_add_sensor():
>>>
>>> if (ops->get_trend)
>>> tzd->ops->get_trend = of_thermal_get_trend;
>>>
>>> That's similar to how ->set_trips() and ->set_emul_temp() are set up
>>> and should make sure that get_tz_trend() will do the right thing for
>>> all drivers that don't implement a special ->get_trend().
>>
>> As above description, I think the of_thermal_get_trend() already can
>> handle this case, doesn't need to change.
>>
>> Wei.
>>
>>>
>>> Thierry
>>>


Re: [PATCH v4 3/3] thermal: tegra: parse sensor id before sensor register

2018-11-29 Thread Wei Ni



On 30/11/2018 12:46 AM, Eduardo Valentin wrote:
> On Thu, Nov 29, 2018 at 06:09:43PM +0800, Wei Ni wrote:
>> Since different platforms may not support all 4
>> sensors, so the sensor registration may be failed.
>> Add codes to parse dt to find sensor id which
>> need to be registered. So that the registration
>> can be successful on all platform.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  drivers/thermal/tegra/soctherm.c | 46 
>> ++--
>>  1 file changed, 44 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c 
>> b/drivers/thermal/tegra/soctherm.c
>> index 375cadbc24cd..bdc660f2794a 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -1224,6 +1224,42 @@ static void soctherm_init(struct platform_device 
>> *pdev)
>>  tegra_soctherm_throttle(>dev);
>>  }
>>  
>> +static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
>> +{
>> +bool ret = false;
>> +struct of_phandle_args sensor_specs;
>> +struct device_node *np, *sensor_np;
>> +
>> +np = of_find_node_by_name(NULL, "thermal-zones");
>> +if (!np)
>> +return ret;
>> +
>> +sensor_np = of_get_next_child(np, NULL);
>> +for_each_available_child_of_node(np, sensor_np) {
>> +if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
>> + "#thermal-sensor-cells",
>> + 0, _specs))
>> +continue;
>> +
>> +if (sensor_specs.args_count != 1) {
>> +WARN(sensor_specs.args_count != 1,
>> + "%s: wrong cells in sensor specifier %d\n",
>> + sensor_specs.np->name, sensor_specs.args_count);
>> +continue;
>> +}
>> +
>> +if (sensor_specs.args[0] == sensor_id) {
>> +ret = true;
>> +break;
>> +}
>> +}
>> +
>> +of_node_put(np);
>> +of_node_put(sensor_np);
>> +
>> +return ret;
>> +}
>> +
>>  static const struct of_device_id tegra_soctherm_of_match[] = {
>>  #ifdef CONFIG_ARCH_TEGRA_124_SOC
>>  {
>> @@ -1365,13 +1401,16 @@ static int tegra_soctherm_probe(struct 
>> platform_device *pdev)
>>  zone->sg = soc->ttgs[i];
>>  zone->ts = tegra;
>>  
>> +if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
>> +continue;
>> +
> 
> 
> Instead of matching driver id with DT id presence, wouldnt make sense to
> simply have DT with the sensors that makes sense for that platform?
> 
> I am failing to understand why you need to go over and find ids.

As discussed with Daniel several days ago, this driver will always try
to register 4 thermal zones, including cpu, gpu, mem and pll, but some
platform doesn't need to support all of them, so the thermal zone
registration will be failed. In previous patches, we just ignore the
failure and continue to register next sensors, but Daniel think it's not
good. And per his suggestion, we refer to the qoriq thermal driver to
parse dt to get sensor_id, so that we can make the registration to be
successful.

Wei.

> 
>>  z = devm_thermal_zone_of_sensor_register(>dev,
>>   soc->ttgs[i]->id, zone,
>>   _of_thermal_ops);
>>  if (IS_ERR(z)) {
>>  err = PTR_ERR(z);
>> -dev_err(>dev, "failed to register sensor: %d\n",
>> -err);
>> +dev_err(>dev, "failed to register sensor %s: 
>> %d\n",
>> +soc->ttgs[i]->name, err);
>>  goto disable_clocks;
>>  }
>>  
>> @@ -1434,6 +1473,9 @@ static int __maybe_unused soctherm_resume(struct 
>> device *dev)
>>  struct thermal_zone_device *tz;
>>  
>>  tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
>> +if (!tz)
>> +continue;
>> +
>>  err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
>>  if (err) {
>>  dev_err(>dev,
>> -- 
>> 2.7.4
>>


Re: [PATCH v4 3/3] thermal: tegra: parse sensor id before sensor register

2018-11-29 Thread Wei Ni



On 30/11/2018 12:46 AM, Eduardo Valentin wrote:
> On Thu, Nov 29, 2018 at 06:09:43PM +0800, Wei Ni wrote:
>> Since different platforms may not support all 4
>> sensors, so the sensor registration may be failed.
>> Add codes to parse dt to find sensor id which
>> need to be registered. So that the registration
>> can be successful on all platform.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  drivers/thermal/tegra/soctherm.c | 46 
>> ++--
>>  1 file changed, 44 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c 
>> b/drivers/thermal/tegra/soctherm.c
>> index 375cadbc24cd..bdc660f2794a 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -1224,6 +1224,42 @@ static void soctherm_init(struct platform_device 
>> *pdev)
>>  tegra_soctherm_throttle(>dev);
>>  }
>>  
>> +static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
>> +{
>> +bool ret = false;
>> +struct of_phandle_args sensor_specs;
>> +struct device_node *np, *sensor_np;
>> +
>> +np = of_find_node_by_name(NULL, "thermal-zones");
>> +if (!np)
>> +return ret;
>> +
>> +sensor_np = of_get_next_child(np, NULL);
>> +for_each_available_child_of_node(np, sensor_np) {
>> +if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
>> + "#thermal-sensor-cells",
>> + 0, _specs))
>> +continue;
>> +
>> +if (sensor_specs.args_count != 1) {
>> +WARN(sensor_specs.args_count != 1,
>> + "%s: wrong cells in sensor specifier %d\n",
>> + sensor_specs.np->name, sensor_specs.args_count);
>> +continue;
>> +}
>> +
>> +if (sensor_specs.args[0] == sensor_id) {
>> +ret = true;
>> +break;
>> +}
>> +}
>> +
>> +of_node_put(np);
>> +of_node_put(sensor_np);
>> +
>> +return ret;
>> +}
>> +
>>  static const struct of_device_id tegra_soctherm_of_match[] = {
>>  #ifdef CONFIG_ARCH_TEGRA_124_SOC
>>  {
>> @@ -1365,13 +1401,16 @@ static int tegra_soctherm_probe(struct 
>> platform_device *pdev)
>>  zone->sg = soc->ttgs[i];
>>  zone->ts = tegra;
>>  
>> +if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
>> +continue;
>> +
> 
> 
> Instead of matching driver id with DT id presence, wouldnt make sense to
> simply have DT with the sensors that makes sense for that platform?
> 
> I am failing to understand why you need to go over and find ids.

As discussed with Daniel several days ago, this driver will always try
to register 4 thermal zones, including cpu, gpu, mem and pll, but some
platform doesn't need to support all of them, so the thermal zone
registration will be failed. In previous patches, we just ignore the
failure and continue to register next sensors, but Daniel think it's not
good. And per his suggestion, we refer to the qoriq thermal driver to
parse dt to get sensor_id, so that we can make the registration to be
successful.

Wei.

> 
>>  z = devm_thermal_zone_of_sensor_register(>dev,
>>   soc->ttgs[i]->id, zone,
>>   _of_thermal_ops);
>>  if (IS_ERR(z)) {
>>  err = PTR_ERR(z);
>> -dev_err(>dev, "failed to register sensor: %d\n",
>> -err);
>> +dev_err(>dev, "failed to register sensor %s: 
>> %d\n",
>> +soc->ttgs[i]->name, err);
>>  goto disable_clocks;
>>  }
>>  
>> @@ -1434,6 +1473,9 @@ static int __maybe_unused soctherm_resume(struct 
>> device *dev)
>>  struct thermal_zone_device *tz;
>>  
>>  tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
>> +if (!tz)
>> +continue;
>> +
>>  err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
>>  if (err) {
>>  dev_err(>dev,
>> -- 
>> 2.7.4
>>


Re: [PATCH v4 1/3] thermal: tegra: remove unnecessary warnings

2018-11-29 Thread Wei Ni



On 30/11/2018 12:39 AM, Eduardo Valentin wrote:
> Hey,
> 
> On Thu, Nov 29, 2018 at 06:09:41PM +0800, Wei Ni wrote:
>> Convert warnings to info as not all platforms may
>> have all the thresholds and sensors enabled.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  drivers/thermal/tegra/soctherm.c | 6 +++---
>>  1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c 
>> b/drivers/thermal/tegra/soctherm.c
>> index ed28110a3535..55cc1f2f6a45 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -550,7 +550,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>  
>>  ret = tz->ops->get_crit_temp(tz, );
>>  if (ret) {
>> -dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
>> +dev_info(dev, "thermtrip: %s: missing critical temperature\n",
> 
> I am mostly ok with your change in direction. But are you sure this is a
> good thing? What about in the case that you have a platform that have
> the crit temp and you really failed to .get_crit_temp()?

If we set the crit temp in DT, but failed to .get_crit_temp(), it mean
the thermal framework have some problems. Since the critical trip is
very important, may be we should still keep "dev_warn" in here?

> 
>>   sg->name);
>>  goto set_throttle;
>>  }
>> @@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>  set_throttle:
>>  ret = get_hot_temp(tz, , );
>>  if (ret) {
>> -dev_warn(dev, "throttrip: %s: missing hot temperature\n",
>> +dev_info(dev, "throttrip: %s: missing hot temperature\n",
>>   sg->name);
>>  return 0;
>>  }
>> @@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>  }
>>  
>>  if (i == THROTTLE_SIZE)
>> -dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
>> +dev_info(dev, "throttrip: %s: missing throttle cdev\n",
>>   sg->name);
>>  
>>  return 0;
>> -- 
>> 2.7.4
>>


Re: [PATCH v4 1/3] thermal: tegra: remove unnecessary warnings

2018-11-29 Thread Wei Ni



On 30/11/2018 12:39 AM, Eduardo Valentin wrote:
> Hey,
> 
> On Thu, Nov 29, 2018 at 06:09:41PM +0800, Wei Ni wrote:
>> Convert warnings to info as not all platforms may
>> have all the thresholds and sensors enabled.
>>
>> Signed-off-by: Wei Ni 
>> ---
>>  drivers/thermal/tegra/soctherm.c | 6 +++---
>>  1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c 
>> b/drivers/thermal/tegra/soctherm.c
>> index ed28110a3535..55cc1f2f6a45 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -550,7 +550,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>  
>>  ret = tz->ops->get_crit_temp(tz, );
>>  if (ret) {
>> -dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
>> +dev_info(dev, "thermtrip: %s: missing critical temperature\n",
> 
> I am mostly ok with your change in direction. But are you sure this is a
> good thing? What about in the case that you have a platform that have
> the crit temp and you really failed to .get_crit_temp()?

If we set the crit temp in DT, but failed to .get_crit_temp(), it mean
the thermal framework have some problems. Since the critical trip is
very important, may be we should still keep "dev_warn" in here?

> 
>>   sg->name);
>>  goto set_throttle;
>>  }
>> @@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>  set_throttle:
>>  ret = get_hot_temp(tz, , );
>>  if (ret) {
>> -dev_warn(dev, "throttrip: %s: missing hot temperature\n",
>> +dev_info(dev, "throttrip: %s: missing hot temperature\n",
>>   sg->name);
>>  return 0;
>>  }
>> @@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>  }
>>  
>>  if (i == THROTTLE_SIZE)
>> -dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
>> +dev_info(dev, "throttrip: %s: missing throttle cdev\n",
>>   sg->name);
>>  
>>  return 0;
>> -- 
>> 2.7.4
>>


[PATCH v4 2/3] thermal: tegra: fix memory allocation

2018-11-29 Thread Wei Ni
Fix memory allocation to store the pointers to
thermal_zone_device.

Signed-off-by: Wei Ni 
Acked-by: Thierry Reding 
---
 drivers/thermal/tegra/soctherm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 55cc1f2f6a45..375cadbc24cd 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1339,7 +1339,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
}
 
tegra->thermctl_tzs = devm_kcalloc(>dev,
-  soc->num_ttgs, sizeof(*z),
+  soc->num_ttgs, sizeof(z),
   GFP_KERNEL);
if (!tegra->thermctl_tzs)
return -ENOMEM;
-- 
2.7.4



[PATCH v4 2/3] thermal: tegra: fix memory allocation

2018-11-29 Thread Wei Ni
Fix memory allocation to store the pointers to
thermal_zone_device.

Signed-off-by: Wei Ni 
Acked-by: Thierry Reding 
---
 drivers/thermal/tegra/soctherm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 55cc1f2f6a45..375cadbc24cd 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1339,7 +1339,7 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
}
 
tegra->thermctl_tzs = devm_kcalloc(>dev,
-  soc->num_ttgs, sizeof(*z),
+  soc->num_ttgs, sizeof(z),
   GFP_KERNEL);
if (!tegra->thermctl_tzs)
return -ENOMEM;
-- 
2.7.4



[PATCH v4 1/3] thermal: tegra: remove unnecessary warnings

2018-11-29 Thread Wei Ni
Convert warnings to info as not all platforms may
have all the thresholds and sensors enabled.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..55cc1f2f6a45 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -550,7 +550,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 
ret = tz->ops->get_crit_temp(tz, );
if (ret) {
-   dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
+   dev_info(dev, "thermtrip: %s: missing critical temperature\n",
 sg->name);
goto set_throttle;
}
@@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
-   dev_warn(dev, "throttrip: %s: missing hot temperature\n",
+   dev_info(dev, "throttrip: %s: missing hot temperature\n",
 sg->name);
return 0;
}
@@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
}
 
if (i == THROTTLE_SIZE)
-   dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
+   dev_info(dev, "throttrip: %s: missing throttle cdev\n",
 sg->name);
 
return 0;
-- 
2.7.4



[PATCH v4 3/3] thermal: tegra: parse sensor id before sensor register

2018-11-29 Thread Wei Ni
Since different platforms may not support all 4
sensors, so the sensor registration may be failed.
Add codes to parse dt to find sensor id which
need to be registered. So that the registration
can be successful on all platform.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 46 ++--
 1 file changed, 44 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 375cadbc24cd..bdc660f2794a 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1224,6 +1224,42 @@ static void soctherm_init(struct platform_device *pdev)
tegra_soctherm_throttle(>dev);
 }
 
+static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
+{
+   bool ret = false;
+   struct of_phandle_args sensor_specs;
+   struct device_node *np, *sensor_np;
+
+   np = of_find_node_by_name(NULL, "thermal-zones");
+   if (!np)
+   return ret;
+
+   sensor_np = of_get_next_child(np, NULL);
+   for_each_available_child_of_node(np, sensor_np) {
+   if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
+"#thermal-sensor-cells",
+0, _specs))
+   continue;
+
+   if (sensor_specs.args_count != 1) {
+   WARN(sensor_specs.args_count != 1,
+"%s: wrong cells in sensor specifier %d\n",
+sensor_specs.np->name, sensor_specs.args_count);
+   continue;
+   }
+
+   if (sensor_specs.args[0] == sensor_id) {
+   ret = true;
+   break;
+   }
+   }
+
+   of_node_put(np);
+   of_node_put(sensor_np);
+
+   return ret;
+}
+
 static const struct of_device_id tegra_soctherm_of_match[] = {
 #ifdef CONFIG_ARCH_TEGRA_124_SOC
{
@@ -1365,13 +1401,16 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
zone->sg = soc->ttgs[i];
zone->ts = tegra;
 
+   if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
+   continue;
+
z = devm_thermal_zone_of_sensor_register(>dev,
 soc->ttgs[i]->id, zone,
 _of_thermal_ops);
if (IS_ERR(z)) {
err = PTR_ERR(z);
-   dev_err(>dev, "failed to register sensor: %d\n",
-   err);
+   dev_err(>dev, "failed to register sensor %s: 
%d\n",
+   soc->ttgs[i]->name, err);
goto disable_clocks;
}
 
@@ -1434,6 +1473,9 @@ static int __maybe_unused soctherm_resume(struct device 
*dev)
struct thermal_zone_device *tz;
 
tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
+   if (!tz)
+   continue;
+
err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
if (err) {
dev_err(>dev,
-- 
2.7.4



[PATCH v4 0/3] Fixes for Tegra soctherm

2018-11-29 Thread Wei Ni
This series fixed some issues for Tegra soctherm

Main changes from v3:
1. updated codes for parsing sensor id, per Thierry's comments

Main changes from v2:
1. add codes to parse sensor id to avoid registration
failure.

Main changes from v1:
1. Acked by Thierry Reding  for the patch
"thermal: tegra: fix memory allocation".
2. Print out the sensor name when register failed.
2. Remove patch "thermal: tegra: fix coverity defect"

Wei Ni (3):
  thermal: tegra: remove unnecessary warnings
  thermal: tegra: fix memory allocation
  thermal: tegra: parse sensor id before sensor register

 drivers/thermal/tegra/soctherm.c | 54 +++-
 1 file changed, 48 insertions(+), 6 deletions(-)

-- 
2.7.4



[PATCH v4 1/3] thermal: tegra: remove unnecessary warnings

2018-11-29 Thread Wei Ni
Convert warnings to info as not all platforms may
have all the thresholds and sensors enabled.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..55cc1f2f6a45 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -550,7 +550,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 
ret = tz->ops->get_crit_temp(tz, );
if (ret) {
-   dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
+   dev_info(dev, "thermtrip: %s: missing critical temperature\n",
 sg->name);
goto set_throttle;
}
@@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 set_throttle:
ret = get_hot_temp(tz, , );
if (ret) {
-   dev_warn(dev, "throttrip: %s: missing hot temperature\n",
+   dev_info(dev, "throttrip: %s: missing hot temperature\n",
 sg->name);
return 0;
}
@@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
}
 
if (i == THROTTLE_SIZE)
-   dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
+   dev_info(dev, "throttrip: %s: missing throttle cdev\n",
 sg->name);
 
return 0;
-- 
2.7.4



[PATCH v4 3/3] thermal: tegra: parse sensor id before sensor register

2018-11-29 Thread Wei Ni
Since different platforms may not support all 4
sensors, so the sensor registration may be failed.
Add codes to parse dt to find sensor id which
need to be registered. So that the registration
can be successful on all platform.

Signed-off-by: Wei Ni 
---
 drivers/thermal/tegra/soctherm.c | 46 ++--
 1 file changed, 44 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 375cadbc24cd..bdc660f2794a 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1224,6 +1224,42 @@ static void soctherm_init(struct platform_device *pdev)
tegra_soctherm_throttle(>dev);
 }
 
+static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
+{
+   bool ret = false;
+   struct of_phandle_args sensor_specs;
+   struct device_node *np, *sensor_np;
+
+   np = of_find_node_by_name(NULL, "thermal-zones");
+   if (!np)
+   return ret;
+
+   sensor_np = of_get_next_child(np, NULL);
+   for_each_available_child_of_node(np, sensor_np) {
+   if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
+"#thermal-sensor-cells",
+0, _specs))
+   continue;
+
+   if (sensor_specs.args_count != 1) {
+   WARN(sensor_specs.args_count != 1,
+"%s: wrong cells in sensor specifier %d\n",
+sensor_specs.np->name, sensor_specs.args_count);
+   continue;
+   }
+
+   if (sensor_specs.args[0] == sensor_id) {
+   ret = true;
+   break;
+   }
+   }
+
+   of_node_put(np);
+   of_node_put(sensor_np);
+
+   return ret;
+}
+
 static const struct of_device_id tegra_soctherm_of_match[] = {
 #ifdef CONFIG_ARCH_TEGRA_124_SOC
{
@@ -1365,13 +1401,16 @@ static int tegra_soctherm_probe(struct platform_device 
*pdev)
zone->sg = soc->ttgs[i];
zone->ts = tegra;
 
+   if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
+   continue;
+
z = devm_thermal_zone_of_sensor_register(>dev,
 soc->ttgs[i]->id, zone,
 _of_thermal_ops);
if (IS_ERR(z)) {
err = PTR_ERR(z);
-   dev_err(>dev, "failed to register sensor: %d\n",
-   err);
+   dev_err(>dev, "failed to register sensor %s: 
%d\n",
+   soc->ttgs[i]->name, err);
goto disable_clocks;
}
 
@@ -1434,6 +1473,9 @@ static int __maybe_unused soctherm_resume(struct device 
*dev)
struct thermal_zone_device *tz;
 
tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
+   if (!tz)
+   continue;
+
err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
if (err) {
dev_err(>dev,
-- 
2.7.4



  1   2   3   4   5   6   7   8   9   10   >