Commit 5d26c176 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull thermal updates from Daniel Lezcano:

 - Use the newly introduced 'hot' and 'critical' ops for the acpi
   thermal driver (Daniel Lezcano)

 - Remove the notify ops as it is no longer used (Daniel Lezcano)

 - Remove the 'forced passive' option and the unused bind/unbind
   functions (Daniel Lezcano)

 - Remove the THERMAL_TRIPS_NONE and the code cleanup around this macro
   (Daniel Lezcano)

 - Rework the delays to make them pre-computed instead of computing them
   again and again at each polling interval (Daniel Lezcano)

 - Remove the pointless 'thermal_zone_device_reset' function (Daniel
   Lezcano)

 - Use the critical and hot ops to prevent an unexpected system shutdown
   on int340x (Kai-Heng Feng)

 - Make the cooling device state private to the thermal subsystem
   (Daniel Lezcano)

 - Prevent to use not-power-aware actor devices with the power allocator
   governor (Lukasz Luba)

 - Remove 'zx' and 'tango' support along with the corresponding
   platforms (Arnd Bergman)

 - Fix several issues on the Omap thermal driver (Tony Lindgren)

 - Add support for adc-tm5 PMIC thermal monitor for Qcom platforms
   (Dmitry Baryshkov)

 - Fix an initialization loop in the adc-tm5 (Colin Ian King)

 - Fix a return error check in the cpufreq cooling device (Viresh Kumar)

* tag 'thermal-v5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux: (26 commits)
  thermal: cpufreq_cooling: freq_qos_update_request() returns < 0 on error
  thermal: qcom: Fix comparison with uninitialized variable channels_available
  thermal: qcom: add support for adc-tm5 PMIC thermal monitor
  dt-bindings: thermal: qcom: add adc-thermal monitor bindings
  thermal: ti-soc-thermal: Use non-inverted define for omap4
  thermal: ti-soc-thermal: Simplify polling with iopoll
  thermal: ti-soc-thermal: Fix stuck sensor with continuous mode for 4430
  thermal: ti-soc-thermal: Skip pointless register access for dra7
  thermal/drivers/zx: Remove zx driver
  thermal/drivers/tango: Remove tango driver
  thermal: power allocator: fail binding for non-power actor devices
  thermal/core: Make cooling device state change private
  thermal: intel: pch: Fix unexpected shutdown at critical temperature
  thermal: int340x: Fix unexpected shutdown at critical temperature
  thermal/core: Remove pointless thermal_zone_device_reset() function
  thermal/core: Remove ms based delay fields
  thermal/core: Use precomputed jiffies for the polling
  thermal/core: Precompute the delays from msecs to jiffies
  thermal/core: Remove unused macro THERMAL_TRIPS_NONE
  thermal/core: Remove THERMAL_TRIPS_NONE test
  ...
parents b996c10e a51afb13
Loading
Loading
Loading
Loading
+153 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/thermal/qcom-spmi-adc-tm5.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm's SPMI PMIC ADC Thermal Monitoring
maintainers:
  - Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

properties:
  compatible:
    const: qcom,spmi-adc-tm5

  reg:
    maxItems: 1

  interrupts:
    maxItems: 1

  "#thermal-sensor-cells":
    const: 1
    description:
      Number of cells required to uniquely identify the thermal sensors. Since
      we have multiple sensors this is set to 1

  "#address-cells":
    const: 1

  "#size-cells":
    const: 0

  qcom,avg-samples:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: Number of samples to be used for measurement.
    enum:
      - 1
      - 2
      - 4
      - 8
      - 16
    default: 1

  qcom,decimation:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: This parameter is used to decrease ADC sampling rate.
            Quicker measurements can be made by reducing decimation ratio.
    enum:
      - 250
      - 420
      - 840
    default: 840

