|
58 | 58 | #define SBS_VERSION_1_1 2
|
59 | 59 | #define SBS_VERSION_1_1_WITH_PEC 3
|
60 | 60 |
|
| 61 | +#define REG_ADDR_MANUFACTURE_DATE 0x1B |
| 62 | + |
61 | 63 | /* Battery Mode defines */
|
62 | 64 | #define BATTERY_MODE_OFFSET 0x03
|
63 | 65 | #define BATTERY_MODE_CAPACITY_MASK BIT(15)
|
@@ -171,6 +173,9 @@ static enum power_supply_property sbs_properties[] = {
|
171 | 173 | POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
|
172 | 174 | POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
|
173 | 175 | POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
|
| 176 | + POWER_SUPPLY_PROP_MANUFACTURE_YEAR, |
| 177 | + POWER_SUPPLY_PROP_MANUFACTURE_MONTH, |
| 178 | + POWER_SUPPLY_PROP_MANUFACTURE_DAY, |
174 | 179 | /* Properties of type `const char *' */
|
175 | 180 | POWER_SUPPLY_PROP_MANUFACTURER,
|
176 | 181 | POWER_SUPPLY_PROP_MODEL_NAME
|
@@ -682,6 +687,38 @@ static int sbs_get_chemistry(struct i2c_client *client,
|
682 | 687 | return 0;
|
683 | 688 | }
|
684 | 689 |
|
| 690 | +static int sbs_get_battery_manufacture_date(struct i2c_client *client, |
| 691 | + enum power_supply_property psp, |
| 692 | + union power_supply_propval *val) |
| 693 | +{ |
| 694 | + int ret; |
| 695 | + u16 day, month, year; |
| 696 | + |
| 697 | + ret = sbs_read_word_data(client, REG_ADDR_MANUFACTURE_DATE); |
| 698 | + if (ret < 0) |
| 699 | + return ret; |
| 700 | + |
| 701 | + day = ret & GENMASK(4, 0); |
| 702 | + month = (ret & GENMASK(8, 5)) >> 5; |
| 703 | + year = ((ret & GENMASK(15, 9)) >> 9) + 1980; |
| 704 | + |
| 705 | + switch (psp) { |
| 706 | + case POWER_SUPPLY_PROP_MANUFACTURE_YEAR: |
| 707 | + val->intval = year; |
| 708 | + break; |
| 709 | + case POWER_SUPPLY_PROP_MANUFACTURE_MONTH: |
| 710 | + val->intval = month; |
| 711 | + break; |
| 712 | + case POWER_SUPPLY_PROP_MANUFACTURE_DAY: |
| 713 | + val->intval = day; |
| 714 | + break; |
| 715 | + default: |
| 716 | + return -EINVAL; |
| 717 | + } |
| 718 | + |
| 719 | + return 0; |
| 720 | +} |
| 721 | + |
685 | 722 | static int sbs_get_property(struct power_supply *psy,
|
686 | 723 | enum power_supply_property psp,
|
687 | 724 | union power_supply_propval *val)
|
@@ -790,6 +827,12 @@ static int sbs_get_property(struct power_supply *psy,
|
790 | 827 | val->strval = manufacturer;
|
791 | 828 | break;
|
792 | 829 |
|
| 830 | + case POWER_SUPPLY_PROP_MANUFACTURE_YEAR: |
| 831 | + case POWER_SUPPLY_PROP_MANUFACTURE_MONTH: |
| 832 | + case POWER_SUPPLY_PROP_MANUFACTURE_DAY: |
| 833 | + ret = sbs_get_battery_manufacture_date(client, psp, val); |
| 834 | + break; |
| 835 | + |
793 | 836 | default:
|
794 | 837 | dev_err(&client->dev,
|
795 | 838 | "%s: INVALID property\n", __func__);
|
|
0 commit comments