hwmon: (nct6775) Only display fan speed tolerance conditionally
authorGuenter Roeck <linux@roeck-us.net>
Mon, 17 Sep 2018 16:24:11 +0000 (09:24 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Thu, 11 Oct 2018 03:37:13 +0000 (20:37 -0700)
A fan speed tolerance only makes sense if a fan target speed has been
configured in the first place. Otherwise we get odd output such as

fan1_target:0
fan1_tolerance:337500

Only display values other than 0 if a fan target speed has been configured.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/nct6775.c

index 2b493d0682aff6f0b97dcb377cbc9b9428e35156..2a9fc8c9fb9e33f7f5e4955a26403cdd12a369ba 100644 (file)
@@ -2847,6 +2847,8 @@ store_temp_tolerance(struct device *dev, struct device_attribute *attr,
  * Fan speed tolerance is a tricky beast, since the associated register is
  * a tick counter, but the value is reported and configured as rpm.
  * Compute resulting low and high rpm values and report the difference.
+ * A fan speed tolerance only makes sense if a fan target speed has been
+ * configured, so only display values other than 0 if that is the case.
  */
 static ssize_t
 show_speed_tolerance(struct device *dev, struct device_attribute *attr,
@@ -2855,19 +2857,23 @@ show_speed_tolerance(struct device *dev, struct device_attribute *attr,
        struct nct6775_data *data = nct6775_update_device(dev);
        struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
        int nr = sattr->index;
-       int low = data->target_speed[nr] - data->target_speed_tolerance[nr];
-       int high = data->target_speed[nr] + data->target_speed_tolerance[nr];
-       int tolerance;
-
-       if (low <= 0)
-               low = 1;
-       if (high > 0xffff)
-               high = 0xffff;
-       if (high < low)
-               high = low;
-
-       tolerance = (fan_from_reg16(low, data->fan_div[nr])
-                    - fan_from_reg16(high, data->fan_div[nr])) / 2;
+       int target = data->target_speed[nr];
+       int tolerance = 0;
+
+       if (target) {
+               int low = target - data->target_speed_tolerance[nr];
+               int high = target + data->target_speed_tolerance[nr];
+
+               if (low <= 0)
+                       low = 1;
+               if (high > 0xffff)
+                       high = 0xffff;
+               if (high < low)
+                       high = low;
+
+               tolerance = (fan_from_reg16(low, data->fan_div[nr])
+                            - fan_from_reg16(high, data->fan_div[nr])) / 2;
+       }
 
        return sprintf(buf, "%d\n", tolerance);
 }