linux/drivers/power/supply/bq24190_charger.c
<<
>>
Prefs
   1/*
   2 * Driver for the TI bq24190 battery charger.
   3 *
   4 * Author: Mark A. Greer <mgreer@animalcreek.com>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#include <linux/module.h>
  12#include <linux/interrupt.h>
  13#include <linux/delay.h>
  14#include <linux/of_irq.h>
  15#include <linux/of_device.h>
  16#include <linux/pm_runtime.h>
  17#include <linux/power_supply.h>
  18#include <linux/power/bq24190_charger.h>
  19#include <linux/regulator/driver.h>
  20#include <linux/regulator/machine.h>
  21#include <linux/workqueue.h>
  22#include <linux/gpio.h>
  23#include <linux/i2c.h>
  24#include <linux/extcon-provider.h>
  25
  26#define BQ24190_MANUFACTURER    "Texas Instruments"
  27
  28#define BQ24190_REG_ISC         0x00 /* Input Source Control */
  29#define BQ24190_REG_ISC_EN_HIZ_MASK             BIT(7)
  30#define BQ24190_REG_ISC_EN_HIZ_SHIFT            7
  31#define BQ24190_REG_ISC_VINDPM_MASK             (BIT(6) | BIT(5) | BIT(4) | \
  32                                                 BIT(3))
  33#define BQ24190_REG_ISC_VINDPM_SHIFT            3
  34#define BQ24190_REG_ISC_IINLIM_MASK             (BIT(2) | BIT(1) | BIT(0))
  35#define BQ24190_REG_ISC_IINLIM_SHIFT            0
  36
  37#define BQ24190_REG_POC         0x01 /* Power-On Configuration */
  38#define BQ24190_REG_POC_RESET_MASK              BIT(7)
  39#define BQ24190_REG_POC_RESET_SHIFT             7
  40#define BQ24190_REG_POC_WDT_RESET_MASK          BIT(6)
  41#define BQ24190_REG_POC_WDT_RESET_SHIFT         6
  42#define BQ24190_REG_POC_CHG_CONFIG_MASK         (BIT(5) | BIT(4))
  43#define BQ24190_REG_POC_CHG_CONFIG_SHIFT        4
  44#define BQ24190_REG_POC_CHG_CONFIG_DISABLE              0x0
  45#define BQ24190_REG_POC_CHG_CONFIG_CHARGE               0x1
  46#define BQ24190_REG_POC_CHG_CONFIG_OTG                  0x2
  47#define BQ24190_REG_POC_SYS_MIN_MASK            (BIT(3) | BIT(2) | BIT(1))
  48#define BQ24190_REG_POC_SYS_MIN_SHIFT           1
  49#define BQ24190_REG_POC_SYS_MIN_MIN                     3000
  50#define BQ24190_REG_POC_SYS_MIN_MAX                     3700
  51#define BQ24190_REG_POC_BOOST_LIM_MASK          BIT(0)
  52#define BQ24190_REG_POC_BOOST_LIM_SHIFT         0
  53
  54#define BQ24190_REG_CCC         0x02 /* Charge Current Control */
  55#define BQ24190_REG_CCC_ICHG_MASK               (BIT(7) | BIT(6) | BIT(5) | \
  56                                                 BIT(4) | BIT(3) | BIT(2))
  57#define BQ24190_REG_CCC_ICHG_SHIFT              2
  58#define BQ24190_REG_CCC_FORCE_20PCT_MASK        BIT(0)
  59#define BQ24190_REG_CCC_FORCE_20PCT_SHIFT       0
  60
  61#define BQ24190_REG_PCTCC       0x03 /* Pre-charge/Termination Current Cntl */
  62#define BQ24190_REG_PCTCC_IPRECHG_MASK          (BIT(7) | BIT(6) | BIT(5) | \
  63                                                 BIT(4))
  64#define BQ24190_REG_PCTCC_IPRECHG_SHIFT         4
  65#define BQ24190_REG_PCTCC_IPRECHG_MIN                   128
  66#define BQ24190_REG_PCTCC_IPRECHG_MAX                   2048
  67#define BQ24190_REG_PCTCC_ITERM_MASK            (BIT(3) | BIT(2) | BIT(1) | \
  68                                                 BIT(0))
  69#define BQ24190_REG_PCTCC_ITERM_SHIFT           0
  70#define BQ24190_REG_PCTCC_ITERM_MIN                     128
  71#define BQ24190_REG_PCTCC_ITERM_MAX                     2048
  72
  73#define BQ24190_REG_CVC         0x04 /* Charge Voltage Control */
  74#define BQ24190_REG_CVC_VREG_MASK               (BIT(7) | BIT(6) | BIT(5) | \
  75                                                 BIT(4) | BIT(3) | BIT(2))
  76#define BQ24190_REG_CVC_VREG_SHIFT              2
  77#define BQ24190_REG_CVC_BATLOWV_MASK            BIT(1)
  78#define BQ24190_REG_CVC_BATLOWV_SHIFT           1
  79#define BQ24190_REG_CVC_VRECHG_MASK             BIT(0)
  80#define BQ24190_REG_CVC_VRECHG_SHIFT            0
  81
  82#define BQ24190_REG_CTTC        0x05 /* Charge Term/Timer Control */
  83#define BQ24190_REG_CTTC_EN_TERM_MASK           BIT(7)
  84#define BQ24190_REG_CTTC_EN_TERM_SHIFT          7
  85#define BQ24190_REG_CTTC_TERM_STAT_MASK         BIT(6)
  86#define BQ24190_REG_CTTC_TERM_STAT_SHIFT        6
  87#define BQ24190_REG_CTTC_WATCHDOG_MASK          (BIT(5) | BIT(4))
  88#define BQ24190_REG_CTTC_WATCHDOG_SHIFT         4
  89#define BQ24190_REG_CTTC_EN_TIMER_MASK          BIT(3)
  90#define BQ24190_REG_CTTC_EN_TIMER_SHIFT         3
  91#define BQ24190_REG_CTTC_CHG_TIMER_MASK         (BIT(2) | BIT(1))
  92#define BQ24190_REG_CTTC_CHG_TIMER_SHIFT        1
  93#define BQ24190_REG_CTTC_JEITA_ISET_MASK        BIT(0)
  94#define BQ24190_REG_CTTC_JEITA_ISET_SHIFT       0
  95
  96#define BQ24190_REG_ICTRC       0x06 /* IR Comp/Thermal Regulation Control */
  97#define BQ24190_REG_ICTRC_BAT_COMP_MASK         (BIT(7) | BIT(6) | BIT(5))
  98#define BQ24190_REG_ICTRC_BAT_COMP_SHIFT        5
  99#define BQ24190_REG_ICTRC_VCLAMP_MASK           (BIT(4) | BIT(3) | BIT(2))
 100#define BQ24190_REG_ICTRC_VCLAMP_SHIFT          2
 101#define BQ24190_REG_ICTRC_TREG_MASK             (BIT(1) | BIT(0))
 102#define BQ24190_REG_ICTRC_TREG_SHIFT            0
 103
 104#define BQ24190_REG_MOC         0x07 /* Misc. Operation Control */
 105#define BQ24190_REG_MOC_DPDM_EN_MASK            BIT(7)
 106#define BQ24190_REG_MOC_DPDM_EN_SHIFT           7
 107#define BQ24190_REG_MOC_TMR2X_EN_MASK           BIT(6)
 108#define BQ24190_REG_MOC_TMR2X_EN_SHIFT          6
 109#define BQ24190_REG_MOC_BATFET_DISABLE_MASK     BIT(5)
 110#define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT    5
 111#define BQ24190_REG_MOC_JEITA_VSET_MASK         BIT(4)
 112#define BQ24190_REG_MOC_JEITA_VSET_SHIFT        4
 113#define BQ24190_REG_MOC_INT_MASK_MASK           (BIT(1) | BIT(0))
 114#define BQ24190_REG_MOC_INT_MASK_SHIFT          0
 115
 116#define BQ24190_REG_SS          0x08 /* System Status */
 117#define BQ24190_REG_SS_VBUS_STAT_MASK           (BIT(7) | BIT(6))
 118#define BQ24190_REG_SS_VBUS_STAT_SHIFT          6
 119#define BQ24190_REG_SS_CHRG_STAT_MASK           (BIT(5) | BIT(4))
 120#define BQ24190_REG_SS_CHRG_STAT_SHIFT          4
 121#define BQ24190_REG_SS_DPM_STAT_MASK            BIT(3)
 122#define BQ24190_REG_SS_DPM_STAT_SHIFT           3
 123#define BQ24190_REG_SS_PG_STAT_MASK             BIT(2)
 124#define BQ24190_REG_SS_PG_STAT_SHIFT            2
 125#define BQ24190_REG_SS_THERM_STAT_MASK          BIT(1)
 126#define BQ24190_REG_SS_THERM_STAT_SHIFT         1
 127#define BQ24190_REG_SS_VSYS_STAT_MASK           BIT(0)
 128#define BQ24190_REG_SS_VSYS_STAT_SHIFT          0
 129
 130#define BQ24190_REG_F           0x09 /* Fault */
 131#define BQ24190_REG_F_WATCHDOG_FAULT_MASK       BIT(7)
 132#define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT      7
 133#define BQ24190_REG_F_BOOST_FAULT_MASK          BIT(6)
 134#define BQ24190_REG_F_BOOST_FAULT_SHIFT         6
 135#define BQ24190_REG_F_CHRG_FAULT_MASK           (BIT(5) | BIT(4))
 136#define BQ24190_REG_F_CHRG_FAULT_SHIFT          4
 137#define BQ24190_REG_F_BAT_FAULT_MASK            BIT(3)
 138#define BQ24190_REG_F_BAT_FAULT_SHIFT           3
 139#define BQ24190_REG_F_NTC_FAULT_MASK            (BIT(2) | BIT(1) | BIT(0))
 140#define BQ24190_REG_F_NTC_FAULT_SHIFT           0
 141
 142#define BQ24190_REG_VPRS        0x0A /* Vendor/Part/Revision Status */
 143#define BQ24190_REG_VPRS_PN_MASK                (BIT(5) | BIT(4) | BIT(3))
 144#define BQ24190_REG_VPRS_PN_SHIFT               3
 145#define BQ24190_REG_VPRS_PN_24190                       0x4
 146#define BQ24190_REG_VPRS_PN_24192                       0x5 /* Also 24193, 24196 */
 147#define BQ24190_REG_VPRS_PN_24192I                      0x3
 148#define BQ24190_REG_VPRS_TS_PROFILE_MASK        BIT(2)
 149#define BQ24190_REG_VPRS_TS_PROFILE_SHIFT       2
 150#define BQ24190_REG_VPRS_DEV_REG_MASK           (BIT(1) | BIT(0))
 151#define BQ24190_REG_VPRS_DEV_REG_SHIFT          0
 152
 153/*
 154 * The FAULT register is latched by the bq24190 (except for NTC_FAULT)
 155 * so the first read after a fault returns the latched value and subsequent
 156 * reads return the current value.  In order to return the fault status
 157 * to the user, have the interrupt handler save the reg's value and retrieve
 158 * it in the appropriate health/status routine.
 159 */
 160struct bq24190_dev_info {
 161        struct i2c_client               *client;
 162        struct device                   *dev;
 163        struct extcon_dev               *edev;
 164        struct power_supply             *charger;
 165        struct power_supply             *battery;
 166        struct delayed_work             input_current_limit_work;
 167        char                            model_name[I2C_NAME_SIZE];
 168        bool                            initialized;
 169        bool                            irq_event;
 170        u16                             sys_min;
 171        u16                             iprechg;
 172        u16                             iterm;
 173        struct mutex                    f_reg_lock;
 174        u8                              f_reg;
 175        u8                              ss_reg;
 176        u8                              watchdog;
 177};
 178
 179static const unsigned int bq24190_usb_extcon_cable[] = {
 180        EXTCON_USB,
 181        EXTCON_NONE,
 182};
 183
 184/*
 185 * The tables below provide a 2-way mapping for the value that goes in
 186 * the register field and the real-world value that it represents.
 187 * The index of the array is the value that goes in the register; the
 188 * number at that index in the array is the real-world value that it
 189 * represents.
 190 */
 191
 192/* REG00[2:0] (IINLIM) in uAh */
 193static const int bq24190_isc_iinlim_values[] = {
 194         100000,  150000,  500000,  900000, 1200000, 1500000, 2000000, 3000000
 195};
 196
 197/* REG02[7:2] (ICHG) in uAh */
 198static const int bq24190_ccc_ichg_values[] = {
 199         512000,  576000,  640000,  704000,  768000,  832000,  896000,  960000,
 200        1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
 201        1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
 202        2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
 203        2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
 204        3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
 205        3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
 206        4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
 207};
 208
 209/* REG04[7:2] (VREG) in uV */
 210static const int bq24190_cvc_vreg_values[] = {
 211        3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
 212        3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
 213        3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
 214        3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
 215        4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
 216        4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
 217        4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
 218        4400000
 219};
 220
 221/* REG06[1:0] (TREG) in tenths of degrees Celsius */
 222static const int bq24190_ictrc_treg_values[] = {
 223        600, 800, 1000, 1200
 224};
 225
 226/*
 227 * Return the index in 'tbl' of greatest value that is less than or equal to
 228 * 'val'.  The index range returned is 0 to 'tbl_size' - 1.  Assumes that
 229 * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
 230 * is less than 2^8.
 231 */
 232static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
 233{
 234        int i;
 235
 236        for (i = 1; i < tbl_size; i++)
 237                if (v < tbl[i])
 238                        break;
 239
 240        return i - 1;
 241}
 242
 243/* Basic driver I/O routines */
 244
 245static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
 246{
 247        int ret;
 248
 249        ret = i2c_smbus_read_byte_data(bdi->client, reg);
 250        if (ret < 0)
 251                return ret;
 252
 253        *data = ret;
 254        return 0;
 255}
 256
 257static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
 258{
 259        return i2c_smbus_write_byte_data(bdi->client, reg, data);
 260}
 261
 262static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
 263                u8 mask, u8 shift, u8 *data)
 264{
 265        u8 v;
 266        int ret;
 267
 268        ret = bq24190_read(bdi, reg, &v);
 269        if (ret < 0)
 270                return ret;
 271
 272        v &= mask;
 273        v >>= shift;
 274        *data = v;
 275
 276        return 0;
 277}
 278
 279static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
 280                u8 mask, u8 shift, u8 data)
 281{
 282        u8 v;
 283        int ret;
 284
 285        ret = bq24190_read(bdi, reg, &v);
 286        if (ret < 0)
 287                return ret;
 288
 289        v &= ~mask;
 290        v |= ((data << shift) & mask);
 291
 292        return bq24190_write(bdi, reg, v);
 293}
 294
 295static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
 296                u8 reg, u8 mask, u8 shift,
 297                const int tbl[], int tbl_size,
 298                int *val)
 299{
 300        u8 v;
 301        int ret;
 302
 303        ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
 304        if (ret < 0)
 305                return ret;
 306
 307        v = (v >= tbl_size) ? (tbl_size - 1) : v;
 308        *val = tbl[v];
 309
 310        return 0;
 311}
 312
 313static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
 314                u8 reg, u8 mask, u8 shift,
 315                const int tbl[], int tbl_size,
 316                int val)
 317{
 318        u8 idx;
 319
 320        idx = bq24190_find_idx(tbl, tbl_size, val);
 321
 322        return bq24190_write_mask(bdi, reg, mask, shift, idx);
 323}
 324
 325#ifdef CONFIG_SYSFS
 326/*
 327 * There are a numerous options that are configurable on the bq24190
 328 * that go well beyond what the power_supply properties provide access to.
 329 * Provide sysfs access to them so they can be examined and possibly modified
 330 * on the fly.  They will be provided for the charger power_supply object only
 331 * and will be prefixed by 'f_' to make them easier to recognize.
 332 */
 333
 334#define BQ24190_SYSFS_FIELD(_name, r, f, m, store)                      \
 335{                                                                       \
 336        .attr   = __ATTR(f_##_name, m, bq24190_sysfs_show, store),      \
 337        .reg    = BQ24190_REG_##r,                                      \
 338        .mask   = BQ24190_REG_##r##_##f##_MASK,                         \
 339        .shift  = BQ24190_REG_##r##_##f##_SHIFT,                        \
 340}
 341
 342#define BQ24190_SYSFS_FIELD_RW(_name, r, f)                             \
 343                BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO,     \
 344                                bq24190_sysfs_store)
 345
 346#define BQ24190_SYSFS_FIELD_RO(_name, r, f)                             \
 347                BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
 348
 349static ssize_t bq24190_sysfs_show(struct device *dev,
 350                struct device_attribute *attr, char *buf);
 351static ssize_t bq24190_sysfs_store(struct device *dev,
 352                struct device_attribute *attr, const char *buf, size_t count);
 353
 354struct bq24190_sysfs_field_info {
 355        struct device_attribute attr;
 356        u8      reg;
 357        u8      mask;
 358        u8      shift;
 359};
 360
 361/* On i386 ptrace-abi.h defines SS that breaks the macro calls below. */
 362#undef SS
 363
 364static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
 365                        /*      sysfs name      reg     field in reg */
 366        BQ24190_SYSFS_FIELD_RW(en_hiz,          ISC,    EN_HIZ),
 367        BQ24190_SYSFS_FIELD_RW(vindpm,          ISC,    VINDPM),
 368        BQ24190_SYSFS_FIELD_RW(iinlim,          ISC,    IINLIM),
 369        BQ24190_SYSFS_FIELD_RW(chg_config,      POC,    CHG_CONFIG),
 370        BQ24190_SYSFS_FIELD_RW(sys_min,         POC,    SYS_MIN),
 371        BQ24190_SYSFS_FIELD_RW(boost_lim,       POC,    BOOST_LIM),
 372        BQ24190_SYSFS_FIELD_RW(ichg,            CCC,    ICHG),
 373        BQ24190_SYSFS_FIELD_RW(force_20_pct,    CCC,    FORCE_20PCT),
 374        BQ24190_SYSFS_FIELD_RW(iprechg,         PCTCC,  IPRECHG),
 375        BQ24190_SYSFS_FIELD_RW(iterm,           PCTCC,  ITERM),
 376        BQ24190_SYSFS_FIELD_RW(vreg,            CVC,    VREG),
 377        BQ24190_SYSFS_FIELD_RW(batlowv,         CVC,    BATLOWV),
 378        BQ24190_SYSFS_FIELD_RW(vrechg,          CVC,    VRECHG),
 379        BQ24190_SYSFS_FIELD_RW(en_term,         CTTC,   EN_TERM),
 380        BQ24190_SYSFS_FIELD_RW(term_stat,       CTTC,   TERM_STAT),
 381        BQ24190_SYSFS_FIELD_RO(watchdog,        CTTC,   WATCHDOG),
 382        BQ24190_SYSFS_FIELD_RW(en_timer,        CTTC,   EN_TIMER),
 383        BQ24190_SYSFS_FIELD_RW(chg_timer,       CTTC,   CHG_TIMER),
 384        BQ24190_SYSFS_FIELD_RW(jeta_iset,       CTTC,   JEITA_ISET),
 385        BQ24190_SYSFS_FIELD_RW(bat_comp,        ICTRC,  BAT_COMP),
 386        BQ24190_SYSFS_FIELD_RW(vclamp,          ICTRC,  VCLAMP),
 387        BQ24190_SYSFS_FIELD_RW(treg,            ICTRC,  TREG),
 388        BQ24190_SYSFS_FIELD_RW(dpdm_en,         MOC,    DPDM_EN),
 389        BQ24190_SYSFS_FIELD_RW(tmr2x_en,        MOC,    TMR2X_EN),
 390        BQ24190_SYSFS_FIELD_RW(batfet_disable,  MOC,    BATFET_DISABLE),
 391        BQ24190_SYSFS_FIELD_RW(jeita_vset,      MOC,    JEITA_VSET),
 392        BQ24190_SYSFS_FIELD_RO(int_mask,        MOC,    INT_MASK),
 393        BQ24190_SYSFS_FIELD_RO(vbus_stat,       SS,     VBUS_STAT),
 394        BQ24190_SYSFS_FIELD_RO(chrg_stat,       SS,     CHRG_STAT),
 395        BQ24190_SYSFS_FIELD_RO(dpm_stat,        SS,     DPM_STAT),
 396        BQ24190_SYSFS_FIELD_RO(pg_stat,         SS,     PG_STAT),
 397        BQ24190_SYSFS_FIELD_RO(therm_stat,      SS,     THERM_STAT),
 398        BQ24190_SYSFS_FIELD_RO(vsys_stat,       SS,     VSYS_STAT),
 399        BQ24190_SYSFS_FIELD_RO(watchdog_fault,  F,      WATCHDOG_FAULT),
 400        BQ24190_SYSFS_FIELD_RO(boost_fault,     F,      BOOST_FAULT),
 401        BQ24190_SYSFS_FIELD_RO(chrg_fault,      F,      CHRG_FAULT),
 402        BQ24190_SYSFS_FIELD_RO(bat_fault,       F,      BAT_FAULT),
 403        BQ24190_SYSFS_FIELD_RO(ntc_fault,       F,      NTC_FAULT),
 404        BQ24190_SYSFS_FIELD_RO(pn,              VPRS,   PN),
 405        BQ24190_SYSFS_FIELD_RO(ts_profile,      VPRS,   TS_PROFILE),
 406        BQ24190_SYSFS_FIELD_RO(dev_reg,         VPRS,   DEV_REG),
 407};
 408
 409static struct attribute *
 410        bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
 411
 412ATTRIBUTE_GROUPS(bq24190_sysfs);
 413
 414static void bq24190_sysfs_init_attrs(void)
 415{
 416        int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
 417
 418        for (i = 0; i < limit; i++)
 419                bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
 420
 421        bq24190_sysfs_attrs[limit] = NULL; /* Has additional entry for this */
 422}
 423
 424static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
 425                const char *name)
 426{
 427        int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
 428
 429        for (i = 0; i < limit; i++)
 430                if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
 431                        break;
 432
 433        if (i >= limit)
 434                return NULL;
 435
 436        return &bq24190_sysfs_field_tbl[i];
 437}
 438
 439static ssize_t bq24190_sysfs_show(struct device *dev,
 440                struct device_attribute *attr, char *buf)
 441{
 442        struct power_supply *psy = dev_get_drvdata(dev);
 443        struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
 444        struct bq24190_sysfs_field_info *info;
 445        ssize_t count;
 446        int ret;
 447        u8 v;
 448
 449        info = bq24190_sysfs_field_lookup(attr->attr.name);
 450        if (!info)
 451                return -EINVAL;
 452
 453        ret = pm_runtime_get_sync(bdi->dev);
 454        if (ret < 0)
 455                return ret;
 456
 457        ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
 458        if (ret)
 459                count = ret;
 460        else
 461                count = scnprintf(buf, PAGE_SIZE, "%hhx\n", v);
 462
 463        pm_runtime_mark_last_busy(bdi->dev);
 464        pm_runtime_put_autosuspend(bdi->dev);
 465
 466        return count;
 467}
 468
 469static ssize_t bq24190_sysfs_store(struct device *dev,
 470                struct device_attribute *attr, const char *buf, size_t count)
 471{
 472        struct power_supply *psy = dev_get_drvdata(dev);
 473        struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
 474        struct bq24190_sysfs_field_info *info;
 475        int ret;
 476        u8 v;
 477
 478        info = bq24190_sysfs_field_lookup(attr->attr.name);
 479        if (!info)
 480                return -EINVAL;
 481
 482        ret = kstrtou8(buf, 0, &v);
 483        if (ret < 0)
 484                return ret;
 485
 486        ret = pm_runtime_get_sync(bdi->dev);
 487        if (ret < 0)
 488                return ret;
 489
 490        ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
 491        if (ret)
 492                count = ret;
 493
 494        pm_runtime_mark_last_busy(bdi->dev);
 495        pm_runtime_put_autosuspend(bdi->dev);
 496
 497        return count;
 498}
 499#endif
 500
 501#ifdef CONFIG_REGULATOR
 502static int bq24190_set_charge_mode(struct regulator_dev *dev, u8 val)
 503{
 504        struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
 505        int ret;
 506
 507        ret = pm_runtime_get_sync(bdi->dev);
 508        if (ret < 0) {
 509                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
 510                pm_runtime_put_noidle(bdi->dev);
 511                return ret;
 512        }
 513
 514        ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
 515                                 BQ24190_REG_POC_CHG_CONFIG_MASK,
 516                                 BQ24190_REG_POC_CHG_CONFIG_SHIFT, val);
 517
 518        pm_runtime_mark_last_busy(bdi->dev);
 519        pm_runtime_put_autosuspend(bdi->dev);
 520
 521        return ret;
 522}
 523
 524static int bq24190_vbus_enable(struct regulator_dev *dev)
 525{
 526        return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_OTG);
 527}
 528
 529static int bq24190_vbus_disable(struct regulator_dev *dev)
 530{
 531        return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_CHARGE);
 532}
 533
 534static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
 535{
 536        struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
 537        int ret;
 538        u8 val;
 539
 540        ret = pm_runtime_get_sync(bdi->dev);
 541        if (ret < 0) {
 542                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
 543                pm_runtime_put_noidle(bdi->dev);
 544                return ret;
 545        }
 546
 547        ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
 548                                BQ24190_REG_POC_CHG_CONFIG_MASK,
 549                                BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
 550
 551        pm_runtime_mark_last_busy(bdi->dev);
 552        pm_runtime_put_autosuspend(bdi->dev);
 553
 554        return ret ? ret : val == BQ24190_REG_POC_CHG_CONFIG_OTG;
 555}
 556
 557static const struct regulator_ops bq24190_vbus_ops = {
 558        .enable = bq24190_vbus_enable,
 559        .disable = bq24190_vbus_disable,
 560        .is_enabled = bq24190_vbus_is_enabled,
 561};
 562
 563static const struct regulator_desc bq24190_vbus_desc = {
 564        .name = "usb_otg_vbus",
 565        .of_match = "usb-otg-vbus",
 566        .type = REGULATOR_VOLTAGE,
 567        .owner = THIS_MODULE,
 568        .ops = &bq24190_vbus_ops,
 569        .fixed_uV = 5000000,
 570        .n_voltages = 1,
 571};
 572
 573static const struct regulator_init_data bq24190_vbus_init_data = {
 574        .constraints = {
 575                .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 576        },
 577};
 578
 579static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
 580{
 581        struct bq24190_platform_data *pdata = bdi->dev->platform_data;
 582        struct regulator_config cfg = { };
 583        struct regulator_dev *reg;
 584        int ret = 0;
 585
 586        cfg.dev = bdi->dev;
 587        if (pdata && pdata->regulator_init_data)
 588                cfg.init_data = pdata->regulator_init_data;
 589        else
 590                cfg.init_data = &bq24190_vbus_init_data;
 591        cfg.driver_data = bdi;
 592        reg = devm_regulator_register(bdi->dev, &bq24190_vbus_desc, &cfg);
 593        if (IS_ERR(reg)) {
 594                ret = PTR_ERR(reg);
 595                dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
 596        }
 597
 598        return ret;
 599}
 600#else
 601static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
 602{
 603        return 0;
 604}
 605#endif
 606
 607static int bq24190_set_config(struct bq24190_dev_info *bdi)
 608{
 609        int ret;
 610        u8 v;
 611
 612        ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
 613        if (ret < 0)
 614                return ret;
 615
 616        bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
 617                                        BQ24190_REG_CTTC_WATCHDOG_SHIFT);
 618
 619        /*
 620         * According to the "Host Mode and default Mode" section of the
 621         * manual, a write to any register causes the bq24190 to switch
 622         * from default mode to host mode.  It will switch back to default
 623         * mode after a WDT timeout unless the WDT is turned off as well.
 624         * So, by simply turning off the WDT, we accomplish both with the
 625         * same write.
 626         */
 627        v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
 628
 629        ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
 630        if (ret < 0)
 631                return ret;
 632
 633        if (bdi->sys_min) {
 634                v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
 635                ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
 636                                         BQ24190_REG_POC_SYS_MIN_MASK,
 637                                         BQ24190_REG_POC_SYS_MIN_SHIFT,
 638                                         v);
 639                if (ret < 0)
 640                        return ret;
 641        }
 642
 643        if (bdi->iprechg) {
 644                v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11
 645                ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
 646                                         BQ24190_REG_PCTCC_IPRECHG_MASK,
 647                                         BQ24190_REG_PCTCC_IPRECHG_SHIFT,
 648                                         v);
 649                if (ret < 0)
 650                        return ret;
 651        }
 652
 653        if (bdi->iterm) {
 654                v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11
 655                ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
 656                                         BQ24190_REG_PCTCC_ITERM_MASK,
 657                                         BQ24190_REG_PCTCC_ITERM_SHIFT,
 658                                         v);
 659                if (ret < 0)
 660                        return ret;
 661        }
 662
 663        return 0;
 664}
 665
 666static int bq24190_register_reset(struct bq24190_dev_info *bdi)
 667{
 668        int ret, limit = 100;
 669        u8 v;
 670
 671        /*
 672         * This prop. can be passed on device instantiation from platform code:
 673         * struct property_entry pe[] =
 674         *   { PROPERTY_ENTRY_BOOL("disable-reset"), ... };
 675         * struct i2c_board_info bi =
 676         *   { .type = "bq24190", .addr = 0x6b, .properties = pe, .irq = irq };
 677         * struct i2c_adapter ad = { ... };
 678         * i2c_add_adapter(&ad);
 679         * i2c_new_device(&ad, &bi);
 680         */
 681        if (device_property_read_bool(bdi->dev, "disable-reset"))
 682                return 0;
 683
 684        /* Reset the registers */
 685        ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
 686                        BQ24190_REG_POC_RESET_MASK,
 687                        BQ24190_REG_POC_RESET_SHIFT,
 688                        0x1);
 689        if (ret < 0)
 690                return ret;
 691
 692        /* Reset bit will be cleared by hardware so poll until it is */
 693        do {
 694                ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
 695                                BQ24190_REG_POC_RESET_MASK,
 696                                BQ24190_REG_POC_RESET_SHIFT,
 697                                &v);
 698                if (ret < 0)
 699                        return ret;
 700
 701                if (v == 0)
 702                        return 0;
 703
 704                usleep_range(100, 200);
 705        } while (--limit);
 706
 707        return -EIO;
 708}
 709
 710/* Charger power supply property routines */
 711
 712static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
 713                union power_supply_propval *val)
 714{
 715        u8 v;
 716        int type, ret;
 717
 718        ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
 719                        BQ24190_REG_POC_CHG_CONFIG_MASK,
 720                        BQ24190_REG_POC_CHG_CONFIG_SHIFT,
 721                        &v);
 722        if (ret < 0)
 723                return ret;
 724
 725        /* If POC[CHG_CONFIG] (REG01[5:4]) == 0, charge is disabled */
 726        if (!v) {
 727                type = POWER_SUPPLY_CHARGE_TYPE_NONE;
 728        } else {
 729                ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
 730                                BQ24190_REG_CCC_FORCE_20PCT_MASK,
 731                                BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
 732                                &v);
 733                if (ret < 0)
 734                        return ret;
 735
 736                type = (v) ? POWER_SUPPLY_CHARGE_TYPE_TRICKLE :
 737                             POWER_SUPPLY_CHARGE_TYPE_FAST;
 738        }
 739
 740        val->intval = type;
 741
 742        return 0;
 743}
 744
 745static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
 746                const union power_supply_propval *val)
 747{
 748        u8 chg_config, force_20pct, en_term;
 749        int ret;
 750
 751        /*
 752         * According to the "Termination when REG02[0] = 1" section of
 753         * the bq24190 manual, the trickle charge could be less than the
 754         * termination current so it recommends turning off the termination
 755         * function.
 756         *
 757         * Note: AFAICT from the datasheet, the user will have to manually
 758         * turn off the charging when in 20% mode.  If its not turned off,
 759         * there could be battery damage.  So, use this mode at your own risk.
 760         */
 761        switch (val->intval) {
 762        case POWER_SUPPLY_CHARGE_TYPE_NONE:
 763                chg_config = 0x0;
 764                break;
 765        case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
 766                chg_config = 0x1;
 767                force_20pct = 0x1;
 768                en_term = 0x0;
 769                break;
 770        case POWER_SUPPLY_CHARGE_TYPE_FAST:
 771                chg_config = 0x1;
 772                force_20pct = 0x0;
 773                en_term = 0x1;
 774                break;
 775        default:
 776                return -EINVAL;
 777        }
 778
 779        if (chg_config) { /* Enabling the charger */
 780                ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
 781                                BQ24190_REG_CCC_FORCE_20PCT_MASK,
 782                                BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
 783                                force_20pct);
 784                if (ret < 0)
 785                        return ret;
 786
 787                ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
 788                                BQ24190_REG_CTTC_EN_TERM_MASK,
 789                                BQ24190_REG_CTTC_EN_TERM_SHIFT,
 790                                en_term);
 791                if (ret < 0)
 792                        return ret;
 793        }
 794
 795        return bq24190_write_mask(bdi, BQ24190_REG_POC,
 796                        BQ24190_REG_POC_CHG_CONFIG_MASK,
 797                        BQ24190_REG_POC_CHG_CONFIG_SHIFT, chg_config);
 798}
 799
 800static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
 801                union power_supply_propval *val)
 802{
 803        u8 v;
 804        int health;
 805
 806        mutex_lock(&bdi->f_reg_lock);
 807        v = bdi->f_reg;
 808        mutex_unlock(&bdi->f_reg_lock);
 809
 810        if (v & BQ24190_REG_F_NTC_FAULT_MASK) {
 811                switch (v >> BQ24190_REG_F_NTC_FAULT_SHIFT & 0x7) {
 812                case 0x1: /* TS1  Cold */
 813                case 0x3: /* TS2  Cold */
 814                case 0x5: /* Both Cold */
 815                        health = POWER_SUPPLY_HEALTH_COLD;
 816                        break;
 817                case 0x2: /* TS1  Hot */
 818                case 0x4: /* TS2  Hot */
 819                case 0x6: /* Both Hot */
 820                        health = POWER_SUPPLY_HEALTH_OVERHEAT;
 821                        break;
 822                default:
 823                        health = POWER_SUPPLY_HEALTH_UNKNOWN;
 824                }
 825        } else if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
 826                health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
 827        } else if (v & BQ24190_REG_F_CHRG_FAULT_MASK) {
 828                switch (v >> BQ24190_REG_F_CHRG_FAULT_SHIFT & 0x3) {
 829                case 0x1: /* Input Fault (VBUS OVP or VBAT<VBUS<3.8V) */
 830                        /*
 831                         * This could be over-voltage or under-voltage
 832                         * and there's no way to tell which.  Instead
 833                         * of looking foolish and returning 'OVERVOLTAGE'
 834                         * when its really under-voltage, just return
 835                         * 'UNSPEC_FAILURE'.
 836                         */
 837                        health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
 838                        break;
 839                case 0x2: /* Thermal Shutdown */
 840                        health = POWER_SUPPLY_HEALTH_OVERHEAT;
 841                        break;
 842                case 0x3: /* Charge Safety Timer Expiration */
 843                        health = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
 844                        break;
 845                default:  /* prevent compiler warning */
 846                        health = -1;
 847                }
 848        } else if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
 849                /*
 850                 * This could be over-current or over-voltage but there's
 851                 * no way to tell which.  Return 'OVERVOLTAGE' since there
 852                 * isn't an 'OVERCURRENT' value defined that we can return
 853                 * even if it was over-current.
 854                 */
 855                health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
 856        } else {
 857                health = POWER_SUPPLY_HEALTH_GOOD;
 858        }
 859
 860        val->intval = health;
 861
 862        return 0;
 863}
 864
 865static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
 866                union power_supply_propval *val)
 867{
 868        u8 pg_stat, batfet_disable;
 869        int ret;
 870
 871        ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
 872                        BQ24190_REG_SS_PG_STAT_MASK,
 873                        BQ24190_REG_SS_PG_STAT_SHIFT, &pg_stat);
 874        if (ret < 0)
 875                return ret;
 876
 877        ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
 878                        BQ24190_REG_MOC_BATFET_DISABLE_MASK,
 879                        BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
 880        if (ret < 0)
 881                return ret;
 882
 883        val->intval = pg_stat && !batfet_disable;
 884
 885        return 0;
 886}
 887
 888static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
 889                                      const union power_supply_propval *val);
 890static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
 891                                      union power_supply_propval *val);
 892static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
 893                                              union power_supply_propval *val);
 894static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
 895                                              const union power_supply_propval *val);
 896
 897static int bq24190_charger_set_online(struct bq24190_dev_info *bdi,
 898                                      const union power_supply_propval *val)
 899{
 900        return bq24190_battery_set_online(bdi, val);
 901}
 902
 903static int bq24190_charger_get_status(struct bq24190_dev_info *bdi,
 904                                      union power_supply_propval *val)
 905{
 906        return bq24190_battery_get_status(bdi, val);
 907}
 908
 909static int bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi,
 910                                              union power_supply_propval *val)
 911{
 912        return bq24190_battery_get_temp_alert_max(bdi, val);
 913}
 914
 915static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
 916                                              const union power_supply_propval *val)
 917{
 918        return bq24190_battery_set_temp_alert_max(bdi, val);
 919}
 920
 921static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
 922                union power_supply_propval *val)
 923{
 924        u8 v;
 925        int ret;
 926
 927        ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
 928                        BQ24190_REG_PCTCC_IPRECHG_MASK,
 929                        BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v);
 930        if (ret < 0)
 931                return ret;
 932
 933        val->intval = ++v * 128 * 1000;
 934        return 0;
 935}
 936
 937static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
 938                union power_supply_propval *val)
 939{
 940        u8 v;
 941        int ret;
 942
 943        ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
 944                        BQ24190_REG_PCTCC_ITERM_MASK,
 945                        BQ24190_REG_PCTCC_ITERM_SHIFT, &v);
 946        if (ret < 0)
 947                return ret;
 948
 949        val->intval = ++v * 128 * 1000;
 950        return 0;
 951}
 952
 953static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
 954                union power_supply_propval *val)
 955{
 956        u8 v;
 957        int curr, ret;
 958
 959        ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
 960                        BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
 961                        bq24190_ccc_ichg_values,
 962                        ARRAY_SIZE(bq24190_ccc_ichg_values), &curr);
 963        if (ret < 0)
 964                return ret;
 965
 966        ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
 967                        BQ24190_REG_CCC_FORCE_20PCT_MASK,
 968                        BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
 969        if (ret < 0)
 970                return ret;
 971
 972        /* If FORCE_20PCT is enabled, then current is 20% of ICHG value */
 973        if (v)
 974                curr /= 5;
 975
 976        val->intval = curr;
 977        return 0;
 978}
 979
 980static int bq24190_charger_get_current_max(struct bq24190_dev_info *bdi,
 981                union power_supply_propval *val)
 982{
 983        int idx = ARRAY_SIZE(bq24190_ccc_ichg_values) - 1;
 984
 985        val->intval = bq24190_ccc_ichg_values[idx];
 986        return 0;
 987}
 988
 989static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
 990                const union power_supply_propval *val)
 991{
 992        u8 v;
 993        int ret, curr = val->intval;
 994
 995        ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
 996                        BQ24190_REG_CCC_FORCE_20PCT_MASK,
 997                        BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
 998        if (ret < 0)
 999                return ret;
1000
1001        /* If FORCE_20PCT is enabled, have to multiply value passed in by 5 */
1002        if (v)
1003                curr *= 5;
1004
1005        return bq24190_set_field_val(bdi, BQ24190_REG_CCC,
1006                        BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1007                        bq24190_ccc_ichg_values,
1008                        ARRAY_SIZE(bq24190_ccc_ichg_values), curr);
1009}
1010
1011static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
1012                union power_supply_propval *val)
1013{
1014        int voltage, ret;
1015
1016        ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
1017                        BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1018                        bq24190_cvc_vreg_values,
1019                        ARRAY_SIZE(bq24190_cvc_vreg_values), &voltage);
1020        if (ret < 0)
1021                return ret;
1022
1023        val->intval = voltage;
1024        return 0;
1025}
1026
1027static int bq24190_charger_get_voltage_max(struct bq24190_dev_info *bdi,
1028                union power_supply_propval *val)
1029{
1030        int idx = ARRAY_SIZE(bq24190_cvc_vreg_values) - 1;
1031
1032        val->intval = bq24190_cvc_vreg_values[idx];
1033        return 0;
1034}
1035
1036static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
1037                const union power_supply_propval *val)
1038{
1039        return bq24190_set_field_val(bdi, BQ24190_REG_CVC,
1040                        BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1041                        bq24190_cvc_vreg_values,
1042                        ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
1043}
1044
1045static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
1046                union power_supply_propval *val)
1047{
1048        int iinlimit, ret;
1049
1050        ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
1051                        BQ24190_REG_ISC_IINLIM_MASK,
1052                        BQ24190_REG_ISC_IINLIM_SHIFT,
1053                        bq24190_isc_iinlim_values,
1054                        ARRAY_SIZE(bq24190_isc_iinlim_values), &iinlimit);
1055        if (ret < 0)
1056                return ret;
1057
1058        val->intval = iinlimit;
1059        return 0;
1060}
1061
1062static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
1063                const union power_supply_propval *val)
1064{
1065        return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1066                        BQ24190_REG_ISC_IINLIM_MASK,
1067                        BQ24190_REG_ISC_IINLIM_SHIFT,
1068                        bq24190_isc_iinlim_values,
1069                        ARRAY_SIZE(bq24190_isc_iinlim_values), val->intval);
1070}
1071
1072static int bq24190_charger_get_property(struct power_supply *psy,
1073                enum power_supply_property psp, union power_supply_propval *val)
1074{
1075        struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1076        int ret;
1077
1078        dev_dbg(bdi->dev, "prop: %d\n", psp);
1079
1080        ret = pm_runtime_get_sync(bdi->dev);
1081        if (ret < 0)
1082                return ret;
1083
1084        switch (psp) {
1085        case POWER_SUPPLY_PROP_CHARGE_TYPE:
1086                ret = bq24190_charger_get_charge_type(bdi, val);
1087                break;
1088        case POWER_SUPPLY_PROP_HEALTH:
1089                ret = bq24190_charger_get_health(bdi, val);
1090                break;
1091        case POWER_SUPPLY_PROP_ONLINE:
1092                ret = bq24190_charger_get_online(bdi, val);
1093                break;
1094        case POWER_SUPPLY_PROP_STATUS:
1095                ret = bq24190_charger_get_status(bdi, val);
1096                break;
1097        case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1098                ret =  bq24190_charger_get_temp_alert_max(bdi, val);
1099                break;
1100        case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1101                ret = bq24190_charger_get_precharge(bdi, val);
1102                break;
1103        case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1104                ret = bq24190_charger_get_charge_term(bdi, val);
1105                break;
1106        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1107                ret = bq24190_charger_get_current(bdi, val);
1108                break;
1109        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1110                ret = bq24190_charger_get_current_max(bdi, val);
1111                break;
1112        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1113                ret = bq24190_charger_get_voltage(bdi, val);
1114                break;
1115        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
1116                ret = bq24190_charger_get_voltage_max(bdi, val);
1117                break;
1118        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1119                ret = bq24190_charger_get_iinlimit(bdi, val);
1120                break;
1121        case POWER_SUPPLY_PROP_SCOPE:
1122                val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1123                ret = 0;
1124                break;
1125        case POWER_SUPPLY_PROP_MODEL_NAME:
1126                val->strval = bdi->model_name;
1127                ret = 0;
1128                break;
1129        case POWER_SUPPLY_PROP_MANUFACTURER:
1130                val->strval = BQ24190_MANUFACTURER;
1131                ret = 0;
1132                break;
1133        default:
1134                ret = -ENODATA;
1135        }
1136
1137        pm_runtime_mark_last_busy(bdi->dev);
1138        pm_runtime_put_autosuspend(bdi->dev);
1139
1140        return ret;
1141}
1142
1143static int bq24190_charger_set_property(struct power_supply *psy,
1144                enum power_supply_property psp,
1145                const union power_supply_propval *val)
1146{
1147        struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1148        int ret;
1149
1150        dev_dbg(bdi->dev, "prop: %d\n", psp);
1151
1152        ret = pm_runtime_get_sync(bdi->dev);
1153        if (ret < 0)
1154                return ret;
1155
1156        switch (psp) {
1157        case POWER_SUPPLY_PROP_ONLINE:
1158                ret = bq24190_charger_set_online(bdi, val);
1159                break;
1160        case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1161                ret = bq24190_charger_set_temp_alert_max(bdi, val);
1162                break;
1163        case POWER_SUPPLY_PROP_CHARGE_TYPE:
1164                ret = bq24190_charger_set_charge_type(bdi, val);
1165                break;
1166        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1167                ret = bq24190_charger_set_current(bdi, val);
1168                break;
1169        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1170                ret = bq24190_charger_set_voltage(bdi, val);
1171                break;
1172        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1173                ret = bq24190_charger_set_iinlimit(bdi, val);
1174                break;
1175        default:
1176                ret = -EINVAL;
1177        }
1178
1179        pm_runtime_mark_last_busy(bdi->dev);
1180        pm_runtime_put_autosuspend(bdi->dev);
1181
1182        return ret;
1183}
1184
1185static int bq24190_charger_property_is_writeable(struct power_supply *psy,
1186                enum power_supply_property psp)
1187{
1188        switch (psp) {
1189        case POWER_SUPPLY_PROP_ONLINE:
1190        case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1191        case POWER_SUPPLY_PROP_CHARGE_TYPE:
1192        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1193        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1194        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1195                return 1;
1196        default:
1197                return 0;
1198        }
1199}
1200
1201static void bq24190_input_current_limit_work(struct work_struct *work)
1202{
1203        struct bq24190_dev_info *bdi =
1204                container_of(work, struct bq24190_dev_info,
1205                             input_current_limit_work.work);
1206
1207        power_supply_set_input_current_limit_from_supplier(bdi->charger);
1208}
1209
1210/* Sync the input-current-limit with our parent supply (if we have one) */
1211static void bq24190_charger_external_power_changed(struct power_supply *psy)
1212{
1213        struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1214
1215        /*
1216         * The Power-Good detection may take up to 220ms, sometimes
1217         * the external charger detection is quicker, and the bq24190 will
1218         * reset to iinlim based on its own charger detection (which is not
1219         * hooked up when using external charger detection) resulting in a
1220         * too low default 500mA iinlim. Delay setting the input-current-limit
1221         * for 300ms to avoid this.
1222         */
1223        queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1224                           msecs_to_jiffies(300));
1225}
1226
1227static enum power_supply_property bq24190_charger_properties[] = {
1228        POWER_SUPPLY_PROP_CHARGE_TYPE,
1229        POWER_SUPPLY_PROP_HEALTH,
1230        POWER_SUPPLY_PROP_ONLINE,
1231        POWER_SUPPLY_PROP_STATUS,
1232        POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1233        POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1234        POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1235        POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1236        POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1237        POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1238        POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1239        POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1240        POWER_SUPPLY_PROP_SCOPE,
1241        POWER_SUPPLY_PROP_MODEL_NAME,
1242        POWER_SUPPLY_PROP_MANUFACTURER,
1243};
1244
1245static char *bq24190_charger_supplied_to[] = {
1246        "main-battery",
1247};
1248
1249static const struct power_supply_desc bq24190_charger_desc = {
1250        .name                   = "bq24190-charger",
1251        .type                   = POWER_SUPPLY_TYPE_USB,
1252        .properties             = bq24190_charger_properties,
1253        .num_properties         = ARRAY_SIZE(bq24190_charger_properties),
1254        .get_property           = bq24190_charger_get_property,
1255        .set_property           = bq24190_charger_set_property,
1256        .property_is_writeable  = bq24190_charger_property_is_writeable,
1257        .external_power_changed = bq24190_charger_external_power_changed,
1258};
1259
1260/* Battery power supply property routines */
1261
1262static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1263                union power_supply_propval *val)
1264{
1265        u8 ss_reg, chrg_fault;
1266        int status, ret;
1267
1268        mutex_lock(&bdi->f_reg_lock);
1269        chrg_fault = bdi->f_reg;
1270        mutex_unlock(&bdi->f_reg_lock);
1271
1272        chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
1273        chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
1274
1275        ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1276        if (ret < 0)
1277                return ret;
1278
1279        /*
1280         * The battery must be discharging when any of these are true:
1281         * - there is no good power source;
1282         * - there is a charge fault.
1283         * Could also be discharging when in "supplement mode" but
1284         * there is no way to tell when its in that mode.
1285         */
1286        if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
1287                status = POWER_SUPPLY_STATUS_DISCHARGING;
1288        } else {
1289                ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
1290                ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
1291
1292                switch (ss_reg) {
1293                case 0x0: /* Not Charging */
1294                        status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1295                        break;
1296                case 0x1: /* Pre-charge */
1297                case 0x2: /* Fast Charging */
1298                        status = POWER_SUPPLY_STATUS_CHARGING;
1299                        break;
1300                case 0x3: /* Charge Termination Done */
1301                        status = POWER_SUPPLY_STATUS_FULL;
1302                        break;
1303                default:
1304                        ret = -EIO;
1305                }
1306        }
1307
1308        if (!ret)
1309                val->intval = status;
1310
1311        return ret;
1312}
1313
1314static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1315                union power_supply_propval *val)
1316{
1317        u8 v;
1318        int health;
1319
1320        mutex_lock(&bdi->f_reg_lock);
1321        v = bdi->f_reg;
1322        mutex_unlock(&bdi->f_reg_lock);
1323
1324        if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1325                health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1326        } else {
1327                v &= BQ24190_REG_F_NTC_FAULT_MASK;
1328                v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1329
1330                switch (v) {
1331                case 0x0: /* Normal */
1332                        health = POWER_SUPPLY_HEALTH_GOOD;
1333                        break;
1334                case 0x1: /* TS1 Cold */
1335                case 0x3: /* TS2 Cold */
1336                case 0x5: /* Both Cold */
1337                        health = POWER_SUPPLY_HEALTH_COLD;
1338                        break;
1339                case 0x2: /* TS1 Hot */
1340                case 0x4: /* TS2 Hot */
1341                case 0x6: /* Both Hot */
1342                        health = POWER_SUPPLY_HEALTH_OVERHEAT;
1343                        break;
1344                default:
1345                        health = POWER_SUPPLY_HEALTH_UNKNOWN;
1346                }
1347        }
1348
1349        val->intval = health;
1350        return 0;
1351}
1352
1353static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1354                union power_supply_propval *val)
1355{
1356        u8 batfet_disable;
1357        int ret;
1358
1359        ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1360                        BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1361                        BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1362        if (ret < 0)
1363                return ret;
1364
1365        val->intval = !batfet_disable;
1366        return 0;
1367}
1368
1369static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1370                const union power_supply_propval *val)
1371{
1372        return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1373                        BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1374                        BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1375}
1376
1377static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1378                union power_supply_propval *val)
1379{
1380        int temp, ret;
1381
1382        ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1383                        BQ24190_REG_ICTRC_TREG_MASK,
1384                        BQ24190_REG_ICTRC_TREG_SHIFT,
1385                        bq24190_ictrc_treg_values,
1386                        ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1387        if (ret < 0)
1388                return ret;
1389
1390        val->intval = temp;
1391        return 0;
1392}
1393
1394static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1395                const union power_supply_propval *val)
1396{
1397        return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1398                        BQ24190_REG_ICTRC_TREG_MASK,
1399                        BQ24190_REG_ICTRC_TREG_SHIFT,
1400                        bq24190_ictrc_treg_values,
1401                        ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1402}
1403
1404static int bq24190_battery_get_property(struct power_supply *psy,
1405                enum power_supply_property psp, union power_supply_propval *val)
1406{
1407        struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1408        int ret;
1409
1410        dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1411        dev_dbg(bdi->dev, "prop: %d\n", psp);
1412
1413        ret = pm_runtime_get_sync(bdi->dev);
1414        if (ret < 0)
1415                return ret;
1416
1417        switch (psp) {
1418        case POWER_SUPPLY_PROP_STATUS:
1419                ret = bq24190_battery_get_status(bdi, val);
1420                break;
1421        case POWER_SUPPLY_PROP_HEALTH:
1422                ret = bq24190_battery_get_health(bdi, val);
1423                break;
1424        case POWER_SUPPLY_PROP_ONLINE:
1425                ret = bq24190_battery_get_online(bdi, val);
1426                break;
1427        case POWER_SUPPLY_PROP_TECHNOLOGY:
1428                /* Could be Li-on or Li-polymer but no way to tell which */
1429                val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1430                ret = 0;
1431                break;
1432        case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1433                ret = bq24190_battery_get_temp_alert_max(bdi, val);
1434                break;
1435        case POWER_SUPPLY_PROP_SCOPE:
1436                val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1437                ret = 0;
1438                break;
1439        default:
1440                ret = -ENODATA;
1441        }
1442
1443        pm_runtime_mark_last_busy(bdi->dev);
1444        pm_runtime_put_autosuspend(bdi->dev);
1445
1446        return ret;
1447}
1448
1449static int bq24190_battery_set_property(struct power_supply *psy,
1450                enum power_supply_property psp,
1451                const union power_supply_propval *val)
1452{
1453        struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1454        int ret;
1455
1456        dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1457        dev_dbg(bdi->dev, "prop: %d\n", psp);
1458
1459        ret = pm_runtime_get_sync(bdi->dev);
1460        if (ret < 0)
1461                return ret;
1462
1463        switch (psp) {
1464        case POWER_SUPPLY_PROP_ONLINE:
1465                ret = bq24190_battery_set_online(bdi, val);
1466                break;
1467        case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1468                ret = bq24190_battery_set_temp_alert_max(bdi, val);
1469                break;
1470        default:
1471                ret = -EINVAL;
1472        }
1473
1474        pm_runtime_mark_last_busy(bdi->dev);
1475        pm_runtime_put_autosuspend(bdi->dev);
1476
1477        return ret;
1478}
1479
1480static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1481                enum power_supply_property psp)
1482{
1483        int ret;
1484
1485        switch (psp) {
1486        case POWER_SUPPLY_PROP_ONLINE:
1487        case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1488                ret = 1;
1489                break;
1490        default:
1491                ret = 0;
1492        }
1493
1494        return ret;
1495}
1496
1497static enum power_supply_property bq24190_battery_properties[] = {
1498        POWER_SUPPLY_PROP_STATUS,
1499        POWER_SUPPLY_PROP_HEALTH,
1500        POWER_SUPPLY_PROP_ONLINE,
1501        POWER_SUPPLY_PROP_TECHNOLOGY,
1502        POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1503        POWER_SUPPLY_PROP_SCOPE,
1504};
1505
1506static const struct power_supply_desc bq24190_battery_desc = {
1507        .name                   = "bq24190-battery",
1508        .type                   = POWER_SUPPLY_TYPE_BATTERY,
1509        .properties             = bq24190_battery_properties,
1510        .num_properties         = ARRAY_SIZE(bq24190_battery_properties),
1511        .get_property           = bq24190_battery_get_property,
1512        .set_property           = bq24190_battery_set_property,
1513        .property_is_writeable  = bq24190_battery_property_is_writeable,
1514};
1515
1516static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)
1517{
1518        bool otg_enabled;
1519        int ret;
1520
1521        otg_enabled = !!(ss_reg & BQ24190_REG_SS_VBUS_STAT_MASK);
1522        ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled);
1523        if (ret < 0)
1524                dev_err(bdi->dev, "Can't set extcon state to %d: %d\n",
1525                        otg_enabled, ret);
1526
1527        return ret;
1528}
1529
1530static void bq24190_check_status(struct bq24190_dev_info *bdi)
1531{
1532        const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1533        const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
1534                                | BQ24190_REG_F_NTC_FAULT_MASK;
1535        bool alert_charger = false, alert_battery = false;
1536        u8 ss_reg = 0, f_reg = 0;
1537        int i, ret;
1538
1539        ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1540        if (ret < 0) {
1541                dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1542                return;
1543        }
1544
1545        i = 0;
1546        do {
1547                ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1548                if (ret < 0) {
1549                        dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1550                        return;
1551                }
1552        } while (f_reg && ++i < 2);
1553
1554        /* ignore over/under voltage fault after disconnect */
1555        if (f_reg == (1 << BQ24190_REG_F_CHRG_FAULT_SHIFT) &&
1556            !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK))
1557                f_reg = 0;
1558
1559        if (f_reg != bdi->f_reg) {
1560                dev_warn(bdi->dev,
1561                        "Fault: boost %d, charge %d, battery %d, ntc %d\n",
1562                        !!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
1563                        !!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
1564                        !!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
1565                        !!(f_reg & BQ24190_REG_F_NTC_FAULT_MASK));
1566
1567                mutex_lock(&bdi->f_reg_lock);
1568                if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1569                        alert_battery = true;
1570                if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1571                        alert_charger = true;
1572                bdi->f_reg = f_reg;
1573                mutex_unlock(&bdi->f_reg_lock);
1574        }
1575
1576        if (ss_reg != bdi->ss_reg) {
1577                /*
1578                 * The device is in host mode so when PG_STAT goes from 1->0
1579                 * (i.e., power removed) HIZ needs to be disabled.
1580                 */
1581                if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1582                                !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1583                        ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1584                                        BQ24190_REG_ISC_EN_HIZ_MASK,
1585                                        BQ24190_REG_ISC_EN_HIZ_SHIFT,
1586                                        0);
1587                        if (ret < 0)
1588                                dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1589                                        ret);
1590                }
1591
1592                if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1593                        alert_battery = true;
1594                if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1595                        alert_charger = true;
1596                bdi->ss_reg = ss_reg;
1597        }
1598
1599        if (alert_charger || alert_battery) {
1600                power_supply_changed(bdi->charger);
1601                bq24190_configure_usb_otg(bdi, ss_reg);
1602        }
1603        if (alert_battery && bdi->battery)
1604                power_supply_changed(bdi->battery);
1605
1606        dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1607}
1608
1609static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1610{
1611        struct bq24190_dev_info *bdi = data;
1612        int error;
1613
1614        bdi->irq_event = true;
1615        error = pm_runtime_get_sync(bdi->dev);
1616        if (error < 0) {
1617                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1618                pm_runtime_put_noidle(bdi->dev);
1619                return IRQ_NONE;
1620        }
1621        bq24190_check_status(bdi);
1622        pm_runtime_mark_last_busy(bdi->dev);
1623        pm_runtime_put_autosuspend(bdi->dev);
1624        bdi->irq_event = false;
1625
1626        return IRQ_HANDLED;
1627}
1628
1629static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1630{
1631        u8 v;
1632        int ret;
1633
1634        /* First check that the device really is what its supposed to be */
1635        ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1636                        BQ24190_REG_VPRS_PN_MASK,
1637                        BQ24190_REG_VPRS_PN_SHIFT,
1638                        &v);
1639        if (ret < 0)
1640                return ret;
1641
1642        switch (v) {
1643        case BQ24190_REG_VPRS_PN_24190:
1644        case BQ24190_REG_VPRS_PN_24192:
1645        case BQ24190_REG_VPRS_PN_24192I:
1646                break;
1647        default:
1648                dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1649                return -ENODEV;
1650        }
1651
1652        ret = bq24190_register_reset(bdi);
1653        if (ret < 0)
1654                return ret;
1655
1656        ret = bq24190_set_config(bdi);
1657        if (ret < 0)
1658                return ret;
1659
1660        return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1661}
1662
1663static int bq24190_get_config(struct bq24190_dev_info *bdi)
1664{
1665        const char * const s = "ti,system-minimum-microvolt";
1666        struct power_supply_battery_info info = {};
1667        int v;
1668
1669        if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1670                v /= 1000;
1671                if (v >= BQ24190_REG_POC_SYS_MIN_MIN
1672                 && v <= BQ24190_REG_POC_SYS_MIN_MAX)
1673                        bdi->sys_min = v;
1674                else
1675                        dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1676        }
1677
1678        if (bdi->dev->of_node &&
1679            !power_supply_get_battery_info(bdi->charger, &info)) {
1680                v = info.precharge_current_ua / 1000;
1681                if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
1682                 && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
1683                        bdi->iprechg = v;
1684                else
1685                        dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1686                                 v);
1687
1688                v = info.charge_term_current_ua / 1000;
1689                if (v >= BQ24190_REG_PCTCC_ITERM_MIN
1690                 && v <= BQ24190_REG_PCTCC_ITERM_MAX)
1691                        bdi->iterm = v;
1692                else
1693                        dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1694                                 v);
1695        }
1696
1697        return 0;
1698}
1699
1700static int bq24190_probe(struct i2c_client *client,
1701                const struct i2c_device_id *id)
1702{
1703        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
1704        struct device *dev = &client->dev;
1705        struct power_supply_config charger_cfg = {}, battery_cfg = {};
1706        struct bq24190_dev_info *bdi;
1707        int ret;
1708
1709        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1710                dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1711                return -ENODEV;
1712        }
1713
1714        bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1715        if (!bdi) {
1716                dev_err(dev, "Can't alloc bdi struct\n");
1717                return -ENOMEM;
1718        }
1719
1720        bdi->client = client;
1721        bdi->dev = dev;
1722        strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1723        mutex_init(&bdi->f_reg_lock);
1724        bdi->f_reg = 0;
1725        bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1726        INIT_DELAYED_WORK(&bdi->input_current_limit_work,
1727                          bq24190_input_current_limit_work);
1728
1729        i2c_set_clientdata(client, bdi);
1730
1731        if (client->irq <= 0) {
1732                dev_err(dev, "Can't get irq info\n");
1733                return -EINVAL;
1734        }
1735
1736        bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable);
1737        if (IS_ERR(bdi->edev))
1738                return PTR_ERR(bdi->edev);
1739
1740        ret = devm_extcon_dev_register(dev, bdi->edev);
1741        if (ret < 0)
1742                return ret;
1743
1744        pm_runtime_enable(dev);
1745        pm_runtime_use_autosuspend(dev);
1746        pm_runtime_set_autosuspend_delay(dev, 600);
1747        ret = pm_runtime_get_sync(dev);
1748        if (ret < 0) {
1749                dev_err(dev, "pm_runtime_get failed: %i\n", ret);
1750                goto out_pmrt;
1751        }
1752
1753#ifdef CONFIG_SYSFS
1754        bq24190_sysfs_init_attrs();
1755        charger_cfg.attr_grp = bq24190_sysfs_groups;
1756#endif
1757
1758        charger_cfg.drv_data = bdi;
1759        charger_cfg.of_node = dev->of_node;
1760        charger_cfg.supplied_to = bq24190_charger_supplied_to;
1761        charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to),
1762        bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1763                                                &charger_cfg);
1764        if (IS_ERR(bdi->charger)) {
1765                dev_err(dev, "Can't register charger\n");
1766                ret = PTR_ERR(bdi->charger);
1767                goto out_pmrt;
1768        }
1769
1770        /* the battery class is deprecated and will be removed. */
1771        /* in the interim, this property hides it.              */
1772        if (!device_property_read_bool(dev, "omit-battery-class")) {
1773                battery_cfg.drv_data = bdi;
1774                bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1775                                                     &battery_cfg);
1776                if (IS_ERR(bdi->battery)) {
1777                        dev_err(dev, "Can't register battery\n");
1778                        ret = PTR_ERR(bdi->battery);
1779                        goto out_charger;
1780                }
1781        }
1782
1783        ret = bq24190_get_config(bdi);
1784        if (ret < 0) {
1785                dev_err(dev, "Can't get devicetree config\n");
1786                goto out_charger;
1787        }
1788
1789        ret = bq24190_hw_init(bdi);
1790        if (ret < 0) {
1791                dev_err(dev, "Hardware init failed\n");
1792                goto out_charger;
1793        }
1794
1795        ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg);
1796        if (ret < 0)
1797                goto out_charger;
1798
1799        bdi->initialized = true;
1800
1801        ret = devm_request_threaded_irq(dev, client->irq, NULL,
1802                        bq24190_irq_handler_thread,
1803                        IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1804                        "bq24190-charger", bdi);
1805        if (ret < 0) {
1806                dev_err(dev, "Can't set up irq handler\n");
1807                goto out_charger;
1808        }
1809
1810        ret = bq24190_register_vbus_regulator(bdi);
1811        if (ret < 0)
1812                goto out_charger;
1813
1814        enable_irq_wake(client->irq);
1815
1816        pm_runtime_mark_last_busy(dev);
1817        pm_runtime_put_autosuspend(dev);
1818
1819        return 0;
1820
1821out_charger:
1822        if (!IS_ERR_OR_NULL(bdi->battery))
1823                power_supply_unregister(bdi->battery);
1824        power_supply_unregister(bdi->charger);
1825
1826out_pmrt:
1827        pm_runtime_put_sync(dev);
1828        pm_runtime_dont_use_autosuspend(dev);
1829        pm_runtime_disable(dev);
1830        return ret;
1831}
1832
1833static int bq24190_remove(struct i2c_client *client)
1834{
1835        struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1836        int error;
1837
1838        error = pm_runtime_get_sync(bdi->dev);
1839        if (error < 0) {
1840                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1841                pm_runtime_put_noidle(bdi->dev);
1842        }
1843
1844        bq24190_register_reset(bdi);
1845        if (bdi->battery)
1846                power_supply_unregister(bdi->battery);
1847        power_supply_unregister(bdi->charger);
1848        if (error >= 0)
1849                pm_runtime_put_sync(bdi->dev);
1850        pm_runtime_dont_use_autosuspend(bdi->dev);
1851        pm_runtime_disable(bdi->dev);
1852
1853        return 0;
1854}
1855
1856static __maybe_unused int bq24190_runtime_suspend(struct device *dev)
1857{
1858        struct i2c_client *client = to_i2c_client(dev);
1859        struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1860
1861        if (!bdi->initialized)
1862                return 0;
1863
1864        dev_dbg(bdi->dev, "%s\n", __func__);
1865
1866        return 0;
1867}
1868
1869static __maybe_unused int bq24190_runtime_resume(struct device *dev)
1870{
1871        struct i2c_client *client = to_i2c_client(dev);
1872        struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1873
1874        if (!bdi->initialized)
1875                return 0;
1876
1877        if (!bdi->irq_event) {
1878                dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
1879                bq24190_check_status(bdi);
1880        }
1881
1882        return 0;
1883}
1884
1885static __maybe_unused int bq24190_pm_suspend(struct device *dev)
1886{
1887        struct i2c_client *client = to_i2c_client(dev);
1888        struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1889        int error;
1890
1891        error = pm_runtime_get_sync(bdi->dev);
1892        if (error < 0) {
1893                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1894                pm_runtime_put_noidle(bdi->dev);
1895        }
1896
1897        bq24190_register_reset(bdi);
1898
1899        if (error >= 0) {
1900                pm_runtime_mark_last_busy(bdi->dev);
1901                pm_runtime_put_autosuspend(bdi->dev);
1902        }
1903
1904        return 0;
1905}
1906
1907static __maybe_unused int bq24190_pm_resume(struct device *dev)
1908{
1909        struct i2c_client *client = to_i2c_client(dev);
1910        struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1911        int error;
1912
1913        bdi->f_reg = 0;
1914        bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1915
1916        error = pm_runtime_get_sync(bdi->dev);
1917        if (error < 0) {
1918                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1919                pm_runtime_put_noidle(bdi->dev);
1920        }
1921
1922        bq24190_register_reset(bdi);
1923        bq24190_set_config(bdi);
1924        bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1925
1926        if (error >= 0) {
1927                pm_runtime_mark_last_busy(bdi->dev);
1928                pm_runtime_put_autosuspend(bdi->dev);
1929        }
1930
1931        /* Things may have changed while suspended so alert upper layer */
1932        power_supply_changed(bdi->charger);
1933        if (bdi->battery)
1934                power_supply_changed(bdi->battery);
1935
1936        return 0;
1937}
1938
1939static const struct dev_pm_ops bq24190_pm_ops = {
1940        SET_RUNTIME_PM_OPS(bq24190_runtime_suspend, bq24190_runtime_resume,
1941                           NULL)
1942        SET_SYSTEM_SLEEP_PM_OPS(bq24190_pm_suspend, bq24190_pm_resume)
1943};
1944
1945static const struct i2c_device_id bq24190_i2c_ids[] = {
1946        { "bq24190" },
1947        { "bq24192" },
1948        { "bq24192i" },
1949        { "bq24196" },
1950        { },
1951};
1952MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
1953
1954#ifdef CONFIG_OF
1955static const struct of_device_id bq24190_of_match[] = {
1956        { .compatible = "ti,bq24190", },
1957        { .compatible = "ti,bq24192", },
1958        { .compatible = "ti,bq24192i", },
1959        { .compatible = "ti,bq24196", },
1960        { },
1961};
1962MODULE_DEVICE_TABLE(of, bq24190_of_match);
1963#else
1964static const struct of_device_id bq24190_of_match[] = {
1965        { },
1966};
1967#endif
1968
1969static struct i2c_driver bq24190_driver = {
1970        .probe          = bq24190_probe,
1971        .remove         = bq24190_remove,
1972        .id_table       = bq24190_i2c_ids,
1973        .driver = {
1974                .name           = "bq24190-charger",
1975                .pm             = &bq24190_pm_ops,
1976                .of_match_table = of_match_ptr(bq24190_of_match),
1977        },
1978};
1979module_i2c_driver(bq24190_driver);
1980
1981MODULE_LICENSE("GPL");
1982MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
1983MODULE_DESCRIPTION("TI BQ24190 Charger Driver");
1984