thermal: intel: Set THERMAL_TRIP_FLAG_RW_TEMP directly
[linux-2.6-microblaze.git] / drivers / thermal / intel / intel_soc_dts_iosf.c
index c008eb4..5a84c91 100644 (file)
@@ -202,16 +202,10 @@ static void remove_dts_thermal_zone(struct intel_soc_dts_sensor_entry *dts)
 }
 
 static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,
-                               struct thermal_trip *trips,
-                               bool critical_trip)
+                               struct thermal_trip *trips)
 {
-       int writable_trip_cnt = SOC_MAX_DTS_TRIPS;
        char name[10];
-       unsigned long trip;
-       int trip_mask;
-       unsigned long ptps;
        u32 store_ptps;
-       unsigned long i;
        int ret;
 
        /* Store status to restor on exit */
@@ -222,27 +216,21 @@ static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,
 
        dts->id = id;
 
-       if (critical_trip)
-               writable_trip_cnt--;
-
-       trip_mask = GENMASK(writable_trip_cnt - 1, 0);
-
        /* Check if the writable trip we provide is not used by BIOS */
        ret = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                            SOC_DTS_OFFSET_PTPS, &store_ptps);
-       if (ret)
-               trip_mask = 0;
-       else {
-               ptps = store_ptps;
-               for_each_set_clump8(i, trip, &ptps, writable_trip_cnt * 8)
-                       trip_mask &= ~BIT(i / 8);
+       if (!ret) {
+               int i;
+
+               for (i = 0; i <= 1; i++) {
+                       if (store_ptps & (0xFFU << i * 8))
+                               trips[i].flags &= ~THERMAL_TRIP_FLAG_RW_TEMP;
+               }
        }
-       dts->trip_mask = trip_mask;
        snprintf(name, sizeof(name), "soc_dts%d", id);
        dts->tzone = thermal_zone_device_register_with_trips(name, trips,
                                                             SOC_MAX_DTS_TRIPS,
-                                                            trip_mask,
-                                                            dts, &tzone_ops,
+                                                            0, dts, &tzone_ops,
                                                             NULL, 0, 0);
        if (IS_ERR(dts->tzone)) {
                ret = PTR_ERR(dts->tzone);
@@ -304,6 +292,14 @@ static void dts_trips_reset(struct intel_soc_dts_sensors *sensors, int dts_index
        update_trip_temp(sensors, 1, 0);
 }
 
+static void set_trip(struct thermal_trip *trip, enum thermal_trip_type type,
+                    u8 flags, int temp)
+{
+       trip->type = type;
+       trip->flags = flags;
+       trip->temperature = temp;
+}
+
 struct intel_soc_dts_sensors *
 intel_soc_dts_iosf_init(enum intel_soc_dts_interrupt_type intr_type,
                        bool critical_trip, int crit_offset)
@@ -331,36 +327,33 @@ intel_soc_dts_iosf_init(enum intel_soc_dts_interrupt_type intr_type,
        sensors->tj_max = tj_max * 1000;
 
        for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
-               enum thermal_trip_type trip_type;
                int temp;
 
                sensors->soc_dts[i].sensors = sensors;
 
+               set_trip(&trips[i][0], THERMAL_TRIP_PASSIVE,
+                        THERMAL_TRIP_FLAG_RW_TEMP, 0);
+
                ret = update_trip_temp(sensors, 0, 0);
                if (ret)
                        goto err_reset_trips;
 
-               trips[i][0].type = THERMAL_TRIP_PASSIVE;
-               trips[i][0].temperature = 0;
-
                if (critical_trip) {
-                       trip_type = THERMAL_TRIP_CRITICAL;
                        temp = sensors->tj_max - crit_offset;
+                       set_trip(&trips[i][1], THERMAL_TRIP_CRITICAL, 0, temp);
                } else {
-                       trip_type = THERMAL_TRIP_PASSIVE;
+                       set_trip(&trips[i][1], THERMAL_TRIP_PASSIVE,
+                                THERMAL_TRIP_FLAG_RW_TEMP, 0);
                        temp = 0;
                }
+
                ret = update_trip_temp(sensors, 1, temp);
                if (ret)
                        goto err_reset_trips;
-
-               trips[i][1].type = trip_type;
-               trips[i][1].temperature = temp;
        }
 
        for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
-               ret = add_dts_thermal_zone(i, &sensors->soc_dts[i], trips[i],
-                                          critical_trip);
+               ret = add_dts_thermal_zone(i, &sensors->soc_dts[i], trips[i]);
                if (ret)
                        goto err_remove_zone;
        }