bq27xxx_battery.c 32.5 KB
Newer Older
1
/*
2
 * BQ27xxx battery driver
3 4 5
 *
 * Copyright (C) 2008 Rodolfo Giometti <giometti@linux.it>
 * Copyright (C) 2008 Eurotech S.p.A. <info@eurotech.it>
6
 * Copyright (C) 2010-2011 Lars-Peter Clausen <lars@metafoo.de>
7
 * Copyright (C) 2011 Pali Rohár <pali.rohar@gmail.com>
8 9 10 11 12 13 14 15 16 17 18
 *
 * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
P
Pali Rohár 已提交
19
 * Datasheets:
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 * http://www.ti.com/product/bq27000
 * http://www.ti.com/product/bq27200
 * http://www.ti.com/product/bq27010
 * http://www.ti.com/product/bq27210
 * http://www.ti.com/product/bq27500
 * http://www.ti.com/product/bq27510-g3
 * http://www.ti.com/product/bq27520-g4
 * http://www.ti.com/product/bq27530-g1
 * http://www.ti.com/product/bq27531-g1
 * http://www.ti.com/product/bq27541-g1
 * http://www.ti.com/product/bq27542-g1
 * http://www.ti.com/product/bq27546-g1
 * http://www.ti.com/product/bq27742-g1
 * http://www.ti.com/product/bq27545-g1
 * http://www.ti.com/product/bq27421-g1
35
 * http://www.ti.com/product/bq27425-g1
36 37
 * http://www.ti.com/product/bq27411-g1
 * http://www.ti.com/product/bq27621-g1
P
Pali Rohár 已提交
38 39
 */

40
#include <linux/device.h>
41 42 43 44 45 46 47 48 49
#include <linux/module.h>
#include <linux/param.h>
#include <linux/jiffies.h>
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
#include <linux/idr.h>
#include <linux/i2c.h>
50
#include <linux/slab.h>
51
#include <asm/unaligned.h>
52

53
#include <linux/power/bq27xxx_battery.h>
54

55
#define DRIVER_VERSION		"1.2.0"
56

57 58
#define BQ27XXX_MANUFACTURER	"Texas Instruments"

59 60 61 62 63 64 65 66 67
/* BQ27XXX Flags */
#define BQ27XXX_FLAG_DSC	BIT(0)
#define BQ27XXX_FLAG_SOCF	BIT(1) /* State-of-Charge threshold final */
#define BQ27XXX_FLAG_SOC1	BIT(2) /* State-of-Charge threshold 1 */
#define BQ27XXX_FLAG_FC		BIT(9)
#define BQ27XXX_FLAG_OTD	BIT(14)
#define BQ27XXX_FLAG_OTC	BIT(15)

/* BQ27000 has different layout for Flags register */
68 69 70 71 72 73
#define BQ27000_FLAG_EDVF	BIT(0) /* Final End-of-Discharge-Voltage flag */
#define BQ27000_FLAG_EDV1	BIT(1) /* First End-of-Discharge-Voltage flag */
#define BQ27000_FLAG_CI		BIT(4) /* Capacity Inaccurate flag */
#define BQ27000_FLAG_FC		BIT(5)
#define BQ27000_FLAG_CHGS	BIT(7) /* Charge state flag */

74 75 76
#define BQ27XXX_RS			(20) /* Resistor sense mOhm */
#define BQ27XXX_POWER_CONSTANT		(29200) /* 29.2 µV^2 * 1000 */
#define BQ27XXX_CURRENT_CONSTANT	(3570) /* 3.57 µV * 1000 */
P
Pali Rohár 已提交
77

78 79 80
struct bq27xxx_device_info;
struct bq27xxx_access_methods {
	int (*read)(struct bq27xxx_device_info *di, u8 reg, bool single);
81 82
};

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
#define INVALID_REG_ADDR	0xff

/*
 * bq27xxx_reg_index - Register names
 *
 * These are indexes into a device's register mapping array.
 */
enum bq27xxx_reg_index {
	BQ27XXX_REG_CTRL = 0,	/* Control */
	BQ27XXX_REG_TEMP,	/* Temperature */
	BQ27XXX_REG_INT_TEMP,	/* Internal Temperature */
	BQ27XXX_REG_VOLT,	/* Voltage */
	BQ27XXX_REG_AI,		/* Average Current */
	BQ27XXX_REG_FLAGS,	/* Flags */
	BQ27XXX_REG_TTE,	/* Time-to-Empty */
	BQ27XXX_REG_TTF,	/* Time-to-Full */
	BQ27XXX_REG_TTES,	/* Time-to-Empty Standby */
	BQ27XXX_REG_TTECP,	/* Time-to-Empty at Constant Power */
	BQ27XXX_REG_NAC,	/* Nominal Available Capacity */
	BQ27XXX_REG_FCC,	/* Full Charge Capacity */
	BQ27XXX_REG_CYCT,	/* Cycle Count */
	BQ27XXX_REG_AE,		/* Available Energy */
	BQ27XXX_REG_SOC,	/* State-of-Charge */
	BQ27XXX_REG_DCAP,	/* Design Capacity */
	BQ27XXX_REG_AP,		/* Average Power */
};

110
struct bq27xxx_reg_cache {
111 112 113 114
	int temperature;
	int time_to_empty;
	int time_to_empty_avg;
	int time_to_full;
P
Pali Rohár 已提交
115
	int charge_full;
116
	int cycle_count;
117
	int capacity;
118
	int energy;
119
	int flags;
120 121
	int power_avg;
	int health;
122 123
};

124
struct bq27xxx_device_info {
125
	struct device		*dev;
126
	int			id;
127
	enum bq27xxx_chip	chip;
128

129
	struct bq27xxx_reg_cache cache;
P
Pali Rohár 已提交
130 131
	int charge_design_full;

132
	unsigned long last_update;
L
Lars-Peter Clausen 已提交
133
	struct delayed_work work;
134

135
	struct power_supply	*bat;
136

137
	struct bq27xxx_access_methods bus;
L
Lars-Peter Clausen 已提交
138 139

	struct mutex lock;
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202

	u8 *regs;
};

