]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
thermal: Enhance thermal_zone_device_update for events
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Fri, 26 Aug 2016 23:21:16 +0000 (16:21 -0700)
committerZhang Rui <rui.zhang@intel.com>
Tue, 27 Sep 2016 06:35:21 +0000 (14:35 +0800)
Added one additional parameter to thermal_zone_device_update() to provide
caller with an optional capability to specify reason.
Currently this event is used by user space governor to trigger different
processing based on event code. Also it saves an additional call to read
temperature when the event is received.
The following events are cuurently defined:
- Unspecified event
- New temperature sample
- Trip point violated
- Trip point changed
- thermal device up and down
- thermal device power capability changed

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
20 files changed:
drivers/acpi/thermal.c
drivers/platform/x86/acerhdf.c
drivers/regulator/max8973-regulator.c
drivers/thermal/db8500_thermal.c
drivers/thermal/hisi_thermal.c
drivers/thermal/imx_thermal.c
drivers/thermal/int340x_thermal/int340x_thermal_zone.h
drivers/thermal/intel_bxt_pmic_thermal.c
drivers/thermal/intel_soc_dts_iosf.c
drivers/thermal/max77620_thermal.c
drivers/thermal/of-thermal.c
drivers/thermal/qcom-spmi-temp-alarm.c
drivers/thermal/rcar_thermal.c
drivers/thermal/rockchip_thermal.c
drivers/thermal/samsung/exynos_tmu.c
drivers/thermal/st/st_thermal_memmap.c
drivers/thermal/thermal_core.c
drivers/thermal/ti-soc-thermal/ti-thermal-common.c
drivers/thermal/x86_pkg_temp_thermal.c
include/linux/thermal.h

index f4ebe39539afb1cb2d986dd77c3371eeb3fcaf00..35e8fbca10ad5eb847b82f028600ebfb738203a5 100644 (file)
@@ -520,7 +520,8 @@ static void acpi_thermal_check(void *data)
        if (!tz->tz_enabled)
                return;
 
-       thermal_zone_device_update(tz->thermal_zone);
+       thermal_zone_device_update(tz->thermal_zone,
+                                  THERMAL_EVENT_UNSPECIFIED);
 }
 
 /* sys I/F for generic thermal sysfs support */
index 460fa6708bfccbc6774284fc859a877d750d02b3..2acdb0d6ea8983f82ed23a28e2408ab37a6f0ce7 100644 (file)
@@ -405,7 +405,7 @@ static inline void acerhdf_enable_kernelmode(void)
        kernelmode = 1;
 
        thz_dev->polling_delay = interval*1000;
-       thermal_zone_device_update(thz_dev);
+       thermal_zone_device_update(thz_dev, THERMAL_EVENT_UNSPECIFIED);
        pr_notice("kernel mode fan control ON\n");
 }
 
index 3958f50c5975c4d7bb012016fc2871525efe07ec..e0c747aa9f851d5e394f59348d6b531bf1c7b664 100644 (file)
@@ -495,7 +495,8 @@ static irqreturn_t max8973_thermal_irq(int irq, void *data)
 {
        struct max8973_chip *mchip = data;
 
-       thermal_zone_device_update(mchip->tz_device);
+       thermal_zone_device_update(mchip->tz_device,
+                                  THERMAL_EVENT_UNSPECIFIED);
 
        return IRQ_HANDLED;
 }
index 652acd8fbe48e2334ab887df96272859f12c11bf..e776cea80cfcb19bc61c12908b71969a55f3e64e 100644 (file)
@@ -306,7 +306,7 @@ static void db8500_thermal_work(struct work_struct *work)
        if (cur_mode == THERMAL_DEVICE_DISABLED)
                return;
 
-       thermal_zone_device_update(pzone->therm_dev);
+       thermal_zone_device_update(pzone->therm_dev, THERMAL_EVENT_UNSPECIFIED);
        dev_dbg(&pzone->therm_dev->device, "thermal work finished.\n");
 }
 
index 97fad8f51e1c891ec26a296e25a6059419e529a0..f6429666a1cfe03d1f122266938a5343cf744054 100644 (file)
@@ -237,7 +237,8 @@ static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, void *dev)
                if (!data->sensors[i].tzd)
                        continue;
 
-               thermal_zone_device_update(data->sensors[i].tzd);
+               thermal_zone_device_update(data->sensors[i].tzd,
+                                          THERMAL_EVENT_UNSPECIFIED);
        }
 
        return IRQ_HANDLED;
