===================================================================
@@ -76,16 +76,29 @@ struct thermal_zone_device_ops {
void (*critical)(struct thermal_zone_device *);
};
+struct thermal_trip_ref {
+ struct thermal_trip *trip;
+};
+
/**
* struct thermal_trip - representation of a point in temperature domain
* @temperature: temperature value in miliCelsius
* @hysteresis: relative hysteresis in miliCelsius
* @type: trip point type
+ * @driver_ref: driver's reference to this trip point
+ *
+ * If @driver_ref is not NULL, the trip pointer in the object pointed to by it
+ * will be initialized by the core during thermal zone registration and updated
+ * whenever the location of the given trip object changes. This allows the
+ * driver to access the trip point data without knowing the relative ordering
+ * of trips within the trip table used by the core and, given a trip pointer,
+ * to get back to its private data associated with the given trip.
*/
struct thermal_trip {
int temperature;
int hysteresis;
enum thermal_trip_type type;
+ struct thermal_trip_ref *driver_ref;
};
struct thermal_cooling_device_ops {
===================================================================
@@ -1306,14 +1306,28 @@ thermal_zone_device_register_with_trips(
if (result)
goto release_device;
+ mutex_lock(&tz->lock);
+
for (count = 0; count < num_trips; count++) {
- struct thermal_trip trip;
+ int temperature = 0;
+
+ if (trips) {
+ temperature = trips[count].temperature;
+ if (trips[count].driver_ref)
+ trips[count].driver_ref->trip = &trips[count];
+ } else {
+ struct thermal_trip trip;
- result = thermal_zone_get_trip(tz, count, &trip);
- if (result || !trip.temperature)
+ result = __thermal_zone_get_trip(tz, count, &trip);
+ if (!result)
+ temperature = trip.temperature;
+ }
+ if (!temperature)
set_bit(count, &tz->trips_disabled);
}
+ mutex_unlock(&tz->lock);
+
/* Update 'this' zone's governor information */
mutex_lock(&thermal_governor_lock);