/* Register mappings */
static u8 bq27000_regs[] = {
	0x00,	/* CONTROL	*/
	0x06,	/* TEMP		*/
	INVALID_REG_ADDR,	/* INT TEMP - NA*/
	0x08,	/* VOLT		*/
	0x14,	/* AVG CURR	*/
	0x0a,	/* FLAGS	*/
	0x16,	/* TTE		*/
	0x18,	/* TTF		*/
	0x1c,	/* TTES		*/
	0x26,	/* TTECP	*/
	0x0c,	/* NAC		*/
	0x12,	/* LMD(FCC)	*/
	0x2a,	/* CYCT		*/
	0x22,	/* AE		*/
	0x0b,	/* SOC(RSOC)	*/
	0x76,	/* DCAP(ILMD)	*/
	0x24,	/* AP		*/
};

static u8 bq27010_regs[] = {
	0x00,	/* CONTROL	*/
	0x06,	/* TEMP		*/
	INVALID_REG_ADDR,	/* INT TEMP - NA*/
	0x08,	/* VOLT		*/
	0x14,	/* AVG CURR	*/
	0x0a,	/* FLAGS	*/
	0x16,	/* TTE		*/
	0x18,	/* TTF		*/
	0x1c,	/* TTES		*/
	0x26,	/* TTECP	*/
	0x0c,	/* NAC		*/
	0x12,	/* LMD(FCC)	*/
	0x2a,	/* CYCT		*/
	INVALID_REG_ADDR,	/* AE - NA	*/
	0x0b,	/* SOC(RSOC)	*/
	0x76,	/* DCAP(ILMD)	*/
	INVALID_REG_ADDR,	/* AP - NA	*/
};

static u8 bq27500_regs[] = {
	0x00,	/* CONTROL	*/
	0x06,	/* TEMP		*/
	0x28,	/* INT TEMP	*/
	0x08,	/* VOLT		*/
	0x14,	/* AVG CURR	*/
	0x0a,	/* FLAGS	*/
	0x16,	/* TTE		*/
	INVALID_REG_ADDR,	/* TTF - NA	*/
	0x1a,	/* TTES		*/
	INVALID_REG_ADDR,	/* TTECP - NA	*/
	0x0c,	/* NAC		*/
	0x12,	/* LMD(FCC)	*/
	0x1e,	/* CYCT		*/
	INVALID_REG_ADDR,	/* AE - NA	*/
	0x20,	/* SOC(RSOC)	*/
	0x2e,	/* DCAP(ILMD)	*/
	INVALID_REG_ADDR,	/* AP - NA	*/
203 204
};

205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
static u8 bq27530_regs[] = {
	0x00,	/* CONTROL	*/
	0x06,	/* TEMP		*/
	0x32,	/* INT TEMP	*/
	0x08,	/* VOLT		*/
	0x14,	/* AVG CURR	*/
	0x0a,	/* FLAGS	*/
	0x16,	/* TTE		*/
	INVALID_REG_ADDR,	/* TTF - NA	*/
	INVALID_REG_ADDR,	/* TTES - NA	*/
	INVALID_REG_ADDR,	/* TTECP - NA	*/
	0x0c,	/* NAC		*/
	0x12,	/* LMD(FCC)	*/
	0x2a,	/* CYCT		*/
	INVALID_REG_ADDR,	/* AE - NA	*/
	0x2c,	/* SOC(RSOC)	*/
	INVALID_REG_ADDR,	/* DCAP - NA	*/
	0x24,	/* AP		*/
};

static u8 bq27541_regs[] = {
	0x00,	/* CONTROL	*/
	0x06,	/* TEMP		*/
	0x28,	/* INT TEMP	*/
	0x08,	/* VOLT		*/
	0x14,	/* AVG CURR	*/
	0x0a,	/* FLAGS	*/
	0x16,	/* TTE		*/
	INVALID_REG_ADDR,	/* TTF - NA	*/
	INVALID_REG_ADDR,	/* TTES - NA	*/
	INVALID_REG_ADDR,	/* TTECP - NA	*/
	0x0c,	/* NAC		*/
	0x12,	/* LMD(FCC)	*/
	0x2a,	/* CYCT		*/
	INVALID_REG_ADDR,	/* AE - NA	*/
	0x2c,	/* SOC(RSOC)	*/
	0x3c,	/* DCAP		*/
	0x76,	/* AP		*/
};

static u8 bq27545_regs[] = {
	0x00,	/* CONTROL	*/
	0x06,	/* TEMP		*/
	0x28,	/* INT TEMP	*/
	0x08,	/* VOLT		*/
	0x14,	/* AVG CURR	*/
	0x0a,	/* FLAGS	*/
	0x16,	/* TTE		*/
	INVALID_REG_ADDR,	/* TTF - NA	*/
	INVALID_REG_ADDR,	/* TTES - NA	*/
	INVALID_REG_ADDR,	/* TTECP - NA	*/
	0x0c,	/* NAC		*/
	0x12,	/* LMD(FCC)	*/
	0x2a,	/* CYCT		*/
	INVALID_REG_ADDR,	/* AE - NA	*/
	0x2c,	/* SOC(RSOC)	*/
	INVALID_REG_ADDR,	/* DCAP - NA */
	0x24,	/* AP		*/
};

static u8 bq27421_regs[] = {
	0x00,	/* CONTROL	*/
	0x02,	/* TEMP		*/
	0x1e,	/* INT TEMP	*/
	0x04,	/* VOLT		*/
	0x10,	/* AVG CURR	*/
	0x06,	/* FLAGS	*/
	INVALID_REG_ADDR,	/* TTE - NA	*/
	INVALID_REG_ADDR,	/* TTF - NA	*/
	INVALID_REG_ADDR,	/* TTES - NA	*/
	INVALID_REG_ADDR,	/* TTECP - NA	*/
	0x08,	/* NAC		*/
	0x0e,	/* FCC		*/
	INVALID_REG_ADDR,	/* CYCT - NA	*/
	INVALID_REG_ADDR,	/* AE - NA	*/
	0x1c,	/* SOC		*/
	0x3c,	/* DCAP		*/
	0x18,	/* AP		*/
};