index e473548b5d289d7dda47bdd8c423209fc1ab245f..06912f0602b75ba1a7d801babc686f5305838b59 100644 (file)
@@ -246,7 +246,7 @@ static int imx_set_mode(struct thermal_zone_device *tz,
        }
 
        data->mode = mode;
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return 0;
 }
@@ -457,7 +457,7 @@ static irqreturn_t imx_thermal_alarm_irq_thread(int irq, void *dev)
        dev_dbg(&data->tz->device, "THERMAL ALARM: T > %d\n",
                data->alarm_temp / 1000);
 
-       thermal_zone_device_update(data->tz);
+       thermal_zone_device_update(data->tz, THERMAL_EVENT_UNSPECIFIED);
 
        return IRQ_HANDLED;
 }
index aaadf724ff2ef858807715ae395b2aef9c0b740e..65116b1f19f12fcda379dd18b04e48b5858e131e 100644 (file)
@@ -62,7 +62,7 @@ static inline void *int340x_thermal_zone_get_priv_data(
 static inline void int340x_thermal_zone_device_update(
                        struct int34x_thermal_zone *tzone)
 {
-       thermal_zone_device_update(tzone->zone);
+       thermal_zone_device_update(tzone->zone, THERMAL_EVENT_UNSPECIFIED);
 }
 
 #endif
index 4ae3e0c1576a641eccd58512abbe5ac570c93ca8..0f19a393ddd88fec064951291c4c2db007fea8ec 100644 (file)
@@ -204,7 +204,8 @@ static irqreturn_t pmic_thermal_irq_handler(int irq, void *data)
                        trip = td->maps[i].trip_config[j].trip_num;
                        tzd = thermal_zone_get_zone_by_name(td->maps[i].handle);
                        if (!IS_ERR(tzd))
-                               thermal_zone_device_update(tzd);
+                               thermal_zone_device_update(tzd,
+                                               THERMAL_EVENT_UNSPECIFIED);
 
                        /* Clear the appropriate irq */
                        regmap_write(regmap, reg, reg_val & mask);
index f72e1db3216f6f446458467964c9108986ea8c4f..e0813dfaa2783c17ea43012df3cedf2f70b11f3f 100644 (file)
@@ -391,7 +391,8 @@ void intel_soc_dts_iosf_interrupt_handler(struct intel_soc_dts_sensors *sensors)
 
                for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
                        pr_debug("TZD update for zone %d\n", i);
-                       thermal_zone_device_update(sensors->soc_dts[i].tzone);
+                       thermal_zone_device_update(sensors->soc_dts[i].tzone,
+                                                  THERMAL_EVENT_UNSPECIFIED);
                }
        } else
                spin_unlock_irqrestore(&sensors->intr_notify_lock, flags);
index 8d6162676f6833ff0edba116f83f978b4bbfd78c..83905ff46e40e14904c1197521455b6d813f55e6 100644 (file)
@@ -82,7 +82,8 @@ static irqreturn_t max77620_thermal_irq(int irq, void *data)
        else if (irq == mtherm->irq_tjalarm2)
                dev_crit(mtherm->dev, "Junction Temp Alarm2(140C) occurred\n");
 
-       thermal_zone_device_update(mtherm->tz_device);
+       thermal_zone_device_update(mtherm->tz_device,
+                                  THERMAL_EVENT_UNSPECIFIED);
 
        return IRQ_HANDLED;
 }
index ab6e5260a901d99941eaf406646de239debd5c57..d04ec3b9e5ff21f68aa4a25d4a9d3e4caef0f4ec 100644 (file)
@@ -286,7 +286,7 @@ static int of_thermal_set_mode(struct thermal_zone_device *tz,
        mutex_unlock(&tz->lock);
 
        data->mode = mode;
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return 0;
 }
index f8a3c60bef94bcf32ca388ab0c2de8de034dab7c..819c6d5d7aa714914b6611fb306fd74bea48344c 100644 (file)
@@ -150,7 +150,7 @@ static irqreturn_t qpnp_tm_isr(int irq, void *data)
 {
        struct qpnp_tm_chip *chip = data;
 
-       thermal_zone_device_update(chip->tz_dev);
+       thermal_zone_device_update(chip->tz_dev, THERMAL_EVENT_UNSPECIFIED);
 
        return IRQ_HANDLED;
 }
index b5c6442d82d62b09024eca874a8ffb6b4065b1aa..6c73d3ecf33bba3515afed258b6572fb7cc90865 100644 (file)
@@ -358,7 +358,8 @@ static void rcar_thermal_work(struct work_struct *work)
                return;
 
        if (nctemp != cctemp)
