]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
misc: nct1008: avoid reading bogus temperature
authorDiwakar Tundlam <dtundlam@nvidia.com>
Tue, 4 Mar 2014 02:11:34 +0000 (18:11 -0800)
committerDiwakar Tundlam <dtundlam@nvidia.com>
Wed, 5 Mar 2014 01:51:03 +0000 (17:51 -0800)
Added a check for temperature above max value and return error when
that happens to avoid showing insane temperature values to user. Bogus
temperature readout happens rarely due to the NCT device still being
initialized and unprepared while interrupts happen.

Bug 1454792

Change-Id: I05264a728b8b7bf830d67fc5dd74e1a91c7d6eba
Signed-off-by: Diwakar Tundlam <dtundlam@nvidia.com>
Reviewed-on: http://git-master/r/376832
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit

drivers/misc/nct1008.c

index a79279e7387bf0de859f6331b7d2b506fc762788..12ac47ec7118982fa96e28d24423480d61f6bd04 100644 (file)
@@ -220,6 +220,7 @@ static int nct1008_get_temp_common(int sensor,
 {
        struct i2c_client *client = data->client;
        struct nct1008_platform_data *pdata = client->dev.platform_data;
+       struct nct1008_sensor_data *sensorp;
        s16 temp_hi;
        s16 temp_lo;
        long temp_milli = 0;
@@ -227,6 +228,9 @@ static int nct1008_get_temp_common(int sensor,
        u8 value;
        int ret;
 
+       if (!((sensor == EXT) || (sensor == LOC)))
+               return -1;
+
        /* Read External Temp */
        if (sensor == EXT) {
                ret = nct1008_read_reg(client, NCT_REG(sensor, TEMP_RD_LO));
@@ -244,16 +248,13 @@ static int nct1008_get_temp_common(int sensor,
                        value = ret;
 
                temp_hi = value_to_temperature(pdata->extended_range, value);
+               temp_milli = CELSIUS_TO_MILLICELSIUS(temp_hi) + temp_lo * 250;
 
-               temp_milli = CELSIUS_TO_MILLICELSIUS(temp_hi) +
-                        temp_lo * 250;
-
-               for (i = 0; i < ARRAY_SIZE(data->sensors[sensor].offset_table);
-                       i++) {
-                       if (temp_milli < (data->sensors[sensor].
-                               offset_table[i].temp * 1000)) {
-                               off = data->sensors[sensor].offset_table[i].
-                               offset * 1000;
+               sensorp = &data->sensors[sensor];
+               for (i = 0; i < ARRAY_SIZE(sensorp->offset_table); i++) {
+                       if (temp_milli <
+                               (sensorp->offset_table[i].temp * 1000)) {
+                               off = sensorp->offset_table[i].offset * 1000;
                                break;
                        }
                }
@@ -268,6 +269,9 @@ static int nct1008_get_temp_common(int sensor,
                temp_milli = CELSIUS_TO_MILLICELSIUS(temp_hi);
        }
 
+       if (temp_milli > NCT1008_MAX_TEMP_MILLI)
+               return -1;
+
        *temp = temp_milli;
        data->sensors[sensor].temp = temp_milli;