25
25
#define BQ25895_ID 7
26
26
#define BQ25896_ID 0
27
27
28
+ enum bq25890_chip_version {
29
+ BQ25890 ,
30
+ BQ25892 ,
31
+ BQ25895 ,
32
+ BQ25896 ,
33
+ };
34
+
28
35
enum bq25890_fields {
29
36
F_EN_HIZ , F_EN_ILIM , F_IILIM , /* Reg00 */
30
37
F_BHOT , F_BCOLD , F_VINDPM_OFS , /* Reg01 */
31
38
F_CONV_START , F_CONV_RATE , F_BOOSTF , F_ICO_EN ,
32
39
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 */
34
42
F_PUMPX_EN , F_ICHG , /* Reg04 */
35
43
F_IPRECHG , F_ITERM , /* Reg05 */
36
44
F_VREG , F_BATLOWV , F_VRECHG , /* Reg06 */
@@ -39,8 +47,9 @@ enum bq25890_fields {
39
47
F_BATCMP , F_VCLAMP , F_TREG , /* Reg08 */
40
48
F_FORCE_ICO , F_TMR2X_EN , F_BATFET_DIS , F_JEITA_VSET ,
41
49
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 */
44
53
F_WD_FAULT , F_BOOST_FAULT , F_CHG_FAULT , F_BAT_FAULT ,
45
54
F_NTC_FAULT , /* Reg0C */
46
55
F_FORCE_VINDPM , F_VINDPM , /* Reg0D */
@@ -91,7 +100,7 @@ struct bq25890_device {
91
100
struct regmap * rmap ;
92
101
struct regmap_field * rmap_fields [F_MAX_FIELDS ];
93
102
94
- int chip_id ;
103
+ enum bq25890_chip_version chip_version ;
95
104
struct bq25890_init_data init_data ;
96
105
struct bq25890_state state ;
97
106
@@ -111,8 +120,7 @@ static const struct regmap_access_table bq25890_writeable_regs = {
111
120
static const struct regmap_range bq25890_volatile_reg_ranges [] = {
112
121
regmap_reg_range (0x00 , 0x00 ),
113
122
regmap_reg_range (0x09 , 0x09 ),
114
- regmap_reg_range (0x0b , 0x0c ),
115
- regmap_reg_range (0x0e , 0x14 ),
123
+ regmap_reg_range (0x0b , 0x14 ),
116
124
};
117
125
118
126
static const struct regmap_access_table bq25890_volatile_regs = {
@@ -155,7 +163,7 @@ static const struct reg_field bq25890_reg_fields[] = {
155
163
[F_OTG_CFG ] = REG_FIELD (0x03 , 5 , 5 ),
156
164
[F_CHG_CFG ] = REG_FIELD (0x03 , 4 , 4 ),
157
165
[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
159
167
/* REG04 */
160
168
[F_PUMPX_EN ] = REG_FIELD (0x04 , 7 , 7 ),
161
169
[F_ICHG ] = REG_FIELD (0x04 , 0 , 6 ),
@@ -188,8 +196,8 @@ static const struct reg_field bq25890_reg_fields[] = {
188
196
[F_PUMPX_DN ] = REG_FIELD (0x09 , 0 , 0 ),
189
197
/* REG0A */
190
198
[F_BOOSTV ] = REG_FIELD (0x0A , 4 , 7 ),
191
- /* PFM_OTG_DIS 3 on BQ25896 */
192
199
[F_BOOSTI ] = REG_FIELD (0x0A , 0 , 2 ), // reserved on BQ25895
200
+ [F_PFM_OTG_DIS ] = REG_FIELD (0x0A , 3 , 3 ), // BQ25896 only
193
201
/* REG0B */
194
202
[F_VBUS_STAT ] = REG_FIELD (0x0B , 5 , 7 ),
195
203
[F_CHG_STAT ] = REG_FIELD (0x0B , 3 , 4 ),
@@ -275,6 +283,7 @@ static const union {
275
283
struct bq25890_lookup lt ;
276
284
} bq25890_tables [] = {
277
285
/* range tables */
286
+ /* TODO: BQ25896 has max ICHG 3008 mA */
278
287
[TBL_ICHG ] = { .rt = {0 , 5056000 , 64000 } }, /* uA */
279
288
[TBL_ITERM ] = { .rt = {64000 , 1024000 , 64000 } }, /* uA */
280
289
[TBL_VREG ] = { .rt = {3840000 , 4608000 , 16000 } }, /* uV */
@@ -391,11 +400,13 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
391
400
break ;
392
401
393
402
case POWER_SUPPLY_PROP_MODEL_NAME :
394
- if (bq -> chip_id == BQ25890_ID )
403
+ if (bq -> chip_version == BQ25890 )
395
404
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 )
397
408
val -> strval = "BQ25895" ;
398
- else if (bq -> chip_id == BQ25896_ID )
409
+ else if (bq -> chip_version == BQ25896 )
399
410
val -> strval = "BQ25896" ;
400
411
else
401
412
val -> strval = "UNKNOWN" ;
@@ -741,6 +752,56 @@ static int bq25890_usb_notifier(struct notifier_block *nb, unsigned long val,
741
752
return NOTIFY_OK ;
742
753
}
743
754
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
+
744
805
static int bq25890_irq_probe (struct bq25890_device * bq )
745
806
{
746
807
struct gpio_desc * irq ;
@@ -859,16 +920,10 @@ static int bq25890_probe(struct i2c_client *client,
859
920
860
921
i2c_set_clientdata (client , bq );
861
922
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 ;
872
927
}
873
928
874
929
if (!dev -> platform_data ) {
0 commit comments