|
@@ -84,55 +84,79 @@ static int max17042_get_property(struct power_supply *psy,
|
|
{
|
|
{
|
|
struct max17042_chip *chip = container_of(psy,
|
|
struct max17042_chip *chip = container_of(psy,
|
|
struct max17042_chip, battery);
|
|
struct max17042_chip, battery);
|
|
|
|
+ int ret;
|
|
|
|
|
|
switch (psp) {
|
|
switch (psp) {
|
|
case POWER_SUPPLY_PROP_PRESENT:
|
|
case POWER_SUPPLY_PROP_PRESENT:
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_STATUS);
|
|
|
|
- if (val->intval & MAX17042_STATUS_BattAbsent)
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_STATUS);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ if (ret & MAX17042_STATUS_BattAbsent)
|
|
val->intval = 0;
|
|
val->intval = 0;
|
|
else
|
|
else
|
|
val->intval = 1;
|
|
val->intval = 1;
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_CYCLE_COUNT:
|
|
case POWER_SUPPLY_PROP_CYCLE_COUNT:
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_Cycles);
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_Cycles);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret;
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_VOLTAGE_MAX:
|
|
case POWER_SUPPLY_PROP_VOLTAGE_MAX:
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_MinMaxVolt);
|
|
|
|
- val->intval >>= 8;
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_MinMaxVolt);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret >> 8;
|
|
val->intval *= 20000; /* Units of LSB = 20mV */
|
|
val->intval *= 20000; /* Units of LSB = 20mV */
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
|
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_V_empty);
|
|
|
|
- val->intval >>= 7;
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_V_empty);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret >> 7;
|
|
val->intval *= 10000; /* Units of LSB = 10mV */
|
|
val->intval *= 10000; /* Units of LSB = 10mV */
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
|
|
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
|
|
- val->intval = max17042_read_reg(chip->client, MAX17042_VCELL)
|
|
|
|
- * 625 / 8;
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_VCELL);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret * 625 / 8;
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_VOLTAGE_AVG:
|
|
case POWER_SUPPLY_PROP_VOLTAGE_AVG:
|
|
- val->intval = max17042_read_reg(chip->client, MAX17042_AvgVCELL)
|
|
|
|
- * 625 / 8;
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_AvgVCELL);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret * 625 / 8;
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_CAPACITY:
|
|
case POWER_SUPPLY_PROP_CAPACITY:
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_SOC) / 256;
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_SOC);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret >> 8;
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_CHARGE_FULL:
|
|
case POWER_SUPPLY_PROP_CHARGE_FULL:
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_RepSOC);
|
|
|
|
- if ((val->intval / 256) >= MAX17042_BATTERY_FULL)
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_RepSOC);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ if ((ret >> 8) >= MAX17042_BATTERY_FULL)
|
|
val->intval = 1;
|
|
val->intval = 1;
|
|
- else if (val->intval >= 0)
|
|
|
|
|
|
+ else if (ret >= 0)
|
|
val->intval = 0;
|
|
val->intval = 0;
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_TEMP:
|
|
case POWER_SUPPLY_PROP_TEMP:
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_TEMP);
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_TEMP);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret;
|
|
/* The value is signed. */
|
|
/* The value is signed. */
|
|
if (val->intval & 0x8000) {
|
|
if (val->intval & 0x8000) {
|
|
val->intval = (0x7fff & ~val->intval) + 1;
|
|
val->intval = (0x7fff & ~val->intval) + 1;
|
|
@@ -144,8 +168,11 @@ static int max17042_get_property(struct power_supply *psy,
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_CURRENT_NOW:
|
|
case POWER_SUPPLY_PROP_CURRENT_NOW:
|
|
if (chip->pdata->enable_current_sense) {
|
|
if (chip->pdata->enable_current_sense) {
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_Current);
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client, MAX17042_Current);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret;
|
|
if (val->intval & 0x8000) {
|
|
if (val->intval & 0x8000) {
|
|
/* Negative */
|
|
/* Negative */
|
|
val->intval = ~val->intval & 0x7fff;
|
|
val->intval = ~val->intval & 0x7fff;
|
|
@@ -159,8 +186,12 @@ static int max17042_get_property(struct power_supply *psy,
|
|
break;
|
|
break;
|
|
case POWER_SUPPLY_PROP_CURRENT_AVG:
|
|
case POWER_SUPPLY_PROP_CURRENT_AVG:
|
|
if (chip->pdata->enable_current_sense) {
|
|
if (chip->pdata->enable_current_sense) {
|
|
- val->intval = max17042_read_reg(chip->client,
|
|
|
|
- MAX17042_AvgCurrent);
|
|
|
|
|
|
+ ret = max17042_read_reg(chip->client,
|
|
|
|
+ MAX17042_AvgCurrent);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ val->intval = ret;
|
|
if (val->intval & 0x8000) {
|
|
if (val->intval & 0x8000) {
|
|
/* Negative */
|
|
/* Negative */
|
|
val->intval = ~val->intval & 0x7fff;
|
|
val->intval = ~val->intval & 0x7fff;
|