linux/drivers/power/supply/cpcap-battery.c
<<
>>
Prefs
   1/*
   2 * Battery driver for CPCAP PMIC
   3 *
   4 * Copyright (C) 2017 Tony Lindgren <tony@atomide.com>
   5 *
   6 * Some parts of the code based on earlier Motorola mapphone Linux kernel
   7 * drivers:
   8 *
   9 * Copyright (C) 2009-2010 Motorola, Inc.
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License version 2 as
  13 * published by the Free Software Foundation.
  14
  15 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  16 * kind, whether express or implied; without even the implied warranty
  17 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 */
  20
  21#include <linux/delay.h>
  22#include <linux/err.h>
  23#include <linux/interrupt.h>
  24#include <linux/kernel.h>
  25#include <linux/module.h>
  26#include <linux/of_device.h>
  27#include <linux/platform_device.h>
  28#include <linux/power_supply.h>
  29#include <linux/reboot.h>
  30#include <linux/regmap.h>
  31#include <linux/moduleparam.h>
  32
  33#include <linux/iio/consumer.h>
  34#include <linux/iio/types.h>
  35#include <linux/mfd/motorola-cpcap.h>
  36
  37/*
  38 * Register bit defines for CPCAP_REG_BPEOL. Some of these seem to
  39 * map to MC13783UG.pdf "Table 5-19. Register 13, Power Control 0"
  40 * to enable BATTDETEN, LOBAT and EOL features. We currently use
  41 * LOBAT interrupts instead of EOL.
  42 */
  43#define CPCAP_REG_BPEOL_BIT_EOL9        BIT(9)  /* Set for EOL irq */
  44#define CPCAP_REG_BPEOL_BIT_EOL8        BIT(8)  /* Set for EOL irq */
  45#define CPCAP_REG_BPEOL_BIT_UNKNOWN7    BIT(7)
  46#define CPCAP_REG_BPEOL_BIT_UNKNOWN6    BIT(6)
  47#define CPCAP_REG_BPEOL_BIT_UNKNOWN5    BIT(5)
  48#define CPCAP_REG_BPEOL_BIT_EOL_MULTI   BIT(4)  /* Set for multiple EOL irqs */
  49#define CPCAP_REG_BPEOL_BIT_UNKNOWN3    BIT(3)
  50#define CPCAP_REG_BPEOL_BIT_UNKNOWN2    BIT(2)
  51#define CPCAP_REG_BPEOL_BIT_BATTDETEN   BIT(1)  /* Enable battery detect */
  52#define CPCAP_REG_BPEOL_BIT_EOLSEL      BIT(0)  /* BPDET = 0, EOL = 1 */
  53
  54/*
  55 * Register bit defines for CPCAP_REG_CCC1. These seem similar to the twl6030
  56 * coulomb counter registers rather than the mc13892 registers. Both twl6030
  57 * and mc13892 set bits 2 and 1 to reset and clear registers. But mc13892
  58 * sets bit 0 to start the coulomb counter while twl6030 sets bit 0 to stop
  59 * the coulomb counter like cpcap does. So for now, we use the twl6030 style
  60 * naming for the registers.
  61 */
  62#define CPCAP_REG_CCC1_ACTIVE_MODE1     BIT(4)  /* Update rate */
  63#define CPCAP_REG_CCC1_ACTIVE_MODE0     BIT(3)  /* Update rate */
  64#define CPCAP_REG_CCC1_AUTOCLEAR        BIT(2)  /* Resets sample registers */
  65#define CPCAP_REG_CCC1_CAL_EN           BIT(1)  /* Clears after write in 1s */
  66#define CPCAP_REG_CCC1_PAUSE            BIT(0)  /* Stop counters, allow write */
  67#define CPCAP_REG_CCC1_RESET_MASK       (CPCAP_REG_CCC1_AUTOCLEAR | \
  68                                         CPCAP_REG_CCC1_CAL_EN)
  69
  70#define CPCAP_REG_CCCC2_RATE1           BIT(5)
  71#define CPCAP_REG_CCCC2_RATE0           BIT(4)
  72#define CPCAP_REG_CCCC2_ENABLE          BIT(3)
  73
  74#define CPCAP_BATTERY_CC_SAMPLE_PERIOD_MS       250
  75
  76enum {
  77        CPCAP_BATTERY_IIO_BATTDET,
  78        CPCAP_BATTERY_IIO_VOLTAGE,
  79        CPCAP_BATTERY_IIO_CHRG_CURRENT,
  80        CPCAP_BATTERY_IIO_BATT_CURRENT,
  81        CPCAP_BATTERY_IIO_NR,
  82};
  83
  84enum cpcap_battery_irq_action {
  85        CPCAP_BATTERY_IRQ_ACTION_NONE,
  86        CPCAP_BATTERY_IRQ_ACTION_CC_CAL_DONE,
  87        CPCAP_BATTERY_IRQ_ACTION_BATTERY_LOW,
  88        CPCAP_BATTERY_IRQ_ACTION_POWEROFF,
  89};
  90
  91struct cpcap_interrupt_desc {
  92        const char *name;
  93        struct list_head node;
  94        int irq;
  95        enum cpcap_battery_irq_action action;
  96};
  97
  98struct cpcap_battery_config {
  99        int cd_factor;
 100        struct power_supply_info info;
 101        struct power_supply_battery_info bat;
 102};
 103
 104struct cpcap_coulomb_counter_data {
 105        s32 sample;             /* 24 or 32 bits */
 106        s32 accumulator;
 107        s16 offset;             /* 9 bits */
 108        s16 integrator;         /* 13 or 16 bits */
 109};
 110
 111enum cpcap_battery_state {
 112        CPCAP_BATTERY_STATE_PREVIOUS,
 113        CPCAP_BATTERY_STATE_LATEST,
 114        CPCAP_BATTERY_STATE_EMPTY,
 115        CPCAP_BATTERY_STATE_FULL,
 116        CPCAP_BATTERY_STATE_NR,
 117};
 118
 119struct cpcap_battery_state_data {
 120        int voltage;
 121        int current_ua;
 122        int counter_uah;
 123        int temperature;
 124        ktime_t time;
 125        struct cpcap_coulomb_counter_data cc;
 126};
 127
 128struct cpcap_battery_ddata {
 129        struct device *dev;
 130        struct regmap *reg;
 131        struct list_head irq_list;
 132        struct iio_channel *channels[CPCAP_BATTERY_IIO_NR];
 133        struct power_supply *psy;
 134        struct cpcap_battery_config config;
 135        struct cpcap_battery_state_data state[CPCAP_BATTERY_STATE_NR];
 136        u32 cc_lsb;             /* μAms per LSB */
 137        atomic_t active;
 138        int charge_full;
 139        int status;
 140        u16 vendor;
 141        unsigned int is_full:1;
 142};
 143
 144#define CPCAP_NO_BATTERY        -400
 145
 146static bool ignore_temperature_probe;
 147module_param(ignore_temperature_probe, bool, 0660);
 148
 149static struct cpcap_battery_state_data *
 150cpcap_battery_get_state(struct cpcap_battery_ddata *ddata,
 151                        enum cpcap_battery_state state)
 152{
 153        if (state >= CPCAP_BATTERY_STATE_NR)
 154                return NULL;
 155
 156        return &ddata->state[state];
 157}
 158
 159static struct cpcap_battery_state_data *
 160cpcap_battery_latest(struct cpcap_battery_ddata *ddata)
 161{
 162        return cpcap_battery_get_state(ddata, CPCAP_BATTERY_STATE_LATEST);
 163}
 164
 165static struct cpcap_battery_state_data *
 166cpcap_battery_previous(struct cpcap_battery_ddata *ddata)
 167{
 168        return cpcap_battery_get_state(ddata, CPCAP_BATTERY_STATE_PREVIOUS);
 169}
 170
 171static struct cpcap_battery_state_data *
 172cpcap_battery_get_empty(struct cpcap_battery_ddata *ddata)
 173{
 174        return cpcap_battery_get_state(ddata, CPCAP_BATTERY_STATE_EMPTY);
 175}
 176
 177static struct cpcap_battery_state_data *
 178cpcap_battery_get_full(struct cpcap_battery_ddata *ddata)
 179{
 180        return cpcap_battery_get_state(ddata, CPCAP_BATTERY_STATE_FULL);
 181}
 182
 183static int cpcap_charger_battery_temperature(struct cpcap_battery_ddata *ddata,
 184                                             int *value)
 185{
 186        struct iio_channel *channel;
 187        int error;
 188
 189        channel = ddata->channels[CPCAP_BATTERY_IIO_BATTDET];
 190        error = iio_read_channel_processed(channel, value);
 191        if (error < 0) {
 192                if (!ignore_temperature_probe)
 193                        dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
 194                *value = CPCAP_NO_BATTERY;
 195
 196                return error;
 197        }
 198
 199        *value /= 100;
 200
 201        return 0;
 202}
 203
 204static int cpcap_battery_get_voltage(struct cpcap_battery_ddata *ddata)
 205{
 206        struct iio_channel *channel;
 207        int error, value = 0;
 208
 209        channel = ddata->channels[CPCAP_BATTERY_IIO_VOLTAGE];
 210        error = iio_read_channel_processed(channel, &value);
 211        if (error < 0) {
 212                dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
 213
 214                return 0;
 215        }
 216
 217        return value * 1000;
 218}
 219
 220static int cpcap_battery_get_current(struct cpcap_battery_ddata *ddata)
 221{
 222        struct iio_channel *channel;
 223        int error, value = 0;
 224
 225        channel = ddata->channels[CPCAP_BATTERY_IIO_BATT_CURRENT];
 226        error = iio_read_channel_processed(channel, &value);
 227        if (error < 0) {
 228                dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
 229
 230                return 0;
 231        }
 232
 233        return value * 1000;
 234}
 235
 236/**
 237 * cpcap_battery_cc_raw_div - calculate and divide coulomb counter μAms values
 238 * @ddata: device driver data
 239 * @sample: coulomb counter sample value
 240 * @accumulator: coulomb counter integrator value
 241 * @offset: coulomb counter offset value
 242 * @divider: conversion divider
 243 *
 244 * Note that cc_lsb and cc_dur values are from Motorola Linux kernel
 245 * function data_get_avg_curr_ua() and seem to be based on measured test
 246 * results. It also has the following comment:
 247 *
 248 * Adjustment factors are applied here as a temp solution per the test
 249 * results. Need to work out a formal solution for this adjustment.
 250 *
 251 * A coulomb counter for similar hardware seems to be documented in
 252 * "TWL6030 Gas Gauging Basics (Rev. A)" swca095a.pdf in chapter
 253 * "10 Calculating Accumulated Current". We however follow what the
 254 * Motorola mapphone Linux kernel is doing as there may be either a
 255 * TI or ST coulomb counter in the PMIC.
 256 */
 257static int cpcap_battery_cc_raw_div(struct cpcap_battery_ddata *ddata,
 258                                    s32 sample, s32 accumulator,
 259                                    s16 offset, u32 divider)
 260{
 261        s64 acc;
 262
 263        if (!divider)
 264                return 0;
 265
 266        acc = accumulator;
 267        acc -= (s64)sample * offset;
 268        acc *= ddata->cc_lsb;
 269        acc *= -1;
 270        acc = div_s64(acc, divider);
 271
 272        return acc;
 273}
 274
 275/* 3600000μAms = 1μAh */
 276static int cpcap_battery_cc_to_uah(struct cpcap_battery_ddata *ddata,
 277                                   s32 sample, s32 accumulator,
 278                                   s16 offset)
 279{
 280        return cpcap_battery_cc_raw_div(ddata, sample,
 281                                        accumulator, offset,
 282                                        3600000);
 283}
 284
 285static int cpcap_battery_cc_to_ua(struct cpcap_battery_ddata *ddata,
 286                                  s32 sample, s32 accumulator,
 287                                  s16 offset)
 288{
 289        return cpcap_battery_cc_raw_div(ddata, sample,
 290                                        accumulator, offset,
 291                                        sample *
 292                                        CPCAP_BATTERY_CC_SAMPLE_PERIOD_MS);
 293}
 294
 295/**
 296 * cpcap_battery_read_accumulated - reads cpcap coulomb counter
 297 * @ddata: device driver data
 298 * @ccd: coulomb counter values
 299 *
 300 * Based on Motorola mapphone kernel function data_read_regs().
 301 * Looking at the registers, the coulomb counter seems similar to
 302 * the coulomb counter in TWL6030. See "TWL6030 Gas Gauging Basics
 303 * (Rev. A) swca095a.pdf for "10 Calculating Accumulated Current".
 304 *
 305 * Note that swca095a.pdf instructs to stop the coulomb counter
 306 * before reading to avoid values changing. Motorola mapphone
 307 * Linux kernel does not do it, so let's assume they've verified
 308 * the data produced is correct.
 309 */
 310static int
 311cpcap_battery_read_accumulated(struct cpcap_battery_ddata *ddata,
 312                               struct cpcap_coulomb_counter_data *ccd)
 313{
 314        u16 buf[7];     /* CPCAP_REG_CCS1 to CCI */
 315        int error;
 316
 317        ccd->sample = 0;
 318        ccd->accumulator = 0;
 319        ccd->offset = 0;
 320        ccd->integrator = 0;
 321
 322        /* Read coulomb counter register range */
 323        error = regmap_bulk_read(ddata->reg, CPCAP_REG_CCS1,
 324                                 buf, ARRAY_SIZE(buf));
 325        if (error)
 326                return 0;
 327
 328        /* Sample value CPCAP_REG_CCS1 & 2 */
 329        ccd->sample = (buf[1] & 0x0fff) << 16;
 330        ccd->sample |= buf[0];
 331        if (ddata->vendor == CPCAP_VENDOR_TI)
 332                ccd->sample = sign_extend32(24, ccd->sample);
 333
 334        /* Accumulator value CPCAP_REG_CCA1 & 2 */
 335        ccd->accumulator = ((s16)buf[3]) << 16;
 336        ccd->accumulator |= buf[2];
 337
 338        /*
 339         * Coulomb counter calibration offset is CPCAP_REG_CCM,
 340         * REG_CCO seems unused
 341         */
 342        ccd->offset = buf[4];
 343        ccd->offset = sign_extend32(ccd->offset, 9);
 344
 345        /* Integrator register CPCAP_REG_CCI */
 346        if (ddata->vendor == CPCAP_VENDOR_TI)
 347                ccd->integrator = sign_extend32(buf[6], 13);
 348        else
 349                ccd->integrator = (s16)buf[6];
 350
 351        return cpcap_battery_cc_to_uah(ddata,
 352                                       ccd->sample,
 353                                       ccd->accumulator,
 354                                       ccd->offset);
 355}
 356
 357/**
 358 * cpcap_battery_cc_get_avg_current - read cpcap coulumb counter
 359 * @ddata: cpcap battery driver device data
 360 */
 361static int cpcap_battery_cc_get_avg_current(struct cpcap_battery_ddata *ddata)
 362{
 363        int value, acc, error;
 364        s32 sample;
 365        s16 offset;
 366
 367        /* Coulomb counter integrator */
 368        error = regmap_read(ddata->reg, CPCAP_REG_CCI, &value);
 369        if (error)
 370                return error;
 371
 372        if (ddata->vendor == CPCAP_VENDOR_TI) {
 373                acc = sign_extend32(value, 13);
 374                sample = 1;
 375        } else {
 376                acc = (s16)value;
 377                sample = 4;
 378        }
 379
 380        /* Coulomb counter calibration offset  */
 381        error = regmap_read(ddata->reg, CPCAP_REG_CCM, &value);
 382        if (error)
 383                return error;
 384
 385        offset = sign_extend32(value, 9);
 386
 387        return cpcap_battery_cc_to_ua(ddata, sample, acc, offset);
 388}
 389
 390static int cpcap_battery_get_charger_status(struct cpcap_battery_ddata *ddata,
 391                                            int *val)
 392{
 393        union power_supply_propval prop;
 394        struct power_supply *charger;
 395        int error;
 396
 397        charger = power_supply_get_by_name("usb");
 398        if (!charger)
 399                return -ENODEV;
 400
 401        error = power_supply_get_property(charger, POWER_SUPPLY_PROP_STATUS,
 402                                          &prop);
 403        if (error)
 404                *val = POWER_SUPPLY_STATUS_UNKNOWN;
 405        else
 406                *val = prop.intval;
 407
 408        power_supply_put(charger);
 409
 410        return error;
 411}
 412
 413static bool cpcap_battery_full(struct cpcap_battery_ddata *ddata)
 414{
 415        struct cpcap_battery_state_data *state = cpcap_battery_latest(ddata);
 416        unsigned int vfull;
 417        int error, val;
 418
 419        error = cpcap_battery_get_charger_status(ddata, &val);
 420        if (!error) {
 421                switch (val) {
 422                case POWER_SUPPLY_STATUS_DISCHARGING:
 423                        dev_dbg(ddata->dev, "charger disconnected\n");
 424                        ddata->is_full = 0;
 425                        break;
 426                case POWER_SUPPLY_STATUS_FULL:
 427                        dev_dbg(ddata->dev, "charger full status\n");
 428                        ddata->is_full = 1;
 429                        break;
 430                default:
 431                        break;
 432                }
 433        }
 434
 435        /*
 436         * The full battery voltage here can be inaccurate, it's used just to
 437         * filter out any trickle charging events. We clear the is_full status
 438         * on charger disconnect above anyways.
 439         */
 440        vfull = ddata->config.bat.constant_charge_voltage_max_uv - 120000;
 441
 442        if (ddata->is_full && state->voltage < vfull)
 443                ddata->is_full = 0;
 444
 445        return ddata->is_full;
 446}
 447
 448static bool cpcap_battery_low(struct cpcap_battery_ddata *ddata)
 449{
 450        struct cpcap_battery_state_data *state = cpcap_battery_latest(ddata);
 451        static bool is_low;
 452
 453        if (state->current_ua > 0 && (state->voltage <= 3350000 || is_low))
 454                is_low = true;
 455        else
 456                is_low = false;
 457
 458        return is_low;
 459}
 460
 461static int cpcap_battery_update_status(struct cpcap_battery_ddata *ddata)
 462{
 463        struct cpcap_battery_state_data state, *latest, *previous,
 464                                        *empty, *full;
 465        ktime_t now;
 466        int error;
 467
 468        memset(&state, 0, sizeof(state));
 469        now = ktime_get();
 470
 471        latest = cpcap_battery_latest(ddata);
 472        if (latest) {
 473                s64 delta_ms = ktime_to_ms(ktime_sub(now, latest->time));
 474
 475                if (delta_ms < CPCAP_BATTERY_CC_SAMPLE_PERIOD_MS)
 476                        return delta_ms;
 477        }
 478
 479        state.time = now;
 480        state.voltage = cpcap_battery_get_voltage(ddata);
 481        state.current_ua = cpcap_battery_get_current(ddata);
 482        state.counter_uah = cpcap_battery_read_accumulated(ddata, &state.cc);
 483
 484        error = cpcap_charger_battery_temperature(ddata,
 485                                                  &state.temperature);
 486        if (error)
 487                return error;
 488
 489        previous = cpcap_battery_previous(ddata);
 490        memcpy(previous, latest, sizeof(*previous));
 491        memcpy(latest, &state, sizeof(*latest));
 492
 493        if (cpcap_battery_full(ddata)) {
 494                full = cpcap_battery_get_full(ddata);
 495                memcpy(full, latest, sizeof(*full));
 496
 497                empty = cpcap_battery_get_empty(ddata);
 498                if (empty->voltage && empty->voltage != -1) {
 499                        empty->voltage = -1;
 500                        ddata->charge_full =
 501                                empty->counter_uah - full->counter_uah;
 502                } else if (ddata->charge_full) {
 503                        empty->voltage = -1;
 504                        empty->counter_uah =
 505                                full->counter_uah + ddata->charge_full;
 506                }
 507        } else if (cpcap_battery_low(ddata)) {
 508                empty = cpcap_battery_get_empty(ddata);
 509                memcpy(empty, latest, sizeof(*empty));
 510
 511                full = cpcap_battery_get_full(ddata);
 512                if (full->voltage) {
 513                        full->voltage = 0;
 514                        ddata->charge_full =
 515                                empty->counter_uah - full->counter_uah;
 516                }
 517        }
 518
 519        return 0;
 520}
 521
 522/*
 523 * Update battery status when cpcap-charger calls power_supply_changed().
 524 * This allows us to detect battery full condition before the charger
 525 * disconnects.
 526 */
 527static void cpcap_battery_external_power_changed(struct power_supply *psy)
 528{
 529        union power_supply_propval prop;
 530
 531        power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &prop);
 532}
 533
 534static enum power_supply_property cpcap_battery_props[] = {
 535        POWER_SUPPLY_PROP_STATUS,
 536        POWER_SUPPLY_PROP_PRESENT,
 537        POWER_SUPPLY_PROP_TECHNOLOGY,
 538        POWER_SUPPLY_PROP_VOLTAGE_NOW,
 539        POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
 540        POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
 541        POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
 542        POWER_SUPPLY_PROP_CURRENT_AVG,
 543        POWER_SUPPLY_PROP_CURRENT_NOW,
 544        POWER_SUPPLY_PROP_CHARGE_FULL,
 545        POWER_SUPPLY_PROP_CHARGE_NOW,
 546        POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
 547        POWER_SUPPLY_PROP_CHARGE_COUNTER,
 548        POWER_SUPPLY_PROP_POWER_NOW,
 549        POWER_SUPPLY_PROP_POWER_AVG,
 550        POWER_SUPPLY_PROP_CAPACITY,
 551        POWER_SUPPLY_PROP_CAPACITY_LEVEL,
 552        POWER_SUPPLY_PROP_SCOPE,
 553        POWER_SUPPLY_PROP_TEMP,
 554};
 555
 556static int cpcap_battery_get_property(struct power_supply *psy,
 557                                      enum power_supply_property psp,
 558                                      union power_supply_propval *val)
 559{
 560        struct cpcap_battery_ddata *ddata = power_supply_get_drvdata(psy);
 561        struct cpcap_battery_state_data *latest, *previous, *empty;
 562        u32 sample;
 563        s32 accumulator;
 564        int cached;
 565        s64 tmp;
 566
 567        cached = cpcap_battery_update_status(ddata);
 568        if (cached < 0)
 569                return cached;
 570
 571        latest = cpcap_battery_latest(ddata);
 572        previous = cpcap_battery_previous(ddata);
 573
 574        switch (psp) {
 575        case POWER_SUPPLY_PROP_PRESENT:
 576                if (latest->temperature > CPCAP_NO_BATTERY || ignore_temperature_probe)
 577                        val->intval = 1;
 578                else
 579                        val->intval = 0;
 580                break;
 581        case POWER_SUPPLY_PROP_STATUS:
 582                if (cpcap_battery_full(ddata)) {
 583                        val->intval = POWER_SUPPLY_STATUS_FULL;
 584                        break;
 585                }
 586                if (cpcap_battery_cc_get_avg_current(ddata) < 0)
 587                        val->intval = POWER_SUPPLY_STATUS_CHARGING;
 588                else
 589                        val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
 590                break;
 591        case POWER_SUPPLY_PROP_TECHNOLOGY:
 592                val->intval = ddata->config.info.technology;
 593                break;
 594        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
 595                val->intval = cpcap_battery_get_voltage(ddata);
 596                break;
 597        case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
 598                val->intval = ddata->config.info.voltage_max_design;
 599                break;
 600        case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
 601                val->intval = ddata->config.info.voltage_min_design;
 602                break;
 603        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
 604                val->intval = ddata->config.bat.constant_charge_voltage_max_uv;
 605                break;
 606        case POWER_SUPPLY_PROP_CURRENT_AVG:
 607                sample = latest->cc.sample - previous->cc.sample;
 608                if (!sample) {
 609                        val->intval = cpcap_battery_cc_get_avg_current(ddata);
 610                        break;
 611                }
 612                accumulator = latest->cc.accumulator - previous->cc.accumulator;
 613                val->intval = cpcap_battery_cc_to_ua(ddata, sample,
 614                                                     accumulator,
 615                                                     latest->cc.offset);
 616                break;
 617        case POWER_SUPPLY_PROP_CURRENT_NOW:
 618                val->intval = latest->current_ua;
 619                break;
 620        case POWER_SUPPLY_PROP_CHARGE_COUNTER:
 621                val->intval = latest->counter_uah;
 622                break;
 623        case POWER_SUPPLY_PROP_POWER_NOW:
 624                tmp = (latest->voltage / 10000) * latest->current_ua;
 625                val->intval = div64_s64(tmp, 100);
 626                break;
 627        case POWER_SUPPLY_PROP_POWER_AVG:
 628                sample = latest->cc.sample - previous->cc.sample;
 629                if (!sample) {
 630                        tmp = cpcap_battery_cc_get_avg_current(ddata);
 631                        tmp *= (latest->voltage / 10000);
 632                        val->intval = div64_s64(tmp, 100);
 633                        break;
 634                }
 635                accumulator = latest->cc.accumulator - previous->cc.accumulator;
 636                tmp = cpcap_battery_cc_to_ua(ddata, sample, accumulator,
 637                                             latest->cc.offset);
 638                tmp *= ((latest->voltage + previous->voltage) / 20000);
 639                val->intval = div64_s64(tmp, 100);
 640                break;
 641        case POWER_SUPPLY_PROP_CAPACITY:
 642                empty = cpcap_battery_get_empty(ddata);
 643                if (!empty->voltage || !ddata->charge_full)
 644                        return -ENODATA;
 645                /* (ddata->charge_full / 200) is needed for rounding */
 646                val->intval = empty->counter_uah - latest->counter_uah +
 647                        ddata->charge_full / 200;
 648                val->intval = clamp(val->intval, 0, ddata->charge_full);
 649                val->intval = val->intval * 100 / ddata->charge_full;
 650                break;
 651        case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
 652                if (cpcap_battery_full(ddata))
 653                        val->intval = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
 654                else if (latest->voltage >= 3750000)
 655                        val->intval = POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
 656                else if (latest->voltage >= 3300000)
 657                        val->intval = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
 658                else if (latest->voltage > 3100000)
 659                        val->intval = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
 660                else if (latest->voltage <= 3100000)
 661                        val->intval = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
 662                else
 663                        val->intval = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
 664                break;
 665        case POWER_SUPPLY_PROP_CHARGE_NOW:
 666                empty = cpcap_battery_get_empty(ddata);
 667                if (!empty->voltage)
 668                        return -ENODATA;
 669                val->intval = empty->counter_uah - latest->counter_uah;
 670                if (val->intval < 0) {
 671                        /* Assume invalid config if CHARGE_NOW is -20% */
 672                        if (ddata->charge_full && abs(val->intval) > ddata->charge_full/5) {
 673                                empty->voltage = 0;
 674                                ddata->charge_full = 0;
 675                                return -ENODATA;
 676                        }
 677                        val->intval = 0;
 678                } else if (ddata->charge_full && ddata->charge_full < val->intval) {
 679                        /* Assume invalid config if CHARGE_NOW exceeds CHARGE_FULL by 20% */
 680                        if (val->intval > (6*ddata->charge_full)/5) {
 681                                empty->voltage = 0;
 682                                ddata->charge_full = 0;
 683                                return -ENODATA;
 684                        }
 685                        val->intval = ddata->charge_full;
 686                }
 687                break;
 688        case POWER_SUPPLY_PROP_CHARGE_FULL:
 689                if (!ddata->charge_full)
 690                        return -ENODATA;
 691                val->intval = ddata->charge_full;
 692                break;
 693        case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
 694                val->intval = ddata->config.info.charge_full_design;
 695                break;
 696        case POWER_SUPPLY_PROP_SCOPE:
 697                val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
 698                break;
 699        case POWER_SUPPLY_PROP_TEMP:
 700                if (ignore_temperature_probe)
 701                        return -ENODATA;
 702                val->intval = latest->temperature;
 703                break;
 704        default:
 705                return -EINVAL;
 706        }
 707
 708        return 0;
 709}
 710
 711static int cpcap_battery_update_charger(struct cpcap_battery_ddata *ddata,
 712                                        int const_charge_voltage)
 713{
 714        union power_supply_propval prop;
 715        union power_supply_propval val;
 716        struct power_supply *charger;
 717        int error;
 718
 719        charger = power_supply_get_by_name("usb");
 720        if (!charger)
 721                return -ENODEV;
 722
 723        error = power_supply_get_property(charger,
 724                                POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
 725                                &prop);
 726        if (error)
 727                goto out_put;
 728
 729        /* Allow charger const voltage lower than battery const voltage */
 730        if (const_charge_voltage > prop.intval)
 731                goto out_put;
 732
 733        val.intval = const_charge_voltage;
 734
 735        error = power_supply_set_property(charger,
 736                        POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
 737                        &val);
 738out_put:
 739        power_supply_put(charger);
 740
 741        return error;
 742}
 743
 744static int cpcap_battery_set_property(struct power_supply *psy,
 745                                      enum power_supply_property psp,
 746                                      const union power_supply_propval *val)
 747{
 748        struct cpcap_battery_ddata *ddata = power_supply_get_drvdata(psy);
 749
 750        switch (psp) {
 751        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
 752                if (val->intval < ddata->config.info.voltage_min_design)
 753                        return -EINVAL;
 754                if (val->intval > ddata->config.info.voltage_max_design)
 755                        return -EINVAL;
 756
 757                ddata->config.bat.constant_charge_voltage_max_uv = val->intval;
 758
 759                return cpcap_battery_update_charger(ddata, val->intval);
 760        case POWER_SUPPLY_PROP_CHARGE_FULL:
 761                if (val->intval < 0)
 762                        return -EINVAL;
 763                if (val->intval > (6*ddata->config.info.charge_full_design)/5)
 764                        return -EINVAL;
 765
 766                ddata->charge_full = val->intval;
 767
 768                return 0;
 769        default:
 770                return -EINVAL;
 771        }
 772
 773        return 0;
 774}
 775
 776static int cpcap_battery_property_is_writeable(struct power_supply *psy,
 777                                               enum power_supply_property psp)
 778{
 779        switch (psp) {
 780        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
 781        case POWER_SUPPLY_PROP_CHARGE_FULL:
 782                return 1;
 783        default:
 784                return 0;
 785        }
 786}
 787
 788static irqreturn_t cpcap_battery_irq_thread(int irq, void *data)
 789{
 790        struct cpcap_battery_ddata *ddata = data;
 791        struct cpcap_battery_state_data *latest;
 792        struct cpcap_interrupt_desc *d;
 793
 794        if (!atomic_read(&ddata->active))
 795                return IRQ_NONE;
 796
 797        list_for_each_entry(d, &ddata->irq_list, node) {
 798                if (irq == d->irq)
 799                        break;
 800        }
 801
 802        if (list_entry_is_head(d, &ddata->irq_list, node))
 803                return IRQ_NONE;
 804
 805        latest = cpcap_battery_latest(ddata);
 806
 807        switch (d->action) {
 808        case CPCAP_BATTERY_IRQ_ACTION_CC_CAL_DONE:
 809                dev_info(ddata->dev, "Coulomb counter calibration done\n");
 810                break;
 811        case CPCAP_BATTERY_IRQ_ACTION_BATTERY_LOW:
 812                if (latest->current_ua >= 0)
 813                        dev_warn(ddata->dev, "Battery low at %imV!\n",
 814                                latest->voltage / 1000);
 815                break;
 816        case CPCAP_BATTERY_IRQ_ACTION_POWEROFF:
 817                if (latest->current_ua >= 0 && latest->voltage <= 3200000) {
 818                        dev_emerg(ddata->dev,
 819                                  "Battery empty at %imV, powering off\n",
 820                                  latest->voltage / 1000);
 821                        orderly_poweroff(true);
 822                }
 823                break;
 824        default:
 825                break;
 826        }
 827
 828        power_supply_changed(ddata->psy);
 829
 830        return IRQ_HANDLED;
 831}
 832
 833static int cpcap_battery_init_irq(struct platform_device *pdev,
 834                                  struct cpcap_battery_ddata *ddata,
 835                                  const char *name)
 836{
 837        struct cpcap_interrupt_desc *d;
 838        int irq, error;
 839
 840        irq = platform_get_irq_byname(pdev, name);
 841        if (irq < 0)
 842                return irq;
 843
 844        error = devm_request_threaded_irq(ddata->dev, irq, NULL,
 845                                          cpcap_battery_irq_thread,
 846                                          IRQF_SHARED | IRQF_ONESHOT,
 847                                          name, ddata);
 848        if (error) {
 849                dev_err(ddata->dev, "could not get irq %s: %i\n",
 850                        name, error);
 851
 852                return error;
 853        }
 854
 855        d = devm_kzalloc(ddata->dev, sizeof(*d), GFP_KERNEL);
 856        if (!d)
 857                return -ENOMEM;
 858
 859        d->name = name;
 860        d->irq = irq;
 861
 862        if (!strncmp(name, "cccal", 5))
 863                d->action = CPCAP_BATTERY_IRQ_ACTION_CC_CAL_DONE;
 864        else if (!strncmp(name, "lowbph", 6))
 865                d->action = CPCAP_BATTERY_IRQ_ACTION_BATTERY_LOW;
 866        else if (!strncmp(name, "lowbpl", 6))
 867                d->action = CPCAP_BATTERY_IRQ_ACTION_POWEROFF;
 868
 869        list_add(&d->node, &ddata->irq_list);
 870
 871        return 0;
 872}
 873
 874static int cpcap_battery_init_interrupts(struct platform_device *pdev,
 875                                         struct cpcap_battery_ddata *ddata)
 876{
 877        static const char * const cpcap_battery_irqs[] = {
 878                "eol", "lowbph", "lowbpl",
 879                "chrgcurr1", "battdetb"
 880        };
 881        int i, error;
 882
 883        for (i = 0; i < ARRAY_SIZE(cpcap_battery_irqs); i++) {
 884                error = cpcap_battery_init_irq(pdev, ddata,
 885                                               cpcap_battery_irqs[i]);
 886                if (error)
 887                        return error;
 888        }
 889
 890        /* Enable calibration interrupt if already available in dts */
 891        cpcap_battery_init_irq(pdev, ddata, "cccal");
 892
 893        /* Enable low battery interrupts for 3.3V high and 3.1V low */
 894        error = regmap_update_bits(ddata->reg, CPCAP_REG_BPEOL,
 895                                   0xffff,
 896                                   CPCAP_REG_BPEOL_BIT_BATTDETEN);
 897        if (error)
 898                return error;
 899
 900        return 0;
 901}
 902
 903static int cpcap_battery_init_iio(struct cpcap_battery_ddata *ddata)
 904{
 905        const char * const names[CPCAP_BATTERY_IIO_NR] = {
 906                "battdetb", "battp", "chg_isense", "batti",
 907        };
 908        int error, i;
 909
 910        for (i = 0; i < CPCAP_BATTERY_IIO_NR; i++) {
 911                ddata->channels[i] = devm_iio_channel_get(ddata->dev,
 912                                                          names[i]);
 913                if (IS_ERR(ddata->channels[i])) {
 914                        error = PTR_ERR(ddata->channels[i]);
 915                        goto out_err;
 916                }
 917
 918                if (!ddata->channels[i]->indio_dev) {
 919                        error = -ENXIO;
 920                        goto out_err;
 921                }
 922        }
 923
 924        return 0;
 925
 926out_err:
 927        return dev_err_probe(ddata->dev, error,
 928                             "could not initialize VBUS or ID IIO\n");
 929}
 930
 931/* Calibrate coulomb counter */
 932static int cpcap_battery_calibrate(struct cpcap_battery_ddata *ddata)
 933{
 934        int error, ccc1, value;
 935        unsigned long timeout;
 936
 937        error = regmap_read(ddata->reg, CPCAP_REG_CCC1, &ccc1);
 938        if (error)
 939                return error;
 940
 941        timeout = jiffies + msecs_to_jiffies(6000);
 942
 943        /* Start calibration */
 944        error = regmap_update_bits(ddata->reg, CPCAP_REG_CCC1,
 945                                   0xffff,
 946                                   CPCAP_REG_CCC1_CAL_EN);
 947        if (error)
 948                goto restore;
 949
 950        while (time_before(jiffies, timeout)) {
 951                error = regmap_read(ddata->reg, CPCAP_REG_CCC1, &value);
 952                if (error)
 953                        goto restore;
 954
 955                if (!(value & CPCAP_REG_CCC1_CAL_EN))
 956                        break;
 957
 958                error = regmap_read(ddata->reg, CPCAP_REG_CCM, &value);
 959                if (error)
 960                        goto restore;
 961
 962                msleep(300);
 963        }
 964
 965        /* Read calibration offset from CCM */
 966        error = regmap_read(ddata->reg, CPCAP_REG_CCM, &value);
 967        if (error)
 968                goto restore;
 969
 970        dev_info(ddata->dev, "calibration done: 0x%04x\n", value);
 971
 972restore:
 973        if (error)
 974                dev_err(ddata->dev, "%s: error %i\n", __func__, error);
 975
 976        error = regmap_update_bits(ddata->reg, CPCAP_REG_CCC1,
 977                                   0xffff, ccc1);
 978        if (error)
 979                dev_err(ddata->dev, "%s: restore error %i\n",
 980                        __func__, error);
 981
 982        return error;
 983}
 984
 985/*
 986 * Based on the values from Motorola mapphone Linux kernel. In the
 987 * the Motorola mapphone Linux kernel tree the value for pm_cd_factor
 988 * is passed to the kernel via device tree. If it turns out to be
 989 * something device specific we can consider that too later.
 990 *
 991 * And looking at the battery full and shutdown values for the stock
 992 * kernel on droid 4, full is 4351000 and software initiates shutdown
 993 * at 3078000. The device will die around 2743000.
 994 */
 995static const struct cpcap_battery_config cpcap_battery_default_data = {
 996        .cd_factor = 0x3cc,
 997        .info.technology = POWER_SUPPLY_TECHNOLOGY_LION,
 998        .info.voltage_max_design = 4351000,
 999        .info.voltage_min_design = 3100000,
1000        .info.charge_full_design = 1740000,
1001        .bat.constant_charge_voltage_max_uv = 4200000,
1002};
1003
1004#ifdef CONFIG_OF
1005static const struct of_device_id cpcap_battery_id_table[] = {
1006        {
1007                .compatible = "motorola,cpcap-battery",
1008                .data = &cpcap_battery_default_data,
1009        },
1010        {},
1011};
1012MODULE_DEVICE_TABLE(of, cpcap_battery_id_table);
1013#endif
1014
1015static const struct power_supply_desc cpcap_charger_battery_desc = {
1016        .name           = "battery",
1017        .type           = POWER_SUPPLY_TYPE_BATTERY,
1018        .properties     = cpcap_battery_props,
1019        .num_properties = ARRAY_SIZE(cpcap_battery_props),
1020        .get_property   = cpcap_battery_get_property,
1021        .set_property   = cpcap_battery_set_property,
1022        .property_is_writeable = cpcap_battery_property_is_writeable,
1023        .external_power_changed = cpcap_battery_external_power_changed,
1024};
1025
1026static int cpcap_battery_probe(struct platform_device *pdev)
1027{
1028        struct cpcap_battery_ddata *ddata;
1029        const struct of_device_id *match;
1030        struct power_supply_config psy_cfg = {};
1031        int error;
1032
1033        match = of_match_device(of_match_ptr(cpcap_battery_id_table),
1034                                &pdev->dev);
1035        if (!match)
1036                return -EINVAL;
1037
1038        if (!match->data) {
1039                dev_err(&pdev->dev, "no configuration data found\n");
1040
1041                return -ENODEV;
1042        }
1043
1044        ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
1045        if (!ddata)
1046                return -ENOMEM;
1047
1048        INIT_LIST_HEAD(&ddata->irq_list);
1049        ddata->dev = &pdev->dev;
1050        memcpy(&ddata->config, match->data, sizeof(ddata->config));
1051
1052        ddata->reg = dev_get_regmap(ddata->dev->parent, NULL);
1053        if (!ddata->reg)
1054                return -ENODEV;
1055
1056        error = cpcap_get_vendor(ddata->dev, ddata->reg, &ddata->vendor);
1057        if (error)
1058                return error;
1059
1060        switch (ddata->vendor) {
1061        case CPCAP_VENDOR_ST:
1062                ddata->cc_lsb = 95374;  /* μAms per LSB */
1063                break;
1064        case CPCAP_VENDOR_TI:
1065                ddata->cc_lsb = 91501;  /* μAms per LSB */
1066                break;
1067        default:
1068                return -EINVAL;
1069        }
1070        ddata->cc_lsb = (ddata->cc_lsb * ddata->config.cd_factor) / 1000;
1071
1072        platform_set_drvdata(pdev, ddata);
1073
1074        error = cpcap_battery_init_interrupts(pdev, ddata);
1075        if (error)
1076                return error;
1077
1078        error = cpcap_battery_init_iio(ddata);
1079        if (error)
1080                return error;
1081
1082        psy_cfg.of_node = pdev->dev.of_node;
1083        psy_cfg.drv_data = ddata;
1084
1085        ddata->psy = devm_power_supply_register(ddata->dev,
1086                                                &cpcap_charger_battery_desc,
1087                                                &psy_cfg);
1088        error = PTR_ERR_OR_ZERO(ddata->psy);
1089        if (error) {
1090                dev_err(ddata->dev, "failed to register power supply\n");
1091                return error;
1092        }
1093
1094        atomic_set(&ddata->active, 1);
1095
1096        error = cpcap_battery_calibrate(ddata);
1097        if (error)
1098                return error;
1099
1100        return 0;
1101}
1102
1103static int cpcap_battery_remove(struct platform_device *pdev)
1104{
1105        struct cpcap_battery_ddata *ddata = platform_get_drvdata(pdev);
1106        int error;
1107
1108        atomic_set(&ddata->active, 0);
1109        error = regmap_update_bits(ddata->reg, CPCAP_REG_BPEOL,
1110                                   0xffff, 0);
1111        if (error)
1112                dev_err(&pdev->dev, "could not disable: %i\n", error);
1113
1114        return 0;
1115}
1116
1117static struct platform_driver cpcap_battery_driver = {
1118        .driver = {
1119                .name           = "cpcap_battery",
1120                .of_match_table = of_match_ptr(cpcap_battery_id_table),
1121        },
1122        .probe  = cpcap_battery_probe,
1123        .remove = cpcap_battery_remove,
1124};
1125module_platform_driver(cpcap_battery_driver);
1126
1127MODULE_LICENSE("GPL v2");
1128MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
1129MODULE_DESCRIPTION("CPCAP PMIC Battery Driver");
1130