0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/mod_devicetable.h>
0009 #include <linux/module.h>
0010 #include <linux/interrupt.h>
0011 #include <linux/delay.h>
0012 #include <linux/pm_runtime.h>
0013 #include <linux/power_supply.h>
0014 #include <linux/power/bq24190_charger.h>
0015 #include <linux/regulator/driver.h>
0016 #include <linux/regulator/machine.h>
0017 #include <linux/workqueue.h>
0018 #include <linux/i2c.h>
0019 #include <linux/extcon-provider.h>
0020
0021 #define BQ24190_MANUFACTURER "Texas Instruments"
0022
0023 #define BQ24190_REG_ISC 0x00
0024 #define BQ24190_REG_ISC_EN_HIZ_MASK BIT(7)
0025 #define BQ24190_REG_ISC_EN_HIZ_SHIFT 7
0026 #define BQ24190_REG_ISC_VINDPM_MASK (BIT(6) | BIT(5) | BIT(4) | \
0027 BIT(3))
0028 #define BQ24190_REG_ISC_VINDPM_SHIFT 3
0029 #define BQ24190_REG_ISC_IINLIM_MASK (BIT(2) | BIT(1) | BIT(0))
0030 #define BQ24190_REG_ISC_IINLIM_SHIFT 0
0031
0032 #define BQ24190_REG_POC 0x01
0033 #define BQ24190_REG_POC_RESET_MASK BIT(7)
0034 #define BQ24190_REG_POC_RESET_SHIFT 7
0035 #define BQ24190_REG_POC_WDT_RESET_MASK BIT(6)
0036 #define BQ24190_REG_POC_WDT_RESET_SHIFT 6
0037 #define BQ24190_REG_POC_CHG_CONFIG_MASK (BIT(5) | BIT(4))
0038 #define BQ24190_REG_POC_CHG_CONFIG_SHIFT 4
0039 #define BQ24190_REG_POC_CHG_CONFIG_DISABLE 0x0
0040 #define BQ24190_REG_POC_CHG_CONFIG_CHARGE 0x1
0041 #define BQ24190_REG_POC_CHG_CONFIG_OTG 0x2
0042 #define BQ24190_REG_POC_CHG_CONFIG_OTG_ALT 0x3
0043 #define BQ24190_REG_POC_SYS_MIN_MASK (BIT(3) | BIT(2) | BIT(1))
0044 #define BQ24190_REG_POC_SYS_MIN_SHIFT 1
0045 #define BQ24190_REG_POC_SYS_MIN_MIN 3000
0046 #define BQ24190_REG_POC_SYS_MIN_MAX 3700
0047 #define BQ24190_REG_POC_BOOST_LIM_MASK BIT(0)
0048 #define BQ24190_REG_POC_BOOST_LIM_SHIFT 0
0049
0050 #define BQ24190_REG_CCC 0x02
0051 #define BQ24190_REG_CCC_ICHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
0052 BIT(4) | BIT(3) | BIT(2))
0053 #define BQ24190_REG_CCC_ICHG_SHIFT 2
0054 #define BQ24190_REG_CCC_FORCE_20PCT_MASK BIT(0)
0055 #define BQ24190_REG_CCC_FORCE_20PCT_SHIFT 0
0056
0057 #define BQ24190_REG_PCTCC 0x03
0058 #define BQ24190_REG_PCTCC_IPRECHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
0059 BIT(4))
0060 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT 4
0061 #define BQ24190_REG_PCTCC_IPRECHG_MIN 128
0062 #define BQ24190_REG_PCTCC_IPRECHG_MAX 2048
0063 #define BQ24190_REG_PCTCC_ITERM_MASK (BIT(3) | BIT(2) | BIT(1) | \
0064 BIT(0))
0065 #define BQ24190_REG_PCTCC_ITERM_SHIFT 0
0066 #define BQ24190_REG_PCTCC_ITERM_MIN 128
0067 #define BQ24190_REG_PCTCC_ITERM_MAX 2048
0068
0069 #define BQ24190_REG_CVC 0x04
0070 #define BQ24190_REG_CVC_VREG_MASK (BIT(7) | BIT(6) | BIT(5) | \
0071 BIT(4) | BIT(3) | BIT(2))
0072 #define BQ24190_REG_CVC_VREG_SHIFT 2
0073 #define BQ24190_REG_CVC_BATLOWV_MASK BIT(1)
0074 #define BQ24190_REG_CVC_BATLOWV_SHIFT 1
0075 #define BQ24190_REG_CVC_VRECHG_MASK BIT(0)
0076 #define BQ24190_REG_CVC_VRECHG_SHIFT 0
0077
0078 #define BQ24190_REG_CTTC 0x05
0079 #define BQ24190_REG_CTTC_EN_TERM_MASK BIT(7)
0080 #define BQ24190_REG_CTTC_EN_TERM_SHIFT 7
0081 #define BQ24190_REG_CTTC_TERM_STAT_MASK BIT(6)
0082 #define BQ24190_REG_CTTC_TERM_STAT_SHIFT 6
0083 #define BQ24190_REG_CTTC_WATCHDOG_MASK (BIT(5) | BIT(4))
0084 #define BQ24190_REG_CTTC_WATCHDOG_SHIFT 4
0085 #define BQ24190_REG_CTTC_EN_TIMER_MASK BIT(3)
0086 #define BQ24190_REG_CTTC_EN_TIMER_SHIFT 3
0087 #define BQ24190_REG_CTTC_CHG_TIMER_MASK (BIT(2) | BIT(1))
0088 #define BQ24190_REG_CTTC_CHG_TIMER_SHIFT 1
0089 #define BQ24190_REG_CTTC_JEITA_ISET_MASK BIT(0)
0090 #define BQ24190_REG_CTTC_JEITA_ISET_SHIFT 0
0091
0092 #define BQ24190_REG_ICTRC 0x06
0093 #define BQ24190_REG_ICTRC_BAT_COMP_MASK (BIT(7) | BIT(6) | BIT(5))
0094 #define BQ24190_REG_ICTRC_BAT_COMP_SHIFT 5
0095 #define BQ24190_REG_ICTRC_VCLAMP_MASK (BIT(4) | BIT(3) | BIT(2))
0096 #define BQ24190_REG_ICTRC_VCLAMP_SHIFT 2
0097 #define BQ24190_REG_ICTRC_TREG_MASK (BIT(1) | BIT(0))
0098 #define BQ24190_REG_ICTRC_TREG_SHIFT 0
0099
0100 #define BQ24190_REG_MOC 0x07
0101 #define BQ24190_REG_MOC_DPDM_EN_MASK BIT(7)
0102 #define BQ24190_REG_MOC_DPDM_EN_SHIFT 7
0103 #define BQ24190_REG_MOC_TMR2X_EN_MASK BIT(6)
0104 #define BQ24190_REG_MOC_TMR2X_EN_SHIFT 6
0105 #define BQ24190_REG_MOC_BATFET_DISABLE_MASK BIT(5)
0106 #define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT 5
0107 #define BQ24190_REG_MOC_JEITA_VSET_MASK BIT(4)
0108 #define BQ24190_REG_MOC_JEITA_VSET_SHIFT 4
0109 #define BQ24190_REG_MOC_INT_MASK_MASK (BIT(1) | BIT(0))
0110 #define BQ24190_REG_MOC_INT_MASK_SHIFT 0
0111
0112 #define BQ24190_REG_SS 0x08
0113 #define BQ24190_REG_SS_VBUS_STAT_MASK (BIT(7) | BIT(6))
0114 #define BQ24190_REG_SS_VBUS_STAT_SHIFT 6
0115 #define BQ24190_REG_SS_CHRG_STAT_MASK (BIT(5) | BIT(4))
0116 #define BQ24190_REG_SS_CHRG_STAT_SHIFT 4
0117 #define BQ24190_REG_SS_DPM_STAT_MASK BIT(3)
0118 #define BQ24190_REG_SS_DPM_STAT_SHIFT 3
0119 #define BQ24190_REG_SS_PG_STAT_MASK BIT(2)
0120 #define BQ24190_REG_SS_PG_STAT_SHIFT 2
0121 #define BQ24190_REG_SS_THERM_STAT_MASK BIT(1)
0122 #define BQ24190_REG_SS_THERM_STAT_SHIFT 1
0123 #define BQ24190_REG_SS_VSYS_STAT_MASK BIT(0)
0124 #define BQ24190_REG_SS_VSYS_STAT_SHIFT 0
0125
0126 #define BQ24190_REG_F 0x09
0127 #define BQ24190_REG_F_WATCHDOG_FAULT_MASK BIT(7)
0128 #define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT 7
0129 #define BQ24190_REG_F_BOOST_FAULT_MASK BIT(6)
0130 #define BQ24190_REG_F_BOOST_FAULT_SHIFT 6
0131 #define BQ24190_REG_F_CHRG_FAULT_MASK (BIT(5) | BIT(4))
0132 #define BQ24190_REG_F_CHRG_FAULT_SHIFT 4
0133 #define BQ24190_REG_F_BAT_FAULT_MASK BIT(3)
0134 #define BQ24190_REG_F_BAT_FAULT_SHIFT 3
0135 #define BQ24190_REG_F_NTC_FAULT_MASK (BIT(2) | BIT(1) | BIT(0))
0136 #define BQ24190_REG_F_NTC_FAULT_SHIFT 0
0137
0138 #define BQ24190_REG_VPRS 0x0A
0139 #define BQ24190_REG_VPRS_PN_MASK (BIT(5) | BIT(4) | BIT(3))
0140 #define BQ24190_REG_VPRS_PN_SHIFT 3
0141 #define BQ24190_REG_VPRS_PN_24190 0x4
0142 #define BQ24190_REG_VPRS_PN_24192 0x5
0143 #define BQ24190_REG_VPRS_PN_24192I 0x3
0144 #define BQ24190_REG_VPRS_TS_PROFILE_MASK BIT(2)
0145 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT 2
0146 #define BQ24190_REG_VPRS_DEV_REG_MASK (BIT(1) | BIT(0))
0147 #define BQ24190_REG_VPRS_DEV_REG_SHIFT 0
0148
0149
0150
0151
0152
0153
0154
0155
0156 struct bq24190_dev_info {
0157 struct i2c_client *client;
0158 struct device *dev;
0159 struct extcon_dev *edev;
0160 struct power_supply *charger;
0161 struct power_supply *battery;
0162 struct delayed_work input_current_limit_work;
0163 char model_name[I2C_NAME_SIZE];
0164 bool initialized;
0165 bool irq_event;
0166 bool otg_vbus_enabled;
0167 int charge_type;
0168 u16 sys_min;
0169 u16 iprechg;
0170 u16 iterm;
0171 u32 ichg;
0172 u32 ichg_max;
0173 u32 vreg;
0174 u32 vreg_max;
0175 struct mutex f_reg_lock;
0176 u8 f_reg;
0177 u8 ss_reg;
0178 u8 watchdog;
0179 };
0180
0181 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
0182 const union power_supply_propval *val);
0183
0184 static const unsigned int bq24190_usb_extcon_cable[] = {
0185 EXTCON_USB,
0186 EXTCON_NONE,
0187 };
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198 static const int bq24190_isc_iinlim_values[] = {
0199 100000, 150000, 500000, 900000, 1200000, 1500000, 2000000, 3000000
0200 };
0201
0202
0203 static const int bq24190_ccc_ichg_values[] = {
0204 512000, 576000, 640000, 704000, 768000, 832000, 896000, 960000,
0205 1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
0206 1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
0207 2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
0208 2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
0209 3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
0210 3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
0211 4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
0212 };
0213
0214
0215 static const int bq24190_cvc_vreg_values[] = {
0216 3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
0217 3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
0218 3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
0219 3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
0220 4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
0221 4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
0222 4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
0223 4400000
0224 };
0225
0226
0227 static const int bq24190_ictrc_treg_values[] = {
0228 600, 800, 1000, 1200
0229 };
0230
0231
0232
0233
0234
0235
0236
0237 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
0238 {
0239 int i;
0240
0241 for (i = 1; i < tbl_size; i++)
0242 if (v < tbl[i])
0243 break;
0244
0245 return i - 1;
0246 }
0247
0248
0249
0250 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
0251 {
0252 int ret;
0253
0254 ret = i2c_smbus_read_byte_data(bdi->client, reg);
0255 if (ret < 0)
0256 return ret;
0257
0258 *data = ret;
0259 return 0;
0260 }
0261
0262 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
0263 {
0264 return i2c_smbus_write_byte_data(bdi->client, reg, data);
0265 }
0266
0267 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
0268 u8 mask, u8 shift, u8 *data)
0269 {
0270 u8 v;
0271 int ret;
0272
0273 ret = bq24190_read(bdi, reg, &v);
0274 if (ret < 0)
0275 return ret;
0276
0277 v &= mask;
0278 v >>= shift;
0279 *data = v;
0280
0281 return 0;
0282 }
0283
0284 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
0285 u8 mask, u8 shift, u8 data)
0286 {
0287 u8 v;
0288 int ret;
0289
0290 ret = bq24190_read(bdi, reg, &v);
0291 if (ret < 0)
0292 return ret;
0293
0294 v &= ~mask;
0295 v |= ((data << shift) & mask);
0296
0297 return bq24190_write(bdi, reg, v);
0298 }
0299
0300 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
0301 u8 reg, u8 mask, u8 shift,
0302 const int tbl[], int tbl_size,
0303 int *val)
0304 {
0305 u8 v;
0306 int ret;
0307
0308 ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
0309 if (ret < 0)
0310 return ret;
0311
0312 v = (v >= tbl_size) ? (tbl_size - 1) : v;
0313 *val = tbl[v];
0314
0315 return 0;
0316 }
0317
0318 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
0319 u8 reg, u8 mask, u8 shift,
0320 const int tbl[], int tbl_size,
0321 int val)
0322 {
0323 u8 idx;
0324
0325 idx = bq24190_find_idx(tbl, tbl_size, val);
0326
0327 return bq24190_write_mask(bdi, reg, mask, shift, idx);
0328 }
0329
0330 #ifdef CONFIG_SYSFS
0331
0332
0333
0334
0335
0336
0337
0338
0339 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store) \
0340 { \
0341 .attr = __ATTR(f_##_name, m, bq24190_sysfs_show, store), \
0342 .reg = BQ24190_REG_##r, \
0343 .mask = BQ24190_REG_##r##_##f##_MASK, \
0344 .shift = BQ24190_REG_##r##_##f##_SHIFT, \
0345 }
0346
0347 #define BQ24190_SYSFS_FIELD_RW(_name, r, f) \
0348 BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO, \
0349 bq24190_sysfs_store)
0350
0351 #define BQ24190_SYSFS_FIELD_RO(_name, r, f) \
0352 BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
0353
0354 static ssize_t bq24190_sysfs_show(struct device *dev,
0355 struct device_attribute *attr, char *buf);
0356 static ssize_t bq24190_sysfs_store(struct device *dev,
0357 struct device_attribute *attr, const char *buf, size_t count);
0358
0359 struct bq24190_sysfs_field_info {
0360 struct device_attribute attr;
0361 u8 reg;
0362 u8 mask;
0363 u8 shift;
0364 };
0365
0366
0367 #undef SS
0368
0369 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
0370
0371 BQ24190_SYSFS_FIELD_RW(en_hiz, ISC, EN_HIZ),
0372 BQ24190_SYSFS_FIELD_RW(vindpm, ISC, VINDPM),
0373 BQ24190_SYSFS_FIELD_RW(iinlim, ISC, IINLIM),
0374 BQ24190_SYSFS_FIELD_RW(chg_config, POC, CHG_CONFIG),
0375 BQ24190_SYSFS_FIELD_RW(sys_min, POC, SYS_MIN),
0376 BQ24190_SYSFS_FIELD_RW(boost_lim, POC, BOOST_LIM),
0377 BQ24190_SYSFS_FIELD_RW(ichg, CCC, ICHG),
0378 BQ24190_SYSFS_FIELD_RW(force_20_pct, CCC, FORCE_20PCT),
0379 BQ24190_SYSFS_FIELD_RW(iprechg, PCTCC, IPRECHG),
0380 BQ24190_SYSFS_FIELD_RW(iterm, PCTCC, ITERM),
0381 BQ24190_SYSFS_FIELD_RW(vreg, CVC, VREG),
0382 BQ24190_SYSFS_FIELD_RW(batlowv, CVC, BATLOWV),
0383 BQ24190_SYSFS_FIELD_RW(vrechg, CVC, VRECHG),
0384 BQ24190_SYSFS_FIELD_RW(en_term, CTTC, EN_TERM),
0385 BQ24190_SYSFS_FIELD_RW(term_stat, CTTC, TERM_STAT),
0386 BQ24190_SYSFS_FIELD_RO(watchdog, CTTC, WATCHDOG),
0387 BQ24190_SYSFS_FIELD_RW(en_timer, CTTC, EN_TIMER),
0388 BQ24190_SYSFS_FIELD_RW(chg_timer, CTTC, CHG_TIMER),
0389 BQ24190_SYSFS_FIELD_RW(jeta_iset, CTTC, JEITA_ISET),
0390 BQ24190_SYSFS_FIELD_RW(bat_comp, ICTRC, BAT_COMP),
0391 BQ24190_SYSFS_FIELD_RW(vclamp, ICTRC, VCLAMP),
0392 BQ24190_SYSFS_FIELD_RW(treg, ICTRC, TREG),
0393 BQ24190_SYSFS_FIELD_RW(dpdm_en, MOC, DPDM_EN),
0394 BQ24190_SYSFS_FIELD_RW(tmr2x_en, MOC, TMR2X_EN),
0395 BQ24190_SYSFS_FIELD_RW(batfet_disable, MOC, BATFET_DISABLE),
0396 BQ24190_SYSFS_FIELD_RW(jeita_vset, MOC, JEITA_VSET),
0397 BQ24190_SYSFS_FIELD_RO(int_mask, MOC, INT_MASK),
0398 BQ24190_SYSFS_FIELD_RO(vbus_stat, SS, VBUS_STAT),
0399 BQ24190_SYSFS_FIELD_RO(chrg_stat, SS, CHRG_STAT),
0400 BQ24190_SYSFS_FIELD_RO(dpm_stat, SS, DPM_STAT),
0401 BQ24190_SYSFS_FIELD_RO(pg_stat, SS, PG_STAT),
0402 BQ24190_SYSFS_FIELD_RO(therm_stat, SS, THERM_STAT),
0403 BQ24190_SYSFS_FIELD_RO(vsys_stat, SS, VSYS_STAT),
0404 BQ24190_SYSFS_FIELD_RO(watchdog_fault, F, WATCHDOG_FAULT),
0405 BQ24190_SYSFS_FIELD_RO(boost_fault, F, BOOST_FAULT),
0406 BQ24190_SYSFS_FIELD_RO(chrg_fault, F, CHRG_FAULT),
0407 BQ24190_SYSFS_FIELD_RO(bat_fault, F, BAT_FAULT),
0408 BQ24190_SYSFS_FIELD_RO(ntc_fault, F, NTC_FAULT),
0409 BQ24190_SYSFS_FIELD_RO(pn, VPRS, PN),
0410 BQ24190_SYSFS_FIELD_RO(ts_profile, VPRS, TS_PROFILE),
0411 BQ24190_SYSFS_FIELD_RO(dev_reg, VPRS, DEV_REG),
0412 };
0413
0414 static struct attribute *
0415 bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
0416
0417 ATTRIBUTE_GROUPS(bq24190_sysfs);
0418
0419 static void bq24190_sysfs_init_attrs(void)
0420 {
0421 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
0422
0423 for (i = 0; i < limit; i++)
0424 bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
0425
0426 bq24190_sysfs_attrs[limit] = NULL;
0427 }
0428
0429 static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
0430 const char *name)
0431 {
0432 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
0433
0434 for (i = 0; i < limit; i++)
0435 if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
0436 break;
0437
0438 if (i >= limit)
0439 return NULL;
0440
0441 return &bq24190_sysfs_field_tbl[i];
0442 }
0443
0444 static ssize_t bq24190_sysfs_show(struct device *dev,
0445 struct device_attribute *attr, char *buf)
0446 {
0447 struct power_supply *psy = dev_get_drvdata(dev);
0448 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
0449 struct bq24190_sysfs_field_info *info;
0450 ssize_t count;
0451 int ret;
0452 u8 v;
0453
0454 info = bq24190_sysfs_field_lookup(attr->attr.name);
0455 if (!info)
0456 return -EINVAL;
0457
0458 ret = pm_runtime_resume_and_get(bdi->dev);
0459 if (ret < 0)
0460 return ret;
0461
0462 ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
0463 if (ret)
0464 count = ret;
0465 else
0466 count = scnprintf(buf, PAGE_SIZE, "%hhx\n", v);
0467
0468 pm_runtime_mark_last_busy(bdi->dev);
0469 pm_runtime_put_autosuspend(bdi->dev);
0470
0471 return count;
0472 }
0473
0474 static ssize_t bq24190_sysfs_store(struct device *dev,
0475 struct device_attribute *attr, const char *buf, size_t count)
0476 {
0477 struct power_supply *psy = dev_get_drvdata(dev);
0478 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
0479 struct bq24190_sysfs_field_info *info;
0480 int ret;
0481 u8 v;
0482
0483 info = bq24190_sysfs_field_lookup(attr->attr.name);
0484 if (!info)
0485 return -EINVAL;
0486
0487 ret = kstrtou8(buf, 0, &v);
0488 if (ret < 0)
0489 return ret;
0490
0491 ret = pm_runtime_resume_and_get(bdi->dev);
0492 if (ret < 0)
0493 return ret;
0494
0495 ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
0496 if (ret)
0497 count = ret;
0498
0499 pm_runtime_mark_last_busy(bdi->dev);
0500 pm_runtime_put_autosuspend(bdi->dev);
0501
0502 return count;
0503 }
0504 #endif
0505
0506 static int bq24190_set_otg_vbus(struct bq24190_dev_info *bdi, bool enable)
0507 {
0508 union power_supply_propval val = { .intval = bdi->charge_type };
0509 int ret;
0510
0511 ret = pm_runtime_resume_and_get(bdi->dev);
0512 if (ret < 0) {
0513 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
0514 return ret;
0515 }
0516
0517 bdi->otg_vbus_enabled = enable;
0518 if (enable)
0519 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
0520 BQ24190_REG_POC_CHG_CONFIG_MASK,
0521 BQ24190_REG_POC_CHG_CONFIG_SHIFT,
0522 BQ24190_REG_POC_CHG_CONFIG_OTG);
0523 else
0524 ret = bq24190_charger_set_charge_type(bdi, &val);
0525
0526 pm_runtime_mark_last_busy(bdi->dev);
0527 pm_runtime_put_autosuspend(bdi->dev);
0528
0529 return ret;
0530 }
0531
0532 #ifdef CONFIG_REGULATOR
0533 static int bq24190_vbus_enable(struct regulator_dev *dev)
0534 {
0535 return bq24190_set_otg_vbus(rdev_get_drvdata(dev), true);
0536 }
0537
0538 static int bq24190_vbus_disable(struct regulator_dev *dev)
0539 {
0540 return bq24190_set_otg_vbus(rdev_get_drvdata(dev), false);
0541 }
0542
0543 static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
0544 {
0545 struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
0546 int ret;
0547 u8 val;
0548
0549 ret = pm_runtime_resume_and_get(bdi->dev);
0550 if (ret < 0) {
0551 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
0552 return ret;
0553 }
0554
0555 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
0556 BQ24190_REG_POC_CHG_CONFIG_MASK,
0557 BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
0558
0559 pm_runtime_mark_last_busy(bdi->dev);
0560 pm_runtime_put_autosuspend(bdi->dev);
0561
0562 if (ret)
0563 return ret;
0564
0565 bdi->otg_vbus_enabled = (val == BQ24190_REG_POC_CHG_CONFIG_OTG ||
0566 val == BQ24190_REG_POC_CHG_CONFIG_OTG_ALT);
0567 return bdi->otg_vbus_enabled;
0568 }
0569
0570 static const struct regulator_ops bq24190_vbus_ops = {
0571 .enable = bq24190_vbus_enable,
0572 .disable = bq24190_vbus_disable,
0573 .is_enabled = bq24190_vbus_is_enabled,
0574 };
0575
0576 static const struct regulator_desc bq24190_vbus_desc = {
0577 .name = "usb_otg_vbus",
0578 .of_match = "usb-otg-vbus",
0579 .type = REGULATOR_VOLTAGE,
0580 .owner = THIS_MODULE,
0581 .ops = &bq24190_vbus_ops,
0582 .fixed_uV = 5000000,
0583 .n_voltages = 1,
0584 };
0585
0586 static const struct regulator_init_data bq24190_vbus_init_data = {
0587 .constraints = {
0588 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
0589 },
0590 };
0591
0592 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
0593 {
0594 struct bq24190_platform_data *pdata = bdi->dev->platform_data;
0595 struct regulator_config cfg = { };
0596 struct regulator_dev *reg;
0597 int ret = 0;
0598
0599 cfg.dev = bdi->dev;
0600 if (pdata && pdata->regulator_init_data)
0601 cfg.init_data = pdata->regulator_init_data;
0602 else
0603 cfg.init_data = &bq24190_vbus_init_data;
0604 cfg.driver_data = bdi;
0605 reg = devm_regulator_register(bdi->dev, &bq24190_vbus_desc, &cfg);
0606 if (IS_ERR(reg)) {
0607 ret = PTR_ERR(reg);
0608 dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
0609 }
0610
0611 return ret;
0612 }
0613 #else
0614 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
0615 {
0616 return 0;
0617 }
0618 #endif
0619
0620 static int bq24190_set_config(struct bq24190_dev_info *bdi)
0621 {
0622 int ret;
0623 u8 v;
0624
0625 ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
0626 if (ret < 0)
0627 return ret;
0628
0629 bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
0630 BQ24190_REG_CTTC_WATCHDOG_SHIFT);
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640 v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
0641
0642 ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
0643 if (ret < 0)
0644 return ret;
0645
0646 if (bdi->sys_min) {
0647 v = bdi->sys_min / 100 - 30;
0648 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
0649 BQ24190_REG_POC_SYS_MIN_MASK,
0650 BQ24190_REG_POC_SYS_MIN_SHIFT,
0651 v);
0652 if (ret < 0)
0653 return ret;
0654 }
0655
0656 if (bdi->iprechg) {
0657 v = bdi->iprechg / 128 - 1;
0658 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
0659 BQ24190_REG_PCTCC_IPRECHG_MASK,
0660 BQ24190_REG_PCTCC_IPRECHG_SHIFT,
0661 v);
0662 if (ret < 0)
0663 return ret;
0664 }
0665
0666 if (bdi->iterm) {
0667 v = bdi->iterm / 128 - 1;
0668 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
0669 BQ24190_REG_PCTCC_ITERM_MASK,
0670 BQ24190_REG_PCTCC_ITERM_SHIFT,
0671 v);
0672 if (ret < 0)
0673 return ret;
0674 }
0675
0676 if (bdi->ichg) {
0677 ret = bq24190_set_field_val(bdi, BQ24190_REG_CCC,
0678 BQ24190_REG_CCC_ICHG_MASK,
0679 BQ24190_REG_CCC_ICHG_SHIFT,
0680 bq24190_ccc_ichg_values,
0681 ARRAY_SIZE(bq24190_ccc_ichg_values),
0682 bdi->ichg);
0683 if (ret < 0)
0684 return ret;
0685 }
0686
0687 if (bdi->vreg) {
0688 ret = bq24190_set_field_val(bdi, BQ24190_REG_CVC,
0689 BQ24190_REG_CVC_VREG_MASK,
0690 BQ24190_REG_CVC_VREG_SHIFT,
0691 bq24190_cvc_vreg_values,
0692 ARRAY_SIZE(bq24190_cvc_vreg_values),
0693 bdi->vreg);
0694 if (ret < 0)
0695 return ret;
0696 }
0697
0698 return 0;
0699 }
0700
0701 static int bq24190_register_reset(struct bq24190_dev_info *bdi)
0702 {
0703 int ret, limit = 100;
0704 u8 v;
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716 if (device_property_read_bool(bdi->dev, "disable-reset"))
0717 return 0;
0718
0719
0720 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
0721 BQ24190_REG_POC_RESET_MASK,
0722 BQ24190_REG_POC_RESET_SHIFT,
0723 0x1);
0724 if (ret < 0)
0725 return ret;
0726
0727
0728 do {
0729 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
0730 BQ24190_REG_POC_RESET_MASK,
0731 BQ24190_REG_POC_RESET_SHIFT,
0732 &v);
0733 if (ret < 0)
0734 return ret;
0735
0736 if (v == 0)
0737 return 0;
0738
0739 usleep_range(100, 200);
0740 } while (--limit);
0741
0742 return -EIO;
0743 }
0744
0745
0746
0747 static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
0748 union power_supply_propval *val)
0749 {
0750 u8 v;
0751 int type, ret;
0752
0753 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
0754 BQ24190_REG_POC_CHG_CONFIG_MASK,
0755 BQ24190_REG_POC_CHG_CONFIG_SHIFT,
0756 &v);
0757 if (ret < 0)
0758 return ret;
0759
0760
0761 if (!v) {
0762 type = POWER_SUPPLY_CHARGE_TYPE_NONE;
0763 } else {
0764 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
0765 BQ24190_REG_CCC_FORCE_20PCT_MASK,
0766 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
0767 &v);
0768 if (ret < 0)
0769 return ret;
0770
0771 type = (v) ? POWER_SUPPLY_CHARGE_TYPE_TRICKLE :
0772 POWER_SUPPLY_CHARGE_TYPE_FAST;
0773 }
0774
0775 val->intval = type;
0776
0777 return 0;
0778 }
0779
0780 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
0781 const union power_supply_propval *val)
0782 {
0783 u8 chg_config, force_20pct, en_term;
0784 int ret;
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796 switch (val->intval) {
0797 case POWER_SUPPLY_CHARGE_TYPE_NONE:
0798 chg_config = 0x0;
0799 break;
0800 case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
0801 chg_config = 0x1;
0802 force_20pct = 0x1;
0803 en_term = 0x0;
0804 break;
0805 case POWER_SUPPLY_CHARGE_TYPE_FAST:
0806 chg_config = 0x1;
0807 force_20pct = 0x0;
0808 en_term = 0x1;
0809 break;
0810 default:
0811 return -EINVAL;
0812 }
0813
0814 bdi->charge_type = val->intval;
0815
0816
0817
0818
0819 if (bdi->otg_vbus_enabled)
0820 return 0;
0821
0822 if (chg_config) {
0823 ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
0824 BQ24190_REG_CCC_FORCE_20PCT_MASK,
0825 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
0826 force_20pct);
0827 if (ret < 0)
0828 return ret;
0829
0830 ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
0831 BQ24190_REG_CTTC_EN_TERM_MASK,
0832 BQ24190_REG_CTTC_EN_TERM_SHIFT,
0833 en_term);
0834 if (ret < 0)
0835 return ret;
0836 }
0837
0838 return bq24190_write_mask(bdi, BQ24190_REG_POC,
0839 BQ24190_REG_POC_CHG_CONFIG_MASK,
0840 BQ24190_REG_POC_CHG_CONFIG_SHIFT, chg_config);
0841 }
0842
0843 static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
0844 union power_supply_propval *val)
0845 {
0846 u8 v;
0847 int health;
0848
0849 mutex_lock(&bdi->f_reg_lock);
0850 v = bdi->f_reg;
0851 mutex_unlock(&bdi->f_reg_lock);
0852
0853 if (v & BQ24190_REG_F_NTC_FAULT_MASK) {
0854 switch (v >> BQ24190_REG_F_NTC_FAULT_SHIFT & 0x7) {
0855 case 0x1:
0856 case 0x3:
0857 case 0x5:
0858 health = POWER_SUPPLY_HEALTH_COLD;
0859 break;
0860 case 0x2:
0861 case 0x4:
0862 case 0x6:
0863 health = POWER_SUPPLY_HEALTH_OVERHEAT;
0864 break;
0865 default:
0866 health = POWER_SUPPLY_HEALTH_UNKNOWN;
0867 }
0868 } else if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
0869 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
0870 } else if (v & BQ24190_REG_F_CHRG_FAULT_MASK) {
0871 switch (v >> BQ24190_REG_F_CHRG_FAULT_SHIFT & 0x3) {
0872 case 0x1:
0873
0874
0875
0876
0877
0878
0879
0880 health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
0881 break;
0882 case 0x2:
0883 health = POWER_SUPPLY_HEALTH_OVERHEAT;
0884 break;
0885 case 0x3:
0886 health = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
0887 break;
0888 default:
0889 health = -1;
0890 }
0891 } else if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
0892
0893
0894
0895
0896
0897
0898 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
0899 } else {
0900 health = POWER_SUPPLY_HEALTH_GOOD;
0901 }
0902
0903 val->intval = health;
0904
0905 return 0;
0906 }
0907
0908 static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
0909 union power_supply_propval *val)
0910 {
0911 u8 pg_stat, batfet_disable;
0912 int ret;
0913
0914 ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
0915 BQ24190_REG_SS_PG_STAT_MASK,
0916 BQ24190_REG_SS_PG_STAT_SHIFT, &pg_stat);
0917 if (ret < 0)
0918 return ret;
0919
0920 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
0921 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
0922 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
0923 if (ret < 0)
0924 return ret;
0925
0926 val->intval = pg_stat && !batfet_disable;
0927
0928 return 0;
0929 }
0930
0931 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
0932 const union power_supply_propval *val);
0933 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
0934 union power_supply_propval *val);
0935 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
0936 union power_supply_propval *val);
0937 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
0938 const union power_supply_propval *val);
0939
0940 static int bq24190_charger_set_online(struct bq24190_dev_info *bdi,
0941 const union power_supply_propval *val)
0942 {
0943 return bq24190_battery_set_online(bdi, val);
0944 }
0945
0946 static int bq24190_charger_get_status(struct bq24190_dev_info *bdi,
0947 union power_supply_propval *val)
0948 {
0949 return bq24190_battery_get_status(bdi, val);
0950 }
0951
0952 static int bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi,
0953 union power_supply_propval *val)
0954 {
0955 return bq24190_battery_get_temp_alert_max(bdi, val);
0956 }
0957
0958 static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
0959 const union power_supply_propval *val)
0960 {
0961 return bq24190_battery_set_temp_alert_max(bdi, val);
0962 }
0963
0964 static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
0965 union power_supply_propval *val)
0966 {
0967 u8 v;
0968 int ret;
0969
0970 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
0971 BQ24190_REG_PCTCC_IPRECHG_MASK,
0972 BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v);
0973 if (ret < 0)
0974 return ret;
0975
0976 val->intval = ++v * 128 * 1000;
0977 return 0;
0978 }
0979
0980 static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
0981 union power_supply_propval *val)
0982 {
0983 u8 v;
0984 int ret;
0985
0986 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
0987 BQ24190_REG_PCTCC_ITERM_MASK,
0988 BQ24190_REG_PCTCC_ITERM_SHIFT, &v);
0989 if (ret < 0)
0990 return ret;
0991
0992 val->intval = ++v * 128 * 1000;
0993 return 0;
0994 }
0995
0996 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
0997 union power_supply_propval *val)
0998 {
0999 u8 v;
1000 int curr, ret;
1001
1002 ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
1003 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1004 bq24190_ccc_ichg_values,
1005 ARRAY_SIZE(bq24190_ccc_ichg_values), &curr);
1006 if (ret < 0)
1007 return ret;
1008
1009 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1010 BQ24190_REG_CCC_FORCE_20PCT_MASK,
1011 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
1012 if (ret < 0)
1013 return ret;
1014
1015
1016 if (v)
1017 curr /= 5;
1018
1019 val->intval = curr;
1020 return 0;
1021 }
1022
1023 static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
1024 const union power_supply_propval *val)
1025 {
1026 u8 v;
1027 int ret, curr = val->intval;
1028
1029 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1030 BQ24190_REG_CCC_FORCE_20PCT_MASK,
1031 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
1032 if (ret < 0)
1033 return ret;
1034
1035
1036 if (v)
1037 curr *= 5;
1038
1039 if (curr > bdi->ichg_max)
1040 return -EINVAL;
1041
1042 ret = bq24190_set_field_val(bdi, BQ24190_REG_CCC,
1043 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1044 bq24190_ccc_ichg_values,
1045 ARRAY_SIZE(bq24190_ccc_ichg_values), curr);
1046 if (ret < 0)
1047 return ret;
1048
1049 bdi->ichg = curr;
1050
1051 return 0;
1052 }
1053
1054 static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
1055 union power_supply_propval *val)
1056 {
1057 int voltage, ret;
1058
1059 ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
1060 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1061 bq24190_cvc_vreg_values,
1062 ARRAY_SIZE(bq24190_cvc_vreg_values), &voltage);
1063 if (ret < 0)
1064 return ret;
1065
1066 val->intval = voltage;
1067 return 0;
1068 }
1069
1070 static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
1071 const union power_supply_propval *val)
1072 {
1073 int ret;
1074
1075 if (val->intval > bdi->vreg_max)
1076 return -EINVAL;
1077
1078 ret = bq24190_set_field_val(bdi, BQ24190_REG_CVC,
1079 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1080 bq24190_cvc_vreg_values,
1081 ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
1082 if (ret < 0)
1083 return ret;
1084
1085 bdi->vreg = val->intval;
1086
1087 return 0;
1088 }
1089
1090 static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
1091 union power_supply_propval *val)
1092 {
1093 int iinlimit, ret;
1094
1095 ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
1096 BQ24190_REG_ISC_IINLIM_MASK,
1097 BQ24190_REG_ISC_IINLIM_SHIFT,
1098 bq24190_isc_iinlim_values,
1099 ARRAY_SIZE(bq24190_isc_iinlim_values), &iinlimit);
1100 if (ret < 0)
1101 return ret;
1102
1103 val->intval = iinlimit;
1104 return 0;
1105 }
1106
1107 static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
1108 const union power_supply_propval *val)
1109 {
1110 return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1111 BQ24190_REG_ISC_IINLIM_MASK,
1112 BQ24190_REG_ISC_IINLIM_SHIFT,
1113 bq24190_isc_iinlim_values,
1114 ARRAY_SIZE(bq24190_isc_iinlim_values), val->intval);
1115 }
1116
1117 static int bq24190_charger_get_property(struct power_supply *psy,
1118 enum power_supply_property psp, union power_supply_propval *val)
1119 {
1120 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1121 int ret;
1122
1123 dev_dbg(bdi->dev, "prop: %d\n", psp);
1124
1125 ret = pm_runtime_resume_and_get(bdi->dev);
1126 if (ret < 0)
1127 return ret;
1128
1129 switch (psp) {
1130 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1131 ret = bq24190_charger_get_charge_type(bdi, val);
1132 break;
1133 case POWER_SUPPLY_PROP_HEALTH:
1134 ret = bq24190_charger_get_health(bdi, val);
1135 break;
1136 case POWER_SUPPLY_PROP_ONLINE:
1137 ret = bq24190_charger_get_online(bdi, val);
1138 break;
1139 case POWER_SUPPLY_PROP_STATUS:
1140 ret = bq24190_charger_get_status(bdi, val);
1141 break;
1142 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1143 ret = bq24190_charger_get_temp_alert_max(bdi, val);
1144 break;
1145 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1146 ret = bq24190_charger_get_precharge(bdi, val);
1147 break;
1148 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1149 ret = bq24190_charger_get_charge_term(bdi, val);
1150 break;
1151 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1152 ret = bq24190_charger_get_current(bdi, val);
1153 break;
1154 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1155 val->intval = bdi->ichg_max;
1156 ret = 0;
1157 break;
1158 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1159 ret = bq24190_charger_get_voltage(bdi, val);
1160 break;
1161 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
1162 val->intval = bdi->vreg_max;
1163 ret = 0;
1164 break;
1165 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1166 ret = bq24190_charger_get_iinlimit(bdi, val);
1167 break;
1168 case POWER_SUPPLY_PROP_SCOPE:
1169 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1170 ret = 0;
1171 break;
1172 case POWER_SUPPLY_PROP_MODEL_NAME:
1173 val->strval = bdi->model_name;
1174 ret = 0;
1175 break;
1176 case POWER_SUPPLY_PROP_MANUFACTURER:
1177 val->strval = BQ24190_MANUFACTURER;
1178 ret = 0;
1179 break;
1180 default:
1181 ret = -ENODATA;
1182 }
1183
1184 pm_runtime_mark_last_busy(bdi->dev);
1185 pm_runtime_put_autosuspend(bdi->dev);
1186
1187 return ret;
1188 }
1189
1190 static int bq24190_charger_set_property(struct power_supply *psy,
1191 enum power_supply_property psp,
1192 const union power_supply_propval *val)
1193 {
1194 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1195 int ret;
1196
1197 dev_dbg(bdi->dev, "prop: %d\n", psp);
1198
1199 ret = pm_runtime_resume_and_get(bdi->dev);
1200 if (ret < 0)
1201 return ret;
1202
1203 switch (psp) {
1204 case POWER_SUPPLY_PROP_ONLINE:
1205 ret = bq24190_charger_set_online(bdi, val);
1206 break;
1207 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1208 ret = bq24190_charger_set_temp_alert_max(bdi, val);
1209 break;
1210 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1211 ret = bq24190_charger_set_charge_type(bdi, val);
1212 break;
1213 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1214 ret = bq24190_charger_set_current(bdi, val);
1215 break;
1216 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1217 ret = bq24190_charger_set_voltage(bdi, val);
1218 break;
1219 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1220 ret = bq24190_charger_set_iinlimit(bdi, val);
1221 break;
1222 default:
1223 ret = -EINVAL;
1224 }
1225
1226 pm_runtime_mark_last_busy(bdi->dev);
1227 pm_runtime_put_autosuspend(bdi->dev);
1228
1229 return ret;
1230 }
1231
1232 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
1233 enum power_supply_property psp)
1234 {
1235 switch (psp) {
1236 case POWER_SUPPLY_PROP_ONLINE:
1237 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1238 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1239 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1240 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1241 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1242 return 1;
1243 default:
1244 return 0;
1245 }
1246 }
1247
1248 static void bq24190_input_current_limit_work(struct work_struct *work)
1249 {
1250 struct bq24190_dev_info *bdi =
1251 container_of(work, struct bq24190_dev_info,
1252 input_current_limit_work.work);
1253 union power_supply_propval val;
1254 int ret;
1255
1256 ret = power_supply_get_property_from_supplier(bdi->charger,
1257 POWER_SUPPLY_PROP_CURRENT_MAX,
1258 &val);
1259 if (ret)
1260 return;
1261
1262 bq24190_charger_set_property(bdi->charger,
1263 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1264 &val);
1265 }
1266
1267
1268 static void bq24190_charger_external_power_changed(struct power_supply *psy)
1269 {
1270 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280 queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1281 msecs_to_jiffies(300));
1282 }
1283
1284 static enum power_supply_property bq24190_charger_properties[] = {
1285 POWER_SUPPLY_PROP_CHARGE_TYPE,
1286 POWER_SUPPLY_PROP_HEALTH,
1287 POWER_SUPPLY_PROP_ONLINE,
1288 POWER_SUPPLY_PROP_STATUS,
1289 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1290 POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1291 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1292 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1293 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1294 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1295 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1296 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1297 POWER_SUPPLY_PROP_SCOPE,
1298 POWER_SUPPLY_PROP_MODEL_NAME,
1299 POWER_SUPPLY_PROP_MANUFACTURER,
1300 };
1301
1302 static char *bq24190_charger_supplied_to[] = {
1303 "main-battery",
1304 };
1305
1306 static const struct power_supply_desc bq24190_charger_desc = {
1307 .name = "bq24190-charger",
1308 .type = POWER_SUPPLY_TYPE_USB,
1309 .properties = bq24190_charger_properties,
1310 .num_properties = ARRAY_SIZE(bq24190_charger_properties),
1311 .get_property = bq24190_charger_get_property,
1312 .set_property = bq24190_charger_set_property,
1313 .property_is_writeable = bq24190_charger_property_is_writeable,
1314 .external_power_changed = bq24190_charger_external_power_changed,
1315 };
1316
1317
1318
1319 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1320 union power_supply_propval *val)
1321 {
1322 u8 ss_reg, chrg_fault;
1323 int status, ret;
1324
1325 mutex_lock(&bdi->f_reg_lock);
1326 chrg_fault = bdi->f_reg;
1327 mutex_unlock(&bdi->f_reg_lock);
1328
1329 chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
1330 chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
1331
1332 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1333 if (ret < 0)
1334 return ret;
1335
1336
1337
1338
1339
1340
1341
1342
1343 if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
1344 status = POWER_SUPPLY_STATUS_DISCHARGING;
1345 } else {
1346 ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
1347 ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
1348
1349 switch (ss_reg) {
1350 case 0x0:
1351 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1352 break;
1353 case 0x1:
1354 case 0x2:
1355 status = POWER_SUPPLY_STATUS_CHARGING;
1356 break;
1357 case 0x3:
1358 status = POWER_SUPPLY_STATUS_FULL;
1359 break;
1360 default:
1361 ret = -EIO;
1362 }
1363 }
1364
1365 if (!ret)
1366 val->intval = status;
1367
1368 return ret;
1369 }
1370
1371 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1372 union power_supply_propval *val)
1373 {
1374 u8 v;
1375 int health;
1376
1377 mutex_lock(&bdi->f_reg_lock);
1378 v = bdi->f_reg;
1379 mutex_unlock(&bdi->f_reg_lock);
1380
1381 if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1382 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1383 } else {
1384 v &= BQ24190_REG_F_NTC_FAULT_MASK;
1385 v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1386
1387 switch (v) {
1388 case 0x0:
1389 health = POWER_SUPPLY_HEALTH_GOOD;
1390 break;
1391 case 0x1:
1392 case 0x3:
1393 case 0x5:
1394 health = POWER_SUPPLY_HEALTH_COLD;
1395 break;
1396 case 0x2:
1397 case 0x4:
1398 case 0x6:
1399 health = POWER_SUPPLY_HEALTH_OVERHEAT;
1400 break;
1401 default:
1402 health = POWER_SUPPLY_HEALTH_UNKNOWN;
1403 }
1404 }
1405
1406 val->intval = health;
1407 return 0;
1408 }
1409
1410 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1411 union power_supply_propval *val)
1412 {
1413 u8 batfet_disable;
1414 int ret;
1415
1416 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1417 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1418 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1419 if (ret < 0)
1420 return ret;
1421
1422 val->intval = !batfet_disable;
1423 return 0;
1424 }
1425
1426 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1427 const union power_supply_propval *val)
1428 {
1429 return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1430 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1431 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1432 }
1433
1434 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1435 union power_supply_propval *val)
1436 {
1437 int temp, ret;
1438
1439 ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1440 BQ24190_REG_ICTRC_TREG_MASK,
1441 BQ24190_REG_ICTRC_TREG_SHIFT,
1442 bq24190_ictrc_treg_values,
1443 ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1444 if (ret < 0)
1445 return ret;
1446
1447 val->intval = temp;
1448 return 0;
1449 }
1450
1451 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1452 const union power_supply_propval *val)
1453 {
1454 return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1455 BQ24190_REG_ICTRC_TREG_MASK,
1456 BQ24190_REG_ICTRC_TREG_SHIFT,
1457 bq24190_ictrc_treg_values,
1458 ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1459 }
1460
1461 static int bq24190_battery_get_property(struct power_supply *psy,
1462 enum power_supply_property psp, union power_supply_propval *val)
1463 {
1464 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1465 int ret;
1466
1467 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1468 dev_dbg(bdi->dev, "prop: %d\n", psp);
1469
1470 ret = pm_runtime_resume_and_get(bdi->dev);
1471 if (ret < 0)
1472 return ret;
1473
1474 switch (psp) {
1475 case POWER_SUPPLY_PROP_STATUS:
1476 ret = bq24190_battery_get_status(bdi, val);
1477 break;
1478 case POWER_SUPPLY_PROP_HEALTH:
1479 ret = bq24190_battery_get_health(bdi, val);
1480 break;
1481 case POWER_SUPPLY_PROP_ONLINE:
1482 ret = bq24190_battery_get_online(bdi, val);
1483 break;
1484 case POWER_SUPPLY_PROP_TECHNOLOGY:
1485
1486 val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1487 ret = 0;
1488 break;
1489 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1490 ret = bq24190_battery_get_temp_alert_max(bdi, val);
1491 break;
1492 case POWER_SUPPLY_PROP_SCOPE:
1493 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1494 ret = 0;
1495 break;
1496 default:
1497 ret = -ENODATA;
1498 }
1499
1500 pm_runtime_mark_last_busy(bdi->dev);
1501 pm_runtime_put_autosuspend(bdi->dev);
1502
1503 return ret;
1504 }
1505
1506 static int bq24190_battery_set_property(struct power_supply *psy,
1507 enum power_supply_property psp,
1508 const union power_supply_propval *val)
1509 {
1510 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1511 int ret;
1512
1513 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1514 dev_dbg(bdi->dev, "prop: %d\n", psp);
1515
1516 ret = pm_runtime_resume_and_get(bdi->dev);
1517 if (ret < 0)
1518 return ret;
1519
1520 switch (psp) {
1521 case POWER_SUPPLY_PROP_ONLINE:
1522 ret = bq24190_battery_set_online(bdi, val);
1523 break;
1524 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1525 ret = bq24190_battery_set_temp_alert_max(bdi, val);
1526 break;
1527 default:
1528 ret = -EINVAL;
1529 }
1530
1531 pm_runtime_mark_last_busy(bdi->dev);
1532 pm_runtime_put_autosuspend(bdi->dev);
1533
1534 return ret;
1535 }
1536
1537 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1538 enum power_supply_property psp)
1539 {
1540 int ret;
1541
1542 switch (psp) {
1543 case POWER_SUPPLY_PROP_ONLINE:
1544 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1545 ret = 1;
1546 break;
1547 default:
1548 ret = 0;
1549 }
1550
1551 return ret;
1552 }
1553
1554 static enum power_supply_property bq24190_battery_properties[] = {
1555 POWER_SUPPLY_PROP_STATUS,
1556 POWER_SUPPLY_PROP_HEALTH,
1557 POWER_SUPPLY_PROP_ONLINE,
1558 POWER_SUPPLY_PROP_TECHNOLOGY,
1559 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1560 POWER_SUPPLY_PROP_SCOPE,
1561 };
1562
1563 static const struct power_supply_desc bq24190_battery_desc = {
1564 .name = "bq24190-battery",
1565 .type = POWER_SUPPLY_TYPE_BATTERY,
1566 .properties = bq24190_battery_properties,
1567 .num_properties = ARRAY_SIZE(bq24190_battery_properties),
1568 .get_property = bq24190_battery_get_property,
1569 .set_property = bq24190_battery_set_property,
1570 .property_is_writeable = bq24190_battery_property_is_writeable,
1571 };
1572
1573 static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)
1574 {
1575 bool otg_enabled;
1576 int ret;
1577
1578 otg_enabled = !!(ss_reg & BQ24190_REG_SS_VBUS_STAT_MASK);
1579 ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled);
1580 if (ret < 0)
1581 dev_err(bdi->dev, "Can't set extcon state to %d: %d\n",
1582 otg_enabled, ret);
1583
1584 return ret;
1585 }
1586
1587 static void bq24190_check_status(struct bq24190_dev_info *bdi)
1588 {
1589 const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1590 const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
1591 | BQ24190_REG_F_NTC_FAULT_MASK;
1592 bool alert_charger = false, alert_battery = false;
1593 u8 ss_reg = 0, f_reg = 0;
1594 int i, ret;
1595
1596 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1597 if (ret < 0) {
1598 dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1599 return;
1600 }
1601
1602 i = 0;
1603 do {
1604 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1605 if (ret < 0) {
1606 dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1607 return;
1608 }
1609 } while (f_reg && ++i < 2);
1610
1611
1612 if (f_reg == (1 << BQ24190_REG_F_CHRG_FAULT_SHIFT) &&
1613 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK))
1614 f_reg = 0;
1615
1616 if (f_reg != bdi->f_reg) {
1617 dev_warn(bdi->dev,
1618 "Fault: boost %d, charge %d, battery %d, ntc %d\n",
1619 !!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
1620 !!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
1621 !!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
1622 !!(f_reg & BQ24190_REG_F_NTC_FAULT_MASK));
1623
1624 mutex_lock(&bdi->f_reg_lock);
1625 if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1626 alert_battery = true;
1627 if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1628 alert_charger = true;
1629 bdi->f_reg = f_reg;
1630 mutex_unlock(&bdi->f_reg_lock);
1631 }
1632
1633 if (ss_reg != bdi->ss_reg) {
1634
1635
1636
1637
1638 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1639 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1640 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1641 BQ24190_REG_ISC_EN_HIZ_MASK,
1642 BQ24190_REG_ISC_EN_HIZ_SHIFT,
1643 0);
1644 if (ret < 0)
1645 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1646 ret);
1647 }
1648
1649 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1650 alert_battery = true;
1651 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1652 alert_charger = true;
1653 bdi->ss_reg = ss_reg;
1654 }
1655
1656 if (alert_charger || alert_battery) {
1657 power_supply_changed(bdi->charger);
1658 bq24190_configure_usb_otg(bdi, ss_reg);
1659 }
1660 if (alert_battery && bdi->battery)
1661 power_supply_changed(bdi->battery);
1662
1663 dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1664 }
1665
1666 static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1667 {
1668 struct bq24190_dev_info *bdi = data;
1669 int error;
1670
1671 bdi->irq_event = true;
1672 error = pm_runtime_resume_and_get(bdi->dev);
1673 if (error < 0) {
1674 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1675 return IRQ_NONE;
1676 }
1677 bq24190_check_status(bdi);
1678 pm_runtime_mark_last_busy(bdi->dev);
1679 pm_runtime_put_autosuspend(bdi->dev);
1680 bdi->irq_event = false;
1681
1682 return IRQ_HANDLED;
1683 }
1684
1685 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1686 {
1687 u8 v;
1688 int ret;
1689
1690
1691 ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1692 BQ24190_REG_VPRS_PN_MASK,
1693 BQ24190_REG_VPRS_PN_SHIFT,
1694 &v);
1695 if (ret < 0)
1696 return ret;
1697
1698 switch (v) {
1699 case BQ24190_REG_VPRS_PN_24190:
1700 case BQ24190_REG_VPRS_PN_24192:
1701 case BQ24190_REG_VPRS_PN_24192I:
1702 break;
1703 default:
1704 dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1705 return -ENODEV;
1706 }
1707
1708 ret = bq24190_register_reset(bdi);
1709 if (ret < 0)
1710 return ret;
1711
1712 ret = bq24190_set_config(bdi);
1713 if (ret < 0)
1714 return ret;
1715
1716 return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1717 }
1718
1719 static int bq24190_get_config(struct bq24190_dev_info *bdi)
1720 {
1721 const char * const s = "ti,system-minimum-microvolt";
1722 struct power_supply_battery_info *info;
1723 int v, idx;
1724
1725 idx = ARRAY_SIZE(bq24190_ccc_ichg_values) - 1;
1726 bdi->ichg_max = bq24190_ccc_ichg_values[idx];
1727
1728 idx = ARRAY_SIZE(bq24190_cvc_vreg_values) - 1;
1729 bdi->vreg_max = bq24190_cvc_vreg_values[idx];
1730
1731 if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1732 v /= 1000;
1733 if (v >= BQ24190_REG_POC_SYS_MIN_MIN
1734 && v <= BQ24190_REG_POC_SYS_MIN_MAX)
1735 bdi->sys_min = v;
1736 else
1737 dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1738 }
1739
1740 if (!power_supply_get_battery_info(bdi->charger, &info)) {
1741 v = info->precharge_current_ua / 1000;
1742 if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
1743 && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
1744 bdi->iprechg = v;
1745 else
1746 dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1747 v);
1748
1749 v = info->charge_term_current_ua / 1000;
1750 if (v >= BQ24190_REG_PCTCC_ITERM_MIN
1751 && v <= BQ24190_REG_PCTCC_ITERM_MAX)
1752 bdi->iterm = v;
1753 else
1754 dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1755 v);
1756
1757
1758 v = info->constant_charge_current_max_ua;
1759 if (v >= bq24190_ccc_ichg_values[0] && v <= bdi->ichg_max)
1760 bdi->ichg = bdi->ichg_max = v;
1761
1762 v = info->constant_charge_voltage_max_uv;
1763 if (v >= bq24190_cvc_vreg_values[0] && v <= bdi->vreg_max)
1764 bdi->vreg = bdi->vreg_max = v;
1765 }
1766
1767 return 0;
1768 }
1769
1770 static int bq24190_probe(struct i2c_client *client,
1771 const struct i2c_device_id *id)
1772 {
1773 struct i2c_adapter *adapter = client->adapter;
1774 struct device *dev = &client->dev;
1775 struct power_supply_config charger_cfg = {}, battery_cfg = {};
1776 struct bq24190_dev_info *bdi;
1777 int ret;
1778
1779 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1780 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1781 return -ENODEV;
1782 }
1783
1784 bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1785 if (!bdi) {
1786 dev_err(dev, "Can't alloc bdi struct\n");
1787 return -ENOMEM;
1788 }
1789
1790 bdi->client = client;
1791 bdi->dev = dev;
1792 strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1793 mutex_init(&bdi->f_reg_lock);
1794 bdi->charge_type = POWER_SUPPLY_CHARGE_TYPE_FAST;
1795 bdi->f_reg = 0;
1796 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK;
1797 INIT_DELAYED_WORK(&bdi->input_current_limit_work,
1798 bq24190_input_current_limit_work);
1799
1800 i2c_set_clientdata(client, bdi);
1801
1802 if (client->irq <= 0) {
1803 dev_err(dev, "Can't get irq info\n");
1804 return -EINVAL;
1805 }
1806
1807 bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable);
1808 if (IS_ERR(bdi->edev))
1809 return PTR_ERR(bdi->edev);
1810
1811 ret = devm_extcon_dev_register(dev, bdi->edev);
1812 if (ret < 0)
1813 return ret;
1814
1815 pm_runtime_enable(dev);
1816 pm_runtime_use_autosuspend(dev);
1817 pm_runtime_set_autosuspend_delay(dev, 600);
1818 ret = pm_runtime_get_sync(dev);
1819 if (ret < 0) {
1820 dev_err(dev, "pm_runtime_get failed: %i\n", ret);
1821 goto out_pmrt;
1822 }
1823
1824 #ifdef CONFIG_SYSFS
1825 bq24190_sysfs_init_attrs();
1826 charger_cfg.attr_grp = bq24190_sysfs_groups;
1827 #endif
1828
1829 charger_cfg.drv_data = bdi;
1830 charger_cfg.of_node = dev->of_node;
1831 charger_cfg.supplied_to = bq24190_charger_supplied_to;
1832 charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to);
1833 bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1834 &charger_cfg);
1835 if (IS_ERR(bdi->charger)) {
1836 dev_err(dev, "Can't register charger\n");
1837 ret = PTR_ERR(bdi->charger);
1838 goto out_pmrt;
1839 }
1840
1841
1842
1843 if (!device_property_read_bool(dev, "omit-battery-class")) {
1844 battery_cfg.drv_data = bdi;
1845 bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1846 &battery_cfg);
1847 if (IS_ERR(bdi->battery)) {
1848 dev_err(dev, "Can't register battery\n");
1849 ret = PTR_ERR(bdi->battery);
1850 goto out_charger;
1851 }
1852 }
1853
1854 ret = bq24190_get_config(bdi);
1855 if (ret < 0) {
1856 dev_err(dev, "Can't get devicetree config\n");
1857 goto out_charger;
1858 }
1859
1860 ret = bq24190_hw_init(bdi);
1861 if (ret < 0) {
1862 dev_err(dev, "Hardware init failed\n");
1863 goto out_charger;
1864 }
1865
1866 ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg);
1867 if (ret < 0)
1868 goto out_charger;
1869
1870 bdi->initialized = true;
1871
1872 ret = devm_request_threaded_irq(dev, client->irq, NULL,
1873 bq24190_irq_handler_thread,
1874 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1875 "bq24190-charger", bdi);
1876 if (ret < 0) {
1877 dev_err(dev, "Can't set up irq handler\n");
1878 goto out_charger;
1879 }
1880
1881 ret = bq24190_register_vbus_regulator(bdi);
1882 if (ret < 0)
1883 goto out_charger;
1884
1885 enable_irq_wake(client->irq);
1886
1887 pm_runtime_mark_last_busy(dev);
1888 pm_runtime_put_autosuspend(dev);
1889
1890 return 0;
1891
1892 out_charger:
1893 if (!IS_ERR_OR_NULL(bdi->battery))
1894 power_supply_unregister(bdi->battery);
1895 power_supply_unregister(bdi->charger);
1896
1897 out_pmrt:
1898 pm_runtime_put_sync(dev);
1899 pm_runtime_dont_use_autosuspend(dev);
1900 pm_runtime_disable(dev);
1901 return ret;
1902 }
1903
1904 static int bq24190_remove(struct i2c_client *client)
1905 {
1906 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1907 int error;
1908
1909 error = pm_runtime_resume_and_get(bdi->dev);
1910 if (error < 0)
1911 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1912
1913 bq24190_register_reset(bdi);
1914 if (bdi->battery)
1915 power_supply_unregister(bdi->battery);
1916 power_supply_unregister(bdi->charger);
1917 if (error >= 0)
1918 pm_runtime_put_sync(bdi->dev);
1919 pm_runtime_dont_use_autosuspend(bdi->dev);
1920 pm_runtime_disable(bdi->dev);
1921
1922 return 0;
1923 }
1924
1925 static void bq24190_shutdown(struct i2c_client *client)
1926 {
1927 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1928
1929
1930 bq24190_set_otg_vbus(bdi, false);
1931 }
1932
1933 static __maybe_unused int bq24190_runtime_suspend(struct device *dev)
1934 {
1935 struct i2c_client *client = to_i2c_client(dev);
1936 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1937
1938 if (!bdi->initialized)
1939 return 0;
1940
1941 dev_dbg(bdi->dev, "%s\n", __func__);
1942
1943 return 0;
1944 }
1945
1946 static __maybe_unused int bq24190_runtime_resume(struct device *dev)
1947 {
1948 struct i2c_client *client = to_i2c_client(dev);
1949 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1950
1951 if (!bdi->initialized)
1952 return 0;
1953
1954 if (!bdi->irq_event) {
1955 dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
1956 bq24190_check_status(bdi);
1957 }
1958
1959 return 0;
1960 }
1961
1962 static __maybe_unused int bq24190_pm_suspend(struct device *dev)
1963 {
1964 struct i2c_client *client = to_i2c_client(dev);
1965 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1966 int error;
1967
1968 error = pm_runtime_resume_and_get(bdi->dev);
1969 if (error < 0)
1970 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1971
1972 bq24190_register_reset(bdi);
1973
1974 if (error >= 0) {
1975 pm_runtime_mark_last_busy(bdi->dev);
1976 pm_runtime_put_autosuspend(bdi->dev);
1977 }
1978
1979 return 0;
1980 }
1981
1982 static __maybe_unused int bq24190_pm_resume(struct device *dev)
1983 {
1984 struct i2c_client *client = to_i2c_client(dev);
1985 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1986 int error;
1987
1988 bdi->f_reg = 0;
1989 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK;
1990
1991 error = pm_runtime_resume_and_get(bdi->dev);
1992 if (error < 0)
1993 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1994
1995 bq24190_register_reset(bdi);
1996 bq24190_set_config(bdi);
1997 bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1998
1999 if (error >= 0) {
2000 pm_runtime_mark_last_busy(bdi->dev);
2001 pm_runtime_put_autosuspend(bdi->dev);
2002 }
2003
2004
2005 power_supply_changed(bdi->charger);
2006 if (bdi->battery)
2007 power_supply_changed(bdi->battery);
2008
2009 return 0;
2010 }
2011
2012 static const struct dev_pm_ops bq24190_pm_ops = {
2013 SET_RUNTIME_PM_OPS(bq24190_runtime_suspend, bq24190_runtime_resume,
2014 NULL)
2015 SET_SYSTEM_SLEEP_PM_OPS(bq24190_pm_suspend, bq24190_pm_resume)
2016 };
2017
2018 static const struct i2c_device_id bq24190_i2c_ids[] = {
2019 { "bq24190" },
2020 { "bq24192" },
2021 { "bq24192i" },
2022 { "bq24196" },
2023 { },
2024 };
2025 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
2026
2027 static const struct of_device_id bq24190_of_match[] = {
2028 { .compatible = "ti,bq24190", },
2029 { .compatible = "ti,bq24192", },
2030 { .compatible = "ti,bq24192i", },
2031 { .compatible = "ti,bq24196", },
2032 { },
2033 };
2034 MODULE_DEVICE_TABLE(of, bq24190_of_match);
2035
2036 static struct i2c_driver bq24190_driver = {
2037 .probe = bq24190_probe,
2038 .remove = bq24190_remove,
2039 .shutdown = bq24190_shutdown,
2040 .id_table = bq24190_i2c_ids,
2041 .driver = {
2042 .name = "bq24190-charger",
2043 .pm = &bq24190_pm_ops,
2044 .of_match_table = bq24190_of_match,
2045 },
2046 };
2047 module_i2c_driver(bq24190_driver);
2048
2049 MODULE_LICENSE("GPL");
2050 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
2051 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");