patternProperties:
  "^([-a-z0-9]*)@[0-7]$":
    type: object
    description:
      Represent one thermal sensor.

    properties:
      reg:
        $ref: /schemas/types.yaml#/definitions/uint32
        description: Specify the sensor channel. There are 8 channels in PMIC5's ADC TM
        minimum: 0
        maximum: 7

      io-channels:
        description:
          From common IIO binding. Used to pipe PMIC ADC channel to thermal monitor

      qcom,ratiometric:
        $ref: /schemas/types.yaml#/definitions/flag
        description:
          Channel calibration type.
          If this property is specified VADC will use the VDD reference
          (1.875V) and GND for channel calibration. If property is not found,
          channel will be calibrated with 0V and 1.25V reference channels,
          also known as absolute calibration.

      qcom,hw-settle-time-us:
        $ref: /schemas/types.yaml#/definitions/uint32
        description: Time between AMUX getting configured and the ADC starting conversion.
        enum: [15, 100, 200, 300, 400, 500, 600, 700, 1000, 2000, 4000, 8000, 16000, 32000, 64000, 128000]

      qcom,pre-scaling:
        $ref: /schemas/types.yaml#/definitions/uint32-array
        description: Used for scaling the channel input signal before the
          signal is fed to VADC. The configuration for this node is to know the
          pre-determined ratio and use it for post scaling. It is a pair of
          integers, denoting the numerator and denominator of the fraction by
          which input signal is multiplied. For example, <1 3> indicates the
          signal is scaled down to 1/3 of its value before ADC measurement.  If
          property is not found default value depending on chip will be used.
        items:
          - const: 1
          - enum: [ 1, 3, 4, 6, 20, 8, 10 ]

    required:
      - reg
      - io-channels

    additionalProperties:
      false

required:
  - compatible
  - reg
  - interrupts
  - "#address-cells"
  - "#size-cells"
  - "#thermal-sensor-cells"

additionalProperties: false

examples:
  - |
    #include <dt-bindings/iio/qcom,spmi-vadc.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    spmi_bus {
        #address-cells = <1>;
        #size-cells = <0>;
        pm8150b_adc: adc@3100 {
            reg = <0x3100>;
            compatible = "qcom,spmi-adc5";
            #address-cells = <1>;
            #size-cells = <0>;
            #io-channel-cells = <1>;

            /* Other propreties are omitted */
            conn-therm@4f {
                reg = <ADC5_AMUX_THM3_100K_PU>;
                qcom,ratiometric;
                qcom,hw-settle-time = <200>;
            };
        };

        pm8150b_adc_tm: adc-tm@3500 {
            compatible = "qcom,spmi-adc-tm5";
            reg = <0x3500>;
            interrupts = <0x2 0x35 0x0 IRQ_TYPE_EDGE_RISING>;
            #thermal-sensor-cells = <1>;
            #address-cells = <1>;
            #size-cells = <0>;

            conn-therm@0 {
                reg = <0>;
                io-channels = <&pm8150b_adc ADC5_AMUX_THM3_100K_PU>;
                qcom,ratiometric;
                qcom,hw-settle-time-us = <200>;
            };
        };
    };
...
+0 −17
Original line number Diff line number Diff line
* Tango Thermal

The SMP8758 SoC includes 3 instances of this temperature sensor
(in the CPU, video decoder, and PCIe controller).

Required properties:
- #thermal-sensor-cells: Should be 0 (see Documentation/devicetree/bindings/thermal/thermal-sensor.yaml)
- compatible: "sigma,smp8758-thermal"
- reg: Address range of the thermal registers

Example:

	cpu_temp: thermal@920100 {
		#thermal-sensor-cells = <0>;
		compatible = "sigma,smp8758-thermal";
		reg = <0x920100 12>;
	};
+0 −116
Original line number Diff line number Diff line
* ZTE zx2967 family Thermal

Required Properties:
- compatible: should be one of the following.
    * zte,zx296718-thermal
- reg: physical base address of the controller and length of memory mapped
    region.
- clocks : Pairs of phandle and specifier referencing the controller's clocks.
- clock-names: "topcrm" for the topcrm clock.
	       "apb" for the apb clock.
- #thermal-sensor-cells: must be 0.

Please note: slope coefficient defined in thermal-zones section need to be
multiplied by 1000.

Example for tempsensor:

	tempsensor: tempsensor@148a000 {
		compatible = "zte,zx296718-thermal";
		reg = <0x0148a000 0x20>;
		clocks = <&topcrm TEMPSENSOR_GATE>, <&audiocrm AUDIO_TS_PCLK>;
		clock-names = "topcrm", "apb";
		#thermal-sensor-cells = <0>;
	};

Example for cooling device:

	cooling_dev: cooling_dev {
		cluster0_cooling_dev: cluster0-cooling-dev {
			#cooling-cells = <2>;
			cpumask = <0xf>;
			capacitance = <1500>;
		};

	cluster1_cooling_dev: cluster1-cooling-dev {
			#cooling-cells = <2>;
			cpumask = <0x30>;
			capacitance = <2000>;
		};
	};