static u8 *bq27xxx_regs[] = {
	[BQ27000] = bq27000_regs,
	[BQ27010] = bq27010_regs,
	[BQ27500] = bq27500_regs,
	[BQ27530] = bq27530_regs,
	[BQ27541] = bq27541_regs,
	[BQ27545] = bq27545_regs,
	[BQ27421] = bq27421_regs,
};

static enum power_supply_property bq27000_battery_props[] = {
296
	POWER_SUPPLY_PROP_STATUS,
297 298 299 300
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CAPACITY,
301
	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
302
	POWER_SUPPLY_PROP_TEMP,
303 304 305
	POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
	POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
	POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
L
Lars-Peter Clausen 已提交
306
	POWER_SUPPLY_PROP_TECHNOLOGY,
P
Pali Rohár 已提交
307 308 309
	POWER_SUPPLY_PROP_CHARGE_FULL,
	POWER_SUPPLY_PROP_CHARGE_NOW,
	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
310
	POWER_SUPPLY_PROP_CYCLE_COUNT,
P
Pali Rohár 已提交
311
	POWER_SUPPLY_PROP_ENERGY_NOW,
312 313
	POWER_SUPPLY_PROP_POWER_AVG,
	POWER_SUPPLY_PROP_HEALTH,
314
	POWER_SUPPLY_PROP_MANUFACTURER,
315 316
};

317
static enum power_supply_property bq27010_battery_props[] = {
318 319 320 321 322 323 324
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CAPACITY,
	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
	POWER_SUPPLY_PROP_TEMP,
325 326 327
	POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
	POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
	POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
328 329 330 331
	POWER_SUPPLY_PROP_TECHNOLOGY,
	POWER_SUPPLY_PROP_CHARGE_FULL,
	POWER_SUPPLY_PROP_CHARGE_NOW,
	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
332 333
	POWER_SUPPLY_PROP_CYCLE_COUNT,
	POWER_SUPPLY_PROP_HEALTH,
334
	POWER_SUPPLY_PROP_MANUFACTURER,
335 336
};

337
static enum power_supply_property bq27500_battery_props[] = {
338 339 340 341 342 343 344 345 346 347 348 349 350
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CAPACITY,
	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
	POWER_SUPPLY_PROP_TEMP,
	POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
	POWER_SUPPLY_PROP_TECHNOLOGY,
	POWER_SUPPLY_PROP_CHARGE_FULL,
	POWER_SUPPLY_PROP_CHARGE_NOW,
	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
	POWER_SUPPLY_PROP_CYCLE_COUNT,
351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
	POWER_SUPPLY_PROP_HEALTH,
	POWER_SUPPLY_PROP_MANUFACTURER,
};

static enum power_supply_property bq27530_battery_props[] = {
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CAPACITY,
	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
	POWER_SUPPLY_PROP_TEMP,
	POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
	POWER_SUPPLY_PROP_TECHNOLOGY,
	POWER_SUPPLY_PROP_CHARGE_FULL,
	POWER_SUPPLY_PROP_CHARGE_NOW,
367 368
	POWER_SUPPLY_PROP_POWER_AVG,
	POWER_SUPPLY_PROP_HEALTH,
369
	POWER_SUPPLY_PROP_CYCLE_COUNT,
370
	POWER_SUPPLY_PROP_MANUFACTURER,
371 372
};

373
static enum power_supply_property bq27541_battery_props[] = {
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CAPACITY,
	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
	POWER_SUPPLY_PROP_TEMP,
	POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
	POWER_SUPPLY_PROP_TECHNOLOGY,
	POWER_SUPPLY_PROP_CHARGE_FULL,
	POWER_SUPPLY_PROP_CHARGE_NOW,
	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
	POWER_SUPPLY_PROP_CYCLE_COUNT,
	POWER_SUPPLY_PROP_POWER_AVG,
	POWER_SUPPLY_PROP_HEALTH,
389
	POWER_SUPPLY_PROP_MANUFACTURER,
390 391
};

392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
static enum power_supply_property bq27545_battery_props[] = {
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CAPACITY,
	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
	POWER_SUPPLY_PROP_TEMP,
	POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
	POWER_SUPPLY_PROP_TECHNOLOGY,
	POWER_SUPPLY_PROP_CHARGE_FULL,
	POWER_SUPPLY_PROP_CHARGE_NOW,
	POWER_SUPPLY_PROP_HEALTH,
	POWER_SUPPLY_PROP_CYCLE_COUNT,
	POWER_SUPPLY_PROP_POWER_AVG,
	POWER_SUPPLY_PROP_MANUFACTURER,
};

static enum power_supply_property bq27421_battery_props[] = {
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CAPACITY,
	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
	POWER_SUPPLY_PROP_TEMP,
	POWER_SUPPLY_PROP_TECHNOLOGY,
	POWER_SUPPLY_PROP_CHARGE_FULL,
	POWER_SUPPLY_PROP_CHARGE_NOW,
	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
	POWER_SUPPLY_PROP_MANUFACTURER,
};

#define BQ27XXX_PROP(_id, _prop)		\
	[_id] = {				\
		.props = _prop,			\
		.size = ARRAY_SIZE(_prop),	\
	}

static struct {
	enum power_supply_property *props;
	size_t size;
} bq27xxx_battery_props[] = {
	BQ27XXX_PROP(BQ27000, bq27000_battery_props),
	BQ27XXX_PROP(BQ27010, bq27010_battery_props),
	BQ27XXX_PROP(BQ27500, bq27500_battery_props),
	BQ27XXX_PROP(BQ27530, bq27530_battery_props),
	BQ27XXX_PROP(BQ27541, bq27541_battery_props),
	BQ27XXX_PROP(BQ27545, bq27545_battery_props),
	BQ27XXX_PROP(BQ27421, bq27421_battery_props),
};

L
Lars-Peter Clausen 已提交
444 445
static unsigned int poll_interval = 360;
module_param(poll_interval, uint, 0644);
446 447
MODULE_PARM_DESC(poll_interval,
		 "battery poll interval in seconds - 0 disables polling");
L
Lars-Peter Clausen 已提交
448

449
/*
450
 * Common code for BQ27xxx devices
451 452
 */

453
static inline int bq27xxx_read(struct bq27xxx_device_info *di, int reg_index,
454
			       bool single)
