0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/atomic.h>
0014 #include <linux/init.h>
0015 #include <linux/module.h>
0016 #include <linux/slab.h>
0017 #include <linux/err.h>
0018 #include <linux/interrupt.h>
0019 #include <linux/notifier.h>
0020 #include <linux/of.h>
0021 #include <linux/of_platform.h>
0022 #include <linux/platform_device.h>
0023 #include <linux/power_supply.h>
0024 #include <linux/regmap.h>
0025
0026 #include <linux/gpio/consumer.h>
0027 #include <linux/usb/phy_companion.h>
0028 #include <linux/phy/omap_usb.h>
0029 #include <linux/usb/otg.h>
0030 #include <linux/iio/consumer.h>
0031 #include <linux/mfd/motorola-cpcap.h>
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 #define CPCAP_REG_CRM_UNUSED_641_15 BIT(15)
0042 #define CPCAP_REG_CRM_UNUSED_641_14 BIT(14)
0043 #define CPCAP_REG_CRM_CHRG_LED_EN BIT(13)
0044 #define CPCAP_REG_CRM_RVRSMODE BIT(12)
0045 #define CPCAP_REG_CRM_ICHRG_TR1 BIT(11)
0046 #define CPCAP_REG_CRM_ICHRG_TR0 BIT(10)
0047 #define CPCAP_REG_CRM_FET_OVRD BIT(9)
0048 #define CPCAP_REG_CRM_FET_CTRL BIT(8)
0049 #define CPCAP_REG_CRM_VCHRG3 BIT(7)
0050 #define CPCAP_REG_CRM_VCHRG2 BIT(6)
0051 #define CPCAP_REG_CRM_VCHRG1 BIT(5)
0052 #define CPCAP_REG_CRM_VCHRG0 BIT(4)
0053 #define CPCAP_REG_CRM_ICHRG3 BIT(3)
0054 #define CPCAP_REG_CRM_ICHRG2 BIT(2)
0055 #define CPCAP_REG_CRM_ICHRG1 BIT(1)
0056 #define CPCAP_REG_CRM_ICHRG0 BIT(0)
0057
0058
0059 #define CPCAP_REG_CRM_TR(val) (((val) & 0x3) << 10)
0060 #define CPCAP_REG_CRM_TR_0A00 CPCAP_REG_CRM_TR(0x0)
0061 #define CPCAP_REG_CRM_TR_0A24 CPCAP_REG_CRM_TR(0x1)
0062 #define CPCAP_REG_CRM_TR_0A48 CPCAP_REG_CRM_TR(0x2)
0063 #define CPCAP_REG_CRM_TR_0A72 CPCAP_REG_CRM_TR(0x4)
0064
0065
0066
0067
0068
0069
0070 #define CPCAP_REG_CRM_VCHRG(val) (((val) & 0xf) << 4)
0071 #define CPCAP_REG_CRM_VCHRG_3V80 CPCAP_REG_CRM_VCHRG(0x0)
0072 #define CPCAP_REG_CRM_VCHRG_4V10 CPCAP_REG_CRM_VCHRG(0x1)
0073 #define CPCAP_REG_CRM_VCHRG_4V12 CPCAP_REG_CRM_VCHRG(0x2)
0074 #define CPCAP_REG_CRM_VCHRG_4V15 CPCAP_REG_CRM_VCHRG(0x3)
0075 #define CPCAP_REG_CRM_VCHRG_4V17 CPCAP_REG_CRM_VCHRG(0x4)
0076 #define CPCAP_REG_CRM_VCHRG_4V20 CPCAP_REG_CRM_VCHRG(0x5)
0077 #define CPCAP_REG_CRM_VCHRG_4V23 CPCAP_REG_CRM_VCHRG(0x6)
0078 #define CPCAP_REG_CRM_VCHRG_4V25 CPCAP_REG_CRM_VCHRG(0x7)
0079 #define CPCAP_REG_CRM_VCHRG_4V27 CPCAP_REG_CRM_VCHRG(0x8)
0080 #define CPCAP_REG_CRM_VCHRG_4V30 CPCAP_REG_CRM_VCHRG(0x9)
0081 #define CPCAP_REG_CRM_VCHRG_4V33 CPCAP_REG_CRM_VCHRG(0xa)
0082 #define CPCAP_REG_CRM_VCHRG_4V35 CPCAP_REG_CRM_VCHRG(0xb)
0083 #define CPCAP_REG_CRM_VCHRG_4V38 CPCAP_REG_CRM_VCHRG(0xc)
0084 #define CPCAP_REG_CRM_VCHRG_4V40 CPCAP_REG_CRM_VCHRG(0xd)
0085 #define CPCAP_REG_CRM_VCHRG_4V42 CPCAP_REG_CRM_VCHRG(0xe)
0086 #define CPCAP_REG_CRM_VCHRG_4V44 CPCAP_REG_CRM_VCHRG(0xf)
0087
0088
0089
0090
0091
0092
0093
0094
0095 #define CPCAP_REG_CRM_ICHRG(val) (((val) & 0xf) << 0)
0096 #define CPCAP_REG_CRM_ICHRG_0A000 CPCAP_REG_CRM_ICHRG(0x0)
0097 #define CPCAP_REG_CRM_ICHRG_0A070 CPCAP_REG_CRM_ICHRG(0x1)
0098 #define CPCAP_REG_CRM_ICHRG_0A177 CPCAP_REG_CRM_ICHRG(0x2)
0099 #define CPCAP_REG_CRM_ICHRG_0A266 CPCAP_REG_CRM_ICHRG(0x3)
0100 #define CPCAP_REG_CRM_ICHRG_0A355 CPCAP_REG_CRM_ICHRG(0x4)
0101 #define CPCAP_REG_CRM_ICHRG_0A443 CPCAP_REG_CRM_ICHRG(0x5)
0102 #define CPCAP_REG_CRM_ICHRG_0A532 CPCAP_REG_CRM_ICHRG(0x6)
0103 #define CPCAP_REG_CRM_ICHRG_0A621 CPCAP_REG_CRM_ICHRG(0x7)
0104 #define CPCAP_REG_CRM_ICHRG_0A709 CPCAP_REG_CRM_ICHRG(0x8)
0105 #define CPCAP_REG_CRM_ICHRG_0A798 CPCAP_REG_CRM_ICHRG(0x9)
0106 #define CPCAP_REG_CRM_ICHRG_0A886 CPCAP_REG_CRM_ICHRG(0xa)
0107 #define CPCAP_REG_CRM_ICHRG_0A975 CPCAP_REG_CRM_ICHRG(0xb)
0108 #define CPCAP_REG_CRM_ICHRG_1A064 CPCAP_REG_CRM_ICHRG(0xc)
0109 #define CPCAP_REG_CRM_ICHRG_1A152 CPCAP_REG_CRM_ICHRG(0xd)
0110 #define CPCAP_REG_CRM_ICHRG_1A596 CPCAP_REG_CRM_ICHRG(0xe)
0111 #define CPCAP_REG_CRM_ICHRG_NO_LIMIT CPCAP_REG_CRM_ICHRG(0xf)
0112
0113
0114 #define CPCAP_BIT_VBUS_SWITCH BIT(0)
0115
0116 enum {
0117 CPCAP_CHARGER_IIO_BATTDET,
0118 CPCAP_CHARGER_IIO_VOLTAGE,
0119 CPCAP_CHARGER_IIO_VBUS,
0120 CPCAP_CHARGER_IIO_CHRG_CURRENT,
0121 CPCAP_CHARGER_IIO_BATT_CURRENT,
0122 CPCAP_CHARGER_IIO_NR,
0123 };
0124
0125 struct cpcap_charger_ddata {
0126 struct device *dev;
0127 struct regmap *reg;
0128 struct list_head irq_list;
0129 struct delayed_work detect_work;
0130 struct delayed_work vbus_work;
0131 struct gpio_desc *gpio[2];
0132
0133 struct iio_channel *channels[CPCAP_CHARGER_IIO_NR];
0134
0135 struct power_supply *usb;
0136
0137 struct phy_companion comparator;
0138 unsigned int vbus_enabled:1;
0139 unsigned int feeding_vbus:1;
0140 atomic_t active;
0141
0142 int status;
0143 int voltage;
0144 int limit_current;
0145 };
0146
0147 struct cpcap_interrupt_desc {
0148 int irq;
0149 struct list_head node;
0150 const char *name;
0151 };
0152
0153 struct cpcap_charger_ints_state {
0154 bool chrg_det;
0155 bool rvrs_chrg;
0156 bool vbusov;
0157
0158 bool chrg_se1b;
0159 bool rvrs_mode;
0160 bool chrgcurr2;
0161 bool chrgcurr1;
0162 bool vbusvld;
0163
0164 bool battdetb;
0165 };
0166
0167 static enum power_supply_property cpcap_charger_props[] = {
0168 POWER_SUPPLY_PROP_STATUS,
0169 POWER_SUPPLY_PROP_ONLINE,
0170 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
0171 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
0172 POWER_SUPPLY_PROP_VOLTAGE_NOW,
0173 POWER_SUPPLY_PROP_CURRENT_NOW,
0174 };
0175
0176 static int cpcap_charger_get_charge_voltage(struct cpcap_charger_ddata *ddata)
0177 {
0178 struct iio_channel *channel;
0179 int error, value = 0;
0180
0181 channel = ddata->channels[CPCAP_CHARGER_IIO_VOLTAGE];
0182 error = iio_read_channel_processed(channel, &value);
0183 if (error < 0) {
0184 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
0185
0186 return 0;
0187 }
0188
0189 return value;
0190 }
0191
0192 static int cpcap_charger_get_charge_current(struct cpcap_charger_ddata *ddata)
0193 {
0194 struct iio_channel *channel;
0195 int error, value = 0;
0196
0197 channel = ddata->channels[CPCAP_CHARGER_IIO_CHRG_CURRENT];
0198 error = iio_read_channel_processed(channel, &value);
0199 if (error < 0) {
0200 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
0201
0202 return 0;
0203 }
0204
0205 return value;
0206 }
0207
0208 static int cpcap_charger_get_property(struct power_supply *psy,
0209 enum power_supply_property psp,
0210 union power_supply_propval *val)
0211 {
0212 struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent);
0213
0214 switch (psp) {
0215 case POWER_SUPPLY_PROP_STATUS:
0216 val->intval = ddata->status;
0217 break;
0218 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
0219 val->intval = ddata->limit_current;
0220 break;
0221 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
0222 val->intval = ddata->voltage;
0223 break;
0224 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
0225 if (ddata->status == POWER_SUPPLY_STATUS_CHARGING)
0226 val->intval = cpcap_charger_get_charge_voltage(ddata) *
0227 1000;
0228 else
0229 val->intval = 0;
0230 break;
0231 case POWER_SUPPLY_PROP_CURRENT_NOW:
0232 if (ddata->status == POWER_SUPPLY_STATUS_CHARGING)
0233 val->intval = cpcap_charger_get_charge_current(ddata) *
0234 1000;
0235 else
0236 val->intval = 0;
0237 break;
0238 case POWER_SUPPLY_PROP_ONLINE:
0239 val->intval = ddata->status == POWER_SUPPLY_STATUS_CHARGING;
0240 break;
0241 default:
0242 return -EINVAL;
0243 }
0244
0245 return 0;
0246 }
0247
0248 static int cpcap_charger_match_voltage(int voltage)
0249 {
0250 switch (voltage) {
0251 case 0 ... 4100000 - 1: return 3800000;
0252 case 4100000 ... 4120000 - 1: return 4100000;
0253 case 4120000 ... 4150000 - 1: return 4120000;
0254 case 4150000 ... 4170000 - 1: return 4150000;
0255 case 4170000 ... 4200000 - 1: return 4170000;
0256 case 4200000 ... 4230000 - 1: return 4200000;
0257 case 4230000 ... 4250000 - 1: return 4230000;
0258 case 4250000 ... 4270000 - 1: return 4250000;
0259 case 4270000 ... 4300000 - 1: return 4270000;
0260 case 4300000 ... 4330000 - 1: return 4300000;
0261 case 4330000 ... 4350000 - 1: return 4330000;
0262 case 4350000 ... 4380000 - 1: return 4350000;
0263 case 4380000 ... 4400000 - 1: return 4380000;
0264 case 4400000 ... 4420000 - 1: return 4400000;
0265 case 4420000 ... 4440000 - 1: return 4420000;
0266 case 4440000: return 4440000;
0267 default: return 0;
0268 }
0269 }
0270
0271 static int
0272 cpcap_charger_get_bat_const_charge_voltage(struct cpcap_charger_ddata *ddata)
0273 {
0274 union power_supply_propval prop;
0275 struct power_supply *battery;
0276 int voltage = ddata->voltage;
0277 int error;
0278
0279 battery = power_supply_get_by_name("battery");
0280 if (battery) {
0281 error = power_supply_get_property(battery,
0282 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
0283 &prop);
0284 if (!error)
0285 voltage = prop.intval;
0286
0287 power_supply_put(battery);
0288 }
0289
0290 return voltage;
0291 }
0292
0293 static int cpcap_charger_current_to_regval(int microamp)
0294 {
0295 int miliamp = microamp / 1000;
0296 int res;
0297
0298 if (miliamp < 0)
0299 return -EINVAL;
0300 if (miliamp < 70)
0301 return CPCAP_REG_CRM_ICHRG(0x0);
0302 if (miliamp < 177)
0303 return CPCAP_REG_CRM_ICHRG(0x1);
0304 if (miliamp >= 1596)
0305 return CPCAP_REG_CRM_ICHRG(0xe);
0306
0307 res = microamp / 88666;
0308 if (res > 0xd)
0309 res = 0xd;
0310 return CPCAP_REG_CRM_ICHRG(res);
0311 }
0312
0313 static int cpcap_charger_set_property(struct power_supply *psy,
0314 enum power_supply_property psp,
0315 const union power_supply_propval *val)
0316 {
0317 struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent);
0318 int voltage, batvolt;
0319
0320 switch (psp) {
0321 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
0322 if (cpcap_charger_current_to_regval(val->intval) < 0)
0323 return -EINVAL;
0324 ddata->limit_current = val->intval;
0325 schedule_delayed_work(&ddata->detect_work, 0);
0326 break;
0327 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
0328 voltage = cpcap_charger_match_voltage(val->intval);
0329 batvolt = cpcap_charger_get_bat_const_charge_voltage(ddata);
0330 if (voltage > batvolt)
0331 voltage = batvolt;
0332 ddata->voltage = voltage;
0333 schedule_delayed_work(&ddata->detect_work, 0);
0334 break;
0335 default:
0336 return -EINVAL;
0337 }
0338
0339 return 0;
0340 }
0341
0342 static int cpcap_charger_property_is_writeable(struct power_supply *psy,
0343 enum power_supply_property psp)
0344 {
0345 switch (psp) {
0346 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
0347 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
0348 return 1;
0349 default:
0350 return 0;
0351 }
0352 }
0353
0354 static void cpcap_charger_set_cable_path(struct cpcap_charger_ddata *ddata,
0355 bool enabled)
0356 {
0357 if (!ddata->gpio[0])
0358 return;
0359
0360 gpiod_set_value(ddata->gpio[0], enabled);
0361 }
0362
0363 static void cpcap_charger_set_inductive_path(struct cpcap_charger_ddata *ddata,
0364 bool enabled)
0365 {
0366 if (!ddata->gpio[1])
0367 return;
0368
0369 gpiod_set_value(ddata->gpio[1], enabled);
0370 }
0371
0372 static void cpcap_charger_update_state(struct cpcap_charger_ddata *ddata,
0373 int state)
0374 {
0375 const char *status;
0376
0377 if (state > POWER_SUPPLY_STATUS_FULL) {
0378 dev_warn(ddata->dev, "unknown state: %i\n", state);
0379
0380 return;
0381 }
0382
0383 ddata->status = state;
0384
0385 switch (state) {
0386 case POWER_SUPPLY_STATUS_DISCHARGING:
0387 status = "DISCONNECTED";
0388 break;
0389 case POWER_SUPPLY_STATUS_NOT_CHARGING:
0390 status = "DETECTING";
0391 break;
0392 case POWER_SUPPLY_STATUS_CHARGING:
0393 status = "CHARGING";
0394 break;
0395 case POWER_SUPPLY_STATUS_FULL:
0396 status = "DONE";
0397 break;
0398 default:
0399 return;
0400 }
0401
0402 dev_dbg(ddata->dev, "state: %s\n", status);
0403 }
0404
0405 static int cpcap_charger_disable(struct cpcap_charger_ddata *ddata)
0406 {
0407 int error;
0408
0409 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff,
0410 CPCAP_REG_CRM_FET_OVRD |
0411 CPCAP_REG_CRM_FET_CTRL);
0412 if (error)
0413 dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
0414
0415 return error;
0416 }
0417
0418 static int cpcap_charger_enable(struct cpcap_charger_ddata *ddata,
0419 int max_voltage, int charge_current,
0420 int trickle_current)
0421 {
0422 int error;
0423
0424 if (!max_voltage || !charge_current)
0425 return -EINVAL;
0426
0427 dev_dbg(ddata->dev, "enable: %i %i %i\n",
0428 max_voltage, charge_current, trickle_current);
0429
0430 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff,
0431 CPCAP_REG_CRM_CHRG_LED_EN |
0432 trickle_current |
0433 CPCAP_REG_CRM_FET_OVRD |
0434 CPCAP_REG_CRM_FET_CTRL |
0435 max_voltage |
0436 charge_current);
0437 if (error)
0438 dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
0439
0440 return error;
0441 }
0442
0443 static bool cpcap_charger_vbus_valid(struct cpcap_charger_ddata *ddata)
0444 {
0445 int error, value = 0;
0446 struct iio_channel *channel =
0447 ddata->channels[CPCAP_CHARGER_IIO_VBUS];
0448
0449 error = iio_read_channel_processed(channel, &value);
0450 if (error >= 0)
0451 return value > 3900;
0452
0453 dev_err(ddata->dev, "error reading VBUS: %i\n", error);
0454
0455 return false;
0456 }
0457
0458
0459 static void cpcap_charger_vbus_work(struct work_struct *work)
0460 {
0461 struct cpcap_charger_ddata *ddata;
0462 bool vbus = false;
0463 int error;
0464
0465 ddata = container_of(work, struct cpcap_charger_ddata,
0466 vbus_work.work);
0467
0468 if (ddata->vbus_enabled) {
0469 vbus = cpcap_charger_vbus_valid(ddata);
0470 if (vbus) {
0471 dev_dbg(ddata->dev, "VBUS already provided\n");
0472
0473 return;
0474 }
0475
0476 ddata->feeding_vbus = true;
0477 cpcap_charger_set_cable_path(ddata, false);
0478 cpcap_charger_set_inductive_path(ddata, false);
0479
0480 error = cpcap_charger_disable(ddata);
0481 if (error)
0482 goto out_err;
0483
0484 cpcap_charger_update_state(ddata,
0485 POWER_SUPPLY_STATUS_DISCHARGING);
0486
0487 error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC,
0488 CPCAP_BIT_VBUS_SWITCH,
0489 CPCAP_BIT_VBUS_SWITCH);
0490 if (error)
0491 goto out_err;
0492
0493 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM,
0494 CPCAP_REG_CRM_RVRSMODE,
0495 CPCAP_REG_CRM_RVRSMODE);
0496 if (error)
0497 goto out_err;
0498 } else {
0499 error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC,
0500 CPCAP_BIT_VBUS_SWITCH, 0);
0501 if (error)
0502 goto out_err;
0503
0504 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM,
0505 CPCAP_REG_CRM_RVRSMODE, 0);
0506 if (error)
0507 goto out_err;
0508
0509 cpcap_charger_set_cable_path(ddata, true);
0510 cpcap_charger_set_inductive_path(ddata, true);
0511 ddata->feeding_vbus = false;
0512 }
0513
0514 return;
0515
0516 out_err:
0517 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
0518 dev_err(ddata->dev, "%s could not %s vbus: %i\n", __func__,
0519 ddata->vbus_enabled ? "enable" : "disable", error);
0520 }
0521
0522 static int cpcap_charger_set_vbus(struct phy_companion *comparator,
0523 bool enabled)
0524 {
0525 struct cpcap_charger_ddata *ddata =
0526 container_of(comparator, struct cpcap_charger_ddata,
0527 comparator);
0528
0529 ddata->vbus_enabled = enabled;
0530 schedule_delayed_work(&ddata->vbus_work, 0);
0531
0532 return 0;
0533 }
0534
0535
0536
0537 static int cpcap_charger_get_ints_state(struct cpcap_charger_ddata *ddata,
0538 struct cpcap_charger_ints_state *s)
0539 {
0540 int val, error;
0541
0542 error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val);
0543 if (error)
0544 return error;
0545
0546 s->chrg_det = val & BIT(13);
0547 s->rvrs_chrg = val & BIT(12);
0548 s->vbusov = val & BIT(11);
0549
0550 error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val);
0551 if (error)
0552 return error;
0553
0554 s->chrg_se1b = val & BIT(13);
0555 s->rvrs_mode = val & BIT(6);
0556 s->chrgcurr2 = val & BIT(5);
0557 s->chrgcurr1 = val & BIT(4);
0558 s->vbusvld = val & BIT(3);
0559
0560 error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val);
0561 if (error)
0562 return error;
0563
0564 s->battdetb = val & BIT(6);
0565
0566 return 0;
0567 }
0568
0569 static int cpcap_charger_voltage_to_regval(int voltage)
0570 {
0571 int offset;
0572
0573 switch (voltage) {
0574 case 0 ... 4100000 - 1:
0575 return 0;
0576 case 4100000 ... 4200000 - 1:
0577 offset = 1;
0578 break;
0579 case 4200000 ... 4300000 - 1:
0580 offset = 0;
0581 break;
0582 case 4300000 ... 4380000 - 1:
0583 offset = -1;
0584 break;
0585 case 4380000 ... 4440000:
0586 offset = -2;
0587 break;
0588 default:
0589 return 0;
0590 }
0591
0592 return ((voltage - 4100000) / 20000) + offset;
0593 }
0594
0595 static void cpcap_charger_disconnect(struct cpcap_charger_ddata *ddata,
0596 int state, unsigned long delay)
0597 {
0598 int error;
0599
0600
0601 switch (state) {
0602 case POWER_SUPPLY_STATUS_DISCHARGING:
0603 case POWER_SUPPLY_STATUS_FULL:
0604 power_supply_changed(ddata->usb);
0605 break;
0606 default:
0607 break;
0608 }
0609
0610 error = cpcap_charger_disable(ddata);
0611 if (error) {
0612 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
0613 return;
0614 }
0615
0616 cpcap_charger_update_state(ddata, state);
0617 power_supply_changed(ddata->usb);
0618 schedule_delayed_work(&ddata->detect_work, delay);
0619 }
0620
0621 static void cpcap_usb_detect(struct work_struct *work)
0622 {
0623 struct cpcap_charger_ddata *ddata;
0624 struct cpcap_charger_ints_state s;
0625 int error, new_state;
0626
0627 ddata = container_of(work, struct cpcap_charger_ddata,
0628 detect_work.work);
0629
0630 error = cpcap_charger_get_ints_state(ddata, &s);
0631 if (error)
0632 return;
0633
0634
0635 if (!s.chrg_det && s.chrgcurr1 && s.vbusvld) {
0636 cpcap_charger_update_state(ddata,
0637 POWER_SUPPLY_STATUS_NOT_CHARGING);
0638
0639 return;
0640 }
0641
0642
0643
0644
0645
0646 if (cpcap_charger_get_charge_voltage(ddata) > ddata->voltage) {
0647 cpcap_charger_disconnect(ddata,
0648 POWER_SUPPLY_STATUS_NOT_CHARGING,
0649 HZ * 60 * 10);
0650
0651 return;
0652 }
0653
0654
0655 usleep_range(80000, 120000);
0656
0657
0658 switch (ddata->status) {
0659 case POWER_SUPPLY_STATUS_CHARGING:
0660 if (s.chrgcurr2)
0661 break;
0662 new_state = POWER_SUPPLY_STATUS_FULL;
0663
0664 if (s.chrgcurr1 && s.vbusvld) {
0665 cpcap_charger_disconnect(ddata, new_state, HZ * 5);
0666 return;
0667 }
0668 break;
0669 case POWER_SUPPLY_STATUS_FULL:
0670 if (!s.chrgcurr2)
0671 break;
0672 if (s.vbusvld)
0673 new_state = POWER_SUPPLY_STATUS_NOT_CHARGING;
0674 else
0675 new_state = POWER_SUPPLY_STATUS_DISCHARGING;
0676
0677 cpcap_charger_disconnect(ddata, new_state, HZ * 5);
0678
0679 return;
0680 default:
0681 break;
0682 }
0683
0684 if (!ddata->feeding_vbus && cpcap_charger_vbus_valid(ddata) &&
0685 s.chrgcurr1) {
0686 int max_current;
0687 int vchrg, ichrg;
0688 union power_supply_propval val;
0689 struct power_supply *battery;
0690
0691 battery = power_supply_get_by_name("battery");
0692 if (IS_ERR_OR_NULL(battery)) {
0693 dev_err(ddata->dev, "battery power_supply not available %li\n",
0694 PTR_ERR(battery));
0695 return;
0696 }
0697
0698 error = power_supply_get_property(battery, POWER_SUPPLY_PROP_PRESENT, &val);
0699 power_supply_put(battery);
0700 if (error)
0701 goto out_err;
0702
0703 if (val.intval) {
0704 max_current = 1596000;
0705 } else {
0706 dev_info(ddata->dev, "battery not inserted, charging disabled\n");
0707 max_current = 0;
0708 }
0709
0710 if (max_current > ddata->limit_current)
0711 max_current = ddata->limit_current;
0712
0713 ichrg = cpcap_charger_current_to_regval(max_current);
0714 vchrg = cpcap_charger_voltage_to_regval(ddata->voltage);
0715 error = cpcap_charger_enable(ddata,
0716 CPCAP_REG_CRM_VCHRG(vchrg),
0717 ichrg, 0);
0718 if (error)
0719 goto out_err;
0720 cpcap_charger_update_state(ddata,
0721 POWER_SUPPLY_STATUS_CHARGING);
0722 } else {
0723 error = cpcap_charger_disable(ddata);
0724 if (error)
0725 goto out_err;
0726 cpcap_charger_update_state(ddata,
0727 POWER_SUPPLY_STATUS_DISCHARGING);
0728 }
0729
0730 power_supply_changed(ddata->usb);
0731 return;
0732
0733 out_err:
0734 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
0735 dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
0736 }
0737
0738 static irqreturn_t cpcap_charger_irq_thread(int irq, void *data)
0739 {
0740 struct cpcap_charger_ddata *ddata = data;
0741
0742 if (!atomic_read(&ddata->active))
0743 return IRQ_NONE;
0744
0745 schedule_delayed_work(&ddata->detect_work, 0);
0746
0747 return IRQ_HANDLED;
0748 }
0749
0750 static int cpcap_usb_init_irq(struct platform_device *pdev,
0751 struct cpcap_charger_ddata *ddata,
0752 const char *name)
0753 {
0754 struct cpcap_interrupt_desc *d;
0755 int irq, error;
0756
0757 irq = platform_get_irq_byname(pdev, name);
0758 if (irq < 0)
0759 return -ENODEV;
0760
0761 error = devm_request_threaded_irq(ddata->dev, irq, NULL,
0762 cpcap_charger_irq_thread,
0763 IRQF_SHARED | IRQF_ONESHOT,
0764 name, ddata);
0765 if (error) {
0766 dev_err(ddata->dev, "could not get irq %s: %i\n",
0767 name, error);
0768
0769 return error;
0770 }
0771
0772 d = devm_kzalloc(ddata->dev, sizeof(*d), GFP_KERNEL);
0773 if (!d)
0774 return -ENOMEM;
0775
0776 d->name = name;
0777 d->irq = irq;
0778 list_add(&d->node, &ddata->irq_list);
0779
0780 return 0;
0781 }
0782
0783 static const char * const cpcap_charger_irqs[] = {
0784
0785 "chrg_det", "rvrs_chrg",
0786
0787
0788 "chrg_se1b", "se0conn", "rvrs_mode", "chrgcurr2", "chrgcurr1", "vbusvld",
0789
0790
0791 "battdetb",
0792 };
0793
0794 static int cpcap_usb_init_interrupts(struct platform_device *pdev,
0795 struct cpcap_charger_ddata *ddata)
0796 {
0797 int i, error;
0798
0799 for (i = 0; i < ARRAY_SIZE(cpcap_charger_irqs); i++) {
0800 error = cpcap_usb_init_irq(pdev, ddata, cpcap_charger_irqs[i]);
0801 if (error)
0802 return error;
0803 }
0804
0805 return 0;
0806 }
0807
0808 static void cpcap_charger_init_optional_gpios(struct cpcap_charger_ddata *ddata)
0809 {
0810 int i;
0811
0812 for (i = 0; i < 2; i++) {
0813 ddata->gpio[i] = devm_gpiod_get_index(ddata->dev, "mode",
0814 i, GPIOD_OUT_HIGH);
0815 if (IS_ERR(ddata->gpio[i])) {
0816 dev_info(ddata->dev, "no mode change GPIO%i: %li\n",
0817 i, PTR_ERR(ddata->gpio[i]));
0818 ddata->gpio[i] = NULL;
0819 }
0820 }
0821 }
0822
0823 static int cpcap_charger_init_iio(struct cpcap_charger_ddata *ddata)
0824 {
0825 const char * const names[CPCAP_CHARGER_IIO_NR] = {
0826 "battdetb", "battp", "vbus", "chg_isense", "batti",
0827 };
0828 int error, i;
0829
0830 for (i = 0; i < CPCAP_CHARGER_IIO_NR; i++) {
0831 ddata->channels[i] = devm_iio_channel_get(ddata->dev,
0832 names[i]);
0833 if (IS_ERR(ddata->channels[i])) {
0834 error = PTR_ERR(ddata->channels[i]);
0835 goto out_err;
0836 }
0837
0838 if (!ddata->channels[i]->indio_dev) {
0839 error = -ENXIO;
0840 goto out_err;
0841 }
0842 }
0843
0844 return 0;
0845
0846 out_err:
0847 if (error != -EPROBE_DEFER)
0848 dev_err(ddata->dev, "could not initialize VBUS or ID IIO: %i\n",
0849 error);
0850
0851 return error;
0852 }
0853
0854 static char *cpcap_charger_supplied_to[] = {
0855 "battery",
0856 };
0857
0858 static const struct power_supply_desc cpcap_charger_usb_desc = {
0859 .name = "usb",
0860 .type = POWER_SUPPLY_TYPE_USB,
0861 .properties = cpcap_charger_props,
0862 .num_properties = ARRAY_SIZE(cpcap_charger_props),
0863 .get_property = cpcap_charger_get_property,
0864 .set_property = cpcap_charger_set_property,
0865 .property_is_writeable = cpcap_charger_property_is_writeable,
0866 };
0867
0868 #ifdef CONFIG_OF
0869 static const struct of_device_id cpcap_charger_id_table[] = {
0870 {
0871 .compatible = "motorola,mapphone-cpcap-charger",
0872 },
0873 {},
0874 };
0875 MODULE_DEVICE_TABLE(of, cpcap_charger_id_table);
0876 #endif
0877
0878 static int cpcap_charger_probe(struct platform_device *pdev)
0879 {
0880 struct cpcap_charger_ddata *ddata;
0881 const struct of_device_id *of_id;
0882 struct power_supply_config psy_cfg = {};
0883 int error;
0884
0885 of_id = of_match_device(of_match_ptr(cpcap_charger_id_table),
0886 &pdev->dev);
0887 if (!of_id)
0888 return -EINVAL;
0889
0890 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
0891 if (!ddata)
0892 return -ENOMEM;
0893
0894 ddata->dev = &pdev->dev;
0895 ddata->voltage = 4200000;
0896 ddata->limit_current = 532000;
0897
0898 ddata->reg = dev_get_regmap(ddata->dev->parent, NULL);
0899 if (!ddata->reg)
0900 return -ENODEV;
0901
0902 INIT_LIST_HEAD(&ddata->irq_list);
0903 INIT_DELAYED_WORK(&ddata->detect_work, cpcap_usb_detect);
0904 INIT_DELAYED_WORK(&ddata->vbus_work, cpcap_charger_vbus_work);
0905 platform_set_drvdata(pdev, ddata);
0906
0907 error = cpcap_charger_init_iio(ddata);
0908 if (error)
0909 return error;
0910
0911 atomic_set(&ddata->active, 1);
0912
0913 psy_cfg.of_node = pdev->dev.of_node;
0914 psy_cfg.drv_data = ddata;
0915 psy_cfg.supplied_to = cpcap_charger_supplied_to;
0916 psy_cfg.num_supplicants = ARRAY_SIZE(cpcap_charger_supplied_to),
0917
0918 ddata->usb = devm_power_supply_register(ddata->dev,
0919 &cpcap_charger_usb_desc,
0920 &psy_cfg);
0921 if (IS_ERR(ddata->usb)) {
0922 error = PTR_ERR(ddata->usb);
0923 dev_err(ddata->dev, "failed to register USB charger: %i\n",
0924 error);
0925
0926 return error;
0927 }
0928
0929 error = cpcap_usb_init_interrupts(pdev, ddata);
0930 if (error)
0931 return error;
0932
0933 ddata->comparator.set_vbus = cpcap_charger_set_vbus;
0934 error = omap_usb2_set_comparator(&ddata->comparator);
0935 if (error == -ENODEV) {
0936 dev_info(ddata->dev, "charger needs phy, deferring probe\n");
0937 return -EPROBE_DEFER;
0938 }
0939
0940 cpcap_charger_init_optional_gpios(ddata);
0941
0942 schedule_delayed_work(&ddata->detect_work, 0);
0943
0944 return 0;
0945 }
0946
0947 static void cpcap_charger_shutdown(struct platform_device *pdev)
0948 {
0949 struct cpcap_charger_ddata *ddata = platform_get_drvdata(pdev);
0950 int error;
0951
0952 atomic_set(&ddata->active, 0);
0953 error = omap_usb2_set_comparator(NULL);
0954 if (error)
0955 dev_warn(ddata->dev, "could not clear USB comparator: %i\n",
0956 error);
0957
0958 error = cpcap_charger_disable(ddata);
0959 if (error) {
0960 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
0961 dev_warn(ddata->dev, "could not clear charger: %i\n",
0962 error);
0963 }
0964 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_DISCHARGING);
0965 cancel_delayed_work_sync(&ddata->vbus_work);
0966 cancel_delayed_work_sync(&ddata->detect_work);
0967 }
0968
0969 static int cpcap_charger_remove(struct platform_device *pdev)
0970 {
0971 cpcap_charger_shutdown(pdev);
0972
0973 return 0;
0974 }
0975
0976 static struct platform_driver cpcap_charger_driver = {
0977 .probe = cpcap_charger_probe,
0978 .driver = {
0979 .name = "cpcap-charger",
0980 .of_match_table = of_match_ptr(cpcap_charger_id_table),
0981 },
0982 .shutdown = cpcap_charger_shutdown,
0983 .remove = cpcap_charger_remove,
0984 };
0985 module_platform_driver(cpcap_charger_driver);
0986
0987 MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
0988 MODULE_DESCRIPTION("CPCAP Battery Charger Interface driver");
0989 MODULE_LICENSE("GPL v2");
0990 MODULE_ALIAS("platform:cpcap-charger");