Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 // BQ25980 Battery Charger Driver
0003 // Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
0004 
0005 #include <linux/err.h>
0006 #include <linux/i2c.h>
0007 #include <linux/init.h>
0008 #include <linux/interrupt.h>
0009 #include <linux/kernel.h>
0010 #include <linux/module.h>
0011 #include <linux/gpio/consumer.h>
0012 #include <linux/power_supply.h>
0013 #include <linux/regmap.h>
0014 #include <linux/types.h>
0015 #include <linux/delay.h>
0016 #include <linux/device.h>
0017 #include <linux/moduleparam.h>
0018 #include <linux/slab.h>
0019 
0020 #include "bq25980_charger.h"
0021 
0022 struct bq25980_state {
0023     bool dischg;
0024     bool ovp;
0025     bool ocp;
0026     bool wdt;
0027     bool tflt;
0028     bool online;
0029     bool ce;
0030     bool hiz;
0031     bool bypass;
0032 
0033     u32 vbat_adc;
0034     u32 vsys_adc;
0035     u32 ibat_adc;
0036 };
0037 
0038 enum bq25980_id {
0039     BQ25980,
0040     BQ25975,
0041     BQ25960,
0042 };
0043 
0044 struct bq25980_chip_info {
0045 
0046     int model_id;
0047 
0048     const struct regmap_config *regmap_config;
0049 
0050     int busocp_def;
0051     int busocp_sc_max;
0052     int busocp_byp_max;
0053     int busocp_sc_min;
0054     int busocp_byp_min;
0055 
0056     int busovp_sc_def;
0057     int busovp_byp_def;
0058     int busovp_sc_step;
0059 
0060     int busovp_sc_offset;
0061     int busovp_byp_step;
0062     int busovp_byp_offset;
0063     int busovp_sc_min;
0064     int busovp_sc_max;
0065     int busovp_byp_min;
0066     int busovp_byp_max;
0067 
0068     int batovp_def;
0069     int batovp_max;
0070     int batovp_min;
0071     int batovp_step;
0072     int batovp_offset;
0073 
0074     int batocp_def;
0075     int batocp_max;
0076 };
0077 
0078 struct bq25980_init_data {
0079     u32 ichg;
0080     u32 bypass_ilim;
0081     u32 sc_ilim;
0082     u32 vreg;
0083     u32 iterm;
0084     u32 iprechg;
0085     u32 bypass_vlim;
0086     u32 sc_vlim;
0087     u32 ichg_max;
0088     u32 vreg_max;
0089 };
0090 
0091 struct bq25980_device {
0092     struct i2c_client *client;
0093     struct device *dev;
0094     struct power_supply *charger;
0095     struct power_supply *battery;
0096     struct mutex lock;
0097     struct regmap *regmap;
0098 
0099     char model_name[I2C_NAME_SIZE];
0100 
0101     struct bq25980_init_data init_data;
0102     const struct bq25980_chip_info *chip_info;
0103     struct bq25980_state state;
0104     int watchdog_timer;
0105 };
0106 
0107 static struct reg_default bq25980_reg_defs[] = {
0108     {BQ25980_BATOVP, 0x5A},
0109     {BQ25980_BATOVP_ALM, 0x46},
0110     {BQ25980_BATOCP, 0x51},
0111     {BQ25980_BATOCP_ALM, 0x50},
0112     {BQ25980_BATUCP_ALM, 0x28},
0113     {BQ25980_CHRGR_CTRL_1, 0x0},
0114     {BQ25980_BUSOVP, 0x26},
0115     {BQ25980_BUSOVP_ALM, 0x22},
0116     {BQ25980_BUSOCP, 0xD},
0117     {BQ25980_BUSOCP_ALM, 0xC},
0118     {BQ25980_TEMP_CONTROL, 0x30},
0119     {BQ25980_TDIE_ALM, 0xC8},
0120     {BQ25980_TSBUS_FLT, 0x15},
0121     {BQ25980_TSBAT_FLG, 0x15},
0122     {BQ25980_VAC_CONTROL, 0x0},
0123     {BQ25980_CHRGR_CTRL_2, 0x0},
0124     {BQ25980_CHRGR_CTRL_3, 0x20},
0125     {BQ25980_CHRGR_CTRL_4, 0x1D},
0126     {BQ25980_CHRGR_CTRL_5, 0x18},
0127     {BQ25980_STAT1, 0x0},
0128     {BQ25980_STAT2, 0x0},
0129     {BQ25980_STAT3, 0x0},
0130     {BQ25980_STAT4, 0x0},
0131     {BQ25980_STAT5, 0x0},
0132     {BQ25980_FLAG1, 0x0},
0133     {BQ25980_FLAG2, 0x0},
0134     {BQ25980_FLAG3, 0x0},
0135     {BQ25980_FLAG4, 0x0},
0136     {BQ25980_FLAG5, 0x0},
0137     {BQ25980_MASK1, 0x0},
0138     {BQ25980_MASK2, 0x0},
0139     {BQ25980_MASK3, 0x0},
0140     {BQ25980_MASK4, 0x0},
0141     {BQ25980_MASK5, 0x0},
0142     {BQ25980_DEVICE_INFO, 0x8},
0143     {BQ25980_ADC_CONTROL1, 0x0},
0144     {BQ25980_ADC_CONTROL2, 0x0},
0145     {BQ25980_IBUS_ADC_LSB, 0x0},
0146     {BQ25980_IBUS_ADC_MSB, 0x0},
0147     {BQ25980_VBUS_ADC_LSB, 0x0},
0148     {BQ25980_VBUS_ADC_MSB, 0x0},
0149     {BQ25980_VAC1_ADC_LSB, 0x0},
0150     {BQ25980_VAC2_ADC_LSB, 0x0},
0151     {BQ25980_VOUT_ADC_LSB, 0x0},
0152     {BQ25980_VBAT_ADC_LSB, 0x0},
0153     {BQ25980_IBAT_ADC_MSB, 0x0},
0154     {BQ25980_IBAT_ADC_LSB, 0x0},
0155     {BQ25980_TSBUS_ADC_LSB, 0x0},
0156     {BQ25980_TSBAT_ADC_LSB, 0x0},
0157     {BQ25980_TDIE_ADC_LSB, 0x0},
0158     {BQ25980_DEGLITCH_TIME, 0x0},
0159     {BQ25980_CHRGR_CTRL_6, 0x0},
0160 };
0161 
0162 static struct reg_default bq25975_reg_defs[] = {
0163     {BQ25980_BATOVP, 0x5A},
0164     {BQ25980_BATOVP_ALM, 0x46},
0165     {BQ25980_BATOCP, 0x51},
0166     {BQ25980_BATOCP_ALM, 0x50},
0167     {BQ25980_BATUCP_ALM, 0x28},
0168     {BQ25980_CHRGR_CTRL_1, 0x0},
0169     {BQ25980_BUSOVP, 0x26},
0170     {BQ25980_BUSOVP_ALM, 0x22},
0171     {BQ25980_BUSOCP, 0xD},
0172     {BQ25980_BUSOCP_ALM, 0xC},
0173     {BQ25980_TEMP_CONTROL, 0x30},
0174     {BQ25980_TDIE_ALM, 0xC8},
0175     {BQ25980_TSBUS_FLT, 0x15},
0176     {BQ25980_TSBAT_FLG, 0x15},
0177     {BQ25980_VAC_CONTROL, 0x0},
0178     {BQ25980_CHRGR_CTRL_2, 0x0},
0179     {BQ25980_CHRGR_CTRL_3, 0x20},
0180     {BQ25980_CHRGR_CTRL_4, 0x1D},
0181     {BQ25980_CHRGR_CTRL_5, 0x18},
0182     {BQ25980_STAT1, 0x0},
0183     {BQ25980_STAT2, 0x0},
0184     {BQ25980_STAT3, 0x0},
0185     {BQ25980_STAT4, 0x0},
0186     {BQ25980_STAT5, 0x0},
0187     {BQ25980_FLAG1, 0x0},
0188     {BQ25980_FLAG2, 0x0},
0189     {BQ25980_FLAG3, 0x0},
0190     {BQ25980_FLAG4, 0x0},
0191     {BQ25980_FLAG5, 0x0},
0192     {BQ25980_MASK1, 0x0},
0193     {BQ25980_MASK2, 0x0},
0194     {BQ25980_MASK3, 0x0},
0195     {BQ25980_MASK4, 0x0},
0196     {BQ25980_MASK5, 0x0},
0197     {BQ25980_DEVICE_INFO, 0x8},
0198     {BQ25980_ADC_CONTROL1, 0x0},
0199     {BQ25980_ADC_CONTROL2, 0x0},
0200     {BQ25980_IBUS_ADC_LSB, 0x0},
0201     {BQ25980_IBUS_ADC_MSB, 0x0},
0202     {BQ25980_VBUS_ADC_LSB, 0x0},
0203     {BQ25980_VBUS_ADC_MSB, 0x0},
0204     {BQ25980_VAC1_ADC_LSB, 0x0},
0205     {BQ25980_VAC2_ADC_LSB, 0x0},
0206     {BQ25980_VOUT_ADC_LSB, 0x0},
0207     {BQ25980_VBAT_ADC_LSB, 0x0},
0208     {BQ25980_IBAT_ADC_MSB, 0x0},
0209     {BQ25980_IBAT_ADC_LSB, 0x0},
0210     {BQ25980_TSBUS_ADC_LSB, 0x0},
0211     {BQ25980_TSBAT_ADC_LSB, 0x0},
0212     {BQ25980_TDIE_ADC_LSB, 0x0},
0213     {BQ25980_DEGLITCH_TIME, 0x0},
0214     {BQ25980_CHRGR_CTRL_6, 0x0},
0215 };
0216 
0217 static struct reg_default bq25960_reg_defs[] = {
0218     {BQ25980_BATOVP, 0x5A},
0219     {BQ25980_BATOVP_ALM, 0x46},
0220     {BQ25980_BATOCP, 0x51},
0221     {BQ25980_BATOCP_ALM, 0x50},
0222     {BQ25980_BATUCP_ALM, 0x28},
0223     {BQ25980_CHRGR_CTRL_1, 0x0},
0224     {BQ25980_BUSOVP, 0x26},
0225     {BQ25980_BUSOVP_ALM, 0x22},
0226     {BQ25980_BUSOCP, 0xD},
0227     {BQ25980_BUSOCP_ALM, 0xC},
0228     {BQ25980_TEMP_CONTROL, 0x30},
0229     {BQ25980_TDIE_ALM, 0xC8},
0230     {BQ25980_TSBUS_FLT, 0x15},
0231     {BQ25980_TSBAT_FLG, 0x15},
0232     {BQ25980_VAC_CONTROL, 0x0},
0233     {BQ25980_CHRGR_CTRL_2, 0x0},
0234     {BQ25980_CHRGR_CTRL_3, 0x20},
0235     {BQ25980_CHRGR_CTRL_4, 0x1D},
0236     {BQ25980_CHRGR_CTRL_5, 0x18},
0237     {BQ25980_STAT1, 0x0},
0238     {BQ25980_STAT2, 0x0},
0239     {BQ25980_STAT3, 0x0},
0240     {BQ25980_STAT4, 0x0},
0241     {BQ25980_STAT5, 0x0},
0242     {BQ25980_FLAG1, 0x0},
0243     {BQ25980_FLAG2, 0x0},
0244     {BQ25980_FLAG3, 0x0},
0245     {BQ25980_FLAG4, 0x0},
0246     {BQ25980_FLAG5, 0x0},
0247     {BQ25980_MASK1, 0x0},
0248     {BQ25980_MASK2, 0x0},
0249     {BQ25980_MASK3, 0x0},
0250     {BQ25980_MASK4, 0x0},
0251     {BQ25980_MASK5, 0x0},
0252     {BQ25980_DEVICE_INFO, 0x8},
0253     {BQ25980_ADC_CONTROL1, 0x0},
0254     {BQ25980_ADC_CONTROL2, 0x0},
0255     {BQ25980_IBUS_ADC_LSB, 0x0},
0256     {BQ25980_IBUS_ADC_MSB, 0x0},
0257     {BQ25980_VBUS_ADC_LSB, 0x0},
0258     {BQ25980_VBUS_ADC_MSB, 0x0},
0259     {BQ25980_VAC1_ADC_LSB, 0x0},
0260     {BQ25980_VAC2_ADC_LSB, 0x0},
0261     {BQ25980_VOUT_ADC_LSB, 0x0},
0262     {BQ25980_VBAT_ADC_LSB, 0x0},
0263     {BQ25980_IBAT_ADC_MSB, 0x0},
0264     {BQ25980_IBAT_ADC_LSB, 0x0},
0265     {BQ25980_TSBUS_ADC_LSB, 0x0},
0266     {BQ25980_TSBAT_ADC_LSB, 0x0},
0267     {BQ25980_TDIE_ADC_LSB, 0x0},
0268     {BQ25980_DEGLITCH_TIME, 0x0},
0269     {BQ25980_CHRGR_CTRL_6, 0x0},
0270 };
0271 
0272 static int bq25980_watchdog_time[BQ25980_NUM_WD_VAL] = {5000, 10000, 50000,
0273                             300000};
0274 
0275 static int bq25980_get_input_curr_lim(struct bq25980_device *bq)
0276 {
0277     unsigned int busocp_reg_code;
0278     int ret;
0279 
0280     ret = regmap_read(bq->regmap, BQ25980_BUSOCP, &busocp_reg_code);
0281     if (ret)
0282         return ret;
0283 
0284     return (busocp_reg_code * BQ25980_BUSOCP_STEP_uA) + BQ25980_BUSOCP_OFFSET_uA;
0285 }
0286 
0287 static int bq25980_set_hiz(struct bq25980_device *bq, int setting)
0288 {
0289     return regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2,
0290             BQ25980_EN_HIZ, setting);
0291 }
0292 
0293 static int bq25980_set_input_curr_lim(struct bq25980_device *bq, int busocp)
0294 {
0295     unsigned int busocp_reg_code;
0296     int ret;
0297 
0298     if (!busocp)
0299         return bq25980_set_hiz(bq, BQ25980_ENABLE_HIZ);
0300 
0301     bq25980_set_hiz(bq, BQ25980_DISABLE_HIZ);
0302 
0303     if (busocp < BQ25980_BUSOCP_MIN_uA)
0304         busocp = BQ25980_BUSOCP_MIN_uA;
0305 
0306     if (bq->state.bypass)
0307         busocp = min(busocp, bq->chip_info->busocp_sc_max);
0308     else
0309         busocp = min(busocp, bq->chip_info->busocp_byp_max);
0310 
0311     busocp_reg_code = (busocp - BQ25980_BUSOCP_OFFSET_uA)
0312                         / BQ25980_BUSOCP_STEP_uA;
0313 
0314     ret = regmap_write(bq->regmap, BQ25980_BUSOCP, busocp_reg_code);
0315     if (ret)
0316         return ret;
0317 
0318     return regmap_write(bq->regmap, BQ25980_BUSOCP_ALM, busocp_reg_code);
0319 }
0320 
0321 static int bq25980_get_input_volt_lim(struct bq25980_device *bq)
0322 {
0323     unsigned int busovp_reg_code;
0324     unsigned int busovp_offset;
0325     unsigned int busovp_step;
0326     int ret;
0327 
0328     if (bq->state.bypass) {
0329         busovp_step = bq->chip_info->busovp_byp_step;
0330         busovp_offset = bq->chip_info->busovp_byp_offset;
0331     } else {
0332         busovp_step = bq->chip_info->busovp_sc_step;
0333         busovp_offset = bq->chip_info->busovp_sc_offset;
0334     }
0335 
0336     ret = regmap_read(bq->regmap, BQ25980_BUSOVP, &busovp_reg_code);
0337     if (ret)
0338         return ret;
0339 
0340     return (busovp_reg_code * busovp_step) + busovp_offset;
0341 }
0342 
0343 static int bq25980_set_input_volt_lim(struct bq25980_device *bq, int busovp)
0344 {
0345     unsigned int busovp_reg_code;
0346     unsigned int busovp_step;
0347     unsigned int busovp_offset;
0348     int ret;
0349 
0350     if (bq->state.bypass) {
0351         busovp_step = bq->chip_info->busovp_byp_step;
0352         busovp_offset = bq->chip_info->busovp_byp_offset;
0353         if (busovp > bq->chip_info->busovp_byp_max)
0354             busovp = bq->chip_info->busovp_byp_max;
0355         else if (busovp < bq->chip_info->busovp_byp_min)
0356             busovp = bq->chip_info->busovp_byp_min;
0357     } else {
0358         busovp_step = bq->chip_info->busovp_sc_step;
0359         busovp_offset = bq->chip_info->busovp_sc_offset;
0360         if (busovp > bq->chip_info->busovp_sc_max)
0361             busovp = bq->chip_info->busovp_sc_max;
0362         else if (busovp < bq->chip_info->busovp_sc_min)
0363             busovp = bq->chip_info->busovp_sc_min;
0364     }
0365 
0366     busovp_reg_code = (busovp - busovp_offset) / busovp_step;
0367 
0368     ret = regmap_write(bq->regmap, BQ25980_BUSOVP, busovp_reg_code);
0369     if (ret)
0370         return ret;
0371 
0372     return regmap_write(bq->regmap, BQ25980_BUSOVP_ALM, busovp_reg_code);
0373 }
0374 
0375 static int bq25980_get_const_charge_curr(struct bq25980_device *bq)
0376 {
0377     unsigned int batocp_reg_code;
0378     int ret;
0379 
0380     ret = regmap_read(bq->regmap, BQ25980_BATOCP, &batocp_reg_code);
0381     if (ret)
0382         return ret;
0383 
0384     return (batocp_reg_code & BQ25980_BATOCP_MASK) *
0385                         BQ25980_BATOCP_STEP_uA;
0386 }
0387 
0388 static int bq25980_set_const_charge_curr(struct bq25980_device *bq, int batocp)
0389 {
0390     unsigned int batocp_reg_code;
0391     int ret;
0392 
0393     batocp = max(batocp, BQ25980_BATOCP_MIN_uA);
0394     batocp = min(batocp, bq->chip_info->batocp_max);
0395 
0396     batocp_reg_code = batocp / BQ25980_BATOCP_STEP_uA;
0397 
0398     ret = regmap_update_bits(bq->regmap, BQ25980_BATOCP,
0399                 BQ25980_BATOCP_MASK, batocp_reg_code);
0400     if (ret)
0401         return ret;
0402 
0403     return regmap_update_bits(bq->regmap, BQ25980_BATOCP_ALM,
0404                 BQ25980_BATOCP_MASK, batocp_reg_code);
0405 }
0406 
0407 static int bq25980_get_const_charge_volt(struct bq25980_device *bq)
0408 {
0409     unsigned int batovp_reg_code;
0410     int ret;
0411 
0412     ret = regmap_read(bq->regmap, BQ25980_BATOVP, &batovp_reg_code);
0413     if (ret)
0414         return ret;
0415 
0416     return ((batovp_reg_code * bq->chip_info->batovp_step) +
0417             bq->chip_info->batovp_offset);
0418 }
0419 
0420 static int bq25980_set_const_charge_volt(struct bq25980_device *bq, int batovp)
0421 {
0422     unsigned int batovp_reg_code;
0423     int ret;
0424 
0425     if (batovp < bq->chip_info->batovp_min)
0426         batovp = bq->chip_info->batovp_min;
0427 
0428     if (batovp > bq->chip_info->batovp_max)
0429         batovp = bq->chip_info->batovp_max;
0430 
0431     batovp_reg_code = (batovp - bq->chip_info->batovp_offset) /
0432                         bq->chip_info->batovp_step;
0433 
0434     ret = regmap_write(bq->regmap, BQ25980_BATOVP, batovp_reg_code);
0435     if (ret)
0436         return ret;
0437 
0438     return regmap_write(bq->regmap, BQ25980_BATOVP_ALM, batovp_reg_code);
0439 }
0440 
0441 static int bq25980_set_bypass(struct bq25980_device *bq, bool en_bypass)
0442 {
0443     int ret;
0444 
0445     if (en_bypass)
0446         ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2,
0447                     BQ25980_EN_BYPASS, BQ25980_EN_BYPASS);
0448     else
0449         ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2,
0450                     BQ25980_EN_BYPASS, en_bypass);
0451     if (ret)
0452         return ret;
0453 
0454     bq->state.bypass = en_bypass;
0455 
0456     return bq->state.bypass;
0457 }
0458 
0459 static int bq25980_set_chg_en(struct bq25980_device *bq, bool en_chg)
0460 {
0461     int ret;
0462 
0463     if (en_chg)
0464         ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2,
0465                     BQ25980_CHG_EN, BQ25980_CHG_EN);
0466     else
0467         ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2,
0468                     BQ25980_CHG_EN, en_chg);
0469     if (ret)
0470         return ret;
0471 
0472     bq->state.ce = en_chg;
0473 
0474     return 0;
0475 }
0476 
0477 static int bq25980_get_adc_ibus(struct bq25980_device *bq)
0478 {
0479     int ibus_adc_lsb, ibus_adc_msb;
0480     u16 ibus_adc;
0481     int ret;
0482 
0483     ret = regmap_read(bq->regmap, BQ25980_IBUS_ADC_MSB, &ibus_adc_msb);
0484     if (ret)
0485         return ret;
0486 
0487     ret = regmap_read(bq->regmap, BQ25980_IBUS_ADC_LSB, &ibus_adc_lsb);
0488     if (ret)
0489         return ret;
0490 
0491     ibus_adc = (ibus_adc_msb << 8) | ibus_adc_lsb;
0492 
0493     if (ibus_adc_msb & BQ25980_ADC_POLARITY_BIT)
0494         return ((ibus_adc ^ 0xffff) + 1) * BQ25980_ADC_CURR_STEP_uA;
0495 
0496     return ibus_adc * BQ25980_ADC_CURR_STEP_uA;
0497 }
0498 
0499 static int bq25980_get_adc_vbus(struct bq25980_device *bq)
0500 {
0501     int vbus_adc_lsb, vbus_adc_msb;
0502     u16 vbus_adc;
0503     int ret;
0504 
0505     ret = regmap_read(bq->regmap, BQ25980_VBUS_ADC_MSB, &vbus_adc_msb);
0506     if (ret)
0507         return ret;
0508 
0509     ret = regmap_read(bq->regmap, BQ25980_VBUS_ADC_LSB, &vbus_adc_lsb);
0510     if (ret)
0511         return ret;
0512 
0513     vbus_adc = (vbus_adc_msb << 8) | vbus_adc_lsb;
0514 
0515     return vbus_adc * BQ25980_ADC_VOLT_STEP_uV;
0516 }
0517 
0518 static int bq25980_get_ibat_adc(struct bq25980_device *bq)
0519 {
0520     int ret;
0521     int ibat_adc_lsb, ibat_adc_msb;
0522     int ibat_adc;
0523 
0524     ret = regmap_read(bq->regmap, BQ25980_IBAT_ADC_MSB, &ibat_adc_msb);
0525     if (ret)
0526         return ret;
0527 
0528     ret = regmap_read(bq->regmap, BQ25980_IBAT_ADC_LSB, &ibat_adc_lsb);
0529     if (ret)
0530         return ret;
0531 
0532     ibat_adc = (ibat_adc_msb << 8) | ibat_adc_lsb;
0533 
0534     if (ibat_adc_msb & BQ25980_ADC_POLARITY_BIT)
0535         return ((ibat_adc ^ 0xffff) + 1) * BQ25980_ADC_CURR_STEP_uA;
0536 
0537     return ibat_adc * BQ25980_ADC_CURR_STEP_uA;
0538 }
0539 
0540 static int bq25980_get_adc_vbat(struct bq25980_device *bq)
0541 {
0542     int vsys_adc_lsb, vsys_adc_msb;
0543     u16 vsys_adc;
0544     int ret;
0545 
0546     ret = regmap_read(bq->regmap, BQ25980_VBAT_ADC_MSB, &vsys_adc_msb);
0547     if (ret)
0548         return ret;
0549 
0550     ret = regmap_read(bq->regmap, BQ25980_VBAT_ADC_LSB, &vsys_adc_lsb);
0551     if (ret)
0552         return ret;
0553 
0554     vsys_adc = (vsys_adc_msb << 8) | vsys_adc_lsb;
0555 
0556     return vsys_adc * BQ25980_ADC_VOLT_STEP_uV;
0557 }
0558 
0559 static int bq25980_get_state(struct bq25980_device *bq,
0560                 struct bq25980_state *state)
0561 {
0562     unsigned int chg_ctrl_2;
0563     unsigned int stat1;
0564     unsigned int stat2;
0565     unsigned int stat3;
0566     unsigned int stat4;
0567     unsigned int ibat_adc_msb;
0568     int ret;
0569 
0570     ret = regmap_read(bq->regmap, BQ25980_STAT1, &stat1);
0571     if (ret)
0572         return ret;
0573 
0574     ret = regmap_read(bq->regmap, BQ25980_STAT2, &stat2);
0575     if (ret)
0576         return ret;
0577 
0578     ret = regmap_read(bq->regmap, BQ25980_STAT3, &stat3);
0579     if (ret)
0580         return ret;
0581 
0582     ret = regmap_read(bq->regmap, BQ25980_STAT4, &stat4);
0583     if (ret)
0584         return ret;
0585 
0586     ret = regmap_read(bq->regmap, BQ25980_CHRGR_CTRL_2, &chg_ctrl_2);
0587     if (ret)
0588         return ret;
0589 
0590     ret = regmap_read(bq->regmap, BQ25980_IBAT_ADC_MSB, &ibat_adc_msb);
0591     if (ret)
0592         return ret;
0593 
0594     state->dischg = ibat_adc_msb & BQ25980_ADC_POLARITY_BIT;
0595     state->ovp = (stat1 & BQ25980_STAT1_OVP_MASK) |
0596         (stat3 & BQ25980_STAT3_OVP_MASK);
0597     state->ocp = (stat1 & BQ25980_STAT1_OCP_MASK) |
0598         (stat2 & BQ25980_STAT2_OCP_MASK);
0599     state->tflt = stat4 & BQ25980_STAT4_TFLT_MASK;
0600     state->wdt = stat4 & BQ25980_WD_STAT;
0601     state->online = stat3 & BQ25980_PRESENT_MASK;
0602     state->ce = chg_ctrl_2 & BQ25980_CHG_EN;
0603     state->hiz = chg_ctrl_2 & BQ25980_EN_HIZ;
0604     state->bypass = chg_ctrl_2 & BQ25980_EN_BYPASS;
0605 
0606     return 0;
0607 }
0608 
0609 static int bq25980_get_battery_property(struct power_supply *psy,
0610                 enum power_supply_property psp,
0611                 union power_supply_propval *val)
0612 {
0613     struct bq25980_device *bq = power_supply_get_drvdata(psy);
0614     int ret = 0;
0615 
0616     switch (psp) {
0617     case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
0618         val->intval = bq->init_data.ichg_max;
0619         break;
0620 
0621     case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
0622         val->intval = bq->init_data.vreg_max;
0623         break;
0624 
0625     case POWER_SUPPLY_PROP_CURRENT_NOW:
0626         ret = bq25980_get_ibat_adc(bq);
0627         val->intval = ret;
0628         break;
0629 
0630     case POWER_SUPPLY_PROP_VOLTAGE_NOW:
0631         ret = bq25980_get_adc_vbat(bq);
0632         if (ret < 0)
0633             return ret;
0634 
0635         val->intval = ret;
0636         break;
0637 
0638     default:
0639         return -EINVAL;
0640     }
0641 
0642     return ret;
0643 }
0644 
0645 static int bq25980_set_charger_property(struct power_supply *psy,
0646         enum power_supply_property prop,
0647         const union power_supply_propval *val)
0648 {
0649     struct bq25980_device *bq = power_supply_get_drvdata(psy);
0650     int ret = -EINVAL;
0651 
0652     switch (prop) {
0653     case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
0654         ret = bq25980_set_input_curr_lim(bq, val->intval);
0655         if (ret)
0656             return ret;
0657         break;
0658 
0659     case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
0660         ret = bq25980_set_input_volt_lim(bq, val->intval);
0661         if (ret)
0662             return ret;
0663         break;
0664 
0665     case POWER_SUPPLY_PROP_CHARGE_TYPE:
0666         ret = bq25980_set_bypass(bq, val->intval);
0667         if (ret)
0668             return ret;
0669         break;
0670 
0671     case POWER_SUPPLY_PROP_STATUS:
0672         ret = bq25980_set_chg_en(bq, val->intval);
0673         if (ret)
0674             return ret;
0675         break;
0676 
0677     case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
0678         ret = bq25980_set_const_charge_curr(bq, val->intval);
0679         if (ret)
0680             return ret;
0681         break;
0682 
0683     case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
0684         ret = bq25980_set_const_charge_volt(bq, val->intval);
0685         if (ret)
0686             return ret;
0687         break;
0688 
0689     default:
0690         return -EINVAL;
0691     }
0692 
0693     return ret;
0694 }
0695 
0696 static int bq25980_get_charger_property(struct power_supply *psy,
0697                 enum power_supply_property psp,
0698                 union power_supply_propval *val)
0699 {
0700     struct bq25980_device *bq = power_supply_get_drvdata(psy);
0701     struct bq25980_state state;
0702     int ret = 0;
0703 
0704     mutex_lock(&bq->lock);
0705     ret = bq25980_get_state(bq, &state);
0706     mutex_unlock(&bq->lock);
0707     if (ret)
0708         return ret;
0709 
0710     switch (psp) {
0711     case POWER_SUPPLY_PROP_MANUFACTURER:
0712         val->strval = BQ25980_MANUFACTURER;
0713         break;
0714     case POWER_SUPPLY_PROP_MODEL_NAME:
0715         val->strval = bq->model_name;
0716         break;
0717     case POWER_SUPPLY_PROP_ONLINE:
0718         val->intval = state.online;
0719         break;
0720 
0721     case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
0722         ret = bq25980_get_input_volt_lim(bq);
0723         if (ret < 0)
0724             return ret;
0725         val->intval = ret;
0726         break;
0727 
0728     case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
0729         ret = bq25980_get_input_curr_lim(bq);
0730         if (ret < 0)
0731             return ret;
0732 
0733         val->intval = ret;
0734         break;
0735 
0736     case POWER_SUPPLY_PROP_HEALTH:
0737         val->intval = POWER_SUPPLY_HEALTH_GOOD;
0738 
0739         if (state.tflt)
0740             val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
0741         else if (state.ovp)
0742             val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
0743         else if (state.ocp)
0744             val->intval = POWER_SUPPLY_HEALTH_OVERCURRENT;
0745         else if (state.wdt)
0746             val->intval =
0747                 POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE;
0748         break;
0749 
0750     case POWER_SUPPLY_PROP_STATUS:
0751         val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
0752 
0753         if ((state.ce) && (!state.hiz))
0754             val->intval = POWER_SUPPLY_STATUS_CHARGING;
0755         else if (state.dischg)
0756             val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
0757         else if (!state.ce)
0758             val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
0759         break;
0760 
0761     case POWER_SUPPLY_PROP_CHARGE_TYPE:
0762         val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
0763 
0764         if (!state.ce)
0765             val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
0766         else if (state.bypass)
0767             val->intval = POWER_SUPPLY_CHARGE_TYPE_BYPASS;
0768         else if (!state.bypass)
0769             val->intval = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
0770         break;
0771 
0772     case POWER_SUPPLY_PROP_CURRENT_NOW:
0773         ret = bq25980_get_adc_ibus(bq);
0774         if (ret < 0)
0775             return ret;
0776 
0777         val->intval = ret;
0778         break;
0779 
0780     case POWER_SUPPLY_PROP_VOLTAGE_NOW:
0781         ret = bq25980_get_adc_vbus(bq);
0782         if (ret < 0)
0783             return ret;
0784 
0785         val->intval = ret;
0786         break;
0787 
0788     case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
0789         ret = bq25980_get_const_charge_curr(bq);
0790         if (ret < 0)
0791             return ret;
0792 
0793         val->intval = ret;
0794         break;
0795 
0796     case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
0797         ret = bq25980_get_const_charge_volt(bq);
0798         if (ret < 0)
0799             return ret;
0800 
0801         val->intval = ret;
0802         break;
0803 
0804     default:
0805         return -EINVAL;
0806     }
0807 
0808     return ret;
0809 }
0810 
0811 static bool bq25980_state_changed(struct bq25980_device *bq,
0812                   struct bq25980_state *new_state)
0813 {
0814     struct bq25980_state old_state;
0815 
0816     mutex_lock(&bq->lock);
0817     old_state = bq->state;
0818     mutex_unlock(&bq->lock);
0819 
0820     return (old_state.dischg != new_state->dischg ||
0821         old_state.ovp != new_state->ovp ||
0822         old_state.ocp != new_state->ocp ||
0823         old_state.online != new_state->online ||
0824         old_state.wdt != new_state->wdt ||
0825         old_state.tflt != new_state->tflt ||
0826         old_state.ce != new_state->ce ||
0827         old_state.hiz != new_state->hiz ||
0828         old_state.bypass != new_state->bypass);
0829 }
0830 
0831 static irqreturn_t bq25980_irq_handler_thread(int irq, void *private)
0832 {
0833     struct bq25980_device *bq = private;
0834     struct bq25980_state state;
0835     int ret;
0836 
0837     ret = bq25980_get_state(bq, &state);
0838     if (ret < 0)
0839         goto irq_out;
0840 
0841     if (!bq25980_state_changed(bq, &state))
0842         goto irq_out;
0843 
0844     mutex_lock(&bq->lock);
0845     bq->state = state;
0846     mutex_unlock(&bq->lock);
0847 
0848     power_supply_changed(bq->charger);
0849 
0850 irq_out:
0851     return IRQ_HANDLED;
0852 }
0853 
0854 static enum power_supply_property bq25980_power_supply_props[] = {
0855     POWER_SUPPLY_PROP_MANUFACTURER,
0856     POWER_SUPPLY_PROP_MODEL_NAME,
0857     POWER_SUPPLY_PROP_STATUS,
0858     POWER_SUPPLY_PROP_ONLINE,
0859     POWER_SUPPLY_PROP_HEALTH,
0860     POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
0861     POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
0862     POWER_SUPPLY_PROP_CHARGE_TYPE,
0863     POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
0864     POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
0865     POWER_SUPPLY_PROP_CURRENT_NOW,
0866     POWER_SUPPLY_PROP_VOLTAGE_NOW,
0867 };
0868 
0869 static enum power_supply_property bq25980_battery_props[] = {
0870     POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
0871     POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
0872     POWER_SUPPLY_PROP_CURRENT_NOW,
0873     POWER_SUPPLY_PROP_VOLTAGE_NOW,
0874 };
0875 
0876 static char *bq25980_charger_supplied_to[] = {
0877     "main-battery",
0878 };
0879 
0880 static int bq25980_property_is_writeable(struct power_supply *psy,
0881                      enum power_supply_property prop)
0882 {
0883     switch (prop) {
0884     case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
0885     case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
0886     case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
0887     case POWER_SUPPLY_PROP_CHARGE_TYPE:
0888     case POWER_SUPPLY_PROP_STATUS:
0889     case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
0890         return true;
0891     default:
0892         return false;
0893     }
0894 }
0895 
0896 static const struct power_supply_desc bq25980_power_supply_desc = {
0897     .name = "bq25980-charger",
0898     .type = POWER_SUPPLY_TYPE_MAINS,
0899     .properties = bq25980_power_supply_props,
0900     .num_properties = ARRAY_SIZE(bq25980_power_supply_props),
0901     .get_property = bq25980_get_charger_property,
0902     .set_property = bq25980_set_charger_property,
0903     .property_is_writeable = bq25980_property_is_writeable,
0904 };
0905 
0906 static struct power_supply_desc bq25980_battery_desc = {
0907     .name           = "bq25980-battery",
0908     .type           = POWER_SUPPLY_TYPE_BATTERY,
0909     .get_property       = bq25980_get_battery_property,
0910     .properties     = bq25980_battery_props,
0911     .num_properties     = ARRAY_SIZE(bq25980_battery_props),
0912     .property_is_writeable  = bq25980_property_is_writeable,
0913 };
0914 
0915 
0916 static bool bq25980_is_volatile_reg(struct device *dev, unsigned int reg)
0917 {
0918     switch (reg) {
0919     case BQ25980_CHRGR_CTRL_2:
0920     case BQ25980_STAT1...BQ25980_FLAG5:
0921     case BQ25980_ADC_CONTROL1...BQ25980_TDIE_ADC_LSB:
0922         return true;
0923     default:
0924         return false;
0925     }
0926 }
0927 
0928 static const struct regmap_config bq25980_regmap_config = {
0929     .reg_bits = 8,
0930     .val_bits = 8,
0931 
0932     .max_register = BQ25980_CHRGR_CTRL_6,
0933     .reg_defaults   = bq25980_reg_defs,
0934     .num_reg_defaults = ARRAY_SIZE(bq25980_reg_defs),
0935     .cache_type = REGCACHE_RBTREE,
0936     .volatile_reg = bq25980_is_volatile_reg,
0937 };
0938 
0939 static const struct regmap_config bq25975_regmap_config = {
0940     .reg_bits = 8,
0941     .val_bits = 8,
0942 
0943     .max_register = BQ25980_CHRGR_CTRL_6,
0944     .reg_defaults   = bq25975_reg_defs,
0945     .num_reg_defaults = ARRAY_SIZE(bq25975_reg_defs),
0946     .cache_type = REGCACHE_RBTREE,
0947     .volatile_reg = bq25980_is_volatile_reg,
0948 };
0949 
0950 static const struct regmap_config bq25960_regmap_config = {
0951     .reg_bits = 8,
0952     .val_bits = 8,
0953 
0954     .max_register = BQ25980_CHRGR_CTRL_6,
0955     .reg_defaults   = bq25960_reg_defs,
0956     .num_reg_defaults = ARRAY_SIZE(bq25960_reg_defs),
0957     .cache_type = REGCACHE_RBTREE,
0958     .volatile_reg = bq25980_is_volatile_reg,
0959 };
0960 
0961 static const struct bq25980_chip_info bq25980_chip_info_tbl[] = {
0962     [BQ25980] = {
0963         .model_id = BQ25980,
0964         .regmap_config = &bq25980_regmap_config,
0965 
0966         .busocp_def = BQ25980_BUSOCP_DFLT_uA,
0967         .busocp_sc_min = BQ25960_BUSOCP_SC_MAX_uA,
0968         .busocp_sc_max = BQ25980_BUSOCP_SC_MAX_uA,
0969         .busocp_byp_max = BQ25980_BUSOCP_BYP_MAX_uA,
0970         .busocp_byp_min = BQ25980_BUSOCP_MIN_uA,
0971 
0972         .busovp_sc_def = BQ25980_BUSOVP_DFLT_uV,
0973         .busovp_byp_def = BQ25980_BUSOVP_BYPASS_DFLT_uV,
0974         .busovp_sc_step = BQ25980_BUSOVP_SC_STEP_uV,
0975         .busovp_sc_offset = BQ25980_BUSOVP_SC_OFFSET_uV,
0976         .busovp_byp_step = BQ25980_BUSOVP_BYP_STEP_uV,
0977         .busovp_byp_offset = BQ25980_BUSOVP_BYP_OFFSET_uV,
0978         .busovp_sc_min = BQ25980_BUSOVP_SC_MIN_uV,
0979         .busovp_sc_max = BQ25980_BUSOVP_SC_MAX_uV,
0980         .busovp_byp_min = BQ25980_BUSOVP_BYP_MIN_uV,
0981         .busovp_byp_max = BQ25980_BUSOVP_BYP_MAX_uV,
0982 
0983         .batovp_def = BQ25980_BATOVP_DFLT_uV,
0984         .batovp_max = BQ25980_BATOVP_MAX_uV,
0985         .batovp_min = BQ25980_BATOVP_MIN_uV,
0986         .batovp_step = BQ25980_BATOVP_STEP_uV,
0987         .batovp_offset = BQ25980_BATOVP_OFFSET_uV,
0988 
0989         .batocp_def = BQ25980_BATOCP_DFLT_uA,
0990         .batocp_max = BQ25980_BATOCP_MAX_uA,
0991     },
0992 
0993     [BQ25975] = {
0994         .model_id = BQ25975,
0995         .regmap_config = &bq25975_regmap_config,
0996 
0997         .busocp_def = BQ25975_BUSOCP_DFLT_uA,
0998         .busocp_sc_min = BQ25975_BUSOCP_SC_MAX_uA,
0999         .busocp_sc_max = BQ25975_BUSOCP_SC_MAX_uA,
1000         .busocp_byp_min = BQ25980_BUSOCP_MIN_uA,
1001         .busocp_byp_max = BQ25975_BUSOCP_BYP_MAX_uA,
1002 
1003         .busovp_sc_def = BQ25975_BUSOVP_DFLT_uV,
1004         .busovp_byp_def = BQ25975_BUSOVP_BYPASS_DFLT_uV,
1005         .busovp_sc_step = BQ25975_BUSOVP_SC_STEP_uV,
1006         .busovp_sc_offset = BQ25975_BUSOVP_SC_OFFSET_uV,
1007         .busovp_byp_step = BQ25975_BUSOVP_BYP_STEP_uV,
1008         .busovp_byp_offset = BQ25975_BUSOVP_BYP_OFFSET_uV,
1009         .busovp_sc_min = BQ25975_BUSOVP_SC_MIN_uV,
1010         .busovp_sc_max = BQ25975_BUSOVP_SC_MAX_uV,
1011         .busovp_byp_min = BQ25975_BUSOVP_BYP_MIN_uV,
1012         .busovp_byp_max = BQ25975_BUSOVP_BYP_MAX_uV,
1013 
1014         .batovp_def = BQ25975_BATOVP_DFLT_uV,
1015         .batovp_max = BQ25975_BATOVP_MAX_uV,
1016         .batovp_min = BQ25975_BATOVP_MIN_uV,
1017         .batovp_step = BQ25975_BATOVP_STEP_uV,
1018         .batovp_offset = BQ25975_BATOVP_OFFSET_uV,
1019 
1020         .batocp_def = BQ25980_BATOCP_DFLT_uA,
1021         .batocp_max = BQ25980_BATOCP_MAX_uA,
1022     },
1023 
1024     [BQ25960] = {
1025         .model_id = BQ25960,
1026         .regmap_config = &bq25960_regmap_config,
1027 
1028         .busocp_def = BQ25960_BUSOCP_DFLT_uA,
1029         .busocp_sc_min = BQ25960_BUSOCP_SC_MAX_uA,
1030         .busocp_sc_max = BQ25960_BUSOCP_SC_MAX_uA,
1031         .busocp_byp_min = BQ25960_BUSOCP_SC_MAX_uA,
1032         .busocp_byp_max = BQ25960_BUSOCP_BYP_MAX_uA,
1033 
1034         .busovp_sc_def = BQ25975_BUSOVP_DFLT_uV,
1035         .busovp_byp_def = BQ25975_BUSOVP_BYPASS_DFLT_uV,
1036         .busovp_sc_step = BQ25960_BUSOVP_SC_STEP_uV,
1037         .busovp_sc_offset = BQ25960_BUSOVP_SC_OFFSET_uV,
1038         .busovp_byp_step = BQ25960_BUSOVP_BYP_STEP_uV,
1039         .busovp_byp_offset = BQ25960_BUSOVP_BYP_OFFSET_uV,
1040         .busovp_sc_min = BQ25960_BUSOVP_SC_MIN_uV,
1041         .busovp_sc_max = BQ25960_BUSOVP_SC_MAX_uV,
1042         .busovp_byp_min = BQ25960_BUSOVP_BYP_MIN_uV,
1043         .busovp_byp_max = BQ25960_BUSOVP_BYP_MAX_uV,
1044 
1045         .batovp_def = BQ25960_BATOVP_DFLT_uV,
1046         .batovp_max = BQ25960_BATOVP_MAX_uV,
1047         .batovp_min = BQ25960_BATOVP_MIN_uV,
1048         .batovp_step = BQ25960_BATOVP_STEP_uV,
1049         .batovp_offset = BQ25960_BATOVP_OFFSET_uV,
1050 
1051         .batocp_def = BQ25960_BATOCP_DFLT_uA,
1052         .batocp_max = BQ25960_BATOCP_MAX_uA,
1053     },
1054 };
1055 
1056 static int bq25980_power_supply_init(struct bq25980_device *bq,
1057                             struct device *dev)
1058 {
1059     struct power_supply_config psy_cfg = { .drv_data = bq,
1060                         .of_node = dev->of_node, };
1061 
1062     psy_cfg.supplied_to = bq25980_charger_supplied_to;
1063     psy_cfg.num_supplicants = ARRAY_SIZE(bq25980_charger_supplied_to);
1064 
1065     bq->charger = devm_power_supply_register(bq->dev,
1066                          &bq25980_power_supply_desc,
1067                          &psy_cfg);
1068     if (IS_ERR(bq->charger))
1069         return -EINVAL;
1070 
1071     bq->battery = devm_power_supply_register(bq->dev,
1072                               &bq25980_battery_desc,
1073                               &psy_cfg);
1074     if (IS_ERR(bq->battery))
1075         return -EINVAL;
1076 
1077     return 0;
1078 }
1079 
1080 static int bq25980_hw_init(struct bq25980_device *bq)
1081 {
1082     struct power_supply_battery_info *bat_info;
1083     int wd_reg_val = BQ25980_WATCHDOG_DIS;
1084     int wd_max_val = BQ25980_NUM_WD_VAL - 1;
1085     int ret = 0;
1086     int curr_val;
1087     int volt_val;
1088     int i;
1089 
1090     if (bq->watchdog_timer) {
1091         if (bq->watchdog_timer >= bq25980_watchdog_time[wd_max_val])
1092             wd_reg_val = wd_max_val;
1093         else {
1094             for (i = 0; i < wd_max_val; i++) {
1095                 if (bq->watchdog_timer > bq25980_watchdog_time[i] &&
1096                     bq->watchdog_timer < bq25980_watchdog_time[i + 1]) {
1097                     wd_reg_val = i;
1098                     break;
1099                 }
1100             }
1101         }
1102     }
1103 
1104     ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_3,
1105                  BQ25980_WATCHDOG_MASK, wd_reg_val);
1106     if (ret)
1107         return ret;
1108 
1109     ret = power_supply_get_battery_info(bq->charger, &bat_info);
1110     if (ret) {
1111         dev_warn(bq->dev, "battery info missing\n");
1112         return -EINVAL;
1113     }
1114 
1115     bq->init_data.ichg_max = bat_info->constant_charge_current_max_ua;
1116     bq->init_data.vreg_max = bat_info->constant_charge_voltage_max_uv;
1117 
1118     if (bq->state.bypass) {
1119         ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_2,
1120                     BQ25980_EN_BYPASS, BQ25980_EN_BYPASS);
1121         if (ret)
1122             return ret;
1123 
1124         curr_val = bq->init_data.bypass_ilim;
1125         volt_val = bq->init_data.bypass_vlim;
1126     } else {
1127         curr_val = bq->init_data.sc_ilim;
1128         volt_val = bq->init_data.sc_vlim;
1129     }
1130 
1131     ret = bq25980_set_input_curr_lim(bq, curr_val);
1132     if (ret)
1133         return ret;
1134 
1135     ret = bq25980_set_input_volt_lim(bq, volt_val);
1136     if (ret)
1137         return ret;
1138 
1139     return regmap_update_bits(bq->regmap, BQ25980_ADC_CONTROL1,
1140                  BQ25980_ADC_EN, BQ25980_ADC_EN);
1141 }
1142 
1143 static int bq25980_parse_dt(struct bq25980_device *bq)
1144 {
1145     int ret;
1146 
1147     ret = device_property_read_u32(bq->dev, "ti,watchdog-timeout-ms",
1148                        &bq->watchdog_timer);
1149     if (ret)
1150         bq->watchdog_timer = BQ25980_WATCHDOG_MIN;
1151 
1152     if (bq->watchdog_timer > BQ25980_WATCHDOG_MAX ||
1153         bq->watchdog_timer < BQ25980_WATCHDOG_MIN)
1154         return -EINVAL;
1155 
1156     ret = device_property_read_u32(bq->dev,
1157                        "ti,sc-ovp-limit-microvolt",
1158                        &bq->init_data.sc_vlim);
1159     if (ret)
1160         bq->init_data.sc_vlim = bq->chip_info->busovp_sc_def;
1161 
1162     if (bq->init_data.sc_vlim > bq->chip_info->busovp_sc_max ||
1163         bq->init_data.sc_vlim < bq->chip_info->busovp_sc_min) {
1164         dev_err(bq->dev, "SC ovp limit is out of range\n");
1165         return -EINVAL;
1166     }
1167 
1168     ret = device_property_read_u32(bq->dev,
1169                        "ti,sc-ocp-limit-microamp",
1170                        &bq->init_data.sc_ilim);
1171     if (ret)
1172         bq->init_data.sc_ilim = bq->chip_info->busocp_def;
1173 
1174     if (bq->init_data.sc_ilim > bq->chip_info->busocp_sc_max ||
1175         bq->init_data.sc_ilim < bq->chip_info->busocp_sc_min) {
1176         dev_err(bq->dev, "SC ocp limit is out of range\n");
1177         return -EINVAL;
1178     }
1179 
1180     ret = device_property_read_u32(bq->dev,
1181                        "ti,bypass-ovp-limit-microvolt",
1182                        &bq->init_data.bypass_vlim);
1183     if (ret)
1184         bq->init_data.bypass_vlim = bq->chip_info->busovp_byp_def;
1185 
1186     if (bq->init_data.bypass_vlim > bq->chip_info->busovp_byp_max ||
1187         bq->init_data.bypass_vlim < bq->chip_info->busovp_byp_min) {
1188         dev_err(bq->dev, "Bypass ovp limit is out of range\n");
1189         return -EINVAL;
1190     }
1191 
1192     ret = device_property_read_u32(bq->dev,
1193                        "ti,bypass-ocp-limit-microamp",
1194                        &bq->init_data.bypass_ilim);
1195     if (ret)
1196         bq->init_data.bypass_ilim = bq->chip_info->busocp_def;
1197 
1198     if (bq->init_data.bypass_ilim > bq->chip_info->busocp_byp_max ||
1199         bq->init_data.bypass_ilim < bq->chip_info->busocp_byp_min) {
1200         dev_err(bq->dev, "Bypass ocp limit is out of range\n");
1201         return -EINVAL;
1202     }
1203 
1204 
1205     bq->state.bypass = device_property_read_bool(bq->dev,
1206                               "ti,bypass-enable");
1207     return 0;
1208 }
1209 
1210 static int bq25980_probe(struct i2c_client *client,
1211              const struct i2c_device_id *id)
1212 {
1213     struct device *dev = &client->dev;
1214     struct bq25980_device *bq;
1215     int ret;
1216 
1217     bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL);
1218     if (!bq)
1219         return -ENOMEM;
1220 
1221     bq->client = client;
1222     bq->dev = dev;
1223 
1224     mutex_init(&bq->lock);
1225 
1226     strncpy(bq->model_name, id->name, I2C_NAME_SIZE);
1227     bq->chip_info = &bq25980_chip_info_tbl[id->driver_data];
1228 
1229     bq->regmap = devm_regmap_init_i2c(client,
1230                       bq->chip_info->regmap_config);
1231     if (IS_ERR(bq->regmap)) {
1232         dev_err(dev, "Failed to allocate register map\n");
1233         return PTR_ERR(bq->regmap);
1234     }
1235 
1236     i2c_set_clientdata(client, bq);
1237 
1238     ret = bq25980_parse_dt(bq);
1239     if (ret) {
1240         dev_err(dev, "Failed to read device tree properties%d\n", ret);
1241         return ret;
1242     }
1243 
1244     if (client->irq) {
1245         ret = devm_request_threaded_irq(dev, client->irq, NULL,
1246                         bq25980_irq_handler_thread,
1247                         IRQF_TRIGGER_FALLING |
1248                         IRQF_ONESHOT,
1249                         dev_name(&client->dev), bq);
1250         if (ret)
1251             return ret;
1252     }
1253 
1254     ret = bq25980_power_supply_init(bq, dev);
1255     if (ret) {
1256         dev_err(dev, "Failed to register power supply\n");
1257         return ret;
1258     }
1259 
1260     ret = bq25980_hw_init(bq);
1261     if (ret) {
1262         dev_err(dev, "Cannot initialize the chip.\n");
1263         return ret;
1264     }
1265 
1266     return 0;
1267 }
1268 
1269 static const struct i2c_device_id bq25980_i2c_ids[] = {
1270     { "bq25980", BQ25980 },
1271     { "bq25975", BQ25975 },
1272     { "bq25960", BQ25960 },
1273     {},
1274 };
1275 MODULE_DEVICE_TABLE(i2c, bq25980_i2c_ids);
1276 
1277 static const struct of_device_id bq25980_of_match[] = {
1278     { .compatible = "ti,bq25980", .data = (void *)BQ25980 },
1279     { .compatible = "ti,bq25975", .data = (void *)BQ25975 },
1280     { .compatible = "ti,bq25960", .data = (void *)BQ25960 },
1281     { },
1282 };
1283 MODULE_DEVICE_TABLE(of, bq25980_of_match);
1284 
1285 static struct i2c_driver bq25980_driver = {
1286     .driver = {
1287         .name = "bq25980-charger",
1288         .of_match_table = bq25980_of_match,
1289     },
1290     .probe = bq25980_probe,
1291     .id_table = bq25980_i2c_ids,
1292 };
1293 module_i2c_driver(bq25980_driver);
1294 
1295 MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>");
1296 MODULE_AUTHOR("Ricardo Rivera-Matos <r-rivera-matos@ti.com>");
1297 MODULE_DESCRIPTION("bq25980 charger driver");
1298 MODULE_LICENSE("GPL v2");