linux/drivers/power/supply/bq24257_charger.c
<<
>>
Prefs
   1/*
   2 * TI BQ24257 charger driver
   3 *
   4 * Copyright (C) 2015 Intel Corporation
   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 as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * Datasheets:
  17 * http://www.ti.com/product/bq24250
  18 * http://www.ti.com/product/bq24251
  19 * http://www.ti.com/product/bq24257
  20 */
  21
  22#include <linux/module.h>
  23#include <linux/i2c.h>
  24#include <linux/power_supply.h>
  25#include <linux/regmap.h>
  26#include <linux/types.h>
  27#include <linux/gpio/consumer.h>
  28#include <linux/interrupt.h>
  29#include <linux/delay.h>
  30
  31#include <linux/acpi.h>
  32#include <linux/of.h>
  33
  34#define BQ24257_REG_1                   0x00
  35#define BQ24257_REG_2                   0x01
  36#define BQ24257_REG_3                   0x02
  37#define BQ24257_REG_4                   0x03
  38#define BQ24257_REG_5                   0x04
  39#define BQ24257_REG_6                   0x05
  40#define BQ24257_REG_7                   0x06
  41
  42#define BQ24257_MANUFACTURER            "Texas Instruments"
  43#define BQ24257_PG_GPIO                 "pg"
  44
  45#define BQ24257_ILIM_SET_DELAY          1000    /* msec */
  46
  47/*
  48 * When adding support for new devices make sure that enum bq2425x_chip and
  49 * bq2425x_chip_name[] always stay in sync!
  50 */
  51enum bq2425x_chip {
  52        BQ24250,
  53        BQ24251,
  54        BQ24257,
  55};
  56
  57static const char *const bq2425x_chip_name[] = {
  58        "bq24250",
  59        "bq24251",
  60        "bq24257",
  61};
  62
  63enum bq24257_fields {
  64        F_WD_FAULT, F_WD_EN, F_STAT, F_FAULT,                       /* REG 1 */
  65        F_RESET, F_IILIMIT, F_EN_STAT, F_EN_TERM, F_CE, F_HZ_MODE,  /* REG 2 */
  66        F_VBAT, F_USB_DET,                                          /* REG 3 */
  67        F_ICHG, F_ITERM,                                            /* REG 4 */
  68        F_LOOP_STATUS, F_LOW_CHG, F_DPDM_EN, F_CE_STATUS, F_VINDPM, /* REG 5 */
  69        F_X2_TMR_EN, F_TMR, F_SYSOFF, F_TS_EN, F_TS_STAT,           /* REG 6 */
  70        F_VOVP, F_CLR_VDP, F_FORCE_BATDET, F_FORCE_PTM,             /* REG 7 */
  71
  72        F_MAX_FIELDS
  73};
  74
  75/* initial field values, converted from uV/uA */
  76struct bq24257_init_data {
  77        u8 ichg;        /* charge current      */
  78        u8 vbat;        /* regulation voltage  */
  79        u8 iterm;       /* termination current */
  80        u8 iilimit;     /* input current limit */
  81        u8 vovp;        /* over voltage protection voltage */
  82        u8 vindpm;      /* VDMP input threshold voltage */
  83};
  84
  85struct bq24257_state {
  86        u8 status;
  87        u8 fault;
  88        bool power_good;
  89};
  90
  91struct bq24257_device {
  92        struct i2c_client *client;
  93        struct device *dev;
  94        struct power_supply *charger;
  95
  96        enum bq2425x_chip chip;
  97
  98        struct regmap *rmap;
  99        struct regmap_field *rmap_fields[F_MAX_FIELDS];
 100
 101        struct gpio_desc *pg;
 102
 103        struct delayed_work iilimit_setup_work;
 104
 105        struct bq24257_init_data init_data;
 106        struct bq24257_state state;
 107
 108        struct mutex lock; /* protect state data */
 109
 110        bool iilimit_autoset_enable;
 111};
 112
 113static bool bq24257_is_volatile_reg(struct device *dev, unsigned int reg)
 114{
 115        switch (reg) {
 116        case BQ24257_REG_2:
 117        case BQ24257_REG_4:
 118                return false;
 119
 120        default:
 121                return true;
 122        }
 123}
 124
 125static const struct regmap_config bq24257_regmap_config = {
 126        .reg_bits = 8,
 127        .val_bits = 8,
 128
 129        .max_register = BQ24257_REG_7,
 130        .cache_type = REGCACHE_RBTREE,
 131
 132        .volatile_reg = bq24257_is_volatile_reg,
 133};
 134
 135static const struct reg_field bq24257_reg_fields[] = {
 136        /* REG 1 */
 137        [F_WD_FAULT]            = REG_FIELD(BQ24257_REG_1, 7, 7),
 138        [F_WD_EN]               = REG_FIELD(BQ24257_REG_1, 6, 6),
 139        [F_STAT]                = REG_FIELD(BQ24257_REG_1, 4, 5),
 140        [F_FAULT]               = REG_FIELD(BQ24257_REG_1, 0, 3),
 141        /* REG 2 */
 142        [F_RESET]               = REG_FIELD(BQ24257_REG_2, 7, 7),
 143        [F_IILIMIT]             = REG_FIELD(BQ24257_REG_2, 4, 6),
 144        [F_EN_STAT]             = REG_FIELD(BQ24257_REG_2, 3, 3),
 145        [F_EN_TERM]             = REG_FIELD(BQ24257_REG_2, 2, 2),
 146        [F_CE]                  = REG_FIELD(BQ24257_REG_2, 1, 1),
 147        [F_HZ_MODE]             = REG_FIELD(BQ24257_REG_2, 0, 0),
 148        /* REG 3 */
 149        [F_VBAT]                = REG_FIELD(BQ24257_REG_3, 2, 7),
 150        [F_USB_DET]             = REG_FIELD(BQ24257_REG_3, 0, 1),
 151        /* REG 4 */
 152        [F_ICHG]                = REG_FIELD(BQ24257_REG_4, 3, 7),
 153        [F_ITERM]               = REG_FIELD(BQ24257_REG_4, 0, 2),
 154        /* REG 5 */
 155        [F_LOOP_STATUS]         = REG_FIELD(BQ24257_REG_5, 6, 7),
 156        [F_LOW_CHG]             = REG_FIELD(BQ24257_REG_5, 5, 5),
 157        [F_DPDM_EN]             = REG_FIELD(BQ24257_REG_5, 4, 4),
 158        [F_CE_STATUS]           = REG_FIELD(BQ24257_REG_5, 3, 3),
 159        [F_VINDPM]              = REG_FIELD(BQ24257_REG_5, 0, 2),
 160        /* REG 6 */
 161        [F_X2_TMR_EN]           = REG_FIELD(BQ24257_REG_6, 7, 7),
 162        [F_TMR]                 = REG_FIELD(BQ24257_REG_6, 5, 6),
 163        [F_SYSOFF]              = REG_FIELD(BQ24257_REG_6, 4, 4),
 164        [F_TS_EN]               = REG_FIELD(BQ24257_REG_6, 3, 3),
 165        [F_TS_STAT]             = REG_FIELD(BQ24257_REG_6, 0, 2),
 166        /* REG 7 */
 167        [F_VOVP]                = REG_FIELD(BQ24257_REG_7, 5, 7),
 168        [F_CLR_VDP]             = REG_FIELD(BQ24257_REG_7, 4, 4),
 169        [F_FORCE_BATDET]        = REG_FIELD(BQ24257_REG_7, 3, 3),
 170        [F_FORCE_PTM]           = REG_FIELD(BQ24257_REG_7, 2, 2)
 171};
 172
 173static const u32 bq24257_vbat_map[] = {
 174        3500000, 3520000, 3540000, 3560000, 3580000, 3600000, 3620000, 3640000,
 175        3660000, 3680000, 3700000, 3720000, 3740000, 3760000, 3780000, 3800000,
 176        3820000, 3840000, 3860000, 3880000, 3900000, 3920000, 3940000, 3960000,
 177        3980000, 4000000, 4020000, 4040000, 4060000, 4080000, 4100000, 4120000,
 178        4140000, 4160000, 4180000, 4200000, 4220000, 4240000, 4260000, 4280000,
 179        4300000, 4320000, 4340000, 4360000, 4380000, 4400000, 4420000, 4440000
 180};
 181
 182#define BQ24257_VBAT_MAP_SIZE           ARRAY_SIZE(bq24257_vbat_map)
 183
 184static const u32 bq24257_ichg_map[] = {
 185        500000, 550000, 600000, 650000, 700000, 750000, 800000, 850000, 900000,
 186        950000, 1000000, 1050000, 1100000, 1150000, 1200000, 1250000, 1300000,
 187        1350000, 1400000, 1450000, 1500000, 1550000, 1600000, 1650000, 1700000,
 188        1750000, 1800000, 1850000, 1900000, 1950000, 2000000
 189};
 190
 191#define BQ24257_ICHG_MAP_SIZE           ARRAY_SIZE(bq24257_ichg_map)
 192
 193static const u32 bq24257_iterm_map[] = {
 194        50000, 75000, 100000, 125000, 150000, 175000, 200000, 225000
 195};
 196
 197#define BQ24257_ITERM_MAP_SIZE          ARRAY_SIZE(bq24257_iterm_map)
 198
 199static const u32 bq24257_iilimit_map[] = {
 200        100000, 150000, 500000, 900000, 1500000, 2000000
 201};
 202
 203#define BQ24257_IILIMIT_MAP_SIZE        ARRAY_SIZE(bq24257_iilimit_map)
 204
 205static const u32 bq24257_vovp_map[] = {
 206        6000000, 6500000, 7000000, 8000000, 9000000, 9500000, 10000000,
 207        10500000
 208};
 209
 210#define BQ24257_VOVP_MAP_SIZE           ARRAY_SIZE(bq24257_vovp_map)
 211
 212static const u32 bq24257_vindpm_map[] = {
 213        4200000, 4280000, 4360000, 4440000, 4520000, 4600000, 4680000,
 214        4760000
 215};
 216
 217#define BQ24257_VINDPM_MAP_SIZE         ARRAY_SIZE(bq24257_vindpm_map)
 218
 219static int bq24257_field_read(struct bq24257_device *bq,
 220                              enum bq24257_fields field_id)
 221{
 222        int ret;
 223        int val;
 224
 225        ret = regmap_field_read(bq->rmap_fields[field_id], &val);
 226        if (ret < 0)
 227                return ret;
 228
 229        return val;
 230}
 231
 232static int bq24257_field_write(struct bq24257_device *bq,
 233                               enum bq24257_fields field_id, u8 val)
 234{
 235        return regmap_field_write(bq->rmap_fields[field_id], val);
 236}
 237
 238static u8 bq24257_find_idx(u32 value, const u32 *map, u8 map_size)
 239{
 240        u8 idx;
 241
 242        for (idx = 1; idx < map_size; idx++)
 243                if (value < map[idx])
 244                        break;
 245
 246        return idx - 1;
 247}
 248
 249enum bq24257_status {
 250        STATUS_READY,
 251        STATUS_CHARGE_IN_PROGRESS,
 252        STATUS_CHARGE_DONE,
 253        STATUS_FAULT,
 254};
 255
 256enum bq24257_fault {
 257        FAULT_NORMAL,
 258        FAULT_INPUT_OVP,
 259        FAULT_INPUT_UVLO,
 260        FAULT_SLEEP,
 261        FAULT_BAT_TS,
 262        FAULT_BAT_OVP,
 263        FAULT_TS,
 264        FAULT_TIMER,
 265        FAULT_NO_BAT,
 266        FAULT_ISET,
 267        FAULT_INPUT_LDO_LOW,
 268};
 269
 270static int bq24257_get_input_current_limit(struct bq24257_device *bq,
 271                                           union power_supply_propval *val)
 272{
 273        int ret;
 274
 275        ret = bq24257_field_read(bq, F_IILIMIT);
 276        if (ret < 0)
 277                return ret;
 278
 279        /*
 280         * The "External ILIM" and "Production & Test" modes are not exposed
 281         * through this driver and not being covered by the lookup table.
 282         * Should such a mode have become active let's return an error rather
 283         * than exceeding the bounds of the lookup table and returning
 284         * garbage.
 285         */
 286        if (ret >= BQ24257_IILIMIT_MAP_SIZE)
 287                return -ENODATA;
 288
 289        val->intval = bq24257_iilimit_map[ret];
 290
 291        return 0;
 292}
 293
 294static int bq24257_set_input_current_limit(struct bq24257_device *bq,
 295                                        const union power_supply_propval *val)
 296{
 297        /*
 298         * Address the case where the user manually sets an input current limit
 299         * while the charger auto-detection mechanism is is active. In this
 300         * case we want to abort and go straight to the user-specified value.
 301         */
 302        if (bq->iilimit_autoset_enable)
 303                cancel_delayed_work_sync(&bq->iilimit_setup_work);
 304
 305        return bq24257_field_write(bq, F_IILIMIT,
 306                                   bq24257_find_idx(val->intval,
 307                                                    bq24257_iilimit_map,
 308                                                    BQ24257_IILIMIT_MAP_SIZE));
 309}
 310
 311static int bq24257_power_supply_get_property(struct power_supply *psy,
 312                                             enum power_supply_property psp,
 313                                             union power_supply_propval *val)
 314{
 315        struct bq24257_device *bq = power_supply_get_drvdata(psy);
 316        struct bq24257_state state;
 317
 318        mutex_lock(&bq->lock);
 319        state = bq->state;
 320        mutex_unlock(&bq->lock);
 321
 322        switch (psp) {
 323        case POWER_SUPPLY_PROP_STATUS:
 324                if (!state.power_good)
 325                        val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
 326                else if (state.status == STATUS_READY)
 327                        val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
 328                else if (state.status == STATUS_CHARGE_IN_PROGRESS)
 329                        val->intval = POWER_SUPPLY_STATUS_CHARGING;
 330                else if (state.status == STATUS_CHARGE_DONE)
 331                        val->intval = POWER_SUPPLY_STATUS_FULL;
 332                else
 333                        val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
 334                break;
 335
 336        case POWER_SUPPLY_PROP_MANUFACTURER:
 337                val->strval = BQ24257_MANUFACTURER;
 338                break;
 339
 340        case POWER_SUPPLY_PROP_MODEL_NAME:
 341                val->strval = bq2425x_chip_name[bq->chip];
 342                break;
 343
 344        case POWER_SUPPLY_PROP_ONLINE:
 345                val->intval = state.power_good;
 346                break;
 347
 348        case POWER_SUPPLY_PROP_HEALTH:
 349                switch (state.fault) {
 350                case FAULT_NORMAL:
 351                        val->intval = POWER_SUPPLY_HEALTH_GOOD;
 352                        break;
 353
 354                case FAULT_INPUT_OVP:
 355                case FAULT_BAT_OVP:
 356                        val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
 357                        break;
 358
 359                case FAULT_TS:
 360                case FAULT_BAT_TS:
 361                        val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
 362                        break;
 363
 364                case FAULT_TIMER:
 365                        val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
 366                        break;
 367
 368                default:
 369                        val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
 370                        break;
 371                }
 372
 373                break;
 374
 375        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
 376                val->intval = bq24257_ichg_map[bq->init_data.ichg];
 377                break;
 378
 379        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
 380                val->intval = bq24257_ichg_map[BQ24257_ICHG_MAP_SIZE - 1];
 381                break;
 382
 383        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
 384                val->intval = bq24257_vbat_map[bq->init_data.vbat];
 385                break;
 386
 387        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
 388                val->intval = bq24257_vbat_map[BQ24257_VBAT_MAP_SIZE - 1];
 389                break;
 390
 391        case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
 392                val->intval = bq24257_iterm_map[bq->init_data.iterm];
 393                break;
 394
 395        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
 396                return bq24257_get_input_current_limit(bq, val);
 397
 398        default:
 399                return -EINVAL;
 400        }
 401
 402        return 0;
 403}
 404
 405static int bq24257_power_supply_set_property(struct power_supply *psy,
 406                                        enum power_supply_property prop,
 407                                        const union power_supply_propval *val)
 408{
 409        struct bq24257_device *bq = power_supply_get_drvdata(psy);
 410
 411        switch (prop) {
 412        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
 413                return bq24257_set_input_current_limit(bq, val);
 414        default:
 415                return -EINVAL;
 416        }
 417}
 418
 419static int bq24257_power_supply_property_is_writeable(struct power_supply *psy,
 420                                        enum power_supply_property psp)
 421{
 422        switch (psp) {
 423        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
 424                return true;
 425        default:
 426                return false;
 427        }
 428}
 429
 430static int bq24257_get_chip_state(struct bq24257_device *bq,
 431                                  struct bq24257_state *state)
 432{
 433        int ret;
 434
 435        ret = bq24257_field_read(bq, F_STAT);
 436        if (ret < 0)
 437                return ret;
 438
 439        state->status = ret;
 440
 441        ret = bq24257_field_read(bq, F_FAULT);
 442        if (ret < 0)
 443                return ret;
 444
 445        state->fault = ret;
 446
 447        if (bq->pg)
 448                state->power_good = !gpiod_get_value_cansleep(bq->pg);
 449        else
 450                /*
 451                 * If we have a chip without a dedicated power-good GPIO or
 452                 * some other explicit bit that would provide this information
 453                 * assume the power is good if there is no supply related
 454                 * fault - and not good otherwise. There is a possibility for
 455                 * other errors to mask that power in fact is not good but this
 456                 * is probably the best we can do here.
 457                 */
 458                switch (state->fault) {
 459                case FAULT_INPUT_OVP:
 460                case FAULT_INPUT_UVLO:
 461                case FAULT_INPUT_LDO_LOW:
 462                        state->power_good = false;
 463                        break;
 464                default:
 465                        state->power_good = true;
 466                }
 467
 468        return 0;
 469}
 470
 471static bool bq24257_state_changed(struct bq24257_device *bq,
 472                                  struct bq24257_state *new_state)
 473{
 474        int ret;
 475
 476        mutex_lock(&bq->lock);
 477        ret = (bq->state.status != new_state->status ||
 478               bq->state.fault != new_state->fault ||
 479               bq->state.power_good != new_state->power_good);
 480        mutex_unlock(&bq->lock);
 481
 482        return ret;
 483}
 484
 485enum bq24257_loop_status {
 486        LOOP_STATUS_NONE,
 487        LOOP_STATUS_IN_DPM,
 488        LOOP_STATUS_IN_CURRENT_LIMIT,
 489        LOOP_STATUS_THERMAL,
 490};
 491
 492enum bq24257_in_ilimit {
 493        IILIMIT_100,
 494        IILIMIT_150,
 495        IILIMIT_500,
 496        IILIMIT_900,
 497        IILIMIT_1500,
 498        IILIMIT_2000,
 499        IILIMIT_EXT,
 500        IILIMIT_NONE,
 501};
 502
 503enum bq24257_vovp {
 504        VOVP_6000,
 505        VOVP_6500,
 506        VOVP_7000,
 507        VOVP_8000,
 508        VOVP_9000,
 509        VOVP_9500,
 510        VOVP_10000,
 511        VOVP_10500
 512};
 513
 514enum bq24257_vindpm {
 515        VINDPM_4200,
 516        VINDPM_4280,
 517        VINDPM_4360,
 518        VINDPM_4440,
 519        VINDPM_4520,
 520        VINDPM_4600,
 521        VINDPM_4680,
 522        VINDPM_4760
 523};
 524
 525enum bq24257_port_type {
 526        PORT_TYPE_DCP,          /* Dedicated Charging Port */
 527        PORT_TYPE_CDP,          /* Charging Downstream Port */
 528        PORT_TYPE_SDP,          /* Standard Downstream Port */
 529        PORT_TYPE_NON_STANDARD,
 530};
 531
 532enum bq24257_safety_timer {
 533        SAFETY_TIMER_45,
 534        SAFETY_TIMER_360,
 535        SAFETY_TIMER_540,
 536        SAFETY_TIMER_NONE,
 537};
 538
 539static int bq24257_iilimit_autoset(struct bq24257_device *bq)
 540{
 541        int loop_status;
 542        int iilimit;
 543        int port_type;
 544        int ret;
 545        const u8 new_iilimit[] = {
 546                [PORT_TYPE_DCP] = IILIMIT_2000,
 547                [PORT_TYPE_CDP] = IILIMIT_2000,
 548                [PORT_TYPE_SDP] = IILIMIT_500,
 549                [PORT_TYPE_NON_STANDARD] = IILIMIT_500
 550        };
 551
 552        ret = bq24257_field_read(bq, F_LOOP_STATUS);
 553        if (ret < 0)
 554                goto error;
 555
 556        loop_status = ret;
 557
 558        ret = bq24257_field_read(bq, F_IILIMIT);
 559        if (ret < 0)
 560                goto error;
 561
 562        iilimit = ret;
 563
 564        /*
 565         * All USB ports should be able to handle 500mA. If not, DPM will lower
 566         * the charging current to accommodate the power source. No need to set
 567         * a lower IILIMIT value.
 568         */
 569        if (loop_status == LOOP_STATUS_IN_DPM && iilimit == IILIMIT_500)
 570                return 0;
 571
 572        ret = bq24257_field_read(bq, F_USB_DET);
 573        if (ret < 0)
 574                goto error;
 575
 576        port_type = ret;
 577
 578        ret = bq24257_field_write(bq, F_IILIMIT, new_iilimit[port_type]);
 579        if (ret < 0)
 580                goto error;
 581
 582        ret = bq24257_field_write(bq, F_TMR, SAFETY_TIMER_360);
 583        if (ret < 0)
 584                goto error;
 585
 586        ret = bq24257_field_write(bq, F_CLR_VDP, 1);
 587        if (ret < 0)
 588                goto error;
 589
 590        dev_dbg(bq->dev, "port/loop = %d/%d -> iilimit = %d\n",
 591                port_type, loop_status, new_iilimit[port_type]);
 592
 593        return 0;
 594
 595error:
 596        dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__);
 597        return ret;
 598}
 599
 600static void bq24257_iilimit_setup_work(struct work_struct *work)
 601{
 602        struct bq24257_device *bq = container_of(work, struct bq24257_device,
 603                                                 iilimit_setup_work.work);
 604
 605        bq24257_iilimit_autoset(bq);
 606}
 607
 608static void bq24257_handle_state_change(struct bq24257_device *bq,
 609                                        struct bq24257_state *new_state)
 610{
 611        int ret;
 612        struct bq24257_state old_state;
 613
 614        mutex_lock(&bq->lock);
 615        old_state = bq->state;
 616        mutex_unlock(&bq->lock);
 617
 618        /*
 619         * Handle BQ2425x state changes observing whether the D+/D- based input
 620         * current limit autoset functionality is enabled.
 621         */
 622        if (!new_state->power_good) {
 623                dev_dbg(bq->dev, "Power removed\n");
 624                if (bq->iilimit_autoset_enable) {
 625                        cancel_delayed_work_sync(&bq->iilimit_setup_work);
 626
 627                        /* activate D+/D- port detection algorithm */
 628                        ret = bq24257_field_write(bq, F_DPDM_EN, 1);
 629                        if (ret < 0)
 630                                goto error;
 631                }
 632                /*
 633                 * When power is removed always return to the default input
 634                 * current limit as configured during probe.
 635                 */
 636                ret = bq24257_field_write(bq, F_IILIMIT, bq->init_data.iilimit);
 637                if (ret < 0)
 638                        goto error;
 639        } else if (!old_state.power_good) {
 640                dev_dbg(bq->dev, "Power inserted\n");
 641
 642                if (bq->iilimit_autoset_enable)
 643                        /* configure input current limit */
 644                        schedule_delayed_work(&bq->iilimit_setup_work,
 645                                      msecs_to_jiffies(BQ24257_ILIM_SET_DELAY));
 646        } else if (new_state->fault == FAULT_NO_BAT) {
 647                dev_warn(bq->dev, "Battery removed\n");
 648        } else if (new_state->fault == FAULT_TIMER) {
 649                dev_err(bq->dev, "Safety timer expired! Battery dead?\n");
 650        }
 651
 652        return;
 653
 654error:
 655        dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__);
 656}
 657
 658static irqreturn_t bq24257_irq_handler_thread(int irq, void *private)
 659{
 660        int ret;
 661        struct bq24257_device *bq = private;
 662        struct bq24257_state state;
 663
 664        ret = bq24257_get_chip_state(bq, &state);
 665        if (ret < 0)
 666                return IRQ_HANDLED;
 667
 668        if (!bq24257_state_changed(bq, &state))
 669                return IRQ_HANDLED;
 670
 671        dev_dbg(bq->dev, "irq(state changed): status/fault/pg = %d/%d/%d\n",
 672                state.status, state.fault, state.power_good);
 673
 674        bq24257_handle_state_change(bq, &state);
 675
 676        mutex_lock(&bq->lock);
 677        bq->state = state;
 678        mutex_unlock(&bq->lock);
 679
 680        power_supply_changed(bq->charger);
 681
 682        return IRQ_HANDLED;
 683}
 684
 685static int bq24257_hw_init(struct bq24257_device *bq)
 686{
 687        int ret;
 688        int i;
 689        struct bq24257_state state;
 690
 691        const struct {
 692                int field;
 693                u32 value;
 694        } init_data[] = {
 695                {F_ICHG, bq->init_data.ichg},
 696                {F_VBAT, bq->init_data.vbat},
 697                {F_ITERM, bq->init_data.iterm},
 698                {F_VOVP, bq->init_data.vovp},
 699                {F_VINDPM, bq->init_data.vindpm},
 700        };
 701
 702        /*
 703         * Disable the watchdog timer to prevent the IC from going back to
 704         * default settings after 50 seconds of I2C inactivity.
 705         */
 706        ret = bq24257_field_write(bq, F_WD_EN, 0);
 707        if (ret < 0)
 708                return ret;
 709
 710        /* configure the charge currents and voltages */
 711        for (i = 0; i < ARRAY_SIZE(init_data); i++) {
 712                ret = bq24257_field_write(bq, init_data[i].field,
 713                                          init_data[i].value);
 714                if (ret < 0)
 715                        return ret;
 716        }
 717
 718        ret = bq24257_get_chip_state(bq, &state);
 719        if (ret < 0)
 720                return ret;
 721
 722        mutex_lock(&bq->lock);
 723        bq->state = state;
 724        mutex_unlock(&bq->lock);
 725
 726        if (!bq->iilimit_autoset_enable) {
 727                dev_dbg(bq->dev, "manually setting iilimit = %u\n",
 728                        bq->init_data.iilimit);
 729
 730                /* program fixed input current limit */
 731                ret = bq24257_field_write(bq, F_IILIMIT,
 732                                          bq->init_data.iilimit);
 733                if (ret < 0)
 734                        return ret;
 735        } else if (!state.power_good)
 736                /* activate D+/D- detection algorithm */
 737                ret = bq24257_field_write(bq, F_DPDM_EN, 1);
 738        else if (state.fault != FAULT_NO_BAT)
 739                ret = bq24257_iilimit_autoset(bq);
 740
 741        return ret;
 742}
 743
 744static enum power_supply_property bq24257_power_supply_props[] = {
 745        POWER_SUPPLY_PROP_MANUFACTURER,
 746        POWER_SUPPLY_PROP_MODEL_NAME,
 747        POWER_SUPPLY_PROP_STATUS,
 748        POWER_SUPPLY_PROP_ONLINE,
 749        POWER_SUPPLY_PROP_HEALTH,
 750        POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
 751        POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
 752        POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
 753        POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
 754        POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
 755        POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
 756};
 757
 758static char *bq24257_charger_supplied_to[] = {
 759        "main-battery",
 760};
 761
 762static const struct power_supply_desc bq24257_power_supply_desc = {
 763        .name = "bq24257-charger",
 764        .type = POWER_SUPPLY_TYPE_USB,
 765        .properties = bq24257_power_supply_props,
 766        .num_properties = ARRAY_SIZE(bq24257_power_supply_props),
 767        .get_property = bq24257_power_supply_get_property,
 768        .set_property = bq24257_power_supply_set_property,
 769        .property_is_writeable = bq24257_power_supply_property_is_writeable,
 770};
 771
 772static ssize_t bq24257_show_ovp_voltage(struct device *dev,
 773                                        struct device_attribute *attr,
 774                                        char *buf)
 775{
 776        struct power_supply *psy = dev_get_drvdata(dev);
 777        struct bq24257_device *bq = power_supply_get_drvdata(psy);
 778
 779        return scnprintf(buf, PAGE_SIZE, "%u\n",
 780                         bq24257_vovp_map[bq->init_data.vovp]);
 781}
 782
 783static ssize_t bq24257_show_in_dpm_voltage(struct device *dev,
 784                                           struct device_attribute *attr,
 785                                           char *buf)
 786{
 787        struct power_supply *psy = dev_get_drvdata(dev);
 788        struct bq24257_device *bq = power_supply_get_drvdata(psy);
 789
 790        return scnprintf(buf, PAGE_SIZE, "%u\n",
 791                         bq24257_vindpm_map[bq->init_data.vindpm]);
 792}
 793
 794static ssize_t bq24257_sysfs_show_enable(struct device *dev,
 795                                         struct device_attribute *attr,
 796                                         char *buf)
 797{
 798        struct power_supply *psy = dev_get_drvdata(dev);
 799        struct bq24257_device *bq = power_supply_get_drvdata(psy);
 800        int ret;
 801
 802        if (strcmp(attr->attr.name, "high_impedance_enable") == 0)
 803                ret = bq24257_field_read(bq, F_HZ_MODE);
 804        else if (strcmp(attr->attr.name, "sysoff_enable") == 0)
 805                ret = bq24257_field_read(bq, F_SYSOFF);
 806        else
 807                return -EINVAL;
 808
 809        if (ret < 0)
 810                return ret;
 811
 812        return scnprintf(buf, PAGE_SIZE, "%d\n", ret);
 813}
 814
 815static ssize_t bq24257_sysfs_set_enable(struct device *dev,
 816                                        struct device_attribute *attr,
 817                                        const char *buf,
 818                                        size_t count)
 819{
 820        struct power_supply *psy = dev_get_drvdata(dev);
 821        struct bq24257_device *bq = power_supply_get_drvdata(psy);
 822        long val;
 823        int ret;
 824
 825        if (kstrtol(buf, 10, &val) < 0)
 826                return -EINVAL;
 827
 828        if (strcmp(attr->attr.name, "high_impedance_enable") == 0)
 829                ret = bq24257_field_write(bq, F_HZ_MODE, (bool)val);
 830        else if (strcmp(attr->attr.name, "sysoff_enable") == 0)
 831                ret = bq24257_field_write(bq, F_SYSOFF, (bool)val);
 832        else
 833                return -EINVAL;
 834
 835        if (ret < 0)
 836                return ret;
 837
 838        return count;
 839}
 840
 841static DEVICE_ATTR(ovp_voltage, S_IRUGO, bq24257_show_ovp_voltage, NULL);
 842static DEVICE_ATTR(in_dpm_voltage, S_IRUGO, bq24257_show_in_dpm_voltage, NULL);
 843static DEVICE_ATTR(high_impedance_enable, S_IWUSR | S_IRUGO,
 844                   bq24257_sysfs_show_enable, bq24257_sysfs_set_enable);
 845static DEVICE_ATTR(sysoff_enable, S_IWUSR | S_IRUGO,
 846                   bq24257_sysfs_show_enable, bq24257_sysfs_set_enable);
 847
 848static struct attribute *bq24257_charger_attr[] = {
 849        &dev_attr_ovp_voltage.attr,
 850        &dev_attr_in_dpm_voltage.attr,
 851        &dev_attr_high_impedance_enable.attr,
 852        &dev_attr_sysoff_enable.attr,
 853        NULL,
 854};
 855
 856static const struct attribute_group bq24257_attr_group = {
 857        .attrs = bq24257_charger_attr,
 858};
 859
 860static int bq24257_power_supply_init(struct bq24257_device *bq)
 861{
 862        struct power_supply_config psy_cfg = { .drv_data = bq, };
 863
 864        psy_cfg.supplied_to = bq24257_charger_supplied_to;
 865        psy_cfg.num_supplicants = ARRAY_SIZE(bq24257_charger_supplied_to);
 866
 867        bq->charger = devm_power_supply_register(bq->dev,
 868                                                 &bq24257_power_supply_desc,
 869                                                 &psy_cfg);
 870
 871        return PTR_ERR_OR_ZERO(bq->charger);
 872}
 873
 874static void bq24257_pg_gpio_probe(struct bq24257_device *bq)
 875{
 876        bq->pg = devm_gpiod_get_optional(bq->dev, BQ24257_PG_GPIO, GPIOD_IN);
 877
 878        if (PTR_ERR(bq->pg) == -EPROBE_DEFER) {
 879                dev_info(bq->dev, "probe retry requested for PG pin\n");
 880                return;
 881        } else if (IS_ERR(bq->pg)) {
 882                dev_err(bq->dev, "error probing PG pin\n");
 883                bq->pg = NULL;
 884                return;
 885        }
 886
 887        if (bq->pg)
 888                dev_dbg(bq->dev, "probed PG pin = %d\n", desc_to_gpio(bq->pg));
 889}
 890
 891static int bq24257_fw_probe(struct bq24257_device *bq)
 892{
 893        int ret;
 894        u32 property;
 895
 896        /* Required properties */
 897        ret = device_property_read_u32(bq->dev, "ti,charge-current", &property);
 898        if (ret < 0)
 899                return ret;
 900
 901        bq->init_data.ichg = bq24257_find_idx(property, bq24257_ichg_map,
 902                                              BQ24257_ICHG_MAP_SIZE);
 903
 904        ret = device_property_read_u32(bq->dev, "ti,battery-regulation-voltage",
 905                                       &property);
 906        if (ret < 0)
 907                return ret;
 908
 909        bq->init_data.vbat = bq24257_find_idx(property, bq24257_vbat_map,
 910                                              BQ24257_VBAT_MAP_SIZE);
 911
 912        ret = device_property_read_u32(bq->dev, "ti,termination-current",
 913                                       &property);
 914        if (ret < 0)
 915                return ret;
 916
 917        bq->init_data.iterm = bq24257_find_idx(property, bq24257_iterm_map,
 918                                               BQ24257_ITERM_MAP_SIZE);
 919
 920        /* Optional properties. If not provided use reasonable default. */
 921        ret = device_property_read_u32(bq->dev, "ti,current-limit",
 922                                       &property);
 923        if (ret < 0) {
 924                bq->iilimit_autoset_enable = true;
 925
 926                /*
 927                 * Explicitly set a default value which will be needed for
 928                 * devices that don't support the automatic setting of the input
 929                 * current limit through the charger type detection mechanism.
 930                 */
 931                bq->init_data.iilimit = IILIMIT_500;
 932        } else
 933                bq->init_data.iilimit =
 934                                bq24257_find_idx(property,
 935                                                 bq24257_iilimit_map,
 936                                                 BQ24257_IILIMIT_MAP_SIZE);
 937
 938        ret = device_property_read_u32(bq->dev, "ti,ovp-voltage",
 939                                       &property);
 940        if (ret < 0)
 941                bq->init_data.vovp = VOVP_6500;
 942        else
 943                bq->init_data.vovp = bq24257_find_idx(property,
 944                                                      bq24257_vovp_map,
 945                                                      BQ24257_VOVP_MAP_SIZE);
 946
 947        ret = device_property_read_u32(bq->dev, "ti,in-dpm-voltage",
 948                                       &property);
 949        if (ret < 0)
 950                bq->init_data.vindpm = VINDPM_4360;
 951        else
 952                bq->init_data.vindpm =
 953                                bq24257_find_idx(property,
 954                                                 bq24257_vindpm_map,
 955                                                 BQ24257_VINDPM_MAP_SIZE);
 956
 957        return 0;
 958}
 959
 960static int bq24257_probe(struct i2c_client *client,
 961                         const struct i2c_device_id *id)
 962{
 963        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
 964        struct device *dev = &client->dev;
 965        const struct acpi_device_id *acpi_id;
 966        struct bq24257_device *bq;
 967        int ret;
 968        int i;
 969
 970        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
 971                dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
 972                return -ENODEV;
 973        }
 974
 975        bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL);
 976        if (!bq)
 977                return -ENOMEM;
 978
 979        bq->client = client;
 980        bq->dev = dev;
 981
 982        if (ACPI_HANDLE(dev)) {
 983                acpi_id = acpi_match_device(dev->driver->acpi_match_table,
 984                                            &client->dev);
 985                if (!acpi_id) {
 986                        dev_err(dev, "Failed to match ACPI device\n");
 987                        return -ENODEV;
 988                }
 989                bq->chip = (enum bq2425x_chip)acpi_id->driver_data;
 990        } else {
 991                bq->chip = (enum bq2425x_chip)id->driver_data;
 992        }
 993
 994        mutex_init(&bq->lock);
 995
 996        bq->rmap = devm_regmap_init_i2c(client, &bq24257_regmap_config);
 997        if (IS_ERR(bq->rmap)) {
 998                dev_err(dev, "failed to allocate register map\n");
 999                return PTR_ERR(bq->rmap);
1000        }
1001
1002        for (i = 0; i < ARRAY_SIZE(bq24257_reg_fields); i++) {
1003                const struct reg_field *reg_fields = bq24257_reg_fields;
1004
1005                bq->rmap_fields[i] = devm_regmap_field_alloc(dev, bq->rmap,
1006                                                             reg_fields[i]);
1007                if (IS_ERR(bq->rmap_fields[i])) {
1008                        dev_err(dev, "cannot allocate regmap field\n");
1009                        return PTR_ERR(bq->rmap_fields[i]);
1010                }
1011        }
1012
1013        i2c_set_clientdata(client, bq);
1014
1015        if (!dev->platform_data) {
1016                ret = bq24257_fw_probe(bq);
1017                if (ret < 0) {
1018                        dev_err(dev, "Cannot read device properties.\n");
1019                        return ret;
1020                }
1021        } else {
1022                return -ENODEV;
1023        }
1024
1025        /*
1026         * The BQ24250 doesn't support the D+/D- based charger type detection
1027         * used for the automatic setting of the input current limit setting so
1028         * explicitly disable that feature.
1029         */
1030        if (bq->chip == BQ24250)
1031                bq->iilimit_autoset_enable = false;
1032
1033        if (bq->iilimit_autoset_enable)
1034                INIT_DELAYED_WORK(&bq->iilimit_setup_work,
1035                                  bq24257_iilimit_setup_work);
1036
1037        /*
1038         * The BQ24250 doesn't have a dedicated Power Good (PG) pin so let's
1039         * not probe for it and instead use a SW-based approach to determine
1040         * the PG state. We also use a SW-based approach for all other devices
1041         * if the PG pin is either not defined or can't be probed.
1042         */
1043        if (bq->chip != BQ24250)
1044                bq24257_pg_gpio_probe(bq);
1045
1046        if (PTR_ERR(bq->pg) == -EPROBE_DEFER)
1047                return PTR_ERR(bq->pg);
1048        else if (!bq->pg)
1049                dev_info(bq->dev, "using SW-based power-good detection\n");
1050
1051        /* reset all registers to defaults */
1052        ret = bq24257_field_write(bq, F_RESET, 1);
1053        if (ret < 0)
1054                return ret;
1055
1056        /*
1057         * Put the RESET bit back to 0, in cache. For some reason the HW always
1058         * returns 1 on this bit, so this is the only way to avoid resetting the
1059         * chip every time we update another field in this register.
1060         */
1061        ret = bq24257_field_write(bq, F_RESET, 0);
1062        if (ret < 0)
1063                return ret;
1064
1065        ret = bq24257_hw_init(bq);
1066        if (ret < 0) {
1067                dev_err(dev, "Cannot initialize the chip.\n");
1068                return ret;
1069        }
1070
1071        ret = bq24257_power_supply_init(bq);
1072        if (ret < 0) {
1073                dev_err(dev, "Failed to register power supply\n");
1074                return ret;
1075        }
1076
1077        ret = devm_request_threaded_irq(dev, client->irq, NULL,
1078                                        bq24257_irq_handler_thread,
1079                                        IRQF_TRIGGER_FALLING |
1080                                        IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1081                                        bq2425x_chip_name[bq->chip], bq);
1082        if (ret) {
1083                dev_err(dev, "Failed to request IRQ #%d\n", client->irq);
1084                return ret;
1085        }
1086
1087        ret = sysfs_create_group(&bq->charger->dev.kobj, &bq24257_attr_group);
1088        if (ret < 0) {
1089                dev_err(dev, "Can't create sysfs entries\n");
1090                return ret;
1091        }
1092
1093        return 0;
1094}
1095
1096static int bq24257_remove(struct i2c_client *client)
1097{
1098        struct bq24257_device *bq = i2c_get_clientdata(client);
1099
1100        if (bq->iilimit_autoset_enable)
1101                cancel_delayed_work_sync(&bq->iilimit_setup_work);
1102
1103        sysfs_remove_group(&bq->charger->dev.kobj, &bq24257_attr_group);
1104
1105        bq24257_field_write(bq, F_RESET, 1); /* reset to defaults */
1106
1107        return 0;
1108}
1109
1110#ifdef CONFIG_PM_SLEEP
1111static int bq24257_suspend(struct device *dev)
1112{
1113        struct bq24257_device *bq = dev_get_drvdata(dev);
1114        int ret = 0;
1115
1116        if (bq->iilimit_autoset_enable)
1117                cancel_delayed_work_sync(&bq->iilimit_setup_work);
1118
1119        /* reset all registers to default (and activate standalone mode) */
1120        ret = bq24257_field_write(bq, F_RESET, 1);
1121        if (ret < 0)
1122                dev_err(bq->dev, "Cannot reset chip to standalone mode.\n");
1123
1124        return ret;
1125}
1126
1127static int bq24257_resume(struct device *dev)
1128{
1129        int ret;
1130        struct bq24257_device *bq = dev_get_drvdata(dev);
1131
1132        ret = regcache_drop_region(bq->rmap, BQ24257_REG_1, BQ24257_REG_7);
1133        if (ret < 0)
1134                return ret;
1135
1136        ret = bq24257_field_write(bq, F_RESET, 0);
1137        if (ret < 0)
1138                return ret;
1139
1140        ret = bq24257_hw_init(bq);
1141        if (ret < 0) {
1142                dev_err(bq->dev, "Cannot init chip after resume.\n");
1143                return ret;
1144        }
1145
1146        /* signal userspace, maybe state changed while suspended */
1147        power_supply_changed(bq->charger);
1148
1149        return 0;
1150}
1151#endif
1152
1153static const struct dev_pm_ops bq24257_pm = {
1154        SET_SYSTEM_SLEEP_PM_OPS(bq24257_suspend, bq24257_resume)
1155};
1156
1157static const struct i2c_device_id bq24257_i2c_ids[] = {
1158        { "bq24250", BQ24250 },
1159        { "bq24251", BQ24251 },
1160        { "bq24257", BQ24257 },
1161        {},
1162};
1163MODULE_DEVICE_TABLE(i2c, bq24257_i2c_ids);
1164
1165static const struct of_device_id bq24257_of_match[] = {
1166        { .compatible = "ti,bq24250", },
1167        { .compatible = "ti,bq24251", },
1168        { .compatible = "ti,bq24257", },
1169        { },
1170};
1171MODULE_DEVICE_TABLE(of, bq24257_of_match);
1172
1173static const struct acpi_device_id bq24257_acpi_match[] = {
1174        { "BQ242500", BQ24250 },
1175        { "BQ242510", BQ24251 },
1176        { "BQ242570", BQ24257 },
1177        {},
1178};
1179MODULE_DEVICE_TABLE(acpi, bq24257_acpi_match);
1180
1181static struct i2c_driver bq24257_driver = {
1182        .driver = {
1183                .name = "bq24257-charger",
1184                .of_match_table = of_match_ptr(bq24257_of_match),
1185                .acpi_match_table = ACPI_PTR(bq24257_acpi_match),
1186                .pm = &bq24257_pm,
1187        },
1188        .probe = bq24257_probe,
1189        .remove = bq24257_remove,
1190        .id_table = bq24257_i2c_ids,
1191};
1192module_i2c_driver(bq24257_driver);
1193
1194MODULE_AUTHOR("Laurentiu Palcu <laurentiu.palcu@intel.com>");
1195MODULE_DESCRIPTION("bq24257 charger driver");
1196MODULE_LICENSE("GPL");
1197