Merge tag 'thermal-6.4-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 May 2023 18:46:01 +0000 (11:46 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 May 2023 18:46:01 +0000 (11:46 -0700)
Pull more thermal control updates from Rafael Wysocki:
 "These are mostly cleanups on top of the previously merged thermal
  control changes plus some driver fixes and the removal of the Intel
  Menlow thermal driver.

  Specifics:

   - Add compatible DT bindings for imx6sll and imx6ul to fix a dtbs
     check warning (Stefan Wahren)

   - Update the example in the DT bindings to reflect changes with the
     ADC node name for QCom TM and TM5 (Marijn Suijten)

   - Fix comments for the cpuidle_cooling_register() function to match
     the function prototype (Chenggang Wang)

   - Fix inconsistent temperature read and some Mediatek variant board
     reboot by reverting a change and handling the temperature
     differently (AngeloGioacchino Del Regno)

   - Fix a memory leak in the initialization error path for the Mediatek
     driver (Kang Chen)

   - Use of_address_to_resource() in the Mediatek driver (Rob Herring)

   - Fix unit address in the QCom tsens driver DT bindings (Krzysztof
     Kozlowski)

   - Clean up the step-wise thermal governor (Zhang Rui)

   - Introduce thermal_zone_device() for accessing the device field of
     struct thermal_zone_device and two drivers use it (Daniel Lezcano)

   - Clean up the ACPI thermal driver a bit (Daniel Lezcano)

   - Delete the thermal driver for Intel Menlow platforms that is not
     expected to have any users (Rafael Wysocki)"

* tag 'thermal-6.4-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  thermal: intel: menlow: Get rid of this driver
  ACPI: thermal: Move to dedicated function sysfs extra attr creation
  ACPI: thermal: Use thermal_zone_device()
  thermal: intel: pch_thermal: Use thermal driver device to write a trace
  thermal: core: Encapsulate tz->device field
  thermal: gov_step_wise: Adjust code logic to match comment
  thermal: gov_step_wise: Delete obsolete comment
  dt-bindings: thermal: qcom-tsens: Correct unit address
  thermal/drivers/mediatek: Use of_address_to_resource()
  thermal/drivers/mediatek: Change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe
  thermal/drivers/mediatek: Use devm_of_iomap to avoid resource leak in mtk_thermal_probe
  thermal/drivers/mediatek: Add temperature constraints to validate read
  Revert "thermal/drivers/mediatek: Add delay after thermal banks initialization"
  thermal/drivers/cpuidle_cooling: Delete unmatched comments
  dt-bindings: thermal: Use generic ADC node name in examples
  dt-bindings: imx-thermal: Add imx6sll and imx6ul compatible

14 files changed:
Documentation/devicetree/bindings/thermal/imx-thermal.yaml
Documentation/devicetree/bindings/thermal/qcom-spmi-adc-tm-hc.yaml
Documentation/devicetree/bindings/thermal/qcom-spmi-adc-tm5.yaml
Documentation/devicetree/bindings/thermal/qcom-tsens.yaml
drivers/acpi/thermal.c
drivers/thermal/cpuidle_cooling.c
drivers/thermal/gov_step_wise.c
drivers/thermal/intel/Kconfig
drivers/thermal/intel/Makefile
drivers/thermal/intel/intel_menlow.c [deleted file]
drivers/thermal/intel/intel_pch_thermal.c
drivers/thermal/mediatek/auxadc_thermal.c
drivers/thermal/thermal_core.c
include/linux/thermal.h

index fe599e443eaf190a87659635668178ee9540d3fc..3aecea77869f09b3bf0553c9ca593a4c587ff0ca 100644 (file)
@@ -12,10 +12,16 @@ maintainers:
 
 properties:
   compatible:
-    enum:
-      - fsl,imx6q-tempmon
-      - fsl,imx6sx-tempmon
-      - fsl,imx7d-tempmon
+    oneOf:
+      - enum:
+          - fsl,imx6q-tempmon
+          - fsl,imx6sx-tempmon
+          - fsl,imx7d-tempmon
+      - items:
+          - enum:
+              - fsl,imx6sll-tempmon
+              - fsl,imx6ul-tempmon
+          - const: fsl,imx6sx-tempmon
 
   interrupts:
     description: |
index 8273ac55b63feea76e4fe664e570df7f9d89b918..01253d58bf9fa38fd335ed76705eaecd9aa7fe50 100644 (file)
@@ -124,8 +124,8 @@ examples:
             #size-cells = <0>;
             #io-channel-cells = <1>;
 
-            /* Other propreties are omitted */
-            adc-chan@4c {
+            /* Other properties are omitted */
+            channel@4c {
                 reg = <ADC5_XO_THERM_100K_PU>;
             };
         };
index 52ec18cf1edaa38e5e774e67e4cce9fcb4ed61e8..3c81def03c84c7787a4557b2bdadda2e0a27ce9a 100644 (file)
@@ -178,10 +178,11 @@ examples:
             #io-channel-cells = <1>;
 
             /* Other properties are omitted */
