select: remove unused MAX_SELECT_SECONDS
[firefly-linux-kernel-4.4.55.git] / drivers / hwmon / lm85.c
index d2cc28660816623fc03f79445d825d7e95c5134a..cf47e6e476eddb35a5dbc98441ea6b533227f5ae 100644 (file)
@@ -41,7 +41,7 @@ static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
 enum chips {
        any_chip, lm85b, lm85c,
        adm1027, adt7463, adt7468,
-       emc6d100, emc6d102, emc6d103
+       emc6d100, emc6d102, emc6d103, emc6d103s
 };
 
 /* The LM85 registers */
@@ -283,10 +283,6 @@ struct lm85_zone {
        u8 hyst;        /* Low limit hysteresis. (0-15) */
        u8 range;       /* Temp range, encoded */
        s8 critical;    /* "All fans ON" temp limit */
-       u8 off_desired; /* Actual "off" temperature specified.  Preserved
-                        * to prevent "drift" as other autofan control
-                        * values change.
-                        */
        u8 max_desired; /* Actual "max" temperature specified.  Preserved
                         * to prevent "drift" as other autofan control
                         * values change.
@@ -306,6 +302,8 @@ struct lm85_data {
        const int *freq_map;
        enum chips type;
 
+       bool has_vid5;  /* true if VID5 is configured for ADT7463 or ADT7468 */
+
        struct mutex update_lock;
        int valid;              /* !=0 if following fields are valid */
        unsigned long last_reading;     /* In jiffies */
@@ -352,6 +350,7 @@ static const struct i2c_device_id lm85_id[] = {
        { "emc6d101", emc6d100 },
        { "emc6d102", emc6d102 },
        { "emc6d103", emc6d103 },
+       { "emc6d103s", emc6d103s },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, lm85_id);
@@ -420,8 +419,7 @@ static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,
        struct lm85_data *data = lm85_update_device(dev);
        int vid;
 
-       if ((data->type == adt7463 || data->type == adt7468) &&
-           (data->vid & 0x80)) {
+       if (data->has_vid5) {
                /* 6-pin VID (VRM 10) */
                vid = vid_from_reg(data->vid & 0x3f, data->vrm);
        } else {
@@ -891,7 +889,6 @@ static ssize_t set_temp_auto_temp_off(struct device *dev,
 
        mutex_lock(&data->update_lock);
        min = TEMP_FROM_REG(data->zone[nr].limit);
-       data->zone[nr].off_desired = TEMP_TO_REG(val);
        data->zone[nr].hyst = HYST_TO_REG(min - val);
        if (nr == 0 || nr == 1) {
                lm85_write_value(client, LM85_REG_AFAN_HYST1,
@@ -934,18 +931,6 @@ static ssize_t set_temp_auto_temp_min(struct device *dev,
                ((data->zone[nr].range & 0x0f) << 4)
                | (data->pwm_freq[nr] & 0x07));
 
-/* Update temp_auto_hyst and temp_auto_off */
-       data->zone[nr].hyst = HYST_TO_REG(TEMP_FROM_REG(
-               data->zone[nr].limit) - TEMP_FROM_REG(
-               data->zone[nr].off_desired));
-       if (nr == 0 || nr == 1) {
-               lm85_write_value(client, LM85_REG_AFAN_HYST1,
-                       (data->zone[0].hyst << 4)
-                       | data->zone[1].hyst);
-       } else {
-               lm85_write_value(client, LM85_REG_AFAN_HYST2,
-                       (data->zone[2].hyst << 4));
-       }
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -1084,13 +1069,7 @@ static struct attribute *lm85_attributes[] = {
        &sensor_dev_attr_pwm1_auto_pwm_min.dev_attr.attr,
        &sensor_dev_attr_pwm2_auto_pwm_min.dev_attr.attr,
        &sensor_dev_attr_pwm3_auto_pwm_min.dev_attr.attr,
-       &sensor_dev_attr_pwm1_auto_pwm_minctl.dev_attr.attr,
-       &sensor_dev_attr_pwm2_auto_pwm_minctl.dev_attr.attr,
-       &sensor_dev_attr_pwm3_auto_pwm_minctl.dev_attr.attr,
 
-       &sensor_dev_attr_temp1_auto_temp_off.dev_attr.attr,
-       &sensor_dev_attr_temp2_auto_temp_off.dev_attr.attr,
-       &sensor_dev_attr_temp3_auto_temp_off.dev_attr.attr,
        &sensor_dev_attr_temp1_auto_temp_min.dev_attr.attr,
        &sensor_dev_attr_temp2_auto_temp_min.dev_attr.attr,
        &sensor_dev_attr_temp3_auto_temp_min.dev_attr.attr,
@@ -1111,6 +1090,26 @@ static const struct attribute_group lm85_group = {
        .attrs = lm85_attributes,
 };
 
+static struct attribute *lm85_attributes_minctl[] = {
+       &sensor_dev_attr_pwm1_auto_pwm_minctl.dev_attr.attr,
+       &sensor_dev_attr_pwm2_auto_pwm_minctl.dev_attr.attr,
+       &sensor_dev_attr_pwm3_auto_pwm_minctl.dev_attr.attr,
+};
+
+static const struct attribute_group lm85_group_minctl = {
+       .attrs = lm85_attributes_minctl,
+};
+
+static struct attribute *lm85_attributes_temp_off[] = {
+       &sensor_dev_attr_temp1_auto_temp_off.dev_attr.attr,
+       &sensor_dev_attr_temp2_auto_temp_off.dev_attr.attr,
+       &sensor_dev_attr_temp3_auto_temp_off.dev_attr.attr,
+};
+
+static const struct attribute_group lm85_group_temp_off = {
+       .attrs = lm85_attributes_temp_off,
+};
+
 static struct attribute *lm85_attributes_in4[] = {
        &sensor_dev_attr_in4_input.dev_attr.attr,
        &sensor_dev_attr_in4_min.dev_attr.attr,
@@ -1258,16 +1257,9 @@ static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info)
                case LM85_VERSTEP_EMC6D103_A1:
                        type_name = "emc6d103";
                        break;
-               /*
-                * Registers apparently missing in EMC6D103S/EMC6D103:A2
-                * compared to EMC6D103:A0, EMC6D103:A1, and EMC6D102
-                * (according to the data sheets), but used unconditionally
-                * in the driver: 62[5:7], 6D[0:7], and 6E[0:7].
-                * So skip EMC6D103S for now.
                case LM85_VERSTEP_EMC6D103S:
                        type_name = "emc6d103s";
                        break;
-                */
                }
        } else {
                dev_dbg(&adapter->dev,
@@ -1280,6 +1272,19 @@ static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info)
        return 0;
 }
 
+static void lm85_remove_files(struct i2c_client *client, struct lm85_data *data)
+{
+       sysfs_remove_group(&client->dev.kobj, &lm85_group);
+       if (data->type != emc6d103s) {
+               sysfs_remove_group(&client->dev.kobj, &lm85_group_minctl);
+               sysfs_remove_group(&client->dev.kobj, &lm85_group_temp_off);
+       }
+       if (!data->has_vid5)
+               sysfs_remove_group(&client->dev.kobj, &lm85_group_in4);
+       if (data->type == emc6d100)
+               sysfs_remove_group(&client->dev.kobj, &lm85_group_in567);
+}
+
 static int lm85_probe(struct i2c_client *client,
                      const struct i2c_device_id *id)
 {
@@ -1302,6 +1307,7 @@ static int lm85_probe(struct i2c_client *client,
        case emc6d100:
        case emc6d102:
        case emc6d103:
+       case emc6d103s:
                data->freq_map = adm1027_freq_map;
                break;
        default:
@@ -1319,11 +1325,26 @@ static int lm85_probe(struct i2c_client *client,
        if (err)
                goto err_kfree;
 
+       /* minctl and temp_off exist on all chips except emc6d103s */
+       if (data->type != emc6d103s) {
+               err = sysfs_create_group(&client->dev.kobj, &lm85_group_minctl);
+               if (err)
+                       goto err_kfree;
+               err = sysfs_create_group(&client->dev.kobj,
+                                        &lm85_group_temp_off);
+               if (err)
+                       goto err_kfree;
+       }
+
        /* The ADT7463/68 have an optional VRM 10 mode where pin 21 is used
           as a sixth digital VID input rather than an analog input. */
-       data->vid = lm85_read_value(client, LM85_REG_VID);
-       if (!((data->type == adt7463 || data->type == adt7468) &&
-           (data->vid & 0x80)))
+       if (data->type == adt7463 || data->type == adt7468) {
+               u8 vid = lm85_read_value(client, LM85_REG_VID);
+               if (vid & 0x80)
+                       data->has_vid5 = true;
+       }
+
+       if (!data->has_vid5)
                if ((err = sysfs_create_group(&client->dev.kobj,
                                        &lm85_group_in4)))
                        goto err_remove_files;
@@ -1344,10 +1365,7 @@ static int lm85_probe(struct i2c_client *client,
 
        /* Error out and cleanup code */
  err_remove_files:
-       sysfs_remove_group(&client->dev.kobj, &lm85_group);
-       sysfs_remove_group(&client->dev.kobj, &lm85_group_in4);
-       if (data->type == emc6d100)
-               sysfs_remove_group(&client->dev.kobj, &lm85_group_in567);
+       lm85_remove_files(client, data);
  err_kfree:
        kfree(data);
        return err;
@@ -1357,10 +1375,7 @@ static int lm85_remove(struct i2c_client *client)
 {
        struct lm85_data *data = i2c_get_clientdata(client);
        hwmon_device_unregister(data->hwmon_dev);
-       sysfs_remove_group(&client->dev.kobj, &lm85_group);
-       sysfs_remove_group(&client->dev.kobj, &lm85_group_in4);
-       if (data->type == emc6d100)
-               sysfs_remove_group(&client->dev.kobj, &lm85_group_in567);
+       lm85_remove_files(client, data);
        kfree(data);
        return 0;
 }
@@ -1457,11 +1472,8 @@ static struct lm85_data *lm85_update_device(struct device *dev)
                            lm85_read_value(client, LM85_REG_FAN(i));
                }
 
-               if (!((data->type == adt7463 || data->type == adt7468) &&
-                   (data->vid & 0x80))) {
-                       data->in[4] = lm85_read_value(client,
-                                     LM85_REG_IN(4));
-               }
+               if (!data->has_vid5)
+                       data->in[4] = lm85_read_value(client, LM85_REG_IN(4));
 
                if (data->type == adt7468)
                        data->cfg5 = lm85_read_value(client, ADT7468_REG_CFG5);
@@ -1487,7 +1499,8 @@ static struct lm85_data *lm85_update_device(struct device *dev)
                        /* More alarm bits */
                        data->alarms |= lm85_read_value(client,
                                                EMC6D100_REG_ALARM3) << 16;
-               } else if (data->type == emc6d102 || data->type == emc6d103) {
+               } else if (data->type == emc6d102 || data->type == emc6d103 ||
+                          data->type == emc6d103s) {
                        /* Have to read LSB bits after the MSB ones because
                           the reading of the MSB bits has frozen the
                           LSBs (backward from the ADM1027).
@@ -1528,8 +1541,7 @@ static struct lm85_data *lm85_update_device(struct device *dev)
                            lm85_read_value(client, LM85_REG_FAN_MIN(i));
                }
 
-               if (!((data->type == adt7463 || data->type == adt7468) &&
-                   (data->vid & 0x80))) {
+               if (!data->has_vid5)  {
                        data->in_min[4] = lm85_read_value(client,
                                          LM85_REG_IN_MIN(4));
                        data->in_max[4] = lm85_read_value(client,
@@ -1573,17 +1585,19 @@ static struct lm85_data *lm85_update_device(struct device *dev)
                        }
                }
 
-               i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1);
-               data->autofan[0].min_off = (i & 0x20) != 0;
-               data->autofan[1].min_off = (i & 0x40) != 0;
-               data->autofan[2].min_off = (i & 0x80) != 0;
+               if (data->type != emc6d103s) {
+                       i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1);
+                       data->autofan[0].min_off = (i & 0x20) != 0;
+                       data->autofan[1].min_off = (i & 0x40) != 0;
+                       data->autofan[2].min_off = (i & 0x80) != 0;
 
-               i = lm85_read_value(client, LM85_REG_AFAN_HYST1);
-               data->zone[0].hyst = i >> 4;
-               data->zone[1].hyst = i & 0x0f;
+                       i = lm85_read_value(client, LM85_REG_AFAN_HYST1);
+                       data->zone[0].hyst = i >> 4;
+                       data->zone[1].hyst = i & 0x0f;
 
-               i = lm85_read_value(client, LM85_REG_AFAN_HYST2);
-               data->zone[2].hyst = i >> 4;
+                       i = lm85_read_value(client, LM85_REG_AFAN_HYST2);
+                       data->zone[2].hyst = i >> 4;
+               }
 
                data->last_config = jiffies;
        }  /* last_config */