-               thermal_zone_device_update(priv->zone);
+               thermal_zone_device_update(priv->zone,
+                                          THERMAL_EVENT_UNSPECIFIED);
 }
 
 static u32 rcar_thermal_had_changed(struct rcar_thermal_priv *priv, u32 status)
index 1f165c990c85c332c44132dcb1d1a5ebec102d48..e227a9f0acf71c52917a91b8986c9fc4c4d17e31 100644 (file)
@@ -873,7 +873,8 @@ static irqreturn_t rockchip_thermal_alarm_irq_thread(int irq, void *dev)
        thermal->chip->irq_ack(thermal->regs);
 
        for (i = 0; i < thermal->chip->chn_num; i++)
-               thermal_zone_device_update(thermal->sensors[i].tzd);
+               thermal_zone_device_update(thermal->sensors[i].tzd,
+                                          THERMAL_EVENT_UNSPECIFIED);
 
        return IRQ_HANDLED;
 }
index f3ce94ec73b513595e1297a0a222cd8cb3efa5c3..ad1186dd6132c3ca74f7df209605a25745b16cac 100644 (file)
@@ -225,7 +225,7 @@ static void exynos_report_trigger(struct exynos_tmu_data *p)
                return;
        }
 
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        mutex_lock(&tz->lock);
        /* Find the level for which trip happened */
index fc0c9e198710327bbd10983b895eac4d740bb258..91d42319de27279c8e8367e09dac108d6cabc561 100644 (file)
@@ -42,7 +42,8 @@ static irqreturn_t st_mmap_thermal_trip_handler(int irq, void *sdata)
 {
        struct st_thermal_sensor *sensor = sdata;
 
-       thermal_zone_device_update(sensor->thermal_dev);
+       thermal_zone_device_update(sensor->thermal_dev,
+                                  THERMAL_EVENT_UNSPECIFIED);
 
        return IRQ_HANDLED;
 }
index f2d55e478b2a70f367efd2d6f609e029feaf464b..226b0b4aced6a2e9fd348086259fc517e3f674ee 100644 (file)
@@ -607,7 +607,8 @@ static void thermal_zone_device_reset(struct thermal_zone_device *tz)
                pos->initialized = false;
 }
 
-void thermal_zone_device_update(struct thermal_zone_device *tz)
+void thermal_zone_device_update(struct thermal_zone_device *tz,
+                               enum thermal_notify_event event)
 {
        int count;
 
@@ -621,6 +622,8 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
 
        thermal_zone_set_trips(tz);
 
+       tz->notify_event = event;
+
        for (count = 0; count < tz->trips; count++)
                handle_thermal_trip(tz, count);
 }
@@ -631,7 +634,7 @@ static void thermal_zone_device_check(struct work_struct *work)
        struct thermal_zone_device *tz = container_of(work, struct
                                                      thermal_zone_device,
                                                      poll_queue.work);
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 }
 
 /* sys I/F for thermal zone */
@@ -755,7 +758,7 @@ trip_point_temp_store(struct device *dev, struct device_attribute *attr,
        if (ret)
                return ret;
 
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return count;
 }
@@ -877,7 +880,7 @@ passive_store(struct device *dev, struct device_attribute *attr,
 
        tz->forced_passive = state;
 
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return count;
 }
@@ -968,7 +971,7 @@ emul_temp_store(struct device *dev, struct device_attribute *attr,
        }
 
        if (!ret)
-               thermal_zone_device_update(tz);
+               thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return ret ? ret : count;
 }
