power: bq25890: add POWER_SUPPLY_PROP_TEMP
authorAngus Ainslie <angus@akkea.ca>
Thu, 18 Nov 2021 16:18:45 +0000 (08:18 -0800)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Thu, 2 Dec 2021 17:27:06 +0000 (18:27 +0100)
Add the POWER_SUPPLY_PROP_TEMP and a NTC 10K percent VREGN to degrees LUT.

Make sure that a conversion is forced when the power supply is offline so
the temperature is valid.

Signed-off-by: Angus Ainslie <angus@akkea.ca>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/bq25890_charger.c

index 34ec186a2e9abca1d6fa2290c9c87cf07436088e..78da6e7a8b5b1354527456313c629656a4c5ca5a 100644 (file)
@@ -266,6 +266,7 @@ enum bq25890_table_ids {
        /* lookup tables */
        TBL_TREG,
        TBL_BOOSTI,
+       TBL_TSPCT,
 };
 
 /* Thermal Regulation Threshold lookup table, in degrees Celsius */
@@ -280,6 +281,28 @@ static const u32 bq25890_boosti_tbl[] = {
 
 #define BQ25890_BOOSTI_TBL_SIZE                ARRAY_SIZE(bq25890_boosti_tbl)
 
+/* NTC 10K temperature lookup table in tenths of a degree */
+static const u32 bq25890_tspct_tbl[] = {
+       850, 840, 830, 820, 810, 800, 790, 780,
+       770, 760, 750, 740, 730, 720, 710, 700,
+       690, 685, 680, 675, 670, 660, 650, 645,
+       640, 630, 620, 615, 610, 600, 590, 585,
+       580, 570, 565, 560, 550, 540, 535, 530,
+       520, 515, 510, 500, 495, 490, 480, 475,
+       470, 460, 455, 450, 440, 435, 430, 425,
+       420, 410, 405, 400, 390, 385, 380, 370,
+       365, 360, 355, 350, 340, 335, 330, 320,
+       310, 305, 300, 290, 285, 280, 275, 270,
+       260, 250, 245, 240, 230, 225, 220, 210,
+       205, 200, 190, 180, 175, 170, 160, 150,
+       145, 140, 130, 120, 115, 110, 100, 90,
+       80, 70, 60, 50, 40, 30, 20, 10,
+       0, -10, -20, -30, -40, -60, -70, -80,
+       -90, -10, -120, -140, -150, -170, -190, -210,
+};
+
+#define BQ25890_TSPCT_TBL_SIZE         ARRAY_SIZE(bq25890_tspct_tbl)
+
 struct bq25890_range {
        u32 min;
        u32 max;
@@ -308,7 +331,8 @@ static const union {
 
        /* lookup tables */
        [TBL_TREG] =    { .lt = {bq25890_treg_tbl, BQ25890_TREG_TBL_SIZE} },
-       [TBL_BOOSTI] =  { .lt = {bq25890_boosti_tbl, BQ25890_BOOSTI_TBL_SIZE} }
+       [TBL_BOOSTI] =  { .lt = {bq25890_boosti_tbl, BQ25890_BOOSTI_TBL_SIZE} },
+       [TBL_TSPCT] =   { .lt = {bq25890_tspct_tbl, BQ25890_TSPCT_TBL_SIZE} }
 };
 
 static int bq25890_field_read(struct bq25890_device *bq,
@@ -388,6 +412,7 @@ static bool bq25890_is_adc_property(enum power_supply_property psp)
        switch (psp) {
        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
        case POWER_SUPPLY_PROP_CURRENT_NOW:
+       case POWER_SUPPLY_PROP_TEMP:
                return true;
 
        default:
@@ -528,6 +553,15 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
                val->intval = ret * -50000;
                break;
 
+       case POWER_SUPPLY_PROP_TEMP:
+               ret = bq25890_field_read(bq, F_TSPCT);
+               if (ret < 0)
+                       return ret;
+
+               /* convert TS percentage into rough temperature */
+               val->intval = bq25890_find_val(ret, TBL_TSPCT);
+               break;
+
        default:
                return -EINVAL;
        }
@@ -713,6 +747,7 @@ static const enum power_supply_property bq25890_power_supply_props[] = {
        POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
        POWER_SUPPLY_PROP_VOLTAGE_NOW,
        POWER_SUPPLY_PROP_CURRENT_NOW,
+       POWER_SUPPLY_PROP_TEMP,
 };
 
 static char *bq25890_charger_supplied_to[] = {