455
{
456 457 458
	/* Reports EINVAL for invalid/missing registers */
	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;
459

460
	return di->bus.read(di, di->regs[reg_index], single);
461 462
}

463
/*
464
 * Return the battery State-of-Charge
465 466
 * Or < 0 if something fails.
 */
467
static int bq27xxx_battery_read_soc(struct bq27xxx_device_info *di)
468
{
469
	int soc;
470

471
	soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false);
472

473 474
	if (soc < 0)
		dev_dbg(di->dev, "error reading State-of-Charge\n");
475

476
	return soc;
477 478
}

P
Pali Rohár 已提交
479 480 481 482
/*
 * Return a battery charge value in µAh
 * Or < 0 if something fails.
 */
483
static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg)
P
Pali Rohár 已提交
484 485 486
{
	int charge;

487
	charge = bq27xxx_read(di, reg, false);
P
Pali Rohár 已提交
488
	if (charge < 0) {
489 490
		dev_dbg(di->dev, "error reading charge register %02x: %d\n",
			reg, charge);
P
Pali Rohár 已提交
491 492 493
		return charge;
	}

494 495
	if (di->chip == BQ27000 || di->chip == BQ27010)
		charge *= BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
P
Pali Rohár 已提交
496
	else
497
		charge *= 1000;
P
Pali Rohár 已提交
498 499 500 501 502

	return charge;
}

/*
503
 * Return the battery Nominal available capacity in µAh
P
Pali Rohár 已提交
504 505
 * Or < 0 if something fails.
 */
506
static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di)
P
Pali Rohár 已提交
507
{
508 509
	int flags;

510 511 512 513 514
	if (di->chip == BQ27000 || di->chip == BQ27010) {
		flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true);
		if (flags >= 0 && (flags & BQ27000_FLAG_CI))
			return -ENODATA;
	}
515

516
	return bq27xxx_battery_read_charge(di, BQ27XXX_REG_NAC);
P
Pali Rohár 已提交
517 518 519
}

/*
520
 * Return the battery Full Charge Capacity in µAh
P
Pali Rohár 已提交
521 522
 * Or < 0 if something fails.
 */
523
static inline int bq27xxx_battery_read_fcc(struct bq27xxx_device_info *di)
P
Pali Rohár 已提交
524
{
525
	return bq27xxx_battery_read_charge(di, BQ27XXX_REG_FCC);
P
Pali Rohár 已提交
526 527 528
}

/*
529
 * Return the Design Capacity in µAh
P
Pali Rohár 已提交
530 531
 * Or < 0 if something fails.
 */
532
static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di)
P
Pali Rohár 已提交
533
{
534
	int dcap;
P
Pali Rohár 已提交
535

536
	dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, false);
P
Pali Rohár 已提交
537

538
	if (dcap < 0) {
539
		dev_dbg(di->dev, "error reading initial last measured discharge\n");
540
		return dcap;
P
Pali Rohár 已提交
541 542
	}

543 544
	if (di->chip == BQ27000 || di->chip == BQ27010)
		dcap *= BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
P
Pali Rohár 已提交
545
	else
546
		dcap *= 1000;
P
Pali Rohár 已提交
547

548
	return dcap;
P
Pali Rohár 已提交
549 550
}

551 552 553 554
/*
 * Return the battery Available energy in µWh
 * Or < 0 if something fails.
 */
555
static int bq27xxx_battery_read_energy(struct bq27xxx_device_info *di)
556 557 558
{
	int ae;

559
	ae = bq27xxx_read(di, BQ27XXX_REG_AE, false);
560
	if (ae < 0) {
561
		dev_dbg(di->dev, "error reading available energy\n");
562 563 564
		return ae;
	}

565 566
	if (di->chip == BQ27000 || di->chip == BQ27010)
		ae *= BQ27XXX_POWER_CONSTANT / BQ27XXX_RS;
567
	else
568
		ae *= 1000;
569 570 571 572

	return ae;
}

573
/*
574
 * Return the battery temperature in tenths of degree Kelvin
575 576
 * Or < 0 if something fails.
 */
577
static int bq27xxx_battery_read_temperature(struct bq27xxx_device_info *di)
578 579 580
{
	int temp;

581
	temp = bq27xxx_read(di, BQ27XXX_REG_TEMP, false);
582 583 584 585 586
	if (temp < 0) {
		dev_err(di->dev, "error reading temperature\n");
		return temp;
	}

587
	if (di->chip == BQ27000 || di->chip == BQ27010)
588
		temp = 5 * temp / 2;
589 590 591 592

	return temp;
}

P
Pali Rohár 已提交
593 594 595 596
/*
 * Return the battery Cycle count total
 * Or < 0 if something fails.
 */
597
static int bq27xxx_battery_read_cyct(struct bq27xxx_device_info *di)
P
Pali Rohár 已提交
598 599 600
{
	int cyct;

601
	cyct = bq27xxx_read(di, BQ27XXX_REG_CYCT, false);
P
Pali Rohár 已提交
602 603 604 605 606 607
	if (cyct < 0)
		dev_err(di->dev, "error reading cycle count total\n");

	return cyct;
}

608
/*
609 610
 * Read a time register.
 * Return < 0 if something fails.
611
 */
612
static int bq27xxx_battery_read_time(struct bq27xxx_device_info *di, u8 reg)
613
{
614
	int tval;
615

616
	tval = bq27xxx_read(di, reg, false);
617
	if (tval < 0) {
618 619
		dev_dbg(di->dev, "error reading time register %02x: %d\n",
			reg, tval);
620
		return tval;
621 622
	}

623 624 625 626 627 628
	if (tval == 65535)
		return -ENODATA;

	return tval * 60;
}

629
/*
630
 * Read an average power register.
631 632
 * Return < 0 if something fails.
 */
633
static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di)
634 635 636
{
	int tval;

637
	tval = bq27xxx_read(di, BQ27XXX_REG_AP, false);
638
	if (tval < 0) {
639 640
		dev_err(di->dev, "error reading average power register  %02x: %d\n",
			BQ27XXX_REG_AP, tval);
641 642 643
		return tval;
	}

644 645 646
	if (di->chip == BQ27000 || di->chip == BQ27010)
		return (tval * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS;
	else
647
		return tval;
648 649 650 651 652 653 654 655 656
}

/*
 * Returns true if a battery over temperature condition is detected
 */
static int bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags)
{
	if (di->chip == BQ27500 || di->chip == BQ27541)
		return flags & (BQ27XXX_FLAG_OTC | BQ27XXX_FLAG_OTD);
657
	else
658
		return flags & BQ27XXX_FLAG_OTC;
659 660 661 662 663 664
}

