Skip to content

Commit d20267c

Browse files
jekhorsre
authored andcommitted
power: supply: bq25890_charger: Add support of BQ25892 and BQ25896 chips
Support BQ25892 and BQ25896 chips by this driver. They shared one chip ID 0, so distinquish them by device revisions (2 for 25896 and 1 for 25892). Signed-off-by: Yauhen Kharuzhy <[email protected]> Signed-off-by: Sebastian Reichel <[email protected]>
1 parent 333853b commit d20267c

File tree

1 file changed

+76
-21
lines changed

1 file changed

+76
-21
lines changed

drivers/power/supply/bq25890_charger.c

Lines changed: 76 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,20 @@
2525
#define BQ25895_ID 7
2626
#define BQ25896_ID 0
2727

28+
enum bq25890_chip_version {
29+
BQ25890,
30+
BQ25892,
31+
BQ25895,
32+
BQ25896,
33+
};
34+
2835
enum bq25890_fields {
2936
F_EN_HIZ, F_EN_ILIM, F_IILIM, /* Reg00 */
3037
F_BHOT, F_BCOLD, F_VINDPM_OFS, /* Reg01 */
3138
F_CONV_START, F_CONV_RATE, F_BOOSTF, F_ICO_EN,
3239
F_HVDCP_EN, F_MAXC_EN, F_FORCE_DPM, F_AUTO_DPDM_EN, /* Reg02 */
33-
F_BAT_LOAD_EN, F_WD_RST, F_OTG_CFG, F_CHG_CFG, F_SYSVMIN, /* Reg03 */
40+
F_BAT_LOAD_EN, F_WD_RST, F_OTG_CFG, F_CHG_CFG, F_SYSVMIN,
41+
F_MIN_VBAT_SEL, /* Reg03 */
3442
F_PUMPX_EN, F_ICHG, /* Reg04 */
3543
F_IPRECHG, F_ITERM, /* Reg05 */
3644
F_VREG, F_BATLOWV, F_VRECHG, /* Reg06 */
@@ -39,8 +47,9 @@ enum bq25890_fields {
3947
F_BATCMP, F_VCLAMP, F_TREG, /* Reg08 */
4048
F_FORCE_ICO, F_TMR2X_EN, F_BATFET_DIS, F_JEITA_VSET,
4149
F_BATFET_DLY, F_BATFET_RST_EN, F_PUMPX_UP, F_PUMPX_DN, /* Reg09 */
42-
F_BOOSTV, F_BOOSTI, /* Reg0A */
43-
F_VBUS_STAT, F_CHG_STAT, F_PG_STAT, F_SDP_STAT, F_VSYS_STAT, /* Reg0B */
50+
F_BOOSTV, F_PFM_OTG_DIS, F_BOOSTI, /* Reg0A */
51+
F_VBUS_STAT, F_CHG_STAT, F_PG_STAT, F_SDP_STAT, F_0B_RSVD,
52+
F_VSYS_STAT, /* Reg0B */
4453
F_WD_FAULT, F_BOOST_FAULT, F_CHG_FAULT, F_BAT_FAULT,
4554
F_NTC_FAULT, /* Reg0C */
4655
F_FORCE_VINDPM, F_VINDPM, /* Reg0D */
@@ -91,7 +100,7 @@ struct bq25890_device {
91100
struct regmap *rmap;
92101
struct regmap_field *rmap_fields[F_MAX_FIELDS];
93102

94-
int chip_id;
103+
enum bq25890_chip_version chip_version;
95104
struct bq25890_init_data init_data;
96105
struct bq25890_state state;
97106

@@ -111,8 +120,7 @@ static const struct regmap_access_table bq25890_writeable_regs = {
111120
static const struct regmap_range bq25890_volatile_reg_ranges[] = {
112121
regmap_reg_range(0x00, 0x00),
113122
regmap_reg_range(0x09, 0x09),
114-
regmap_reg_range(0x0b, 0x0c),
115-
regmap_reg_range(0x0e, 0x14),
123+
regmap_reg_range(0x0b, 0x14),
116124
};
117125

118126
static const struct regmap_access_table bq25890_volatile_regs = {
@@ -155,7 +163,7 @@ static const struct reg_field bq25890_reg_fields[] = {
155163
[F_OTG_CFG] = REG_FIELD(0x03, 5, 5),
156164
[F_CHG_CFG] = REG_FIELD(0x03, 4, 4),
157165
[F_SYSVMIN] = REG_FIELD(0x03, 1, 3),
158-
/* MIN_VBAT_SEL on BQ25896 */
166+
[F_MIN_VBAT_SEL] = REG_FIELD(0x03, 0, 0), // BQ25896 only
159167
/* REG04 */
160168
[F_PUMPX_EN] = REG_FIELD(0x04, 7, 7),
161169
[F_ICHG] = REG_FIELD(0x04, 0, 6),
@@ -188,8 +196,8 @@ static const struct reg_field bq25890_reg_fields[] = {
188196
[F_PUMPX_DN] = REG_FIELD(0x09, 0, 0),
189197
/* REG0A */
190198
[F_BOOSTV] = REG_FIELD(0x0A, 4, 7),
191-
/* PFM_OTG_DIS 3 on BQ25896 */
192199
[F_BOOSTI] = REG_FIELD(0x0A, 0, 2), // reserved on BQ25895
200+
[F_PFM_OTG_DIS] = REG_FIELD(0x0A, 3, 3), // BQ25896 only
193201
/* REG0B */
194202
[F_VBUS_STAT] = REG_FIELD(0x0B, 5, 7),
195203
[F_CHG_STAT] = REG_FIELD(0x0B, 3, 4),
@@ -275,6 +283,7 @@ static const union {
275283
struct bq25890_lookup lt;
276284
} bq25890_tables[] = {
277285
/* range tables */
286+
/* TODO: BQ25896 has max ICHG 3008 mA */
278287
[TBL_ICHG] = { .rt = {0, 5056000, 64000} }, /* uA */
279288
[TBL_ITERM] = { .rt = {64000, 1024000, 64000} }, /* uA */
280289
[TBL_VREG] = { .rt = {3840000, 4608000, 16000} }, /* uV */
@@ -391,11 +400,13 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
391400
break;
392401

393402
case POWER_SUPPLY_PROP_MODEL_NAME:
394-
if (bq->chip_id == BQ25890_ID)
403+
if (bq->chip_version == BQ25890)
395404
val->strval = "BQ25890";
396-
else if (bq->chip_id == BQ25895_ID)
405+
else if (bq->chip_version == BQ25892)
406+
val->strval = "BQ25892";
407+
else if (bq->chip_version == BQ25895)
397408
val->strval = "BQ25895";
398-
else if (bq->chip_id == BQ25896_ID)
409+
else if (bq->chip_version == BQ25896)
399410
val->strval = "BQ25896";
400411
else
401412
val->strval = "UNKNOWN";
@@ -741,6 +752,56 @@ static int bq25890_usb_notifier(struct notifier_block *nb, unsigned long val,
741752
return NOTIFY_OK;
742753
}
743754

755+
static int bq25890_get_chip_version(struct bq25890_device *bq)
756+
{
757+
int id, rev;
758+
759+
id = bq25890_field_read(bq, F_PN);
760+
if (id < 0) {
761+
dev_err(bq->dev, "Cannot read chip ID.\n");
762+
return id;
763+
}
764+
765+
rev = bq25890_field_read(bq, F_DEV_REV);
766+
if (rev < 0) {
767+
dev_err(bq->dev, "Cannot read chip revision.\n");
768+
return id;
769+
}
770+
771+
switch (id) {
772+
case BQ25890_ID:
773+
bq->chip_version = BQ25890;
774+
break;
775+
776+
/* BQ25892 and BQ25896 share same ID 0 */
777+
case BQ25896_ID:
778+
switch (rev) {
779+
case 2:
780+
bq->chip_version = BQ25896;
781+
break;
782+
case 1:
783+
bq->chip_version = BQ25892;
784+
break;
785+
default:
786+
dev_err(bq->dev,
787+
"Unknown device revision %d, assume BQ25892\n",
788+
rev);
789+
bq->chip_version = BQ25892;
790+
}
791+
break;
792+
793+
case BQ25895_ID:
794+
bq->chip_version = BQ25895;
795+
break;
796+
797+
default:
798+
dev_err(bq->dev, "Unknown chip ID %d\n", id);
799+
return -ENODEV;
800+
}
801+
802+
return 0;
803+
}
804+
744805
static int bq25890_irq_probe(struct bq25890_device *bq)
745806
{
746807
struct gpio_desc *irq;
@@ -859,16 +920,10 @@ static int bq25890_probe(struct i2c_client *client,
859920

860921
i2c_set_clientdata(client, bq);
861922

862-
bq->chip_id = bq25890_field_read(bq, F_PN);
863-
if (bq->chip_id < 0) {
864-
dev_err(dev, "Cannot read chip ID.\n");
865-
return bq->chip_id;
866-
}
867-
868-
if ((bq->chip_id != BQ25890_ID) && (bq->chip_id != BQ25895_ID)
869-
&& (bq->chip_id != BQ25896_ID)) {
870-
dev_err(dev, "Chip with ID=%d, not supported!\n", bq->chip_id);
871-
return -ENODEV;
923+
ret = bq25890_get_chip_version(bq);
924+
if (ret) {
925+
dev_err(dev, "Cannot read chip ID or unknown chip.\n");
926+
return ret;
872927
}
873928

874929
if (!dev->platform_data) {

0 commit comments

Comments
 (0)