0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include <linux/kernel.h>
0019 #include <linux/module.h>
0020 #include <linux/param.h>
0021 #include <linux/err.h>
0022 #include <linux/workqueue.h>
0023 #include <linux/sysfs.h>
0024 #include <linux/platform_device.h>
0025 #include <linux/power_supply.h>
0026 #include <linux/idr.h>
0027 #include <linux/i2c.h>
0028 #include <linux/slab.h>
0029 #include <linux/acpi.h>
0030
0031 #include <linux/power/bq2415x_charger.h>
0032
0033
0034 #define BQ2415X_TIMER_TIMEOUT 10
0035
0036 #define BQ2415X_REG_STATUS 0x00
0037 #define BQ2415X_REG_CONTROL 0x01
0038 #define BQ2415X_REG_VOLTAGE 0x02
0039 #define BQ2415X_REG_VENDER 0x03
0040 #define BQ2415X_REG_CURRENT 0x04
0041
0042
0043 #define BQ2415X_RESET_STATUS BIT(6)
0044 #define BQ2415X_RESET_CONTROL (BIT(4)|BIT(5))
0045 #define BQ2415X_RESET_VOLTAGE (BIT(1)|BIT(3))
0046 #define BQ2415X_RESET_CURRENT (BIT(0)|BIT(3)|BIT(7))
0047
0048
0049 #define BQ2415X_BIT_TMR_RST 7
0050 #define BQ2415X_BIT_OTG 7
0051 #define BQ2415X_BIT_EN_STAT 6
0052 #define BQ2415X_MASK_STAT (BIT(4)|BIT(5))
0053 #define BQ2415X_SHIFT_STAT 4
0054 #define BQ2415X_BIT_BOOST 3
0055 #define BQ2415X_MASK_FAULT (BIT(0)|BIT(1)|BIT(2))
0056 #define BQ2415X_SHIFT_FAULT 0
0057
0058
0059 #define BQ2415X_MASK_LIMIT (BIT(6)|BIT(7))
0060 #define BQ2415X_SHIFT_LIMIT 6
0061 #define BQ2415X_MASK_VLOWV (BIT(4)|BIT(5))
0062 #define BQ2415X_SHIFT_VLOWV 4
0063 #define BQ2415X_BIT_TE 3
0064 #define BQ2415X_BIT_CE 2
0065 #define BQ2415X_BIT_HZ_MODE 1
0066 #define BQ2415X_BIT_OPA_MODE 0
0067
0068
0069 #define BQ2415X_MASK_VO (BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6)|BIT(7))
0070 #define BQ2415X_SHIFT_VO 2
0071 #define BQ2415X_BIT_OTG_PL 1
0072 #define BQ2415X_BIT_OTG_EN 0
0073
0074
0075 #define BQ2415X_MASK_VENDER (BIT(5)|BIT(6)|BIT(7))
0076 #define BQ2415X_SHIFT_VENDER 5
0077 #define BQ2415X_MASK_PN (BIT(3)|BIT(4))
0078 #define BQ2415X_SHIFT_PN 3
0079 #define BQ2415X_MASK_REVISION (BIT(0)|BIT(1)|BIT(2))
0080 #define BQ2415X_SHIFT_REVISION 0
0081
0082
0083 #define BQ2415X_MASK_RESET BIT(7)
0084 #define BQ2415X_MASK_VI_CHRG (BIT(4)|BIT(5)|BIT(6))
0085 #define BQ2415X_SHIFT_VI_CHRG 4
0086
0087 #define BQ2415X_MASK_VI_TERM (BIT(0)|BIT(1)|BIT(2))
0088 #define BQ2415X_SHIFT_VI_TERM 0
0089
0090
0091 enum bq2415x_command {
0092 BQ2415X_TIMER_RESET,
0093 BQ2415X_OTG_STATUS,
0094 BQ2415X_STAT_PIN_STATUS,
0095 BQ2415X_STAT_PIN_ENABLE,
0096 BQ2415X_STAT_PIN_DISABLE,
0097 BQ2415X_CHARGE_STATUS,
0098 BQ2415X_BOOST_STATUS,
0099 BQ2415X_FAULT_STATUS,
0100
0101 BQ2415X_CHARGE_TERMINATION_STATUS,
0102 BQ2415X_CHARGE_TERMINATION_ENABLE,
0103 BQ2415X_CHARGE_TERMINATION_DISABLE,
0104 BQ2415X_CHARGER_STATUS,
0105 BQ2415X_CHARGER_ENABLE,
0106 BQ2415X_CHARGER_DISABLE,
0107 BQ2415X_HIGH_IMPEDANCE_STATUS,
0108 BQ2415X_HIGH_IMPEDANCE_ENABLE,
0109 BQ2415X_HIGH_IMPEDANCE_DISABLE,
0110 BQ2415X_BOOST_MODE_STATUS,
0111 BQ2415X_BOOST_MODE_ENABLE,
0112 BQ2415X_BOOST_MODE_DISABLE,
0113
0114 BQ2415X_OTG_LEVEL,
0115 BQ2415X_OTG_ACTIVATE_HIGH,
0116 BQ2415X_OTG_ACTIVATE_LOW,
0117 BQ2415X_OTG_PIN_STATUS,
0118 BQ2415X_OTG_PIN_ENABLE,
0119 BQ2415X_OTG_PIN_DISABLE,
0120
0121 BQ2415X_VENDER_CODE,
0122 BQ2415X_PART_NUMBER,
0123 BQ2415X_REVISION,
0124 };
0125
0126 enum bq2415x_chip {
0127 BQUNKNOWN,
0128 BQ24150,
0129 BQ24150A,
0130 BQ24151,
0131 BQ24151A,
0132 BQ24152,
0133 BQ24153,
0134 BQ24153A,
0135 BQ24155,
0136 BQ24156,
0137 BQ24156A,
0138 BQ24157S,
0139 BQ24158,
0140 };
0141
0142 static char *bq2415x_chip_name[] = {
0143 "unknown",
0144 "bq24150",
0145 "bq24150a",
0146 "bq24151",
0147 "bq24151a",
0148 "bq24152",
0149 "bq24153",
0150 "bq24153a",
0151 "bq24155",
0152 "bq24156",
0153 "bq24156a",
0154 "bq24157s",
0155 "bq24158",
0156 };
0157
0158 struct bq2415x_device {
0159 struct device *dev;
0160 struct bq2415x_platform_data init_data;
0161 struct power_supply *charger;
0162 struct power_supply_desc charger_desc;
0163 struct delayed_work work;
0164 struct device_node *notify_node;
0165 struct notifier_block nb;
0166 enum bq2415x_mode reported_mode;
0167 enum bq2415x_mode mode;
0168 enum bq2415x_chip chip;
0169 const char *timer_error;
0170 char *model;
0171 char *name;
0172 int autotimer;
0173 int automode;
0174 int id;
0175 };
0176
0177
0178 static DEFINE_IDR(bq2415x_id);
0179
0180 static DEFINE_MUTEX(bq2415x_id_mutex);
0181 static DEFINE_MUTEX(bq2415x_timer_mutex);
0182 static DEFINE_MUTEX(bq2415x_i2c_mutex);
0183
0184
0185
0186
0187 static int bq2415x_i2c_read(struct bq2415x_device *bq, u8 reg)
0188 {
0189 struct i2c_client *client = to_i2c_client(bq->dev);
0190 struct i2c_msg msg[2];
0191 u8 val;
0192 int ret;
0193
0194 if (!client->adapter)
0195 return -ENODEV;
0196
0197 msg[0].addr = client->addr;
0198 msg[0].flags = 0;
0199 msg[0].buf = ®
0200 msg[0].len = sizeof(reg);
0201 msg[1].addr = client->addr;
0202 msg[1].flags = I2C_M_RD;
0203 msg[1].buf = &val;
0204 msg[1].len = sizeof(val);
0205
0206 mutex_lock(&bq2415x_i2c_mutex);
0207 ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
0208 mutex_unlock(&bq2415x_i2c_mutex);
0209
0210 if (ret < 0)
0211 return ret;
0212
0213 return val;
0214 }
0215
0216
0217 static int bq2415x_i2c_read_mask(struct bq2415x_device *bq, u8 reg,
0218 u8 mask, u8 shift)
0219 {
0220 int ret;
0221
0222 if (shift > 8)
0223 return -EINVAL;
0224
0225 ret = bq2415x_i2c_read(bq, reg);
0226 if (ret < 0)
0227 return ret;
0228 return (ret & mask) >> shift;
0229 }
0230
0231
0232 static int bq2415x_i2c_read_bit(struct bq2415x_device *bq, u8 reg, u8 bit)
0233 {
0234 if (bit > 8)
0235 return -EINVAL;
0236 return bq2415x_i2c_read_mask(bq, reg, BIT(bit), bit);
0237 }
0238
0239
0240
0241
0242 static int bq2415x_i2c_write(struct bq2415x_device *bq, u8 reg, u8 val)
0243 {
0244 struct i2c_client *client = to_i2c_client(bq->dev);
0245 struct i2c_msg msg[1];
0246 u8 data[2];
0247 int ret;
0248
0249 data[0] = reg;
0250 data[1] = val;
0251
0252 msg[0].addr = client->addr;
0253 msg[0].flags = 0;
0254 msg[0].buf = data;
0255 msg[0].len = ARRAY_SIZE(data);
0256
0257 mutex_lock(&bq2415x_i2c_mutex);
0258 ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
0259 mutex_unlock(&bq2415x_i2c_mutex);
0260
0261
0262 if (ret < 0)
0263 return ret;
0264 else if (ret != 1)
0265 return -EIO;
0266
0267 return 0;
0268 }
0269
0270
0271 static int bq2415x_i2c_write_mask(struct bq2415x_device *bq, u8 reg, u8 val,
0272 u8 mask, u8 shift)
0273 {
0274 int ret;
0275
0276 if (shift > 8)
0277 return -EINVAL;
0278
0279 ret = bq2415x_i2c_read(bq, reg);
0280 if (ret < 0)
0281 return ret;
0282
0283 ret &= ~mask;
0284 ret |= val << shift;
0285
0286 return bq2415x_i2c_write(bq, reg, ret);
0287 }
0288
0289
0290 static int bq2415x_i2c_write_bit(struct bq2415x_device *bq, u8 reg,
0291 bool val, u8 bit)
0292 {
0293 if (bit > 8)
0294 return -EINVAL;
0295 return bq2415x_i2c_write_mask(bq, reg, val, BIT(bit), bit);
0296 }
0297
0298
0299
0300
0301 static int bq2415x_exec_command(struct bq2415x_device *bq,
0302 enum bq2415x_command command)
0303 {
0304 int ret;
0305
0306 switch (command) {
0307 case BQ2415X_TIMER_RESET:
0308 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS,
0309 1, BQ2415X_BIT_TMR_RST);
0310 case BQ2415X_OTG_STATUS:
0311 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS,
0312 BQ2415X_BIT_OTG);
0313 case BQ2415X_STAT_PIN_STATUS:
0314 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS,
0315 BQ2415X_BIT_EN_STAT);
0316 case BQ2415X_STAT_PIN_ENABLE:
0317 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS, 1,
0318 BQ2415X_BIT_EN_STAT);
0319 case BQ2415X_STAT_PIN_DISABLE:
0320 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS, 0,
0321 BQ2415X_BIT_EN_STAT);
0322 case BQ2415X_CHARGE_STATUS:
0323 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_STATUS,
0324 BQ2415X_MASK_STAT, BQ2415X_SHIFT_STAT);
0325 case BQ2415X_BOOST_STATUS:
0326 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS,
0327 BQ2415X_BIT_BOOST);
0328 case BQ2415X_FAULT_STATUS:
0329 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_STATUS,
0330 BQ2415X_MASK_FAULT, BQ2415X_SHIFT_FAULT);
0331
0332 case BQ2415X_CHARGE_TERMINATION_STATUS:
0333 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL,
0334 BQ2415X_BIT_TE);
0335 case BQ2415X_CHARGE_TERMINATION_ENABLE:
0336 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
0337 1, BQ2415X_BIT_TE);
0338 case BQ2415X_CHARGE_TERMINATION_DISABLE:
0339 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
0340 0, BQ2415X_BIT_TE);
0341 case BQ2415X_CHARGER_STATUS:
0342 ret = bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL,
0343 BQ2415X_BIT_CE);
0344 if (ret < 0)
0345 return ret;
0346 return ret > 0 ? 0 : 1;
0347 case BQ2415X_CHARGER_ENABLE:
0348 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
0349 0, BQ2415X_BIT_CE);
0350 case BQ2415X_CHARGER_DISABLE:
0351 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
0352 1, BQ2415X_BIT_CE);
0353 case BQ2415X_HIGH_IMPEDANCE_STATUS:
0354 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL,
0355 BQ2415X_BIT_HZ_MODE);
0356 case BQ2415X_HIGH_IMPEDANCE_ENABLE:
0357 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
0358 1, BQ2415X_BIT_HZ_MODE);
0359 case BQ2415X_HIGH_IMPEDANCE_DISABLE:
0360 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
0361 0, BQ2415X_BIT_HZ_MODE);
0362 case BQ2415X_BOOST_MODE_STATUS:
0363 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL,
0364 BQ2415X_BIT_OPA_MODE);
0365 case BQ2415X_BOOST_MODE_ENABLE:
0366 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
0367 1, BQ2415X_BIT_OPA_MODE);
0368 case BQ2415X_BOOST_MODE_DISABLE:
0369 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL,
0370 0, BQ2415X_BIT_OPA_MODE);
0371
0372 case BQ2415X_OTG_LEVEL:
0373 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_VOLTAGE,
0374 BQ2415X_BIT_OTG_PL);
0375 case BQ2415X_OTG_ACTIVATE_HIGH:
0376 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE,
0377 1, BQ2415X_BIT_OTG_PL);
0378 case BQ2415X_OTG_ACTIVATE_LOW:
0379 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE,
0380 0, BQ2415X_BIT_OTG_PL);
0381 case BQ2415X_OTG_PIN_STATUS:
0382 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_VOLTAGE,
0383 BQ2415X_BIT_OTG_EN);
0384 case BQ2415X_OTG_PIN_ENABLE:
0385 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE,
0386 1, BQ2415X_BIT_OTG_EN);
0387 case BQ2415X_OTG_PIN_DISABLE:
0388 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE,
0389 0, BQ2415X_BIT_OTG_EN);
0390
0391 case BQ2415X_VENDER_CODE:
0392 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER,
0393 BQ2415X_MASK_VENDER, BQ2415X_SHIFT_VENDER);
0394 case BQ2415X_PART_NUMBER:
0395 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER,
0396 BQ2415X_MASK_PN, BQ2415X_SHIFT_PN);
0397 case BQ2415X_REVISION:
0398 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER,
0399 BQ2415X_MASK_REVISION, BQ2415X_SHIFT_REVISION);
0400 }
0401 return -EINVAL;
0402 }
0403
0404
0405 static enum bq2415x_chip bq2415x_detect_chip(struct bq2415x_device *bq)
0406 {
0407 struct i2c_client *client = to_i2c_client(bq->dev);
0408 int ret = bq2415x_exec_command(bq, BQ2415X_PART_NUMBER);
0409
0410 if (ret < 0)
0411 return ret;
0412
0413 switch (client->addr) {
0414 case 0x6b:
0415 switch (ret) {
0416 case 0:
0417 if (bq->chip == BQ24151A)
0418 return bq->chip;
0419 return BQ24151;
0420 case 1:
0421 if (bq->chip == BQ24150A ||
0422 bq->chip == BQ24152 ||
0423 bq->chip == BQ24155)
0424 return bq->chip;
0425 return BQ24150;
0426 case 2:
0427 if (bq->chip == BQ24153A)
0428 return bq->chip;
0429 return BQ24153;
0430 default:
0431 return BQUNKNOWN;
0432 }
0433 break;
0434
0435 case 0x6a:
0436 switch (ret) {
0437 case 0:
0438 if (bq->chip == BQ24156A)
0439 return bq->chip;
0440 return BQ24156;
0441 case 2:
0442 if (bq->chip == BQ24157S)
0443 return bq->chip;
0444 return BQ24158;
0445 default:
0446 return BQUNKNOWN;
0447 }
0448 break;
0449 }
0450
0451 return BQUNKNOWN;
0452 }
0453
0454
0455 static int bq2415x_detect_revision(struct bq2415x_device *bq)
0456 {
0457 int ret = bq2415x_exec_command(bq, BQ2415X_REVISION);
0458 int chip = bq2415x_detect_chip(bq);
0459
0460 if (ret < 0 || chip < 0)
0461 return -1;
0462
0463 switch (chip) {
0464 case BQ24150:
0465 case BQ24150A:
0466 case BQ24151:
0467 case BQ24151A:
0468 case BQ24152:
0469 if (ret >= 0 && ret <= 3)
0470 return ret;
0471 return -1;
0472 case BQ24153:
0473 case BQ24153A:
0474 case BQ24156:
0475 case BQ24156A:
0476 case BQ24157S:
0477 case BQ24158:
0478 if (ret == 3)
0479 return 0;
0480 else if (ret == 1)
0481 return 1;
0482 return -1;
0483 case BQ24155:
0484 if (ret == 3)
0485 return 3;
0486 return -1;
0487 case BQUNKNOWN:
0488 return -1;
0489 }
0490
0491 return -1;
0492 }
0493
0494
0495 static int bq2415x_get_vender_code(struct bq2415x_device *bq)
0496 {
0497 int ret;
0498
0499 ret = bq2415x_exec_command(bq, BQ2415X_VENDER_CODE);
0500 if (ret < 0)
0501 return 0;
0502
0503
0504 return (ret & 0x1) +
0505 ((ret >> 1) & 0x1) * 10 +
0506 ((ret >> 2) & 0x1) * 100;
0507 }
0508
0509
0510 static void bq2415x_reset_chip(struct bq2415x_device *bq)
0511 {
0512 bq2415x_i2c_write(bq, BQ2415X_REG_CURRENT, BQ2415X_RESET_CURRENT);
0513 bq2415x_i2c_write(bq, BQ2415X_REG_VOLTAGE, BQ2415X_RESET_VOLTAGE);
0514 bq2415x_i2c_write(bq, BQ2415X_REG_CONTROL, BQ2415X_RESET_CONTROL);
0515 bq2415x_i2c_write(bq, BQ2415X_REG_STATUS, BQ2415X_RESET_STATUS);
0516 bq->timer_error = NULL;
0517 }
0518
0519
0520
0521
0522 static int bq2415x_set_current_limit(struct bq2415x_device *bq, int mA)
0523 {
0524 int val;
0525
0526 if (mA <= 100)
0527 val = 0;
0528 else if (mA <= 500)
0529 val = 1;
0530 else if (mA <= 800)
0531 val = 2;
0532 else
0533 val = 3;
0534
0535 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CONTROL, val,
0536 BQ2415X_MASK_LIMIT, BQ2415X_SHIFT_LIMIT);
0537 }
0538
0539
0540 static int bq2415x_get_current_limit(struct bq2415x_device *bq)
0541 {
0542 int ret;
0543
0544 ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CONTROL,
0545 BQ2415X_MASK_LIMIT, BQ2415X_SHIFT_LIMIT);
0546 if (ret < 0)
0547 return ret;
0548 else if (ret == 0)
0549 return 100;
0550 else if (ret == 1)
0551 return 500;
0552 else if (ret == 2)
0553 return 800;
0554 else if (ret == 3)
0555 return 1800;
0556 return -EINVAL;
0557 }
0558
0559
0560 static int bq2415x_set_weak_battery_voltage(struct bq2415x_device *bq, int mV)
0561 {
0562 int val;
0563
0564
0565 if (mV <= 3400 + 50)
0566 val = 0;
0567 else if (mV <= 3500 + 50)
0568 val = 1;
0569 else if (mV <= 3600 + 50)
0570 val = 2;
0571 else
0572 val = 3;
0573
0574 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CONTROL, val,
0575 BQ2415X_MASK_VLOWV, BQ2415X_SHIFT_VLOWV);
0576 }
0577
0578
0579 static int bq2415x_get_weak_battery_voltage(struct bq2415x_device *bq)
0580 {
0581 int ret;
0582
0583 ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CONTROL,
0584 BQ2415X_MASK_VLOWV, BQ2415X_SHIFT_VLOWV);
0585 if (ret < 0)
0586 return ret;
0587 return 100 * (34 + ret);
0588 }
0589
0590
0591 static int bq2415x_set_battery_regulation_voltage(struct bq2415x_device *bq,
0592 int mV)
0593 {
0594 int val = (mV/10 - 350) / 2;
0595
0596
0597
0598
0599
0600 if (val < 0)
0601 val = 0;
0602 else if (val > 47)
0603 return -EINVAL;
0604
0605 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_VOLTAGE, val,
0606 BQ2415X_MASK_VO, BQ2415X_SHIFT_VO);
0607 }
0608
0609
0610 static int bq2415x_get_battery_regulation_voltage(struct bq2415x_device *bq)
0611 {
0612 int ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_VOLTAGE,
0613 BQ2415X_MASK_VO, BQ2415X_SHIFT_VO);
0614
0615 if (ret < 0)
0616 return ret;
0617 return 10 * (350 + 2*ret);
0618 }
0619
0620
0621 static int bq2415x_set_charge_current(struct bq2415x_device *bq, int mA)
0622 {
0623 int val;
0624
0625 if (bq->init_data.resistor_sense <= 0)
0626 return -EINVAL;
0627
0628 val = (mA * bq->init_data.resistor_sense - 37400) / 6800;
0629 if (val < 0)
0630 val = 0;
0631 else if (val > 7)
0632 val = 7;
0633
0634 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CURRENT, val,
0635 BQ2415X_MASK_VI_CHRG | BQ2415X_MASK_RESET,
0636 BQ2415X_SHIFT_VI_CHRG);
0637 }
0638
0639
0640 static int bq2415x_get_charge_current(struct bq2415x_device *bq)
0641 {
0642 int ret;
0643
0644 if (bq->init_data.resistor_sense <= 0)
0645 return -EINVAL;
0646
0647 ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CURRENT,
0648 BQ2415X_MASK_VI_CHRG, BQ2415X_SHIFT_VI_CHRG);
0649 if (ret < 0)
0650 return ret;
0651 return (37400 + 6800*ret) / bq->init_data.resistor_sense;
0652 }
0653
0654
0655 static int bq2415x_set_termination_current(struct bq2415x_device *bq, int mA)
0656 {
0657 int val;
0658
0659 if (bq->init_data.resistor_sense <= 0)
0660 return -EINVAL;
0661
0662 val = (mA * bq->init_data.resistor_sense - 3400) / 3400;
0663 if (val < 0)
0664 val = 0;
0665 else if (val > 7)
0666 val = 7;
0667
0668 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CURRENT, val,
0669 BQ2415X_MASK_VI_TERM | BQ2415X_MASK_RESET,
0670 BQ2415X_SHIFT_VI_TERM);
0671 }
0672
0673
0674 static int bq2415x_get_termination_current(struct bq2415x_device *bq)
0675 {
0676 int ret;
0677
0678 if (bq->init_data.resistor_sense <= 0)
0679 return -EINVAL;
0680
0681 ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CURRENT,
0682 BQ2415X_MASK_VI_TERM, BQ2415X_SHIFT_VI_TERM);
0683 if (ret < 0)
0684 return ret;
0685 return (3400 + 3400*ret) / bq->init_data.resistor_sense;
0686 }
0687
0688
0689 #define bq2415x_set_default_value(bq, prop) \
0690 do { \
0691 int ret = 0; \
0692 if (bq->init_data.prop != -1) \
0693 ret = bq2415x_set_##prop(bq, bq->init_data.prop); \
0694 if (ret < 0) \
0695 return ret; \
0696 } while (0)
0697
0698
0699 static int bq2415x_set_defaults(struct bq2415x_device *bq)
0700 {
0701 bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_DISABLE);
0702 bq2415x_exec_command(bq, BQ2415X_CHARGER_DISABLE);
0703 bq2415x_exec_command(bq, BQ2415X_CHARGE_TERMINATION_DISABLE);
0704
0705 bq2415x_set_default_value(bq, current_limit);
0706 bq2415x_set_default_value(bq, weak_battery_voltage);
0707 bq2415x_set_default_value(bq, battery_regulation_voltage);
0708
0709 if (bq->init_data.resistor_sense > 0) {
0710 bq2415x_set_default_value(bq, charge_current);
0711 bq2415x_set_default_value(bq, termination_current);
0712 bq2415x_exec_command(bq, BQ2415X_CHARGE_TERMINATION_ENABLE);
0713 }
0714
0715 bq2415x_exec_command(bq, BQ2415X_CHARGER_ENABLE);
0716 return 0;
0717 }
0718
0719
0720
0721
0722 static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode)
0723 {
0724 int ret = 0;
0725 int charger = 0;
0726 int boost = 0;
0727
0728 if (mode == BQ2415X_MODE_BOOST)
0729 boost = 1;
0730 else if (mode != BQ2415X_MODE_OFF)
0731 charger = 1;
0732
0733 if (!charger)
0734 ret = bq2415x_exec_command(bq, BQ2415X_CHARGER_DISABLE);
0735
0736 if (!boost)
0737 ret = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_DISABLE);
0738
0739 if (ret < 0)
0740 return ret;
0741
0742 switch (mode) {
0743 case BQ2415X_MODE_OFF:
0744 dev_dbg(bq->dev, "changing mode to: Offline\n");
0745 ret = bq2415x_set_current_limit(bq, 100);
0746 break;
0747 case BQ2415X_MODE_NONE:
0748 dev_dbg(bq->dev, "changing mode to: N/A\n");
0749 ret = bq2415x_set_current_limit(bq, 100);
0750 break;
0751 case BQ2415X_MODE_HOST_CHARGER:
0752 dev_dbg(bq->dev, "changing mode to: Host/HUB charger\n");
0753 ret = bq2415x_set_current_limit(bq, 500);
0754 break;
0755 case BQ2415X_MODE_DEDICATED_CHARGER:
0756 dev_dbg(bq->dev, "changing mode to: Dedicated charger\n");
0757 ret = bq2415x_set_current_limit(bq, 1800);
0758 break;
0759 case BQ2415X_MODE_BOOST:
0760 dev_dbg(bq->dev, "changing mode to: Boost\n");
0761 ret = bq2415x_set_current_limit(bq, 100);
0762 break;
0763 }
0764
0765 if (ret < 0)
0766 return ret;
0767
0768 if (charger)
0769 ret = bq2415x_exec_command(bq, BQ2415X_CHARGER_ENABLE);
0770 else if (boost)
0771 ret = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_ENABLE);
0772
0773 if (ret < 0)
0774 return ret;
0775
0776 bq2415x_set_default_value(bq, weak_battery_voltage);
0777 bq2415x_set_default_value(bq, battery_regulation_voltage);
0778
0779 bq->mode = mode;
0780 sysfs_notify(&bq->charger->dev.kobj, NULL, "mode");
0781
0782 return 0;
0783
0784 }
0785
0786 static bool bq2415x_update_reported_mode(struct bq2415x_device *bq, int mA)
0787 {
0788 enum bq2415x_mode mode;
0789
0790 if (mA == 0)
0791 mode = BQ2415X_MODE_OFF;
0792 else if (mA < 500)
0793 mode = BQ2415X_MODE_NONE;
0794 else if (mA < 1800)
0795 mode = BQ2415X_MODE_HOST_CHARGER;
0796 else
0797 mode = BQ2415X_MODE_DEDICATED_CHARGER;
0798
0799 if (bq->reported_mode == mode)
0800 return false;
0801
0802 bq->reported_mode = mode;
0803 return true;
0804 }
0805
0806 static int bq2415x_notifier_call(struct notifier_block *nb,
0807 unsigned long val, void *v)
0808 {
0809 struct bq2415x_device *bq =
0810 container_of(nb, struct bq2415x_device, nb);
0811 struct power_supply *psy = v;
0812 union power_supply_propval prop;
0813 int ret;
0814
0815 if (val != PSY_EVENT_PROP_CHANGED)
0816 return NOTIFY_OK;
0817
0818
0819 if (bq->notify_node) {
0820 if (!psy->dev.parent ||
0821 psy->dev.parent->of_node != bq->notify_node)
0822 return NOTIFY_OK;
0823 } else if (bq->init_data.notify_device) {
0824 if (strcmp(psy->desc->name, bq->init_data.notify_device) != 0)
0825 return NOTIFY_OK;
0826 }
0827
0828 dev_dbg(bq->dev, "notifier call was called\n");
0829
0830 ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_CURRENT_MAX,
0831 &prop);
0832 if (ret != 0)
0833 return NOTIFY_OK;
0834
0835 if (!bq2415x_update_reported_mode(bq, prop.intval))
0836 return NOTIFY_OK;
0837
0838
0839 if (bq->automode < 1)
0840 return NOTIFY_OK;
0841
0842 schedule_delayed_work(&bq->work, 0);
0843
0844 return NOTIFY_OK;
0845 }
0846
0847
0848
0849
0850 static void bq2415x_set_autotimer(struct bq2415x_device *bq, int state)
0851 {
0852 mutex_lock(&bq2415x_timer_mutex);
0853
0854 if (bq->autotimer == state) {
0855 mutex_unlock(&bq2415x_timer_mutex);
0856 return;
0857 }
0858
0859 bq->autotimer = state;
0860
0861 if (state) {
0862 schedule_delayed_work(&bq->work, BQ2415X_TIMER_TIMEOUT * HZ);
0863 bq2415x_exec_command(bq, BQ2415X_TIMER_RESET);
0864 bq->timer_error = NULL;
0865 } else {
0866 cancel_delayed_work_sync(&bq->work);
0867 }
0868
0869 mutex_unlock(&bq2415x_timer_mutex);
0870 }
0871
0872
0873 static void bq2415x_timer_error(struct bq2415x_device *bq, const char *msg)
0874 {
0875 bq->timer_error = msg;
0876 sysfs_notify(&bq->charger->dev.kobj, NULL, "timer");
0877 dev_err(bq->dev, "%s\n", msg);
0878 if (bq->automode > 0)
0879 bq->automode = 0;
0880 bq2415x_set_mode(bq, BQ2415X_MODE_OFF);
0881 bq2415x_set_autotimer(bq, 0);
0882 }
0883
0884
0885 static void bq2415x_timer_work(struct work_struct *work)
0886 {
0887 struct bq2415x_device *bq = container_of(work, struct bq2415x_device,
0888 work.work);
0889 int ret;
0890 int error;
0891 int boost;
0892
0893 if (bq->automode > 0 && (bq->reported_mode != bq->mode)) {
0894 sysfs_notify(&bq->charger->dev.kobj, NULL, "reported_mode");
0895 bq2415x_set_mode(bq, bq->reported_mode);
0896 }
0897
0898 if (!bq->autotimer)
0899 return;
0900
0901 ret = bq2415x_exec_command(bq, BQ2415X_TIMER_RESET);
0902 if (ret < 0) {
0903 bq2415x_timer_error(bq, "Resetting timer failed");
0904 return;
0905 }
0906
0907 boost = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_STATUS);
0908 if (boost < 0) {
0909 bq2415x_timer_error(bq, "Unknown error");
0910 return;
0911 }
0912
0913 error = bq2415x_exec_command(bq, BQ2415X_FAULT_STATUS);
0914 if (error < 0) {
0915 bq2415x_timer_error(bq, "Unknown error");
0916 return;
0917 }
0918
0919 if (boost) {
0920 switch (error) {
0921
0922 case 0:
0923 break;
0924 case 6:
0925 dev_err(bq->dev, "Timer expired\n");
0926 break;
0927 case 3:
0928 dev_err(bq->dev, "Battery voltage to low\n");
0929 break;
0930
0931
0932 case 1:
0933 bq2415x_timer_error(bq,
0934 "Overvoltage protection (chip fried)");
0935 return;
0936 case 2:
0937 bq2415x_timer_error(bq, "Overload");
0938 return;
0939 case 4:
0940 bq2415x_timer_error(bq,
0941 "Battery overvoltage protection");
0942 return;
0943 case 5:
0944 bq2415x_timer_error(bq,
0945 "Thermal shutdown (too hot)");
0946 return;
0947 case 7:
0948 bq2415x_timer_error(bq, "Unknown error");
0949 return;
0950 }
0951 } else {
0952 switch (error) {
0953
0954 case 0:
0955 break;
0956 case 2:
0957 dev_err(bq->dev, "Sleep mode\n");
0958 break;
0959 case 3:
0960 dev_err(bq->dev, "Poor input source\n");
0961 break;
0962 case 6:
0963 dev_err(bq->dev, "Timer expired\n");
0964 break;
0965 case 7:
0966 dev_err(bq->dev, "No battery\n");
0967 break;
0968
0969
0970 case 1:
0971 bq2415x_timer_error(bq,
0972 "Overvoltage protection (chip fried)");
0973 return;
0974 case 4:
0975 bq2415x_timer_error(bq,
0976 "Battery overvoltage protection");
0977 return;
0978 case 5:
0979 bq2415x_timer_error(bq,
0980 "Thermal shutdown (too hot)");
0981 return;
0982 }
0983 }
0984
0985 schedule_delayed_work(&bq->work, BQ2415X_TIMER_TIMEOUT * HZ);
0986 }
0987
0988
0989
0990 static enum power_supply_property bq2415x_power_supply_props[] = {
0991
0992 POWER_SUPPLY_PROP_STATUS,
0993 POWER_SUPPLY_PROP_MODEL_NAME,
0994 };
0995
0996 static int bq2415x_power_supply_get_property(struct power_supply *psy,
0997 enum power_supply_property psp,
0998 union power_supply_propval *val)
0999 {
1000 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1001 int ret;
1002
1003 switch (psp) {
1004 case POWER_SUPPLY_PROP_STATUS:
1005 ret = bq2415x_exec_command(bq, BQ2415X_CHARGE_STATUS);
1006 if (ret < 0)
1007 return ret;
1008 else if (ret == 0)
1009 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
1010 else if (ret == 1)
1011 val->intval = POWER_SUPPLY_STATUS_CHARGING;
1012 else if (ret == 2)
1013 val->intval = POWER_SUPPLY_STATUS_FULL;
1014 else
1015 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
1016 break;
1017 case POWER_SUPPLY_PROP_MODEL_NAME:
1018 val->strval = bq->model;
1019 break;
1020 default:
1021 return -EINVAL;
1022 }
1023 return 0;
1024 }
1025
1026 static void bq2415x_power_supply_exit(struct bq2415x_device *bq)
1027 {
1028 bq->autotimer = 0;
1029 if (bq->automode > 0)
1030 bq->automode = 0;
1031 cancel_delayed_work_sync(&bq->work);
1032 power_supply_unregister(bq->charger);
1033 kfree(bq->model);
1034 }
1035
1036
1037
1038
1039 static ssize_t bq2415x_sysfs_show_status(struct device *dev,
1040 struct device_attribute *attr,
1041 char *buf)
1042 {
1043 struct power_supply *psy = dev_get_drvdata(dev);
1044 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1045 enum bq2415x_command command;
1046 int ret;
1047
1048 if (strcmp(attr->attr.name, "otg_status") == 0)
1049 command = BQ2415X_OTG_STATUS;
1050 else if (strcmp(attr->attr.name, "charge_status") == 0)
1051 command = BQ2415X_CHARGE_STATUS;
1052 else if (strcmp(attr->attr.name, "boost_status") == 0)
1053 command = BQ2415X_BOOST_STATUS;
1054 else if (strcmp(attr->attr.name, "fault_status") == 0)
1055 command = BQ2415X_FAULT_STATUS;
1056 else
1057 return -EINVAL;
1058
1059 ret = bq2415x_exec_command(bq, command);
1060 if (ret < 0)
1061 return ret;
1062 return sprintf(buf, "%d\n", ret);
1063 }
1064
1065
1066
1067
1068
1069
1070
1071 static ssize_t bq2415x_sysfs_set_timer(struct device *dev,
1072 struct device_attribute *attr,
1073 const char *buf,
1074 size_t count)
1075 {
1076 struct power_supply *psy = dev_get_drvdata(dev);
1077 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1078 int ret = 0;
1079
1080 if (strncmp(buf, "auto", 4) == 0)
1081 bq2415x_set_autotimer(bq, 1);
1082 else if (strncmp(buf, "off", 3) == 0)
1083 bq2415x_set_autotimer(bq, 0);
1084 else
1085 ret = bq2415x_exec_command(bq, BQ2415X_TIMER_RESET);
1086
1087 if (ret < 0)
1088 return ret;
1089 return count;
1090 }
1091
1092
1093 static ssize_t bq2415x_sysfs_show_timer(struct device *dev,
1094 struct device_attribute *attr,
1095 char *buf)
1096 {
1097 struct power_supply *psy = dev_get_drvdata(dev);
1098 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1099
1100 if (bq->timer_error)
1101 return sprintf(buf, "%s\n", bq->timer_error);
1102
1103 if (bq->autotimer)
1104 return sprintf(buf, "auto\n");
1105 return sprintf(buf, "off\n");
1106 }
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116 static ssize_t bq2415x_sysfs_set_mode(struct device *dev,
1117 struct device_attribute *attr,
1118 const char *buf,
1119 size_t count)
1120 {
1121 struct power_supply *psy = dev_get_drvdata(dev);
1122 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1123 enum bq2415x_mode mode;
1124 int ret = 0;
1125
1126 if (strncmp(buf, "auto", 4) == 0) {
1127 if (bq->automode < 0)
1128 return -EINVAL;
1129 bq->automode = 1;
1130 mode = bq->reported_mode;
1131 } else if (strncmp(buf, "off", 3) == 0) {
1132 if (bq->automode > 0)
1133 bq->automode = 0;
1134 mode = BQ2415X_MODE_OFF;
1135 } else if (strncmp(buf, "none", 4) == 0) {
1136 if (bq->automode > 0)
1137 bq->automode = 0;
1138 mode = BQ2415X_MODE_NONE;
1139 } else if (strncmp(buf, "host", 4) == 0) {
1140 if (bq->automode > 0)
1141 bq->automode = 0;
1142 mode = BQ2415X_MODE_HOST_CHARGER;
1143 } else if (strncmp(buf, "dedicated", 9) == 0) {
1144 if (bq->automode > 0)
1145 bq->automode = 0;
1146 mode = BQ2415X_MODE_DEDICATED_CHARGER;
1147 } else if (strncmp(buf, "boost", 5) == 0) {
1148 if (bq->automode > 0)
1149 bq->automode = 0;
1150 mode = BQ2415X_MODE_BOOST;
1151 } else if (strncmp(buf, "reset", 5) == 0) {
1152 bq2415x_reset_chip(bq);
1153 bq2415x_set_defaults(bq);
1154 if (bq->automode <= 0)
1155 return count;
1156 bq->automode = 1;
1157 mode = bq->reported_mode;
1158 } else {
1159 return -EINVAL;
1160 }
1161
1162 ret = bq2415x_set_mode(bq, mode);
1163 if (ret < 0)
1164 return ret;
1165 return count;
1166 }
1167
1168
1169 static ssize_t bq2415x_sysfs_show_mode(struct device *dev,
1170 struct device_attribute *attr,
1171 char *buf)
1172 {
1173 struct power_supply *psy = dev_get_drvdata(dev);
1174 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1175 ssize_t ret = 0;
1176
1177 if (bq->automode > 0)
1178 ret += sprintf(buf+ret, "auto (");
1179
1180 switch (bq->mode) {
1181 case BQ2415X_MODE_OFF:
1182 ret += sprintf(buf+ret, "off");
1183 break;
1184 case BQ2415X_MODE_NONE:
1185 ret += sprintf(buf+ret, "none");
1186 break;
1187 case BQ2415X_MODE_HOST_CHARGER:
1188 ret += sprintf(buf+ret, "host");
1189 break;
1190 case BQ2415X_MODE_DEDICATED_CHARGER:
1191 ret += sprintf(buf+ret, "dedicated");
1192 break;
1193 case BQ2415X_MODE_BOOST:
1194 ret += sprintf(buf+ret, "boost");
1195 break;
1196 }
1197
1198 if (bq->automode > 0)
1199 ret += sprintf(buf+ret, ")");
1200
1201 ret += sprintf(buf+ret, "\n");
1202 return ret;
1203 }
1204
1205
1206 static ssize_t bq2415x_sysfs_show_reported_mode(struct device *dev,
1207 struct device_attribute *attr,
1208 char *buf)
1209 {
1210 struct power_supply *psy = dev_get_drvdata(dev);
1211 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1212
1213 if (bq->automode < 0)
1214 return -EINVAL;
1215
1216 switch (bq->reported_mode) {
1217 case BQ2415X_MODE_OFF:
1218 return sprintf(buf, "off\n");
1219 case BQ2415X_MODE_NONE:
1220 return sprintf(buf, "none\n");
1221 case BQ2415X_MODE_HOST_CHARGER:
1222 return sprintf(buf, "host\n");
1223 case BQ2415X_MODE_DEDICATED_CHARGER:
1224 return sprintf(buf, "dedicated\n");
1225 case BQ2415X_MODE_BOOST:
1226 return sprintf(buf, "boost\n");
1227 }
1228
1229 return -EINVAL;
1230 }
1231
1232
1233 static ssize_t bq2415x_sysfs_set_registers(struct device *dev,
1234 struct device_attribute *attr,
1235 const char *buf,
1236 size_t count)
1237 {
1238 struct power_supply *psy = dev_get_drvdata(dev);
1239 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1240 ssize_t ret = 0;
1241 unsigned int reg;
1242 unsigned int val;
1243
1244 if (sscanf(buf, "%x %x", ®, &val) != 2)
1245 return -EINVAL;
1246
1247 if (reg > 4 || val > 255)
1248 return -EINVAL;
1249
1250 ret = bq2415x_i2c_write(bq, reg, val);
1251 if (ret < 0)
1252 return ret;
1253 return count;
1254 }
1255
1256
1257 static ssize_t bq2415x_sysfs_print_reg(struct bq2415x_device *bq,
1258 u8 reg,
1259 char *buf)
1260 {
1261 int ret = bq2415x_i2c_read(bq, reg);
1262
1263 if (ret < 0)
1264 return sprintf(buf, "%#.2x=error %d\n", reg, ret);
1265 return sprintf(buf, "%#.2x=%#.2x\n", reg, ret);
1266 }
1267
1268
1269 static ssize_t bq2415x_sysfs_show_registers(struct device *dev,
1270 struct device_attribute *attr,
1271 char *buf)
1272 {
1273 struct power_supply *psy = dev_get_drvdata(dev);
1274 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1275 ssize_t ret = 0;
1276
1277 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_STATUS, buf+ret);
1278 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_CONTROL, buf+ret);
1279 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_VOLTAGE, buf+ret);
1280 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_VENDER, buf+ret);
1281 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_CURRENT, buf+ret);
1282 return ret;
1283 }
1284
1285
1286 static ssize_t bq2415x_sysfs_set_limit(struct device *dev,
1287 struct device_attribute *attr,
1288 const char *buf,
1289 size_t count)
1290 {
1291 struct power_supply *psy = dev_get_drvdata(dev);
1292 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1293 long val;
1294 int ret;
1295
1296 if (kstrtol(buf, 10, &val) < 0)
1297 return -EINVAL;
1298
1299 if (strcmp(attr->attr.name, "current_limit") == 0)
1300 ret = bq2415x_set_current_limit(bq, val);
1301 else if (strcmp(attr->attr.name, "weak_battery_voltage") == 0)
1302 ret = bq2415x_set_weak_battery_voltage(bq, val);
1303 else if (strcmp(attr->attr.name, "battery_regulation_voltage") == 0)
1304 ret = bq2415x_set_battery_regulation_voltage(bq, val);
1305 else if (strcmp(attr->attr.name, "charge_current") == 0)
1306 ret = bq2415x_set_charge_current(bq, val);
1307 else if (strcmp(attr->attr.name, "termination_current") == 0)
1308 ret = bq2415x_set_termination_current(bq, val);
1309 else
1310 return -EINVAL;
1311
1312 if (ret < 0)
1313 return ret;
1314 return count;
1315 }
1316
1317
1318 static ssize_t bq2415x_sysfs_show_limit(struct device *dev,
1319 struct device_attribute *attr,
1320 char *buf)
1321 {
1322 struct power_supply *psy = dev_get_drvdata(dev);
1323 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1324 int ret;
1325
1326 if (strcmp(attr->attr.name, "current_limit") == 0)
1327 ret = bq2415x_get_current_limit(bq);
1328 else if (strcmp(attr->attr.name, "weak_battery_voltage") == 0)
1329 ret = bq2415x_get_weak_battery_voltage(bq);
1330 else if (strcmp(attr->attr.name, "battery_regulation_voltage") == 0)
1331 ret = bq2415x_get_battery_regulation_voltage(bq);
1332 else if (strcmp(attr->attr.name, "charge_current") == 0)
1333 ret = bq2415x_get_charge_current(bq);
1334 else if (strcmp(attr->attr.name, "termination_current") == 0)
1335 ret = bq2415x_get_termination_current(bq);
1336 else
1337 return -EINVAL;
1338
1339 if (ret < 0)
1340 return ret;
1341 return sprintf(buf, "%d\n", ret);
1342 }
1343
1344
1345 static ssize_t bq2415x_sysfs_set_enable(struct device *dev,
1346 struct device_attribute *attr,
1347 const char *buf,
1348 size_t count)
1349 {
1350 struct power_supply *psy = dev_get_drvdata(dev);
1351 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1352 enum bq2415x_command command;
1353 long val;
1354 int ret;
1355
1356 if (kstrtol(buf, 10, &val) < 0)
1357 return -EINVAL;
1358
1359 if (strcmp(attr->attr.name, "charge_termination_enable") == 0)
1360 command = val ? BQ2415X_CHARGE_TERMINATION_ENABLE :
1361 BQ2415X_CHARGE_TERMINATION_DISABLE;
1362 else if (strcmp(attr->attr.name, "high_impedance_enable") == 0)
1363 command = val ? BQ2415X_HIGH_IMPEDANCE_ENABLE :
1364 BQ2415X_HIGH_IMPEDANCE_DISABLE;
1365 else if (strcmp(attr->attr.name, "otg_pin_enable") == 0)
1366 command = val ? BQ2415X_OTG_PIN_ENABLE :
1367 BQ2415X_OTG_PIN_DISABLE;
1368 else if (strcmp(attr->attr.name, "stat_pin_enable") == 0)
1369 command = val ? BQ2415X_STAT_PIN_ENABLE :
1370 BQ2415X_STAT_PIN_DISABLE;
1371 else
1372 return -EINVAL;
1373
1374 ret = bq2415x_exec_command(bq, command);
1375 if (ret < 0)
1376 return ret;
1377 return count;
1378 }
1379
1380
1381 static ssize_t bq2415x_sysfs_show_enable(struct device *dev,
1382 struct device_attribute *attr,
1383 char *buf)
1384 {
1385 struct power_supply *psy = dev_get_drvdata(dev);
1386 struct bq2415x_device *bq = power_supply_get_drvdata(psy);
1387 enum bq2415x_command command;
1388 int ret;
1389
1390 if (strcmp(attr->attr.name, "charge_termination_enable") == 0)
1391 command = BQ2415X_CHARGE_TERMINATION_STATUS;
1392 else if (strcmp(attr->attr.name, "high_impedance_enable") == 0)
1393 command = BQ2415X_HIGH_IMPEDANCE_STATUS;
1394 else if (strcmp(attr->attr.name, "otg_pin_enable") == 0)
1395 command = BQ2415X_OTG_PIN_STATUS;
1396 else if (strcmp(attr->attr.name, "stat_pin_enable") == 0)
1397 command = BQ2415X_STAT_PIN_STATUS;
1398 else
1399 return -EINVAL;
1400
1401 ret = bq2415x_exec_command(bq, command);
1402 if (ret < 0)
1403 return ret;
1404 return sprintf(buf, "%d\n", ret);
1405 }
1406
1407 static DEVICE_ATTR(current_limit, S_IWUSR | S_IRUGO,
1408 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
1409 static DEVICE_ATTR(weak_battery_voltage, S_IWUSR | S_IRUGO,
1410 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
1411 static DEVICE_ATTR(battery_regulation_voltage, S_IWUSR | S_IRUGO,
1412 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
1413 static DEVICE_ATTR(charge_current, S_IWUSR | S_IRUGO,
1414 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
1415 static DEVICE_ATTR(termination_current, S_IWUSR | S_IRUGO,
1416 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit);
1417
1418 static DEVICE_ATTR(charge_termination_enable, S_IWUSR | S_IRUGO,
1419 bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable);
1420 static DEVICE_ATTR(high_impedance_enable, S_IWUSR | S_IRUGO,
1421 bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable);
1422 static DEVICE_ATTR(otg_pin_enable, S_IWUSR | S_IRUGO,
1423 bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable);
1424 static DEVICE_ATTR(stat_pin_enable, S_IWUSR | S_IRUGO,
1425 bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable);
1426
1427 static DEVICE_ATTR(reported_mode, S_IRUGO,
1428 bq2415x_sysfs_show_reported_mode, NULL);
1429 static DEVICE_ATTR(mode, S_IWUSR | S_IRUGO,
1430 bq2415x_sysfs_show_mode, bq2415x_sysfs_set_mode);
1431 static DEVICE_ATTR(timer, S_IWUSR | S_IRUGO,
1432 bq2415x_sysfs_show_timer, bq2415x_sysfs_set_timer);
1433
1434 static DEVICE_ATTR(registers, S_IWUSR | S_IRUGO,
1435 bq2415x_sysfs_show_registers, bq2415x_sysfs_set_registers);
1436
1437 static DEVICE_ATTR(otg_status, S_IRUGO, bq2415x_sysfs_show_status, NULL);
1438 static DEVICE_ATTR(charge_status, S_IRUGO, bq2415x_sysfs_show_status, NULL);
1439 static DEVICE_ATTR(boost_status, S_IRUGO, bq2415x_sysfs_show_status, NULL);
1440 static DEVICE_ATTR(fault_status, S_IRUGO, bq2415x_sysfs_show_status, NULL);
1441
1442 static struct attribute *bq2415x_sysfs_attrs[] = {
1443
1444
1445
1446
1447 &dev_attr_current_limit.attr,
1448 &dev_attr_weak_battery_voltage.attr,
1449 &dev_attr_battery_regulation_voltage.attr,
1450 &dev_attr_charge_current.attr,
1451 &dev_attr_termination_current.attr,
1452
1453 &dev_attr_charge_termination_enable.attr,
1454 &dev_attr_high_impedance_enable.attr,
1455 &dev_attr_otg_pin_enable.attr,
1456 &dev_attr_stat_pin_enable.attr,
1457
1458 &dev_attr_reported_mode.attr,
1459 &dev_attr_mode.attr,
1460 &dev_attr_timer.attr,
1461
1462 &dev_attr_registers.attr,
1463
1464 &dev_attr_otg_status.attr,
1465 &dev_attr_charge_status.attr,
1466 &dev_attr_boost_status.attr,
1467 &dev_attr_fault_status.attr,
1468 NULL,
1469 };
1470
1471 ATTRIBUTE_GROUPS(bq2415x_sysfs);
1472
1473 static int bq2415x_power_supply_init(struct bq2415x_device *bq)
1474 {
1475 int ret;
1476 int chip;
1477 char revstr[8];
1478 struct power_supply_config psy_cfg = {
1479 .drv_data = bq,
1480 .of_node = bq->dev->of_node,
1481 .attr_grp = bq2415x_sysfs_groups,
1482 };
1483
1484 bq->charger_desc.name = bq->name;
1485 bq->charger_desc.type = POWER_SUPPLY_TYPE_USB;
1486 bq->charger_desc.properties = bq2415x_power_supply_props;
1487 bq->charger_desc.num_properties =
1488 ARRAY_SIZE(bq2415x_power_supply_props);
1489 bq->charger_desc.get_property = bq2415x_power_supply_get_property;
1490
1491 ret = bq2415x_detect_chip(bq);
1492 if (ret < 0)
1493 chip = BQUNKNOWN;
1494 else
1495 chip = ret;
1496
1497 ret = bq2415x_detect_revision(bq);
1498 if (ret < 0)
1499 strcpy(revstr, "unknown");
1500 else
1501 sprintf(revstr, "1.%d", ret);
1502
1503 bq->model = kasprintf(GFP_KERNEL,
1504 "chip %s, revision %s, vender code %.3d",
1505 bq2415x_chip_name[chip], revstr,
1506 bq2415x_get_vender_code(bq));
1507 if (!bq->model) {
1508 dev_err(bq->dev, "failed to allocate model name\n");
1509 return -ENOMEM;
1510 }
1511
1512 bq->charger = power_supply_register(bq->dev, &bq->charger_desc,
1513 &psy_cfg);
1514 if (IS_ERR(bq->charger)) {
1515 kfree(bq->model);
1516 return PTR_ERR(bq->charger);
1517 }
1518
1519 return 0;
1520 }
1521
1522
1523 static int bq2415x_probe(struct i2c_client *client,
1524 const struct i2c_device_id *id)
1525 {
1526 int ret;
1527 int num;
1528 char *name = NULL;
1529 struct bq2415x_device *bq;
1530 struct device_node *np = client->dev.of_node;
1531 struct bq2415x_platform_data *pdata = client->dev.platform_data;
1532 const struct acpi_device_id *acpi_id = NULL;
1533 struct power_supply *notify_psy = NULL;
1534 union power_supply_propval prop;
1535
1536 if (!np && !pdata && !ACPI_HANDLE(&client->dev)) {
1537 dev_err(&client->dev, "Neither devicetree, nor platform data, nor ACPI support\n");
1538 return -ENODEV;
1539 }
1540
1541
1542 mutex_lock(&bq2415x_id_mutex);
1543 num = idr_alloc(&bq2415x_id, client, 0, 0, GFP_KERNEL);
1544 mutex_unlock(&bq2415x_id_mutex);
1545 if (num < 0)
1546 return num;
1547
1548 if (id) {
1549 name = kasprintf(GFP_KERNEL, "%s-%d", id->name, num);
1550 } else if (ACPI_HANDLE(&client->dev)) {
1551 acpi_id =
1552 acpi_match_device(client->dev.driver->acpi_match_table,
1553 &client->dev);
1554 if (!acpi_id) {
1555 dev_err(&client->dev, "failed to match device name\n");
1556 ret = -ENODEV;
1557 goto error_1;
1558 }
1559 name = kasprintf(GFP_KERNEL, "%s-%d", acpi_id->id, num);
1560 }
1561 if (!name) {
1562 dev_err(&client->dev, "failed to allocate device name\n");
1563 ret = -ENOMEM;
1564 goto error_1;
1565 }
1566
1567 bq = devm_kzalloc(&client->dev, sizeof(*bq), GFP_KERNEL);
1568 if (!bq) {
1569 ret = -ENOMEM;
1570 goto error_2;
1571 }
1572
1573 i2c_set_clientdata(client, bq);
1574
1575 bq->id = num;
1576 bq->dev = &client->dev;
1577 if (id)
1578 bq->chip = id->driver_data;
1579 else if (ACPI_HANDLE(bq->dev))
1580 bq->chip = acpi_id->driver_data;
1581 bq->name = name;
1582 bq->mode = BQ2415X_MODE_OFF;
1583 bq->reported_mode = BQ2415X_MODE_OFF;
1584 bq->autotimer = 0;
1585 bq->automode = 0;
1586
1587 if (np || ACPI_HANDLE(bq->dev)) {
1588 ret = device_property_read_u32(bq->dev,
1589 "ti,current-limit",
1590 &bq->init_data.current_limit);
1591 if (ret)
1592 goto error_2;
1593 ret = device_property_read_u32(bq->dev,
1594 "ti,weak-battery-voltage",
1595 &bq->init_data.weak_battery_voltage);
1596 if (ret)
1597 goto error_2;
1598 ret = device_property_read_u32(bq->dev,
1599 "ti,battery-regulation-voltage",
1600 &bq->init_data.battery_regulation_voltage);
1601 if (ret)
1602 goto error_2;
1603 ret = device_property_read_u32(bq->dev,
1604 "ti,charge-current",
1605 &bq->init_data.charge_current);
1606 if (ret)
1607 goto error_2;
1608 ret = device_property_read_u32(bq->dev,
1609 "ti,termination-current",
1610 &bq->init_data.termination_current);
1611 if (ret)
1612 goto error_2;
1613 ret = device_property_read_u32(bq->dev,
1614 "ti,resistor-sense",
1615 &bq->init_data.resistor_sense);
1616 if (ret)
1617 goto error_2;
1618 if (np)
1619 bq->notify_node = of_parse_phandle(np,
1620 "ti,usb-charger-detection", 0);
1621 } else {
1622 memcpy(&bq->init_data, pdata, sizeof(bq->init_data));
1623 }
1624
1625 bq2415x_reset_chip(bq);
1626
1627 ret = bq2415x_power_supply_init(bq);
1628 if (ret) {
1629 dev_err(bq->dev, "failed to register power supply: %d\n", ret);
1630 goto error_2;
1631 }
1632
1633 ret = bq2415x_set_defaults(bq);
1634 if (ret) {
1635 dev_err(bq->dev, "failed to set default values: %d\n", ret);
1636 goto error_3;
1637 }
1638
1639 if (bq->notify_node || bq->init_data.notify_device) {
1640 bq->nb.notifier_call = bq2415x_notifier_call;
1641 ret = power_supply_reg_notifier(&bq->nb);
1642 if (ret) {
1643 dev_err(bq->dev, "failed to reg notifier: %d\n", ret);
1644 goto error_3;
1645 }
1646
1647 bq->automode = 1;
1648 dev_info(bq->dev, "automode supported, waiting for events\n");
1649 } else {
1650 bq->automode = -1;
1651 dev_info(bq->dev, "automode not supported\n");
1652 }
1653
1654
1655 if (bq->nb.notifier_call) {
1656 if (np) {
1657 notify_psy = power_supply_get_by_phandle(np,
1658 "ti,usb-charger-detection");
1659 if (IS_ERR(notify_psy))
1660 notify_psy = NULL;
1661 } else if (bq->init_data.notify_device) {
1662 notify_psy = power_supply_get_by_name(
1663 bq->init_data.notify_device);
1664 }
1665 }
1666 if (notify_psy) {
1667 ret = power_supply_get_property(notify_psy,
1668 POWER_SUPPLY_PROP_CURRENT_MAX, &prop);
1669 power_supply_put(notify_psy);
1670
1671 if (ret == 0) {
1672 bq2415x_update_reported_mode(bq, prop.intval);
1673 bq2415x_set_mode(bq, bq->reported_mode);
1674 }
1675 }
1676
1677 INIT_DELAYED_WORK(&bq->work, bq2415x_timer_work);
1678 bq2415x_set_autotimer(bq, 1);
1679
1680 dev_info(bq->dev, "driver registered\n");
1681 return 0;
1682
1683 error_3:
1684 bq2415x_power_supply_exit(bq);
1685 error_2:
1686 if (bq)
1687 of_node_put(bq->notify_node);
1688 kfree(name);
1689 error_1:
1690 mutex_lock(&bq2415x_id_mutex);
1691 idr_remove(&bq2415x_id, num);
1692 mutex_unlock(&bq2415x_id_mutex);
1693
1694 return ret;
1695 }
1696
1697
1698
1699 static int bq2415x_remove(struct i2c_client *client)
1700 {
1701 struct bq2415x_device *bq = i2c_get_clientdata(client);
1702
1703 if (bq->nb.notifier_call)
1704 power_supply_unreg_notifier(&bq->nb);
1705
1706 of_node_put(bq->notify_node);
1707 bq2415x_power_supply_exit(bq);
1708
1709 bq2415x_reset_chip(bq);
1710
1711 mutex_lock(&bq2415x_id_mutex);
1712 idr_remove(&bq2415x_id, bq->id);
1713 mutex_unlock(&bq2415x_id_mutex);
1714
1715 dev_info(bq->dev, "driver unregistered\n");
1716
1717 kfree(bq->name);
1718
1719 return 0;
1720 }
1721
1722 static const struct i2c_device_id bq2415x_i2c_id_table[] = {
1723 { "bq2415x", BQUNKNOWN },
1724 { "bq24150", BQ24150 },
1725 { "bq24150a", BQ24150A },
1726 { "bq24151", BQ24151 },
1727 { "bq24151a", BQ24151A },
1728 { "bq24152", BQ24152 },
1729 { "bq24153", BQ24153 },
1730 { "bq24153a", BQ24153A },
1731 { "bq24155", BQ24155 },
1732 { "bq24156", BQ24156 },
1733 { "bq24156a", BQ24156A },
1734 { "bq24157s", BQ24157S },
1735 { "bq24158", BQ24158 },
1736 {},
1737 };
1738 MODULE_DEVICE_TABLE(i2c, bq2415x_i2c_id_table);
1739
1740 #ifdef CONFIG_ACPI
1741 static const struct acpi_device_id bq2415x_i2c_acpi_match[] = {
1742 { "BQ2415X", BQUNKNOWN },
1743 { "BQ241500", BQ24150 },
1744 { "BQA24150", BQ24150A },
1745 { "BQ241510", BQ24151 },
1746 { "BQA24151", BQ24151A },
1747 { "BQ241520", BQ24152 },
1748 { "BQ241530", BQ24153 },
1749 { "BQA24153", BQ24153A },
1750 { "BQ241550", BQ24155 },
1751 { "BQ241560", BQ24156 },
1752 { "BQA24156", BQ24156A },
1753 { "BQS24157", BQ24157S },
1754 { "BQ241580", BQ24158 },
1755 {},
1756 };
1757 MODULE_DEVICE_TABLE(acpi, bq2415x_i2c_acpi_match);
1758 #endif
1759
1760 #ifdef CONFIG_OF
1761 static const struct of_device_id bq2415x_of_match_table[] = {
1762 { .compatible = "ti,bq24150" },
1763 { .compatible = "ti,bq24150a" },
1764 { .compatible = "ti,bq24151" },
1765 { .compatible = "ti,bq24151a" },
1766 { .compatible = "ti,bq24152" },
1767 { .compatible = "ti,bq24153" },
1768 { .compatible = "ti,bq24153a" },
1769 { .compatible = "ti,bq24155" },
1770 { .compatible = "ti,bq24156" },
1771 { .compatible = "ti,bq24156a" },
1772 { .compatible = "ti,bq24157s" },
1773 { .compatible = "ti,bq24158" },
1774 {},
1775 };
1776 MODULE_DEVICE_TABLE(of, bq2415x_of_match_table);
1777 #endif
1778
1779 static struct i2c_driver bq2415x_driver = {
1780 .driver = {
1781 .name = "bq2415x-charger",
1782 .of_match_table = of_match_ptr(bq2415x_of_match_table),
1783 .acpi_match_table = ACPI_PTR(bq2415x_i2c_acpi_match),
1784 },
1785 .probe = bq2415x_probe,
1786 .remove = bq2415x_remove,
1787 .id_table = bq2415x_i2c_id_table,
1788 };
1789 module_i2c_driver(bq2415x_driver);
1790
1791 MODULE_AUTHOR("Pali Rohár <pali@kernel.org>");
1792 MODULE_DESCRIPTION("bq2415x charger driver");
1793 MODULE_LICENSE("GPL");