Example for thermal zones:

	thermal-zones {
		zx296718_thermal: zx296718_thermal {
			polling-delay-passive = <500>;
			polling-delay = <1000>;
			sustainable-power = <6500>;

			thermal-sensors = <&tempsensor 0>;
			/*
			 * slope need to be multiplied by 1000.
			 */
			coefficients = <1951 (-922)>;

			trips {
				trip0: switch_on_temperature {
					temperature = <90000>;
					hysteresis = <2000>;
					type = "passive";
				};

				trip1: desired_temperature {
					temperature = <100000>;
					hysteresis = <2000>;
					type = "passive";
				};

				crit: critical_temperature {
					temperature = <110000>;
					hysteresis = <2000>;
					type = "critical";
				};
			};

			cooling-maps {
				map0 {
					trip = <&trip0>;
					cooling-device = <&gpu 2 5>;
				};

				map1 {
					trip = <&trip0>;
					cooling-device = <&cluster0_cooling_dev 1 2>;
				};

				map2 {
					trip = <&trip1>;
					cooling-device = <&cluster0_cooling_dev 1 2>;
				};

				map3 {
					trip = <&crit>;
					cooling-device = <&cluster0_cooling_dev 1 2>;
				};

				map4 {
					trip = <&trip0>;
					cooling-device = <&cluster1_cooling_dev 1 2>;
					contribution = <9000>;
				};

				map5 {
					trip = <&trip1>;
					cooling-device = <&cluster1_cooling_dev 1 2>;
					contribution = <4096>;
				};

				map6 {
					trip = <&crit>;
					cooling-device = <&cluster1_cooling_dev 1 2>;
					contribution = <4096>;
				};
			};
		};
	};
+0 −13
Original line number Diff line number Diff line
@@ -520,19 +520,6 @@ available_policies

	RW, Optional

passive
	Attribute is only present for zones in which the passive cooling
	policy is not supported by native thermal driver. Default is zero
	and can be set to a temperature (in millidegrees) to enable a
	passive trip point for the zone. Activation is done by polling with
	an interval of 1 second.

	Unit: millidegrees Celsius

	Valid values: 0 (disabled) or greater than 1000

	RW, Optional

emul_temp
	Interface to set the emulated temperature method in thermal zone
	(sensor). After setting this temperature, the thermal zone may pass
+14 −35
Original line number Diff line number Diff line
@@ -670,27 +670,24 @@ static int thermal_get_trend(struct thermal_zone_device *thermal,
	return 0;
}


static int thermal_notify(struct thermal_zone_device *thermal, int trip,
			   enum thermal_trip_type trip_type)
static void acpi_thermal_zone_device_hot(struct thermal_zone_device *thermal)
{
	u8 type = 0;
	struct acpi_thermal *tz = thermal->devdata;

	if (trip_type == THERMAL_TRIP_CRITICAL)
		type = ACPI_THERMAL_NOTIFY_CRITICAL;
	else if (trip_type == THERMAL_TRIP_HOT)
		type = ACPI_THERMAL_NOTIFY_HOT;
	else
		return 0;

	acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
					dev_name(&tz->device->dev), type, 1);
					dev_name(&tz->device->dev),
					ACPI_THERMAL_NOTIFY_HOT, 1);
}

	if (trip_type == THERMAL_TRIP_CRITICAL && nocrt)
		return 1;
static void acpi_thermal_zone_device_critical(struct thermal_zone_device *thermal)
{
	struct acpi_thermal *tz = thermal->devdata;

	return 0;
	acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
					dev_name(&tz->device->dev),
					ACPI_THERMAL_NOTIFY_CRITICAL, 1);

	thermal_zone_device_critical(thermal);
}

static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
@@ -760,25 +757,6 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
		}
	}

	for (i = 0; i < tz->devices.count; i++) {
		handle = tz->devices.handles[i];
		status = acpi_bus_get_device(handle, &dev);
		if (ACPI_SUCCESS(status) && (dev == device)) {
			if (bind)
				result = thermal_zone_bind_cooling_device
						(thermal, THERMAL_TRIPS_NONE,
						 cdev, THERMAL_NO_LIMIT,
						 THERMAL_NO_LIMIT,
						 THERMAL_WEIGHT_DEFAULT);
			else
				result = thermal_zone_unbind_cooling_device
						(thermal, THERMAL_TRIPS_NONE,
						 cdev);
			if (result)
				goto failed;
		}
	}

failed:
	return result;
}
@@ -805,7 +783,8 @@ static struct thermal_zone_device_ops acpi_thermal_zone_ops = {
	.get_trip_temp = thermal_get_trip_temp,
	.get_crit_temp = thermal_get_crit_temp,
	.get_trend = thermal_get_trend,
	.notify = thermal_notify,
	.hot = acpi_thermal_zone_device_hot,
	.critical = acpi_thermal_zone_device_critical,
};

static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
Loading