/*
 * Read flag register.
 * Return < 0 if something fails.
 */
665
static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
666
{
667
	u16 tval;
668

669
	tval = bq27xxx_read(di, BQ27XXX_REG_FLAGS, false);
670 671 672 673 674
	if (tval < 0) {
		dev_err(di->dev, "error reading flag register:%d\n", tval);
		return tval;
	}

675 676
	if (di->chip == BQ27000 || di->chip == BQ27010) {
		if (tval & BQ27000_FLAG_EDV1)
677 678 679 680
			tval = POWER_SUPPLY_HEALTH_DEAD;
		else
			tval = POWER_SUPPLY_HEALTH_GOOD;
	} else {
681
		if (tval & BQ27XXX_FLAG_SOCF)
682
			tval = POWER_SUPPLY_HEALTH_DEAD;
683 684
		else if (bq27xxx_battery_overtemp(di, tval))
			tval = POWER_SUPPLY_HEALTH_OVERHEAT;
685 686 687 688
		else
			tval = POWER_SUPPLY_HEALTH_GOOD;
	}

689
	return tval;
690 691
}

692
static void bq27xxx_battery_update(struct bq27xxx_device_info *di)
693
{
694
	struct bq27xxx_reg_cache cache = {0, };
695 696
	bool has_ci_flag = di->chip == BQ27000 || di->chip == BQ27010;
	bool has_singe_flag = di->chip == BQ27000 || di->chip == BQ27010;
697

698
	cache.flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
699
	if ((cache.flags & 0xff) == 0xff)
700
		cache.flags = -1; /* read error */
701
	if (cache.flags >= 0) {
702 703
		cache.temperature = bq27xxx_battery_read_temperature(di);
		if (has_ci_flag && (cache.flags & BQ27000_FLAG_CI)) {
704
			dev_info(di->dev, "battery is not calibrated! ignoring capacity values\n");
705
			cache.capacity = -ENODATA;
706
			cache.energy = -ENODATA;
707 708 709 710
			cache.time_to_empty = -ENODATA;
			cache.time_to_empty_avg = -ENODATA;
			cache.time_to_full = -ENODATA;
			cache.charge_full = -ENODATA;
711
			cache.health = -ENODATA;
712
		} else {
713 714 715 716 717 718 719
			if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR)
				cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE);
			if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR)
				cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP);
			if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
				cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF);
			cache.charge_full = bq27xxx_battery_read_fcc(di);
720
			cache.capacity = bq27xxx_battery_read_soc(di);
721
			if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
722 723
				cache.energy = bq27xxx_battery_read_energy(di);
			cache.health = bq27xxx_battery_read_health(di);
724
		}
725
		if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR)
726
			cache.cycle_count = bq27xxx_battery_read_cyct(di);
727 728
		if (di->regs[BQ27XXX_REG_AP] != INVALID_REG_ADDR)
			cache.power_avg = bq27xxx_battery_read_pwr_avg(di);
729

P
Pali Rohár 已提交
730 731
		/* We only have to read charge design full once */
		if (di->charge_design_full <= 0)
732
			di->charge_design_full = bq27xxx_battery_read_dcap(di);
733 734
	}

735
	if (di->cache.capacity != cache.capacity)
736
		power_supply_changed(di->bat);
737 738 739

	if (memcmp(&di->cache, &cache, sizeof(cache)) != 0)
		di->cache = cache;
740 741 742 743

	di->last_update = jiffies;
}

744
static void bq27xxx_battery_poll(struct work_struct *work)
L
Lars-Peter Clausen 已提交
745
{
746
	struct bq27xxx_device_info *di =
747 748
			container_of(work, struct bq27xxx_device_info,
				     work.work);
L
Lars-Peter Clausen 已提交
749

750
	bq27xxx_battery_update(di);
L
Lars-Peter Clausen 已提交
751 752 753 754 755 756 757 758

	if (poll_interval > 0) {
		/* The timer does not have to be accurate. */
		set_timer_slack(&di->work.timer, poll_interval * HZ / 4);
		schedule_delayed_work(&di->work, poll_interval * HZ);
	}
}

759
/*
P
Pali Rohár 已提交
760
 * Return the battery average current in µA
761 762 763
 * Note that current can be negative signed as well
 * Or 0 if something fails.
 */
764
static int bq27xxx_battery_current(struct bq27xxx_device_info *di,
765
				   union power_supply_propval *val)
766
{
767
	int curr;
768
	int flags;
769

770
	curr = bq27xxx_read(di, BQ27XXX_REG_AI, false);
771 772
	if (curr < 0) {
		dev_err(di->dev, "error reading current\n");
773
		return curr;
774
	}
775

776 777
	if (di->chip == BQ27000 || di->chip == BQ27010) {
		flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, false);
778
		if (flags & BQ27000_FLAG_CHGS) {
779
			dev_dbg(di->dev, "negative current!\n");
780
			curr = -curr;
781
		}
782

783 784 785 786
		val->intval = curr * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
	} else {
		/* Other gauges return signed value */
		val->intval = (int)((s16)curr) * 1000;
787 788
	}

789
	return 0;
790 791
}

792
static int bq27xxx_battery_status(struct bq27xxx_device_info *di,
793
				  union power_supply_propval *val)
794 795 796
{
	int status;

797
	if (di->chip == BQ27000 || di->chip == BQ27010) {
798 799 800
		if (di->cache.flags & BQ27000_FLAG_FC)
			status = POWER_SUPPLY_STATUS_FULL;
		else if (di->cache.flags & BQ27000_FLAG_CHGS)
801
			status = POWER_SUPPLY_STATUS_CHARGING;
802
		else if (power_supply_am_i_supplied(di->bat))
803
			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
804 805
		else
			status = POWER_SUPPLY_STATUS_DISCHARGING;
806 807 808 809 810 811 812
	} else {
		if (di->cache.flags & BQ27XXX_FLAG_FC)
			status = POWER_SUPPLY_STATUS_FULL;
		else if (di->cache.flags & BQ27XXX_FLAG_DSC)
			status = POWER_SUPPLY_STATUS_DISCHARGING;
		else
			status = POWER_SUPPLY_STATUS_CHARGING;
813 814 815
	}

	val->intval = status;
816

817 818 819
	return 0;
}