-            conn-therm@4f {
+            channel@4f {
                 reg = <ADC5_AMUX_THM3_100K_PU>;
                 qcom,ratiometric;
                 qcom,hw-settle-time = <200>;
+                label = "conn_therm";
             };
         };
 
@@ -217,16 +218,18 @@ examples:
             #io-channel-cells = <1>;
 
             /* Other properties are omitted */
-            xo-therm@44 {
+            channel@44 {
                 reg = <PMK8350_ADC7_AMUX_THM1_100K_PU>;
                 qcom,ratiometric;
                 qcom,hw-settle-time = <200>;
+                label = "xo_therm";
             };
 
-            conn-therm@147 {
+            channel@147 {
                 reg = <PM8350_ADC7_AMUX_THM4_100K_PU(1)>;
                 qcom,ratiometric;
                 qcom,hw-settle-time = <200>;
+                label = "conn_therm";
             };
         };
 
index 926e9c51c93cbd7201e03eac48b89d7306ff1e46..d1ec963a6834e746e9232bf834ae0c7788a1e81e 100644 (file)
@@ -326,7 +326,7 @@ examples:
   - |
     #include <dt-bindings/interrupt-controller/arm-gic.h>
     // Example 1 (new calbiration data: for pre v1 IP):
-    thermal-sensor@900000 {
+    thermal-sensor@4a9000 {
         compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
         reg = <0x4a9000 0x1000>, /* TM */
               <0x4a8000 0x1000>; /* SROT */
@@ -356,7 +356,7 @@ examples:
   - |
     #include <dt-bindings/interrupt-controller/arm-gic.h>
     // Example 1 (legacy: for pre v1 IP):
-    tsens1: thermal-sensor@900000 {
+    tsens1: thermal-sensor@4a9000 {
            compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
            reg = <0x4a9000 0x1000>, /* TM */
                  <0x4a8000 0x1000>; /* SROT */
index ec002ecfe4cf4fb7f02bc211415eaa3b21b26ce7..4720a3649a61bcc8e61cca40f0444a52ba95567b 100644 (file)
@@ -786,6 +786,32 @@ static struct thermal_zone_device_ops acpi_thermal_zone_ops = {
        .critical = acpi_thermal_zone_device_critical,
 };
 
+static int acpi_thermal_zone_sysfs_add(struct acpi_thermal *tz)
+{
+       struct device *tzdev = thermal_zone_device(tz->thermal_zone);
+       int ret;
+
+       ret = sysfs_create_link(&tz->device->dev.kobj,
+                               &tzdev->kobj, "thermal_zone");
+       if (ret)
+               return ret;
+
+       ret = sysfs_create_link(&tzdev->kobj,
+                                  &tz->device->dev.kobj, "device");
+       if (ret)
+               sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
+
+       return ret;
+}
+
+static void acpi_thermal_zone_sysfs_remove(struct acpi_thermal *tz)
+{
+       struct device *tzdev = thermal_zone_device(tz->thermal_zone);
+
+       sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
+       sysfs_remove_link(&tzdev->kobj, "device");
+}
+
 static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
 {
        int trips = 0;
@@ -819,21 +845,15 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
        if (IS_ERR(tz->thermal_zone))
                return -ENODEV;
 
-       result = sysfs_create_link(&tz->device->dev.kobj,
-                                  &tz->thermal_zone->device.kobj, "thermal_zone");
+       result = acpi_thermal_zone_sysfs_add(tz);
        if (result)
                goto unregister_tzd;
 
-       result = sysfs_create_link(&tz->thermal_zone->device.kobj,
-                                  &tz->device->dev.kobj, "device");
-       if (result)
-               goto remove_tz_link;
-
        status =  acpi_bus_attach_private_data(tz->device->handle,
                                               tz->thermal_zone);
        if (ACPI_FAILURE(status)) {
                result = -ENODEV;
-               goto remove_dev_link;
+               goto remove_links;
        }
 
        result = thermal_zone_device_enable(tz->thermal_zone);
@@ -847,10 +867,8 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
 
 acpi_bus_detach:
        acpi_bus_detach_private_data(tz->device->handle);
-remove_dev_link:
-       sysfs_remove_link(&tz->thermal_zone->device.kobj, "device");
-remove_tz_link:
-       sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
+remove_links:
+       acpi_thermal_zone_sysfs_remove(tz);
 unregister_tzd:
        thermal_zone_device_unregister(tz->thermal_zone);
 
@@ -859,8 +877,7 @@ unregister_tzd:
 
 static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
 {
-       sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
-       sysfs_remove_link(&tz->thermal_zone->device.kobj, "device");
+       acpi_thermal_zone_sysfs_remove(tz);
        thermal_zone_device_unregister(tz->thermal_zone);
        tz->thermal_zone = NULL;
        acpi_bus_detach_private_data(tz->device->handle);
index 6f6daead485eee2bbe7fabb3123c2a6134516ed8..69f4c0a8dfcc0e791500392684c1780bb5630d63 100644 (file)
@@ -237,9 +237,6 @@ out:
  *
  * This function is in charge of creating a cooling device per cpuidle
  * driver and register it to the thermal framework.
- *
- * Return: zero on success, or negative value corresponding to the
- * error detected in the underlying subsystems.
  */
 void cpuidle_cooling_register(struct cpuidle_driver *drv)
 {
index 3d3067804df244c4b054489d4b8e2d9d3ef9bbbc..1050fb4d94c2d46856ea22daa881bd37f15b27a4 100644 (file)
  *    a. if the trend is THERMAL_TREND_RAISING, use higher cooling
  *       state for this trip point
  *    b. if the trend is THERMAL_TREND_DROPPING, do nothing
- *    c. if the trend is THERMAL_TREND_RAISE_FULL, use upper limit
- *       for this trip point
- *    d. if the trend is THERMAL_TREND_DROP_FULL, use lower limit
- *       for this trip point
  * If the temperature is lower than a trip point,
  *    a. if the trend is THERMAL_TREND_RAISING, do nothing
  *    b. if the trend is THERMAL_TREND_DROPPING, use lower cooling
  *       state for this trip point, if the cooling state already
  *       equals lower limit, deactivate the thermal instance
- *    c. if the trend is THERMAL_TREND_RAISE_FULL, do nothing
- *    d. if the trend is THERMAL_TREND_DROP_FULL, use lower limit,
- *       if the cooling state already equals lower limit,
- *       deactivate the thermal instance
  */
 static unsigned long get_target_state(struct thermal_instance *instance,
                                enum thermal_trend trend, bool throttle)
@@ -61,24 +53,16 @@ static unsigned long get_target_state(struct thermal_instance *instance,
                return next_target;
        }
 
-       switch (trend) {
-       case THERMAL_TREND_RAISING:
-               if (throttle) {
+       if (throttle) {
+               if (trend == THERMAL_TREND_RAISING)
                        next_target = clamp((cur_state + 1), instance->lower, instance->upper);
-               }
-               break;
-       case THERMAL_TREND_DROPPING:
-               if (cur_state <= instance->lower) {
-                       if (!throttle)
+       } else {
+               if (trend == THERMAL_TREND_DROPPING) {
+                       if (cur_state <= instance->lower)
                                next_target = THERMAL_NO_TARGET;
-               } else {
-                       if (!throttle) {
+                       else
                                next_target = clamp((cur_state - 1), instance->lower, instance->upper);
-                       }
                }
-               break;
-       default:
-               break;
        }
 
        return next_target;
index cb7e7697cf1e3774110fa7df1c18c4051c36fe12..ecd7e07eece0b49ba1c1037df3a9f37a459a3fe1 100644 (file)
@@ -103,15 +103,6 @@ config INTEL_TCC_COOLING
          on how fast the setting takes effect, and how much the CPU frequency
          is reduced.
 
-config INTEL_MENLOW
-       tristate "Thermal Management driver for Intel menlow platform"
-       depends on ACPI_THERMAL
-       help
-         ACPI thermal management enhancement driver on
-         Intel Menlow platform.
-
-         If unsure, say N.
-
 config INTEL_HFI_THERMAL
        bool "Intel Hardware Feedback Interface"
        depends on NET
index 5d8833c82ab68b35e9e4032f6d79d50472190398..182b3411300a90de12964a557e079e35494ddf68 100644 (file)
@@ -13,5 +13,4 @@ obj-$(CONFIG_INTEL_BXT_PMIC_THERMAL) += intel_bxt_pmic_thermal.o
 obj-$(CONFIG_INTEL_PCH_THERMAL)        += intel_pch_thermal.o
 obj-$(CONFIG_INTEL_TCC_COOLING)        += intel_tcc_cooling.o
 obj-$(CONFIG_X86_THERMAL_VECTOR) += therm_throt.o
-obj-$(CONFIG_INTEL_MENLOW)     += intel_menlow.o
 obj-$(CONFIG_INTEL_HFI_THERMAL) += intel_hfi.o
diff --git a/drivers/thermal/intel/intel_menlow.c b/drivers/thermal/intel/intel_menlow.c
deleted file mode 100644 (file)
index 5a6ad05..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- *  Intel menlow Driver for thermal management extension
- *
- *  Copyright (C) 2008 Intel Corp
- *  Copyright (C) 2008 Sujith Thomas <sujith.thomas@intel.com>
- *  Copyright (C) 2008 Zhang Rui <rui.zhang@intel.com>
- *
- *  This driver creates the sys I/F for programming the sensors.
- *  It also implements the driver for intel menlow memory controller (hardware
- *  id is INT0002) which makes use of the platform specific ACPI methods
- *  to get/set bandwidth.
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/acpi.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/pm.h>
-#include <linux/slab.h>
-#include <linux/thermal.h>
-#include <linux/types.h>
-#include <linux/units.h>
-
-MODULE_AUTHOR("Thomas Sujith");
-MODULE_AUTHOR("Zhang Rui");
-MODULE_DESCRIPTION("Intel Menlow platform specific driver");
-MODULE_LICENSE("GPL v2");
-
-/*
- * Memory controller device control
- */
-
-#define MEMORY_GET_BANDWIDTH "GTHS"
-#define MEMORY_SET_BANDWIDTH "STHS"
-#define MEMORY_ARG_CUR_BANDWIDTH 1
-#define MEMORY_ARG_MAX_BANDWIDTH 0
-
-static void intel_menlow_unregister_sensor(void);
-
-/*
- * GTHS returning 'n' would mean that [0,n-1] states are supported
- * In that case max_cstate would be n-1
- * GTHS returning '0' would mean that no bandwidth control states are supported
- */
-static int memory_get_max_bandwidth(struct thermal_cooling_device *cdev,
-                                   unsigned long *max_state)
-{
-       struct acpi_device *device = cdev->devdata;
-       acpi_handle handle = device->handle;
-       unsigned long long value;
-       struct acpi_object_list arg_list;
-       union acpi_object arg;
-       acpi_status status = AE_OK;
-
-       arg_list.count = 1;
-       arg_list.pointer = &arg;
-       arg.type = ACPI_TYPE_INTEGER;
-       arg.integer.value = MEMORY_ARG_MAX_BANDWIDTH;
-       status = acpi_evaluate_integer(handle, MEMORY_GET_BANDWIDTH,
-                                      &arg_list, &value);
-       if (ACPI_FAILURE(status))
-               return -EFAULT;
-
-       if (!value)
-               return -EINVAL;
-
-       *max_state = value - 1;
-       return 0;
-}
-
-static int memory_get_cur_bandwidth(struct thermal_cooling_device *cdev,
-                                   unsigned long *value)
-{
-       struct acpi_device *device = cdev->devdata;
-       acpi_handle handle = device->handle;
-       unsigned long long result;
-       struct acpi_object_list arg_list;
-       union acpi_object arg;
-       acpi_status status = AE_OK;
-
-       arg_list.count = 1;
-       arg_list.pointer = &arg;
-       arg.type = ACPI_TYPE_INTEGER;
-       arg.integer.value = MEMORY_ARG_CUR_BANDWIDTH;
-       status = acpi_evaluate_integer(handle, MEMORY_GET_BANDWIDTH,
-                                      &arg_list, &result);
-       if (ACPI_FAILURE(status))
-               return -EFAULT;
-
-       *value = result;
-       return 0;
-}
-
-static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev,
-                                   unsigned long state)
-{
-       struct acpi_device *device = cdev->devdata;
-       acpi_handle handle = device->handle;
-       struct acpi_object_list arg_list;
-       union acpi_object arg;
-       acpi_status status;
-       unsigned long long temp;
-       unsigned long max_state;
-
-       if (memory_get_max_bandwidth(cdev, &max_state))
-               return -EFAULT;
-
-       if (state > max_state)
-               return -EINVAL;
-
-       arg_list.count = 1;
-       arg_list.pointer = &arg;
-       arg.type = ACPI_TYPE_INTEGER;
-       arg.integer.value = state;
-
-       status =
-           acpi_evaluate_integer(handle, MEMORY_SET_BANDWIDTH, &arg_list,
-                                 &temp);
-
-       pr_info("Bandwidth value was %ld: status is %d\n", state, status);
-       if (ACPI_FAILURE(status))
-               return -EFAULT;
-
-       return 0;
-}
-
-static const struct thermal_cooling_device_ops memory_cooling_ops = {
-       .get_max_state = memory_get_max_bandwidth,
-       .get_cur_state = memory_get_cur_bandwidth,
-       .set_cur_state = memory_set_cur_bandwidth,
-};
-
-/*
- * Memory Device Management
- */
-static int intel_menlow_memory_add(struct acpi_device *device)
-{
-       int result = -ENODEV;
-       struct thermal_cooling_device *cdev;
-
-       if (!device)
-               return -EINVAL;
-
-       if (!acpi_has_method(device->handle, MEMORY_GET_BANDWIDTH))
-               goto end;
-
-       if (!acpi_has_method(device->handle, MEMORY_SET_BANDWIDTH))
-               goto end;
-
-       cdev = thermal_cooling_device_register("Memory controller", device,
-                                              &memory_cooling_ops);
-       if (IS_ERR(cdev)) {
-               result = PTR_ERR(cdev);
-               goto end;
-       }
-
-       device->driver_data = cdev;
-       result = sysfs_create_link(&device->dev.kobj,
-                               &cdev->device.kobj, "thermal_cooling");
-       if (result)
-               goto unregister;
-
-       result = sysfs_create_link(&cdev->device.kobj,
-                               &device->dev.kobj, "device");
-       if (result) {
-               sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
-               goto unregister;
-       }
-
- end:
-       return result;
-
- unregister:
-       thermal_cooling_device_unregister(cdev);
-       return result;
-
-}
-
-static void intel_menlow_memory_remove(struct acpi_device *device)
-{
-       struct thermal_cooling_device *cdev;
-
-       if (!device)
-               return;
-
-       cdev = acpi_driver_data(device);
-       if (!cdev)
-               return;
-
-       sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
-       sysfs_remove_link(&cdev->device.kobj, "device");
-       thermal_cooling_device_unregister(cdev);
-}
-
-static const struct acpi_device_id intel_menlow_memory_ids[] = {
-       {"INT0002", 0},
-       {"", 0},
-};
-
-static struct acpi_driver intel_menlow_memory_driver = {
-       .name = "intel_menlow_thermal_control",
-       .ids = intel_menlow_memory_ids,
-       .ops = {
-               .add = intel_menlow_memory_add,
-               .remove = intel_menlow_memory_remove,
-               },
-};
-
-/*
- * Sensor control on menlow platform
- */
-
-#define THERMAL_AUX0 0
-#define THERMAL_AUX1 1
-#define GET_AUX0 "GAX0"
-#define GET_AUX1 "GAX1"
-#define SET_AUX0 "SAX0"
-#define SET_AUX1 "SAX1"
-
-struct intel_menlow_attribute {
-       struct device_attribute attr;
-       struct device *device;
-       acpi_handle handle;
-       struct list_head node;
-};
-
-static LIST_HEAD(intel_menlow_attr_list);
-static DEFINE_MUTEX(intel_menlow_attr_lock);
-
-/*
- * sensor_get_auxtrip - get the current auxtrip value from sensor
- * @handle: Object handle
- * @index : GET_AUX1/GET_AUX0
- * @value : The address will be fill by the value
- */
-static int sensor_get_auxtrip(acpi_handle handle, int index,
-                                                       unsigned long long *value)
-{
-       acpi_status status;
-
-       if ((index != 0 && index != 1) || !value)
-               return -EINVAL;
-
-       status = acpi_evaluate_integer(handle, index ? GET_AUX1 : GET_AUX0,
-                                      NULL, value);
-       if (ACPI_FAILURE(status))
-               return -EIO;
-
-       return 0;
-}
-
-/*
- * sensor_set_auxtrip - set the new auxtrip value to sensor
- * @handle: Object handle
- * @index : GET_AUX1/GET_AUX0
- * @value : The value will be set
- */
-static int sensor_set_auxtrip(acpi_handle handle, int index, int value)
-{
-       acpi_status status;
-       union acpi_object arg = {
-               ACPI_TYPE_INTEGER
-       };
-       struct acpi_object_list args = {
-               1, &arg
-       };
-       unsigned long long temp;
-
-       if (index != 0 && index != 1)
-               return -EINVAL;
-
-       status = acpi_evaluate_integer(handle, index ? GET_AUX0 : GET_AUX1,
-                                      NULL, &temp);
-       if (ACPI_FAILURE(status))
-               return -EIO;
-       if ((index && value < temp) || (!index && value > temp))
-               return -EINVAL;
-
-       arg.integer.value = value;
-       status = acpi_evaluate_integer(handle, index ? SET_AUX1 : SET_AUX0,
-                                      &args, &temp);
-       if (ACPI_FAILURE(status))
-               return -EIO;
-
-       /* do we need to check the return value of SAX0/SAX1 ? */
-
-       return 0;
-}
-
-#define to_intel_menlow_attr(_attr)    \
-       container_of(_attr, struct intel_menlow_attribute, attr)
-
-static ssize_t aux_show(struct device *dev, struct device_attribute *dev_attr,
-                       char *buf, int idx)
-{
-       struct intel_menlow_attribute *attr = to_intel_menlow_attr(dev_attr);
-       unsigned long long value;
-       int result;
-
-       result = sensor_get_auxtrip(attr->handle, idx, &value);
-       if (result)
-               return result;
-
-       return sprintf(buf, "%lu", deci_kelvin_to_celsius(value));
-}
-
-static ssize_t aux0_show(struct device *dev,
-                        struct device_attribute *dev_attr, char *buf)
-{
-       return aux_show(dev, dev_attr, buf, 0);
-}
-
-static ssize_t aux1_show(struct device *dev,
-                        struct device_attribute *dev_attr, char *buf)
-{
-       return aux_show(dev, dev_attr, buf, 1);
-}
-
-static ssize_t aux_store(struct device *dev, struct device_attribute *dev_attr,
-                        const char *buf, size_t count, int idx)
-{
-       struct intel_menlow_attribute *attr = to_intel_menlow_attr(dev_attr);
-       int value;
-       int result;
-
-       /*Sanity check; should be a positive integer */
-       if (!sscanf(buf, "%d", &value))
-               return -EINVAL;
-
-       if (value < 0)
-               return -EINVAL;
-
-       result = sensor_set_auxtrip(attr->handle, idx,
-                                   celsius_to_deci_kelvin(value));
-       return result ? result : count;
-}
-
-static ssize_t aux0_store(struct device *dev,
-                         struct device_attribute *dev_attr,
-                         const char *buf, size_t count)
-{
-       return aux_store(dev, dev_attr, buf, count, 0);
-}
-
-static ssize_t aux1_store(struct device *dev,
-                         struct device_attribute *dev_attr,
-                         const char *buf, size_t count)
-{
-       return aux_store(dev, dev_attr, buf, count, 1);
-}
-
-/* BIOS can enable/disable the thermal user application in dabney platform */
-#define BIOS_ENABLED "\\_TZ.GSTS"
-static ssize_t bios_enabled_show(struct device *dev,
-                                struct device_attribute *attr, char *buf)
-{
-       acpi_status status;
-       unsigned long long bios_enabled;
-
-       status = acpi_evaluate_integer(NULL, BIOS_ENABLED, NULL, &bios_enabled);
-       if (ACPI_FAILURE(status))
-               return -ENODEV;
-
-       return sprintf(buf, "%s\n", bios_enabled ? "enabled" : "disabled");
-}
-
-static int intel_menlow_add_one_attribute(char *name, umode_t mode, void *show,
-                                         void *store, struct device *dev,
-                                         acpi_handle handle)
-{
-       struct intel_menlow_attribute *attr;
-       int result;
-
-       attr = kzalloc(sizeof(struct intel_menlow_attribute), GFP_KERNEL);
-       if (!attr)
-               return -ENOMEM;
-
-       sysfs_attr_init(&attr->attr.attr); /* That is consistent naming :D */
-       attr->attr.attr.name = name;
-       attr->attr.attr.mode = mode;
-       attr->attr.show = show;
-       attr->attr.store = store;
-       attr->device = dev;
-       attr->handle = handle;
-
-       result = device_create_file(dev, &attr->attr);
-       if (result) {
-               kfree(attr);
-               return result;
-       }
-
-       mutex_lock(&intel_menlow_attr_lock);
-       list_add_tail(&attr->node, &intel_menlow_attr_list);
-       mutex_unlock(&intel_menlow_attr_lock);
-
-       return 0;
-}
-
-static acpi_status intel_menlow_register_sensor(acpi_handle handle, u32 lvl,
-                                               void *context, void **rv)
-{
-       acpi_status status;
-       acpi_handle dummy;
-       struct thermal_zone_device *thermal;
-       int result;
-
-       result = acpi_bus_get_private_data(handle, (void **)&thermal);
-       if (result)
-               return 0;
-
-       /* _TZ must have the AUX0/1 methods */
-       status = acpi_get_handle(handle, GET_AUX0, &dummy);
-       if (ACPI_FAILURE(status))
-               return (status == AE_NOT_FOUND) ? AE_OK : status;
-
-       status = acpi_get_handle(handle, SET_AUX0, &dummy);
-       if (ACPI_FAILURE(status))
-               return (status == AE_NOT_FOUND) ? AE_OK : status;
-
-       result = intel_menlow_add_one_attribute("aux0", 0644,
-                                               aux0_show, aux0_store,
-                                               &thermal->device, handle);
-       if (result)
-               return AE_ERROR;
-
-       status = acpi_get_handle(handle, GET_AUX1, &dummy);
-       if (ACPI_FAILURE(status))
-               goto aux1_not_found;
-
-       status = acpi_get_handle(handle, SET_AUX1, &dummy);
-       if (ACPI_FAILURE(status))
-               goto aux1_not_found;
-
-       result = intel_menlow_add_one_attribute("aux1", 0644,
-                                               aux1_show, aux1_store,
-                                               &thermal->device, handle);
-       if (result) {
-               intel_menlow_unregister_sensor();
-               return AE_ERROR;
-       }
-
-       /*
-        * create the "dabney_enabled" attribute which means the user app
-        * should be loaded or not
-        */
-
-       result = intel_menlow_add_one_attribute("bios_enabled", 0444,
-                                               bios_enabled_show, NULL,
-                                               &thermal->device, handle);
-       if (result) {
-               intel_menlow_unregister_sensor();
-               return AE_ERROR;
-       }
-
-       return AE_OK;
-
- aux1_not_found:
-       if (status == AE_NOT_FOUND)
-               return AE_OK;
-
-       intel_menlow_unregister_sensor();
-       return status;
-}
-
-static void intel_menlow_unregister_sensor(void)
-{
-       struct intel_menlow_attribute *pos, *next;
-
-       mutex_lock(&intel_menlow_attr_lock);
-       list_for_each_entry_safe(pos, next, &intel_menlow_attr_list, node) {
-               list_del(&pos->node);
-               device_remove_file(pos->device, &pos->attr);
-               kfree(pos);
-       }
-       mutex_unlock(&intel_menlow_attr_lock);
-
-       return;
-}
-
-static int __init intel_menlow_module_init(void)
-{
-       int result = -ENODEV;
-       acpi_status status;
-       unsigned long long enable;
-
-       if (acpi_disabled)
-               return result;
-
-       /* Looking for the \_TZ.GSTS method */
-       status = acpi_evaluate_integer(NULL, BIOS_ENABLED, NULL, &enable);
-       if (ACPI_FAILURE(status) || !enable)
-               return -ENODEV;
-
-       /* Looking for ACPI device MEM0 with hardware id INT0002 */
-       result = acpi_bus_register_driver(&intel_menlow_memory_driver);
-       if (result)
-               return result;
-
-       /* Looking for sensors in each ACPI thermal zone */
-       status = acpi_walk_namespace(ACPI_TYPE_THERMAL, ACPI_ROOT_OBJECT,
-                                    ACPI_UINT32_MAX,
-                                    intel_menlow_register_sensor, NULL, NULL, NULL);
-       if (ACPI_FAILURE(status)) {
-               acpi_bus_unregister_driver(&intel_menlow_memory_driver);
-               return -ENODEV;
-       }
-
-       return 0;
-}
-
-static void __exit intel_menlow_module_exit(void)
-{
-       acpi_bus_unregister_driver(&intel_menlow_memory_driver);
-       intel_menlow_unregister_sensor();
-}
-
-module_init(intel_menlow_module_init);
-module_exit(intel_menlow_module_exit);
index dce50d239357bc3a05088cb077e3ff34a2630e91..b3905e34c5077adf810d623451c8c04b3ca2ba9f 100644 (file)
@@ -127,7 +127,8 @@ static int pch_thermal_get_temp(struct thermal_zone_device *tzd, int *temp)
 
 static void pch_critical(struct thermal_zone_device *tzd)
 {
-       dev_dbg(&tzd->device, "%s: critical temperature reached\n", tzd->type);
+       dev_dbg(thermal_zone_device(tzd), "%s: critical temperature reached\n",
+               thermal_zone_device_type(tzd));
 }
 
 static struct thermal_zone_device_ops tzd_ops = {
index b6bb9eaafb74c02ed14e408994f088246370c523..0b5528804bbd6daa6c53a046120af7577935531b 100644 (file)
 /* The calibration coefficient of sensor  */
 #define MT8173_CALIBRATION     165
 
+/* Valid temperatures range */
+#define MT8173_TEMP_MIN                -20000
+#define MT8173_TEMP_MAX                150000
+
 /*
  * Layout of the fuses providing the calibration data
  * These macros could be used for MT8183, MT8173, MT2701, and MT2712.
@@ -689,6 +693,11 @@ static const struct mtk_thermal_data mt7986_thermal_data = {
        .version = MTK_THERMAL_V3,
 };
 
+static bool mtk_thermal_temp_is_valid(int temp)
+{
+       return (temp >= MT8173_TEMP_MIN) && (temp <= MT8173_TEMP_MAX);
+}
+
 /**
  * raw_to_mcelsius_v1 - convert a raw ADC value to mcelsius
  * @mt:        The thermal controller
@@ -815,6 +824,17 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank)
                temp = mt->raw_to_mcelsius(
                        mt, conf->bank_data[bank->id].sensors[i], raw);
 
+               /*
+                * Depending on the filt/sen intervals and ADC polling time,
+                * we may need up to 60 milliseconds after initialization: this
+                * will result in the first reading containing an out of range
+                * temperature value.
+                * Validate the reading to both address the aforementioned issue
+                * and to eventually avoid bogus readings during runtime in the
+                * event that the AUXADC gets unstable due to high EMI, etc.
+                */
+               if (!mtk_thermal_temp_is_valid(temp))
+                       temp = THERMAL_TEMP_INVALID;
 
                if (temp > max)
                        max = temp;
@@ -959,14 +979,12 @@ static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num,
 
 static u64 of_get_phys_base(struct device_node *np)
 {
-       u64 size64;
-       const __be32 *regaddr_p;
+       struct resource res;
 
-       regaddr_p = of_get_address(np, 0, &size64, NULL);
-       if (!regaddr_p)
+       if (of_address_to_resource(np, 0, &res))
                return OF_BAD_ADDR;
 
-       return of_translate_address(np, regaddr_p);
+       return res.start;
 }
 
 static int mtk_thermal_extract_efuse_v1(struct mtk_thermal *mt, u32 *buf)
@@ -1186,14 +1204,6 @@ static int mtk_thermal_probe(struct platform_device *pdev)
 
        mt->conf = of_device_get_match_data(&pdev->dev);
 
-       mt->clk_peri_therm = devm_clk_get(&pdev->dev, "therm");
-       if (IS_ERR(mt->clk_peri_therm))
-               return PTR_ERR(mt->clk_peri_therm);
-
-       mt->clk_auxadc = devm_clk_get(&pdev->dev, "auxadc");
-       if (IS_ERR(mt->clk_auxadc))
-               return PTR_ERR(mt->clk_auxadc);
-
        mt->thermal_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
        if (IS_ERR(mt->thermal_base))
                return PTR_ERR(mt->thermal_base);
@@ -1212,7 +1222,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
-       auxadc_base = of_iomap(auxadc, 0);
+       auxadc_base = devm_of_iomap(&pdev->dev, auxadc, 0, NULL);
+       if (IS_ERR(auxadc_base)) {
+               of_node_put(auxadc);
+               return PTR_ERR(auxadc_base);
+       }
+
        auxadc_phys_base = of_get_phys_base(auxadc);
 
        of_node_put(auxadc);
@@ -1228,7 +1243,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
-       apmixed_base = of_iomap(apmixedsys, 0);
+       apmixed_base = devm_of_iomap(&pdev->dev, apmixedsys, 0, NULL);
+       if (IS_ERR(apmixed_base)) {
+               of_node_put(apmixedsys);
+               return PTR_ERR(apmixed_base);
+       }
+
        apmixed_phys_base = of_get_phys_base(apmixedsys);
 
        of_node_put(apmixedsys);
@@ -1242,16 +1262,18 @@ static int mtk_thermal_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       ret = clk_prepare_enable(mt->clk_auxadc);
-       if (ret) {
+       mt->clk_auxadc = devm_clk_get_enabled(&pdev->dev, "auxadc");
+       if (IS_ERR(mt->clk_auxadc)) {
+               ret = PTR_ERR(mt->clk_auxadc);
                dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
                return ret;
        }
 
-       ret = clk_prepare_enable(mt->clk_peri_therm);
-       if (ret) {
+       mt->clk_peri_therm = devm_clk_get_enabled(&pdev->dev, "therm");
+       if (IS_ERR(mt->clk_peri_therm)) {
+               ret = PTR_ERR(mt->clk_peri_therm);
                dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
-               goto err_disable_clk_auxadc;
+               return ret;
        }
 
        mtk_thermal_turn_on_buffer(mt, apmixed_base);
@@ -1273,43 +1295,20 @@ static int mtk_thermal_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, mt);
 
-       /* Delay for thermal banks to be ready */
-       msleep(30);
-
        tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
                                              &mtk_thermal_ops);
-       if (IS_ERR(tzdev)) {
-               ret = PTR_ERR(tzdev);
-               goto err_disable_clk_peri_therm;
-       }
+       if (IS_ERR(tzdev))
+               return PTR_ERR(tzdev);
 
        ret = devm_thermal_add_hwmon_sysfs(&pdev->dev, tzdev);
        if (ret)
                dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");
 
        return 0;
-
-err_disable_clk_peri_therm:
-       clk_disable_unprepare(mt->clk_peri_therm);
-err_disable_clk_auxadc:
-       clk_disable_unprepare(mt->clk_auxadc);
-
-       return ret;
-}
-
-static int mtk_thermal_remove(struct platform_device *pdev)
-{
-       struct mtk_thermal *mt = platform_get_drvdata(pdev);
-
-       clk_disable_unprepare(mt->clk_peri_therm);
-       clk_disable_unprepare(mt->clk_auxadc);
-
-       return 0;
 }
 
 static struct platform_driver mtk_thermal_driver = {
        .probe = mtk_thermal_probe,
-       .remove = mtk_thermal_remove,
        .driver = {
                .name = "mtk-thermal",
                .of_match_table = mtk_thermal_of_match,
index c5025aca22eead49db3d4fd6da2bea1e9b0ef3f7..842f678c1c3e16153f44abdea0c5a4e95dbb7180 100644 (file)
@@ -1398,6 +1398,12 @@ int thermal_zone_device_id(struct thermal_zone_device *tzd)
 }
 EXPORT_SYMBOL_GPL(thermal_zone_device_id);
 
+struct device *thermal_zone_device(struct thermal_zone_device *tzd)
+{
+       return &tzd->device;
+}
+EXPORT_SYMBOL_GPL(thermal_zone_device);
+
 /**
  * thermal_zone_device_unregister - removes the registered thermal zone device
  * @tz: the thermal zone device to remove
index 82ddb32f987661023407df92ba5c0d5c7649aaf8..87837094d549f3df98254298a2c0e97342b22fc1 100644 (file)
@@ -313,6 +313,7 @@ thermal_zone_device_register_with_trips(const char *, struct thermal_trip *, int
 void *thermal_zone_device_priv(struct thermal_zone_device *tzd);
 const char *thermal_zone_device_type(struct thermal_zone_device *tzd);
 int thermal_zone_device_id(struct thermal_zone_device *tzd);
+struct device *thermal_zone_device(struct thermal_zone_device *tzd);
 
 int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
                                     struct thermal_cooling_device *,