power: max77665: fix temperature reading
Xin Xie [Wed, 17 Apr 2013 21:33:17 +0000 (14:33 -0700)]
We are using 0xFF as error code for temperature reading, but 0xFF is also
25.5c which is a legal temperature reading.

Fix this issue by using dedicated error code return value.

bug 1236790

Change-Id: Ic0be2909ec10ce5763f77dc6ec30a7c6bc5d9d03
Signed-off-by: Xin Xie <xxie@nvidia.com>
Reviewed-on: http://git-master/r/220786
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Syed Rafiuddin <srafiuddin@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>

drivers/power/max17042_battery.c
drivers/power/max77665-charger.c
include/linux/power/max17042_battery.h

index 7fc2460..347e567 100644 (file)
@@ -157,24 +157,24 @@ static enum power_supply_property max17042_battery_props[] = {
        POWER_SUPPLY_PROP_STATUS,
 };
 
-int maxim_get_temp()
+int maxim_get_temp(int *deci_celsius)
 {
-       int ret = 0xff;
-       if (temp_client != NULL) {
-               ret = max17042_read_reg(temp_client, MAX17042_TEMP);
-               if (ret < 0)
-                       return ret;
+       int ret = -ENODEV;
+       s16 temp;
 
-               /* The value is signed. */
-               if (ret & 0x8000) {
-                       ret = (0x7fff & ~ret) + 1;
-                       ret *= -1;
-               }
-               /* The value is converted into deci-centigrade scale */
-               /* Units of LSB = 1 / 256 degree Celsius */
-               ret = ret * 10 / 256;
-       }
-       return ret;
+       *deci_celsius = -2732;
+       if (temp_client == NULL)
+               return ret;
+
+       ret = max17042_read_reg(temp_client, MAX17042_TEMP);
+       if (ret < 0)
+               return ret;
+
+       temp = ret & 0xFFFF;
+       /* The value is converted into deci-centigrade scale */
+       /* Units of LSB = 1 / 256 degree Celsius */
+       *deci_celsius = temp * 10 / 256;
+       return 0;
 }
 EXPORT_SYMBOL_GPL(maxim_get_temp);
 
@@ -968,6 +968,7 @@ static int __devinit max17042_probe(struct i2c_client *client,
        struct max17042_chip *chip;
        int ret;
        int reg;
+       int temp;
 
        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA))
                return -EIO;
@@ -1051,11 +1052,11 @@ static int __devinit max17042_probe(struct i2c_client *client,
        }
 
        /* Check for battery presence */
-       ret = maxim_get_temp();
-       if (ret == 0xff) {
-               dev_err(&client->dev, "failed in reading temperaure\n");
+       ret = maxim_get_temp(&temp);
+       if (ret < 0) {
+               dev_err(&client->dev, "failed reading temperaure: %d\n", ret);
                return -ENODEV;
-       } else if ((ret < MIN_TEMP) || (ret > MAX_TEMP)) {
+       } else if ((temp < MIN_TEMP) || (temp > MAX_TEMP)) {
                dev_err(&client->dev, "Battery not detected exiting driver\n");
                return -ENODEV;
        }
index c311ac4..9faa5ce 100644 (file)
@@ -815,6 +815,7 @@ static __devinit int max77665_battery_probe(struct platform_device *pdev)
        uint8_t j;
        uint32_t read_val;
        struct max77665_charger *charger;
+       int temp;
 
        charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL);
        if (!charger) {
@@ -852,11 +853,11 @@ static __devinit int max77665_battery_probe(struct platform_device *pdev)
        }
 
        /* differentiate between E1236 and E1587*/
-       ret = maxim_get_temp();
-       if (ret == 0xff) {
+       ret = maxim_get_temp(&temp);
+       if (ret < 0) {
                dev_err(&pdev->dev, "failed in reading temperaure\n");
                goto remove_charging;
-       } else if ((ret < MIN_TEMP) || (ret > MAX_TEMP)) {
+       } else if ((temp < MIN_TEMP) || (temp > MAX_TEMP)) {
                dev_err(&pdev->dev, "E1236 detected exiting driver....\n");
                goto remove_charging;
        }
index 1763a85..04cdad9 100644 (file)
@@ -225,10 +225,15 @@ struct max17042_platform_data {
 };
 
 #ifdef CONFIG_BATTERY_MAX17042
-extern int maxim_get_temp(void);
+extern int maxim_get_temp(int *deci_celsius);
 extern void max17042_update_status(int status);
 #else
-static inline int maxim_get_temp(void) { return -ENODEV; }
+static inline int maxim_get_temp(int *deci_celsius)
+{
+       /* 0 Kelvin */
+       *deci_celsius = -2732;
+       return -ENODEV;
+}
 static inline void max17042_update_status(int status) {}
 #endif
 #endif /* __MAX17042_BATTERY_H_ */