820
static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di,
821
					  union power_supply_propval *val)
822 823 824
{
	int level;

825 826
	if (di->chip == BQ27000 || di->chip == BQ27010) {
		if (di->cache.flags & BQ27000_FLAG_FC)
827
			level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
828
		else if (di->cache.flags & BQ27000_FLAG_EDV1)
829
			level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
830
		else if (di->cache.flags & BQ27000_FLAG_EDVF)
831 832 833 834
			level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
		else
			level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
	} else {
835
		if (di->cache.flags & BQ27XXX_FLAG_FC)
836
			level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
837
		else if (di->cache.flags & BQ27XXX_FLAG_SOC1)
838
			level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
839
		else if (di->cache.flags & BQ27XXX_FLAG_SOCF)
840 841 842 843 844 845 846 847 848 849
			level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
		else
			level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
	}

	val->intval = level;

	return 0;
}

850
/*
T
Thomas Weber 已提交
851
 * Return the battery Voltage in millivolts
852
 * Or < 0 if something fails.
853
 */
854
static int bq27xxx_battery_voltage(struct bq27xxx_device_info *di,
855
				   union power_supply_propval *val)
856
{
857
	int volt;
858

859
	volt = bq27xxx_read(di, BQ27XXX_REG_VOLT, false);
860 861
	if (volt < 0) {
		dev_err(di->dev, "error reading voltage\n");
862
		return volt;
863
	}
864

865 866 867 868 869
	val->intval = volt * 1000;

	return 0;
}

870
static int bq27xxx_simple_value(int value,
871
				union power_supply_propval *val)
872 873 874 875 876
{
	if (value < 0)
		return value;

	val->intval = value;
877 878 879 880

	return 0;
}

881
static int bq27xxx_battery_get_property(struct power_supply *psy,
882 883 884
					enum power_supply_property psp,
					union power_supply_propval *val)
{
885
	int ret = 0;
886
	struct bq27xxx_device_info *di = power_supply_get_drvdata(psy);
887

L
Lars-Peter Clausen 已提交
888 889 890
	mutex_lock(&di->lock);
	if (time_is_before_jiffies(di->last_update + 5 * HZ)) {
		cancel_delayed_work_sync(&di->work);
891
		bq27xxx_battery_poll(&di->work.work);
L
Lars-Peter Clausen 已提交
892 893
	}
	mutex_unlock(&di->lock);
894 895

	if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0)
896
		return -ENODEV;
897 898

	switch (psp) {
899
	case POWER_SUPPLY_PROP_STATUS:
900
		ret = bq27xxx_battery_status(di, val);
901
		break;
902
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
903
		ret = bq27xxx_battery_voltage(di, val);
904
		break;
905
	case POWER_SUPPLY_PROP_PRESENT:
906
		val->intval = di->cache.flags < 0 ? 0 : 1;
907 908
		break;
	case POWER_SUPPLY_PROP_CURRENT_NOW:
909
		ret = bq27xxx_battery_current(di, val);
910 911
		break;
	case POWER_SUPPLY_PROP_CAPACITY:
912
		ret = bq27xxx_simple_value(di->cache.capacity, val);
913
		break;
914
	case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
915
		ret = bq27xxx_battery_capacity_level(di, val);
916
		break;
917
	case POWER_SUPPLY_PROP_TEMP:
918
		ret = bq27xxx_simple_value(di->cache.temperature, val);
919
		if (ret == 0)
920
			val->intval -= 2731; /* convert decidegree k to c */
921
		break;
922
	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
923
		ret = bq27xxx_simple_value(di->cache.time_to_empty, val);
924 925
		break;
	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG:
926
		ret = bq27xxx_simple_value(di->cache.time_to_empty_avg, val);
927 928
		break;
	case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
929
		ret = bq27xxx_simple_value(di->cache.time_to_full, val);
930
		break;
L
Lars-Peter Clausen 已提交
931 932 933
	case POWER_SUPPLY_PROP_TECHNOLOGY:
		val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
		break;
P
Pali Rohár 已提交
934
	case POWER_SUPPLY_PROP_CHARGE_NOW:
935
		ret = bq27xxx_simple_value(bq27xxx_battery_read_nac(di), val);
P
Pali Rohár 已提交
936 937
		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL:
938
		ret = bq27xxx_simple_value(di->cache.charge_full, val);
P
Pali Rohár 已提交
939 940
		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
941
		ret = bq27xxx_simple_value(di->charge_design_full, val);
P
Pali Rohár 已提交
942
		break;
943
	case POWER_SUPPLY_PROP_CYCLE_COUNT:
944
		ret = bq27xxx_simple_value(di->cache.cycle_count, val);
P
Pali Rohár 已提交
945 946
		break;
	case POWER_SUPPLY_PROP_ENERGY_NOW:
947
		ret = bq27xxx_simple_value(di->cache.energy, val);
P
Pali Rohár 已提交
948
		break;
949
	case POWER_SUPPLY_PROP_POWER_AVG:
950
		ret = bq27xxx_simple_value(di->cache.power_avg, val);
951 952
		break;
	case POWER_SUPPLY_PROP_HEALTH:
953
		ret = bq27xxx_simple_value(di->cache.health, val);
954
		break;
955 956 957
	case POWER_SUPPLY_PROP_MANUFACTURER:
		val->strval = BQ27XXX_MANUFACTURER;
		break;
958 959 960 961
	default:
		return -EINVAL;
	}

962
	return ret;
963 964
}

965
static void bq27xxx_external_power_changed(struct power_supply *psy)
L
Lars-Peter Clausen 已提交
966
{
967
	struct bq27xxx_device_info *di = power_supply_get_drvdata(psy);
L
Lars-Peter Clausen 已提交
968 969 970 971 972

	cancel_delayed_work_sync(&di->work);
	schedule_delayed_work(&di->work, 0);
}

