thermal: Add support for device tree thermal zones consumers

Message ID 20231114131514.89031-1-angelogioacchino.delregno@collabora.com
State New
Headers
Series thermal: Add support for device tree thermal zones consumers |

Commit Message

AngeloGioacchino Del Regno Nov. 14, 2023, 1:15 p.m. UTC
  Add helpers to support retrieving thermal zones from device tree nodes:
this will allow a device tree consumer to specify phandles to specific
thermal zone(s), including support for specifying thermal-zone-names.
This is useful, for example, for smart voltage scaling drivers that
need to adjust CPU/GPU/other voltages based on temperature, and for
battery charging drivers that need to scale current based on various
aggregated temperature sensor readings which are board-dependant.

Example:
smart-scaling-driver@10000000 {
	[...]

	thermal-zones = <&cluster_big_tz>, <&gpu_tz>, <&vpu_tz>;
	thermal-zone-names = "cpu", "gpu", "vpu";

	[...]
}

battery-charger@20000000 {
	[...]

	thermal-zones = <&battery_temp>, <&device_skin_temp>;
	thermal-zone-names = "batt-ext-sensor", "skin";

	[...]
}

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
---

Background story: while I was cleaning up the MediaTek Smart Voltage Scaling
(SVS) driver, I've found out that there's a lot of commonization to be done.
After a rewrite of "this and that" in that driver, I came across a barrier
that didn't allow me to remove another ~100 lines of code, and that was also
anyway breaking the driver, because the thermal zone names are different
from what was originally intended.

I've been looking for thermal zone handle retrieval around the kernel and
found that there currently are at least four other drivers that could make
use this as a cleanup: charger-manager, which is retrieving a thermal zone
to look for with a "cm-thermal-zone" string property, gpu/drm/tiny/repaper.c
that does the same by checking a "pervasive,thermal-zone" string property,
and ab8500_temp and sdhci-omap which are simply hardcoding a "cpu_thermal"
and "battery-thermal" thermal zone names respectively.

There are a number of other devices (mostly embedded, mostly smartphones)
that don't have an upstream driver and that could make use of this as well.

Cheers!

 drivers/thermal/thermal_of.c | 91 ++++++++++++++++++++++++++++++++++++
 include/linux/thermal.h      | 13 ++++++
 2 files changed, 104 insertions(+)
  

Comments

kernel test robot Nov. 15, 2023, 2:37 p.m. UTC | #1
Hi AngeloGioacchino,

kernel test robot noticed the following build errors:

[auto build test ERROR on rafael-pm/thermal]
[also build test ERROR on linus/master v6.7-rc1 next-20231115]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/AngeloGioacchino-Del-Regno/thermal-Add-support-for-device-tree-thermal-zones-consumers/20231114-211656
base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal
patch link:    https://lore.kernel.org/r/20231114131514.89031-1-angelogioacchino.delregno%40collabora.com
patch subject: [PATCH] thermal: Add support for device tree thermal zones consumers
config: x86_64-rhel-8.3 (https://download.01.org/0day-ci/archive/20231115/202311152230.nzJVHaeG-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231115/202311152230.nzJVHaeG-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311152230.nzJVHaeG-lkp@intel.com/

All errors (new ones prefixed by >>):

   ld: arch/x86/kernel/acpi/cppc.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: arch/x86/kernel/acpi/cppc.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: arch/x86/kernel/acpi/cstate.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: arch/x86/kernel/acpi/cstate.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/idle/intel_idle.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/idle/intel_idle.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/acpi_processor.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/acpi_processor.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/processor_core.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/processor_core.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/processor_pdc.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/processor_pdc.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/fan_core.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/fan_core.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/processor_driver.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/processor_driver.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/processor_thermal.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/processor_thermal.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/processor_idle.o: in function `thermal_of_get_zone_by_index':
>> include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/processor_idle.o: in function `thermal_of_get_zone':
>> include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/processor_throttling.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/processor_throttling.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/processor_perflib.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/processor_perflib.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/thermal.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/thermal.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/acpi/cppc_acpi.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/acpi/cppc_acpi.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/power/supply/power_supply_core.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/power/supply/power_supply_core.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/hwmon/hwmon.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/hwmon/hwmon.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/thermal_core.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/thermal_core.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/thermal_sysfs.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/thermal_sysfs.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/thermal_trip.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/thermal_trip.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/thermal_helpers.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/thermal_helpers.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/thermal_hwmon.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/thermal_hwmon.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/thermal_acpi.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/thermal_acpi.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/gov_fair_share.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/gov_fair_share.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/gov_bang_bang.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/gov_bang_bang.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/gov_step_wise.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/gov_step_wise.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/thermal/gov_user_space.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/thermal/gov_user_space.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/cpufreq/cpufreq.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/cpufreq/cpufreq.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here
   ld: drivers/cpufreq/intel_pstate.o: in function `thermal_of_get_zone_by_index':
   include/linux/thermal.h:282: multiple definition of `thermal_of_get_zone_by_index'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:282: first defined here
   ld: drivers/cpufreq/intel_pstate.o: in function `thermal_of_get_zone':
   include/linux/thermal.h:287: multiple definition of `thermal_of_get_zone'; arch/x86/kernel/acpi/boot.o:include/linux/thermal.h:287: first defined here


vim +282 include/linux/thermal.h

   280	
   281	struct thermal_zone_device *thermal_of_get_zone_by_index(struct device *dev, int index)
 > 282	{
   283		return ERR_PTR(-EOPNOTSUPP);
   284	}
   285	
   286	struct thermal_zone_device *thermal_of_get_zone(struct device *dev, const char *name)
 > 287	{
   288		return ERR_PTR(-EOPNOTSUPP);
   289	}
   290	#endif
   291
  
AngeloGioacchino Del Regno Nov. 15, 2023, 2:45 p.m. UTC | #2
Il 15/11/23 15:37, kernel test robot ha scritto:
> Hi AngeloGioacchino,
> 
> kernel test robot noticed the following build errors:
> 
> [auto build test ERROR on rafael-pm/thermal]
> [also build test ERROR on linus/master v6.7-rc1 next-20231115]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/AngeloGioacchino-Del-Regno/thermal-Add-support-for-device-tree-thermal-zones-consumers/20231114-211656
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal
> patch link:    https://lore.kernel.org/r/20231114131514.89031-1-angelogioacchino.delregno%40collabora.com
> patch subject: [PATCH] thermal: Add support for device tree thermal zones consumers
> config: x86_64-rhel-8.3 (https://download.01.org/0day-ci/archive/20231115/202311152230.nzJVHaeG-lkp@intel.com/config)
> compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231115/202311152230.nzJVHaeG-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202311152230.nzJVHaeG-lkp@intel.com/

..snip..

> 
> 
> vim +282 include/linux/thermal.h
> 
>     280	

That's right, I forgot to add "static inline" :-)

Fixing and sending a v2.

>     281	struct thermal_zone_device *thermal_of_get_zone_by_index(struct device *dev, int index)
>   > 282	{
>     283		return ERR_PTR(-EOPNOTSUPP);
>     284	}
>     285	
>     286	struct thermal_zone_device *thermal_of_get_zone(struct device *dev, const char *name)
>   > 287	{
>     288		return ERR_PTR(-EOPNOTSUPP);
>     289	}
>     290	#endif
>     291	
>
  
kernel test robot Nov. 15, 2023, 3:01 p.m. UTC | #3
Hi AngeloGioacchino,

kernel test robot noticed the following build errors:

[auto build test ERROR on rafael-pm/thermal]
[also build test ERROR on linus/master v6.7-rc1 next-20231115]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/AngeloGioacchino-Del-Regno/thermal-Add-support-for-device-tree-thermal-zones-consumers/20231114-211656
base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal
patch link:    https://lore.kernel.org/r/20231114131514.89031-1-angelogioacchino.delregno%40collabora.com
patch subject: [PATCH] thermal: Add support for device tree thermal zones consumers
config: arm-randconfig-004-20231115 (https://download.01.org/0day-ci/archive/20231115/202311152213.NNF5X5wd-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231115/202311152213.NNF5X5wd-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311152213.NNF5X5wd-lkp@intel.com/

All errors (new ones prefixed by >>):

   arm-linux-gnueabi-ld: drivers/power/supply/power_supply_core.o: in function `thermal_of_get_zone_by_index':
>> power_supply_core.c:(.text+0x167c): multiple definition of `thermal_of_get_zone_by_index'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5a4): first defined here
   arm-linux-gnueabi-ld: drivers/power/supply/power_supply_core.o: in function `thermal_of_get_zone':
>> power_supply_core.c:(.text+0x1684): multiple definition of `thermal_of_get_zone'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5ac): first defined here
   arm-linux-gnueabi-ld: drivers/hwmon/hwmon.o: in function `thermal_of_get_zone_by_index':
   hwmon.c:(.text+0x9cc): multiple definition of `thermal_of_get_zone_by_index'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5a4): first defined here
   arm-linux-gnueabi-ld: drivers/hwmon/hwmon.o: in function `thermal_of_get_zone':
   hwmon.c:(.text+0x9d4): multiple definition of `thermal_of_get_zone'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5ac): first defined here
   arm-linux-gnueabi-ld: drivers/hwmon/tc654.o: in function `thermal_of_get_zone_by_index':
   tc654.c:(.text+0x5c8): multiple definition of `thermal_of_get_zone_by_index'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5a4): first defined here
   arm-linux-gnueabi-ld: drivers/hwmon/tc654.o: in function `thermal_of_get_zone':
   tc654.c:(.text+0x5d0): multiple definition of `thermal_of_get_zone'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5ac): first defined here
   arm-linux-gnueabi-ld: drivers/hwmon/mlxreg-fan.o: in function `thermal_of_get_zone_by_index':
   mlxreg-fan.c:(.text+0x3f0): multiple definition of `thermal_of_get_zone_by_index'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5a4): first defined here
   arm-linux-gnueabi-ld: drivers/hwmon/mlxreg-fan.o: in function `thermal_of_get_zone':
   mlxreg-fan.c:(.text+0x3f8): multiple definition of `thermal_of_get_zone'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5ac): first defined here
   arm-linux-gnueabi-ld: drivers/hwmon/pwm-fan.o: in function `thermal_of_get_zone_by_index':
   pwm-fan.c:(.text+0x9c): multiple definition of `thermal_of_get_zone_by_index'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5a4): first defined here
   arm-linux-gnueabi-ld: drivers/hwmon/pwm-fan.o: in function `thermal_of_get_zone':
   pwm-fan.c:(.text+0xa4): multiple definition of `thermal_of_get_zone'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5ac): first defined here
   arm-linux-gnueabi-ld: drivers/cpufreq/cpufreq.o: in function `thermal_of_get_zone_by_index':
   cpufreq.c:(.text+0x1a7c): multiple definition of `thermal_of_get_zone_by_index'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5a4): first defined here
   arm-linux-gnueabi-ld: drivers/cpufreq/cpufreq.o: in function `thermal_of_get_zone':
   cpufreq.c:(.text+0x1a84): multiple definition of `thermal_of_get_zone'; drivers/soc/qcom/qcom_aoss.o:qcom_aoss.c:(.text+0x5ac): first defined here
  
kernel test robot Nov. 15, 2023, 3:01 p.m. UTC | #4
Hi AngeloGioacchino,

kernel test robot noticed the following build warnings:

[auto build test WARNING on rafael-pm/thermal]
[also build test WARNING on linus/master v6.7-rc1 next-20231115]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/AngeloGioacchino-Del-Regno/thermal-Add-support-for-device-tree-thermal-zones-consumers/20231114-211656
base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal
patch link:    https://lore.kernel.org/r/20231114131514.89031-1-angelogioacchino.delregno%40collabora.com
patch subject: [PATCH] thermal: Add support for device tree thermal zones consumers
config: x86_64-rhel-8.3-rust (https://download.01.org/0day-ci/archive/20231115/202311152242.dch1tAh5-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231115/202311152242.dch1tAh5-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311152242.dch1tAh5-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from drivers/cpufreq/cpufreq.c:19:
   In file included from include/linux/cpu_cooling.h:17:
>> include/linux/thermal.h:281:29: warning: no previous prototype for function 'thermal_of_get_zone_by_index' [-Wmissing-prototypes]
   struct thermal_zone_device *thermal_of_get_zone_by_index(struct device *dev, int index)
                               ^
   include/linux/thermal.h:281:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   struct thermal_zone_device *thermal_of_get_zone_by_index(struct device *dev, int index)
   ^
   static 
>> include/linux/thermal.h:286:29: warning: no previous prototype for function 'thermal_of_get_zone' [-Wmissing-prototypes]
   struct thermal_zone_device *thermal_of_get_zone(struct device *dev, const char *name)
                               ^
   include/linux/thermal.h:286:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   struct thermal_zone_device *thermal_of_get_zone(struct device *dev, const char *name)
   ^
   static 
   2 warnings generated.


vim +/thermal_of_get_zone_by_index +281 include/linux/thermal.h

   280	
 > 281	struct thermal_zone_device *thermal_of_get_zone_by_index(struct device *dev, int index)
   282	{
   283		return ERR_PTR(-EOPNOTSUPP);
   284	}
   285	
 > 286	struct thermal_zone_device *thermal_of_get_zone(struct device *dev, const char *name)
   287	{
   288		return ERR_PTR(-EOPNOTSUPP);
   289	}
   290	#endif
   291
  

Patch

diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 1e0655b63259..d8ead456993e 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -538,6 +538,97 @@  static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
 	return ERR_PTR(ret);
 }
 
+/**
+ * __thermal_of_get_zone_by_index() - Get thermal zone handle from the DT
+ *				      thermal-zones index
+ * @dev:   Pointer to the consumer device
+ * @index: Index of thermal-zones
+ *
+ * This function will search for a thermal zone in the thermal-zones phandle
+ * array corresponding to the specified index, then will search for its name
+ * into the registered thermal zones through thermal_zone_get_zone_by_name()
+ *
+ * Please note that this function is for internal use only and expects that
+ * all of the sanity checks are performed by its caller.
+ *
+ * Return: thermal_zone_device pointer on success, ERR_PTR() on error or NULL
+ * when the API is disabled or the "thermal-zones" DT property is missing.
+ */
+static struct thermal_zone_device
+*__thermal_of_get_zone_by_index(struct device *dev, int index)
+{
+	struct thermal_zone_device *tzd;
+	struct device_node *np;
+
+	np = of_parse_phandle(dev->of_node, "thermal-zones", index);
+	if (!np)
+		return NULL;
+
+	tzd = thermal_zone_get_zone_by_name(np->name);
+	of_node_put(np);
+
+	return tzd;
+}
+
+/**
+ * thermal_of_get_zone_by_index() - Get thermal zone handle from a DT node
+ *				    based on index
+ * @dev:   Pointer to the consumer device
+ * @index: Index of thermal-zones
+ *
+ * Return: thermal_zone_device pointer on success, ERR_PTR() on error or NULL
+ * when the API is disabled or the "thermal-zones" DT property is missing.
+ */
+struct thermal_zone_device *thermal_of_get_zone_by_index(struct device *dev, int index)
+{
+	if (!dev || !dev->of_node)
+		return ERR_PTR(-ENODEV);
+
+	if (!of_property_present(dev->of_node, "thermal-zones"))
+		return NULL;
+
+	return __thermal_of_get_zone_by_index(dev, index);
+}
+
+/**
+ * thermal_of_get_zone() - Get thermal zone handle from a DT node based
+ *			   on name, or the first handle in list
+ * @dev:   Pointer to the consumer device
+ * @name:  Name as found in thermal-zone-names or NULL
+ *
+ * This function will search for a thermal zone in the thermal-zones phandle
+ * array corresponding to the index of that in the thermal-zone-names array.
+ * If the name is not specified (NULL), it will return the first thermal zone
+ * in the thermal-zones phandle array.
+ *
+ * Return: thermal_zone_device pointer on success, ERR_PTR() on error or NULL
+ * when the API is disabled or the "thermal-zones" DT property is missing.
+ */
+struct thermal_zone_device *thermal_of_get_zone(struct device *dev, const char *name)
+{
+	int index;
+
+	if (!dev || !dev->of_node)
+		return ERR_PTR(-ENODEV);
+
+	if (!of_property_present(dev->of_node, "thermal-zones")) {
+		pr_err("thermal zones property not present\n");
+		return NULL;
+	}
+
+	if (name) {
+		index = of_property_match_string(dev->of_node, "thermal-zone-names", name);
+		if (index < 0) {
+			pr_err("thermal zone names property not present\n");
+			return ERR_PTR(index);
+		}
+	} else {
+		index = 0;
+	}
+
+	return __thermal_of_get_zone_by_index(dev, index);
+}
+
 static void devm_thermal_of_zone_release(struct device *dev, void *res)
 {
 	thermal_of_zone_unregister(*(struct thermal_zone_device **)res);
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index cee814d5d1ac..ad70fd55ec23 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -261,6 +261,9 @@  struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, in
 
 void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_device *tz);
 
+struct thermal_zone_device *thermal_of_get_zone_by_index(struct device *dev, int index);
+struct thermal_zone_device *thermal_of_get_zone(struct device *dev, const char *name);
+
 #else
 
 static inline
@@ -274,6 +277,16 @@  static inline void devm_thermal_of_zone_unregister(struct device *dev,
 						   struct thermal_zone_device *tz)
 {
 }
+
+struct thermal_zone_device *thermal_of_get_zone_by_index(struct device *dev, int index)
+{
+	return ERR_PTR(-EOPNOTSUPP);
+}
+
+struct thermal_zone_device *thermal_of_get_zone(struct device *dev, const char *name)
+{
+	return ERR_PTR(-EOPNOTSUPP);
+}
 #endif
 
 int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,