linux/drivers/power/supply/cpcap-charger.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Motorola CPCAP PMIC battery charger driver
   4 *
   5 * Copyright (C) 2017 Tony Lindgren <tony@atomide.com>
   6 *
   7 * Rewritten for Linux power framework with some parts based on
   8 * on earlier driver found in the Motorola Linux kernel:
   9 *
  10 * Copyright (C) 2009-2010 Motorola, Inc.
  11 */
  12
  13#include <linux/atomic.h>
  14#include <linux/init.h>
  15#include <linux/module.h>
  16#include <linux/slab.h>
  17#include <linux/err.h>
  18#include <linux/interrupt.h>
  19#include <linux/notifier.h>
  20#include <linux/of.h>
  21#include <linux/of_platform.h>
  22#include <linux/platform_device.h>
  23#include <linux/power_supply.h>
  24#include <linux/regmap.h>
  25
  26#include <linux/gpio/consumer.h>
  27#include <linux/usb/phy_companion.h>
  28#include <linux/phy/omap_usb.h>
  29#include <linux/usb/otg.h>
  30#include <linux/iio/consumer.h>
  31#include <linux/mfd/motorola-cpcap.h>
  32
  33/*
  34 * CPCAP_REG_CRM register bits. For documentation of somewhat similar hardware,
  35 * see NXP "MC13783 Power Management and Audio Circuit Users's Guide"
  36 * MC13783UG.pdf chapter "8.5 Battery Interface Register Summary". The registers
  37 * and values for CPCAP are different, but some of the internal components seem
  38 * similar. Also see the Motorola Linux kernel cpcap-regbits.h. CPCAP_REG_CHRGR_1
  39 * bits that seem to describe the CRM register.
  40 */
  41#define CPCAP_REG_CRM_UNUSED_641_15     BIT(15) /* 641 = register number */
  42#define CPCAP_REG_CRM_UNUSED_641_14     BIT(14) /* 641 = register number */
  43#define CPCAP_REG_CRM_CHRG_LED_EN       BIT(13) /* Charger LED */
  44#define CPCAP_REG_CRM_RVRSMODE          BIT(12) /* USB VBUS output enable */
  45#define CPCAP_REG_CRM_ICHRG_TR1         BIT(11) /* Trickle charge current */
  46#define CPCAP_REG_CRM_ICHRG_TR0         BIT(10)
  47#define CPCAP_REG_CRM_FET_OVRD          BIT(9)  /* 0 = hardware, 1 = FET_CTRL */
  48#define CPCAP_REG_CRM_FET_CTRL          BIT(8)  /* BPFET 1 if FET_OVRD set */
  49#define CPCAP_REG_CRM_VCHRG3            BIT(7)  /* Charge voltage bits */
  50#define CPCAP_REG_CRM_VCHRG2            BIT(6)
  51#define CPCAP_REG_CRM_VCHRG1            BIT(5)
  52#define CPCAP_REG_CRM_VCHRG0            BIT(4)
  53#define CPCAP_REG_CRM_ICHRG3            BIT(3)  /* Charge current bits */
  54#define CPCAP_REG_CRM_ICHRG2            BIT(2)
  55#define CPCAP_REG_CRM_ICHRG1            BIT(1)
  56#define CPCAP_REG_CRM_ICHRG0            BIT(0)
  57
  58/* CPCAP_REG_CRM trickle charge voltages */
  59#define CPCAP_REG_CRM_TR(val)           (((val) & 0x3) << 10)
  60#define CPCAP_REG_CRM_TR_0A00           CPCAP_REG_CRM_TR(0x0)
  61#define CPCAP_REG_CRM_TR_0A24           CPCAP_REG_CRM_TR(0x1)
  62#define CPCAP_REG_CRM_TR_0A48           CPCAP_REG_CRM_TR(0x2)
  63#define CPCAP_REG_CRM_TR_0A72           CPCAP_REG_CRM_TR(0x4)
  64
  65/*
  66 * CPCAP_REG_CRM charge voltages based on the ADC channel 1 values.
  67 * Note that these register bits don't match MC13783UG.pdf VCHRG
  68 * register bits.
  69 */
  70#define CPCAP_REG_CRM_VCHRG(val)        (((val) & 0xf) << 4)
  71#define CPCAP_REG_CRM_VCHRG_3V80        CPCAP_REG_CRM_VCHRG(0x0)
  72#define CPCAP_REG_CRM_VCHRG_4V10        CPCAP_REG_CRM_VCHRG(0x1)
  73#define CPCAP_REG_CRM_VCHRG_4V12        CPCAP_REG_CRM_VCHRG(0x2)
  74#define CPCAP_REG_CRM_VCHRG_4V15        CPCAP_REG_CRM_VCHRG(0x3)
  75#define CPCAP_REG_CRM_VCHRG_4V17        CPCAP_REG_CRM_VCHRG(0x4)
  76#define CPCAP_REG_CRM_VCHRG_4V20        CPCAP_REG_CRM_VCHRG(0x5)
  77#define CPCAP_REG_CRM_VCHRG_4V23        CPCAP_REG_CRM_VCHRG(0x6)
  78#define CPCAP_REG_CRM_VCHRG_4V25        CPCAP_REG_CRM_VCHRG(0x7)
  79#define CPCAP_REG_CRM_VCHRG_4V27        CPCAP_REG_CRM_VCHRG(0x8)
  80#define CPCAP_REG_CRM_VCHRG_4V30        CPCAP_REG_CRM_VCHRG(0x9)
  81#define CPCAP_REG_CRM_VCHRG_4V33        CPCAP_REG_CRM_VCHRG(0xa)
  82#define CPCAP_REG_CRM_VCHRG_4V35        CPCAP_REG_CRM_VCHRG(0xb)
  83#define CPCAP_REG_CRM_VCHRG_4V38        CPCAP_REG_CRM_VCHRG(0xc)
  84#define CPCAP_REG_CRM_VCHRG_4V40        CPCAP_REG_CRM_VCHRG(0xd)
  85#define CPCAP_REG_CRM_VCHRG_4V42        CPCAP_REG_CRM_VCHRG(0xe)
  86#define CPCAP_REG_CRM_VCHRG_4V44        CPCAP_REG_CRM_VCHRG(0xf)
  87
  88/*
  89 * CPCAP_REG_CRM charge currents. These seem to match MC13783UG.pdf
  90 * values in "Table 8-3. Charge Path Regulator Current Limit
  91 * Characteristics" for the nominal values.
  92 *
  93 * Except 70mA and 1.596A and unlimited, these are simply 88.7mA / step.
  94 */
  95#define CPCAP_REG_CRM_ICHRG(val)        (((val) & 0xf) << 0)
  96#define CPCAP_REG_CRM_ICHRG_0A000       CPCAP_REG_CRM_ICHRG(0x0)
  97#define CPCAP_REG_CRM_ICHRG_0A070       CPCAP_REG_CRM_ICHRG(0x1)
  98#define CPCAP_REG_CRM_ICHRG_0A177       CPCAP_REG_CRM_ICHRG(0x2)
  99#define CPCAP_REG_CRM_ICHRG_0A266       CPCAP_REG_CRM_ICHRG(0x3)
 100#define CPCAP_REG_CRM_ICHRG_0A355       CPCAP_REG_CRM_ICHRG(0x4)
 101#define CPCAP_REG_CRM_ICHRG_0A443       CPCAP_REG_CRM_ICHRG(0x5)
 102#define CPCAP_REG_CRM_ICHRG_0A532       CPCAP_REG_CRM_ICHRG(0x6)
 103#define CPCAP_REG_CRM_ICHRG_0A621       CPCAP_REG_CRM_ICHRG(0x7)
 104#define CPCAP_REG_CRM_ICHRG_0A709       CPCAP_REG_CRM_ICHRG(0x8)
 105#define CPCAP_REG_CRM_ICHRG_0A798       CPCAP_REG_CRM_ICHRG(0x9)
 106#define CPCAP_REG_CRM_ICHRG_0A886       CPCAP_REG_CRM_ICHRG(0xa)
 107#define CPCAP_REG_CRM_ICHRG_0A975       CPCAP_REG_CRM_ICHRG(0xb)
 108#define CPCAP_REG_CRM_ICHRG_1A064       CPCAP_REG_CRM_ICHRG(0xc)
 109#define CPCAP_REG_CRM_ICHRG_1A152       CPCAP_REG_CRM_ICHRG(0xd)
 110#define CPCAP_REG_CRM_ICHRG_1A596       CPCAP_REG_CRM_ICHRG(0xe)
 111#define CPCAP_REG_CRM_ICHRG_NO_LIMIT    CPCAP_REG_CRM_ICHRG(0xf)
 112
 113/* CPCAP_REG_VUSBC register bits needed for VBUS */
 114#define CPCAP_BIT_VBUS_SWITCH           BIT(0)  /* VBUS boost to 5V */
 115
 116enum {
 117        CPCAP_CHARGER_IIO_BATTDET,
 118        CPCAP_CHARGER_IIO_VOLTAGE,
 119        CPCAP_CHARGER_IIO_VBUS,
 120        CPCAP_CHARGER_IIO_CHRG_CURRENT,
 121        CPCAP_CHARGER_IIO_BATT_CURRENT,
 122        CPCAP_CHARGER_IIO_NR,
 123};
 124
 125struct cpcap_charger_ddata {
 126        struct device *dev;
 127        struct regmap *reg;
 128        struct list_head irq_list;
 129        struct delayed_work detect_work;
 130        struct delayed_work vbus_work;
 131        struct gpio_desc *gpio[2];              /* gpio_reven0 & 1 */
 132
 133        struct iio_channel *channels[CPCAP_CHARGER_IIO_NR];
 134
 135        struct power_supply *usb;
 136
 137        struct phy_companion comparator;        /* For USB VBUS */
 138        unsigned int vbus_enabled:1;
 139        unsigned int feeding_vbus:1;
 140        atomic_t active;
 141
 142        int status;
 143        int voltage;
 144        int limit_current;
 145};
 146
 147struct cpcap_interrupt_desc {
 148        int irq;
 149        struct list_head node;
 150        const char *name;
 151};
 152
 153struct cpcap_charger_ints_state {
 154        bool chrg_det;
 155        bool rvrs_chrg;
 156        bool vbusov;
 157
 158        bool chrg_se1b;
 159        bool rvrs_mode;
 160        bool chrgcurr2;
 161        bool chrgcurr1;
 162        bool vbusvld;
 163
 164        bool battdetb;
 165};
 166
 167static enum power_supply_property cpcap_charger_props[] = {
 168        POWER_SUPPLY_PROP_STATUS,
 169        POWER_SUPPLY_PROP_ONLINE,
 170        POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
 171        POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
 172        POWER_SUPPLY_PROP_VOLTAGE_NOW,
 173        POWER_SUPPLY_PROP_CURRENT_NOW,
 174};
 175
 176static int cpcap_charger_get_charge_voltage(struct cpcap_charger_ddata *ddata)
 177{
 178        struct iio_channel *channel;
 179        int error, value = 0;
 180
 181        channel = ddata->channels[CPCAP_CHARGER_IIO_VOLTAGE];
 182        error = iio_read_channel_processed(channel, &value);
 183        if (error < 0) {
 184                dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
 185
 186                return 0;
 187        }
 188
 189        return value;
 190}
 191
 192static int cpcap_charger_get_charge_current(struct cpcap_charger_ddata *ddata)
 193{
 194        struct iio_channel *channel;
 195        int error, value = 0;
 196
 197        channel = ddata->channels[CPCAP_CHARGER_IIO_CHRG_CURRENT];
 198        error = iio_read_channel_processed(channel, &value);
 199        if (error < 0) {
 200                dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
 201
 202                return 0;
 203        }
 204
 205        return value;
 206}
 207
 208static int cpcap_charger_get_property(struct power_supply *psy,
 209                                      enum power_supply_property psp,
 210                                      union power_supply_propval *val)
 211{
 212        struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent);
 213
 214        switch (psp) {
 215        case POWER_SUPPLY_PROP_STATUS:
 216                val->intval = ddata->status;
 217                break;
 218        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
 219                val->intval = ddata->limit_current;
 220                break;
 221        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
 222                val->intval = ddata->voltage;
 223                break;
 224        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
 225                if (ddata->status == POWER_SUPPLY_STATUS_CHARGING)
 226                        val->intval = cpcap_charger_get_charge_voltage(ddata) *
 227                                1000;
 228                else
 229                        val->intval = 0;
 230                break;
 231        case POWER_SUPPLY_PROP_CURRENT_NOW:
 232                if (ddata->status == POWER_SUPPLY_STATUS_CHARGING)
 233                        val->intval = cpcap_charger_get_charge_current(ddata) *
 234                                1000;
 235                else
 236                        val->intval = 0;
 237                break;
 238        case POWER_SUPPLY_PROP_ONLINE:
 239                val->intval = ddata->status == POWER_SUPPLY_STATUS_CHARGING;
 240                break;
 241        default:
 242                return -EINVAL;
 243        }
 244
 245        return 0;
 246}
 247
 248static int cpcap_charger_match_voltage(int voltage)
 249{
 250        switch (voltage) {
 251        case 0 ... 4100000 - 1: return 3800000;
 252        case 4100000 ... 4120000 - 1: return 4100000;
 253        case 4120000 ... 4150000 - 1: return 4120000;
 254        case 4150000 ... 4170000 - 1: return 4150000;
 255        case 4170000 ... 4200000 - 1: return 4170000;
 256        case 4200000 ... 4230000 - 1: return 4200000;
 257        case 4230000 ... 4250000 - 1: return 4230000;
 258        case 4250000 ... 4270000 - 1: return 4250000;
 259        case 4270000 ... 4300000 - 1: return 4270000;
 260        case 4300000 ... 4330000 - 1: return 4300000;
 261        case 4330000 ... 4350000 - 1: return 4330000;
 262        case 4350000 ... 4380000 - 1: return 4350000;
 263        case 4380000 ... 4400000 - 1: return 4380000;
 264        case 4400000 ... 4420000 - 1: return 4400000;
 265        case 4420000 ... 4440000 - 1: return 4420000;
 266        case 4440000: return 4440000;
 267        default: return 0;
 268        }
 269}
 270
 271static int
 272cpcap_charger_get_bat_const_charge_voltage(struct cpcap_charger_ddata *ddata)
 273{
 274        union power_supply_propval prop;
 275        struct power_supply *battery;
 276        int voltage = ddata->voltage;
 277        int error;
 278
 279        battery = power_supply_get_by_name("battery");
 280        if (battery) {
 281                error = power_supply_get_property(battery,
 282                                POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
 283                                &prop);
 284                if (!error)
 285                        voltage = prop.intval;
 286
 287                power_supply_put(battery);
 288        }
 289
 290        return voltage;
 291}
 292
 293static int cpcap_charger_current_to_regval(int microamp)
 294{
 295        int miliamp = microamp / 1000;
 296        int res;
 297
 298        if (miliamp < 0)
 299                return -EINVAL;
 300        if (miliamp < 70)
 301                return CPCAP_REG_CRM_ICHRG(0x0);
 302        if (miliamp < 177)
 303                return CPCAP_REG_CRM_ICHRG(0x1);
 304        if (miliamp >= 1596)
 305                return CPCAP_REG_CRM_ICHRG(0xe);
 306
 307        res = microamp / 88666;
 308        if (res > 0xd)
 309                res = 0xd;
 310        return CPCAP_REG_CRM_ICHRG(res);
 311}
 312
 313static int cpcap_charger_set_property(struct power_supply *psy,
 314                                      enum power_supply_property psp,
 315                                      const union power_supply_propval *val)
 316{
 317        struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent);
 318        int voltage, batvolt;
 319
 320        switch (psp) {
 321        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
 322                if (cpcap_charger_current_to_regval(val->intval) < 0)
 323                        return -EINVAL;
 324                ddata->limit_current = val->intval;
 325                schedule_delayed_work(&ddata->detect_work, 0);
 326                break;
 327        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
 328                voltage = cpcap_charger_match_voltage(val->intval);
 329                batvolt = cpcap_charger_get_bat_const_charge_voltage(ddata);
 330                if (voltage > batvolt)
 331                        voltage = batvolt;
 332                ddata->voltage = voltage;
 333                schedule_delayed_work(&ddata->detect_work, 0);
 334                break;
 335        default:
 336                return -EINVAL;
 337        }
 338
 339        return 0;
 340}
 341
 342static int cpcap_charger_property_is_writeable(struct power_supply *psy,
 343                                               enum power_supply_property psp)
 344{
 345        switch (psp) {
 346        case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
 347        case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
 348                return 1;
 349        default:
 350                return 0;
 351        }
 352}
 353
 354static void cpcap_charger_set_cable_path(struct cpcap_charger_ddata *ddata,
 355                                         bool enabled)
 356{
 357        if (!ddata->gpio[0])
 358                return;
 359
 360        gpiod_set_value(ddata->gpio[0], enabled);
 361}
 362
 363static void cpcap_charger_set_inductive_path(struct cpcap_charger_ddata *ddata,
 364                                             bool enabled)
 365{
 366        if (!ddata->gpio[1])
 367                return;
 368
 369        gpiod_set_value(ddata->gpio[1], enabled);
 370}
 371
 372static void cpcap_charger_update_state(struct cpcap_charger_ddata *ddata,
 373                                       int state)
 374{
 375        const char *status;
 376
 377        if (state > POWER_SUPPLY_STATUS_FULL) {
 378                dev_warn(ddata->dev, "unknown state: %i\n", state);
 379
 380                return;
 381        }
 382
 383        ddata->status = state;
 384
 385        switch (state) {
 386        case POWER_SUPPLY_STATUS_DISCHARGING:
 387                status = "DISCONNECTED";
 388                break;
 389        case POWER_SUPPLY_STATUS_NOT_CHARGING:
 390                status = "DETECTING";
 391                break;
 392        case POWER_SUPPLY_STATUS_CHARGING:
 393                status = "CHARGING";
 394                break;
 395        case POWER_SUPPLY_STATUS_FULL:
 396                status = "DONE";
 397                break;
 398        default:
 399                return;
 400        }
 401
 402        dev_dbg(ddata->dev, "state: %s\n", status);
 403}
 404
 405static int cpcap_charger_disable(struct cpcap_charger_ddata *ddata)
 406{
 407        int error;
 408
 409        error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff,
 410                                   CPCAP_REG_CRM_FET_OVRD |
 411                                   CPCAP_REG_CRM_FET_CTRL);
 412        if (error)
 413                dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
 414
 415        return error;
 416}
 417
 418static int cpcap_charger_enable(struct cpcap_charger_ddata *ddata,
 419                                int max_voltage, int charge_current,
 420                                int trickle_current)
 421{
 422        int error;
 423
 424        if (!max_voltage || !charge_current)
 425                return -EINVAL;
 426
 427        dev_dbg(ddata->dev, "enable: %i %i %i\n",
 428                max_voltage, charge_current, trickle_current);
 429
 430        error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff,
 431                                   CPCAP_REG_CRM_CHRG_LED_EN |
 432                                   trickle_current |
 433                                   CPCAP_REG_CRM_FET_OVRD |
 434                                   CPCAP_REG_CRM_FET_CTRL |
 435                                   max_voltage |
 436                                   charge_current);
 437        if (error)
 438                dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
 439
 440        return error;
 441}
 442
 443static bool cpcap_charger_vbus_valid(struct cpcap_charger_ddata *ddata)
 444{
 445        int error, value = 0;
 446        struct iio_channel *channel =
 447                ddata->channels[CPCAP_CHARGER_IIO_VBUS];
 448
 449        error = iio_read_channel_processed(channel, &value);
 450        if (error >= 0)
 451                return value > 3900;
 452
 453        dev_err(ddata->dev, "error reading VBUS: %i\n", error);
 454
 455        return false;
 456}
 457
 458/* VBUS control functions for the USB PHY companion */
 459static void cpcap_charger_vbus_work(struct work_struct *work)
 460{
 461        struct cpcap_charger_ddata *ddata;
 462        bool vbus = false;
 463        int error;
 464
 465        ddata = container_of(work, struct cpcap_charger_ddata,
 466                             vbus_work.work);
 467
 468        if (ddata->vbus_enabled) {
 469                vbus = cpcap_charger_vbus_valid(ddata);
 470                if (vbus) {
 471                        dev_dbg(ddata->dev, "VBUS already provided\n");
 472
 473                        return;
 474                }
 475
 476                ddata->feeding_vbus = true;
 477                cpcap_charger_set_cable_path(ddata, false);
 478                cpcap_charger_set_inductive_path(ddata, false);
 479
 480                error = cpcap_charger_disable(ddata);
 481                if (error)
 482                        goto out_err;
 483
 484                cpcap_charger_update_state(ddata,
 485                                           POWER_SUPPLY_STATUS_DISCHARGING);
 486
 487                error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC,
 488                                           CPCAP_BIT_VBUS_SWITCH,
 489                                           CPCAP_BIT_VBUS_SWITCH);
 490                if (error)
 491                        goto out_err;
 492
 493                error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM,
 494                                           CPCAP_REG_CRM_RVRSMODE,
 495                                           CPCAP_REG_CRM_RVRSMODE);
 496                if (error)
 497                        goto out_err;
 498        } else {
 499                error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC,
 500                                           CPCAP_BIT_VBUS_SWITCH, 0);
 501                if (error)
 502                        goto out_err;
 503
 504                error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM,
 505                                           CPCAP_REG_CRM_RVRSMODE, 0);
 506                if (error)
 507                        goto out_err;
 508
 509                cpcap_charger_set_cable_path(ddata, true);
 510                cpcap_charger_set_inductive_path(ddata, true);
 511                ddata->feeding_vbus = false;
 512        }
 513
 514        return;
 515
 516out_err:
 517        cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
 518        dev_err(ddata->dev, "%s could not %s vbus: %i\n", __func__,
 519                ddata->vbus_enabled ? "enable" : "disable", error);
 520}
 521
 522static int cpcap_charger_set_vbus(struct phy_companion *comparator,
 523                                  bool enabled)
 524{
 525        struct cpcap_charger_ddata *ddata =
 526                container_of(comparator, struct cpcap_charger_ddata,
 527                             comparator);
 528
 529        ddata->vbus_enabled = enabled;
 530        schedule_delayed_work(&ddata->vbus_work, 0);
 531
 532        return 0;
 533}
 534
 535/* Charger interrupt handling functions */
 536
 537static int cpcap_charger_get_ints_state(struct cpcap_charger_ddata *ddata,
 538                                        struct cpcap_charger_ints_state *s)
 539{
 540        int val, error;
 541
 542        error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val);
 543        if (error)
 544                return error;
 545
 546        s->chrg_det = val & BIT(13);
 547        s->rvrs_chrg = val & BIT(12);
 548        s->vbusov = val & BIT(11);
 549
 550        error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val);
 551        if (error)
 552                return error;
 553
 554        s->chrg_se1b = val & BIT(13);
 555        s->rvrs_mode = val & BIT(6);
 556        s->chrgcurr2 = val & BIT(5);
 557        s->chrgcurr1 = val & BIT(4);
 558        s->vbusvld = val & BIT(3);
 559
 560        error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val);
 561        if (error)
 562                return error;
 563
 564        s->battdetb = val & BIT(6);
 565
 566        return 0;
 567}
 568
 569static int cpcap_charger_voltage_to_regval(int voltage)
 570{
 571        int offset;
 572
 573        switch (voltage) {
 574        case 0 ... 4100000 - 1:
 575                return 0;
 576        case 4100000 ... 4200000 - 1:
 577                offset = 1;
 578                break;
 579        case 4200000 ... 4300000 - 1:
 580                offset = 0;
 581                break;
 582        case 4300000 ... 4380000 - 1:
 583                offset = -1;
 584                break;
 585        case 4380000 ... 4440000:
 586                offset = -2;
 587                break;
 588        default:
 589                return 0;
 590        }
 591
 592        return ((voltage - 4100000) / 20000) + offset;
 593}
 594
 595static void cpcap_charger_disconnect(struct cpcap_charger_ddata *ddata,
 596                                     int state, unsigned long delay)
 597{
 598        int error;
 599
 600        /* Update battery state before disconnecting the charger */
 601        switch (state) {
 602        case POWER_SUPPLY_STATUS_DISCHARGING:
 603        case POWER_SUPPLY_STATUS_FULL:
 604                power_supply_changed(ddata->usb);
 605                break;
 606        default:
 607                break;
 608        }
 609
 610        error = cpcap_charger_disable(ddata);
 611        if (error) {
 612                cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
 613                return;
 614        }
 615
 616        cpcap_charger_update_state(ddata, state);
 617        power_supply_changed(ddata->usb);
 618        schedule_delayed_work(&ddata->detect_work, delay);
 619}
 620
 621static void cpcap_usb_detect(struct work_struct *work)
 622{
 623        struct cpcap_charger_ddata *ddata;
 624        struct cpcap_charger_ints_state s;
 625        int error, new_state;
 626
 627        ddata = container_of(work, struct cpcap_charger_ddata,
 628                             detect_work.work);
 629
 630        error = cpcap_charger_get_ints_state(ddata, &s);
 631        if (error)
 632                return;
 633
 634        /* Just init the state if a charger is connected with no chrg_det set */
 635        if (!s.chrg_det && s.chrgcurr1 && s.vbusvld) {
 636                cpcap_charger_update_state(ddata,
 637                                           POWER_SUPPLY_STATUS_NOT_CHARGING);
 638
 639                return;
 640        }
 641
 642        /*
 643         * If battery voltage is higher than charge voltage, it may have been
 644         * charged to 4.35V by Android. Try again in 10 minutes.
 645         */
 646        if (cpcap_charger_get_charge_voltage(ddata) > ddata->voltage) {
 647                cpcap_charger_disconnect(ddata,
 648                                         POWER_SUPPLY_STATUS_NOT_CHARGING,
 649                                         HZ * 60 * 10);
 650
 651                return;
 652        }
 653
 654        /* Delay for 80ms to avoid vbus bouncing when usb cable is plugged in */
 655        usleep_range(80000, 120000);
 656
 657        /* Throttle chrgcurr2 interrupt for charger done and retry */
 658        switch (ddata->status) {
 659        case POWER_SUPPLY_STATUS_CHARGING:
 660                if (s.chrgcurr2)
 661                        break;
 662                new_state = POWER_SUPPLY_STATUS_FULL;
 663
 664                if (s.chrgcurr1 && s.vbusvld) {
 665                        cpcap_charger_disconnect(ddata, new_state, HZ * 5);
 666                        return;
 667                }
 668                break;
 669        case POWER_SUPPLY_STATUS_FULL:
 670                if (!s.chrgcurr2)
 671                        break;
 672                if (s.vbusvld)
 673                        new_state = POWER_SUPPLY_STATUS_NOT_CHARGING;
 674                else
 675                        new_state = POWER_SUPPLY_STATUS_DISCHARGING;
 676
 677                cpcap_charger_disconnect(ddata, new_state, HZ * 5);
 678
 679                return;
 680        default:
 681                break;
 682        }
 683
 684        if (!ddata->feeding_vbus && cpcap_charger_vbus_valid(ddata) &&
 685            s.chrgcurr1) {
 686                int max_current;
 687                int vchrg, ichrg;
 688                union power_supply_propval val;
 689                struct power_supply *battery;
 690
 691                battery = power_supply_get_by_name("battery");
 692                if (IS_ERR_OR_NULL(battery)) {
 693                        dev_err(ddata->dev, "battery power_supply not available %li\n",
 694                                        PTR_ERR(battery));
 695                        return;
 696                }
 697
 698                error = power_supply_get_property(battery, POWER_SUPPLY_PROP_PRESENT, &val);
 699                power_supply_put(battery);
 700                if (error)
 701                        goto out_err;
 702
 703                if (val.intval) {
 704                        max_current = 1596000;
 705                } else {
 706                        dev_info(ddata->dev, "battery not inserted, charging disabled\n");
 707                        max_current = 0;
 708                }
 709
 710                if (max_current > ddata->limit_current)
 711                        max_current = ddata->limit_current;
 712
 713                ichrg = cpcap_charger_current_to_regval(max_current);
 714                vchrg = cpcap_charger_voltage_to_regval(ddata->voltage);
 715                error = cpcap_charger_enable(ddata,
 716                                             CPCAP_REG_CRM_VCHRG(vchrg),
 717                                             ichrg, 0);
 718                if (error)
 719                        goto out_err;
 720                cpcap_charger_update_state(ddata,
 721                                           POWER_SUPPLY_STATUS_CHARGING);
 722        } else {
 723                error = cpcap_charger_disable(ddata);
 724                if (error)
 725                        goto out_err;
 726                cpcap_charger_update_state(ddata,
 727                                           POWER_SUPPLY_STATUS_DISCHARGING);
 728        }
 729
 730        power_supply_changed(ddata->usb);
 731        return;
 732
 733out_err:
 734        cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
 735        dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
 736}
 737
 738static irqreturn_t cpcap_charger_irq_thread(int irq, void *data)
 739{
 740        struct cpcap_charger_ddata *ddata = data;
 741
 742        if (!atomic_read(&ddata->active))
 743                return IRQ_NONE;
 744
 745        schedule_delayed_work(&ddata->detect_work, 0);
 746
 747        return IRQ_HANDLED;
 748}
 749
 750static int cpcap_usb_init_irq(struct platform_device *pdev,
 751                              struct cpcap_charger_ddata *ddata,
 752                              const char *name)
 753{
 754        struct cpcap_interrupt_desc *d;
 755        int irq, error;
 756
 757        irq = platform_get_irq_byname(pdev, name);
 758        if (irq < 0)
 759                return -ENODEV;
 760
 761        error = devm_request_threaded_irq(ddata->dev, irq, NULL,
 762                                          cpcap_charger_irq_thread,
 763                                          IRQF_SHARED | IRQF_ONESHOT,
 764                                          name, ddata);
 765        if (error) {
 766                dev_err(ddata->dev, "could not get irq %s: %i\n",
 767                        name, error);
 768
 769                return error;
 770        }
 771
 772        d = devm_kzalloc(ddata->dev, sizeof(*d), GFP_KERNEL);
 773        if (!d)
 774                return -ENOMEM;
 775
 776        d->name = name;
 777        d->irq = irq;
 778        list_add(&d->node, &ddata->irq_list);
 779
 780        return 0;
 781}
 782
 783static const char * const cpcap_charger_irqs[] = {
 784        /* REG_INT_0 */
 785        "chrg_det", "rvrs_chrg",
 786
 787        /* REG_INT1 */
 788        "chrg_se1b", "se0conn", "rvrs_mode", "chrgcurr2", "chrgcurr1", "vbusvld",
 789
 790        /* REG_INT_3 */
 791        "battdetb",
 792};
 793
 794static int cpcap_usb_init_interrupts(struct platform_device *pdev,
 795                                     struct cpcap_charger_ddata *ddata)
 796{
 797        int i, error;
 798
 799        for (i = 0; i < ARRAY_SIZE(cpcap_charger_irqs); i++) {
 800                error = cpcap_usb_init_irq(pdev, ddata, cpcap_charger_irqs[i]);
 801                if (error)
 802                        return error;
 803        }
 804
 805        return 0;
 806}
 807
 808static void cpcap_charger_init_optional_gpios(struct cpcap_charger_ddata *ddata)
 809{
 810        int i;
 811
 812        for (i = 0; i < 2; i++) {
 813                ddata->gpio[i] = devm_gpiod_get_index(ddata->dev, "mode",
 814                                                      i, GPIOD_OUT_HIGH);
 815                if (IS_ERR(ddata->gpio[i])) {
 816                        dev_info(ddata->dev, "no mode change GPIO%i: %li\n",
 817                                 i, PTR_ERR(ddata->gpio[i]));
 818                        ddata->gpio[i] = NULL;
 819                }
 820        }
 821}
 822
 823static int cpcap_charger_init_iio(struct cpcap_charger_ddata *ddata)
 824{
 825        const char * const names[CPCAP_CHARGER_IIO_NR] = {
 826                "battdetb", "battp", "vbus", "chg_isense", "batti",
 827        };
 828        int error, i;
 829
 830        for (i = 0; i < CPCAP_CHARGER_IIO_NR; i++) {
 831                ddata->channels[i] = devm_iio_channel_get(ddata->dev,
 832                                                          names[i]);
 833                if (IS_ERR(ddata->channels[i])) {
 834                        error = PTR_ERR(ddata->channels[i]);
 835                        goto out_err;
 836                }
 837
 838                if (!ddata->channels[i]->indio_dev) {
 839                        error = -ENXIO;
 840                        goto out_err;
 841                }
 842        }
 843
 844        return 0;
 845
 846out_err:
 847        if (error != -EPROBE_DEFER)
 848                dev_err(ddata->dev, "could not initialize VBUS or ID IIO: %i\n",
 849                        error);
 850
 851        return error;
 852}
 853
 854static char *cpcap_charger_supplied_to[] = {
 855        "battery",
 856};
 857
 858static const struct power_supply_desc cpcap_charger_usb_desc = {
 859        .name           = "usb",
 860        .type           = POWER_SUPPLY_TYPE_USB,
 861        .properties     = cpcap_charger_props,
 862        .num_properties = ARRAY_SIZE(cpcap_charger_props),
 863        .get_property   = cpcap_charger_get_property,
 864        .set_property   = cpcap_charger_set_property,
 865        .property_is_writeable = cpcap_charger_property_is_writeable,
 866};
 867
 868#ifdef CONFIG_OF
 869static const struct of_device_id cpcap_charger_id_table[] = {
 870        {
 871                .compatible = "motorola,mapphone-cpcap-charger",
 872        },
 873        {},
 874};
 875MODULE_DEVICE_TABLE(of, cpcap_charger_id_table);
 876#endif
 877
 878static int cpcap_charger_probe(struct platform_device *pdev)
 879{
 880        struct cpcap_charger_ddata *ddata;
 881        const struct of_device_id *of_id;
 882        struct power_supply_config psy_cfg = {};
 883        int error;
 884
 885        of_id = of_match_device(of_match_ptr(cpcap_charger_id_table),
 886                                &pdev->dev);
 887        if (!of_id)
 888                return -EINVAL;
 889
 890        ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
 891        if (!ddata)
 892                return -ENOMEM;
 893
 894        ddata->dev = &pdev->dev;
 895        ddata->voltage = 4200000;
 896        ddata->limit_current = 532000;
 897
 898        ddata->reg = dev_get_regmap(ddata->dev->parent, NULL);
 899        if (!ddata->reg)
 900                return -ENODEV;
 901
 902        INIT_LIST_HEAD(&ddata->irq_list);
 903        INIT_DELAYED_WORK(&ddata->detect_work, cpcap_usb_detect);
 904        INIT_DELAYED_WORK(&ddata->vbus_work, cpcap_charger_vbus_work);
 905        platform_set_drvdata(pdev, ddata);
 906
 907        error = cpcap_charger_init_iio(ddata);
 908        if (error)
 909                return error;
 910
 911        atomic_set(&ddata->active, 1);
 912
 913        psy_cfg.of_node = pdev->dev.of_node;
 914        psy_cfg.drv_data = ddata;
 915        psy_cfg.supplied_to = cpcap_charger_supplied_to;
 916        psy_cfg.num_supplicants = ARRAY_SIZE(cpcap_charger_supplied_to),
 917
 918        ddata->usb = devm_power_supply_register(ddata->dev,
 919                                                &cpcap_charger_usb_desc,
 920                                                &psy_cfg);
 921        if (IS_ERR(ddata->usb)) {
 922                error = PTR_ERR(ddata->usb);
 923                dev_err(ddata->dev, "failed to register USB charger: %i\n",
 924                        error);
 925
 926                return error;
 927        }
 928
 929        error = cpcap_usb_init_interrupts(pdev, ddata);
 930        if (error)
 931                return error;
 932
 933        ddata->comparator.set_vbus = cpcap_charger_set_vbus;
 934        error = omap_usb2_set_comparator(&ddata->comparator);
 935        if (error == -ENODEV) {
 936                dev_info(ddata->dev, "charger needs phy, deferring probe\n");
 937                return -EPROBE_DEFER;
 938        }
 939
 940        cpcap_charger_init_optional_gpios(ddata);
 941
 942        schedule_delayed_work(&ddata->detect_work, 0);
 943
 944        return 0;
 945}
 946
 947static void cpcap_charger_shutdown(struct platform_device *pdev)
 948{
 949        struct cpcap_charger_ddata *ddata = platform_get_drvdata(pdev);
 950        int error;
 951
 952        atomic_set(&ddata->active, 0);
 953        error = omap_usb2_set_comparator(NULL);
 954        if (error)
 955                dev_warn(ddata->dev, "could not clear USB comparator: %i\n",
 956                         error);
 957
 958        error = cpcap_charger_disable(ddata);
 959        if (error) {
 960                cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
 961                dev_warn(ddata->dev, "could not clear charger: %i\n",
 962                         error);
 963        }
 964        cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_DISCHARGING);
 965        cancel_delayed_work_sync(&ddata->vbus_work);
 966        cancel_delayed_work_sync(&ddata->detect_work);
 967}
 968
 969static int cpcap_charger_remove(struct platform_device *pdev)
 970{
 971        cpcap_charger_shutdown(pdev);
 972
 973        return 0;
 974}
 975
 976static struct platform_driver cpcap_charger_driver = {
 977        .probe = cpcap_charger_probe,
 978        .driver = {
 979                .name   = "cpcap-charger",
 980                .of_match_table = of_match_ptr(cpcap_charger_id_table),
 981        },
 982        .shutdown = cpcap_charger_shutdown,
 983        .remove = cpcap_charger_remove,
 984};
 985module_platform_driver(cpcap_charger_driver);
 986
 987MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
 988MODULE_DESCRIPTION("CPCAP Battery Charger Interface driver");
 989MODULE_LICENSE("GPL v2");
 990MODULE_ALIAS("platform:cpcap-charger");
 991