973
static int bq27xxx_powersupply_init(struct bq27xxx_device_info *di,
974
				    const char *name)
975
{
976
	int ret;
977 978 979 980 981 982
	struct power_supply_desc *psy_desc;
	struct power_supply_config psy_cfg = { .drv_data = di, };

	psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL);
	if (!psy_desc)
		return -ENOMEM;
983

984 985
	psy_desc->name = name;
	psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
986 987
	psy_desc->properties = bq27xxx_battery_props[di->chip].props;
	psy_desc->num_properties = bq27xxx_battery_props[di->chip].size;
988 989
	psy_desc->get_property = bq27xxx_battery_get_property;
	psy_desc->external_power_changed = bq27xxx_external_power_changed;
L
Lars-Peter Clausen 已提交
990

991
	INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
L
Lars-Peter Clausen 已提交
992
	mutex_init(&di->lock);
993

994 995 996
	di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg);
	if (IS_ERR(di->bat)) {
		ret = PTR_ERR(di->bat);
997 998 999 1000 1001 1002
		dev_err(di->dev, "failed to register battery: %d\n", ret);
		return ret;
	}

	dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION);

1003
	bq27xxx_battery_update(di);
1004

1005
	return 0;
1006 1007
}

1008
static void bq27xxx_powersupply_unregister(struct bq27xxx_device_info *di)
L
Lars-Peter Clausen 已提交
1009
{
1010
	/*
1011 1012 1013
	 * power_supply_unregister call bq27xxx_battery_get_property which
	 * call bq27xxx_battery_poll.
	 * Make sure that bq27xxx_battery_poll will not call
1014 1015 1016 1017
	 * schedule_delayed_work again after unregister (which cause OOPS).
	 */
	poll_interval = 0;

L
Lars-Peter Clausen 已提交
1018 1019
	cancel_delayed_work_sync(&di->work);

1020
	power_supply_unregister(di->bat);
L
Lars-Peter Clausen 已提交
1021 1022 1023 1024

	mutex_destroy(&di->lock);
}

1025
/* i2c specific code */
1026
#ifdef CONFIG_BATTERY_BQ27XXX_I2C
1027 1028 1029

/* If the system has several batteries we need a different name for each
 * of them...
1030
 */
1031 1032
static DEFINE_IDR(battery_id);
static DEFINE_MUTEX(battery_mutex);
1033

1034 1035
static int bq27xxx_battery_i2c_read(struct bq27xxx_device_info *di, u8 reg,
				    bool single)
1036
{
1037
	struct i2c_client *client = to_i2c_client(di->dev);
1038
	struct i2c_msg msg[2];
1039
	unsigned char data[2];
1040
	int ret;
1041 1042 1043 1044

	if (!client->adapter)
		return -ENODEV;

1045 1046 1047 1048 1049 1050 1051
	msg[0].addr = client->addr;
	msg[0].flags = 0;
	msg[0].buf = &reg;
	msg[0].len = sizeof(reg);
	msg[1].addr = client->addr;
	msg[1].flags = I2C_M_RD;
	msg[1].buf = data;
1052
	if (single)
1053
		msg[1].len = 1;
1054
	else
1055
		msg[1].len = 2;
1056

1057
	ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
1058 1059 1060 1061 1062 1063 1064
	if (ret < 0)
		return ret;

	if (!single)
		ret = get_unaligned_le16(data);
	else
		ret = data[0];
1065

1066
	return ret;
1067 1068
}

1069 1070
static int bq27xxx_battery_i2c_probe(struct i2c_client *client,
				     const struct i2c_device_id *id)
1071 1072
{
	char *name;
1073
	struct bq27xxx_device_info *di;
1074 1075 1076 1077 1078
	int num;
	int retval = 0;

	/* Get new ID for the new battery device */
	mutex_lock(&battery_mutex);
T
Tejun Heo 已提交
1079
	num = idr_alloc(&battery_id, client, 0, 0, GFP_KERNEL);
1080
	mutex_unlock(&battery_mutex);
T
Tejun Heo 已提交
1081 1082
	if (num < 0)
		return num;
1083

1084
	name = devm_kasprintf(&client->dev, GFP_KERNEL, "%s-%d", id->name, num);
1085 1086
	if (!name) {
		retval = -ENOMEM;
1087
		goto batt_failed;
1088 1089
	}

1090
	di = devm_kzalloc(&client->dev, sizeof(*di), GFP_KERNEL);
1091 1092
	if (!di) {
		retval = -ENOMEM;
1093
		goto batt_failed;
1094
	}
1095

1096
	di->id = num;
1097
	di->dev = &client->dev;
1098
	di->chip = id->driver_data;
1099
	di->bus.read = &bq27xxx_battery_i2c_read;
1100
	di->regs = bq27xxx_regs[di->chip];
1101

1102
	retval = bq27xxx_powersupply_init(di, name);
1103
	if (retval)
1104
		goto batt_failed;
1105

1106 1107 1108
	/* Schedule a polling after about 1 min */
	schedule_delayed_work(&di->work, 60 * HZ);

1109 1110 1111 1112
	i2c_set_clientdata(client, di);

	return 0;

1113
batt_failed:
1114 1115 1116 1117 1118 1119 1120
	mutex_lock(&battery_mutex);
	idr_remove(&battery_id, num);
	mutex_unlock(&battery_mutex);

	return retval;
}

1121
static int bq27xxx_battery_i2c_remove(struct i2c_client *client)
1122
{
1123
	struct bq27xxx_device_info *di = i2c_get_clientdata(client);
1124

1125
	bq27xxx_powersupply_unregister(di);
1126 1127 1128 1129 1130 1131 1132 1133

	mutex_lock(&battery_mutex);
	idr_remove(&battery_id, di->id);
	mutex_unlock(&battery_mutex);

	return 0;
}

