power: supply: bq27xxx: rename BQ27510 allow for deprecation in future.
[linux-2.6-block.git] / drivers / power / supply / bq27xxx_battery.c
CommitLineData
b996ad0e 1/*
081bab21 2 * BQ27xxx battery driver
b996ad0e
RG
3 *
4 * Copyright (C) 2008 Rodolfo Giometti <giometti@linux.it>
5 * Copyright (C) 2008 Eurotech S.p.A. <info@eurotech.it>
7fb7ba58 6 * Copyright (C) 2010-2011 Lars-Peter Clausen <lars@metafoo.de>
73c244a8 7 * Copyright (C) 2011 Pali Rohár <pali.rohar@gmail.com>
b996ad0e
RG
8 *
9 * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc.
10 *
11 * This package is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 *
15 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18 *
631c17ee 19 * Datasheets:
d74534c2
AD
20 * http://www.ti.com/product/bq27000
21 * http://www.ti.com/product/bq27200
22 * http://www.ti.com/product/bq27010
23 * http://www.ti.com/product/bq27210
24 * http://www.ti.com/product/bq27500
25 * http://www.ti.com/product/bq27510-g3
26 * http://www.ti.com/product/bq27520-g4
27 * http://www.ti.com/product/bq27530-g1
28 * http://www.ti.com/product/bq27531-g1
29 * http://www.ti.com/product/bq27541-g1
30 * http://www.ti.com/product/bq27542-g1
31 * http://www.ti.com/product/bq27546-g1
32 * http://www.ti.com/product/bq27742-g1
33 * http://www.ti.com/product/bq27545-g1
34 * http://www.ti.com/product/bq27421-g1
a66f59ba 35 * http://www.ti.com/product/bq27425-g1
d74534c2
AD
36 * http://www.ti.com/product/bq27411-g1
37 * http://www.ti.com/product/bq27621-g1
631c17ee
PR
38 */
39
1cb82fdb 40#include <linux/device.h>
b996ad0e 41#include <linux/module.h>
1d72706f 42#include <linux/mutex.h>
b996ad0e
RG
43#include <linux/param.h>
44#include <linux/jiffies.h>
45#include <linux/workqueue.h>
46#include <linux/delay.h>
47#include <linux/platform_device.h>
48#include <linux/power_supply.h>
5a0e3ad6 49#include <linux/slab.h>
7df3a746 50#include <linux/of.h>
b996ad0e 51
081bab21 52#include <linux/power/bq27xxx_battery.h>
7fb7ba58 53
6eb207f2 54#define DRIVER_VERSION "1.2.0"
b996ad0e 55
db04fc5c
AD
56#define BQ27XXX_MANUFACTURER "Texas Instruments"
57
d74534c2
AD
58/* BQ27XXX Flags */
59#define BQ27XXX_FLAG_DSC BIT(0)
60#define BQ27XXX_FLAG_SOCF BIT(1) /* State-of-Charge threshold final */
61#define BQ27XXX_FLAG_SOC1 BIT(2) /* State-of-Charge threshold 1 */
62#define BQ27XXX_FLAG_FC BIT(9)
63#define BQ27XXX_FLAG_OTD BIT(14)
64#define BQ27XXX_FLAG_OTC BIT(15)
74aab849
AD
65#define BQ27XXX_FLAG_UT BIT(14)
66#define BQ27XXX_FLAG_OT BIT(15)
d74534c2
AD
67
68/* BQ27000 has different layout for Flags register */
6eb207f2
AD
69#define BQ27000_FLAG_EDVF BIT(0) /* Final End-of-Discharge-Voltage flag */
70#define BQ27000_FLAG_EDV1 BIT(1) /* First End-of-Discharge-Voltage flag */
71#define BQ27000_FLAG_CI BIT(4) /* Capacity Inaccurate flag */
72#define BQ27000_FLAG_FC BIT(5)
73#define BQ27000_FLAG_CHGS BIT(7) /* Charge state flag */
74
d74534c2
AD
75#define BQ27XXX_RS (20) /* Resistor sense mOhm */
76#define BQ27XXX_POWER_CONSTANT (29200) /* 29.2 µV^2 * 1000 */
77#define BQ27XXX_CURRENT_CONSTANT (3570) /* 3.57 µV * 1000 */
a2e5118c 78
d74534c2
AD
79#define INVALID_REG_ADDR 0xff
80
81/*
82 * bq27xxx_reg_index - Register names
83 *
84 * These are indexes into a device's register mapping array.
85 */
2e05b518 86
d74534c2
AD
87enum bq27xxx_reg_index {
88 BQ27XXX_REG_CTRL = 0, /* Control */
89 BQ27XXX_REG_TEMP, /* Temperature */
90 BQ27XXX_REG_INT_TEMP, /* Internal Temperature */
91 BQ27XXX_REG_VOLT, /* Voltage */
92 BQ27XXX_REG_AI, /* Average Current */
93 BQ27XXX_REG_FLAGS, /* Flags */
94 BQ27XXX_REG_TTE, /* Time-to-Empty */
95 BQ27XXX_REG_TTF, /* Time-to-Full */
96 BQ27XXX_REG_TTES, /* Time-to-Empty Standby */
97 BQ27XXX_REG_TTECP, /* Time-to-Empty at Constant Power */
98 BQ27XXX_REG_NAC, /* Nominal Available Capacity */
99 BQ27XXX_REG_FCC, /* Full Charge Capacity */
100 BQ27XXX_REG_CYCT, /* Cycle Count */
101 BQ27XXX_REG_AE, /* Available Energy */
102 BQ27XXX_REG_SOC, /* State-of-Charge */
103 BQ27XXX_REG_DCAP, /* Design Capacity */
104 BQ27XXX_REG_AP, /* Average Power */
2e05b518 105 BQ27XXX_REG_MAX, /* sentinel */
d74534c2
AD
106};
107
d74534c2 108/* Register mappings */
2e05b518
AD
109static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
110 [BQ27000] = {
111 [BQ27XXX_REG_CTRL] = 0x00,
112 [BQ27XXX_REG_TEMP] = 0x06,
113 [BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
114 [BQ27XXX_REG_VOLT] = 0x08,
115 [BQ27XXX_REG_AI] = 0x14,
116 [BQ27XXX_REG_FLAGS] = 0x0a,
117 [BQ27XXX_REG_TTE] = 0x16,
118 [BQ27XXX_REG_TTF] = 0x18,
119 [BQ27XXX_REG_TTES] = 0x1c,
120 [BQ27XXX_REG_TTECP] = 0x26,
121 [BQ27XXX_REG_NAC] = 0x0c,
122 [BQ27XXX_REG_FCC] = 0x12,
123 [BQ27XXX_REG_CYCT] = 0x2a,
124 [BQ27XXX_REG_AE] = 0x22,
125 [BQ27XXX_REG_SOC] = 0x0b,
126 [BQ27XXX_REG_DCAP] = 0x76,
127 [BQ27XXX_REG_AP] = 0x24,
128 },
129 [BQ27010] = {
130 [BQ27XXX_REG_CTRL] = 0x00,
131 [BQ27XXX_REG_TEMP] = 0x06,
132 [BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
133 [BQ27XXX_REG_VOLT] = 0x08,
134 [BQ27XXX_REG_AI] = 0x14,
135 [BQ27XXX_REG_FLAGS] = 0x0a,
136 [BQ27XXX_REG_TTE] = 0x16,
137 [BQ27XXX_REG_TTF] = 0x18,
138 [BQ27XXX_REG_TTES] = 0x1c,
139 [BQ27XXX_REG_TTECP] = 0x26,
140 [BQ27XXX_REG_NAC] = 0x0c,
141 [BQ27XXX_REG_FCC] = 0x12,
142 [BQ27XXX_REG_CYCT] = 0x2a,
143 [BQ27XXX_REG_AE] = INVALID_REG_ADDR,
144 [BQ27XXX_REG_SOC] = 0x0b,
145 [BQ27XXX_REG_DCAP] = 0x76,
146 [BQ27XXX_REG_AP] = INVALID_REG_ADDR,
147 },
818e3012 148 [BQ2750X] = {
2e05b518
AD
149 [BQ27XXX_REG_CTRL] = 0x00,
150 [BQ27XXX_REG_TEMP] = 0x06,
151 [BQ27XXX_REG_INT_TEMP] = 0x28,
152 [BQ27XXX_REG_VOLT] = 0x08,
153 [BQ27XXX_REG_AI] = 0x14,
154 [BQ27XXX_REG_FLAGS] = 0x0a,
155 [BQ27XXX_REG_TTE] = 0x16,
156 [BQ27XXX_REG_TTF] = INVALID_REG_ADDR,
157 [BQ27XXX_REG_TTES] = 0x1a,
158 [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
159 [BQ27XXX_REG_NAC] = 0x0c,
160 [BQ27XXX_REG_FCC] = 0x12,
161 [BQ27XXX_REG_CYCT] = 0x2a,
162 [BQ27XXX_REG_AE] = INVALID_REG_ADDR,
163 [BQ27XXX_REG_SOC] = 0x2c,
164 [BQ27XXX_REG_DCAP] = 0x3c,
165 [BQ27XXX_REG_AP] = INVALID_REG_ADDR,
166 },
6da6e4bd 167 [BQ2751X] = {
3bee9ea1
AD
168 [BQ27XXX_REG_CTRL] = 0x00,
169 [BQ27XXX_REG_TEMP] = 0x06,
170 [BQ27XXX_REG_INT_TEMP] = 0x28,
171 [BQ27XXX_REG_VOLT] = 0x08,
172 [BQ27XXX_REG_AI] = 0x14,
173 [BQ27XXX_REG_FLAGS] = 0x0a,
174 [BQ27XXX_REG_TTE] = 0x16,
175 [BQ27XXX_REG_TTF] = INVALID_REG_ADDR,
176 [BQ27XXX_REG_TTES] = 0x1a,
177 [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
178 [BQ27XXX_REG_NAC] = 0x0c,
179 [BQ27XXX_REG_FCC] = 0x12,
180 [BQ27XXX_REG_CYCT] = 0x1e,
181 [BQ27XXX_REG_AE] = INVALID_REG_ADDR,
182 [BQ27XXX_REG_SOC] = 0x20,
183 [BQ27XXX_REG_DCAP] = 0x2e,
184 [BQ27XXX_REG_AP] = INVALID_REG_ADDR,
185 },
2e05b518
AD
186 [BQ27530] = {
187 [BQ27XXX_REG_CTRL] = 0x00,
188 [BQ27XXX_REG_TEMP] = 0x06,
189 [BQ27XXX_REG_INT_TEMP] = 0x32,
190 [BQ27XXX_REG_VOLT] = 0x08,
191 [BQ27XXX_REG_AI] = 0x14,
192 [BQ27XXX_REG_FLAGS] = 0x0a,
193 [BQ27XXX_REG_TTE] = 0x16,
194 [BQ27XXX_REG_TTF] = INVALID_REG_ADDR,
195 [BQ27XXX_REG_TTES] = INVALID_REG_ADDR,
196 [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
197 [BQ27XXX_REG_NAC] = 0x0c,
198 [BQ27XXX_REG_FCC] = 0x12,
199 [BQ27XXX_REG_CYCT] = 0x2a,
200 [BQ27XXX_REG_AE] = INVALID_REG_ADDR,
201 [BQ27XXX_REG_SOC] = 0x2c,
202 [BQ27XXX_REG_DCAP] = INVALID_REG_ADDR,
203 [BQ27XXX_REG_AP] = 0x24,
204 },
205 [BQ27541] = {
206 [BQ27XXX_REG_CTRL] = 0x00,
207 [BQ27XXX_REG_TEMP] = 0x06,
208 [BQ27XXX_REG_INT_TEMP] = 0x28,
209 [BQ27XXX_REG_VOLT] = 0x08,
210 [BQ27XXX_REG_AI] = 0x14,
211 [BQ27XXX_REG_FLAGS] = 0x0a,
212 [BQ27XXX_REG_TTE] = 0x16,
213 [BQ27XXX_REG_TTF] = INVALID_REG_ADDR,
214 [BQ27XXX_REG_TTES] = INVALID_REG_ADDR,
215 [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
216 [BQ27XXX_REG_NAC] = 0x0c,
217 [BQ27XXX_REG_FCC] = 0x12,
218 [BQ27XXX_REG_CYCT] = 0x2a,
219 [BQ27XXX_REG_AE] = INVALID_REG_ADDR,
220 [BQ27XXX_REG_SOC] = 0x2c,
221 [BQ27XXX_REG_DCAP] = 0x3c,
222 [BQ27XXX_REG_AP] = 0x24,
223 },
224 [BQ27545] = {
225 [BQ27XXX_REG_CTRL] = 0x00,
226 [BQ27XXX_REG_TEMP] = 0x06,
227 [BQ27XXX_REG_INT_TEMP] = 0x28,
228 [BQ27XXX_REG_VOLT] = 0x08,
229 [BQ27XXX_REG_AI] = 0x14,
230 [BQ27XXX_REG_FLAGS] = 0x0a,
231 [BQ27XXX_REG_TTE] = 0x16,
232 [BQ27XXX_REG_TTF] = INVALID_REG_ADDR,
233 [BQ27XXX_REG_TTES] = INVALID_REG_ADDR,
234 [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
235 [BQ27XXX_REG_NAC] = 0x0c,
236 [BQ27XXX_REG_FCC] = 0x12,
237 [BQ27XXX_REG_CYCT] = 0x2a,
238 [BQ27XXX_REG_AE] = INVALID_REG_ADDR,
239 [BQ27XXX_REG_SOC] = 0x2c,
240 [BQ27XXX_REG_DCAP] = INVALID_REG_ADDR,
241 [BQ27XXX_REG_AP] = 0x24,
242 },
243 [BQ27421] = {
244 [BQ27XXX_REG_CTRL] = 0x00,
245 [BQ27XXX_REG_TEMP] = 0x02,
246 [BQ27XXX_REG_INT_TEMP] = 0x1e,
247 [BQ27XXX_REG_VOLT] = 0x04,
248 [BQ27XXX_REG_AI] = 0x10,
249 [BQ27XXX_REG_FLAGS] = 0x06,
250 [BQ27XXX_REG_TTE] = INVALID_REG_ADDR,
251 [BQ27XXX_REG_TTF] = INVALID_REG_ADDR,
252 [BQ27XXX_REG_TTES] = INVALID_REG_ADDR,
253 [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
254 [BQ27XXX_REG_NAC] = 0x08,
255 [BQ27XXX_REG_FCC] = 0x0e,
256 [BQ27XXX_REG_CYCT] = INVALID_REG_ADDR,
257 [BQ27XXX_REG_AE] = INVALID_REG_ADDR,
258 [BQ27XXX_REG_SOC] = 0x1c,
259 [BQ27XXX_REG_DCAP] = 0x3c,
260 [BQ27XXX_REG_AP] = 0x18,
261 },
d74534c2
AD
262};
263
264static enum power_supply_property bq27000_battery_props[] = {
4e924a81 265 POWER_SUPPLY_PROP_STATUS,
b996ad0e
RG
266 POWER_SUPPLY_PROP_PRESENT,
267 POWER_SUPPLY_PROP_VOLTAGE_NOW,
268 POWER_SUPPLY_PROP_CURRENT_NOW,
269 POWER_SUPPLY_PROP_CAPACITY,
d66bab3f 270 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
b996ad0e 271 POWER_SUPPLY_PROP_TEMP,
4e924a81
GI
272 POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
273 POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
274 POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
5661f334 275 POWER_SUPPLY_PROP_TECHNOLOGY,
631c17ee
PR
276 POWER_SUPPLY_PROP_CHARGE_FULL,
277 POWER_SUPPLY_PROP_CHARGE_NOW,
278 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
73c244a8 279 POWER_SUPPLY_PROP_CYCLE_COUNT,
631c17ee 280 POWER_SUPPLY_PROP_ENERGY_NOW,
9903e627
SR
281 POWER_SUPPLY_PROP_POWER_AVG,
282 POWER_SUPPLY_PROP_HEALTH,
db04fc5c 283 POWER_SUPPLY_PROP_MANUFACTURER,
b996ad0e
RG
284};
285
d74534c2 286static enum power_supply_property bq27010_battery_props[] = {
a66f59ba
SG
287 POWER_SUPPLY_PROP_STATUS,
288 POWER_SUPPLY_PROP_PRESENT,
289 POWER_SUPPLY_PROP_VOLTAGE_NOW,
290 POWER_SUPPLY_PROP_CURRENT_NOW,
291 POWER_SUPPLY_PROP_CAPACITY,
292 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
293 POWER_SUPPLY_PROP_TEMP,
d74534c2
AD
294 POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
295 POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
296 POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
a66f59ba
SG
297 POWER_SUPPLY_PROP_TECHNOLOGY,
298 POWER_SUPPLY_PROP_CHARGE_FULL,
299 POWER_SUPPLY_PROP_CHARGE_NOW,
300 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
d74534c2
AD
301 POWER_SUPPLY_PROP_CYCLE_COUNT,
302 POWER_SUPPLY_PROP_HEALTH,
db04fc5c 303 POWER_SUPPLY_PROP_MANUFACTURER,
a66f59ba
SG
304};
305
818e3012 306static enum power_supply_property bq2750x_battery_props[] = {
628ef02c
PV
307 POWER_SUPPLY_PROP_STATUS,
308 POWER_SUPPLY_PROP_PRESENT,
309 POWER_SUPPLY_PROP_VOLTAGE_NOW,
310 POWER_SUPPLY_PROP_CURRENT_NOW,
311 POWER_SUPPLY_PROP_CAPACITY,
312 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
313 POWER_SUPPLY_PROP_TEMP,
314 POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
315 POWER_SUPPLY_PROP_TECHNOLOGY,
316 POWER_SUPPLY_PROP_CHARGE_FULL,
317 POWER_SUPPLY_PROP_CHARGE_NOW,
318 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
319 POWER_SUPPLY_PROP_CYCLE_COUNT,
d74534c2
AD
320 POWER_SUPPLY_PROP_HEALTH,
321 POWER_SUPPLY_PROP_MANUFACTURER,
322};
323
6da6e4bd 324static enum power_supply_property bq2751x_battery_props[] = {
3bee9ea1
AD
325 POWER_SUPPLY_PROP_STATUS,
326 POWER_SUPPLY_PROP_PRESENT,
327 POWER_SUPPLY_PROP_VOLTAGE_NOW,
328 POWER_SUPPLY_PROP_CURRENT_NOW,
329 POWER_SUPPLY_PROP_CAPACITY,
330 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
331 POWER_SUPPLY_PROP_TEMP,
332 POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
333 POWER_SUPPLY_PROP_TECHNOLOGY,
334 POWER_SUPPLY_PROP_CHARGE_FULL,
335 POWER_SUPPLY_PROP_CHARGE_NOW,
336 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
337 POWER_SUPPLY_PROP_CYCLE_COUNT,
338 POWER_SUPPLY_PROP_HEALTH,
339 POWER_SUPPLY_PROP_MANUFACTURER,
340};
341
d74534c2
AD
342static enum power_supply_property bq27530_battery_props[] = {
343 POWER_SUPPLY_PROP_STATUS,
344 POWER_SUPPLY_PROP_PRESENT,
345 POWER_SUPPLY_PROP_VOLTAGE_NOW,
346 POWER_SUPPLY_PROP_CURRENT_NOW,
347 POWER_SUPPLY_PROP_CAPACITY,
348 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
349 POWER_SUPPLY_PROP_TEMP,
350 POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
351 POWER_SUPPLY_PROP_TECHNOLOGY,
352 POWER_SUPPLY_PROP_CHARGE_FULL,
353 POWER_SUPPLY_PROP_CHARGE_NOW,
628ef02c
PV
354 POWER_SUPPLY_PROP_POWER_AVG,
355 POWER_SUPPLY_PROP_HEALTH,
d74534c2 356 POWER_SUPPLY_PROP_CYCLE_COUNT,
db04fc5c 357 POWER_SUPPLY_PROP_MANUFACTURER,
628ef02c
PV
358};
359
d74534c2 360static enum power_supply_property bq27541_battery_props[] = {
f46bf82e
AB
361 POWER_SUPPLY_PROP_STATUS,
362 POWER_SUPPLY_PROP_PRESENT,
363 POWER_SUPPLY_PROP_VOLTAGE_NOW,
364 POWER_SUPPLY_PROP_CURRENT_NOW,
365 POWER_SUPPLY_PROP_CAPACITY,
366 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
367 POWER_SUPPLY_PROP_TEMP,
368 POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
369 POWER_SUPPLY_PROP_TECHNOLOGY,
370 POWER_SUPPLY_PROP_CHARGE_FULL,
371 POWER_SUPPLY_PROP_CHARGE_NOW,
372 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
373 POWER_SUPPLY_PROP_CYCLE_COUNT,
374 POWER_SUPPLY_PROP_POWER_AVG,
375 POWER_SUPPLY_PROP_HEALTH,
db04fc5c 376 POWER_SUPPLY_PROP_MANUFACTURER,
f46bf82e
AB
377};
378
d74534c2
AD
379static enum power_supply_property bq27545_battery_props[] = {
380 POWER_SUPPLY_PROP_STATUS,
381 POWER_SUPPLY_PROP_PRESENT,
382 POWER_SUPPLY_PROP_VOLTAGE_NOW,
383 POWER_SUPPLY_PROP_CURRENT_NOW,
384 POWER_SUPPLY_PROP_CAPACITY,
385 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
386 POWER_SUPPLY_PROP_TEMP,
387 POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
388 POWER_SUPPLY_PROP_TECHNOLOGY,
389 POWER_SUPPLY_PROP_CHARGE_FULL,
390 POWER_SUPPLY_PROP_CHARGE_NOW,
391 POWER_SUPPLY_PROP_HEALTH,
392 POWER_SUPPLY_PROP_CYCLE_COUNT,
393 POWER_SUPPLY_PROP_POWER_AVG,
394 POWER_SUPPLY_PROP_MANUFACTURER,
395};
396
397static enum power_supply_property bq27421_battery_props[] = {
398 POWER_SUPPLY_PROP_STATUS,
399 POWER_SUPPLY_PROP_PRESENT,
400 POWER_SUPPLY_PROP_VOLTAGE_NOW,
401 POWER_SUPPLY_PROP_CURRENT_NOW,
402 POWER_SUPPLY_PROP_CAPACITY,
403 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
404 POWER_SUPPLY_PROP_TEMP,
405 POWER_SUPPLY_PROP_TECHNOLOGY,
406 POWER_SUPPLY_PROP_CHARGE_FULL,
407 POWER_SUPPLY_PROP_CHARGE_NOW,
408 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
409 POWER_SUPPLY_PROP_MANUFACTURER,
410};
411
412#define BQ27XXX_PROP(_id, _prop) \
413 [_id] = { \
414 .props = _prop, \
415 .size = ARRAY_SIZE(_prop), \
416 }
417
418static struct {
419 enum power_supply_property *props;
420 size_t size;
421} bq27xxx_battery_props[] = {
422 BQ27XXX_PROP(BQ27000, bq27000_battery_props),
423 BQ27XXX_PROP(BQ27010, bq27010_battery_props),
818e3012 424 BQ27XXX_PROP(BQ2750X, bq2750x_battery_props),
6da6e4bd 425 BQ27XXX_PROP(BQ2751X, bq2751x_battery_props),
d74534c2
AD
426 BQ27XXX_PROP(BQ27530, bq27530_battery_props),
427 BQ27XXX_PROP(BQ27541, bq27541_battery_props),
428 BQ27XXX_PROP(BQ27545, bq27545_battery_props),
429 BQ27XXX_PROP(BQ27421, bq27421_battery_props),
430};
431
1d72706f
MR
432static DEFINE_MUTEX(bq27xxx_list_lock);
433static LIST_HEAD(bq27xxx_battery_devices);
434
435static int poll_interval_param_set(const char *val, const struct kernel_param *kp)
436{
437 struct bq27xxx_device_info *di;
950b6c2d 438 unsigned int prev_val = *(unsigned int *) kp->arg;
1d72706f
MR
439 int ret;
440
441 ret = param_set_uint(val, kp);
950b6c2d 442 if (ret < 0 || prev_val == *(unsigned int *) kp->arg)
1d72706f
MR
443 return ret;
444
445 mutex_lock(&bq27xxx_list_lock);
446 list_for_each_entry(di, &bq27xxx_battery_devices, list) {
447 cancel_delayed_work_sync(&di->work);
448 schedule_delayed_work(&di->work, 0);
449 }
450 mutex_unlock(&bq27xxx_list_lock);
451
452 return ret;
453}
454
455static const struct kernel_param_ops param_ops_poll_interval = {
456 .get = param_get_uint,
457 .set = poll_interval_param_set,
458};
459
740b755a 460static unsigned int poll_interval = 360;
1d72706f 461module_param_cb(poll_interval, &param_ops_poll_interval, &poll_interval, 0644);
6d0a1815
AD
462MODULE_PARM_DESC(poll_interval,
463 "battery poll interval in seconds - 0 disables polling");
740b755a 464
b996ad0e 465/*
081bab21 466 * Common code for BQ27xxx devices
b996ad0e
RG
467 */
468
d74534c2 469static inline int bq27xxx_read(struct bq27xxx_device_info *di, int reg_index,
ce33edfa 470 bool single)
b996ad0e 471{
d74534c2
AD
472 /* Reports EINVAL for invalid/missing registers */
473 if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
474 return -EINVAL;
b996ad0e 475
d74534c2 476 return di->bus.read(di, di->regs[reg_index], single);
a66f59ba
SG
477}
478
b996ad0e 479/*
c5709032 480 * Return the battery State-of-Charge
b996ad0e
RG
481 * Or < 0 if something fails.
482 */
c5709032 483static int bq27xxx_battery_read_soc(struct bq27xxx_device_info *di)
b996ad0e 484{
c5709032 485 int soc;
b996ad0e 486
549d7b31
NS
487 if (di->chip == BQ27000 || di->chip == BQ27010)
488 soc = bq27xxx_read(di, BQ27XXX_REG_SOC, true);
489 else
490 soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false);
297a533b 491
c5709032
AD
492 if (soc < 0)
493 dev_dbg(di->dev, "error reading State-of-Charge\n");
297a533b 494
c5709032 495 return soc;
b996ad0e
RG
496}
497
631c17ee
PR
498/*
499 * Return a battery charge value in µAh
500 * Or < 0 if something fails.
501 */
081bab21 502static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg)
631c17ee
PR
503{
504 int charge;
505
081bab21 506 charge = bq27xxx_read(di, reg, false);
631c17ee 507 if (charge < 0) {
c6cd4f26
PR
508 dev_dbg(di->dev, "error reading charge register %02x: %d\n",
509 reg, charge);
631c17ee
PR
510 return charge;
511 }
512
d74534c2
AD
513 if (di->chip == BQ27000 || di->chip == BQ27010)
514 charge *= BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
631c17ee 515 else
d74534c2 516 charge *= 1000;
631c17ee
PR
517
518 return charge;
519}
520
521/*
c5709032 522 * Return the battery Nominal available capacity in µAh
631c17ee
PR
523 * Or < 0 if something fails.
524 */
081bab21 525static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di)
631c17ee 526{
e59ec4a1 527 int flags;
e59ec4a1 528
d74534c2
AD
529 if (di->chip == BQ27000 || di->chip == BQ27010) {
530 flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true);
531 if (flags >= 0 && (flags & BQ27000_FLAG_CI))
532 return -ENODATA;
533 }
e59ec4a1 534
d74534c2 535 return bq27xxx_battery_read_charge(di, BQ27XXX_REG_NAC);
631c17ee
PR
536}
537
538/*
d74534c2 539 * Return the battery Full Charge Capacity in µAh
631c17ee
PR
540 * Or < 0 if something fails.
541 */
d74534c2 542static inline int bq27xxx_battery_read_fcc(struct bq27xxx_device_info *di)
631c17ee 543{
d74534c2 544 return bq27xxx_battery_read_charge(di, BQ27XXX_REG_FCC);
631c17ee
PR
545}
546
547/*
d74534c2 548 * Return the Design Capacity in µAh
631c17ee
PR
549 * Or < 0 if something fails.
550 */
d74534c2 551static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di)
631c17ee 552{
d74534c2 553 int dcap;
631c17ee 554
549d7b31
NS
555 if (di->chip == BQ27000 || di->chip == BQ27010)
556 dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, true);
557 else
558 dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, false);
631c17ee 559
d74534c2 560 if (dcap < 0) {
c6cd4f26 561 dev_dbg(di->dev, "error reading initial last measured discharge\n");
d74534c2 562 return dcap;
631c17ee
PR
563 }
564
d74534c2 565 if (di->chip == BQ27000 || di->chip == BQ27010)
549d7b31 566 dcap = (dcap << 8) * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
631c17ee 567 else
d74534c2 568 dcap *= 1000;
631c17ee 569
d74534c2 570 return dcap;
631c17ee
PR
571}
572
a8f6bd23
PR
573/*
574 * Return the battery Available energy in µWh
575 * Or < 0 if something fails.
576 */
081bab21 577static int bq27xxx_battery_read_energy(struct bq27xxx_device_info *di)
a8f6bd23
PR
578{
579 int ae;
580
d74534c2 581 ae = bq27xxx_read(di, BQ27XXX_REG_AE, false);
a8f6bd23 582 if (ae < 0) {
c6cd4f26 583 dev_dbg(di->dev, "error reading available energy\n");
a8f6bd23
PR
584 return ae;
585 }
586
d74534c2
AD
587 if (di->chip == BQ27000 || di->chip == BQ27010)
588 ae *= BQ27XXX_POWER_CONSTANT / BQ27XXX_RS;
a8f6bd23 589 else
d74534c2 590 ae *= 1000;
a8f6bd23
PR
591
592 return ae;
593}
594
d149e98e 595/*
5dc3443e 596 * Return the battery temperature in tenths of degree Kelvin
d149e98e
PR
597 * Or < 0 if something fails.
598 */
081bab21 599static int bq27xxx_battery_read_temperature(struct bq27xxx_device_info *di)
d149e98e
PR
600{
601 int temp;
602
d74534c2 603 temp = bq27xxx_read(di, BQ27XXX_REG_TEMP, false);
d149e98e
PR
604 if (temp < 0) {
605 dev_err(di->dev, "error reading temperature\n");
606 return temp;
607 }
608
d74534c2 609 if (di->chip == BQ27000 || di->chip == BQ27010)
5dc3443e 610 temp = 5 * temp / 2;
d149e98e
PR
611
612 return temp;
613}
614
631c17ee
PR
615/*
616 * Return the battery Cycle count total
617 * Or < 0 if something fails.
618 */
081bab21 619static int bq27xxx_battery_read_cyct(struct bq27xxx_device_info *di)
631c17ee
PR
620{
621 int cyct;
622
d74534c2 623 cyct = bq27xxx_read(di, BQ27XXX_REG_CYCT, false);
631c17ee
PR
624 if (cyct < 0)
625 dev_err(di->dev, "error reading cycle count total\n");
626
627 return cyct;
628}
629
b996ad0e 630/*
297a533b
LPC
631 * Read a time register.
632 * Return < 0 if something fails.
b996ad0e 633 */
081bab21 634static int bq27xxx_battery_read_time(struct bq27xxx_device_info *di, u8 reg)
b996ad0e 635{
297a533b 636 int tval;
b996ad0e 637
081bab21 638 tval = bq27xxx_read(di, reg, false);
297a533b 639 if (tval < 0) {
c6cd4f26
PR
640 dev_dbg(di->dev, "error reading time register %02x: %d\n",
641 reg, tval);
297a533b 642 return tval;
b996ad0e
RG
643 }
644
297a533b
LPC
645 if (tval == 65535)
646 return -ENODATA;
647
648 return tval * 60;
649}
650
9903e627 651/*
c5709032 652 * Read an average power register.
9903e627
SR
653 * Return < 0 if something fails.
654 */
d74534c2 655static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di)
9903e627
SR
656{
657 int tval;
658
d74534c2 659 tval = bq27xxx_read(di, BQ27XXX_REG_AP, false);
9903e627 660 if (tval < 0) {
d74534c2
AD
661 dev_err(di->dev, "error reading average power register %02x: %d\n",
662 BQ27XXX_REG_AP, tval);
9903e627
SR
663 return tval;
664 }
665
d74534c2
AD
666 if (di->chip == BQ27000 || di->chip == BQ27010)
667 return (tval * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS;
668 else
9903e627 669 return tval;
d74534c2
AD
670}
671
672/*
673 * Returns true if a battery over temperature condition is detected
674 */
74aab849 675static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags)
d74534c2 676{
e839a448 677 switch (di->chip) {
818e3012 678 case BQ2750X:
6da6e4bd 679 case BQ2751X:
e839a448
CL
680 case BQ27541:
681 case BQ27545:
d74534c2 682 return flags & (BQ27XXX_FLAG_OTC | BQ27XXX_FLAG_OTD);
e839a448
CL
683 case BQ27530:
684 case BQ27421:
74aab849 685 return flags & BQ27XXX_FLAG_OT;
e839a448
CL
686 default:
687 return false;
688 }
74aab849
AD
689}
690
691/*
692 * Returns true if a battery under temperature condition is detected
693 */
694static bool bq27xxx_battery_undertemp(struct bq27xxx_device_info *di, u16 flags)
695{
696 if (di->chip == BQ27530 || di->chip == BQ27421)
697 return flags & BQ27XXX_FLAG_UT;
698
699 return false;
700}
701
702/*
703 * Returns true if a low state of charge condition is detected
704 */
705static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags)
706{
707 if (di->chip == BQ27000 || di->chip == BQ27010)
708 return flags & (BQ27000_FLAG_EDV1 | BQ27000_FLAG_EDVF);
9903e627 709 else
74aab849 710 return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF);
9903e627
SR
711}
712
713/*
714 * Read flag register.
715 * Return < 0 if something fails.
716 */
081bab21 717static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
9903e627 718{
2edd69a8 719 int flags;
e4a404a0 720 bool has_singe_flag = di->chip == BQ27000 || di->chip == BQ27010;
9903e627 721
e4a404a0 722 flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
74aab849
AD
723 if (flags < 0) {
724 dev_err(di->dev, "error reading flag register:%d\n", flags);
725 return flags;
9903e627
SR
726 }
727
74aab849
AD
728 /* Unlikely but important to return first */
729 if (unlikely(bq27xxx_battery_overtemp(di, flags)))
730 return POWER_SUPPLY_HEALTH_OVERHEAT;
731 if (unlikely(bq27xxx_battery_undertemp(di, flags)))
732 return POWER_SUPPLY_HEALTH_COLD;
733 if (unlikely(bq27xxx_battery_dead(di, flags)))
734 return POWER_SUPPLY_HEALTH_DEAD;
9903e627 735
74aab849 736 return POWER_SUPPLY_HEALTH_GOOD;
9903e627
SR
737}
738
703df6c0 739void bq27xxx_battery_update(struct bq27xxx_device_info *di)
297a533b 740{
081bab21 741 struct bq27xxx_reg_cache cache = {0, };
d74534c2
AD
742 bool has_ci_flag = di->chip == BQ27000 || di->chip == BQ27010;
743 bool has_singe_flag = di->chip == BQ27000 || di->chip == BQ27010;
297a533b 744
d74534c2 745 cache.flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
3dd843e1 746 if ((cache.flags & 0xff) == 0xff)
d74534c2 747 cache.flags = -1; /* read error */
297a533b 748 if (cache.flags >= 0) {
d74534c2
AD
749 cache.temperature = bq27xxx_battery_read_temperature(di);
750 if (has_ci_flag && (cache.flags & BQ27000_FLAG_CI)) {
1f94b256 751 dev_info_once(di->dev, "battery is not calibrated! ignoring capacity values\n");
4b226c2c 752 cache.capacity = -ENODATA;
a8f6bd23 753 cache.energy = -ENODATA;
4b226c2c
PR
754 cache.time_to_empty = -ENODATA;
755 cache.time_to_empty_avg = -ENODATA;
756 cache.time_to_full = -ENODATA;
757 cache.charge_full = -ENODATA;
9903e627 758 cache.health = -ENODATA;
4b226c2c 759 } else {
d74534c2
AD
760 if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR)
761 cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE);
762 if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR)
763 cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP);
764 if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
765 cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF);
766 cache.charge_full = bq27xxx_battery_read_fcc(di);
c5709032 767 cache.capacity = bq27xxx_battery_read_soc(di);
d74534c2 768 if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
081bab21 769 cache.energy = bq27xxx_battery_read_energy(di);
081bab21 770 cache.health = bq27xxx_battery_read_health(di);
4b226c2c 771 }
d74534c2 772 if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR)
081bab21 773 cache.cycle_count = bq27xxx_battery_read_cyct(di);
d74534c2
AD
774 if (di->regs[BQ27XXX_REG_AP] != INVALID_REG_ADDR)
775 cache.power_avg = bq27xxx_battery_read_pwr_avg(di);
297a533b 776
631c17ee
PR
777 /* We only have to read charge design full once */
778 if (di->charge_design_full <= 0)
d74534c2 779 di->charge_design_full = bq27xxx_battery_read_dcap(di);
297a533b
LPC
780 }
781
90f04a28 782 if (di->cache.capacity != cache.capacity)
297d716f 783 power_supply_changed(di->bat);
90f04a28
PV
784
785 if (memcmp(&di->cache, &cache, sizeof(cache)) != 0)
786 di->cache = cache;
297a533b
LPC
787
788 di->last_update = jiffies;
789}
703df6c0 790EXPORT_SYMBOL_GPL(bq27xxx_battery_update);
297a533b 791
081bab21 792static void bq27xxx_battery_poll(struct work_struct *work)
740b755a 793{
081bab21 794 struct bq27xxx_device_info *di =
d74534c2
AD
795 container_of(work, struct bq27xxx_device_info,
796 work.work);
740b755a 797
081bab21 798 bq27xxx_battery_update(di);
740b755a 799
53bf837b 800 if (poll_interval > 0)
740b755a 801 schedule_delayed_work(&di->work, poll_interval * HZ);
740b755a
LPC
802}
803
b996ad0e 804/*
bf7d4140 805 * Return the battery average current in µA
b996ad0e
RG
806 * Note that current can be negative signed as well
807 * Or 0 if something fails.
808 */
081bab21 809static int bq27xxx_battery_current(struct bq27xxx_device_info *di,
ce33edfa 810 union power_supply_propval *val)
b996ad0e 811{
297a533b 812 int curr;
b68f6216 813 int flags;
b996ad0e 814
d74534c2 815 curr = bq27xxx_read(di, BQ27XXX_REG_AI, false);
c6cd4f26
PR
816 if (curr < 0) {
817 dev_err(di->dev, "error reading current\n");
297a533b 818 return curr;
c6cd4f26 819 }
e20908d9 820
d74534c2 821 if (di->chip == BQ27000 || di->chip == BQ27010) {
e4a404a0 822 flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true);
b68f6216 823 if (flags & BQ27000_FLAG_CHGS) {
e20908d9 824 dev_dbg(di->dev, "negative current!\n");
afbc74fd 825 curr = -curr;
e20908d9 826 }
b996ad0e 827
d74534c2
AD
828 val->intval = curr * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
829 } else {
830 /* Other gauges return signed value */
831 val->intval = (int)((s16)curr) * 1000;
b996ad0e
RG
832 }
833
297a533b 834 return 0;
b996ad0e
RG
835}
836
081bab21 837static int bq27xxx_battery_status(struct bq27xxx_device_info *di,
ce33edfa 838 union power_supply_propval *val)
4e924a81 839{
4e924a81 840 int status;
4e924a81 841
d74534c2 842 if (di->chip == BQ27000 || di->chip == BQ27010) {
c1b9ab67
LPC
843 if (di->cache.flags & BQ27000_FLAG_FC)
844 status = POWER_SUPPLY_STATUS_FULL;
845 else if (di->cache.flags & BQ27000_FLAG_CHGS)
4e924a81 846 status = POWER_SUPPLY_STATUS_CHARGING;
297d716f 847 else if (power_supply_am_i_supplied(di->bat))
c1b9ab67 848 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
4e924a81
GI
849 else
850 status = POWER_SUPPLY_STATUS_DISCHARGING;
d74534c2
AD
851 } else {
852 if (di->cache.flags & BQ27XXX_FLAG_FC)
853 status = POWER_SUPPLY_STATUS_FULL;
854 else if (di->cache.flags & BQ27XXX_FLAG_DSC)
855 status = POWER_SUPPLY_STATUS_DISCHARGING;
856 else
857 status = POWER_SUPPLY_STATUS_CHARGING;
4e924a81
GI
858 }
859
860 val->intval = status;
297a533b 861
4e924a81
GI
862 return 0;
863}
864
081bab21 865static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di,
ce33edfa 866 union power_supply_propval *val)
d66bab3f
PR
867{
868 int level;
869
d74534c2
AD
870 if (di->chip == BQ27000 || di->chip == BQ27010) {
871 if (di->cache.flags & BQ27000_FLAG_FC)
d66bab3f 872 level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
d74534c2 873 else if (di->cache.flags & BQ27000_FLAG_EDV1)
d66bab3f 874 level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
d74534c2 875 else if (di->cache.flags & BQ27000_FLAG_EDVF)
d66bab3f
PR
876 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
877 else
878 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
879 } else {
d74534c2 880 if (di->cache.flags & BQ27XXX_FLAG_FC)
d66bab3f 881 level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
d74534c2 882 else if (di->cache.flags & BQ27XXX_FLAG_SOC1)
d66bab3f 883 level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
d74534c2 884 else if (di->cache.flags & BQ27XXX_FLAG_SOCF)
d66bab3f
PR
885 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
886 else
887 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
888 }
889
890 val->intval = level;
891
892 return 0;
893}
894
4e924a81 895/*
91fe4d50 896 * Return the battery Voltage in millivolts
297a533b 897 * Or < 0 if something fails.
4e924a81 898 */
081bab21 899static int bq27xxx_battery_voltage(struct bq27xxx_device_info *di,
ce33edfa 900 union power_supply_propval *val)
4e924a81 901{
297a533b 902 int volt;
4e924a81 903
d74534c2 904 volt = bq27xxx_read(di, BQ27XXX_REG_VOLT, false);
c6cd4f26
PR
905 if (volt < 0) {
906 dev_err(di->dev, "error reading voltage\n");
297a533b 907 return volt;
c6cd4f26 908 }
4e924a81 909
297a533b
LPC
910 val->intval = volt * 1000;
911
912 return 0;
913}
914
081bab21 915static int bq27xxx_simple_value(int value,
ce33edfa 916 union power_supply_propval *val)
297a533b
LPC
917{
918 if (value < 0)
919 return value;
920
921 val->intval = value;
4e924a81 922
4e924a81
GI
923 return 0;
924}
925
081bab21 926static int bq27xxx_battery_get_property(struct power_supply *psy,
b996ad0e
RG
927 enum power_supply_property psp,
928 union power_supply_propval *val)
929{
4e924a81 930 int ret = 0;
081bab21 931 struct bq27xxx_device_info *di = power_supply_get_drvdata(psy);
3413b4ea 932
740b755a
LPC
933 mutex_lock(&di->lock);
934 if (time_is_before_jiffies(di->last_update + 5 * HZ)) {
935 cancel_delayed_work_sync(&di->work);
081bab21 936 bq27xxx_battery_poll(&di->work.work);
740b755a
LPC
937 }
938 mutex_unlock(&di->lock);
297a533b
LPC
939
940 if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0)
3413b4ea 941 return -ENODEV;
b996ad0e
RG
942
943 switch (psp) {
4e924a81 944 case POWER_SUPPLY_PROP_STATUS:
081bab21 945 ret = bq27xxx_battery_status(di, val);
4e924a81 946 break;
b996ad0e 947 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
081bab21 948 ret = bq27xxx_battery_voltage(di, val);
3413b4ea 949 break;
b996ad0e 950 case POWER_SUPPLY_PROP_PRESENT:
297a533b 951 val->intval = di->cache.flags < 0 ? 0 : 1;
b996ad0e
RG
952 break;
953 case POWER_SUPPLY_PROP_CURRENT_NOW:
081bab21 954 ret = bq27xxx_battery_current(di, val);
b996ad0e
RG
955 break;
956 case POWER_SUPPLY_PROP_CAPACITY:
081bab21 957 ret = bq27xxx_simple_value(di->cache.capacity, val);
b996ad0e 958 break;
d66bab3f 959 case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
081bab21 960 ret = bq27xxx_battery_capacity_level(di, val);
d66bab3f 961 break;
b996ad0e 962 case POWER_SUPPLY_PROP_TEMP:
081bab21 963 ret = bq27xxx_simple_value(di->cache.temperature, val);
5dc3443e 964 if (ret == 0)
d74534c2 965 val->intval -= 2731; /* convert decidegree k to c */
b996ad0e 966 break;
4e924a81 967 case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
081bab21 968 ret = bq27xxx_simple_value(di->cache.time_to_empty, val);
4e924a81
GI
969 break;
970 case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG:
081bab21 971 ret = bq27xxx_simple_value(di->cache.time_to_empty_avg, val);
4e924a81
GI
972 break;
973 case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
081bab21 974 ret = bq27xxx_simple_value(di->cache.time_to_full, val);
4e924a81 975 break;
5661f334
LPC
976 case POWER_SUPPLY_PROP_TECHNOLOGY:
977 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
978 break;
631c17ee 979 case POWER_SUPPLY_PROP_CHARGE_NOW:
081bab21 980 ret = bq27xxx_simple_value(bq27xxx_battery_read_nac(di), val);
631c17ee
PR
981 break;
982 case POWER_SUPPLY_PROP_CHARGE_FULL:
081bab21 983 ret = bq27xxx_simple_value(di->cache.charge_full, val);
631c17ee
PR
984 break;
985 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
081bab21 986 ret = bq27xxx_simple_value(di->charge_design_full, val);
631c17ee 987 break;
73c244a8 988 case POWER_SUPPLY_PROP_CYCLE_COUNT:
081bab21 989 ret = bq27xxx_simple_value(di->cache.cycle_count, val);
631c17ee
PR
990 break;
991 case POWER_SUPPLY_PROP_ENERGY_NOW:
081bab21 992 ret = bq27xxx_simple_value(di->cache.energy, val);
631c17ee 993 break;
9903e627 994 case POWER_SUPPLY_PROP_POWER_AVG:
081bab21 995 ret = bq27xxx_simple_value(di->cache.power_avg, val);
9903e627
SR
996 break;
997 case POWER_SUPPLY_PROP_HEALTH:
081bab21 998 ret = bq27xxx_simple_value(di->cache.health, val);
9903e627 999 break;
db04fc5c
AD
1000 case POWER_SUPPLY_PROP_MANUFACTURER:
1001 val->strval = BQ27XXX_MANUFACTURER;
1002 break;
b996ad0e
RG
1003 default:
1004 return -EINVAL;
1005 }
1006
4e924a81 1007 return ret;
b996ad0e
RG
1008}
1009
081bab21 1010static void bq27xxx_external_power_changed(struct power_supply *psy)
740b755a 1011{
081bab21 1012 struct bq27xxx_device_info *di = power_supply_get_drvdata(psy);
740b755a
LPC
1013
1014 cancel_delayed_work_sync(&di->work);
1015 schedule_delayed_work(&di->work, 0);
1016}
1017
703df6c0 1018int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
b996ad0e 1019{
297d716f
KK
1020 struct power_supply_desc *psy_desc;
1021 struct power_supply_config psy_cfg = { .drv_data = di, };
1022
703df6c0
AD
1023 INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
1024 mutex_init(&di->lock);
1025 di->regs = bq27xxx_regs[di->chip];
1026
297d716f
KK
1027 psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL);
1028 if (!psy_desc)
1029 return -ENOMEM;
a40402ef 1030
703df6c0 1031 psy_desc->name = di->name;
297d716f 1032 psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
d74534c2
AD
1033 psy_desc->properties = bq27xxx_battery_props[di->chip].props;
1034 psy_desc->num_properties = bq27xxx_battery_props[di->chip].size;
081bab21
AD
1035 psy_desc->get_property = bq27xxx_battery_get_property;
1036 psy_desc->external_power_changed = bq27xxx_external_power_changed;
740b755a 1037
297d716f
KK
1038 di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg);
1039 if (IS_ERR(di->bat)) {
703df6c0
AD
1040 dev_err(di->dev, "failed to register battery\n");
1041 return PTR_ERR(di->bat);
a40402ef
LPC
1042 }
1043
1044 dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION);
1045
081bab21 1046 bq27xxx_battery_update(di);
297a533b 1047
1d72706f
MR
1048 mutex_lock(&bq27xxx_list_lock);
1049 list_add(&di->list, &bq27xxx_battery_devices);
1050 mutex_unlock(&bq27xxx_list_lock);
1051
a40402ef 1052 return 0;
b996ad0e 1053}
703df6c0 1054EXPORT_SYMBOL_GPL(bq27xxx_battery_setup);
b996ad0e 1055
703df6c0 1056void bq27xxx_battery_teardown(struct bq27xxx_device_info *di)
740b755a 1057{
8cfaaa81 1058 /*
081bab21
AD
1059 * power_supply_unregister call bq27xxx_battery_get_property which
1060 * call bq27xxx_battery_poll.
1061 * Make sure that bq27xxx_battery_poll will not call
8cfaaa81
PR
1062 * schedule_delayed_work again after unregister (which cause OOPS).
1063 */
1064 poll_interval = 0;
1065
740b755a
LPC
1066 cancel_delayed_work_sync(&di->work);
1067
297d716f 1068 power_supply_unregister(di->bat);
740b755a 1069
1d72706f
MR
1070 mutex_lock(&bq27xxx_list_lock);
1071 list_del(&di->list);
1072 mutex_unlock(&bq27xxx_list_lock);
1073
740b755a
LPC
1074 mutex_destroy(&di->lock);
1075}
703df6c0 1076EXPORT_SYMBOL_GPL(bq27xxx_battery_teardown);
7fb7ba58 1077
081bab21
AD
1078static int bq27xxx_battery_platform_read(struct bq27xxx_device_info *di, u8 reg,
1079 bool single)
7fb7ba58
LPC
1080{
1081 struct device *dev = di->dev;
081bab21 1082 struct bq27xxx_platform_data *pdata = dev->platform_data;
7fb7ba58
LPC
1083 unsigned int timeout = 3;
1084 int upper, lower;
1085 int temp;
1086
1087 if (!single) {
1088 /* Make sure the value has not changed in between reading the
1089 * lower and the upper part */
1090 upper = pdata->read(dev, reg + 1);
1091 do {
1092 temp = upper;
1093 if (upper < 0)
1094 return upper;
1095
1096 lower = pdata->read(dev, reg);
1097 if (lower < 0)
1098 return lower;
1099
1100 upper = pdata->read(dev, reg + 1);
1101 } while (temp != upper && --timeout);
1102
1103 if (timeout == 0)
1104 return -EIO;
1105
297a533b 1106 return (upper << 8) | lower;
7fb7ba58 1107 }
297a533b
LPC
1108
1109 return pdata->read(dev, reg);
7fb7ba58
LPC
1110}
1111
081bab21 1112static int bq27xxx_battery_platform_probe(struct platform_device *pdev)
7fb7ba58 1113{
081bab21
AD
1114 struct bq27xxx_device_info *di;
1115 struct bq27xxx_platform_data *pdata = pdev->dev.platform_data;
7fb7ba58
LPC
1116
1117 if (!pdata) {
1118 dev_err(&pdev->dev, "no platform_data supplied\n");
1119 return -EINVAL;
1120 }
1121
1122 if (!pdata->read) {
1123 dev_err(&pdev->dev, "no hdq read callback supplied\n");
1124 return -EINVAL;
1125 }
1126
424cfde4
AD
1127 if (!pdata->chip) {
1128 dev_err(&pdev->dev, "no device supplied\n");
1129 return -EINVAL;
1130 }
1131
1cb82fdb 1132 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL);
6d0a1815 1133 if (!di)
7fb7ba58 1134 return -ENOMEM;
7fb7ba58
LPC
1135
1136 platform_set_drvdata(pdev, di);
1137
1138 di->dev = &pdev->dev;
424cfde4 1139 di->chip = pdata->chip;
703df6c0
AD
1140 di->name = pdata->name ?: dev_name(&pdev->dev);
1141 di->bus.read = bq27xxx_battery_platform_read;
7fb7ba58 1142
703df6c0 1143 return bq27xxx_battery_setup(di);
7fb7ba58
LPC
1144}
1145
081bab21 1146static int bq27xxx_battery_platform_remove(struct platform_device *pdev)
7fb7ba58 1147{
081bab21 1148 struct bq27xxx_device_info *di = platform_get_drvdata(pdev);
7fb7ba58 1149
703df6c0 1150 bq27xxx_battery_teardown(di);
740b755a 1151
7fb7ba58
LPC
1152 return 0;
1153}
1154
703df6c0
AD
1155static const struct platform_device_id bq27xxx_battery_platform_id_table[] = {
1156 { "bq27000-battery", },
1157 { /* sentinel */ }
1158};
1159MODULE_DEVICE_TABLE(platform, bq27xxx_battery_platform_id_table);
1160
7df3a746
PR
1161#ifdef CONFIG_OF
1162static const struct of_device_id bq27xxx_battery_platform_of_match_table[] = {
1163 { .compatible = "ti,bq27000" },
1164 {},
1165};
1166MODULE_DEVICE_TABLE(of, bq27xxx_battery_platform_of_match_table);
1167#endif
1168
081bab21
AD
1169static struct platform_driver bq27xxx_battery_platform_driver = {
1170 .probe = bq27xxx_battery_platform_probe,
1171 .remove = bq27xxx_battery_platform_remove,
7fb7ba58
LPC
1172 .driver = {
1173 .name = "bq27000-battery",
7df3a746 1174 .of_match_table = of_match_ptr(bq27xxx_battery_platform_of_match_table),
7fb7ba58 1175 },
703df6c0 1176 .id_table = bq27xxx_battery_platform_id_table,
7fb7ba58 1177};
703df6c0 1178module_platform_driver(bq27xxx_battery_platform_driver);
8ebb7e9c 1179
7df3a746
PR
1180MODULE_ALIAS("platform:bq27000-battery");
1181
b996ad0e 1182MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
081bab21 1183MODULE_DESCRIPTION("BQ27xxx battery monitor driver");
b996ad0e 1184MODULE_LICENSE("GPL");