@@ -1564,7 +1567,8 @@ __thermal_cooling_device_register(struct device_node *np,
        mutex_lock(&thermal_list_lock);
        list_for_each_entry(pos, &thermal_tz_list, node)
                if (atomic_cmpxchg(&pos->need_update, 1, 0))
-                       thermal_zone_device_update(pos);
+                       thermal_zone_device_update(pos,
+                                                  THERMAL_EVENT_UNSPECIFIED);
        mutex_unlock(&thermal_list_lock);
 
        return cdev;
@@ -2007,7 +2011,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
        thermal_zone_device_reset(tz);
        /* Update the new thermal zone and mark it as already updated. */
        if (atomic_cmpxchg(&tz->need_update, 1, 0))
-               thermal_zone_device_update(tz);
+               thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return tz;
 
@@ -2294,7 +2298,8 @@ static int thermal_pm_notify(struct notifier_block *nb,
                atomic_set(&in_suspend, 0);
                list_for_each_entry(tz, &thermal_tz_list, node) {
                        thermal_zone_device_reset(tz);
-                       thermal_zone_device_update(tz);
+                       thermal_zone_device_update(tz,
+                                                  THERMAL_EVENT_UNSPECIFIED);
                }
                break;
        default:
index 4a6757ca78f056cc7858e861d0cd3fcd1fba83f2..0586bd0f2bab676f1c780bc1bc0499919ed5f88e 100644 (file)
@@ -52,7 +52,7 @@ static void ti_thermal_work(struct work_struct *work)
        struct ti_thermal_data *data = container_of(work,
                                        struct ti_thermal_data, thermal_wq);
 
-       thermal_zone_device_update(data->ti_thermal);
+       thermal_zone_device_update(data->ti_thermal, THERMAL_EVENT_UNSPECIFIED);
 
        dev_dbg(&data->ti_thermal->device, "updated thermal zone %s\n",
                data->ti_thermal->type);
@@ -205,7 +205,7 @@ static int ti_thermal_set_mode(struct thermal_zone_device *thermal,
        data->mode = mode;
        ti_bandgap_write_update_interval(bgp, data->sensor_id,
                                        data->ti_thermal->polling_delay);
-       thermal_zone_device_update(data->ti_thermal);
+       thermal_zone_device_update(data->ti_thermal, THERMAL_EVENT_UNSPECIFIED);
        dev_dbg(&thermal->device, "thermal polling set for duration=%d msec\n",
                data->ti_thermal->polling_delay);
 
index 97f0a2bd93edfb64bc326adf29724bf456548ad8..95f4c1bcdb4caf069df9f70dbe63ec3ae64b7908 100644 (file)
@@ -348,7 +348,8 @@ static void pkg_temp_thermal_threshold_work_fn(struct work_struct *work)
        }
        if (notify) {
                pr_debug("thermal_zone_device_update\n");
-               thermal_zone_device_update(phdev->tzone);
+               thermal_zone_device_update(phdev->tzone,
+                                          THERMAL_EVENT_UNSPECIFIED);
        }
 }
 
index b3c16f06fdc40df5bebfdadc22c582fe504037aa..511182a88e76416ded9f506f1af2db76bddf2e32 100644 (file)
@@ -92,6 +92,17 @@ enum thermal_trend {
        THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */
 };
 
+/* Thermal notification reason */
+enum thermal_notify_event {
+       THERMAL_EVENT_UNSPECIFIED, /* Unspecified event */
+       THERMAL_EVENT_TEMP_SAMPLE, /* New Temperature sample */
+       THERMAL_TRIP_VIOLATED, /* TRIP Point violation */
+       THERMAL_TRIP_CHANGED, /* TRIP Point temperature changed */
+       THERMAL_DEVICE_DOWN, /* Thermal device is down */
+       THERMAL_DEVICE_UP, /* Thermal device is up after a down event */
+       THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */
+};
+
 struct thermal_zone_device_ops {
        int (*bind) (struct thermal_zone_device *,
                     struct thermal_cooling_device *);
@@ -187,6 +198,7 @@ struct thermal_attr {
  * @lock:      lock to protect thermal_instances list
  * @node:      node in thermal_tz_list (in thermal_core.c)
  * @poll_queue:        delayed work for polling
+ * @notify_event: Last notification event
  */
 struct thermal_zone_device {
        int id;
@@ -217,6 +229,7 @@ struct thermal_zone_device {
        struct mutex lock;
        struct list_head node;
        struct delayed_work poll_queue;
+       enum thermal_notify_event notify_event;
 };
 
 /**
@@ -436,7 +449,8 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
                                     unsigned int);
 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
                                       struct thermal_cooling_device *);
-void thermal_zone_device_update(struct thermal_zone_device *);
+void thermal_zone_device_update(struct thermal_zone_device *,
+                               enum thermal_notify_event);
 void thermal_zone_set_trips(struct thermal_zone_device *);
 
 struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
@@ -487,7 +501,8 @@ static inline int thermal_zone_unbind_cooling_device(
        struct thermal_zone_device *tz, int trip,
        struct thermal_cooling_device *cdev)
 { return -ENODEV; }
-static inline void thermal_zone_device_update(struct thermal_zone_device *tz)
+static inline void thermal_zone_device_update(struct thermal_zone_device *tz,
+                                             enum thermal_notify_event event)
 { }
 static inline void thermal_zone_set_trips(struct thermal_zone_device *tz)
 { }