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 */
 
        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");
 }
 
 
 {
        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;
 }
 
        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");
 }
 
 
                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;
 
        }
 
        data->mode = mode;
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return 0;
 }
        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;
 }
 
 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
 
                        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);
 
 
                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);
 
        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;
 }
 
        mutex_unlock(&tz->lock);
 
        data->mode = mode;
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return 0;
 }
 
 {
        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;
 }
 
                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)
 
        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;
 }
 
                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 */
 
 {
        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;
 }
 
                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;
 
 
        thermal_zone_set_trips(tz);
 
+       tz->notify_event = event;
+
        for (count = 0; count < tz->trips; count++)
                handle_thermal_trip(tz, count);
 }
        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 */
        if (ret)
                return ret;
 
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return count;
 }
 
        tz->forced_passive = state;
 
-       thermal_zone_device_update(tz);
+       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return count;
 }
        }
 
        if (!ret)
-               thermal_zone_device_update(tz);
+               thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
        return ret ? ret : count;
 }
        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;
        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;
 
                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:
 
        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);
        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);
 
 
        }
        if (notify) {
                pr_debug("thermal_zone_device_update\n");
-               thermal_zone_device_update(phdev->tzone);
+               thermal_zone_device_update(phdev->tzone,
+                                          THERMAL_EVENT_UNSPECIFIED);
        }
 }
 
 
        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 *);
  * @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;
        struct mutex lock;
        struct list_head node;
        struct delayed_work poll_queue;
+       enum thermal_notify_event notify_event;
 };
 
 /**
                                     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 *,
        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)
 { }