@@ -123,6 +123,7 @@ enum bq27xxx_reg_index {
123
123
BQ27XXX_DM_BLOCK , /* Data Block */
124
124
BQ27XXX_DM_DATA , /* Block Data */
125
125
BQ27XXX_DM_CKSUM , /* Block Data Checksum */
126
+ BQ27XXX_REG_SEDVF , /* End-of-discharge Voltage */
126
127
BQ27XXX_REG_MAX , /* sentinel */
127
128
};
128
129
@@ -159,6 +160,7 @@ static u8
159
160
[BQ27XXX_DM_BLOCK ] = INVALID_REG_ADDR ,
160
161
[BQ27XXX_DM_DATA ] = INVALID_REG_ADDR ,
161
162
[BQ27XXX_DM_CKSUM ] = INVALID_REG_ADDR ,
163
+ [BQ27XXX_REG_SEDVF ] = 0x77 ,
162
164
},
163
165
bq27010_regs [BQ27XXX_REG_MAX ] = {
164
166
[BQ27XXX_REG_CTRL ] = 0x00 ,
@@ -184,6 +186,7 @@ static u8
184
186
[BQ27XXX_DM_BLOCK ] = INVALID_REG_ADDR ,
185
187
[BQ27XXX_DM_DATA ] = INVALID_REG_ADDR ,
186
188
[BQ27XXX_DM_CKSUM ] = INVALID_REG_ADDR ,
189
+ [BQ27XXX_REG_SEDVF ] = 0x77 ,
187
190
},
188
191
bq2750x_regs [BQ27XXX_REG_MAX ] = {
189
192
[BQ27XXX_REG_CTRL ] = 0x00 ,
@@ -579,6 +582,7 @@ static enum power_supply_property bq27000_props[] = {
579
582
POWER_SUPPLY_PROP_POWER_AVG ,
580
583
POWER_SUPPLY_PROP_HEALTH ,
581
584
POWER_SUPPLY_PROP_MANUFACTURER ,
585
+ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN ,
582
586
};
583
587
584
588
static enum power_supply_property bq27010_props [] = {
@@ -599,6 +603,7 @@ static enum power_supply_property bq27010_props[] = {
599
603
POWER_SUPPLY_PROP_CYCLE_COUNT ,
600
604
POWER_SUPPLY_PROP_HEALTH ,
601
605
POWER_SUPPLY_PROP_MANUFACTURER ,
606
+ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN ,
602
607
};
603
608
604
609
#define bq2750x_props bq27510g3_props
@@ -2039,6 +2044,36 @@ static int bq27xxx_battery_voltage(struct bq27xxx_device_info *di,
2039
2044
return 0 ;
2040
2045
}
2041
2046
2047
+ /*
2048
+ * Return the design minimum battery Voltage in microvolts
2049
+ * Or < 0 if something fails.
2050
+ */
2051
+ static int bq27xxx_battery_read_dmin_volt (struct bq27xxx_device_info * di ,
2052
+ union power_supply_propval * val )
2053
+ {
2054
+ int volt ;
2055
+
2056
+ /* We only have to read design minimum voltage once */
2057
+ if (di -> voltage_min_design > 0 ) {
2058
+ val -> intval = di -> voltage_min_design ;
2059
+ return 0 ;
2060
+ }
2061
+
2062
+ volt = bq27xxx_read (di , BQ27XXX_REG_SEDVF , true);
2063
+ if (volt < 0 ) {
2064
+ dev_err (di -> dev , "error reading design min voltage\n" );
2065
+ return volt ;
2066
+ }
2067
+
2068
+ /* SEDVF = Design EDVF / 8 - 256 */
2069
+ val -> intval = volt * 8000 + 2048000 ;
2070
+
2071
+ /* Save for later reads */
2072
+ di -> voltage_min_design = val -> intval ;
2073
+
2074
+ return 0 ;
2075
+ }
2076
+
2042
2077
static int bq27xxx_simple_value (int value ,
2043
2078
union power_supply_propval * val )
2044
2079
{
@@ -2119,8 +2154,10 @@ static int bq27xxx_battery_get_property(struct power_supply *psy,
2119
2154
* power_supply_battery_info visible in sysfs.
2120
2155
*/
2121
2156
case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN :
2122
- case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN :
2123
2157
return - EINVAL ;
2158
+ case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN :
2159
+ ret = bq27xxx_battery_read_dmin_volt (di , val );
2160
+ break ;
2124
2161
case POWER_SUPPLY_PROP_CYCLE_COUNT :
2125
2162
ret = bq27xxx_battery_read_cyct (di , val );
2126
2163
break ;
0 commit comments