1134
static const struct i2c_device_id bq27xxx_id[] = {
1135 1136
	{ "bq27200", BQ27000 },
	{ "bq27210", BQ27010 },
1137
	{ "bq27500", BQ27500 },
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150
	{ "bq27510", BQ27500 },
	{ "bq27520", BQ27500 },
	{ "bq27530", BQ27530 },
	{ "bq27531", BQ27530 },
	{ "bq27541", BQ27541 },
	{ "bq27542", BQ27541 },
	{ "bq27546", BQ27541 },
	{ "bq27742", BQ27541 },
	{ "bq27545", BQ27545 },
	{ "bq27421", BQ27421 },
	{ "bq27425", BQ27421 },
	{ "bq27441", BQ27421 },
	{ "bq27621", BQ27421 },
1151 1152
	{},
};
1153
MODULE_DEVICE_TABLE(i2c, bq27xxx_id);
1154

1155
static struct i2c_driver bq27xxx_battery_i2c_driver = {
1156
	.driver = {
1157
		.name = "bq27xxx-battery",
1158
	},
1159 1160 1161
	.probe = bq27xxx_battery_i2c_probe,
	.remove = bq27xxx_battery_i2c_remove,
	.id_table = bq27xxx_id,
1162 1163
};

1164
static inline int bq27xxx_battery_i2c_init(void)
1165
{
1166
	int ret = i2c_add_driver(&bq27xxx_battery_i2c_driver);
1167

1168
	if (ret)
1169
		pr_err("Unable to register BQ27xxx i2c driver\n");
1170 1171 1172 1173

	return ret;
}

1174
static inline void bq27xxx_battery_i2c_exit(void)
1175
{
1176
	i2c_del_driver(&bq27xxx_battery_i2c_driver);
1177 1178 1179 1180
}

#else

1181 1182
static inline int bq27xxx_battery_i2c_init(void) { return 0; }
static inline void bq27xxx_battery_i2c_exit(void) {};
1183 1184 1185 1186

#endif

/* platform specific code */
1187
#ifdef CONFIG_BATTERY_BQ27XXX_PLATFORM
1188

1189 1190
static int bq27xxx_battery_platform_read(struct bq27xxx_device_info *di, u8 reg,
					 bool single)
1191 1192
{
	struct device *dev = di->dev;
1193
	struct bq27xxx_platform_data *pdata = dev->platform_data;
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216
	unsigned int timeout = 3;
	int upper, lower;
	int temp;

	if (!single) {
		/* Make sure the value has not changed in between reading the
		 * lower and the upper part */
		upper = pdata->read(dev, reg + 1);
		do {
			temp = upper;
			if (upper < 0)
				return upper;

			lower = pdata->read(dev, reg);
			if (lower < 0)
				return lower;

			upper = pdata->read(dev, reg + 1);
		} while (temp != upper && --timeout);

		if (timeout == 0)
			return -EIO;

1217
		return (upper << 8) | lower;
1218
	}
1219 1220

	return pdata->read(dev, reg);
1221 1222
}

1223
static int bq27xxx_battery_platform_probe(struct platform_device *pdev)
1224
{
1225 1226
	struct bq27xxx_device_info *di;
	struct bq27xxx_platform_data *pdata = pdev->dev.platform_data;
1227
	const char *name;
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238

	if (!pdata) {
		dev_err(&pdev->dev, "no platform_data supplied\n");
		return -EINVAL;
	}

	if (!pdata->read) {
		dev_err(&pdev->dev, "no hdq read callback supplied\n");
		return -EINVAL;
	}

1239 1240 1241 1242 1243
	if (!pdata->chip) {
		dev_err(&pdev->dev, "no device supplied\n");
		return -EINVAL;
	}

1244
	di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL);
1245
	if (!di)
1246 1247 1248 1249 1250
		return -ENOMEM;

	platform_set_drvdata(pdev, di);

	di->dev = &pdev->dev;
1251
	di->chip = pdata->chip;
1252

1253
	name = pdata->name ?: dev_name(&pdev->dev);
1254
	di->bus.read = &bq27xxx_battery_platform_read;
1255

1256
	return bq27xxx_powersupply_init(di, name);
1257 1258
}

1259
static int bq27xxx_battery_platform_remove(struct platform_device *pdev)
1260
{
1261
	struct bq27xxx_device_info *di = platform_get_drvdata(pdev);
1262

1263
	bq27xxx_powersupply_unregister(di);
L
Lars-Peter Clausen 已提交
1264

1265 1266 1267
	return 0;
}

1268 1269 1270
static struct platform_driver bq27xxx_battery_platform_driver = {
	.probe	= bq27xxx_battery_platform_probe,
	.remove = bq27xxx_battery_platform_remove,
1271 1272 1273 1274 1275
	.driver = {
		.name = "bq27000-battery",
	},
};

1276
static inline int bq27xxx_battery_platform_init(void)
1277
{
1278
	int ret = platform_driver_register(&bq27xxx_battery_platform_driver);
1279

1280
	if (ret)
1281
		pr_err("Unable to register BQ27xxx platform driver\n");
1282 1283 1284 1285

	return ret;
}

1286
static inline void bq27xxx_battery_platform_exit(void)
1287
{
1288
	platform_driver_unregister(&bq27xxx_battery_platform_driver);
1289 1290 1291 1292
}

#else

1293 1294
static inline int bq27xxx_battery_platform_init(void) { return 0; }
static inline void bq27xxx_battery_platform_exit(void) {};
1295 1296 1297 1298 1299 1300 1301

#endif

/*
 * Module stuff
 */

1302
static int __init bq27xxx_battery_init(void)
1303 1304 1305
{
	int ret;

1306
	ret = bq27xxx_battery_i2c_init();
1307 1308 1309
	if (ret)
		return ret;

1310
	ret = bq27xxx_battery_platform_init();
1311
	if (ret)
1312
		bq27xxx_battery_i2c_exit();
1313 1314 1315

	return ret;
}
1316
module_init(bq27xxx_battery_init);
1317

1318
static void __exit bq27xxx_battery_exit(void)
1319
{
1320 1321
	bq27xxx_battery_platform_exit();
	bq27xxx_battery_i2c_exit();
1322
}
1323
module_exit(bq27xxx_battery_exit);
1324

1325
#ifdef CONFIG_BATTERY_BQ27XXX_PLATFORM
1326 1327 1328
MODULE_ALIAS("platform:bq27000-battery");
#endif

1329
MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
1330
MODULE_DESCRIPTION("BQ27xxx battery monitor driver");
1331
MODULE_LICENSE("GPL");