Merge tag 'for-linus-4.19-1' of https://github.com/cminyard/linux-ipmi
[linux-2.6-microblaze.git] / drivers / hwmon / tmp401.c
index 52c9e7d..cc0a1c2 100644 (file)
@@ -41,6 +41,8 @@ enum chips { tmp401, tmp411, tmp431, tmp432, tmp435 };
 #define TMP401_STATUS                          0x02
 #define TMP401_CONFIG                          0x03
 #define TMP401_CONVERSION_RATE                 0x04
+#define TMP4XX_N_FACTOR_REG                    0x18
+#define TMP43X_BETA_RANGE                      0x25
 #define TMP401_TEMP_CRIT_HYST                  0x21
 #define TMP401_MANUFACTURER_ID_REG             0xFE
 #define TMP401_DEVICE_ID_REG                   0xFF
@@ -543,6 +545,8 @@ static int tmp401_init_client(struct tmp401_data *data)
        struct regmap *regmap = data->regmap;
        u32 config, config_orig;
        int ret;
+       u32 val = 0;
+       s32 nfactor = 0;
 
        /* Set conversion rate to 2 Hz */
        ret = regmap_write(regmap, TMP401_CONVERSION_RATE, 5);
@@ -557,12 +561,50 @@ static int tmp401_init_client(struct tmp401_data *data)
        config_orig = config;
        config &= ~TMP401_CONFIG_SHUTDOWN;
 
+       if (of_property_read_bool(data->client->dev.of_node, "ti,extended-range-enable")) {
+               /* Enable measurement over extended temperature range */
+               config |= TMP401_CONFIG_RANGE;
+       }
+
        data->extended_range = !!(config & TMP401_CONFIG_RANGE);
 
-       if (config != config_orig)
+       if (config != config_orig) {
                ret = regmap_write(regmap, TMP401_CONFIG, config);
+               if (ret < 0)
+                       return ret;
+       }
 
-       return ret;
+       ret = of_property_read_u32(data->client->dev.of_node, "ti,n-factor", &nfactor);
+       if (!ret) {
+               if (data->kind == tmp401) {
+                       dev_err(&data->client->dev, "ti,tmp401 does not support n-factor correction\n");
+                       return -EINVAL;
+               }
+               if (nfactor < -128 || nfactor > 127) {
+                       dev_err(&data->client->dev, "n-factor is invalid (%d)\n", nfactor);
+                       return -EINVAL;
+               }
+               ret = regmap_write(regmap, TMP4XX_N_FACTOR_REG, (unsigned int)nfactor);
+               if (ret < 0)
+                       return ret;
+       }
+
+       ret = of_property_read_u32(data->client->dev.of_node, "ti,beta-compensation", &val);
+       if (!ret) {
+               if (data->kind == tmp401 || data->kind == tmp411) {
+                       dev_err(&data->client->dev, "ti,tmp401 or ti,tmp411 does not support beta compensation\n");
+                       return -EINVAL;
+               }
+               if (val > 15) {
+                       dev_err(&data->client->dev, "beta-compensation is invalid (%u)\n", val);
+                       return -EINVAL;
+               }
+               ret = regmap_write(regmap, TMP43X_BETA_RANGE, val);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
 }
 
 static int tmp401_detect(struct i2c_client *client,