Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.15-rc7 1740 lines 45 kB view raw
1/* 2 * bq2415x charger driver 3 * 4 * Copyright (C) 2011-2013 Pali Rohár <pali.rohar@gmail.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License along 17 * with this program; if not, write to the Free Software Foundation, Inc., 18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 */ 20 21/* 22 * Datasheets: 23 * http://www.ti.com/product/bq24150 24 * http://www.ti.com/product/bq24150a 25 * http://www.ti.com/product/bq24152 26 * http://www.ti.com/product/bq24153 27 * http://www.ti.com/product/bq24153a 28 * http://www.ti.com/product/bq24155 29 */ 30 31#include <linux/kernel.h> 32#include <linux/module.h> 33#include <linux/param.h> 34#include <linux/err.h> 35#include <linux/workqueue.h> 36#include <linux/sysfs.h> 37#include <linux/platform_device.h> 38#include <linux/power_supply.h> 39#include <linux/idr.h> 40#include <linux/i2c.h> 41#include <linux/slab.h> 42 43#include <linux/power/bq2415x_charger.h> 44 45/* timeout for resetting chip timer */ 46#define BQ2415X_TIMER_TIMEOUT 10 47 48#define BQ2415X_REG_STATUS 0x00 49#define BQ2415X_REG_CONTROL 0x01 50#define BQ2415X_REG_VOLTAGE 0x02 51#define BQ2415X_REG_VENDER 0x03 52#define BQ2415X_REG_CURRENT 0x04 53 54/* reset state for all registers */ 55#define BQ2415X_RESET_STATUS BIT(6) 56#define BQ2415X_RESET_CONTROL (BIT(4)|BIT(5)) 57#define BQ2415X_RESET_VOLTAGE (BIT(1)|BIT(3)) 58#define BQ2415X_RESET_CURRENT (BIT(0)|BIT(3)|BIT(7)) 59 60/* status register */ 61#define BQ2415X_BIT_TMR_RST 7 62#define BQ2415X_BIT_OTG 7 63#define BQ2415X_BIT_EN_STAT 6 64#define BQ2415X_MASK_STAT (BIT(4)|BIT(5)) 65#define BQ2415X_SHIFT_STAT 4 66#define BQ2415X_BIT_BOOST 3 67#define BQ2415X_MASK_FAULT (BIT(0)|BIT(1)|BIT(2)) 68#define BQ2415X_SHIFT_FAULT 0 69 70/* control register */ 71#define BQ2415X_MASK_LIMIT (BIT(6)|BIT(7)) 72#define BQ2415X_SHIFT_LIMIT 6 73#define BQ2415X_MASK_VLOWV (BIT(4)|BIT(5)) 74#define BQ2415X_SHIFT_VLOWV 4 75#define BQ2415X_BIT_TE 3 76#define BQ2415X_BIT_CE 2 77#define BQ2415X_BIT_HZ_MODE 1 78#define BQ2415X_BIT_OPA_MODE 0 79 80/* voltage register */ 81#define BQ2415X_MASK_VO (BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6)|BIT(7)) 82#define BQ2415X_SHIFT_VO 2 83#define BQ2415X_BIT_OTG_PL 1 84#define BQ2415X_BIT_OTG_EN 0 85 86/* vender register */ 87#define BQ2415X_MASK_VENDER (BIT(5)|BIT(6)|BIT(7)) 88#define BQ2415X_SHIFT_VENDER 5 89#define BQ2415X_MASK_PN (BIT(3)|BIT(4)) 90#define BQ2415X_SHIFT_PN 3 91#define BQ2415X_MASK_REVISION (BIT(0)|BIT(1)|BIT(2)) 92#define BQ2415X_SHIFT_REVISION 0 93 94/* current register */ 95#define BQ2415X_MASK_RESET BIT(7) 96#define BQ2415X_MASK_VI_CHRG (BIT(4)|BIT(5)|BIT(6)) 97#define BQ2415X_SHIFT_VI_CHRG 4 98/* N/A BIT(3) */ 99#define BQ2415X_MASK_VI_TERM (BIT(0)|BIT(1)|BIT(2)) 100#define BQ2415X_SHIFT_VI_TERM 0 101 102 103enum bq2415x_command { 104 BQ2415X_TIMER_RESET, 105 BQ2415X_OTG_STATUS, 106 BQ2415X_STAT_PIN_STATUS, 107 BQ2415X_STAT_PIN_ENABLE, 108 BQ2415X_STAT_PIN_DISABLE, 109 BQ2415X_CHARGE_STATUS, 110 BQ2415X_BOOST_STATUS, 111 BQ2415X_FAULT_STATUS, 112 113 BQ2415X_CHARGE_TERMINATION_STATUS, 114 BQ2415X_CHARGE_TERMINATION_ENABLE, 115 BQ2415X_CHARGE_TERMINATION_DISABLE, 116 BQ2415X_CHARGER_STATUS, 117 BQ2415X_CHARGER_ENABLE, 118 BQ2415X_CHARGER_DISABLE, 119 BQ2415X_HIGH_IMPEDANCE_STATUS, 120 BQ2415X_HIGH_IMPEDANCE_ENABLE, 121 BQ2415X_HIGH_IMPEDANCE_DISABLE, 122 BQ2415X_BOOST_MODE_STATUS, 123 BQ2415X_BOOST_MODE_ENABLE, 124 BQ2415X_BOOST_MODE_DISABLE, 125 126 BQ2415X_OTG_LEVEL, 127 BQ2415X_OTG_ACTIVATE_HIGH, 128 BQ2415X_OTG_ACTIVATE_LOW, 129 BQ2415X_OTG_PIN_STATUS, 130 BQ2415X_OTG_PIN_ENABLE, 131 BQ2415X_OTG_PIN_DISABLE, 132 133 BQ2415X_VENDER_CODE, 134 BQ2415X_PART_NUMBER, 135 BQ2415X_REVISION, 136}; 137 138enum bq2415x_chip { 139 BQUNKNOWN, 140 BQ24150, 141 BQ24150A, 142 BQ24151, 143 BQ24151A, 144 BQ24152, 145 BQ24153, 146 BQ24153A, 147 BQ24155, 148 BQ24156, 149 BQ24156A, 150 BQ24158, 151}; 152 153static char *bq2415x_chip_name[] = { 154 "unknown", 155 "bq24150", 156 "bq24150a", 157 "bq24151", 158 "bq24151a", 159 "bq24152", 160 "bq24153", 161 "bq24153a", 162 "bq24155", 163 "bq24156", 164 "bq24156a", 165 "bq24158", 166}; 167 168struct bq2415x_device { 169 struct device *dev; 170 struct bq2415x_platform_data init_data; 171 struct power_supply charger; 172 struct delayed_work work; 173 struct power_supply *notify_psy; 174 struct notifier_block nb; 175 enum bq2415x_mode reported_mode;/* mode reported by hook function */ 176 enum bq2415x_mode mode; /* current configured mode */ 177 enum bq2415x_chip chip; 178 const char *timer_error; 179 char *model; 180 char *name; 181 int autotimer; /* 1 - if driver automatically reset timer, 0 - not */ 182 int automode; /* 1 - enabled, 0 - disabled; -1 - not supported */ 183 int id; 184}; 185 186/* each registered chip must have unique id */ 187static DEFINE_IDR(bq2415x_id); 188 189static DEFINE_MUTEX(bq2415x_id_mutex); 190static DEFINE_MUTEX(bq2415x_timer_mutex); 191static DEFINE_MUTEX(bq2415x_i2c_mutex); 192 193/**** i2c read functions ****/ 194 195/* read value from register */ 196static int bq2415x_i2c_read(struct bq2415x_device *bq, u8 reg) 197{ 198 struct i2c_client *client = to_i2c_client(bq->dev); 199 struct i2c_msg msg[2]; 200 u8 val; 201 int ret; 202 203 if (!client->adapter) 204 return -ENODEV; 205 206 msg[0].addr = client->addr; 207 msg[0].flags = 0; 208 msg[0].buf = &reg; 209 msg[0].len = sizeof(reg); 210 msg[1].addr = client->addr; 211 msg[1].flags = I2C_M_RD; 212 msg[1].buf = &val; 213 msg[1].len = sizeof(val); 214 215 mutex_lock(&bq2415x_i2c_mutex); 216 ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); 217 mutex_unlock(&bq2415x_i2c_mutex); 218 219 if (ret < 0) 220 return ret; 221 222 return val; 223} 224 225/* read value from register, apply mask and right shift it */ 226static int bq2415x_i2c_read_mask(struct bq2415x_device *bq, u8 reg, 227 u8 mask, u8 shift) 228{ 229 int ret; 230 231 if (shift > 8) 232 return -EINVAL; 233 234 ret = bq2415x_i2c_read(bq, reg); 235 if (ret < 0) 236 return ret; 237 return (ret & mask) >> shift; 238} 239 240/* read value from register and return one specified bit */ 241static int bq2415x_i2c_read_bit(struct bq2415x_device *bq, u8 reg, u8 bit) 242{ 243 if (bit > 8) 244 return -EINVAL; 245 return bq2415x_i2c_read_mask(bq, reg, BIT(bit), bit); 246} 247 248/**** i2c write functions ****/ 249 250/* write value to register */ 251static int bq2415x_i2c_write(struct bq2415x_device *bq, u8 reg, u8 val) 252{ 253 struct i2c_client *client = to_i2c_client(bq->dev); 254 struct i2c_msg msg[1]; 255 u8 data[2]; 256 int ret; 257 258 data[0] = reg; 259 data[1] = val; 260 261 msg[0].addr = client->addr; 262 msg[0].flags = 0; 263 msg[0].buf = data; 264 msg[0].len = ARRAY_SIZE(data); 265 266 mutex_lock(&bq2415x_i2c_mutex); 267 ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); 268 mutex_unlock(&bq2415x_i2c_mutex); 269 270 /* i2c_transfer returns number of messages transferred */ 271 if (ret < 0) 272 return ret; 273 else if (ret != 1) 274 return -EIO; 275 276 return 0; 277} 278 279/* read value from register, change it with mask left shifted and write back */ 280static int bq2415x_i2c_write_mask(struct bq2415x_device *bq, u8 reg, u8 val, 281 u8 mask, u8 shift) 282{ 283 int ret; 284 285 if (shift > 8) 286 return -EINVAL; 287 288 ret = bq2415x_i2c_read(bq, reg); 289 if (ret < 0) 290 return ret; 291 292 ret &= ~mask; 293 ret |= val << shift; 294 295 return bq2415x_i2c_write(bq, reg, ret); 296} 297 298/* change only one bit in register */ 299static int bq2415x_i2c_write_bit(struct bq2415x_device *bq, u8 reg, 300 bool val, u8 bit) 301{ 302 if (bit > 8) 303 return -EINVAL; 304 return bq2415x_i2c_write_mask(bq, reg, val, BIT(bit), bit); 305} 306 307/**** global functions ****/ 308 309/* exec command function */ 310static int bq2415x_exec_command(struct bq2415x_device *bq, 311 enum bq2415x_command command) 312{ 313 int ret; 314 315 switch (command) { 316 case BQ2415X_TIMER_RESET: 317 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS, 318 1, BQ2415X_BIT_TMR_RST); 319 case BQ2415X_OTG_STATUS: 320 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS, 321 BQ2415X_BIT_OTG); 322 case BQ2415X_STAT_PIN_STATUS: 323 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS, 324 BQ2415X_BIT_EN_STAT); 325 case BQ2415X_STAT_PIN_ENABLE: 326 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS, 1, 327 BQ2415X_BIT_EN_STAT); 328 case BQ2415X_STAT_PIN_DISABLE: 329 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_STATUS, 0, 330 BQ2415X_BIT_EN_STAT); 331 case BQ2415X_CHARGE_STATUS: 332 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_STATUS, 333 BQ2415X_MASK_STAT, BQ2415X_SHIFT_STAT); 334 case BQ2415X_BOOST_STATUS: 335 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_STATUS, 336 BQ2415X_BIT_BOOST); 337 case BQ2415X_FAULT_STATUS: 338 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_STATUS, 339 BQ2415X_MASK_FAULT, BQ2415X_SHIFT_FAULT); 340 341 case BQ2415X_CHARGE_TERMINATION_STATUS: 342 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL, 343 BQ2415X_BIT_TE); 344 case BQ2415X_CHARGE_TERMINATION_ENABLE: 345 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL, 346 1, BQ2415X_BIT_TE); 347 case BQ2415X_CHARGE_TERMINATION_DISABLE: 348 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL, 349 0, BQ2415X_BIT_TE); 350 case BQ2415X_CHARGER_STATUS: 351 ret = bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL, 352 BQ2415X_BIT_CE); 353 if (ret < 0) 354 return ret; 355 else 356 return ret > 0 ? 0 : 1; 357 case BQ2415X_CHARGER_ENABLE: 358 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL, 359 0, BQ2415X_BIT_CE); 360 case BQ2415X_CHARGER_DISABLE: 361 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL, 362 1, BQ2415X_BIT_CE); 363 case BQ2415X_HIGH_IMPEDANCE_STATUS: 364 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL, 365 BQ2415X_BIT_HZ_MODE); 366 case BQ2415X_HIGH_IMPEDANCE_ENABLE: 367 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL, 368 1, BQ2415X_BIT_HZ_MODE); 369 case BQ2415X_HIGH_IMPEDANCE_DISABLE: 370 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL, 371 0, BQ2415X_BIT_HZ_MODE); 372 case BQ2415X_BOOST_MODE_STATUS: 373 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_CONTROL, 374 BQ2415X_BIT_OPA_MODE); 375 case BQ2415X_BOOST_MODE_ENABLE: 376 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL, 377 1, BQ2415X_BIT_OPA_MODE); 378 case BQ2415X_BOOST_MODE_DISABLE: 379 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_CONTROL, 380 0, BQ2415X_BIT_OPA_MODE); 381 382 case BQ2415X_OTG_LEVEL: 383 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_VOLTAGE, 384 BQ2415X_BIT_OTG_PL); 385 case BQ2415X_OTG_ACTIVATE_HIGH: 386 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE, 387 1, BQ2415X_BIT_OTG_PL); 388 case BQ2415X_OTG_ACTIVATE_LOW: 389 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE, 390 0, BQ2415X_BIT_OTG_PL); 391 case BQ2415X_OTG_PIN_STATUS: 392 return bq2415x_i2c_read_bit(bq, BQ2415X_REG_VOLTAGE, 393 BQ2415X_BIT_OTG_EN); 394 case BQ2415X_OTG_PIN_ENABLE: 395 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE, 396 1, BQ2415X_BIT_OTG_EN); 397 case BQ2415X_OTG_PIN_DISABLE: 398 return bq2415x_i2c_write_bit(bq, BQ2415X_REG_VOLTAGE, 399 0, BQ2415X_BIT_OTG_EN); 400 401 case BQ2415X_VENDER_CODE: 402 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER, 403 BQ2415X_MASK_VENDER, BQ2415X_SHIFT_VENDER); 404 case BQ2415X_PART_NUMBER: 405 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER, 406 BQ2415X_MASK_PN, BQ2415X_SHIFT_PN); 407 case BQ2415X_REVISION: 408 return bq2415x_i2c_read_mask(bq, BQ2415X_REG_VENDER, 409 BQ2415X_MASK_REVISION, BQ2415X_SHIFT_REVISION); 410 } 411 return -EINVAL; 412} 413 414/* detect chip type */ 415static enum bq2415x_chip bq2415x_detect_chip(struct bq2415x_device *bq) 416{ 417 struct i2c_client *client = to_i2c_client(bq->dev); 418 int ret = bq2415x_exec_command(bq, BQ2415X_PART_NUMBER); 419 420 if (ret < 0) 421 return ret; 422 423 switch (client->addr) { 424 case 0x6b: 425 switch (ret) { 426 case 0: 427 if (bq->chip == BQ24151A) 428 return bq->chip; 429 else 430 return BQ24151; 431 case 1: 432 if (bq->chip == BQ24150A || 433 bq->chip == BQ24152 || 434 bq->chip == BQ24155) 435 return bq->chip; 436 else 437 return BQ24150; 438 case 2: 439 if (bq->chip == BQ24153A) 440 return bq->chip; 441 else 442 return BQ24153; 443 default: 444 return BQUNKNOWN; 445 } 446 break; 447 448 case 0x6a: 449 switch (ret) { 450 case 0: 451 if (bq->chip == BQ24156A) 452 return bq->chip; 453 else 454 return BQ24156; 455 case 2: 456 return BQ24158; 457 default: 458 return BQUNKNOWN; 459 } 460 break; 461 } 462 463 return BQUNKNOWN; 464} 465 466/* detect chip revision */ 467static int bq2415x_detect_revision(struct bq2415x_device *bq) 468{ 469 int ret = bq2415x_exec_command(bq, BQ2415X_REVISION); 470 int chip = bq2415x_detect_chip(bq); 471 472 if (ret < 0 || chip < 0) 473 return -1; 474 475 switch (chip) { 476 case BQ24150: 477 case BQ24150A: 478 case BQ24151: 479 case BQ24151A: 480 case BQ24152: 481 if (ret >= 0 && ret <= 3) 482 return ret; 483 else 484 return -1; 485 case BQ24153: 486 case BQ24153A: 487 case BQ24156: 488 case BQ24156A: 489 case BQ24158: 490 if (ret == 3) 491 return 0; 492 else if (ret == 1) 493 return 1; 494 else 495 return -1; 496 case BQ24155: 497 if (ret == 3) 498 return 3; 499 else 500 return -1; 501 case BQUNKNOWN: 502 return -1; 503 } 504 505 return -1; 506} 507 508/* return chip vender code */ 509static int bq2415x_get_vender_code(struct bq2415x_device *bq) 510{ 511 int ret; 512 513 ret = bq2415x_exec_command(bq, BQ2415X_VENDER_CODE); 514 if (ret < 0) 515 return 0; 516 517 /* convert to binary */ 518 return (ret & 0x1) + 519 ((ret >> 1) & 0x1) * 10 + 520 ((ret >> 2) & 0x1) * 100; 521} 522 523/* reset all chip registers to default state */ 524static void bq2415x_reset_chip(struct bq2415x_device *bq) 525{ 526 bq2415x_i2c_write(bq, BQ2415X_REG_CURRENT, BQ2415X_RESET_CURRENT); 527 bq2415x_i2c_write(bq, BQ2415X_REG_VOLTAGE, BQ2415X_RESET_VOLTAGE); 528 bq2415x_i2c_write(bq, BQ2415X_REG_CONTROL, BQ2415X_RESET_CONTROL); 529 bq2415x_i2c_write(bq, BQ2415X_REG_STATUS, BQ2415X_RESET_STATUS); 530 bq->timer_error = NULL; 531} 532 533/**** properties functions ****/ 534 535/* set current limit in mA */ 536static int bq2415x_set_current_limit(struct bq2415x_device *bq, int mA) 537{ 538 int val; 539 540 if (mA <= 100) 541 val = 0; 542 else if (mA <= 500) 543 val = 1; 544 else if (mA <= 800) 545 val = 2; 546 else 547 val = 3; 548 549 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CONTROL, val, 550 BQ2415X_MASK_LIMIT, BQ2415X_SHIFT_LIMIT); 551} 552 553/* get current limit in mA */ 554static int bq2415x_get_current_limit(struct bq2415x_device *bq) 555{ 556 int ret; 557 558 ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CONTROL, 559 BQ2415X_MASK_LIMIT, BQ2415X_SHIFT_LIMIT); 560 if (ret < 0) 561 return ret; 562 else if (ret == 0) 563 return 100; 564 else if (ret == 1) 565 return 500; 566 else if (ret == 2) 567 return 800; 568 else if (ret == 3) 569 return 1800; 570 return -EINVAL; 571} 572 573/* set weak battery voltage in mV */ 574static int bq2415x_set_weak_battery_voltage(struct bq2415x_device *bq, int mV) 575{ 576 int val; 577 578 /* round to 100mV */ 579 if (mV <= 3400 + 50) 580 val = 0; 581 else if (mV <= 3500 + 50) 582 val = 1; 583 else if (mV <= 3600 + 50) 584 val = 2; 585 else 586 val = 3; 587 588 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CONTROL, val, 589 BQ2415X_MASK_VLOWV, BQ2415X_SHIFT_VLOWV); 590} 591 592/* get weak battery voltage in mV */ 593static int bq2415x_get_weak_battery_voltage(struct bq2415x_device *bq) 594{ 595 int ret; 596 597 ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CONTROL, 598 BQ2415X_MASK_VLOWV, BQ2415X_SHIFT_VLOWV); 599 if (ret < 0) 600 return ret; 601 return 100 * (34 + ret); 602} 603 604/* set battery regulation voltage in mV */ 605static int bq2415x_set_battery_regulation_voltage(struct bq2415x_device *bq, 606 int mV) 607{ 608 int val = (mV/10 - 350) / 2; 609 610 /* 611 * According to datasheet, maximum battery regulation voltage is 612 * 4440mV which is b101111 = 47. 613 */ 614 if (val < 0) 615 val = 0; 616 else if (val > 47) 617 return -EINVAL; 618 619 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_VOLTAGE, val, 620 BQ2415X_MASK_VO, BQ2415X_SHIFT_VO); 621} 622 623/* get battery regulation voltage in mV */ 624static int bq2415x_get_battery_regulation_voltage(struct bq2415x_device *bq) 625{ 626 int ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_VOLTAGE, 627 BQ2415X_MASK_VO, BQ2415X_SHIFT_VO); 628 629 if (ret < 0) 630 return ret; 631 return 10 * (350 + 2*ret); 632} 633 634/* set charge current in mA (platform data must provide resistor sense) */ 635static int bq2415x_set_charge_current(struct bq2415x_device *bq, int mA) 636{ 637 int val; 638 639 if (bq->init_data.resistor_sense <= 0) 640 return -ENOSYS; 641 642 val = (mA * bq->init_data.resistor_sense - 37400) / 6800; 643 if (val < 0) 644 val = 0; 645 else if (val > 7) 646 val = 7; 647 648 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CURRENT, val, 649 BQ2415X_MASK_VI_CHRG | BQ2415X_MASK_RESET, 650 BQ2415X_SHIFT_VI_CHRG); 651} 652 653/* get charge current in mA (platform data must provide resistor sense) */ 654static int bq2415x_get_charge_current(struct bq2415x_device *bq) 655{ 656 int ret; 657 658 if (bq->init_data.resistor_sense <= 0) 659 return -ENOSYS; 660 661 ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CURRENT, 662 BQ2415X_MASK_VI_CHRG, BQ2415X_SHIFT_VI_CHRG); 663 if (ret < 0) 664 return ret; 665 return (37400 + 6800*ret) / bq->init_data.resistor_sense; 666} 667 668/* set termination current in mA (platform data must provide resistor sense) */ 669static int bq2415x_set_termination_current(struct bq2415x_device *bq, int mA) 670{ 671 int val; 672 673 if (bq->init_data.resistor_sense <= 0) 674 return -ENOSYS; 675 676 val = (mA * bq->init_data.resistor_sense - 3400) / 3400; 677 if (val < 0) 678 val = 0; 679 else if (val > 7) 680 val = 7; 681 682 return bq2415x_i2c_write_mask(bq, BQ2415X_REG_CURRENT, val, 683 BQ2415X_MASK_VI_TERM | BQ2415X_MASK_RESET, 684 BQ2415X_SHIFT_VI_TERM); 685} 686 687/* get termination current in mA (platform data must provide resistor sense) */ 688static int bq2415x_get_termination_current(struct bq2415x_device *bq) 689{ 690 int ret; 691 692 if (bq->init_data.resistor_sense <= 0) 693 return -ENOSYS; 694 695 ret = bq2415x_i2c_read_mask(bq, BQ2415X_REG_CURRENT, 696 BQ2415X_MASK_VI_TERM, BQ2415X_SHIFT_VI_TERM); 697 if (ret < 0) 698 return ret; 699 return (3400 + 3400*ret) / bq->init_data.resistor_sense; 700} 701 702/* set default value of property */ 703#define bq2415x_set_default_value(bq, prop) \ 704 do { \ 705 int ret = 0; \ 706 if (bq->init_data.prop != -1) \ 707 ret = bq2415x_set_##prop(bq, bq->init_data.prop); \ 708 if (ret < 0) \ 709 return ret; \ 710 } while (0) 711 712/* set default values of all properties */ 713static int bq2415x_set_defaults(struct bq2415x_device *bq) 714{ 715 bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_DISABLE); 716 bq2415x_exec_command(bq, BQ2415X_CHARGER_DISABLE); 717 bq2415x_exec_command(bq, BQ2415X_CHARGE_TERMINATION_DISABLE); 718 719 bq2415x_set_default_value(bq, current_limit); 720 bq2415x_set_default_value(bq, weak_battery_voltage); 721 bq2415x_set_default_value(bq, battery_regulation_voltage); 722 723 if (bq->init_data.resistor_sense > 0) { 724 bq2415x_set_default_value(bq, charge_current); 725 bq2415x_set_default_value(bq, termination_current); 726 bq2415x_exec_command(bq, BQ2415X_CHARGE_TERMINATION_ENABLE); 727 } 728 729 bq2415x_exec_command(bq, BQ2415X_CHARGER_ENABLE); 730 return 0; 731} 732 733/**** charger mode functions ****/ 734 735/* set charger mode */ 736static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode) 737{ 738 int ret = 0; 739 int charger = 0; 740 int boost = 0; 741 742 if (mode == BQ2415X_MODE_BOOST) 743 boost = 1; 744 else if (mode != BQ2415X_MODE_OFF) 745 charger = 1; 746 747 if (!charger) 748 ret = bq2415x_exec_command(bq, BQ2415X_CHARGER_DISABLE); 749 750 if (!boost) 751 ret = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_DISABLE); 752 753 if (ret < 0) 754 return ret; 755 756 switch (mode) { 757 case BQ2415X_MODE_OFF: 758 dev_dbg(bq->dev, "changing mode to: Offline\n"); 759 ret = bq2415x_set_current_limit(bq, 100); 760 break; 761 case BQ2415X_MODE_NONE: 762 dev_dbg(bq->dev, "changing mode to: N/A\n"); 763 ret = bq2415x_set_current_limit(bq, 100); 764 break; 765 case BQ2415X_MODE_HOST_CHARGER: 766 dev_dbg(bq->dev, "changing mode to: Host/HUB charger\n"); 767 ret = bq2415x_set_current_limit(bq, 500); 768 break; 769 case BQ2415X_MODE_DEDICATED_CHARGER: 770 dev_dbg(bq->dev, "changing mode to: Dedicated charger\n"); 771 ret = bq2415x_set_current_limit(bq, 1800); 772 break; 773 case BQ2415X_MODE_BOOST: /* Boost mode */ 774 dev_dbg(bq->dev, "changing mode to: Boost\n"); 775 ret = bq2415x_set_current_limit(bq, 100); 776 break; 777 } 778 779 if (ret < 0) 780 return ret; 781 782 if (charger) 783 ret = bq2415x_exec_command(bq, BQ2415X_CHARGER_ENABLE); 784 else if (boost) 785 ret = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_ENABLE); 786 787 if (ret < 0) 788 return ret; 789 790 bq2415x_set_default_value(bq, weak_battery_voltage); 791 bq2415x_set_default_value(bq, battery_regulation_voltage); 792 793 bq->mode = mode; 794 sysfs_notify(&bq->charger.dev->kobj, NULL, "mode"); 795 796 return 0; 797 798} 799 800static int bq2415x_notifier_call(struct notifier_block *nb, 801 unsigned long val, void *v) 802{ 803 struct bq2415x_device *bq = 804 container_of(nb, struct bq2415x_device, nb); 805 struct power_supply *psy = v; 806 enum bq2415x_mode mode; 807 union power_supply_propval prop; 808 int ret; 809 int mA; 810 811 if (val != PSY_EVENT_PROP_CHANGED) 812 return NOTIFY_OK; 813 814 if (psy != bq->notify_psy) 815 return NOTIFY_OK; 816 817 dev_dbg(bq->dev, "notifier call was called\n"); 818 819 ret = psy->get_property(psy, POWER_SUPPLY_PROP_CURRENT_MAX, &prop); 820 if (ret != 0) 821 return NOTIFY_OK; 822 823 mA = prop.intval; 824 825 if (mA == 0) 826 mode = BQ2415X_MODE_OFF; 827 else if (mA < 500) 828 mode = BQ2415X_MODE_NONE; 829 else if (mA < 1800) 830 mode = BQ2415X_MODE_HOST_CHARGER; 831 else 832 mode = BQ2415X_MODE_DEDICATED_CHARGER; 833 834 if (bq->reported_mode == mode) 835 return NOTIFY_OK; 836 837 bq->reported_mode = mode; 838 839 /* if automode is not enabled do not tell about reported_mode */ 840 if (bq->automode < 1) 841 return NOTIFY_OK; 842 843 sysfs_notify(&bq->charger.dev->kobj, NULL, "reported_mode"); 844 bq2415x_set_mode(bq, bq->reported_mode); 845 846 return NOTIFY_OK; 847} 848 849/**** timer functions ****/ 850 851/* enable/disable auto resetting chip timer */ 852static void bq2415x_set_autotimer(struct bq2415x_device *bq, int state) 853{ 854 mutex_lock(&bq2415x_timer_mutex); 855 856 if (bq->autotimer == state) { 857 mutex_unlock(&bq2415x_timer_mutex); 858 return; 859 } 860 861 bq->autotimer = state; 862 863 if (state) { 864 schedule_delayed_work(&bq->work, BQ2415X_TIMER_TIMEOUT * HZ); 865 bq2415x_exec_command(bq, BQ2415X_TIMER_RESET); 866 bq->timer_error = NULL; 867 } else { 868 cancel_delayed_work_sync(&bq->work); 869 } 870 871 mutex_unlock(&bq2415x_timer_mutex); 872} 873 874/* called by bq2415x_timer_work on timer error */ 875static void bq2415x_timer_error(struct bq2415x_device *bq, const char *msg) 876{ 877 bq->timer_error = msg; 878 sysfs_notify(&bq->charger.dev->kobj, NULL, "timer"); 879 dev_err(bq->dev, "%s\n", msg); 880 if (bq->automode > 0) 881 bq->automode = 0; 882 bq2415x_set_mode(bq, BQ2415X_MODE_OFF); 883 bq2415x_set_autotimer(bq, 0); 884} 885 886/* delayed work function for auto resetting chip timer */ 887static void bq2415x_timer_work(struct work_struct *work) 888{ 889 struct bq2415x_device *bq = container_of(work, struct bq2415x_device, 890 work.work); 891 int ret; 892 int error; 893 int boost; 894 895 if (!bq->autotimer) 896 return; 897 898 ret = bq2415x_exec_command(bq, BQ2415X_TIMER_RESET); 899 if (ret < 0) { 900 bq2415x_timer_error(bq, "Resetting timer failed"); 901 return; 902 } 903 904 boost = bq2415x_exec_command(bq, BQ2415X_BOOST_MODE_STATUS); 905 if (boost < 0) { 906 bq2415x_timer_error(bq, "Unknown error"); 907 return; 908 } 909 910 error = bq2415x_exec_command(bq, BQ2415X_FAULT_STATUS); 911 if (error < 0) { 912 bq2415x_timer_error(bq, "Unknown error"); 913 return; 914 } 915 916 if (boost) { 917 switch (error) { 918 /* Non fatal errors, chip is OK */ 919 case 0: /* No error */ 920 break; 921 case 6: /* Timer expired */ 922 dev_err(bq->dev, "Timer expired\n"); 923 break; 924 case 3: /* Battery voltage too low */ 925 dev_err(bq->dev, "Battery voltage to low\n"); 926 break; 927 928 /* Fatal errors, disable and reset chip */ 929 case 1: /* Overvoltage protection (chip fried) */ 930 bq2415x_timer_error(bq, 931 "Overvoltage protection (chip fried)"); 932 return; 933 case 2: /* Overload */ 934 bq2415x_timer_error(bq, "Overload"); 935 return; 936 case 4: /* Battery overvoltage protection */ 937 bq2415x_timer_error(bq, 938 "Battery overvoltage protection"); 939 return; 940 case 5: /* Thermal shutdown (too hot) */ 941 bq2415x_timer_error(bq, 942 "Thermal shutdown (too hot)"); 943 return; 944 case 7: /* N/A */ 945 bq2415x_timer_error(bq, "Unknown error"); 946 return; 947 } 948 } else { 949 switch (error) { 950 /* Non fatal errors, chip is OK */ 951 case 0: /* No error */ 952 break; 953 case 2: /* Sleep mode */ 954 dev_err(bq->dev, "Sleep mode\n"); 955 break; 956 case 3: /* Poor input source */ 957 dev_err(bq->dev, "Poor input source\n"); 958 break; 959 case 6: /* Timer expired */ 960 dev_err(bq->dev, "Timer expired\n"); 961 break; 962 case 7: /* No battery */ 963 dev_err(bq->dev, "No battery\n"); 964 break; 965 966 /* Fatal errors, disable and reset chip */ 967 case 1: /* Overvoltage protection (chip fried) */ 968 bq2415x_timer_error(bq, 969 "Overvoltage protection (chip fried)"); 970 return; 971 case 4: /* Battery overvoltage protection */ 972 bq2415x_timer_error(bq, 973 "Battery overvoltage protection"); 974 return; 975 case 5: /* Thermal shutdown (too hot) */ 976 bq2415x_timer_error(bq, 977 "Thermal shutdown (too hot)"); 978 return; 979 } 980 } 981 982 schedule_delayed_work(&bq->work, BQ2415X_TIMER_TIMEOUT * HZ); 983} 984 985/**** power supply interface code ****/ 986 987static enum power_supply_property bq2415x_power_supply_props[] = { 988 /* TODO: maybe add more power supply properties */ 989 POWER_SUPPLY_PROP_STATUS, 990 POWER_SUPPLY_PROP_MODEL_NAME, 991}; 992 993static int bq2415x_power_supply_get_property(struct power_supply *psy, 994 enum power_supply_property psp, 995 union power_supply_propval *val) 996{ 997 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 998 charger); 999 int ret; 1000 1001 switch (psp) { 1002 case POWER_SUPPLY_PROP_STATUS: 1003 ret = bq2415x_exec_command(bq, BQ2415X_CHARGE_STATUS); 1004 if (ret < 0) 1005 return ret; 1006 else if (ret == 0) /* Ready */ 1007 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; 1008 else if (ret == 1) /* Charge in progress */ 1009 val->intval = POWER_SUPPLY_STATUS_CHARGING; 1010 else if (ret == 2) /* Charge done */ 1011 val->intval = POWER_SUPPLY_STATUS_FULL; 1012 else 1013 val->intval = POWER_SUPPLY_STATUS_UNKNOWN; 1014 break; 1015 case POWER_SUPPLY_PROP_MODEL_NAME: 1016 val->strval = bq->model; 1017 break; 1018 default: 1019 return -EINVAL; 1020 } 1021 return 0; 1022} 1023 1024static int bq2415x_power_supply_init(struct bq2415x_device *bq) 1025{ 1026 int ret; 1027 int chip; 1028 char revstr[8]; 1029 1030 bq->charger.name = bq->name; 1031 bq->charger.type = POWER_SUPPLY_TYPE_USB; 1032 bq->charger.properties = bq2415x_power_supply_props; 1033 bq->charger.num_properties = ARRAY_SIZE(bq2415x_power_supply_props); 1034 bq->charger.get_property = bq2415x_power_supply_get_property; 1035 1036 ret = bq2415x_detect_chip(bq); 1037 if (ret < 0) 1038 chip = BQUNKNOWN; 1039 else 1040 chip = ret; 1041 1042 ret = bq2415x_detect_revision(bq); 1043 if (ret < 0) 1044 strcpy(revstr, "unknown"); 1045 else 1046 sprintf(revstr, "1.%d", ret); 1047 1048 bq->model = kasprintf(GFP_KERNEL, 1049 "chip %s, revision %s, vender code %.3d", 1050 bq2415x_chip_name[chip], revstr, 1051 bq2415x_get_vender_code(bq)); 1052 if (!bq->model) { 1053 dev_err(bq->dev, "failed to allocate model name\n"); 1054 return -ENOMEM; 1055 } 1056 1057 ret = power_supply_register(bq->dev, &bq->charger); 1058 if (ret) { 1059 kfree(bq->model); 1060 return ret; 1061 } 1062 1063 return 0; 1064} 1065 1066static void bq2415x_power_supply_exit(struct bq2415x_device *bq) 1067{ 1068 bq->autotimer = 0; 1069 if (bq->automode > 0) 1070 bq->automode = 0; 1071 cancel_delayed_work_sync(&bq->work); 1072 power_supply_unregister(&bq->charger); 1073 kfree(bq->model); 1074} 1075 1076/**** additional sysfs entries for power supply interface ****/ 1077 1078/* show *_status entries */ 1079static ssize_t bq2415x_sysfs_show_status(struct device *dev, 1080 struct device_attribute *attr, 1081 char *buf) 1082{ 1083 struct power_supply *psy = dev_get_drvdata(dev); 1084 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1085 charger); 1086 enum bq2415x_command command; 1087 int ret; 1088 1089 if (strcmp(attr->attr.name, "otg_status") == 0) 1090 command = BQ2415X_OTG_STATUS; 1091 else if (strcmp(attr->attr.name, "charge_status") == 0) 1092 command = BQ2415X_CHARGE_STATUS; 1093 else if (strcmp(attr->attr.name, "boost_status") == 0) 1094 command = BQ2415X_BOOST_STATUS; 1095 else if (strcmp(attr->attr.name, "fault_status") == 0) 1096 command = BQ2415X_FAULT_STATUS; 1097 else 1098 return -EINVAL; 1099 1100 ret = bq2415x_exec_command(bq, command); 1101 if (ret < 0) 1102 return ret; 1103 return sprintf(buf, "%d\n", ret); 1104} 1105 1106/* 1107 * set timer entry: 1108 * auto - enable auto mode 1109 * off - disable auto mode 1110 * (other values) - reset chip timer 1111 */ 1112static ssize_t bq2415x_sysfs_set_timer(struct device *dev, 1113 struct device_attribute *attr, 1114 const char *buf, 1115 size_t count) 1116{ 1117 struct power_supply *psy = dev_get_drvdata(dev); 1118 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1119 charger); 1120 int ret = 0; 1121 1122 if (strncmp(buf, "auto", 4) == 0) 1123 bq2415x_set_autotimer(bq, 1); 1124 else if (strncmp(buf, "off", 3) == 0) 1125 bq2415x_set_autotimer(bq, 0); 1126 else 1127 ret = bq2415x_exec_command(bq, BQ2415X_TIMER_RESET); 1128 1129 if (ret < 0) 1130 return ret; 1131 return count; 1132} 1133 1134/* show timer entry (auto or off) */ 1135static ssize_t bq2415x_sysfs_show_timer(struct device *dev, 1136 struct device_attribute *attr, 1137 char *buf) 1138{ 1139 struct power_supply *psy = dev_get_drvdata(dev); 1140 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1141 charger); 1142 1143 if (bq->timer_error) 1144 return sprintf(buf, "%s\n", bq->timer_error); 1145 1146 if (bq->autotimer) 1147 return sprintf(buf, "auto\n"); 1148 return sprintf(buf, "off\n"); 1149} 1150 1151/* 1152 * set mode entry: 1153 * auto - if automode is supported, enable it and set mode to reported 1154 * none - disable charger and boost mode 1155 * host - charging mode for host/hub chargers (current limit 500mA) 1156 * dedicated - charging mode for dedicated chargers (unlimited current limit) 1157 * boost - disable charger and enable boost mode 1158 */ 1159static ssize_t bq2415x_sysfs_set_mode(struct device *dev, 1160 struct device_attribute *attr, 1161 const char *buf, 1162 size_t count) 1163{ 1164 struct power_supply *psy = dev_get_drvdata(dev); 1165 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1166 charger); 1167 enum bq2415x_mode mode; 1168 int ret = 0; 1169 1170 if (strncmp(buf, "auto", 4) == 0) { 1171 if (bq->automode < 0) 1172 return -ENOSYS; 1173 bq->automode = 1; 1174 mode = bq->reported_mode; 1175 } else if (strncmp(buf, "off", 3) == 0) { 1176 if (bq->automode > 0) 1177 bq->automode = 0; 1178 mode = BQ2415X_MODE_OFF; 1179 } else if (strncmp(buf, "none", 4) == 0) { 1180 if (bq->automode > 0) 1181 bq->automode = 0; 1182 mode = BQ2415X_MODE_NONE; 1183 } else if (strncmp(buf, "host", 4) == 0) { 1184 if (bq->automode > 0) 1185 bq->automode = 0; 1186 mode = BQ2415X_MODE_HOST_CHARGER; 1187 } else if (strncmp(buf, "dedicated", 9) == 0) { 1188 if (bq->automode > 0) 1189 bq->automode = 0; 1190 mode = BQ2415X_MODE_DEDICATED_CHARGER; 1191 } else if (strncmp(buf, "boost", 5) == 0) { 1192 if (bq->automode > 0) 1193 bq->automode = 0; 1194 mode = BQ2415X_MODE_BOOST; 1195 } else if (strncmp(buf, "reset", 5) == 0) { 1196 bq2415x_reset_chip(bq); 1197 bq2415x_set_defaults(bq); 1198 if (bq->automode <= 0) 1199 return count; 1200 bq->automode = 1; 1201 mode = bq->reported_mode; 1202 } else { 1203 return -EINVAL; 1204 } 1205 1206 ret = bq2415x_set_mode(bq, mode); 1207 if (ret < 0) 1208 return ret; 1209 return count; 1210} 1211 1212/* show mode entry (auto, none, host, dedicated or boost) */ 1213static ssize_t bq2415x_sysfs_show_mode(struct device *dev, 1214 struct device_attribute *attr, 1215 char *buf) 1216{ 1217 struct power_supply *psy = dev_get_drvdata(dev); 1218 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1219 charger); 1220 ssize_t ret = 0; 1221 1222 if (bq->automode > 0) 1223 ret += sprintf(buf+ret, "auto ("); 1224 1225 switch (bq->mode) { 1226 case BQ2415X_MODE_OFF: 1227 ret += sprintf(buf+ret, "off"); 1228 break; 1229 case BQ2415X_MODE_NONE: 1230 ret += sprintf(buf+ret, "none"); 1231 break; 1232 case BQ2415X_MODE_HOST_CHARGER: 1233 ret += sprintf(buf+ret, "host"); 1234 break; 1235 case BQ2415X_MODE_DEDICATED_CHARGER: 1236 ret += sprintf(buf+ret, "dedicated"); 1237 break; 1238 case BQ2415X_MODE_BOOST: 1239 ret += sprintf(buf+ret, "boost"); 1240 break; 1241 } 1242 1243 if (bq->automode > 0) 1244 ret += sprintf(buf+ret, ")"); 1245 1246 ret += sprintf(buf+ret, "\n"); 1247 return ret; 1248} 1249 1250/* show reported_mode entry (none, host, dedicated or boost) */ 1251static ssize_t bq2415x_sysfs_show_reported_mode(struct device *dev, 1252 struct device_attribute *attr, 1253 char *buf) 1254{ 1255 struct power_supply *psy = dev_get_drvdata(dev); 1256 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1257 charger); 1258 1259 if (bq->automode < 0) 1260 return -EINVAL; 1261 1262 switch (bq->reported_mode) { 1263 case BQ2415X_MODE_OFF: 1264 return sprintf(buf, "off\n"); 1265 case BQ2415X_MODE_NONE: 1266 return sprintf(buf, "none\n"); 1267 case BQ2415X_MODE_HOST_CHARGER: 1268 return sprintf(buf, "host\n"); 1269 case BQ2415X_MODE_DEDICATED_CHARGER: 1270 return sprintf(buf, "dedicated\n"); 1271 case BQ2415X_MODE_BOOST: 1272 return sprintf(buf, "boost\n"); 1273 } 1274 1275 return -EINVAL; 1276} 1277 1278/* directly set raw value to chip register, format: 'register value' */ 1279static ssize_t bq2415x_sysfs_set_registers(struct device *dev, 1280 struct device_attribute *attr, 1281 const char *buf, 1282 size_t count) 1283{ 1284 struct power_supply *psy = dev_get_drvdata(dev); 1285 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1286 charger); 1287 ssize_t ret = 0; 1288 unsigned int reg; 1289 unsigned int val; 1290 1291 if (sscanf(buf, "%x %x", &reg, &val) != 2) 1292 return -EINVAL; 1293 1294 if (reg > 4 || val > 255) 1295 return -EINVAL; 1296 1297 ret = bq2415x_i2c_write(bq, reg, val); 1298 if (ret < 0) 1299 return ret; 1300 return count; 1301} 1302 1303/* print value of chip register, format: 'register=value' */ 1304static ssize_t bq2415x_sysfs_print_reg(struct bq2415x_device *bq, 1305 u8 reg, 1306 char *buf) 1307{ 1308 int ret = bq2415x_i2c_read(bq, reg); 1309 1310 if (ret < 0) 1311 return sprintf(buf, "%#.2x=error %d\n", reg, ret); 1312 return sprintf(buf, "%#.2x=%#.2x\n", reg, ret); 1313} 1314 1315/* show all raw values of chip register, format per line: 'register=value' */ 1316static ssize_t bq2415x_sysfs_show_registers(struct device *dev, 1317 struct device_attribute *attr, 1318 char *buf) 1319{ 1320 struct power_supply *psy = dev_get_drvdata(dev); 1321 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1322 charger); 1323 ssize_t ret = 0; 1324 1325 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_STATUS, buf+ret); 1326 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_CONTROL, buf+ret); 1327 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_VOLTAGE, buf+ret); 1328 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_VENDER, buf+ret); 1329 ret += bq2415x_sysfs_print_reg(bq, BQ2415X_REG_CURRENT, buf+ret); 1330 return ret; 1331} 1332 1333/* set current and voltage limit entries (in mA or mV) */ 1334static ssize_t bq2415x_sysfs_set_limit(struct device *dev, 1335 struct device_attribute *attr, 1336 const char *buf, 1337 size_t count) 1338{ 1339 struct power_supply *psy = dev_get_drvdata(dev); 1340 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1341 charger); 1342 long val; 1343 int ret; 1344 1345 if (kstrtol(buf, 10, &val) < 0) 1346 return -EINVAL; 1347 1348 if (strcmp(attr->attr.name, "current_limit") == 0) 1349 ret = bq2415x_set_current_limit(bq, val); 1350 else if (strcmp(attr->attr.name, "weak_battery_voltage") == 0) 1351 ret = bq2415x_set_weak_battery_voltage(bq, val); 1352 else if (strcmp(attr->attr.name, "battery_regulation_voltage") == 0) 1353 ret = bq2415x_set_battery_regulation_voltage(bq, val); 1354 else if (strcmp(attr->attr.name, "charge_current") == 0) 1355 ret = bq2415x_set_charge_current(bq, val); 1356 else if (strcmp(attr->attr.name, "termination_current") == 0) 1357 ret = bq2415x_set_termination_current(bq, val); 1358 else 1359 return -EINVAL; 1360 1361 if (ret < 0) 1362 return ret; 1363 return count; 1364} 1365 1366/* show current and voltage limit entries (in mA or mV) */ 1367static ssize_t bq2415x_sysfs_show_limit(struct device *dev, 1368 struct device_attribute *attr, 1369 char *buf) 1370{ 1371 struct power_supply *psy = dev_get_drvdata(dev); 1372 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1373 charger); 1374 int ret; 1375 1376 if (strcmp(attr->attr.name, "current_limit") == 0) 1377 ret = bq2415x_get_current_limit(bq); 1378 else if (strcmp(attr->attr.name, "weak_battery_voltage") == 0) 1379 ret = bq2415x_get_weak_battery_voltage(bq); 1380 else if (strcmp(attr->attr.name, "battery_regulation_voltage") == 0) 1381 ret = bq2415x_get_battery_regulation_voltage(bq); 1382 else if (strcmp(attr->attr.name, "charge_current") == 0) 1383 ret = bq2415x_get_charge_current(bq); 1384 else if (strcmp(attr->attr.name, "termination_current") == 0) 1385 ret = bq2415x_get_termination_current(bq); 1386 else 1387 return -EINVAL; 1388 1389 if (ret < 0) 1390 return ret; 1391 return sprintf(buf, "%d\n", ret); 1392} 1393 1394/* set *_enable entries */ 1395static ssize_t bq2415x_sysfs_set_enable(struct device *dev, 1396 struct device_attribute *attr, 1397 const char *buf, 1398 size_t count) 1399{ 1400 struct power_supply *psy = dev_get_drvdata(dev); 1401 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1402 charger); 1403 enum bq2415x_command command; 1404 long val; 1405 int ret; 1406 1407 if (kstrtol(buf, 10, &val) < 0) 1408 return -EINVAL; 1409 1410 if (strcmp(attr->attr.name, "charge_termination_enable") == 0) 1411 command = val ? BQ2415X_CHARGE_TERMINATION_ENABLE : 1412 BQ2415X_CHARGE_TERMINATION_DISABLE; 1413 else if (strcmp(attr->attr.name, "high_impedance_enable") == 0) 1414 command = val ? BQ2415X_HIGH_IMPEDANCE_ENABLE : 1415 BQ2415X_HIGH_IMPEDANCE_DISABLE; 1416 else if (strcmp(attr->attr.name, "otg_pin_enable") == 0) 1417 command = val ? BQ2415X_OTG_PIN_ENABLE : 1418 BQ2415X_OTG_PIN_DISABLE; 1419 else if (strcmp(attr->attr.name, "stat_pin_enable") == 0) 1420 command = val ? BQ2415X_STAT_PIN_ENABLE : 1421 BQ2415X_STAT_PIN_DISABLE; 1422 else 1423 return -EINVAL; 1424 1425 ret = bq2415x_exec_command(bq, command); 1426 if (ret < 0) 1427 return ret; 1428 return count; 1429} 1430 1431/* show *_enable entries */ 1432static ssize_t bq2415x_sysfs_show_enable(struct device *dev, 1433 struct device_attribute *attr, 1434 char *buf) 1435{ 1436 struct power_supply *psy = dev_get_drvdata(dev); 1437 struct bq2415x_device *bq = container_of(psy, struct bq2415x_device, 1438 charger); 1439 enum bq2415x_command command; 1440 int ret; 1441 1442 if (strcmp(attr->attr.name, "charge_termination_enable") == 0) 1443 command = BQ2415X_CHARGE_TERMINATION_STATUS; 1444 else if (strcmp(attr->attr.name, "high_impedance_enable") == 0) 1445 command = BQ2415X_HIGH_IMPEDANCE_STATUS; 1446 else if (strcmp(attr->attr.name, "otg_pin_enable") == 0) 1447 command = BQ2415X_OTG_PIN_STATUS; 1448 else if (strcmp(attr->attr.name, "stat_pin_enable") == 0) 1449 command = BQ2415X_STAT_PIN_STATUS; 1450 else 1451 return -EINVAL; 1452 1453 ret = bq2415x_exec_command(bq, command); 1454 if (ret < 0) 1455 return ret; 1456 return sprintf(buf, "%d\n", ret); 1457} 1458 1459static DEVICE_ATTR(current_limit, S_IWUSR | S_IRUGO, 1460 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit); 1461static DEVICE_ATTR(weak_battery_voltage, S_IWUSR | S_IRUGO, 1462 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit); 1463static DEVICE_ATTR(battery_regulation_voltage, S_IWUSR | S_IRUGO, 1464 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit); 1465static DEVICE_ATTR(charge_current, S_IWUSR | S_IRUGO, 1466 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit); 1467static DEVICE_ATTR(termination_current, S_IWUSR | S_IRUGO, 1468 bq2415x_sysfs_show_limit, bq2415x_sysfs_set_limit); 1469 1470static DEVICE_ATTR(charge_termination_enable, S_IWUSR | S_IRUGO, 1471 bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable); 1472static DEVICE_ATTR(high_impedance_enable, S_IWUSR | S_IRUGO, 1473 bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable); 1474static DEVICE_ATTR(otg_pin_enable, S_IWUSR | S_IRUGO, 1475 bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable); 1476static DEVICE_ATTR(stat_pin_enable, S_IWUSR | S_IRUGO, 1477 bq2415x_sysfs_show_enable, bq2415x_sysfs_set_enable); 1478 1479static DEVICE_ATTR(reported_mode, S_IRUGO, 1480 bq2415x_sysfs_show_reported_mode, NULL); 1481static DEVICE_ATTR(mode, S_IWUSR | S_IRUGO, 1482 bq2415x_sysfs_show_mode, bq2415x_sysfs_set_mode); 1483static DEVICE_ATTR(timer, S_IWUSR | S_IRUGO, 1484 bq2415x_sysfs_show_timer, bq2415x_sysfs_set_timer); 1485 1486static DEVICE_ATTR(registers, S_IWUSR | S_IRUGO, 1487 bq2415x_sysfs_show_registers, bq2415x_sysfs_set_registers); 1488 1489static DEVICE_ATTR(otg_status, S_IRUGO, bq2415x_sysfs_show_status, NULL); 1490static DEVICE_ATTR(charge_status, S_IRUGO, bq2415x_sysfs_show_status, NULL); 1491static DEVICE_ATTR(boost_status, S_IRUGO, bq2415x_sysfs_show_status, NULL); 1492static DEVICE_ATTR(fault_status, S_IRUGO, bq2415x_sysfs_show_status, NULL); 1493 1494static struct attribute *bq2415x_sysfs_attributes[] = { 1495 /* 1496 * TODO: some (appropriate) of these attrs should be switched to 1497 * use power supply class props. 1498 */ 1499 &dev_attr_current_limit.attr, 1500 &dev_attr_weak_battery_voltage.attr, 1501 &dev_attr_battery_regulation_voltage.attr, 1502 &dev_attr_charge_current.attr, 1503 &dev_attr_termination_current.attr, 1504 1505 &dev_attr_charge_termination_enable.attr, 1506 &dev_attr_high_impedance_enable.attr, 1507 &dev_attr_otg_pin_enable.attr, 1508 &dev_attr_stat_pin_enable.attr, 1509 1510 &dev_attr_reported_mode.attr, 1511 &dev_attr_mode.attr, 1512 &dev_attr_timer.attr, 1513 1514 &dev_attr_registers.attr, 1515 1516 &dev_attr_otg_status.attr, 1517 &dev_attr_charge_status.attr, 1518 &dev_attr_boost_status.attr, 1519 &dev_attr_fault_status.attr, 1520 NULL, 1521}; 1522 1523static const struct attribute_group bq2415x_sysfs_attr_group = { 1524 .attrs = bq2415x_sysfs_attributes, 1525}; 1526 1527static int bq2415x_sysfs_init(struct bq2415x_device *bq) 1528{ 1529 return sysfs_create_group(&bq->charger.dev->kobj, 1530 &bq2415x_sysfs_attr_group); 1531} 1532 1533static void bq2415x_sysfs_exit(struct bq2415x_device *bq) 1534{ 1535 sysfs_remove_group(&bq->charger.dev->kobj, &bq2415x_sysfs_attr_group); 1536} 1537 1538/* main bq2415x probe function */ 1539static int bq2415x_probe(struct i2c_client *client, 1540 const struct i2c_device_id *id) 1541{ 1542 int ret; 1543 int num; 1544 char *name; 1545 struct bq2415x_device *bq; 1546 struct device_node *np = client->dev.of_node; 1547 struct bq2415x_platform_data *pdata = client->dev.platform_data; 1548 1549 if (!np && !pdata) { 1550 dev_err(&client->dev, "platform data missing\n"); 1551 return -ENODEV; 1552 } 1553 1554 /* Get new ID for the new device */ 1555 mutex_lock(&bq2415x_id_mutex); 1556 num = idr_alloc(&bq2415x_id, client, 0, 0, GFP_KERNEL); 1557 mutex_unlock(&bq2415x_id_mutex); 1558 if (num < 0) 1559 return num; 1560 1561 name = kasprintf(GFP_KERNEL, "%s-%d", id->name, num); 1562 if (!name) { 1563 dev_err(&client->dev, "failed to allocate device name\n"); 1564 ret = -ENOMEM; 1565 goto error_1; 1566 } 1567 1568 bq = devm_kzalloc(&client->dev, sizeof(*bq), GFP_KERNEL); 1569 if (!bq) { 1570 dev_err(&client->dev, "failed to allocate device data\n"); 1571 ret = -ENOMEM; 1572 goto error_2; 1573 } 1574 1575 if (np) { 1576 bq->notify_psy = power_supply_get_by_phandle(np, "ti,usb-charger-detection"); 1577 1578 if (!bq->notify_psy) 1579 return -EPROBE_DEFER; 1580 } 1581 else if (pdata->notify_device) 1582 bq->notify_psy = power_supply_get_by_name(pdata->notify_device); 1583 else 1584 bq->notify_psy = NULL; 1585 1586 i2c_set_clientdata(client, bq); 1587 1588 bq->id = num; 1589 bq->dev = &client->dev; 1590 bq->chip = id->driver_data; 1591 bq->name = name; 1592 bq->mode = BQ2415X_MODE_OFF; 1593 bq->reported_mode = BQ2415X_MODE_OFF; 1594 bq->autotimer = 0; 1595 bq->automode = 0; 1596 1597 if (np) { 1598 ret = of_property_read_u32(np, "ti,current-limit", 1599 &bq->init_data.current_limit); 1600 if (ret) 1601 return ret; 1602 ret = of_property_read_u32(np, "ti,weak-battery-voltage", 1603 &bq->init_data.weak_battery_voltage); 1604 if (ret) 1605 return ret; 1606 ret = of_property_read_u32(np, "ti,battery-regulation-voltage", 1607 &bq->init_data.battery_regulation_voltage); 1608 if (ret) 1609 return ret; 1610 ret = of_property_read_u32(np, "ti,charge-current", 1611 &bq->init_data.charge_current); 1612 if (ret) 1613 return ret; 1614 ret = of_property_read_u32(np, "ti,termination-current", 1615 &bq->init_data.termination_current); 1616 if (ret) 1617 return ret; 1618 ret = of_property_read_u32(np, "ti,resistor-sense", 1619 &bq->init_data.resistor_sense); 1620 if (ret) 1621 return ret; 1622 } else { 1623 memcpy(&bq->init_data, pdata, sizeof(bq->init_data)); 1624 } 1625 1626 bq2415x_reset_chip(bq); 1627 1628 ret = bq2415x_power_supply_init(bq); 1629 if (ret) { 1630 dev_err(bq->dev, "failed to register power supply: %d\n", ret); 1631 goto error_2; 1632 } 1633 1634 ret = bq2415x_sysfs_init(bq); 1635 if (ret) { 1636 dev_err(bq->dev, "failed to create sysfs entries: %d\n", ret); 1637 goto error_3; 1638 } 1639 1640 ret = bq2415x_set_defaults(bq); 1641 if (ret) { 1642 dev_err(bq->dev, "failed to set default values: %d\n", ret); 1643 goto error_4; 1644 } 1645 1646 if (bq->notify_psy) { 1647 bq->nb.notifier_call = bq2415x_notifier_call; 1648 ret = power_supply_reg_notifier(&bq->nb); 1649 if (ret) { 1650 dev_err(bq->dev, "failed to reg notifier: %d\n", ret); 1651 goto error_5; 1652 } 1653 1654 /* Query for initial reported_mode and set it */ 1655 bq2415x_notifier_call(&bq->nb, PSY_EVENT_PROP_CHANGED, bq->notify_psy); 1656 bq2415x_set_mode(bq, bq->reported_mode); 1657 1658 bq->automode = 1; 1659 dev_info(bq->dev, "automode enabled\n"); 1660 } else { 1661 bq->automode = -1; 1662 dev_info(bq->dev, "automode not supported\n"); 1663 } 1664 1665 INIT_DELAYED_WORK(&bq->work, bq2415x_timer_work); 1666 bq2415x_set_autotimer(bq, 1); 1667 1668 dev_info(bq->dev, "driver registered\n"); 1669 return 0; 1670 1671error_5: 1672error_4: 1673 bq2415x_sysfs_exit(bq); 1674error_3: 1675 bq2415x_power_supply_exit(bq); 1676error_2: 1677 kfree(name); 1678error_1: 1679 mutex_lock(&bq2415x_id_mutex); 1680 idr_remove(&bq2415x_id, num); 1681 mutex_unlock(&bq2415x_id_mutex); 1682 1683 return ret; 1684} 1685 1686/* main bq2415x remove function */ 1687 1688static int bq2415x_remove(struct i2c_client *client) 1689{ 1690 struct bq2415x_device *bq = i2c_get_clientdata(client); 1691 1692 if (bq->notify_psy) 1693 power_supply_unreg_notifier(&bq->nb); 1694 1695 bq2415x_sysfs_exit(bq); 1696 bq2415x_power_supply_exit(bq); 1697 1698 bq2415x_reset_chip(bq); 1699 1700 mutex_lock(&bq2415x_id_mutex); 1701 idr_remove(&bq2415x_id, bq->id); 1702 mutex_unlock(&bq2415x_id_mutex); 1703 1704 dev_info(bq->dev, "driver unregistered\n"); 1705 1706 kfree(bq->name); 1707 1708 return 0; 1709} 1710 1711static const struct i2c_device_id bq2415x_i2c_id_table[] = { 1712 { "bq2415x", BQUNKNOWN }, 1713 { "bq24150", BQ24150 }, 1714 { "bq24150a", BQ24150A }, 1715 { "bq24151", BQ24151 }, 1716 { "bq24151a", BQ24151A }, 1717 { "bq24152", BQ24152 }, 1718 { "bq24153", BQ24153 }, 1719 { "bq24153a", BQ24153A }, 1720 { "bq24155", BQ24155 }, 1721 { "bq24156", BQ24156 }, 1722 { "bq24156a", BQ24156A }, 1723 { "bq24158", BQ24158 }, 1724 {}, 1725}; 1726MODULE_DEVICE_TABLE(i2c, bq2415x_i2c_id_table); 1727 1728static struct i2c_driver bq2415x_driver = { 1729 .driver = { 1730 .name = "bq2415x-charger", 1731 }, 1732 .probe = bq2415x_probe, 1733 .remove = bq2415x_remove, 1734 .id_table = bq2415x_i2c_id_table, 1735}; 1736module_i2c_driver(bq2415x_driver); 1737 1738MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); 1739MODULE_DESCRIPTION("bq2415x charger driver"); 1740MODULE_LICENSE("GPL");