These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / thermal / of-thermal.c
index 668fb1b..be4eedc 100644 (file)
@@ -58,6 +58,8 @@ struct __thermal_bind_params {
  * @mode: current thermal zone device mode (enabled/disabled)
  * @passive_delay: polling interval while passive cooling is activated
  * @polling_delay: zone polling interval
+ * @slope: slope of the temperature adjustment curve
+ * @offset: offset of the temperature adjustment curve
  * @ntrips: number of trip points
  * @trips: an array of trip points (0..ntrips - 1)
  * @num_tbps: number of thermal bind params
@@ -70,6 +72,8 @@ struct __thermal_zone {
        enum thermal_device_mode mode;
        int passive_delay;
        int polling_delay;
+       int slope;
+       int offset;
 
        /* trip data */
        int ntrips;
@@ -87,7 +91,7 @@ struct __thermal_zone {
 /***   DT thermal zone device callbacks   ***/
 
 static int of_thermal_get_temp(struct thermal_zone_device *tz,
-                              unsigned long *temp)
+                              int *temp)
 {
        struct __thermal_zone *data = tz->devdata;
 
@@ -173,7 +177,7 @@ EXPORT_SYMBOL_GPL(of_thermal_get_trip_points);
  * Return: zero on success, error code otherwise
  */
 static int of_thermal_set_emul_temp(struct thermal_zone_device *tz,
-                                   unsigned long temp)
+                                   int temp)
 {
        struct __thermal_zone *data = tz->devdata;
 
@@ -227,7 +231,8 @@ static int of_thermal_bind(struct thermal_zone_device *thermal,
                        ret = thermal_zone_bind_cooling_device(thermal,
                                                tbp->trip_id, cdev,
                                                tbp->max,
-                                               tbp->min);
+                                               tbp->min,
+                                               tbp->usage);
                        if (ret)
                                return ret;
                }
@@ -306,7 +311,7 @@ static int of_thermal_get_trip_type(struct thermal_zone_device *tz, int trip,
 }
 
 static int of_thermal_get_trip_temp(struct thermal_zone_device *tz, int trip,
-                                   unsigned long *temp)
+                                   int *temp)
 {
        struct __thermal_zone *data = tz->devdata;
 
@@ -319,7 +324,7 @@ static int of_thermal_get_trip_temp(struct thermal_zone_device *tz, int trip,
 }
 
 static int of_thermal_set_trip_temp(struct thermal_zone_device *tz, int trip,
-                                   unsigned long temp)
+                                   int temp)
 {
        struct __thermal_zone *data = tz->devdata;
 
@@ -333,7 +338,7 @@ static int of_thermal_set_trip_temp(struct thermal_zone_device *tz, int trip,
 }
 
 static int of_thermal_get_trip_hyst(struct thermal_zone_device *tz, int trip,
-                                   unsigned long *hyst)
+                                   int *hyst)
 {
        struct __thermal_zone *data = tz->devdata;
 
@@ -346,7 +351,7 @@ static int of_thermal_get_trip_hyst(struct thermal_zone_device *tz, int trip,
 }
 
 static int of_thermal_set_trip_hyst(struct thermal_zone_device *tz, int trip,
-                                   unsigned long hyst)
+                                   int hyst)
 {
        struct __thermal_zone *data = tz->devdata;
 
@@ -360,7 +365,7 @@ static int of_thermal_set_trip_hyst(struct thermal_zone_device *tz, int trip,
 }
 
 static int of_thermal_get_crit_temp(struct thermal_zone_device *tz,
-                                   unsigned long *temp)
+                                   int *temp)
 {
        struct __thermal_zone *data = tz->devdata;
        int i;
@@ -581,7 +586,7 @@ static int thermal_of_populate_bind_params(struct device_node *np,
        u32 prop;
 
        /* Default weight. Usage is optional */
-       __tbp->usage = 0;
+       __tbp->usage = THERMAL_WEIGHT_DEFAULT;
        ret = of_property_read_u32(np, "contribution", &prop);
        if (ret == 0)
                __tbp->usage = prop;
@@ -715,7 +720,7 @@ static int thermal_of_populate_trip(struct device_node *np,
  * @np parameter and fills the read data into a __thermal_zone data structure
  * and return this pointer.
  *
- * TODO: Missing properties to parse: thermal-sensor-names and coefficients
+ * TODO: Missing properties to parse: thermal-sensor-names
  *
  * Return: On success returns a valid struct __thermal_zone,
  * otherwise, it returns a corresponding ERR_PTR(). Caller must
@@ -727,7 +732,7 @@ thermal_of_build_thermal_zone(struct device_node *np)
        struct device_node *child = NULL, *gchild;
        struct __thermal_zone *tz;
        int ret, i;
-       u32 prop;
+       u32 prop, coef[2];
 
        if (!np) {
                pr_err("no thermal zone np\n");
@@ -752,6 +757,20 @@ thermal_of_build_thermal_zone(struct device_node *np)
        }
        tz->polling_delay = prop;
 
+       /*
+        * REVIST: for now, the thermal framework supports only
+        * one sensor per thermal zone. Thus, we are considering
+        * only the first two values as slope and offset.
+        */
+       ret = of_property_read_u32_array(np, "coefficients", coef, 2);
+       if (ret == 0) {
+               tz->slope = coef[0];
+               tz->offset = coef[1];
+       } else {
+               tz->slope = 1;
+               tz->offset = 0;
+       }
+
        /* trips */
        child = of_get_child_by_name(np, "trips");
 
@@ -865,6 +884,8 @@ int __init of_parse_thermal_zones(void)
        for_each_child_of_node(np, child) {
                struct thermal_zone_device *zone;
                struct thermal_zone_params *tzp;
+               int i, mask = 0;
+               u32 prop;
 
                /* Check whether child is enabled or not */
                if (!of_device_is_available(child))
@@ -891,8 +912,18 @@ int __init of_parse_thermal_zones(void)
                /* No hwmon because there might be hwmon drivers registering */
                tzp->no_hwmon = true;
 
+               if (!of_property_read_u32(child, "sustainable-power", &prop))
+                       tzp->sustainable_power = prop;
+
+               for (i = 0; i < tz->ntrips; i++)
+                       mask |= 1 << i;
+
+               /* these two are left for temperature drivers to use */
+               tzp->slope = tz->slope;
+               tzp->offset = tz->offset;
+
                zone = thermal_zone_device_register(child->name, tz->ntrips,
-                                                   0, tz,
+                                                   mask, tz,
                                                    ops, tzp,
                                                    tz->passive_delay,
                                                    tz->polling_delay);
@@ -933,7 +964,7 @@ void of_thermal_destroy_zones(void)
 
        np = of_find_node_by_name(NULL, "thermal-zones");
        if (!np) {
-               pr_err("unable to find thermal zones\n");
+               pr_debug("unable to find thermal zones\n");
                return;
        }